ZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9LY29uZmlnIGIvc291bmQvcGNpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4ZWZkYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC0wLDAgKzEsNTI4IEBACisjIEFMU0EgUENJIGRyaXZlcnMKKworbWVudSAiUENJIGRldmljZXMiCisJZGVwZW5kcyBvbiBTTkQhPW4gJiYgUENJCisKK2NvbmZpZyBTTkRfQUM5N19DT0RFQworCXRyaXN0YXRlCisJc2VsZWN0IFNORF9QQ00KKworY29uZmlnIFNORF9BTEk1NDUxCisJdHJpc3RhdGUgIkFMaSBNNTQ1MSBQQ0kgQXVkaW8gQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgQUM5NyBzb3VuZAorCSAgZGV2aWNlIG9uIG1vdGhlcmJvYXJkcyB1c2luZyB0aGUgQUxpIE01NDUxIEF1ZGlvIENvbnRyb2xsZXIKKwkgIChNMTUzNS9NMTUzNUQvTTE1MzUrL00xNTM1RCsgc291dGggYnJpZGdlcykuICBOZXdlciBjaGlwc2V0cworCSAgdXNlIHRoZSAiSW50ZWwvU2lTL25WaWRpYS9BTUQvQUxpIEFDOTcgQ29udHJvbGxlciIgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYWxpNTQ1MS4KKworY29uZmlnIFNORF9BVElJWFAKKwl0cmlzdGF0ZSAiQVRJIElYUCBBQzk3IENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgQUM5NyBzb3VuZAorCSAgZGV2aWNlIG9uIG1vdGhlcmJvYXJkcyB3aXRoIEFUSSBjaGlwc2V0cyAoQVRJIElYUCAxNTAvMjAwLzI1MC8KKwkgIDMwMC80MDApLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYXRpaXhwLgorCitjb25maWcgU05EX0FUSUlYUF9NT0RFTQorCXRyaXN0YXRlICJBVEkgSVhQIE1vZGVtIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIE1DOTcgbW9kZW0gb24KKwkgIG1vdGhlcmJvYXJkcyB3aXRoIEFUSSBjaGlwc2V0cyAoQVRJIElYUCAxNTAvMjAwLzI1MCkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1hdGlpeHAtbW9kZW0uCisKK2NvbmZpZyBTTkRfQVU4ODEwCisgICAgICAgIHRyaXN0YXRlICJBdXJlYWwgQWR2YW50YWdlIgorICAgICAgICBkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKyAgICAgICAgaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEF1cmVhbCBBZHZhbnRhZ2Ugc291bmRjYXJkcy4KKworCSAgU3VwcG9ydGVkIGZlYXR1cmVzOiBIYXJkd2FyZSBNaXhlciwgU1JDLCBFUSBhbmQgU1BESUYgb3V0cHV0LgorICAgICAgICAgIDNEIHN1cHBvcnQgY29kZSBpcyBpbiBwbGFjZSwgYnV0IG5vdCB5ZXQgdXNlYWJsZS4gRm9yIG1vcmUgaW5mbywgCisgICAgICAgICAgZW1haWwgdGhlIEFMU0EgZGV2ZWxvcGVyIGxpc3QsIG9yIDxtamFuZGVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1hdTg4MTAuCisgCitjb25maWcgU05EX0FVODgyMAorICAgICAgICB0cmlzdGF0ZSAiQXVyZWFsIFZvcnRleCIKKyAgICAgICAgZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisgICAgICAgIGhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBdXJlYWwgVm9ydGV4IHNvdW5kY2FyZHMuCisKKyAgICAgICAgICBTdXBwb3J0ZWQgZmVhdHVyZXM6IEhhcmR3YXJlIE1peGVyIGFuZCBTUkMuIEZvciBtb3JlIGluZm8sIGVtYWlsIAorICAgICAgICAgIHRoZSBBTFNBIGRldmVsb3BlciBsaXN0LCBvciA8bWphbmRlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYXU4ODIwLgorIAorY29uZmlnIFNORF9BVTg4MzAKKyAgICAgICAgdHJpc3RhdGUgIkF1cmVhbCBWb3J0ZXggMiIKKyAgICAgICAgZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisgICAgICAgIGhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBdXJlYWwgVm9ydGV4IDIgc291bmRjYXJkcy4KKworICAgICAgICAgIFN1cHBvcnRlZCBmZWF0dXJlczogSGFyZHdhcmUgTWl4ZXIsIFNSQywgRVEgYW5kIFNQRElGIG91dHB1dC4KKyAgICAgICAgICAzRCBzdXBwb3J0IGNvZGUgaXMgaW4gcGxhY2UsIGJ1dCBub3QgeWV0IHVzZWFibGUuIEZvciBtb3JlIGluZm8sIAorICAgICAgICAgIGVtYWlsIHRoZSBBTFNBIGRldmVsb3BlciBsaXN0LCBvciA8bWphbmRlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYXU4ODMwLgorIAorY29uZmlnIFNORF9BWlQzMzI4CisJdHJpc3RhdGUgIkF6dGVjaCBBWkYzMzI4IC8gUENJMTY4IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU05EICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTTkRfT1BMM19MSUIKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9QQ00KKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQXp0ZWNoIEFaRjMzMjggKFBDSTE2OCkKKwkgIHNvdW5kY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1henQzMzI4LgorCitjb25maWcgU05EX0JUODdYCisgICAgICAgIHRyaXN0YXRlICJCdDg3eCBBdWRpbyBDYXB0dXJlIgorICAgICAgICBkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfUENNCisgICAgICAgIGhlbHAKKwkgIElmIHlvdSB3YW50IHRvIHJlY29yZCBhdWRpbyBmcm9tIFRWIGNhcmRzIGJhc2VkIG9uCisJICBCcm9va3RyZWUgQnQ4NzgvQnQ4NzkgY2hpcHMsIHNheSBZIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvYWxzYS9CdDg3eC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYnQ4N3guCisKK2NvbmZpZyBTTkRfQlQ4N1hfT1ZFUkNMT0NLCisJYm9vbCAiQnQ4N3ggQXVkaW8gb3ZlcmNsb2NraW5nIgorCWRlcGVuZHMgb24gU05EX0JUODdYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiA0NDgwMDAgSHogaXNuJ3QgZW5vdWdoIGZvciB5b3UgYW5kIHlvdSB3YW50IHRvCisJICByZWNvcmQgZnJvbSB0aGUgYW5hbG9nIGlucHV0IHdpdGggdXAgdG8gMTc5MjAwMCBIei4KKworCSAgSGlnaGVyIHNhbXBsZSByYXRlcyB3b24ndCBodXJ0IHlvdXIgaGFyZHdhcmUsIGJ1dCBhdWRpbworCSAgcXVhbGl0eSBtYXkgc3VmZmVyLgorCitjb25maWcgU05EX0NTNDZYWAorCXRyaXN0YXRlICJDaXJydXMgTG9naWMgKFNvdW5kIEZ1c2lvbikgQ1M0MjgwL0NTNDYxeC9DUzQ2MngvQ1M0NjN4IgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9SQVdNSURJCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIENpcnJ1cyBMb2dpYyBDUzQ2MTAvQ1M0NjEyLworCSAgQ1M0NjE0L0NTNDYxNS9DUzQ2MjIvQ1M0NjI0L0NTNDYzMC9DUzQyODAgY2hpcHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1jczQ2eHguCisKK2NvbmZpZyBTTkRfQ1M0NlhYX05FV19EU1AKKwlib29sICJDaXJydXMgTG9naWMgKFNvdW5kIEZ1c2lvbikgTmV3IERTUCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU05EX0NTNDZYWCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHVzZSBhIG5ldyBEU1AgaW1hZ2UgZm9yIFNQRElGIGFuZCBkdWFsIGNvZGVjcy4KKworCSAgVGhpcyB3b3JrcyBiZXR0ZXIgdGhhbiB0aGUgb2xkIGNvZGUsIHNvIHNheSBZLgorCitjb25maWcgU05EX0NTNDI4MQorCXRyaXN0YXRlICJDaXJydXMgTG9naWMgKFNvdW5kIEZ1c2lvbikgQ1M0MjgxIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9PUEwzX0xJQgorCXNlbGVjdCBTTkRfUkFXTUlESQorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBDaXJydXMgTG9naWMgQ1M0MjgxIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtY3M0MjgxLgorCitjb25maWcgU05EX0VNVTEwSzEKKwl0cmlzdGF0ZSAiRW11MTBrMSAoU0IgTGl2ZSEsIEF1ZGlneSwgRS1tdSBBUFMpIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9IV0RFUAorCXNlbGVjdCBTTkRfUkFXTUlESQorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgU291bmQgQmxhc3RlciBQQ0kgNTEyLCBMaXZlISwKKwkgIEF1ZGlneSBhbmQgRS1tdSBBUFMgKHBhcnRpYWxseSBzdXBwb3J0ZWQpIHNvdW5kY2FyZHMuCisKKwkgIFRoZSBjb25mdXNpbmcgbXVsdGl0dWRlIG9mIG1peGVyIGNvbnRyb2xzIGlzIGRvY3VtZW50ZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvYWxzYS9TQi1MaXZlLW1peGVyLnR4dD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQXVkaWd5LW1peGVyLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1lbXUxMGsxLgorCitjb25maWcgU05EX0VNVTEwSzFYCisJdHJpc3RhdGUgIkVtdTEwazFYIChEZWxsIE9FTSBWZXJzaW9uKSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCXNlbGVjdCBTTkRfUkFXTUlESQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgRGVsbCBPRU0gdmVyc2lvbiBvZiB0aGUKKwkgIFNvdW5kIEJsYXN0ZXIgTGl2ZSEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1lbXUxMGsxeC4KKworY29uZmlnIFNORF9DQTAxMDYKKwl0cmlzdGF0ZSAiU0IgQXVkaWd5IExTIC8gTGl2ZSAyNGJpdCIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgU291bmQgQmxhc3RlciBBdWRpZ3kgTFMKKwkgIGFuZCBMaXZlIDI0Yml0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtY2EwMTA2LgorCitjb25maWcgU05EX0tPUkcxMjEyCisJdHJpc3RhdGUgIktvcmcgMTIxMiBJTyIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEtvcmcgMTIxMklPIHNvdW5kY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1rb3JnMTIxMi4KKworY29uZmlnIFNORF9NSVhBUlQKKwl0cmlzdGF0ZSAiRGlnaWdyYW0gbWlYYXJ0IgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9IV0RFUAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIERpZ2lncmFtIG1pWGFydCBzb3VuZGNhcmRzLCBzYXkgWSBoZXJlIGFuZAorCSAgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvTUlYQVJULnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1taXhhcnQuCisKK2NvbmZpZyBTTkRfTk0yNTYKKwl0cmlzdGF0ZSAiTmVvTWFnaWMgTk0yNTZBVi9aWCIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBOZW9NYWdpYyBOTTI1NkFWL1pYIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtbm0yNTYuCisKK2NvbmZpZyBTTkRfUk1FMzIKKwl0cmlzdGF0ZSAiUk1FIERpZ2kzMiwgMzIvOCwgMzIgUFJPIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9QQ00KKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFJNRSBEaWdpMzIsIERpZ2kzMiBQUk8gYW5kCisJICBEaWdpMzIvOCAoU2VrJ2QgUHJvZGlmMzIsIFByb2RpZjk2IGFuZCBQcm9kaWYgR29sZCkgYXVkaW8KKwkgIGRldmljZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1ybWUzMi4KKworY29uZmlnIFNORF9STUU5NgorCXRyaXN0YXRlICJSTUUgRGlnaTk2LCA5Ni84LCA5Ni84IFBSTyIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFJNRSBEaWdpOTYsIERpZ2k5Ni84IGFuZAorCSAgRGlnaTk2LzggUFJPL1BBRC9QU1Qgc291bmRjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLXJtZTk2LgorCitjb25maWcgU05EX1JNRTk2NTIKKwl0cmlzdGF0ZSAiUk1FIERpZ2k5NjUyIChIYW1tZXJmYWxsKSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFJNRSBIYW1tZXJmYWxsIChSTUUKKwkgIERpZ2k5NjUyL0RpZ2k5NjM2KSBzb3VuZGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtcm1lOTY1Mi4KKworY29uZmlnIFNORF9IRFNQCisJdHJpc3RhdGUgIlJNRSBIYW1tZXJmYWxsIERTUCBBdWRpbyIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfSFdERVAKKwlzZWxlY3QgU05EX1JBV01JREkKKwlzZWxlY3QgU05EX1BDTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBSTUUgSGFtbWVyZmFsbCBEU1AgQXVkaW8KKwkgIHNvdW5kY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1oZHNwLgorCitjb25maWcgU05EX1RSSURFTlQKKwl0cmlzdGF0ZSAiVHJpZGVudCA0RC1XYXZlIERYL05YOyBTaVMgNzAxOCIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiBUcmlkZW50CisJICA0RC1XYXZlIERYL05YIG9yIFNpUyA3MDE4IGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtdHJpZGVudC4KKworY29uZmlnIFNORF9ZTUZQQ0kKKwl0cmlzdGF0ZSAiWWFtYWhhIFlNRjcyNC83NDAvNzQ0Lzc1NCIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfT1BMM19MSUIKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFlhbWFoYSBQQ0kgYXVkaW8gY2hpcHMgLQorCSAgWU1GNzI0LCBZTUY3MjRGLCBZTUY3NDAsIFlNRjc0MEMsIFlNRjc0NCwgWU1GNzU0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQteW1mcGNpLgorCitjb25maWcgU05EX0FMUzQwMDAKKwl0cmlzdGF0ZSAiQXZhbmNlIExvZ2ljIEFMUzQwMDAiCisJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX09QTDNfTElCCisJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gQXZhbmNlIExvZ2ljCisJICBBTFM0MDAwIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtYWxzNDAwMC4KKworY29uZmlnIFNORF9DTUlQQ0kKKwl0cmlzdGF0ZSAiQy1NZWRpYSA4NzM4LCA4MzM4IgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9PUEwzX0xJQgorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX1BDTQorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIHVzZSBzb3VuZGNhcmRzIGJhc2VkIG9uIEMtTWVkaWEgQ01JODMzOCBvciBDTUk4NzM4CisJICBjaGlwcywgc2F5IFkgaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0NNSVBDSS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtY21pcGNpLgorCitjb25maWcgU05EX0VOUzEzNzAKKwl0cmlzdGF0ZSAiKENyZWF0aXZlKSBFbnNvbmlxIEF1ZGlvUENJIDEzNzAiCisJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX1JBV01JREkKKwlzZWxlY3QgU05EX1BDTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBFbnNvbmlxIEF1ZGlvUENJIEVTMTM3MCBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLWVuczEzNzAuCisKK2NvbmZpZyBTTkRfRU5TMTM3MQorCXRyaXN0YXRlICIoQ3JlYXRpdmUpIEVuc29uaXEgQXVkaW9QQ0kgMTM3MS8xMzczIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9SQVdNSURJCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVuc29uaXEgQXVkaW9QQ0kgRVMxMzcxIGNoaXBzIGFuZAorCSAgU291bmQgQmxhc3RlciBQQ0kgNjQgb3IgMTI4IHNvdW5kY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1lbnMxMzcxLgorCitjb25maWcgU05EX0VTMTkzOAorCXRyaXN0YXRlICJFU1MgRVMxOTM4LzE5NDYvMTk2OSAoU29sby0xKSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfT1BMM19MSUIKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gRVNTIFNvbG8tMQorCSAgKEVTMTkzOCwgRVMxOTQ2LCBFUzE5NjkpIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtZXMxOTM4LgorCitjb25maWcgU05EX0VTMTk2OAorCXRyaXN0YXRlICJFU1MgRVMxOTY4LzE5NzggKE1hZXN0cm8tMS8yLzJFKSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiBFU1MgTWFlc3RybworCSAgMS8yLzJFIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtZXMxOTY4LgorCitjb25maWcgU05EX01BRVNUUk8zCisJdHJpc3RhdGUgIkVTUyBBbGxlZ3JvL01hZXN0cm8zIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gRVNTIE1hZXN0cm8gMworCSAgKEFsbGVncm8pIGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtbWFlc3RybzMuCisKK2NvbmZpZyBTTkRfRk04MDEKKwl0cmlzdGF0ZSAiRm9ydGVNZWRpYSBGTTgwMSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfT1BMM19MSUIKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gdGhlIEZvcnRlTWVkaWEKKwkgIEZNODAxIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1mbTgwMS4KKworY29uZmlnIFNORF9GTTgwMV9URUE1NzVYCisJdHJpc3RhdGUgIkZvcnRlTWVkaWEgRk04MDEgKyBURUE1NzU3IHR1bmVyIgorCWRlcGVuZHMgb24gU05EX0ZNODAxCisgICAgICAgIHNlbGVjdCBWSURFT19ERVYKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiB0aGUgRm9ydGVNZWRpYQorCSAgRk04MDEgY2hpcCB3aXRoIGEgVEVBNTc1NyB0dW5lciBjb25uZWN0ZWQgdG8gR1BJTzEtMyBwaW5zIChNZWRpYQorCSAgRm9ydGUgU0YyNTYtUENTLTAyKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLWZtODAxLXRlYTU3NXguCisKK2NvbmZpZyBTTkRfSUNFMTcxMgorCXRyaXN0YXRlICJJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkiCisJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX01QVTQwMV9VQVJUCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gdGhlCisJICBJQ0UxNzEyIChFbnZ5MjQpIGNoaXAuCisKKwkgIEN1cnJlbnRseSBzdXBwb3J0ZWQgaGFyZHdhcmUgaXM6IE0tQXVkaW8gRGVsdGEgMTAxMChMVCksCisJICBEaU8gMjQ5NiwgNjYsIDQ0LCA0MTAsIEF1ZGlvcGhpbGUgMjQvOTY7IERpZ2lncmFtIFZYNDQyOworCSAgVGVycmFUZWMgRVdYIDI0Lzk2LCBFV1MgODhNVCwgODhELCBETVggNkZpcmUsIFBoYXNlIDg4OworCSAgSG9vbnRlY2ggU291bmRUcmFjayBEU1AgMjQvVmFsdWUvTWVkaWE3LjE7IEV2ZW50IEVaOC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLWljZTE3MTIuCisKK2NvbmZpZyBTTkRfSUNFMTcyNAorCXRyaXN0YXRlICJJQ0UvVlQxNzI0LzE3MjAgKEVudnkyNEhUL1BUKSIKKwlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbgorCSAgSUNFL1ZUMTcyNC8xNzIwIChFbnZ5MjRIVC9QVCkgY2hpcHMuCisKKwkgIEN1cnJlbnRseSBzdXBwb3J0ZWQgaGFyZHdhcmUgaXM6IEFNUCBBVURJTzIwMDA7IE0tQXVkaW8KKwkgIFJldm9sdXRpb24gNy4xOyBUZXJyYVRlYyBBdXJlb24gNS4xIFNreSwgNy4xIFNwYWNlL1VuaXZlcnNlOworCSAgQXVkaW9UcmFrIFByb2RpZ3kgNy4xOyBQb250aXMgTVMzMDA7IEFsYmF0cm9uIEs4WDgwMCBQcm8gSUk7CisJICBDaGFpbnRlY2ggWk5GMy0xNTAvMjUwLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtaWNlMTcyNC4KKworY29uZmlnIFNORF9JTlRFTDhYMAorCXRyaXN0YXRlICJJbnRlbC9TaVMvblZpZGlhL0FNRC9BTGkgQUM5NyBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIEFDOTcgc291bmQKKwkgIGRldmljZSBvbiBtb3RoZXJib2FyZHMgd2l0aCBJbnRlbC9TaVMvblZpZGlhL0FNRCBjaGlwc2V0cywgb3IKKwkgIEFMaSBjaGlwc2V0cyB1c2luZyB0aGUgTTU0NTUgQXVkaW8gQ29udHJvbGxlci4gIChUaGVyZSBpcyBhCisJICBzZXBhcmF0ZSBkcml2ZXIgZm9yIEFMaSBNNTQ1MSBBdWRpbyBDb250cm9sbGVycy4pCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1pbnRlbDh4MC4KKworY29uZmlnIFNORF9JTlRFTDhYME0KKwl0cmlzdGF0ZSAiSW50ZWwvU2lTL25WaWRpYS9BTUQgTUM5NyBNb2RlbSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNORCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgTUM5NyBtb2RlbSBvbgorCSAgbW90aGVyYm9hcmRzIHdpdGggSW50ZWwvU2lTL25WaWRpYS9BTUQgY2hpcHNldHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1pbnRlbDh4MG0uCisKK2NvbmZpZyBTTkRfU09OSUNWSUJFUworCXRyaXN0YXRlICJTMyBTb25pY1ZpYmVzIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9PUEwzX0xJQgorCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiB0aGUgUzMKKwkgIFNvbmljVmliZXMgY2hpcC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLXNvbmljdmliZXMuCisKK2NvbmZpZyBTTkRfVklBODJYWAorCXRyaXN0YXRlICJWSUEgODJDNjg2QS9CLCA4MjMzLzgyMzUgQUM5NyBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAorCXNlbGVjdCBTTkRfQUM5N19DT0RFQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBBQzk3IHNvdW5kCisJICBkZXZpY2Ugb24gbW90aGVyYm9hcmRzIHdpdGggVklBIGNoaXBzZXRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtdmlhODJ4eC4KKworY29uZmlnIFNORF9WSUE4MlhYX01PREVNCisJdHJpc3RhdGUgIlZJQSA4MkM2ODZBL0IsIDgyMzMgYmFzZWQgTW9kZW1zIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIE1DOTcgbW9kZW0gb24KKwkgIG1vdGhlcmJvYXJkcyB3aXRoIFZJQSBjaGlwc2V0cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLXZpYTgyeHgtbW9kZW0uCisKK2NvbmZpZyBTTkRfVlgyMjIKKwl0cmlzdGF0ZSAiRGlnaWdyYW0gVlgyMjIiCisJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgU05EX1ZYX0xJQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBEaWdpZ3JhbSBWWDIyMiBzb3VuZGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtdngyMjIuCisKK2NvbmZpZyBTTkRfSERBX0lOVEVMCisJdHJpc3RhdGUgIkludGVsIEhEIEF1ZGlvIgorCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IFNORF9QQ00KKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgSW50ZWwgIkhpZ2ggRGVmaW5pdGlvbgorCSAgQXVkaW8iIChBemFsaWEpIG1vdGhlcmJvYXJkIGRldmljZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC1oZGEtaW50ZWwuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA1NzVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL01ha2VmaWxlCkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyMKKworc25kLWFsczQwMDAtb2JqcyA6PSBhbHM0MDAwLm8KK3NuZC1hdGlpeHAtb2JqcyA6PSBhdGlpeHAubworc25kLWF0aWl4cC1tb2RlbS1vYmpzIDo9IGF0aWl4cF9tb2RlbS5vCitzbmQtYXp0MzMyOC1vYmpzIDo9IGF6dDMzMjgubworc25kLWJ0ODd4LW9ianMgOj0gYnQ4N3gubworc25kLWNtaXBjaS1vYmpzIDo9IGNtaXBjaS5vCitzbmQtY3M0MjgxLW9ianMgOj0gY3M0MjgxLm8KK3NuZC1lbnMxMzcwLW9ianMgOj0gZW5zMTM3MC5vCitzbmQtZW5zMTM3MS1vYmpzIDo9IGVuczEzNzEubworc25kLWVzMTkzOC1vYmpzIDo9IGVzMTkzOC5vCitzbmQtZXMxOTY4LW9ianMgOj0gZXMxOTY4Lm8KK3NuZC1mbTgwMS1vYmpzIDo9IGZtODAxLm8KK3NuZC1pbnRlbDh4MC1vYmpzIDo9IGludGVsOHgwLm8KK3NuZC1pbnRlbDh4MG0tb2JqcyA6PSBpbnRlbDh4MG0ubworc25kLW1hZXN0cm8zLW9ianMgOj0gbWFlc3RybzMubworc25kLXJtZTMyLW9ianMgOj0gcm1lMzIubworc25kLXJtZTk2LW9ianMgOj0gcm1lOTYubworc25kLXNvbmljdmliZXMtb2JqcyA6PSBzb25pY3ZpYmVzLm8KK3NuZC12aWE4Mnh4LW9ianMgOj0gdmlhODJ4eC5vCitzbmQtdmlhODJ4eC1tb2RlbS1vYmpzIDo9IHZpYTgyeHhfbW9kZW0ubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX0FMUzQwMDApICs9IHNuZC1hbHM0MDAwLm8KK29iai0kKENPTkZJR19TTkRfQVRJSVhQKSArPSBzbmQtYXRpaXhwLm8KK29iai0kKENPTkZJR19TTkRfQVRJSVhQX01PREVNKSArPSBzbmQtYXRpaXhwLW1vZGVtLm8KK29iai0kKENPTkZJR19TTkRfQVpUMzMyOCkgKz0gc25kLWF6dDMzMjgubworb2JqLSQoQ09ORklHX1NORF9CVDg3WCkgKz0gc25kLWJ0ODd4Lm8KK29iai0kKENPTkZJR19TTkRfQ01JUENJKSArPSBzbmQtY21pcGNpLm8KK29iai0kKENPTkZJR19TTkRfQ1M0MjgxKSArPSBzbmQtY3M0MjgxLm8KK29iai0kKENPTkZJR19TTkRfRU5TMTM3MCkgKz0gc25kLWVuczEzNzAubworb2JqLSQoQ09ORklHX1NORF9FTlMxMzcxKSArPSBzbmQtZW5zMTM3MS5vCitvYmotJChDT05GSUdfU05EX0VTMTkzOCkgKz0gc25kLWVzMTkzOC5vCitvYmotJChDT05GSUdfU05EX0VTMTk2OCkgKz0gc25kLWVzMTk2OC5vCitvYmotJChDT05GSUdfU05EX0ZNODAxKSArPSBzbmQtZm04MDEubworb2JqLSQoQ09ORklHX1NORF9JTlRFTDhYMCkgKz0gc25kLWludGVsOHgwLm8KK29iai0kKENPTkZJR19TTkRfSU5URUw4WDBNKSArPSBzbmQtaW50ZWw4eDBtLm8KK29iai0kKENPTkZJR19TTkRfTUFFU1RSTzMpICs9IHNuZC1tYWVzdHJvMy5vCitvYmotJChDT05GSUdfU05EX1JNRTMyKSArPSBzbmQtcm1lMzIubworb2JqLSQoQ09ORklHX1NORF9STUU5NikgKz0gc25kLXJtZTk2Lm8KK29iai0kKENPTkZJR19TTkRfU09OSUNWSUJFUykgKz0gc25kLXNvbmljdmliZXMubworb2JqLSQoQ09ORklHX1NORF9WSUE4MlhYKSArPSBzbmQtdmlhODJ4eC5vCitvYmotJChDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0pICs9IHNuZC12aWE4Mnh4LW1vZGVtLm8KKworb2JqLSQoQ09ORklHX1NORCkgKz0gXAorCWFjOTcvIFwKKwlhbGk1NDUxLyBcCisJYXU4OHgwLyBcCisJY2EwMTA2LyBcCisJY3M0Nnh4LyBcCisJZW11MTBrMS8gXAorCWhkYS8gXAorCWljZTE3MTIvIFwKKwlrb3JnMTIxMi8gXAorCW1peGFydC8gXAorCW5tMjU2LyBcCisJcm1lOTY1Mi8gXAorCXRyaWRlbnQvIFwKKwl5bWZwY2kvIFwKKwl2eDIyMi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlIGIvc291bmQvcGNpL2FjOTcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzMjIyMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyMKKworc25kLWFjOTctY29kZWMtb2JqcyA6PSBhYzk3X2NvZGVjLm8gYWM5N19wY20ubyBhYzk3X3BhdGNoLm8KKworaWZuZXEgKCQoQ09ORklHX1BST0NfRlMpLCkKK3NuZC1hYzk3LWNvZGVjLW9ianMgKz0gYWM5N19wcm9jLm8KK2VuZGlmCisKK3NuZC1hazQ1MzEtY29kZWMtb2JqcyA6PSBhazQ1MzFfY29kZWMubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX0FDOTdfQ09ERUMpICs9IHNuZC1hYzk3LWNvZGVjLm8KK29iai0kKENPTkZJR19TTkRfRU5TMTM3MCkgKz0gc25kLWFrNDUzMS1jb2RlYy5vCisKK29iai1tIDo9ICQoc29ydCAkKG9iai1tKSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjAyNGVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0wLDAgKzEsMjU3OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBVbml2ZXJzYWwgaW50ZXJmYWNlIGZvciBBdWRpbyBDb2RlYyAnOTcKKyAqCisgKiAgRm9yIG1vcmUgZGV0YWlscyBsb29rIHRvIEFDICc5NyBjb21wb25lbnQgc3BlY2lmaWNhdGlvbiByZXZpc2lvbiAyLjIKKyAqICBieSBJbnRlbCBDb3Jwb3JhdGlvbiAoaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20pLgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImFjOTdfbG9jYWwuaCIKKyNpbmNsdWRlICJhYzk3X2lkLmgiCisjaW5jbHVkZSAiYWM5N19wYXRjaC5oIgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGVuYWJsZV9sb29wYmFjazsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9sb29wYmFjaywgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9sb29wYmFjaywgIkVuYWJsZSBBQzk3IEFEQy9EQUMgTG9vcGJhY2sgQ29udHJvbCIpOworCisvKgorCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpZDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnBhdGNoKShhYzk3X3QgKmFjOTcpOworCWludCAoKm1wYXRjaCkoYWM5N190ICphYzk3KTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9IGFjOTdfY29kZWNfaWRfdDsKKworc3RhdGljIGNvbnN0IGFjOTdfY29kZWNfaWRfdCBzbmRfYWM5N19jb2RlY19pZF92ZW5kb3JzW10gPSB7Cit7IDB4NDE0YjRkMDAsIDB4ZmZmZmZmMDAsICJBc2FoaSBLYXNlaSIsCU5VTEwsCU5VTEwgfSwKK3sgMHg0MTQ0NTMwMCwgMHhmZmZmZmYwMCwgIkFuYWxvZyBEZXZpY2VzIiwJTlVMTCwJTlVMTCB9LAoreyAweDQxNGM0MzAwLCAweGZmZmZmZjAwLCAiUmVhbHRlayIsCQlOVUxMLAlOVUxMIH0sCit7IDB4NDE0YzQ3MDAsIDB4ZmZmZmZmMDAsICJSZWFsdGVrIiwJCU5VTEwsCU5VTEwgfSwKK3sgMHg0MzRkNDkwMCwgMHhmZmZmZmYwMCwgIkMtTWVkaWEgRWxlY3Ryb25pY3MiLCBOVUxMLAlOVUxMIH0sCit7IDB4NDM1MjU5MDAsIDB4ZmZmZmZmMDAsICJDaXJydXMgTG9naWMiLAlOVUxMLAlOVUxMIH0sCit7IDB4NDM1ODU0MDAsIDB4ZmZmZmZmMDAsICJDb25leGFudCIsICAgICAgICAgICBOVUxMLAlOVUxMIH0sCit7IDB4NDQ1NDMwMDAsIDB4ZmZmZmZmMDAsICJEaWFtb25kIFRlY2hub2xvZ3kiLCBOVUxMLAlOVUxMIH0sCit7IDB4NDU0ZDQzMDAsIDB4ZmZmZmZmMDAsICJlTWljcm8iLAkJTlVMTCwJTlVMTCB9LAoreyAweDQ1ODM4MzAwLCAweGZmZmZmZjAwLCAiRVNTIFRlY2hub2xvZ3kiLAlOVUxMLAlOVUxMIH0sCit7IDB4NDg1MjUzMDAsIDB4ZmZmZmZmMDAsICJJbnRlcnNpbCIsCQlOVUxMLAlOVUxMIH0sCit7IDB4NDk0MzQ1MDAsIDB4ZmZmZmZmMDAsICJJQ0Vuc2VtYmxlIiwJCU5VTEwsCU5VTEwgfSwKK3sgMHg0OTU0NDUwMCwgMHhmZmZmZmYwMCwgIklURSBUZWNoLkluYyIsCU5VTEwsCU5VTEwgfSwKK3sgMHg0ZTUzNDMwMCwgMHhmZmZmZmYwMCwgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IiLCBOVUxMLCBOVUxMIH0sCit7IDB4NTA1MzQzMDAsIDB4ZmZmZmZmMDAsICJQaGlsaXBzIiwJCU5VTEwsCU5VTEwgfSwKK3sgMHg1MzQ5NGMwMCwgMHhmZmZmZmYwMCwgIlNpbGljb24gTGFib3JhdG9yeSIsCU5VTEwsCU5VTEwgfSwKK3sgMHg1NDUyNDEwMCwgMHhmZmZmZmYwMCwgIlRyaVRlY2giLAkJTlVMTCwJTlVMTCB9LAoreyAweDU0NTg0ZTAwLCAweGZmZmZmZjAwLCAiVGV4YXMgSW5zdHJ1bWVudHMiLAlOVUxMLAlOVUxMIH0sCit7IDB4NTY0OTQxMDAsIDB4ZmZmZmZmMDAsICJWSUEgVGVjaG5vbG9naWVzIiwgICBOVUxMLAlOVUxMIH0sCit7IDB4NTc0NTQzMDAsIDB4ZmZmZmZmMDAsICJXaW5ib25kIiwJCU5VTEwsCU5VTEwgfSwKK3sgMHg1NzRkNGMwMCwgMHhmZmZmZmYwMCwgIldvbGZzb24iLAkJTlVMTCwJTlVMTCB9LAoreyAweDU5NGQ0ODAwLCAweGZmZmZmZjAwLCAiWWFtYWhhIiwJCU5VTEwsCU5VTEwgfSwKK3sgMHg4Mzg0NzYwMCwgMHhmZmZmZmYwMCwgIlNpZ21hVGVsIiwJCU5VTEwsCU5VTEwgfSwKK3sgMCwJICAgICAgMCwgCSAgTlVMTCwJCQlOVUxMLAlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBhYzk3X2NvZGVjX2lkX3Qgc25kX2FjOTdfY29kZWNfaWRzW10gPSB7Cit7IDB4NDE0YjRkMDAsIDB4ZmZmZmZmZmYsICJBSzQ1NDAiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MTRiNGQwMSwgMHhmZmZmZmZmZiwgIkFLNDU0MiIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQxNGI0ZDAyLCAweGZmZmZmZmZmLCAiQUs0NTQzIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YjRkMDYsIDB4ZmZmZmZmZmYsICJBSzQ1NDRBIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YjRkMDcsIDB4ZmZmZmZmZmYsICJBSzQ1NDUiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MTQ0NTMwMywgMHhmZmZmZmZmZiwgIkFEMTgxOSIsCQlwYXRjaF9hZDE4MTksCU5VTEwgfSwKK3sgMHg0MTQ0NTM0MCwgMHhmZmZmZmZmZiwgIkFEMTg4MSIsCQlwYXRjaF9hZDE4ODEsCU5VTEwgfSwKK3sgMHg0MTQ0NTM0OCwgMHhmZmZmZmZmZiwgIkFEMTg4MUEiLAkJcGF0Y2hfYWQxODgxLAlOVUxMIH0sCit7IDB4NDE0NDUzNjAsIDB4ZmZmZmZmZmYsICJBRDE4ODUiLAkJcGF0Y2hfYWQxODg1LAlOVUxMIH0sCit7IDB4NDE0NDUzNjEsIDB4ZmZmZmZmZmYsICJBRDE4ODYiLAkJcGF0Y2hfYWQxODg2LAlOVUxMIH0sCit7IDB4NDE0NDUzNjIsIDB4ZmZmZmZmZmYsICJBRDE4ODciLAkJcGF0Y2hfYWQxODgxLAlOVUxMIH0sCit7IDB4NDE0NDUzNjMsIDB4ZmZmZmZmZmYsICJBRDE4ODZBIiwJCXBhdGNoX2FkMTg4MSwJTlVMTCB9LAoreyAweDQxNDQ1MzY4LCAweGZmZmZmZmZmLCAiQUQxODg4IiwJCXBhdGNoX2FkMTg4OCwJTlVMTCB9LAoreyAweDQxNDQ1MzcwLCAweGZmZmZmZmZmLCAiQUQxOTgwIiwJCXBhdGNoX2FkMTk4MCwJTlVMTCB9LAoreyAweDQxNDQ1MzcyLCAweGZmZmZmZmZmLCAiQUQxOTgxQSIsCQlwYXRjaF9hZDE5ODFhLAlOVUxMIH0sCit7IDB4NDE0NDUzNzQsIDB4ZmZmZmZmZmYsICJBRDE5ODFCIiwJCXBhdGNoX2FkMTk4MWIsCU5VTEwgfSwKK3sgMHg0MTQ0NTM3NSwgMHhmZmZmZmZmZiwgIkFEMTk4NSIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKK3sgMHg0MTQ0NTM3OCwgMHhmZmZmZmZmZiwgIkFEMTk4NiIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKK3sgMHg0MTRjNDMwMCwgMHhmZmZmZmYwMCwgIkFMQzEwMCwxMDBQIiwgCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YzQ3MTAsIDB4ZmZmZmZmZjAsICJBTEMyMDAsMjAwUCIsCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YzQ3MjEsIDB4ZmZmZmZmZmYsICJBTEM2NTBEIiwJCU5VTEwsCU5VTEwgfSwgLyogYWxyZWFkeSBwYXRjaGVkICovCit7IDB4NDE0YzQ3MjIsIDB4ZmZmZmZmZmYsICJBTEM2NTBFIiwJCU5VTEwsCU5VTEwgfSwgLyogYWxyZWFkeSBwYXRjaGVkICovCit7IDB4NDE0YzQ3MjMsIDB4ZmZmZmZmZmYsICJBTEM2NTBGIiwJCU5VTEwsCU5VTEwgfSwgLyogYWxyZWFkeSBwYXRjaGVkICovCit7IDB4NDE0YzQ3MjAsIDB4ZmZmZmZmZjAsICJBTEM2NTAiLAkJcGF0Y2hfYWxjNjUwLAlOVUxMIH0sCit7IDB4NDE0YzQ3NjAsIDB4ZmZmZmZmZjAsICJBTEM2NTUiLAkJcGF0Y2hfYWxjNjU1LAlOVUxMIH0sCit7IDB4NDE0YzQ3ODAsIDB4ZmZmZmZmZjAsICJBTEM2NTgiLAkJcGF0Y2hfYWxjNjU1LAlOVUxMIH0sCit7IDB4NDE0YzQ3OTAsIDB4ZmZmZmZmZjAsICJBTEM4NTAiLAkJcGF0Y2hfYWxjODUwLAlOVUxMIH0sCit7IDB4NDE0YzQ3MzAsIDB4ZmZmZmZmZmYsICJBTEMxMDEiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MTRjNDc0MCwgMHhmZmZmZmZmMCwgIkFMQzIwMiIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQxNGM0NzUwLCAweGZmZmZmZmYwLCAiQUxDMjUwIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YzQ3NzAsIDB4ZmZmZmZmZjAsICJBTEMyMDMiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MzRkNDk0MSwgMHhmZmZmZmZmZiwgIkNNSTk3MzgiLAkJcGF0Y2hfY205NzM4LAlOVUxMIH0sCit7IDB4NDM0ZDQ5NjEsIDB4ZmZmZmZmZmYsICJDTUk5NzM5IiwJCXBhdGNoX2NtOTczOSwJTlVMTCB9LAoreyAweDQzNGQ0OTc4LCAweGZmZmZmZmZmLCAiQ01JOTc2MSIsCQlwYXRjaF9jbTk3NjEsCU5VTEwgfSwKK3sgMHg0MzRkNDk4MiwgMHhmZmZmZmZmZiwgIkNNSTk3NjEiLAkJcGF0Y2hfY205NzYxLAlOVUxMIH0sCit7IDB4NDM0ZDQ5ODMsIDB4ZmZmZmZmZmYsICJDTUk5NzYxIiwJCXBhdGNoX2NtOTc2MSwJTlVMTCB9LAoreyAweDQzNTI1OTAwLCAweGZmZmZmZmY4LCAiQ1M0Mjk3IiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDM1MjU5MTAsIDB4ZmZmZmZmZjgsICJDUzQyOTdBIiwJCXBhdGNoX2NpcnJ1c19zcGRpZiwJTlVMTCB9LAoreyAweDQzNTI1OTIwLCAweGZmZmZmZmY4LCAiQ1M0Mjk4IiwJCXBhdGNoX2NpcnJ1c19zcGRpZiwJCU5VTEwgfSwKK3sgMHg0MzUyNTkyOCwgMHhmZmZmZmZmOCwgIkNTNDI5NCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQzNTI1OTMwLCAweGZmZmZmZmY4LCAiQ1M0Mjk5IiwJCXBhdGNoX2NpcnJ1c19jczQyOTksCU5VTEwgfSwKK3sgMHg0MzUyNTk0OCwgMHhmZmZmZmZmOCwgIkNTNDIwMSIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQzNTI1OTU4LCAweGZmZmZmZmY4LCAiQ1M0MjA1IiwJCXBhdGNoX2NpcnJ1c19zcGRpZiwJTlVMTCB9LAoreyAweDQzNTI1OTYwLCAweGZmZmZmZmY4LCAiQ1M0MjkxIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDM1MjU5NzAsIDB4ZmZmZmZmZjgsICJDUzQyMDIiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MzU4NTQyMSwgMHhmZmZmZmZmZiwgIkhTRDExMjQ2IiwJCU5VTEwsCQlOVUxMIH0sCS8vIFNtYXJ0TUMgSUkKK3sgMHg0MzU4NTQyOCwgMHhmZmZmZmZmOCwgIkN4MjA0NjgiLAkJcGF0Y2hfY29uZXhhbnQsCU5VTEwgfSwgLy8gU21hcnRBTUMgZml4bWU6IHRoZSBtYXNrIG1pZ2h0IGJlIGRpZmZlcmVudAoreyAweDQ0NTQzMDMxLCAweGZmZmZmZmYwLCAiRFQwMzk4IiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDU0ZDQzMjgsIDB4ZmZmZmZmZmYsICIyODAyOCIsCQlOVUxMLAkJTlVMTCB9LCAgLy8gc2FtZSBhcyBUUjI4MDI4PworeyAweDQ1ODM4MzA4LCAweGZmZmZmZmZmLCAiRVNTMTk4OCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQ4NTI1MzAwLCAweGZmZmZmZjAwLCAiSE1QOTcwMSIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQ5NDM0NTAxLCAweGZmZmZmZmZmLCAiSUNFMTIzMCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQ5NDM0NTExLCAweGZmZmZmZmZmLCAiSUNFMTIzMiIsCQlOVUxMLAkJTlVMTCB9LCAvLyBhbGlhcyBWSUEgVlQxNjExQT8KK3sgMHg0OTQzNDUxNCwgMHhmZmZmZmZmZiwgIklDRTEyMzJBIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDk0MzQ1NTEsIDB4ZmZmZmZmZmYsICJWVDE2MTYiLCAJCXBhdGNoX3Z0MTYxNiwJTlVMTCB9LCAKK3sgMHg0OTQzNDU1MiwgMHhmZmZmZmZmZiwgIlZUMTYxNmkiLAkJcGF0Y2hfdnQxNjE2LAlOVUxMIH0sIC8vIFZUMTYxNiBjb21wYXRpYmxlIChjaGlwc2V0IGludGVncmF0ZWQpCit7IDB4NDk1NDQ1MjAsIDB4ZmZmZmZmZmYsICJJVDIyMjZFIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDk1NDQ1NjEsIDB4ZmZmZmZmZmYsICJJVDI2NDZFIiwJCXBhdGNoX2l0MjY0NiwJTlVMTCB9LAoreyAweDRlNTM0MzAwLCAweGZmZmZmZmZmLCAiTE00NTQwLDQzLDQ1LDQ2LDQ4IiwJTlVMTCwJCU5VTEwgfSwgLy8gb25seSBndWVzcyAtLWprCit7IDB4NGU1MzQzMzEsIDB4ZmZmZmZmZmYsICJMTTQ1NDkiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0ZTUzNDM1MCwgMHhmZmZmZmZmZiwgIkxNNDU1MCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDUwNTM0MzA0LCAweGZmZmZmZmZmLCAiVUNCMTQwMCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDUzNDk0YzIwLCAweGZmZmZmZmUwLCAiU2kzMDM2LDgiLAkJTlVMTCwJCW1wYXRjaF9zaTMwMzYgfSwKK3sgMHg1NDUyNDEwMiwgMHhmZmZmZmZmZiwgIlRSMjgwMjIiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg1NDUyNDEwNiwgMHhmZmZmZmZmZiwgIlRSMjgwMjYiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg1NDUyNDEwOCwgMHhmZmZmZmZmZiwgIlRSMjgwMjgiLAkJcGF0Y2hfdHJpdGVjaF90cjI4MDI4LAlOVUxMIH0sIC8vIGFkZGVkIGJ5IHhpbiBqaW4gWzA3LzA5Lzk5XQoreyAweDU0NTI0MTIzLCAweGZmZmZmZmZmLCAiVFIyODYwMiIsCQlOVUxMLAkJTlVMTCB9LCAvLyBvbmx5IGd1ZXNzIC0tamsgW1RSMjgwMjMgPSBlTWljcm8gRU0yODAyMyAobmV3IENUMTI5NyldCit7IDB4NTQ1ODRlMjAsIDB4ZmZmZmZmZmYsICJUTEMzMjBBRDl4QyIsCU5VTEwsCQlOVUxMIH0sCit7IDB4NTY0OTQxNjEsIDB4ZmZmZmZmZmYsICJWSUExNjEyQSIsCQlOVUxMLAkJTlVMTCB9LCAvLyBtb2RpZmllZCBJQ0UxMjMyIHdpdGggUy9QRElGCit7IDB4NTc0NTQzMDEsIDB4ZmZmZmZmZmYsICJXODM5NzFEIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NTc0ZDRjMDAsIDB4ZmZmZmZmZmYsICJXTTk3MDFBIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NTc0ZDRDMDMsIDB4ZmZmZmZmZmYsICJXTTk3MDMsV005NzA3LFdNOTcwOCxXTTk3MTciLCBwYXRjaF93b2xmc29uMDMsIE5VTEx9LAoreyAweDU3NGQ0QzA0LCAweGZmZmZmZmZmLCAiV005NzA0TSxXTTk3MDRRIiwJcGF0Y2hfd29sZnNvbjA0LCBOVUxMfSwKK3sgMHg1NzRkNEMwNSwgMHhmZmZmZmZmZiwgIldNOTcwNSxXTTk3MTAiLAlwYXRjaF93b2xmc29uMDUsIE5VTEx9LAoreyAweDU3NGQ0QzA5LCAweGZmZmZmZmZmLCAiV005NzA5IiwJCU5VTEwsCQlOVUxMfSwKK3sgMHg1NzRkNEMxMiwgMHhmZmZmZmZmZiwgIldNOTcxMSxXTTk3MTIiLAlwYXRjaF93b2xmc29uMTEsIE5VTEx9LAoreyAweDU3NGQ0YzEzLCAweGZmZmZmZmZmLCAiV005NzEzLFdNOTcxNCIsCXBhdGNoX3dvbGZzb24xMywgTlVMTCwgQUM5N19ERUZBVUxUX1BPV0VSX09GRn0sCit7IDB4NTk0ZDQ4MDAsIDB4ZmZmZmZmZmYsICJZTUY3NDMiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg1OTRkNDgwMiwgMHhmZmZmZmZmZiwgIllNRjc1MiIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDU5NGQ0ODAzLCAweGZmZmZmZmZmLCAiWU1GNzUzIiwJCXBhdGNoX3lhbWFoYV95bWY3NTMsCU5VTEwgfSwKK3sgMHg4Mzg0NzYwMCwgMHhmZmZmZmZmZiwgIlNUQUM5NzAwLDgzLDg0IiwJcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDAsCU5VTEwgfSwKK3sgMHg4Mzg0NzYwNCwgMHhmZmZmZmZmZiwgIlNUQUM5NzAxLDMsNCw1IiwJTlVMTCwJCU5VTEwgfSwKK3sgMHg4Mzg0NzYwNSwgMHhmZmZmZmZmZiwgIlNUQUM5NzA0IiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4ODM4NDc2MDgsIDB4ZmZmZmZmZmYsICJTVEFDOTcwOCwxMSIsCXBhdGNoX3NpZ21hdGVsX3N0YWM5NzA4LAlOVUxMIH0sCit7IDB4ODM4NDc2MDksIDB4ZmZmZmZmZmYsICJTVEFDOTcyMSwyMyIsCXBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxLAlOVUxMIH0sCit7IDB4ODM4NDc2NDQsIDB4ZmZmZmZmZmYsICJTVEFDOTc0NCIsCQlwYXRjaF9zaWdtYXRlbF9zdGFjOTc0NCwJTlVMTCB9LAoreyAweDgzODQ3NjUwLCAweGZmZmZmZmZmLCAiU1RBQzk3NTAsNTEiLAlOVUxMLAkJTlVMTCB9LAkvLyBwYXRjaD8KK3sgMHg4Mzg0NzY1MiwgMHhmZmZmZmZmZiwgIlNUQUM5NzUyLDUzIiwJTlVMTCwJCU5VTEwgfSwgLy8gcGF0Y2g/Cit7IDB4ODM4NDc2NTYsIDB4ZmZmZmZmZmYsICJTVEFDOTc1Niw1NyIsCXBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2LAlOVUxMIH0sCit7IDB4ODM4NDc2NTgsIDB4ZmZmZmZmZmYsICJTVEFDOTc1OCw1OSIsCXBhdGNoX3NpZ21hdGVsX3N0YWM5NzU4LAlOVUxMIH0sCit7IDB4ODM4NDc2NjYsIDB4ZmZmZmZmZmYsICJTVEFDOTc2Niw2NyIsCU5VTEwsCQlOVUxMIH0sIC8vIHBhdGNoPworeyAwLCAJICAgICAgMCwJICBOVUxMLAkJCU5VTEwsCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKnNuZF9hYzk3X3N0ZXJlb19lbmhhbmNlbWVudHNbXSA9Cit7CisgIC8qICAgMCAqLyAiTm8gM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogICAxICovICJBbmFsb2cgRGV2aWNlcyBQaGF0IFN0ZXJlbyIsCisgIC8qICAgMiAqLyAiQ3JlYXRpdmUgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogICAzICovICJOYXRpb25hbCBTZW1pIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAgNCAqLyAiWUFNQUhBIFltZXJzaW9uIiwKKyAgLyogICA1ICovICJCQkUgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogICA2ICovICJDcnlzdGFsIFNlbWkgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogICA3ICovICJRc291bmQgUVhwYW5kZXIiLAorICAvKiAgIDggKi8gIlNwYXRpYWxpemVyIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAgOSAqLyAiU1JTIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAxMCAqLyAiUGxhdGZvcm0gVGVjaCAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorICAvKiAgMTEgKi8gIkFLTSAzRCBBdWRpbyIsCisgIC8qICAxMiAqLyAiQXVyZWFsIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAxMyAqLyAiQXp0ZWNoIDNEIEVuaGFuY2VtZW50IiwKKyAgLyogIDE0ICovICJCaW5hdXJhIDNEIEF1ZGlvIEVuaGFuY2VtZW50IiwKKyAgLyogIDE1ICovICJFU1MgVGVjaG5vbG9neSBTdGVyZW8gRW5oYW5jZW1lbnQiLAorICAvKiAgMTYgKi8gIkhhcm1hbiBJbnRlcm5hdGlvbmFsIFZNQXgiLAorICAvKiAgMTcgKi8gIk52aWRlYS9JQyBFbnNlbWJsZS9LUyBXYXZlcyAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorICAvKiAgMTggKi8gIlBoaWxpcHMgSW5jcmVkaWJsZSBTb3VuZCIsCisgIC8qICAxOSAqLyAiVGV4YXMgSW5zdHJ1bWVudHMgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogIDIwICovICJWTFNJIFRlY2hub2xvZ3kgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogIDIxICovICJUcmlUZWNoIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAyMiAqLyAiUmVhbHRlayAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorICAvKiAgMjMgKi8gIlNhbXN1bmcgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKyAgLyogIDI0ICovICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgM0QgRW5oYW5jZW1lbnQiLAorICAvKiAgMjUgKi8gIkRlbHRhIEludGVncmF0aW9uIDNEIEVuaGFuY2VtZW50IiwKKyAgLyogIDI2ICovICJTaWdtYVRlbCAzRCBFbmhhbmNlbWVudCIsCisgIC8qICAyNyAqLyAiSUMgRW5zZW1ibGUvS1MgV2F2ZXMiLAorICAvKiAgMjggKi8gIlJvY2t3ZWxsIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisgIC8qICAyOSAqLyAiUmVzZXJ2ZWQgMjkiLAorICAvKiAgMzAgKi8gIlJlc2VydmVkIDMwIiwKKyAgLyogIDMxICovICJSZXNlcnZlZCAzMSIKK307CisKKy8qCisgKiBTaGFyZWQgQUM5NyBjb250cm9sbGVycyAoSUNILCBBVElJWFAuLi4pCisgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKHNoYXJlZF9jb2RlY19tdXRleCk7CitzdGF0aWMgYWM5N190ICpzaGFyZWRfY29kZWNbQUM5N19TSEFSRURfVFlQRVNdWzRdOworCisKKy8qCisgKiAgSS9PIHJvdXRpbmVzCisgKi8KKworc3RhdGljIGludCBzbmRfYWM5N192YWxpZF9yZWcoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJaWYgKGFjOTctPmxpbWl0ZWRfcmVncyAmJiAhIHRlc3RfYml0KHJlZywgYWM5Ny0+cmVnX2FjY2Vzc2VkKSkKKyAgCQlyZXR1cm4gMDsKKworCS8qIGZpbHRlciBzb21lIHJlZ2lzdGVycyBmb3IgYnVnZ3kgY29kZWNzICovCisJc3dpdGNoIChhYzk3LT5pZCkgeworCWNhc2UgQUM5N19JRF9BSzQ1NDA6CisJY2FzZSBBQzk3X0lEX0FLNDU0MjoKKwkJaWYgKHJlZyA8PSAweDFjIHx8IHJlZyA9PSAweDIwIHx8IHJlZyA9PSAweDI2IHx8IHJlZyA+PSAweDdjKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCWNhc2UgQUM5N19JRF9BRDE4MTk6CS8qIEFEMTgxOSAqLworCWNhc2UgQUM5N19JRF9BRDE4ODE6CS8qIEFEMTg4MSAqLworCWNhc2UgQUM5N19JRF9BRDE4ODFBOgkvKiBBRDE4ODFBICovCisJCWlmIChyZWcgPj0gMHgzYSAmJiByZWcgPD0gMHg2ZSkJLyogMHg1OSAqLworCQkJcmV0dXJuIDA7CisJCXJldHVybiAxOworCWNhc2UgQUM5N19JRF9BRDE4ODU6CS8qIEFEMTg4NSAqLworCWNhc2UgQUM5N19JRF9BRDE4ODY6CS8qIEFEMTg4NiAqLworCWNhc2UgQUM5N19JRF9BRDE4ODZBOgkvKiBBRDE4ODZBIC0gISF2ZXJpZnkhISAtLWprICovCisJY2FzZSBBQzk3X0lEX0FEMTg4NzoJLyogQUQxODg3IC0gISF2ZXJpZnkhISAtLWprICovCisJCWlmIChyZWcgPT0gMHg1YSkKKwkJCXJldHVybiAxOworCQlpZiAocmVnID49IDB4M2MgJiYgcmVnIDw9IDB4NmUpCS8qIDB4NTkgKi8KKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwljYXNlIEFDOTdfSURfU1RBQzk3MDA6CisJY2FzZSBBQzk3X0lEX1NUQUM5NzA0OgorCWNhc2UgQUM5N19JRF9TVEFDOTcwNToKKwljYXNlIEFDOTdfSURfU1RBQzk3MDg6CisJY2FzZSBBQzk3X0lEX1NUQUM5NzIxOgorCWNhc2UgQUM5N19JRF9TVEFDOTc0NDoKKwljYXNlIEFDOTdfSURfU1RBQzk3NTY6CisJCWlmIChyZWcgPD0gMHgzYSB8fCByZWcgPj0gMHg1YSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogc25kX2FjOTdfd3JpdGUgLSB3cml0ZSBhIHZhbHVlIG9uIHRoZSBnaXZlbiByZWdpc3RlcgorICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCisgKiBAcmVnOiB0aGUgcmVnaXN0ZXIgdG8gY2hhbmdlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBzZXQKKyAqCisgKiBXcml0ZXMgYSB2YWx1ZSBvbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIuICBUaGlzIHdpbGwgaW52b2tlIHRoZSB3cml0ZQorICogY2FsbGJhY2sgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZ2lzdGVyIGNoZWNrLgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoYW5nZSB0aGUgcmVnaXN0ZXIgY2FjaGUgdW5saWtlCisgKiAjc25kX2NhOTdfd3JpdGVfY2FjaGUoKSwgc28gdXNlIHRoaXMgb25seSB3aGVuIHlvdSBkb24ndCB3YW50IHRvCisgKiByZWZsZWN0IHRoZSBjaGFuZ2UgdG8gdGhlIHN1c3BlbmQvcmVzdW1lIHN0YXRlLgorICovCit2b2lkIHNuZF9hYzk3X3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlpZiAoIXNuZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQorCQlyZXR1cm47CisJaWYgKChhYzk3LT5pZCAmIDB4ZmZmZmZmMDApID09IEFDOTdfSURfQUxDMTAwKSB7CisJCS8qIEZpeCBIL1cgYnVnIG9mIEFMQzEwMC8xMDBQICovCisJCWlmIChyZWcgPT0gQUM5N19NQVNURVIgfHwgcmVnID09IEFDOTdfSEVBRFBIT05FKQorCQkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFjOTcsIEFDOTdfUkVTRVQsIDApOwkvKiByZXNldCBhdWRpbyBjb2RlYyAqLworCX0KKwlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgcmVnLCB2YWx1ZSk7Cit9CisKKy8qKgorICogc25kX2FjOTdfcmVhZCAtIHJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZWdpc3RlcgorICogCisgKiBAYWM5NzogdGhlIGFjOTcgaW5zdGFuY2UKKyAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCisgKgorICogUmVhZHMgYSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZWdpc3Rlci4gIFRoaXMgd2lsbCBpbnZva2UgdGhlIHJlYWQKKyAqIGNhbGxiYWNrIGRpcmVjdGx5IGFmdGVyIHRoZSByZWdpc3RlciBjaGVjay4KKyAqCisgKiBSZXR1cm5zIHRoZSByZWFkIHZhbHVlLgorICovCit1bnNpZ25lZCBzaG9ydCBzbmRfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWlmICghc25kX2FjOTdfdmFsaWRfcmVnKGFjOTcsIHJlZykpCisJCXJldHVybiAwOworCXJldHVybiBhYzk3LT5idXMtPm9wcy0+cmVhZChhYzk3LCByZWcpOworfQorCisvKiByZWFkIGEgcmVnaXN0ZXIgLSByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSBpZiBhbHJlYWR5IHJlYWQgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpZiAoISB0ZXN0X2JpdChyZWcsIGFjOTctPnJlZ19hY2Nlc3NlZCkpIHsKKwkJYWM5Ny0+cmVnc1tyZWddID0gYWM5Ny0+YnVzLT5vcHMtPnJlYWQoYWM5NywgcmVnKTsKKwkJLy8gc2V0X2JpdChyZWcsIGFjOTctPnJlZ19hY2Nlc3NlZCk7CisJfQorCXJldHVybiBhYzk3LT5yZWdzW3JlZ107Cit9CisKKy8qKgorICogc25kX2FjOTdfd3JpdGVfY2FjaGUgLSB3cml0ZSBhIHZhbHVlIG9uIHRoZSBnaXZlbiByZWdpc3RlciBhbmQgdXBkYXRlIHRoZSBjYWNoZQorICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCisgKiBAcmVnOiB0aGUgcmVnaXN0ZXIgdG8gY2hhbmdlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBzZXQKKyAqCisgKiBXcml0ZXMgYSB2YWx1ZSBvbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgYW5kIHVwZGF0ZXMgdGhlIHJlZ2lzdGVyCisgKiBjYWNoZS4gIFRoZSBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGZvciB0aGUgY2FjaGVkLXJlYWQgYW5kIHRoZQorICogc3VzcGVuZC9yZXN1bWUuCisgKi8KK3ZvaWQgc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWlmICghc25kX2FjOTdfdmFsaWRfcmVnKGFjOTcsIHJlZykpCisJCXJldHVybjsKKwlkb3duKCZhYzk3LT5yZWdfbXV0ZXgpOworCWFjOTctPnJlZ3NbcmVnXSA9IHZhbHVlOworCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCByZWcsIHZhbHVlKTsKKwlzZXRfYml0KHJlZywgYWM5Ny0+cmVnX2FjY2Vzc2VkKTsKKwl1cCgmYWM5Ny0+cmVnX211dGV4KTsKK30KKworLyoqCisgKiBzbmRfYWM5N191cGRhdGUgLSB1cGRhdGUgdGhlIHZhbHVlIG9uIHRoZSBnaXZlbiByZWdpc3RlcgorICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCisgKiBAcmVnOiB0aGUgcmVnaXN0ZXIgdG8gY2hhbmdlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBzZXQKKyAqCisgKiBDb21wYXJlcyB0aGUgdmFsdWUgd2l0aCB0aGUgcmVnaXN0ZXIgY2FjaGUgYW5kIHVwZGF0ZXMgdGhlIHZhbHVlCisgKiBvbmx5IHdoZW4gdGhlIHZhbHVlIGlzIGNoYW5nZWQuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLCAwIGlmIG5vIGNoYW5nZSwgb3IgYSBuZWdhdGl2ZQorICogY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgc25kX2FjOTdfdXBkYXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlpbnQgY2hhbmdlOworCisJaWYgKCFzbmRfYWM5N192YWxpZF9yZWcoYWM5NywgcmVnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZG93bigmYWM5Ny0+cmVnX211dGV4KTsKKwljaGFuZ2UgPSBhYzk3LT5yZWdzW3JlZ10gIT0gdmFsdWU7CisJaWYgKGNoYW5nZSkgeworCQlhYzk3LT5yZWdzW3JlZ10gPSB2YWx1ZTsKKwkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFjOTcsIHJlZywgdmFsdWUpOworCX0KKwl1cCgmYWM5Ny0+cmVnX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKioKKyAqIHNuZF9hYzk3X3VwZGF0ZV9iaXRzIC0gdXBkYXRlIHRoZSBiaXRzIG9uIHRoZSBnaXZlbiByZWdpc3RlcgorICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCisgKiBAcmVnOiB0aGUgcmVnaXN0ZXIgdG8gY2hhbmdlCisgKiBAbWFzazogdGhlIGJpdC1tYXNrIHRvIGNoYW5nZQorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gc2V0CisgKgorICogVXBkYXRlcyB0aGUgbWFza2VkLWJpdHMgb24gdGhlIGdpdmVuIHJlZ2lzdGVyIG9ubHkgd2hlbiB0aGUgdmFsdWUKKyAqIGlzIGNoYW5nZWQuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBiaXRzIGFyZSBjaGFuZ2VkLCAwIGlmIG5vIGNoYW5nZSwgb3IgYSBuZWdhdGl2ZQorICogY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisKKwlpZiAoIXNuZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkb3duKCZhYzk3LT5yZWdfbXV0ZXgpOworCWNoYW5nZSA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9jayhhYzk3LCByZWcsIG1hc2ssIHZhbHVlKTsKKwl1cCgmYWM5Ny0+cmVnX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKiBubyBsb2NrIHZlcnNpb24gLSBzZWUgc25kX2FjOTdfdXBkYXRfYml0cygpICovCitpbnQgc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgb2xkLCBuZXc7CisKKwlvbGQgPSBzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIHJlZyk7CisJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOworCWNoYW5nZSA9IG9sZCAhPSBuZXc7CisJaWYgKGNoYW5nZSkgeworCQlhYzk3LT5yZWdzW3JlZ10gPSBuZXc7CisJCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCByZWcsIG5ldyk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3VwZGF0ZV9wY21fYml0cyhhYzk3X3QgKmFjOTcsIGludCBjb2RlYywgdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBzaG9ydCBvbGQsIG5ldywgY2ZnOworCisJZG93bigmYWM5Ny0+cGFnZV9tdXRleCk7CisJb2xkID0gYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXTsKKwluZXcgPSAob2xkICYgfm1hc2spIHwgdmFsdWU7CisJY2hhbmdlID0gb2xkICE9IG5ldzsKKwlpZiAoY2hhbmdlKSB7CisJCWRvd24oJmFjOTctPnJlZ19tdXRleCk7CisJCWNmZyA9IHNuZF9hYzk3X3JlYWRfY2FjaGUoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHKTsKKwkJYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXSA9IG5ldzsKKwkJLyogc2VsZWN0IHNpbmdsZSBjb2RlYyAqLworCQlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLAorCQkJCSAoY2ZnICYgfjB4NzAwMCkgfAorCQkJCSBhYzk3LT5zcGVjLmFkMTh4eC51bmNoYWluZWRbY29kZWNdIHwgYWM5Ny0+c3BlYy5hZDE4eHguY2hhaW5lZFtjb2RlY10pOworCQkvKiB1cGRhdGUgUENNIGJpdHMgKi8KKwkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFjOTcsIEFDOTdfUENNLCBuZXcpOworCQkvKiBzZWxlY3QgYWxsIGNvZGVjcyAqLworCQlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLAorCQkJCSBjZmcgfCAweDcwMDApOworCQl1cCgmYWM5Ny0+cmVnX211dGV4KTsKKwl9CisJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBDb250cm9scworICovCisKK2ludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0cnVjdCBhYzk3X2VudW0gKmUgPSAoc3RydWN0IGFjOTdfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWFzazsKKwkKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IGUtPm1hc2sgLSAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gZS0+bWFzayAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGUtPnRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9hYzk3X2dldF9lbnVtX2RvdWJsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWM5N19lbnVtICplID0gKHN0cnVjdCBhYzk3X2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJCisJdmFsID0gc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3LCBlLT5yZWcpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgKGUtPm1hc2sgLSAxKTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gKHZhbCA+PiBlLT5zaGlmdF9yKSAmIChlLT5tYXNrIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9hYzk3X3B1dF9lbnVtX2RvdWJsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWM5N19lbnVtICplID0gKHN0cnVjdCBhYzk3X2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgbWFzazsKKwkKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1hc2sgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IGUtPnNoaWZ0X2w7CisJbWFzayA9IChlLT5tYXNrIC0gMSkgPDwgZS0+c2hpZnRfbDsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWFzayAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsIHw9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgZS0+c2hpZnRfcjsKKwkJbWFzayB8PSAoZS0+bWFzayAtIDEpIDw8IGUtPnNoaWZ0X3I7CisJfQorCXJldHVybiBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBlLT5yZWcsIG1hc2ssIHZhbCk7Cit9CisKKy8qIHNhdmUvcmVzdG9yZSBhYzk3IHYyLjMgcGFnaW5nICovCitzdGF0aWMgaW50IHNuZF9hYzk3X3BhZ2Vfc2F2ZShhYzk3X3QgKmFjOTcsIGludCByZWcsIHNuZF9rY29udHJvbF90ICprY29udHJvbCkKK3sKKwlpbnQgcGFnZV9zYXZlID0gLTE7CisJaWYgKChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmICgxPDwyNSkpICYmCisJICAgIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1JFVl9NQVNLKSA+PSBBQzk3X0VJX1JFVl8yMyAmJgorCSAgICAocmVnID49IDB4NjAgJiYgcmVnIDwgMHg3MCkpIHsKKwkJdW5zaWduZWQgc2hvcnQgcGFnZSA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNikgJiAweDBmOworCQlkb3duKCZhYzk3LT5wYWdlX211dGV4KTsgLyogbG9jayBwYWdpbmcgKi8KKwkJcGFnZV9zYXZlID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0lOVF9QQUdJTkcpICYgQUM5N19QQUdFX01BU0s7CisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfSU5UX1BBR0lORywgQUM5N19QQUdFX01BU0ssIHBhZ2UpOworCX0KKwlyZXR1cm4gcGFnZV9zYXZlOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWM5N19wYWdlX3Jlc3RvcmUoYWM5N190ICphYzk3LCBpbnQgcGFnZV9zYXZlKQoreworCWlmIChwYWdlX3NhdmUgPj0gMCkgeworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIEFDOTdfUEFHRV9NQVNLLCBwYWdlX3NhdmUpOworCQl1cCgmYWM5Ny0+cGFnZV9tdXRleCk7IC8qIHVubG9jayBwYWdpbmcgKi8KKwl9Cit9CisKKy8qIHZvbHVtZSBhbmQgc3dpdGNoIGNvbnRyb2xzICovCitpbnQgc25kX2FjOTdfaW5mb192b2xzdyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCisJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gc2hpZnQgPT0gcnNoaWZ0ID8gMSA6IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorCitpbnQgc25kX2FjOTdfZ2V0X3ZvbHN3KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJaW50IHBhZ2Vfc2F2ZTsKKworCXBhZ2Vfc2F2ZSA9IHNuZF9hYzk3X3BhZ2Vfc2F2ZShhYzk3LCByZWcsIGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIHJlZykgPj4gcnNoaWZ0KSAmIG1hc2s7CisJaWYgKGludmVydCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJaWYgKHNoaWZ0ICE9IHJzaGlmdCkKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCX0KKwlzbmRfYWM5N19wYWdlX3Jlc3RvcmUoYWM5NywgcGFnZV9zYXZlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9hYzk3X3B1dF92b2xzdyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCWludCBlcnIsIHBhZ2Vfc2F2ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOworCQorCXBhZ2Vfc2F2ZSA9IHNuZF9hYzk3X3BhZ2Vfc2F2ZShhYzk3LCByZWcsIGtjb250cm9sKTsKKwl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKKwlpZiAoaW52ZXJ0KQorCQl2YWwgPSBtYXNrIC0gdmFsOworCXZhbF9tYXNrID0gbWFzayA8PCBzaGlmdDsKKwl2YWwgPSB2YWwgPDwgc2hpZnQ7CisJaWYgKHNoaWZ0ICE9IHJzaGlmdCkgeworCQl2YWwyID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzayk7CisJCWlmIChpbnZlcnQpCisJCQl2YWwyID0gbWFzayAtIHZhbDI7CisJCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OworCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7CisJfQorCWVyciA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIHJlZywgdmFsX21hc2ssIHZhbCk7CisJc25kX2FjOTdfcGFnZV9yZXN0b3JlKGFjOTcsIHBhZ2Vfc2F2ZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19tYXN0ZXJfbW9ub1syXSA9IHsKK0FDOTdfU0lOR0xFKCJNYXN0ZXIgTW9ubyBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X01BU1RFUl9NT05PLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiTWFzdGVyIE1vbm8gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVJfTU9OTywgMCwgMzEsIDEpCit9OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX3RvbmVbMl0gPSB7CitBQzk3X1NJTkdMRSgiVG9uZSBDb250cm9sIC0gQmFzcyIsIEFDOTdfTUFTVEVSX1RPTkUsIDgsIDE1LCAxKSwKK0FDOTdfU0lOR0xFKCJUb25lIENvbnRyb2wgLSBUcmVibGUiLCBBQzk3X01BU1RFUl9UT05FLCAwLCAxNSwgMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfcGNfYmVlcFsyXSA9IHsKK0FDOTdfU0lOR0xFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfUENfQkVFUCwgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCAxLCAxNSwgMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfbWljX2Jvb3N0ID0KKwlBQzk3X1NJTkdMRSgiTWljIEJvb3N0ICgrMjBkQikiLCBBQzk3X01JQywgNiwgMSwgMCk7CisKKworc3RhdGljIGNvbnN0IGNoYXIqIHN0ZF9yZWNfc2VsW10gPSB7Ik1pYyIsICJDRCIsICJWaWRlbyIsICJBdXgiLCAiTGluZSIsICJNaXgiLCAiTWl4IE1vbm8iLCAiUGhvbmUifTsKK3N0YXRpYyBjb25zdCBjaGFyKiBzdGRfM2RfcGF0aFtdID0geyJwcmUgM0QiLCAicG9zdCAzRCJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHN0ZF9taXhbXSA9IHsiTWl4IiwgIk1pYyJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHN0ZF9taWNbXSA9IHsiTWljMSIsICJNaWMyIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWM5N19lbnVtIHN0ZF9lbnVtW10gPSB7CitBQzk3X0VOVU1fRE9VQkxFKEFDOTdfUkVDX1NFTCwgOCwgMCwgOCwgc3RkX3JlY19zZWwpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIDIsIHN0ZF8zZF9wYXRoKSwKK0FDOTdfRU5VTV9TSU5HTEUoQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIDIsIHN0ZF9taXgpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgc3RkX21pYyksCit9OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xfY2FwdHVyZV9zcmMgPSAKK0FDOTdfRU5VTSgiQ2FwdHVyZSBTb3VyY2UiLCBzdGRfZW51bVswXSk7IAorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xfY2FwdHVyZV92b2wgPQorQUM5N19ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgQUM5N19SRUNfR0FJTiwgOCwgMCwgMTUsIDApOworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX21pY19jYXB0dXJlWzJdID0geworQUM5N19TSU5HTEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU5fTUlDLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgQUM5N19SRUNfR0FJTl9NSUMsIDAsIDE1LCAwKQorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlBQzk3X0dFTkVSQUxfUENNX09VVCA9IDAsCisJQUM5N19HRU5FUkFMX1NURVJFT19FTkhBTkNFTUVOVCwKKwlBQzk3X0dFTkVSQUxfM0QsCisJQUM5N19HRU5FUkFMX0xPVURORVNTLAorCUFDOTdfR0VORVJBTF9NT05PLAorCUFDOTdfR0VORVJBTF9NSUMsCisJQUM5N19HRU5FUkFMX0xPT1BCQUNLCit9IGFjOTdfZ2VuZXJhbF9pbmRleF90OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2dlbmVyYWxbN10gPSB7CitBQzk3X0VOVU0oIlBDTSBPdXQgUGF0aCAmIE11dGUiLCBzdGRfZW51bVsxXSksCitBQzk3X1NJTkdMRSgiU2ltdWxhdGVkIFN0ZXJlbyBFbmhhbmNlbWVudCIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxNCwgMSwgMCksCitBQzk3X1NJTkdMRSgiM0QgQ29udHJvbCAtIFN3aXRjaCIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxMywgMSwgMCksCitBQzk3X1NJTkdMRSgiTG91ZG5lc3MgKGJhc3MgYm9vc3QpIiwgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDEyLCAxLCAwKSwKK0FDOTdfRU5VTSgiTW9ubyBPdXRwdXQgU2VsZWN0Iiwgc3RkX2VudW1bMl0pLAorQUM5N19FTlVNKCJNaWMgU2VsZWN0Iiwgc3RkX2VudW1bM10pLAorQUM5N19TSU5HTEUoIkFEQy9EQUMgTG9vcGJhY2siLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgNywgMSwgMCkKK307CisKK2NvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc18zZFsyXSA9IHsKK0FDOTdfU0lOR0xFKCIzRCBDb250cm9sIC0gQ2VudGVyIiwgQUM5N18zRF9DT05UUk9MLCA4LCAxNSwgMCksCitBQzk3X1NJTkdMRSgiM0QgQ29udHJvbCAtIERlcHRoIiwgQUM5N18zRF9DT05UUk9MLCAwLCAxNSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfY2VudGVyWzJdID0geworQUM5N19TSU5HTEUoIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSLCA3LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgMCwgMzEsIDEpCit9OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2xmZVsyXSA9IHsKK0FDOTdfU0lOR0xFKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIkxGRSBQbGF5YmFjayBWb2x1bWUiLCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSLCA4LCAzMSwgMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfc3Vycm91bmRbMl0gPSB7CitBQzk3X0RPVUJMRSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgQUM5N19TVVJST1VORF9NQVNURVIsIDE1LCA3LCAxLCAxKSwKK0FDOTdfRE9VQkxFKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgOCwgMCwgMzEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sX2VhcGQgPQorQUM5N19TSU5HTEUoIkV4dGVybmFsIEFtcGxpZmllciIsIEFDOTdfUE9XRVJET1dOLCAxNSwgMSwgMSk7CisKKy8qIGNoYW5nZSB0aGUgZXhpc3RpbmcgRUFQRCBjb250cm9sIGFzIGludmVydGVkICovCitzdGF0aWMgdm9pZCBzZXRfaW52X2VhcGQoYWM5N190ICphYzk3LCBzbmRfa2NvbnRyb2xfdCAqa2N0bCkKK3sKKwlrY3RsLT5wcml2YXRlX3ZhbHVlID0gQUM5N19TSU5HTEVfVkFMVUUoQUM5N19QT1dFUkRPV04sIDE1LCAxLCAwKTsKKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X1BPV0VSRE9XTiwgKDE8PDE1KSwgKDE8PDE1KSk7IC8qIEVBUEQgdXAgKi8KKwlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfSU5WX0VBUEQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3BkaWZfbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIGludCBzbmRfYWM5N19zcGRpZl9jbWFza19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCQkJICAgSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJCQkgICBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSB8CisJCQkJCSAgIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZIHwKKwkJCQkJICAgSUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gSUVDOTU4X0FFUzNfQ09OX0ZTOworCXJldHVybiAwOworfQorICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgaW50IHNuZF9hYzk3X3NwZGlmX3BtYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJLyogRklYTUU6IEFDJzk3IHNwZWMgZG9lc24ndCBzYXkgd2hpY2ggYml0cyBhcmUgdXNlZCBmb3Igd2hhdCAqLworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCQkJICAgSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJCQkgICBJRUM5NThfQUVTMF9QUk9fRlMgfAorCQkJCQkgICBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19zcGRpZl9kZWZhdWx0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJZG93bigmYWM5Ny0+cmVnX211dGV4KTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IGFjOTctPnNwZGlmX3N0YXR1cyAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAoYWM5Ny0+c3BkaWZfc3RhdHVzID4+IDgpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IChhYzk3LT5zcGRpZl9zdGF0dXMgPj4gMTYpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IChhYzk3LT5zcGRpZl9zdGF0dXMgPj4gMjQpICYgMHhmZjsKKwl1cCgmYWM5Ny0+cmVnX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIGludCBzbmRfYWM5N19zcGRpZl9kZWZhdWx0X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBuZXcgPSAwOworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisJaW50IGNoYW5nZTsKKworCW5ldyA9IHZhbCA9IHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdICYgKElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTHxJRUM5NThfQUVTMF9OT05BVURJTyk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCW5ldyB8PSB1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSAmIChJRUM5NThfQUVTMF9QUk9fRlN8SUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUpOworCQlzd2l0Y2ggKG5ldyAmIElFQzk1OF9BRVMwX1BST19GUykgeworCQljYXNlIElFQzk1OF9BRVMwX1BST19GU180NDEwMDogdmFsIHw9IDA8PDEyOyBicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRlNfNDgwMDA6IHZhbCB8PSAyPDwxMjsgYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwOiB2YWwgfD0gMzw8MTI7IGJyZWFrOworCQlkZWZhdWx0OgkJICAgICAgIHZhbCB8PSAxPDwxMjsgYnJlYWs7CisJCX0KKwkJaWYgKChuZXcgJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMpID09IElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1KQorCQkJdmFsIHw9IDE8PDM7CisJfSBlbHNlIHsKKwkJbmV3IHw9IHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdICYgKElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJU181MDE1fElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUKTsKKwkJbmV3IHw9ICgodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gJiAoSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZfElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTCkpIDw8IDgpOworCQluZXcgfD0gKCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSAmIElFQzk1OF9BRVMzX0NPTl9GUykgPDwgMjQpOworCQlpZiAoKG5ldyAmIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUykgPT0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpCisJCQl2YWwgfD0gMTw8MzsKKwkJaWYgKCEobmV3ICYgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQpKQorCQkJdmFsIHw9IDE8PDI7CisJCXZhbCB8PSAoKG5ldyA+PiA4KSAmIDB4ZmYpIDw8IDQ7CS8vIGNhdGVnb3J5ICsgb3JpZ2luYWwKKwkJc3dpdGNoICgobmV3ID4+IDI0KSAmIDB4ZmYpIHsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fRlNfNDQxMDA6IHZhbCB8PSAwPDwxMjsgYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOiB2YWwgfD0gMjw8MTI7IGJyZWFrOworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMDogdmFsIHw9IDM8PDEyOyBicmVhazsKKwkJZGVmYXVsdDoJCSAgICAgICB2YWwgfD0gMTw8MTI7IGJyZWFrOworCQl9CisJfQorCisJZG93bigmYWM5Ny0+cmVnX211dGV4KTsKKwljaGFuZ2UgPSBhYzk3LT5zcGRpZl9zdGF0dXMgIT0gbmV3OworCWFjOTctPnNwZGlmX3N0YXR1cyA9IG5ldzsKKworCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfQ1NfU1BESUYpIHsKKwkJaW50IHggPSAodmFsID4+IDEyKSAmIDB4MDM7CisJCXN3aXRjaCAoeCkgeworCQljYXNlIDA6IHggPSAxOyBicmVhazsgIC8vIDQ0LjEKKwkJY2FzZSAyOiB4ID0gMDsgYnJlYWs7ICAvLyA0OC4wCisJCWRlZmF1bHQ6IHggPSAwOyBicmVhazsgLy8gaWxsZWdhbC4KKwkJfQorCQljaGFuZ2UgfD0gc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKGFjOTcsIEFDOTdfQ1NSX1NQRElGLCAweDNmZmYsICgodmFsICYgMHhjZmZmKSB8ICh4IDw8IDEyKSkpOworCX0gZWxzZSBpZiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0NYX1NQRElGKSB7CisJCWludCB2OworCQl2ID0gbmV3ICYgKElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJU181MDE1fElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUKSA/IDAgOiBBQzk3X0NYUl9DT1BZUkdUOworCQl2IHw9IG5ldyAmIElFQzk1OF9BRVMwX05PTkFVRElPID8gQUM5N19DWFJfU1BESUZfQUMzIDogQUM5N19DWFJfU1BESUZfUENNOworCQljaGFuZ2UgfD0gc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKGFjOTcsIEFDOTdfQ1hSX0FVRElPX01JU0MsIAorCQkJCQkJICAgICAgQUM5N19DWFJfU1BESUZfTUFTSyB8IEFDOTdfQ1hSX0NPUFlSR1QsCisJCQkJCQkgICAgICB2KTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBzaG9ydCBleHRzdCA9IHNuZF9hYzk3X3JlYWRfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIDApOyAvKiB0dXJuIG9mZiAqLworCisJCWNoYW5nZSB8PSBzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19TUERJRiwgMHgzZmZmLCB2YWwpOworCQlpZiAoZXh0c3QgJiBBQzk3X0VBX1NQRElGKSB7CisJCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIEFDOTdfRUFfU1BESUYpOyAvKiB0dXJuIG9uIGFnYWluICovCisgICAgICAgICAgICAgICAgfQorCX0KKwl1cCgmYWM5Ny0+cmVnX211dGV4KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfcHV0X3Nwc2Eoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCS8vIGludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgb2xkLCBuZXc7CisJaW50IGNoYW5nZTsKKworCXZhbHVlID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisKKwlkb3duKCZhYzk3LT5yZWdfbXV0ZXgpOworCW1hc2sgPDw9IHNoaWZ0OworCXZhbHVlIDw8PSBzaGlmdDsKKwlvbGQgPSBzbmRfYWM5N19yZWFkX2NhY2hlKGFjOTcsIHJlZyk7CisJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOworCWNoYW5nZSA9IG9sZCAhPSBuZXc7CisKKwlpZiAoY2hhbmdlKSB7CisJCXVuc2lnbmVkIHNob3J0IGV4dHN0ID0gc25kX2FjOTdfcmVhZF9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9jayhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgMCk7IC8qIHR1cm4gb2ZmICovCisJCWNoYW5nZSA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9jayhhYzk3LCByZWcsIG1hc2ssIHZhbHVlKTsKKwkJaWYgKGV4dHN0ICYgQUM5N19FQV9TUERJRikKKwkJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9jayhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgQUM5N19FQV9TUERJRik7IC8qIHR1cm4gb24gYWdhaW4gKi8KKwl9CisJdXAoJmFjOTctPnJlZ19tdXRleCk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX3NwZGlmWzVdID0geworCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAorCQkuaW5mbyA9IHNuZF9hYzk3X3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X3NwZGlmX2NtYXNrX2dldCwKKwl9LAorCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUFJPX01BU0spLAorCQkuaW5mbyA9IHNuZF9hYzk3X3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X3NwZGlmX3BtYXNrX2dldCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCQkuaW5mbyA9IHNuZF9hYzk3X3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X3NwZGlmX2RlZmF1bHRfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfc3BkaWZfZGVmYXVsdF9wdXQsCisJfSwKKworCUFDOTdfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpLEFDOTdfRVhURU5ERURfU1RBVFVTLCAyLCAxLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiQUM5Ny1TUFNBIiwKKwkJLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAorCQkuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LAorCQkucHV0ID0gc25kX2FjOTdfcHV0X3Nwc2EsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19TSU5HTEVfVkFMVUUoQUM5N19FWFRFTkRFRF9TVEFUVVMsIDQsIDMsIDApCisJfSwKK307CisKKyNkZWZpbmUgQUQxOFhYX1BDTV9CSVRTKHhuYW1lLCBjb2RlYywgbHNoaWZ0LCByc2hpZnQsIG1hc2spIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmZvID0gc25kX2FjOTdfYWQxOHh4X3BjbV9pbmZvX2JpdHMsIFwKKyAgLmdldCA9IHNuZF9hYzk3X2FkMTh4eF9wY21fZ2V0X2JpdHMsIC5wdXQgPSBzbmRfYWM5N19hZDE4eHhfcGNtX3B1dF9iaXRzLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gKGNvZGVjKSB8ICgobHNoaWZ0KSA8PCA4KSB8ICgocnNoaWZ0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9pbmZvX2JpdHMoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MGY7CisJaW50IGxzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCisJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJaWYgKGxzaGlmdCAhPSByc2hpZnQgJiYgKGFjOTctPmZsYWdzICYgQUM5N19TVEVSRU9fTVVURVMpKQorCQl1aW5mby0+Y291bnQgPSAyOworCWVsc2UKKwkJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9nZXRfYml0cyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDM7CisJaW50IGxzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtYXNrIC0gKChhYzk3LT5zcGVjLmFkMTh4eC5wY21yZWdbY29kZWNdID4+IGxzaGlmdCkgJiBtYXNrKTsKKwlpZiAobHNoaWZ0ICE9IHJzaGlmdCAmJiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X1NURVJFT19NVVRFUykpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gbWFzayAtICgoYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXSA+PiByc2hpZnQpICYgbWFzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9wdXRfYml0cyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDM7CisJaW50IGxzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJdW5zaWduZWQgc2hvcnQgdmFsLCB2YWxtYXNrOworCQorCXZhbCA9IChtYXNrIC0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzaykpIDw8IGxzaGlmdDsKKwl2YWxtYXNrID0gbWFzayA8PCBsc2hpZnQ7CisJaWYgKGxzaGlmdCAhPSByc2hpZnQgJiYgKGFjOTctPmZsYWdzICYgQUM5N19TVEVSRU9fTVVURVMpKSB7CisJCXZhbCB8PSAobWFzayAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spKSA8PCByc2hpZnQ7CisJCXZhbG1hc2sgfD0gbWFzayA8PCByc2hpZnQ7CisJfQorCXJldHVybiBzbmRfYWM5N19hZDE4eHhfdXBkYXRlX3BjbV9iaXRzKGFjOTcsIGNvZGVjLCB2YWxtYXNrLCB2YWwpOworfQorCisjZGVmaW5lIEFEMThYWF9QQ01fVk9MVU1FKHhuYW1lLCBjb2RlYykgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfYWM5N19hZDE4eHhfcGNtX2luZm9fdm9sdW1lLCBcCisgIC5nZXQgPSBzbmRfYWM5N19hZDE4eHhfcGNtX2dldF92b2x1bWUsIC5wdXQgPSBzbmRfYWM5N19hZDE4eHhfcGNtX3B1dF92b2x1bWUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBjb2RlYyB9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9pbmZvX3ZvbHVtZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMzE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOHh4X3BjbV9nZXRfdm9sdW1lKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjb2RlYyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMzsKKwkKKwlkb3duKCZhYzk3LT5wYWdlX211dGV4KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDMxIC0gKChhYzk3LT5zcGVjLmFkMTh4eC5wY21yZWdbY29kZWNdID4+IDApICYgMzEpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gMzEgLSAoKGFjOTctPnNwZWMuYWQxOHh4LnBjbXJlZ1tjb2RlY10gPj4gOCkgJiAzMSk7CisJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTh4eF9wY21fcHV0X3ZvbHVtZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDM7CisJdW5zaWduZWQgc2hvcnQgdmFsMSwgdmFsMjsKKwkKKwl2YWwxID0gMzEgLSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAzMSk7CisJdmFsMiA9IDMxIC0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgMzEpOworCXJldHVybiBzbmRfYWM5N19hZDE4eHhfdXBkYXRlX3BjbV9iaXRzKGFjOTcsIGNvZGVjLCAweDFmMWYsICh2YWwxIDw8IDgpIHwgdmFsMik7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X3BjbVsyXSA9IHsKK0FEMThYWF9QQ01fQklUUygiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsIDE1LCA3LCAxKSwKK0FEMThYWF9QQ01fVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X3N1cnJvdW5kWzJdID0geworQUQxOFhYX1BDTV9CSVRTKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAxLCAxNSwgNywgMSksCitBRDE4WFhfUENNX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X2NlbnRlclsyXSA9IHsKK0FEMThYWF9QQ01fQklUUygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDIsIDE1LCAxNSwgMSksCitBRDE4WFhfUENNX0JJVFMoIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAyLCA4LCA4LCAzMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X2xmZVsyXSA9IHsKK0FEMThYWF9QQ01fQklUUygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDIsIDcsIDcsIDEpLAorQUQxOFhYX1BDTV9CSVRTKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMiwgMCwgMCwgMzEpCit9OworCisvKgorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfYWM5N19wb3dlcmRvd24oYWM5N190ICphYzk3KTsKKworc3RhdGljIGludCBzbmRfYWM5N19idXNfZnJlZShhYzk3X2J1c190ICpidXMpCit7CisJaWYgKGJ1cykgeworCQlzbmRfYWM5N19idXNfcHJvY19kb25lKGJ1cyk7CisJCWtmcmVlKGJ1cy0+cGNtcyk7CisJCWlmIChidXMtPnByaXZhdGVfZnJlZSkKKwkJCWJ1cy0+cHJpdmF0ZV9mcmVlKGJ1cyk7CisJCWtmcmVlKGJ1cyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2J1c19kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwlhYzk3X2J1c190ICpidXMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfYWM5N19idXNfZnJlZShidXMpOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2ZyZWUoYWM5N190ICphYzk3KQoreworCWlmIChhYzk3KSB7CisJCXNuZF9hYzk3X3Byb2NfZG9uZShhYzk3KTsKKwkJaWYgKGFjOTctPmJ1cykgeworCQkJYWM5Ny0+YnVzLT5jb2RlY1thYzk3LT5udW1dID0gTlVMTDsKKwkJCWlmIChhYzk3LT5idXMtPnNoYXJlZF90eXBlKSB7CisJCQkJZG93bigmc2hhcmVkX2NvZGVjX211dGV4KTsKKwkJCQlzaGFyZWRfY29kZWNbYWM5Ny0+YnVzLT5zaGFyZWRfdHlwZS0xXVthYzk3LT5udW1dID0gTlVMTDsKKwkJCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4KTsKKwkJCX0KKwkJfQorCQlpZiAoYWM5Ny0+cHJpdmF0ZV9mcmVlKQorCQkJYWM5Ny0+cHJpdmF0ZV9mcmVlKGFjOTcpOworCQlrZnJlZShhYzk3KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJYWM5N190ICphYzk3ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzbmRfYWM5N19wb3dlcmRvd24oYWM5Nyk7IC8qIGZvciBhdm9pZGluZyBjbGljayBub2lzZXMgZHVyaW5nIHNodXQgZG93biAqLworCXJldHVybiBzbmRfYWM5N19mcmVlKGFjOTcpOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTdfdCAqIGFjOTcsIGludCByZWcpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsLCBtYXNrID0gMHg4MDAwOworCisJaWYgKCEgc25kX2FjOTdfdmFsaWRfcmVnKGFjOTcsIHJlZykpCisJCXJldHVybiAwOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFDOTdfTUFTVEVSX1RPTkU6CisJCXJldHVybiBhYzk3LT5jYXBzICYgMHgwNCA/IDEgOiAwOworCWNhc2UgQUM5N19IRUFEUEhPTkU6CisJCXJldHVybiBhYzk3LT5jYXBzICYgMHgxMCA/IDEgOiAwOworCWNhc2UgQUM5N19SRUNfR0FJTl9NSUM6CisJCXJldHVybiBhYzk3LT5jYXBzICYgMHgwMSA/IDEgOiAwOworCWNhc2UgQUM5N18zRF9DT05UUk9MOgorCQlpZiAoYWM5Ny0+Y2FwcyAmIDB4N2MwMCkgeworCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCQkJLyogaWYgbm9uemVybyAtIGZpeGVkIGFuZCB3ZSBjYW4ndCBzZXQgaXQgKi8KKwkJCXJldHVybiB2YWwgPT0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVI6CS8qIGNlbnRlciAqLworCQlpZiAoKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfQ0RBQykgPT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIrMToJLyogbGZlICovCisJCWlmICgoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9MREFDKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCXJlZyA9IEFDOTdfQ0VOVEVSX0xGRV9NQVNURVI7CisJCW1hc2sgPSAweDAwODA7CisJCWJyZWFrOworCWNhc2UgQUM5N19TVVJST1VORF9NQVNURVI6CisJCWlmICgoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TREFDKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKworCWlmIChhYzk3LT5saW1pdGVkX3JlZ3MgJiYgdGVzdF9iaXQocmVnLCBhYzk3LT5yZWdfYWNjZXNzZWQpKQorCQlyZXR1cm4gMTsgLyogYWxsb3cgd2l0aG91dCBjaGVjayAqLworCisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCWlmICghKHZhbCAmIG1hc2spKSB7CisJCS8qIG5vdGhpbmcgc2VlbXMgdG8gYmUgaGVyZSAtIG11dGUgZmxhZyBpcyBub3Qgc2V0ICovCisJCS8qIHRyeSBhbm90aGVyIHRlc3QgKi8KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgcmVnLCB2YWwgfCBtYXNrKTsKKwkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCQlpZiAoISh2YWwgJiBtYXNrKSkKKwkJCXJldHVybiAwOwkvKiBub3RoaW5nIGhlcmUgKi8KKwl9CisJcmV0dXJuIDE7CQkvKiBzdWNjZXNzLCB1c2VhYmxlICovCit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3ZvbHVtZV9yZXNvbHV0aW9uKGFjOTdfdCAqYWM5NywgaW50IHJlZywgdW5zaWduZWQgY2hhciAqbG9fbWF4LCB1bnNpZ25lZCBjaGFyICpoaV9tYXgpCit7CisJdW5zaWduZWQgc2hvcnQgY2JpdFszXSA9IHsgMHgyMCwgMHgxMCwgMHgwMSB9OworCXVuc2lnbmVkIGNoYXIgbWF4WzNdID0geyA2MywgMzEsIDE1IH07CisJaW50IGk7CisKKwkqbG9fbWF4ID0gKmhpX21heCA9IDA7CisJZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKGNiaXQpOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgdmFsOworCQlzbmRfYWM5N193cml0ZShhYzk3LCByZWcsIDB4ODA4MCB8IGNiaXRbaV0gfCAoY2JpdFtpXSA8PCA4KSk7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKTsKKwkJaWYgKCEgKmxvX21heCAmJiAodmFsICYgY2JpdFtpXSkpCisJCQkqbG9fbWF4ID0gbWF4W2ldOworCQlpZiAoISAqaGlfbWF4ICYmICh2YWwgJiAoY2JpdFtpXSA8PCA4KSkpCisJCQkqaGlfbWF4ID0gbWF4W2ldOworCQlpZiAoKmxvX21heCAmJiAqaGlfbWF4KQorCQkJYnJlYWs7CisJfQorfQorCitpbnQgc25kX2FjOTdfdHJ5X2JpdChhYzk3X3QgKiBhYzk3LCBpbnQgcmVnLCBpbnQgYml0KQoreworCXVuc2lnbmVkIHNob3J0IG1hc2ssIHZhbCwgb3JpZywgcmVzOworCisJbWFzayA9IDEgPDwgYml0OworCW9yaWcgPSBzbmRfYWM5N19yZWFkKGFjOTcsIHJlZyk7CisJdmFsID0gb3JpZyBeIG1hc2s7CisJc25kX2FjOTdfd3JpdGUoYWM5NywgcmVnLCB2YWwpOworCXJlcyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWcsIG9yaWcpOworCXJldHVybiByZXMgPT0gdmFsOworfQorCisvKiBjaGVjayB0aGUgdm9sdW1lIHJlc29sdXRpb24gb2YgY2VudGVyL2xmZSAqLworc3RhdGljIHZvaWQgc25kX2FjOTdfY2hhbmdlX3ZvbHVtZV9wYXJhbXMyKGFjOTdfdCAqIGFjOTcsIGludCByZWcsIGludCBzaGlmdCwgdW5zaWduZWQgY2hhciAqbWF4KQoreworCXVuc2lnbmVkIHNob3J0IHZhbCwgdmFsMTsKKworCSptYXggPSA2MzsKKwl2YWwgPSAweDgwODAgfCAoMHgyMCA8PCBzaGlmdCk7CisJc25kX2FjOTdfd3JpdGUoYWM5NywgcmVnLCB2YWwpOworCXZhbDEgPSBzbmRfYWM5N19yZWFkKGFjOTcsIHJlZyk7CisJaWYgKHZhbCAhPSB2YWwxKSB7CisJCSptYXggPSAzMTsKKwl9CisJLyogcmVzZXQgdm9sdW1lIHRvIHplcm8gKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWcsIDB4ODA4MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByaW50YWJsZSh1bnNpZ25lZCBpbnQgeCkKK3sKKwl4ICY9IDB4ZmY7CisJaWYgKHggPCAnICcgfHwgeCA+PSAweDcxKSB7CisJCWlmICh4IDw9IDB4ODkpCisJCQlyZXR1cm4geCAtIDB4NzEgKyAnQSc7CisJCXJldHVybiAnPyc7CisJfQorCXJldHVybiB4OworfQorCitzbmRfa2NvbnRyb2xfdCAqc25kX2FjOTdfY25ldyhjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3QgKl90ZW1wbGF0ZSwgYWM5N190ICogYWM5NykKK3sKKwlzbmRfa2NvbnRyb2xfbmV3X3QgdGVtcGxhdGU7CisJbWVtY3B5KCZ0ZW1wbGF0ZSwgX3RlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKKwlzbmRfcnVudGltZV9jaGVjayghdGVtcGxhdGUuaW5kZXgsIHJldHVybiBOVUxMKTsKKwl0ZW1wbGF0ZS5pbmRleCA9IGFjOTctPm51bTsKKwlyZXR1cm4gc25kX2N0bF9uZXcxKCZ0ZW1wbGF0ZSwgYWM5Nyk7Cit9CisKKy8qCisgKiBjcmVhdGUgbXV0ZSBzd2l0Y2goZXMpIGZvciBub3JtYWwgc3RlcmVvIGNvbnRyb2xzCisgKi8KK3N0YXRpYyBpbnQgc25kX2FjOTdfY211dGVfbmV3X3N0ZXJlbyhzbmRfY2FyZF90ICpjYXJkLCBjaGFyICpuYW1lLCBpbnQgcmVnLCBpbnQgY2hlY2tfc3RlcmVvLCBhYzk3X3QgKmFjOTcpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDEsIG11dGVfbWFzazsKKworCWlmICghIHNuZF9hYzk3X3ZhbGlkX3JlZyhhYzk3LCByZWcpKQorCQlyZXR1cm4gMDsKKworCW11dGVfbWFzayA9IDB4ODAwMDsKKwl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIHJlZyk7CisJaWYgKGNoZWNrX3N0ZXJlbyB8fCAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X1NURVJFT19NVVRFUykpIHsKKwkJLyogY2hlY2sgd2hldGhlciBib3RoIG11dGUgYml0cyB3b3JrICovCisJCXZhbDEgPSB2YWwgfCAweDgwODA7CisJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIHJlZywgdmFsMSk7CisJCWlmICh2YWwxID09IHNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKSkKKwkJCW11dGVfbWFzayA9IDB4ODA4MDsKKwl9CisJaWYgKG11dGVfbWFzayA9PSAweDgwODApIHsKKwkJc25kX2tjb250cm9sX25ld190IHRtcCA9IEFDOTdfRE9VQkxFKG5hbWUsIHJlZywgMTUsIDcsIDEsIDEpOworCQl0bXAuaW5kZXggPSBhYzk3LT5udW07CisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnRtcCwgYWM5Nyk7CisJfSBlbHNlIHsKKwkJc25kX2tjb250cm9sX25ld190IHRtcCA9IEFDOTdfU0lOR0xFKG5hbWUsIHJlZywgMTUsIDEsIDEpOworCQl0bXAuaW5kZXggPSBhYzk3LT5udW07CisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnRtcCwgYWM5Nyk7CisJfQorCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIG11dGUgYXMgZGVmYXVsdCAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHJlZywgdmFsIHwgbXV0ZV9tYXNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZSBhIHZvbHVtZSBmb3Igbm9ybWFsIHN0ZXJlby9tb25vIGNvbnRyb2xzCisgKi8KK3N0YXRpYyBpbnQgc25kX2FjOTdfY3ZvbF9uZXcoc25kX2NhcmRfdCAqY2FyZCwgY2hhciAqbmFtZSwgaW50IHJlZywgdW5zaWduZWQgaW50IGxvX21heCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGhpX21heCwgYWM5N190ICphYzk3KQoreworCWludCBlcnI7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisKKwlpZiAoISBzbmRfYWM5N192YWxpZF9yZWcoYWM5NywgcmVnKSkKKwkJcmV0dXJuIDA7CisJaWYgKGhpX21heCkgeworCQkvKiBpbnZlcnQgKi8KKwkJc25kX2tjb250cm9sX25ld190IHRtcCA9IEFDOTdfRE9VQkxFKG5hbWUsIHJlZywgOCwgMCwgbG9fbWF4LCAxKTsKKwkJdG1wLmluZGV4ID0gYWM5Ny0+bnVtOworCQlrY3RsID0gc25kX2N0bF9uZXcxKCZ0bXAsIGFjOTcpOworCX0gZWxzZSB7CisJCS8qIGludmVydCAqLworCQlzbmRfa2NvbnRyb2xfbmV3X3QgdG1wID0gQUM5N19TSU5HTEUobmFtZSwgcmVnLCAwLCBsb19tYXgsIDEpOworCQl0bXAuaW5kZXggPSBhYzk3LT5udW07CisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnRtcCwgYWM5Nyk7CisJfQorCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHJlZywKKwkJCSAgICAgKHNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKSAmIDB4ODA4MCkgfAorCQkJICAgICBsb19tYXggfCAoaGlfbWF4IDw8IDgpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZSBhIG11dGUtc3dpdGNoIGFuZCBhIHZvbHVtZSBmb3Igbm9ybWFsIHN0ZXJlby9tb25vIGNvbnRyb2xzCisgKi8KK3N0YXRpYyBpbnQgc25kX2FjOTdfY21peF9uZXdfc3RlcmVvKHNuZF9jYXJkX3QgKmNhcmQsIGNvbnN0IGNoYXIgKnBmeCwgaW50IHJlZywgaW50IGNoZWNrX3N0ZXJlbywgYWM5N190ICphYzk3KQoreworCWludCBlcnI7CisJY2hhciBuYW1lWzQ0XTsKKwl1bnNpZ25lZCBjaGFyIGxvX21heCwgaGlfbWF4OworCisJaWYgKCEgc25kX2FjOTdfdmFsaWRfcmVnKGFjOTcsIHJlZykpCisJCXJldHVybiAwOworCisJaWYgKHNuZF9hYzk3X3RyeV9iaXQoYWM5NywgcmVnLCAxNSkpIHsKKwkJc3ByaW50ZihuYW1lLCAiJXMgU3dpdGNoIiwgcGZ4KTsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19jbXV0ZV9uZXdfc3RlcmVvKGNhcmQsIG5hbWUsIHJlZywgY2hlY2tfc3RlcmVvLCBhYzk3KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJY2hlY2tfdm9sdW1lX3Jlc29sdXRpb24oYWM5NywgcmVnLCAmbG9fbWF4LCAmaGlfbWF4KTsKKwlpZiAobG9fbWF4KSB7CisJCXNwcmludGYobmFtZSwgIiVzIFZvbHVtZSIsIHBmeCk7CisJCWlmICgoZXJyID0gc25kX2FjOTdfY3ZvbF9uZXcoY2FyZCwgbmFtZSwgcmVnLCBsb19tYXgsIGhpX21heCwgYWM5NykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsIHBmeCwgcmVnLCBhYzk3KQlzbmRfYWM5N19jbWl4X25ld19zdGVyZW8oY2FyZCwgcGZ4LCByZWcsIDAsIGFjOTcpCisjZGVmaW5lIHNuZF9hYzk3X2NtdXRlX25ldyhjYXJkLCBuYW1lLCByZWcsIGFjOTcpCXNuZF9hYzk3X2NtdXRlX25ld19zdGVyZW8oY2FyZCwgbmFtZSwgcmVnLCAwLCBhYzk3KQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9hYzk3X2RldGVybWluZV9zcGRpZl9yYXRlcyhhYzk3X3QgKmFjOTcpOworCitzdGF0aWMgaW50IHNuZF9hYzk3X21peGVyX2J1aWxkKGFjOTdfdCAqIGFjOTcpCit7CisJc25kX2NhcmRfdCAqY2FyZCA9IGFjOTctPmJ1cy0+Y2FyZDsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgY2hhciBtYXg7CisKKwkvKiBidWlsZCBtYXN0ZXIgY29udHJvbHMgKi8KKwkvKiBBRCBjbGFpbXMgdG8gcmVtb3ZlIHRoaXMgY29udHJvbCBmcm9tIEFEMTg4NywgYWx0aG91Z2ggc3BlYyB2Mi4yIGRvZXMgbm90IGFsbG93IHRoaXMgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19NQVNURVIpKSB7CisJCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfSEFTX05PX01BU1RFUl9WT0wpCisJCQllcnIgPSBzbmRfYWM5N19jbXV0ZV9uZXcoY2FyZCwgIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X01BU1RFUiwgYWM5Nyk7CisJCWVsc2UKKwkJCWVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsICJNYXN0ZXIgUGxheWJhY2siLCBBQzk3X01BU1RFUiwgYWM5Nyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlhYzk3LT5yZWdzW0FDOTdfQ0VOVEVSX0xGRV9NQVNURVJdID0gMHg4MDgwOworCisJLyogYnVpbGQgY2VudGVyIGNvbnRyb2xzICovCisJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIpKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfY2VudGVyWzBdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2NlbnRlclsxXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzbmRfYWM5N19jaGFuZ2Vfdm9sdW1lX3BhcmFtczIoYWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgMCwgJm1heCk7CisJCWtjdGwtPnByaXZhdGVfdmFsdWUgJj0gfigweGZmIDw8IDE2KTsKKwkJa2N0bC0+cHJpdmF0ZV92YWx1ZSB8PSAoaW50KW1heCA8PCAxNjsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgYWM5Ny0+cmVnc1tBQzk3X0NFTlRFUl9MRkVfTUFTVEVSXSB8IG1heCk7CisJfQorCisJLyogYnVpbGQgTEZFIGNvbnRyb2xzICovCisJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIrMSkpIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19sZmVbMF0sIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfbGZlWzFdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXNuZF9hYzk3X2NoYW5nZV92b2x1bWVfcGFyYW1zMihhYzk3LCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSLCA4LCAmbWF4KTsKKwkJa2N0bC0+cHJpdmF0ZV92YWx1ZSAmPSB+KDB4ZmYgPDwgMTYpOworCQlrY3RsLT5wcml2YXRlX3ZhbHVlIHw9IChpbnQpbWF4IDw8IDE2OworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSLCBhYzk3LT5yZWdzW0FDOTdfQ0VOVEVSX0xGRV9NQVNURVJdIHwgbWF4IDw8IDgpOworCX0KKworCS8qIGJ1aWxkIHN1cnJvdW5kIGNvbnRyb2xzICovCisJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfU1VSUk9VTkRfTUFTVEVSKSkgeworCQkvKiBTdXJyb3VuZCBNYXN0ZXIgKDB4MzgpIGlzIHdpdGggc3RlcmVvIG11dGVzICovCisJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXdfc3RlcmVvKGNhcmQsICJTdXJyb3VuZCBQbGF5YmFjayIsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAxLCBhYzk3KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBidWlsZCBoZWFkcGhvbmUgY29udHJvbHMgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19IRUFEUEhPTkUpKSB7CisJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIkhlYWRwaG9uZSBQbGF5YmFjayIsIEFDOTdfSEVBRFBIT05FLCBhYzk3KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJLyogYnVpbGQgbWFzdGVyIG1vbm8gY29udHJvbHMgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19NQVNURVJfTU9OTykpIHsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiTWFzdGVyIE1vbm8gUGxheWJhY2siLCBBQzk3X01BU1RFUl9NT05PLCBhYzk3KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJLyogYnVpbGQgbWFzdGVyIHRvbmUgY29udHJvbHMgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19NQVNURVJfVE9ORSkpIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykgeworCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfdG9uZVtpZHhdLCBhYzk3KSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKGFjOTctPmlkID09IEFDOTdfSURfWU1GNzUzKSB7CisJCQkJa2N0bC0+cHJpdmF0ZV92YWx1ZSAmPSB+KDB4ZmYgPDwgMTYpOworCQkJCWtjdGwtPnByaXZhdGVfdmFsdWUgfD0gNyA8PCAxNjsKKwkJCX0KKwkJfQorCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X01BU1RFUl9UT05FLCAweDBmMGYpOworCX0KKwkKKwkvKiBidWlsZCBQQyBTcGVha2VyIGNvbnRyb2xzICovCisJaWYgKCEoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19QQ19CRUVQKSAmJiAKKwkJKChhYzk3LT5mbGFncyAmIEFDOTdfSEFTX1BDX0JFRVApIHx8CisJICAgIHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfUENfQkVFUCkpKSB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspCisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX3BjX2JlZXBbaWR4XSwgYWM5NykpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19QQ19CRUVQLAorCQkJCSAgICAgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1BDX0JFRVApIHwgMHg4MDFlKTsKKwl9CisJCisJLyogYnVpbGQgUGhvbmUgY29udHJvbHMgKi8KKwlpZiAoIShhYzk3LT5mbGFncyAmIEFDOTdfSEFTX05PX1BIT05FKSkgeworCQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19QSE9ORSkpIHsKKwkJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIlBob25lIFBsYXliYWNrIiwgQUM5N19QSE9ORSwgYWM5NykpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCQorCS8qIGJ1aWxkIE1JQyBjb250cm9scyAqLworCWlmIChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X01JQykpIHsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiTWljIFBsYXliYWNrIiwgQUM5N19NSUMsIGFjOTcpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX21pY19ib29zdCwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGJ1aWxkIExpbmUgY29udHJvbHMgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19MSU5FKSkgeworCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsICJMaW5lIFBsYXliYWNrIiwgQUM5N19MSU5FLCBhYzk3KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJLyogYnVpbGQgQ0QgY29udHJvbHMgKi8KKwlpZiAoIShhYzk3LT5mbGFncyAmIEFDOTdfSEFTX05PX0NEKSkgeworCQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19DRCkpIHsKKwkJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIkNEIFBsYXliYWNrIiwgQUM5N19DRCwgYWM5NykpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCQorCS8qIGJ1aWxkIFZpZGVvIGNvbnRyb2xzICovCisJaWYgKCEoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19WSURFTykpIHsKKwkJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfVklERU8pKSB7CisJCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsICJWaWRlbyBQbGF5YmFjayIsIEFDOTdfVklERU8sIGFjOTcpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIGJ1aWxkIEF1eCBjb250cm9scyAqLworCWlmIChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X0FVWCkpIHsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiQXV4IFBsYXliYWNrIiwgQUM5N19BVVgsIGFjOTcpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGJ1aWxkIFBDTSBjb250cm9scyAqLworCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfQURfTVVMVEkpIHsKKwkJdW5zaWduZWQgc2hvcnQgaW5pdF92YWw7CisJCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfU1RFUkVPX01VVEVTKQorCQkJaW5pdF92YWwgPSAweDlmOWY7CisJCWVsc2UKKwkJCWluaXRfdmFsID0gMHg5ZjFmOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKQorCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19hZDE4eHhfcGNtW2lkeF0sIGFjOTcpKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCWFjOTctPnNwZWMuYWQxOHh4LnBjbXJlZ1swXSA9IGluaXRfdmFsOworCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfU1VSUk9VTkRfREFDKSB7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKQorCQkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X3N1cnJvdW5kW2lkeF0sIGFjOTcpKSkgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnWzFdID0gaW5pdF92YWw7CisJCX0KKwkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKSB7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKQorCQkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfYWQxOHh4X2NlbnRlcltpZHhdLCBhYzk3KSkpIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspCisJCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19hZDE4eHhfbGZlW2lkeF0sIGFjOTcpKSkgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnWzJdID0gaW5pdF92YWw7CisJCX0KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19QQ00sIGluaXRfdmFsKTsKKwl9IGVsc2UgeworCQlpZiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19QQ01fVk9MKQorCQkJZXJyID0gc25kX2FjOTdfY211dGVfbmV3KGNhcmQsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgQUM5N19QQ00sIGFjOTcpOworCQllbHNlCisJCQllcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiUENNIFBsYXliYWNrIiwgQUM5N19QQ00sIGFjOTcpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYnVpbGQgQ2FwdHVyZSBjb250cm9scyAqLworCWlmICghKGFjOTctPmZsYWdzICYgQUM5N19IQVNfTk9fUkVDX0dBSU4pKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbF9jYXB0dXJlX3NyYywgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoc25kX2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X1JFQ19HQUlOLCAxNSkpIHsKKwkJCWlmICgoZXJyID0gc25kX2FjOTdfY211dGVfbmV3KGNhcmQsICJDYXB0dXJlIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU4sIGFjOTcpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xfY2FwdHVyZV92b2wsIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19SRUNfU0VMLCAweDAwMDApOworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1JFQ19HQUlOLCAweDAwMDApOworCX0KKwkvKiBidWlsZCBNSUMgQ2FwdHVyZSBjb250cm9scyAqLworCWlmIChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X1JFQ19HQUlOX01JQykpIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfbWljX2NhcHR1cmVbaWR4XSwgYWM5NykpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19SRUNfR0FJTl9NSUMsIDB4MDAwMCk7CisJfQorCisJLyogYnVpbGQgUENNIG91dCBwYXRoICYgbXV0ZSBjb250cm9sICovCisJaWYgKHNuZF9hYzk3X3RyeV9iaXQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDE1KSkgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2dlbmVyYWxbQUM5N19HRU5FUkFMX1BDTV9PVVRdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYnVpbGQgU2ltdWxhdGVkIFN0ZXJlbyBFbmhhbmNlbWVudCBjb250cm9sICovCisJaWYgKGFjOTctPmNhcHMgJiAweDAwMDgpIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19nZW5lcmFsW0FDOTdfR0VORVJBTF9TVEVSRU9fRU5IQU5DRU1FTlRdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYnVpbGQgM0QgU3RlcmVvIEVuaGFuY2VtZW50IGNvbnRyb2wgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTMpKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfZ2VuZXJhbFtBQzk3X0dFTkVSQUxfM0RdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYnVpbGQgTG91ZG5lc3MgY29udHJvbCAqLworCWlmIChhYzk3LT5jYXBzICYgMHgwMDIwKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfZ2VuZXJhbFtBQzk3X0dFTkVSQUxfTE9VRE5FU1NdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYnVpbGQgTW9ubyBvdXRwdXQgc2VsZWN0IGNvbnRyb2wgKi8KKwlpZiAoc25kX2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOSkpIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19nZW5lcmFsW0FDOTdfR0VORVJBTF9NT05PXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGJ1aWxkIE1pYyBzZWxlY3QgY29udHJvbCAqLworCWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4KSkgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2dlbmVyYWxbQUM5N19HRU5FUkFMX01JQ10sIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBidWlsZCBBREMvREFDIGxvb3BiYWNrIGNvbnRyb2wgKi8KKwlpZiAoZW5hYmxlX2xvb3BiYWNrICYmIHNuZF9hYzk3X3RyeV9iaXQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDcpKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfZ2VuZXJhbFtBQzk3X0dFTkVSQUxfTE9PUEJBQ0tdLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIH5BQzk3X0dQX0RSU1NfTUFTSywgMHgwMDAwKTsKKworCS8qIGJ1aWxkIDNEIGNvbnRyb2xzICovCisJaWYgKGFjOTctPmJ1aWxkX29wcy0+YnVpbGRfM2QpIHsKKwkJYWM5Ny0+YnVpbGRfb3BzLT5idWlsZF8zZChhYzk3KTsKKwl9IGVsc2UgeworCQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N18zRF9DT05UUk9MKSkgeworCQkJdW5zaWduZWQgc2hvcnQgdmFsOworCQkJdmFsID0gMHgwNzA3OworCQkJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N18zRF9DT05UUk9MLCB2YWwpOworCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3XzNEX0NPTlRST0wpOworCQkJdmFsID0gdmFsID09IDB4MDYwNjsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzXzNkWzBdLCBhYzk3KSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKHZhbCkKKwkJCQlrY3RsLT5wcml2YXRlX3ZhbHVlID0gQUM5N18zRF9DT05UUk9MIHwgKDkgPDwgOCkgfCAoNyA8PCAxNik7CisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc18zZFsxXSwgYWM5NykpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWlmICh2YWwpCisJCQkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IEFDOTdfM0RfQ09OVFJPTCB8ICgxIDw8IDgpIHwgKDcgPDwgMTYpOworCQkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N18zRF9DT05UUk9MLCAweDAwMDApOworCQl9CisJfQorCisJLyogYnVpbGQgUy9QRElGIGNvbnRyb2xzICovCisJaWYgKChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKSAmJiAhKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX05PX1NQRElGKSkgeworCQlpZiAoYWM5Ny0+YnVpbGRfb3BzLT5idWlsZF9zcGRpZikgeworCQkJaWYgKChlcnIgPSBhYzk3LT5idWlsZF9vcHMtPmJ1aWxkX3NwZGlmKGFjOTcpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspCisJCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19zcGRpZltpZHhdLCBhYzk3KSkpIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCWlmIChhYzk3LT5idWlsZF9vcHMtPmJ1aWxkX3Bvc3Rfc3BkaWYpIHsKKwkJCQlpZiAoKGVyciA9IGFjOTctPmJ1aWxkX29wcy0+YnVpbGRfcG9zdF9zcGRpZihhYzk3KSkgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJLyogc2V0IGRlZmF1bHQgUENNIFMvUERJRiBwYXJhbXMgKi8KKwkJCS8qIGNvbnN1bWVyLFBDTSBhdWRpbyxubyBjb3B5cmlnaHQsbm8gcHJlZW1waGFzaXMsUENNIGNvZGVyLG9yaWdpbmFsLDQ4MDAwSHogKi8KKwkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU1BESUYsIDB4MmEyMCk7CisJCQlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX1NQRElGXSA9IHNuZF9hYzk3X2RldGVybWluZV9zcGRpZl9yYXRlcyhhYzk3KTsKKwkJfQorCQlhYzk3LT5zcGRpZl9zdGF0dXMgPSBTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUY7CisJfQorCQorCS8qIGJ1aWxkIGNoaXAgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlpZiAoYWM5Ny0+YnVpbGRfb3BzLT5idWlsZF9zcGVjaWZpYykKKwkJaWYgKChlcnIgPSBhYzk3LT5idWlsZF9vcHMtPmJ1aWxkX3NwZWNpZmljKGFjOTcpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCisJaWYgKHNuZF9hYzk3X3RyeV9iaXQoYWM5NywgQUM5N19QT1dFUkRPV04sIDE1KSkgeworCQlrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbF9lYXBkLCBhYzk3KTsKKwkJaWYgKCEga2N0bCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfSU5WX0VBUEQpCisJCQlzZXRfaW52X2VhcGQoYWM5Nywga2N0bCk7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfbW9kZW1fYnVpbGQoc25kX2NhcmRfdCAqIGNhcmQsIGFjOTdfdCAqIGFjOTcpCit7CisJLyogVE9ETyAqLworCS8vcHJpbnRrKCJBQzk3X0dQSU9fQ0ZHID0gJXhcbiIsc25kX2FjOTdfcmVhZChhYzk3LEFDOTdfR1BJT19DRkcpKTsKKwlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0dQSU9fQ0ZHLCAweGZmZmYgJiB+KEFDOTdfR1BJT19MSU5FMV9PSCkpOworCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfR1BJT19QT0xBUklUWSwgMHhmZmZmICYgfihBQzk3X0dQSU9fTElORTFfT0gpKTsKKwlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0dQSU9fU1RJQ0tZLCAweGZmZmYpOworCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfR1BJT19XQUtFVVAsIDB4MCk7CisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19NSVNDX0FGRSwgMHgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N190ZXN0X3JhdGUoYWM5N190ICphYzk3LCBpbnQgcmVnLCBpbnQgc2hhZG93X3JlZywgaW50IHJhdGUpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXVuc2lnbmVkIGludCB0bXA7CisKKwl0bXAgPSAoKHVuc2lnbmVkIGludClyYXRlICogYWM5Ny0+YnVzLT5jbG9jaykgLyA0ODAwMDsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWcsIHRtcCAmIDB4ZmZmZik7CisJaWYgKHNoYWRvd19yZWcpCisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHNoYWRvd19yZWcsIHRtcCAmIDB4ZmZmZik7CisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCXJldHVybiB2YWwgPT0gKHRtcCAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hYzk3X2RldGVybWluZV9yYXRlcyhhYzk3X3QgKmFjOTcsIGludCByZWcsIGludCBzaGFkb3dfcmVnLCB1bnNpZ25lZCBpbnQgKnJfcmVzdWx0KQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIHNob3J0IHNhdmVkOworCisJaWYgKGFjOTctPmJ1cy0+bm9fdnJhKSB7CisJCSpyX3Jlc3VsdCA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOworCQlpZiAoKGFjOTctPmZsYWdzICYgQUM5N19ET1VCTEVfUkFURSkgJiYKKwkJICAgIHJlZyA9PSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkKKwkJCSpyX3Jlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV85NjAwMDsKKwkJcmV0dXJuOworCX0KKworCXNhdmVkID0gc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCWlmICgoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9EUkEpICYmIHJlZyA9PSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkKKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJICAgICBBQzk3X0VBX0RSQSwgMCk7CisJLyogdGVzdCBhIG5vbi1zdGFuZGFyZCByYXRlICovCisJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDExMDAwKSkKKwkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVM7CisJLyogbGV0J3MgdHJ5IHRvIG9idGFpbiBzdGFuZGFyZCByYXRlcyAqLworCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCA4MDAwKSkKKwkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzgwMDA7CisJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDExMDI1KSkKKwkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzExMDI1OworCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCAxNjAwMCkpCisJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV8xNjAwMDsKKwlpZiAoc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93X3JlZywgMjIwNTApKQorCQlyZXN1bHQgfD0gU05EUlZfUENNX1JBVEVfMjIwNTA7CisJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDMyMDAwKSkKKwkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzMyMDAwOworCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCA0NDEwMCkpCisJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV80NDEwMDsKKwlpZiAoc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93X3JlZywgNDgwMDApKQorCQlyZXN1bHQgfD0gU05EUlZfUENNX1JBVEVfNDgwMDA7CisJaWYgKChhYzk3LT5mbGFncyAmIEFDOTdfRE9VQkxFX1JBVEUpICYmCisJICAgIHJlZyA9PSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkgeworCQkvKiB0ZXN0IHN0YW5kYXJkIGRvdWJsZSByYXRlcyAqLworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCQkgICAgIEFDOTdfRUFfRFJBLCBBQzk3X0VBX0RSQSk7CisJCWlmIChzbmRfYWM5N190ZXN0X3JhdGUoYWM5NywgcmVnLCBzaGFkb3dfcmVnLCA2NDAwMCAvIDIpKQorCQkJcmVzdWx0IHw9IFNORFJWX1BDTV9SQVRFXzY0MDAwOworCQlpZiAoc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93X3JlZywgODgyMDAgLyAyKSkKKwkJCXJlc3VsdCB8PSBTTkRSVl9QQ01fUkFURV84ODIwMDsKKwkJaWYgKHNuZF9hYzk3X3Rlc3RfcmF0ZShhYzk3LCByZWcsIHNoYWRvd19yZWcsIDk2MDAwIC8gMikpCisJCQlyZXN1bHQgfD0gU05EUlZfUENNX1JBVEVfOTYwMDA7CisJCS8qIHNvbWUgY29kZWNzIGRvbid0IHN1cHBvcnQgdmFyaWFibGUgZG91YmxlIHJhdGVzICovCisJCWlmICghc25kX2FjOTdfdGVzdF9yYXRlKGFjOTcsIHJlZywgc2hhZG93X3JlZywgNzYxMDAgLyAyKSkKKwkJCXJlc3VsdCAmPSB+U05EUlZfUENNX1JBVEVfQ09OVElOVU9VUzsKKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJICAgICBBQzk3X0VBX0RSQSwgMCk7CisJfQorCS8qIHJlc3RvcmUgdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWcsIHNhdmVkKTsKKwlpZiAoc2hhZG93X3JlZykKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5Nywgc2hhZG93X3JlZywgc2F2ZWQpOworCSpyX3Jlc3VsdCA9IHJlc3VsdDsKK30KKworLyogY2hlY2sgQUM5N19TUERJRiByZWdpc3RlciB0byBhY2NlcHQgd2hpY2ggc2FtcGxlIHJhdGVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9hYzk3X2RldGVybWluZV9zcGRpZl9yYXRlcyhhYzk3X3QgKmFjOTcpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisJaW50IGk7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IGN0bF9iaXRzW10gPSB7CisJCUFDOTdfU0NfU1BTUl80NEssIEFDOTdfU0NfU1BTUl8zMkssIEFDOTdfU0NfU1BTUl80OEsKKwl9OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZV9iaXRzW10gPSB7CisJCVNORFJWX1BDTV9SQVRFXzQ0MTAwLCBTTkRSVl9QQ01fUkFURV8zMjAwMCwgU05EUlZfUENNX1JBVEVfNDgwMDAKKwl9OworCisJZm9yIChpID0gMDsgaSA8IChpbnQpQVJSQVlfU0laRShjdGxfYml0cyk7IGkrKykgeworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X1NQRElGLCBBQzk3X1NDX1NQU1JfTUFTSywgY3RsX2JpdHNbaV0pOworCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19TUERJRikgJiBBQzk3X1NDX1NQU1JfTUFTSykgPT0gY3RsX2JpdHNbaV0pCisJCQlyZXN1bHQgfD0gcmF0ZV9iaXRzW2ldOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBsb29rIGZvciB0aGUgY29kZWMgaWQgdGFibGUgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gaWQgKi8KK3N0YXRpYyBjb25zdCBhYzk3X2NvZGVjX2lkX3QgKmxvb2tfZm9yX2NvZGVjX2lkKGNvbnN0IGFjOTdfY29kZWNfaWRfdCAqdGFibGUsCisJCQkJCQl1bnNpZ25lZCBpbnQgaWQpCit7CisJY29uc3QgYWM5N19jb2RlY19pZF90ICpwaWQ7CisKKwlmb3IgKHBpZCA9IHRhYmxlOyBwaWQtPmlkOyBwaWQrKykKKwkJaWYgKHBpZC0+aWQgPT0gKGlkICYgcGlkLT5tYXNrKSkKKwkJCXJldHVybiBwaWQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc25kX2FjOTdfZ2V0X25hbWUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBpbnQgaWQsIGNoYXIgKm5hbWUsIGludCBtb2RlbSkKK3sKKwljb25zdCBhYzk3X2NvZGVjX2lkX3QgKnBpZDsKKworCXNwcmludGYobmFtZSwgIjB4JXggJWMlYyVjIiwgaWQsCisJCXByaW50YWJsZShpZCA+PiAyNCksCisJCXByaW50YWJsZShpZCA+PiAxNiksCisJCXByaW50YWJsZShpZCA+PiA4KSk7CisJcGlkID0gbG9va19mb3JfY29kZWNfaWQoc25kX2FjOTdfY29kZWNfaWRfdmVuZG9ycywgaWQpOworCWlmICghIHBpZCkKKwkJcmV0dXJuOworCisJc3RyY3B5KG5hbWUsIHBpZC0+bmFtZSk7CisJaWYgKGFjOTcgJiYgcGlkLT5wYXRjaCkgeworCQlpZiAoKG1vZGVtICYmIChwaWQtPmZsYWdzICYgQUM5N19NT0RFTV9QQVRDSCkpIHx8CisJCSAgICAoISBtb2RlbSAmJiAhIChwaWQtPmZsYWdzICYgQUM5N19NT0RFTV9QQVRDSCkpKQorCQkJcGlkLT5wYXRjaChhYzk3KTsKKwl9IAorCisJcGlkID0gbG9va19mb3JfY29kZWNfaWQoc25kX2FjOTdfY29kZWNfaWRzLCBpZCk7CisJaWYgKHBpZCkgeworCQlzdHJjYXQobmFtZSwgIiAiKTsKKwkJc3RyY2F0KG5hbWUsIHBpZC0+bmFtZSk7CisJCWlmIChwaWQtPm1hc2sgIT0gMHhmZmZmZmZmZikKKwkJCXNwcmludGYobmFtZSArIHN0cmxlbihuYW1lKSwgIiByZXYgJWQiLCBpZCAmIH5waWQtPm1hc2spOworCQlpZiAoYWM5NyAmJiBwaWQtPnBhdGNoKSB7CisJCQlpZiAoKG1vZGVtICYmIChwaWQtPmZsYWdzICYgQUM5N19NT0RFTV9QQVRDSCkpIHx8CisJCQkgICAgKCEgbW9kZW0gJiYgISAocGlkLT5mbGFncyAmIEFDOTdfTU9ERU1fUEFUQ0gpKSkKKwkJCQlwaWQtPnBhdGNoKGFjOTcpOworCQl9CisJfSBlbHNlCisJCXNwcmludGYobmFtZSArIHN0cmxlbihuYW1lKSwgIiBpZCAleCIsIGlkICYgMHhmZik7Cit9CisKKy8qKgorICogc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUgLSByZXRyaWV2ZSBjb2RlYyBuYW1lCisgKiBAYWM5NzogdGhlIGNvZGVjIGluc3RhbmNlCisgKgorICogUmV0dXJucyB0aGUgc2hvcnQgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgY29kZWMuCisgKi8KK2NvbnN0IGNoYXIgKnNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKGFjOTdfdCAqYWM5NykKK3sKKwljb25zdCBhYzk3X2NvZGVjX2lkX3QgKnBpZDsKKworCWZvciAocGlkID0gc25kX2FjOTdfY29kZWNfaWRzOyBwaWQtPmlkOyBwaWQrKykKKwkJaWYgKHBpZC0+aWQgPT0gKGFjOTctPmlkICYgcGlkLT5tYXNrKSkKKwkJCXJldHVybiBwaWQtPm5hbWU7CisJcmV0dXJuICJ1bmtub3duIGNvZGVjIjsKK30KKworCisvKiB3YWl0IGZvciBhIHdoaWxlIHVudGlsIHJlZ2lzdGVycyBhcmUgYWNjZXNzaWJsZSBhZnRlciBSRVNFVAorICogcmV0dXJuIDAgaWYgb2ssIG5lZ2F0aXZlIG5vdCByZWFkeQorICovCitzdGF0aWMgaW50IGFjOTdfcmVzZXRfd2FpdChhYzk3X3QgKmFjOTcsIGludCB0aW1lb3V0LCBpbnQgd2l0aF9tb2RlbSkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCWVuZF90aW1lID0gamlmZmllcyArIHRpbWVvdXQ7CisJZG8geworCQkKKwkJLyogdXNlIHByZWxpbWluYXJ5IHJlYWRzIHRvIHNldHRsZSB0aGUgY29tbXVuaWNhdGlvbiAqLworCQlzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfUkVTRVQpOworCQlzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMSk7CisJCXNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19WRU5ET1JfSUQyKTsKKwkJLyogbW9kZW0/ICovCisJCWlmICh3aXRoX21vZGVtKSB7CisJCQl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTUlEKTsKKwkJCWlmICh2YWwgIT0gMHhmZmZmICYmICh2YWwgJiAxKSAhPSAwKQorCQkJCXJldHVybiAwOworCQl9CisJCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SKSB7CisJCQkvKiBwcm9iYWJseSBvbmx5IFhib3ggaXNzdWUgLSBhbGwgcmVnaXN0ZXJzIGFyZSByZWFkIGFzIHplcm8gKi8KKwkJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19WRU5ET1JfSUQxKTsKKwkJCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMHhmZmZmKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyogYmVjYXVzZSB0aGUgUENNIG9yIE1BU1RFUiB2b2x1bWUgcmVnaXN0ZXJzIGNhbiBiZSBtb2RpZmllZCwKKwkJCSAqIHRoZSBSRUNfR0FJTiByZWdpc3RlciBpcyB1c2VkIGZvciB0ZXN0cworCQkJICovCisJCQkvKiB0ZXN0IGlmIHdlIGNhbiB3cml0ZSB0byB0aGUgcmVjb3JkIGdhaW4gdm9sdW1lIHJlZ2lzdGVyICovCisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1JFQ19HQUlOLCAweDhhMDUpOworCQkJaWYgKChzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfUkVDX0dBSU4pICYgMHg3ZmZmKSA9PSAweDBhMDUpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqCisgKiBzbmRfYWM5N19idXMgLSBjcmVhdGUgYW4gQUM5NyBidXMgY29tcG9uZW50CisgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKKyAqIEBudW06IHRoZSBidXMgbnVtYmVyCisgKiBAb3BzOiB0aGUgYnVzIGNhbGxiYWNrcyB0YWJsZQorICogQHByaXZhdGVfZGF0YTogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm9yIHRoZSBuZXcgaW5zdGFuY2UKKyAqIEByYnVzOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgbmV3IEFDOTcgYnVzIGluc3RhbmNlLgorICoKKyAqIENyZWF0ZXMgYW4gQUM5NyBidXMgY29tcG9uZW50LiAgQW4gYWM5N19idXNfdCBpbnN0YW5jZSBpcyBuZXdseQorICogYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KKyAqCisgKiBUaGUgb3BzIHRhYmxlIG11c3QgaW5jbHVkZSB2YWxpZCBjYWxsYmFja3MgKGF0IGxlYXN0IHJlYWQgYW5kCisgKiB3cml0ZSkuICBUaGUgb3RoZXIgY2FsbGJhY2tzLCB3YWl0IGFuZCByZXNldCwgYXJlIG5vdCBtYW5kYXRvcnkuCisgKiAKKyAqIFRoZSBjbG9jayBpcyBzZXQgdG8gNDgwMDAuICBJZiBhbm90aGVyIGNsb2NrIGlzIG5lZWRlZCwgc2V0CisgKiAoKnJidXMpLT5jbG9jayBtYW51YWxseS4KKyAqCisgKiBUaGUgQUM5NyBidXMgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIGxvdy1sZXZlbCBkZXZpY2UsIHNvIHlvdSBkb24ndAorICogaGF2ZSB0byByZWxlYXNlIGl0IG1hbnVhbGx5LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHNuZF9hYzk3X2J1cyhzbmRfY2FyZF90ICpjYXJkLCBpbnQgbnVtLCBhYzk3X2J1c19vcHNfdCAqb3BzLAorCQkgdm9pZCAqcHJpdmF0ZV9kYXRhLCBhYzk3X2J1c190ICoqcmJ1cykKK3sKKwlpbnQgZXJyOworCWFjOTdfYnVzX3QgKmJ1czsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBkZXZfb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfYWM5N19idXNfZGV2X2ZyZWUsCisJfTsKKworCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydChyYnVzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlidXMgPSBrY2FsbG9jKDEsIHNpemVvZigqYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlidXMtPmNhcmQgPSBjYXJkOworCWJ1cy0+bnVtID0gbnVtOworCWJ1cy0+b3BzID0gb3BzOworCWJ1cy0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCWJ1cy0+Y2xvY2sgPSA0ODAwMDsKKwlzcGluX2xvY2tfaW5pdCgmYnVzLT5idXNfbG9jayk7CisJc25kX2FjOTdfYnVzX3Byb2NfaW5pdChidXMpOworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0JVUywgYnVzLCAmZGV2X29wcykpIDwgMCkgeworCQlzbmRfYWM5N19idXNfZnJlZShidXMpOworCQlyZXR1cm4gZXJyOworCX0KKwkqcmJ1cyA9IGJ1czsKKwlyZXR1cm4gMDsKK30KKworLyogYnVpbGRfb3BzIHRvIGRvIG5vdGhpbmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIG51bGxfYnVpbGRfb3BzOworCisvKioKKyAqIHNuZF9hYzk3X21peGVyIC0gY3JlYXRlIGFuIENvZGVjOTcgY29tcG9uZW50CisgKiBAYnVzOiB0aGUgQUM5NyBidXMgd2hpY2ggY29kZWMgaXMgYXR0YWNoZWQgdG8KKyAqIEB0ZW1wbGF0ZTogdGhlIHRlbXBsYXRlIG9mIGFjOTcsIGluY2x1ZGluZyBpbmRleCwgY2FsbGJhY2tzIGFuZAorICogICAgICAgICB0aGUgcHJpdmF0ZSBkYXRhLgorICogQHJhYzk3OiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgbmV3IGFjOTcgaW5zdGFuY2UuCisgKgorICogQ3JlYXRlcyBhbiBDb2RlYzk3IGNvbXBvbmVudC4gIEFuIGFjOTdfdCBpbnN0YW5jZSBpcyBuZXdseQorICogYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gIFRoZSBjb2RlYworICogaXMgdGhlbiBpbml0aWFsaXplZCBieSB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlLgorICoKKyAqIFRoZSB0ZW1wbGF0ZSBtdXN0IGluY2x1ZGUgdGhlIGNvZGVjIG51bWJlciAobnVtKSBhbmQgYWRkcmVzcyAoYWRkciksCisgKiBhbmQgdGhlIHByaXZhdGUgZGF0YSAocHJpdmF0ZV9kYXRhKS4KKyAqIAorICogVGhlIGFjOTcgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIGxvdy1sZXZlbCBkZXZpY2UsIHNvIHlvdSBkb24ndAorICogaGF2ZSB0byByZWxlYXNlIGl0IG1hbnVhbGx5LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHNuZF9hYzk3X21peGVyKGFjOTdfYnVzX3QgKmJ1cywgYWM5N190ZW1wbGF0ZV90ICp0ZW1wbGF0ZSwgYWM5N190ICoqcmFjOTcpCit7CisJaW50IGVycjsKKwlhYzk3X3QgKmFjOTc7CisJc25kX2NhcmRfdCAqY2FyZDsKKwljaGFyIG5hbWVbNjRdOworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgaW50IHJlZzsKKwljb25zdCBhYzk3X2NvZGVjX2lkX3QgKnBpZDsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF9hYzk3X2Rldl9mcmVlLAorCX07CisKKwlzbmRfYXNzZXJ0KHJhYzk3ICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwkqcmFjOTcgPSBOVUxMOworCXNuZF9hc3NlcnQoYnVzICE9IE5VTEwgJiYgdGVtcGxhdGUgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQodGVtcGxhdGUtPm51bSA8IDQgJiYgYnVzLT5jb2RlY1t0ZW1wbGF0ZS0+bnVtXSA9PSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwlzbmRfYXNzZXJ0KGJ1cy0+c2hhcmVkX3R5cGUgPD0gQUM5N19TSEFSRURfVFlQRVMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoYnVzLT5zaGFyZWRfdHlwZSkgeworCQkvKiBhbHJlYWR5IHNoYXJlZD8gKi8KKwkJZG93bigmc2hhcmVkX2NvZGVjX211dGV4KTsKKwkJYWM5NyA9IHNoYXJlZF9jb2RlY1tidXMtPnNoYXJlZF90eXBlLTFdW3RlbXBsYXRlLT5udW1dOworCQlpZiAoYWM5NykgeworCQkJaWYgKChhYzk3X2lzX2F1ZGlvKGFjOTcpICYmICh0ZW1wbGF0ZS0+c2NhcHMgJiBBQzk3X1NDQVBfU0tJUF9BVURJTykpIHx8CisJCQkgICAgKGFjOTdfaXNfbW9kZW0oYWM5NykgJiYgKHRlbXBsYXRlLT5zY2FwcyAmIEFDOTdfU0NBUF9TS0lQX01PREVNKSkpIHsKKwkJCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4KTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsgLyogc2tpcCB0aGlzICovCisJCQl9CisJCX0KKwkJdXAoJnNoYXJlZF9jb2RlY19tdXRleCk7CisJfQorCisJY2FyZCA9IGJ1cy0+Y2FyZDsKKwlhYzk3ID0ga2NhbGxvYygxLCBzaXplb2YoKmFjOTcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWM5NyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhYzk3LT5wcml2YXRlX2RhdGEgPSB0ZW1wbGF0ZS0+cHJpdmF0ZV9kYXRhOworCWFjOTctPnByaXZhdGVfZnJlZSA9IHRlbXBsYXRlLT5wcml2YXRlX2ZyZWU7CisJYWM5Ny0+YnVzID0gYnVzOworCWFjOTctPnBjaSA9IHRlbXBsYXRlLT5wY2k7CisJYWM5Ny0+bnVtID0gdGVtcGxhdGUtPm51bTsKKwlhYzk3LT5hZGRyID0gdGVtcGxhdGUtPmFkZHI7CisJYWM5Ny0+c2NhcHMgPSB0ZW1wbGF0ZS0+c2NhcHM7CisJYWM5Ny0+bGltaXRlZF9yZWdzID0gdGVtcGxhdGUtPmxpbWl0ZWRfcmVnczsKKwltZW1jcHkoYWM5Ny0+cmVnX2FjY2Vzc2VkLCB0ZW1wbGF0ZS0+cmVnX2FjY2Vzc2VkLCBzaXplb2YoYWM5Ny0+cmVnX2FjY2Vzc2VkKSk7CisJYnVzLT5jb2RlY1thYzk3LT5udW1dID0gYWM5NzsKKwlpbml0X01VVEVYKCZhYzk3LT5yZWdfbXV0ZXgpOworCWluaXRfTVVURVgoJmFjOTctPnBhZ2VfbXV0ZXgpOworCisJaWYgKGFjOTctPnBjaSkgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChhYzk3LT5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmYWM5Ny0+c3Vic3lzdGVtX3ZlbmRvcik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFjOTctPnBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJmFjOTctPnN1YnN5c3RlbV9kZXZpY2UpOworCX0KKwlpZiAoYnVzLT5vcHMtPnJlc2V0KSB7CisJCWJ1cy0+b3BzLT5yZXNldChhYzk3KTsKKwkJZ290byBfX2FjY2Vzc19vazsKKwl9CisKKwlhYzk3LT5pZCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19WRU5ET1JfSUQxKSA8PCAxNjsKKwlhYzk3LT5pZCB8PSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMik7CisJaWYgKGFjOTctPmlkICYmIGFjOTctPmlkICE9ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJcGlkID0gbG9va19mb3JfY29kZWNfaWQoc25kX2FjOTdfY29kZWNfaWRzLCBhYzk3LT5pZCk7CisJCWlmIChwaWQgJiYgKHBpZC0+ZmxhZ3MgJiBBQzk3X0RFRkFVTFRfUE9XRVJfT0ZGKSkKKwkJCWdvdG8gX19hY2Nlc3Nfb2s7CisJfQorCisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19SRVNFVCwgMCk7CS8qIHJlc2V0IHRvIGRlZmF1bHRzICovCisJaWYgKGJ1cy0+b3BzLT53YWl0KQorCQlidXMtPm9wcy0+d2FpdChhYzk3KTsKKwllbHNlIHsKKwkJdWRlbGF5KDUwKTsKKwkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NLSVBfQVVESU8pCisJCQllcnIgPSBhYzk3X3Jlc2V0X3dhaXQoYWM5NywgSFovMiwgMSk7CisJCWVsc2UgeworCQkJZXJyID0gYWM5N19yZXNldF93YWl0KGFjOTcsIEhaLzIsIDApOworCQkJaWYgKGVyciA8IDApCisJCQkJZXJyID0gYWM5N19yZXNldF93YWl0KGFjOTcsIEhaLzIsIDEpOworCQl9CisJCWlmIChlcnIgPCAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiQUMnOTcgJWQgZG9lcyBub3QgcmVzcG9uZCAtIFJFU0VUXG4iLCBhYzk3LT5udW0pOworCQkJLyogcHJvY2VlZCBhbnl3YXkgLSBpdCdzIG9mdGVuIG5vbi1jcml0aWNhbCAqLworCQl9CisJfQorICAgICAgX19hY2Nlc3Nfb2s6CisJYWM5Ny0+aWQgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMSkgPDwgMTY7CisJYWM5Ny0+aWQgfD0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDIpOworCWlmICghIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SKSAmJgorCSAgICAoYWM5Ny0+aWQgPT0gMHgwMDAwMDAwMCB8fCBhYzk3LT5pZCA9PSAweGZmZmZmZmZmKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyAlZCBhY2Nlc3MgaXMgbm90IHZhbGlkIFsweCV4XSwgcmVtb3ZpbmcgbWl4ZXIuXG4iLCBhYzk3LT5udW0sIGFjOTctPmlkKTsKKwkJc25kX2FjOTdfZnJlZShhYzk3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBpZCA9IGxvb2tfZm9yX2NvZGVjX2lkKHNuZF9hYzk3X2NvZGVjX2lkcywgYWM5Ny0+aWQpOworCWlmIChwaWQpCisJCWFjOTctPmZsYWdzIHw9IHBpZC0+ZmxhZ3M7CisJCisJLyogdGVzdCBmb3IgQUMnOTcgKi8KKwlpZiAoIShhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TS0lQX0FVRElPKSAmJiAhKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0FVRElPKSkgeworCQkvKiB0ZXN0IGlmIHdlIGNhbiB3cml0ZSB0byB0aGUgcmVjb3JkIGdhaW4gdm9sdW1lIHJlZ2lzdGVyICovCisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUkVDX0dBSU4sIDB4OGEwNik7CisJCWlmICgoKGVyciA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19SRUNfR0FJTikpICYgMHg3ZmZmKSA9PSAweDBhMDYpCisJCQlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfQVVESU87CisJfQorCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9BVURJTykgeworCQlhYzk3LT5jYXBzID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1JFU0VUKTsKKwkJYWM5Ny0+ZXh0X2lkID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX0lEKTsKKwkJaWYgKGFjOTctPmV4dF9pZCA9PSAweGZmZmYpCS8qIGludmFsaWQgY29tYmluYXRpb24gKi8KKwkJCWFjOTctPmV4dF9pZCA9IDA7CisJfQorCisJLyogdGVzdCBmb3IgTUMnOTcgKi8KKwlpZiAoIShhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TS0lQX01PREVNKSAmJiAhKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX01PREVNKSkgeworCQlhYzk3LT5leHRfbWlkID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX01JRCk7CisJCWlmIChhYzk3LT5leHRfbWlkID09IDB4ZmZmZikJLyogaW52YWxpZCBjb21iaW5hdGlvbiAqLworCQkJYWM5Ny0+ZXh0X21pZCA9IDA7CisJCWlmIChhYzk3LT5leHRfbWlkICYgMSkKKwkJCWFjOTctPnNjYXBzIHw9IEFDOTdfU0NBUF9NT0RFTTsKKwl9CisKKwlpZiAoIWFjOTdfaXNfYXVkaW8oYWM5NykgJiYgIWFjOTdfaXNfbW9kZW0oYWM5NykpIHsKKwkJaWYgKCEoYWM5Ny0+c2NhcHMgJiAoQUM5N19TQ0FQX1NLSVBfQVVESU98QUM5N19TQ0FQX1NLSVBfTU9ERU0pKSkKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3ICVkIGFjY2VzcyBlcnJvciAobm90IGF1ZGlvIG9yIG1vZGVtIGNvZGVjKVxuIiwgYWM5Ny0+bnVtKTsKKwkJc25kX2FjOTdfZnJlZShhYzk3KTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJaWYgKGJ1cy0+b3BzLT5yZXNldCkgLy8gRklYTUU6IGFsd2F5cyBza2lwcGluZz8KKwkJZ290byBfX3JlYWR5X29rOworCisJLyogRklYTUU6IGFkZCBwb3dlcmRvd24gY29udHJvbCAqLworCWlmIChhYzk3X2lzX2F1ZGlvKGFjOTcpKSB7CisJCS8qIG5vdGhpbmcgc2hvdWxkIGJlIGluIHBvd2VyZG93biBtb2RlICovCisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCAwKTsKKwkJaWYgKCEgKGFjOTctPmZsYWdzICYgQUM5N19ERUZBVUxUX1BPV0VSX09GRikpIHsKKwkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUkVTRVQsIDApOyAvKiByZXNldCB0byBkZWZhdWx0cyAqLworCQkJdWRlbGF5KDEwMCk7CisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwgMCk7CisJCX0KKwkJLyogbm90aGluZyBzaG91bGQgYmUgaW4gcG93ZXJkb3duIG1vZGUgKi8KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDApOworCQllbmRfdGltZSA9IGppZmZpZXMgKyAoSFogLyAxMCk7CisJCWRvIHsKKwkJCWlmICgoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1BPV0VSRE9XTikgJiAweDBmKSA9PSAweDBmKQorCQkJCWdvdG8gX19yZWFkeV9vazsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkFDJzk3ICVkIGFuYWxvZyBzdWJzZWN0aW9ucyBub3QgcmVhZHlcbiIsIGFjOTctPm51bSk7CisJfQorCisJLyogRklYTUU6IGFkZCBwb3dlcmRvd24gY29udHJvbCAqLworCWlmIChhYzk3X2lzX21vZGVtKGFjOTcpKSB7CisJCXVuc2lnbmVkIGNoYXIgdG1wOworCisJCS8qIG5vdGhpbmcgc2hvdWxkIGJlIGluIHBvd2VyZG93biBtb2RlICovCisJCS8qIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIHNldCB0aGUgcmF0ZSBhdCBmaXJzdCAqLworCQl0bXAgPSBBQzk3X01FQV9HUElPOworCQlpZiAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0xJTkUxKSB7CisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0xJTkUxX1JBVEUsIDEyMDAwKTsKKwkJCXRtcCB8PSBBQzk3X01FQV9BREMxIHwgQUM5N19NRUFfREFDMTsKKwkJfQorCQlpZiAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0xJTkUyKSB7CisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0xJTkUyX1JBVEUsIDEyMDAwKTsKKwkJCXRtcCB8PSBBQzk3X01FQV9BREMyIHwgQUM5N19NRUFfREFDMjsKKwkJfQorCQlpZiAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0hBTkRTRVQpIHsKKwkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfSEFORFNFVF9SQVRFLCAxMjAwMCk7CisJCQl0bXAgfD0gQUM5N19NRUFfSEFEQyB8IEFDOTdfTUVBX0hEQUM7CisJCX0KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTLCAweGZmMDAgJiB+KHRtcCA8PCA4KSk7CisJCXVkZWxheSgxMDApOworCQkvKiBub3RoaW5nIHNob3VsZCBiZSBpbiBwb3dlcmRvd24gbW9kZSAqLworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDB4ZmYwMCAmIH4odG1wIDw8IDgpKTsKKwkJZW5kX3RpbWUgPSBqaWZmaWVzICsgKEhaIC8gMTApOworCQlkbyB7CisJCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTKSAmIHRtcCkgPT0gdG1wKQorCQkJCWdvdG8gX19yZWFkeV9vazsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIk1DJzk3ICVkIGNvbnZlcnRlcnMgYW5kIEdQSU8gbm90IHJlYWR5ICgweCV4KVxuIiwgYWM5Ny0+bnVtLCBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTVNUQVRVUykpOworCX0KKwkKKyAgICAgIF9fcmVhZHlfb2s6CisJaWYgKGFjOTdfaXNfYXVkaW8oYWM5NykpCisJCWFjOTctPmFkZHIgPSAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9BRERSX01BU0spID4+IEFDOTdfRUlfQUREUl9TSElGVDsKKwllbHNlCisJCWFjOTctPmFkZHIgPSAoYWM5Ny0+ZXh0X21pZCAmIEFDOTdfTUVJX0FERFJfTUFTSykgPj4gQUM5N19NRUlfQUREUl9TSElGVDsKKwlpZiAoYWM5Ny0+ZXh0X2lkICYgMHgwMWM5KSB7CS8qIEwvUiwgTUlDLCBTREFDLCBMREFDIFZSQSBzdXBwb3J0ICovCisJCXJlZyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQlyZWcgfD0gYWM5Ny0+ZXh0X2lkICYgMHgwMWMwOyAvKiBMREFDL1NEQUMvQ0RBQyAqLworCQlpZiAoISBidXMtPm5vX3ZyYSkKKwkJCXJlZyB8PSBhYzk3LT5leHRfaWQgJiAweDAwMDk7IC8qIFZSQS9WUk0gKi8KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHJlZyk7CisJfQorCWlmICgoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9EUkEpICYmIGJ1cy0+ZHJhKSB7CisJCS8qIEludGVsIGNvbnRyb2xsZXJzIHJlcXVpcmUgZG91YmxlIHJhdGUgZGF0YSB0byBiZSBwdXQgaW4KKwkJICogc2xvdHMgNys4LCBzbyBsZXQncyBob3BlIHRoZSBjb2RlYyBzdXBwb3J0cyBpdC4gKi8KKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIEFDOTdfR1BfRFJTU19NQVNLLCBBQzk3X0dQX0RSU1NfNzgpOworCQlpZiAoKHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UpICYgQUM5N19HUF9EUlNTX01BU0spID09IEFDOTdfR1BfRFJTU183OCkKKwkJCWFjOTctPmZsYWdzIHw9IEFDOTdfRE9VQkxFX1JBVEU7CisJfQorCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1ZSQSkgewkvKiBWUkEgc3VwcG9ydCAqLworCQlzbmRfYWM5N19kZXRlcm1pbmVfcmF0ZXMoYWM5NywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsIDAsICZhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX0ZST05UX0RBQ10pOworCQlzbmRfYWM5N19kZXRlcm1pbmVfcmF0ZXMoYWM5NywgQUM5N19QQ01fTFJfQURDX1JBVEUsIDAsICZhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX0FEQ10pOworCX0gZWxzZSB7CisJCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfRlJPTlRfREFDXSA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOworCQlpZiAoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0RPVUJMRV9SQVRFKQorCQkJYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19GUk9OVF9EQUNdIHw9IFNORFJWX1BDTV9SQVRFXzk2MDAwOworCQlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX0FEQ10gPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwl9CisJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpIHsKKwkJLyogY29kZWMgc3BlY2lmaWMgY29kZSAocGF0Y2gpIHNob3VsZCBvdmVycmlkZSB0aGVzZSB2YWx1ZXMgKi8KKwkJYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19TUERJRl0gPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfMzIwMDA7CisJfQorCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1ZSTSkgewkvKiBNSUMgVlJBIHN1cHBvcnQgKi8KKwkJc25kX2FjOTdfZGV0ZXJtaW5lX3JhdGVzKGFjOTcsIEFDOTdfUENNX01JQ19BRENfUkFURSwgMCwgJmFjOTctPnJhdGVzW0FDOTdfUkFURVNfTUlDX0FEQ10pOworCX0gZWxzZSB7CisJCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfTUlDX0FEQ10gPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwl9CisJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU0RBQykgewkvKiBTREFDIHN1cHBvcnQgKi8KKwkJc25kX2FjOTdfZGV0ZXJtaW5lX3JhdGVzKGFjOTcsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCAmYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19TVVJSX0RBQ10pOworCQlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfU1VSUk9VTkRfREFDOworCX0KKwlpZiAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9MREFDKSB7CS8qIExEQUMgc3VwcG9ydCAqLworCQlzbmRfYWM5N19kZXRlcm1pbmVfcmF0ZXMoYWM5NywgQUM5N19QQ01fTEZFX0RBQ19SQVRFLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgJmFjOTctPnJhdGVzW0FDOTdfUkFURVNfTEZFX0RBQ10pOworCQlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUM7CisJfQorCS8qIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb25zICovCisJaWYgKGJ1cy0+b3BzLT5pbml0KQorCQlidXMtPm9wcy0+aW5pdChhYzk3KTsKKwlzbmRfYWM5N19nZXRfbmFtZShhYzk3LCBhYzk3LT5pZCwgbmFtZSwgIWFjOTdfaXNfYXVkaW8oYWM5NykpOworCXNuZF9hYzk3X2dldF9uYW1lKE5VTEwsIGFjOTctPmlkLCBuYW1lLCAhYWM5N19pc19hdWRpbyhhYzk3KSk7ICAvLyBhYzk3LT5pZCBtaWdodCBiZSBjaGFuZ2VkIGluIHRoZSBzcGVjaWFsIHNldHVwIGNvZGUKKwlpZiAoISBhYzk3LT5idWlsZF9vcHMpCisJCWFjOTctPmJ1aWxkX29wcyA9ICZudWxsX2J1aWxkX29wczsKKworCWlmIChhYzk3X2lzX2F1ZGlvKGFjOTcpKSB7CisJCWNoYXIgY29tcFsxNl07CisJCWlmIChjYXJkLT5taXhlcm5hbWVbMF0gPT0gJ1wwJykgeworCQkJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RybGVuKGNhcmQtPm1peGVybmFtZSkgKyAxICsgc3RybGVuKG5hbWUpICsgMSA8PSBzaXplb2YoY2FyZC0+bWl4ZXJuYW1lKSkgeworCQkJCXN0cmNhdChjYXJkLT5taXhlcm5hbWUsICIsIik7CisJCQkJc3RyY2F0KGNhcmQtPm1peGVybmFtZSwgbmFtZSk7CisJCQl9CisJCX0KKwkJc3ByaW50Zihjb21wLCAiQUM5N2E6JTA4eCIsIGFjOTctPmlkKTsKKwkJaWYgKChlcnIgPSBzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21wKSkgPCAwKSB7CisJCQlzbmRfYWM5N19mcmVlKGFjOTcpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoc25kX2FjOTdfbWl4ZXJfYnVpbGQoYWM5NykgPCAwKSB7CisJCQlzbmRfYWM5N19mcmVlKGFjOTcpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWYgKGFjOTdfaXNfbW9kZW0oYWM5NykpIHsKKwkJY2hhciBjb21wWzE2XTsKKwkJaWYgKGNhcmQtPm1peGVybmFtZVswXSA9PSAnXDAnKSB7CisJCQlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCBuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJsZW4oY2FyZC0+bWl4ZXJuYW1lKSArIDEgKyBzdHJsZW4obmFtZSkgKyAxIDw9IHNpemVvZihjYXJkLT5taXhlcm5hbWUpKSB7CisJCQkJc3RyY2F0KGNhcmQtPm1peGVybmFtZSwgIiwiKTsKKwkJCQlzdHJjYXQoY2FyZC0+bWl4ZXJuYW1lLCBuYW1lKTsKKwkJCX0KKwkJfQorCQlzcHJpbnRmKGNvbXAsICJBQzk3bTolMDh4IiwgYWM5Ny0+aWQpOworCQlpZiAoKGVyciA9IHNuZF9jb21wb25lbnRfYWRkKGNhcmQsIGNvbXApKSA8IDApIHsKKwkJCXNuZF9hYzk3X2ZyZWUoYWM5Nyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChzbmRfYWM5N19tb2RlbV9idWlsZChjYXJkLCBhYzk3KSA8IDApIHsKKwkJCXNuZF9hYzk3X2ZyZWUoYWM5Nyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwkvKiBtYWtlIHN1cmUgdGhlIHByb3BlciBwb3dlcmRvd24gYml0cyBhcmUgY2xlYXJlZCAqLworCWlmIChhYzk3LT5zY2FwcykgeworCQlyZWcgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NVUlJPVU5EX0RBQykgCisJCQlyZWcgJj0gfkFDOTdfRUFfUFJKOworCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUMpIAorCQkJcmVnICY9IH4oQUM5N19FQV9QUkkgfCBBQzk3X0VBX1BSSyk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTLCByZWcpOworCX0KKwlzbmRfYWM5N19wcm9jX2luaXQoYWM5Nyk7CisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQ09ERUMsIGFjOTcsICZvcHMpKSA8IDApIHsKKwkJc25kX2FjOTdfZnJlZShhYzk3KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJKnJhYzk3ID0gYWM5NzsKKworCWlmIChidXMtPnNoYXJlZF90eXBlKSB7CisJCWRvd24oJnNoYXJlZF9jb2RlY19tdXRleCk7CisJCXNoYXJlZF9jb2RlY1tidXMtPnNoYXJlZF90eXBlLTFdW2FjOTctPm51bV0gPSBhYzk3OworCQl1cCgmc2hhcmVkX2NvZGVjX211dGV4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUG93ZXIgZG93biB0aGUgY2hpcC4KKyAqCisgKiBNQVNURVIgYW5kIEhFQURQSE9ORSByZWdpc3RlcnMgYXJlIG11dGVkIGJ1dCB0aGUgcmVnaXN0ZXIgY2FjaGUgdmFsdWVzCisgKiBhcmUgbm90IGNoYW5nZWQsIHNvIHRoYXQgdGhlIHZhbHVlcyBjYW4gYmUgcmVzdG9yZWQgaW4gc25kX2FjOTdfcmVzdW1lKCkuCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9hYzk3X3Bvd2VyZG93bihhYzk3X3QgKmFjOTcpCit7CisJdW5zaWduZWQgc2hvcnQgcG93ZXI7CisKKwlpZiAoYWM5N19pc19hdWRpbyhhYzk3KSkgeworCQkvKiBzb21lIGNvZGVjcyBoYXZlIHN0ZXJlbyBtdXRlIGJpdHMgKi8KKwkJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19NQVNURVIsIDB4OWY5Zik7CisJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfSEVBRFBIT05FLCAweDlmOWYpOworCX0KKworCXBvd2VyID0gYWM5Ny0+cmVnc1tBQzk3X1BPV0VSRE9XTl0gfCAweDgwMDA7CS8qIEVBUEQgKi8KKwlwb3dlciB8PSAweDQwMDA7CS8qIEhlYWRwaG9uZSBhbXBsaWZpZXIgcG93ZXJkb3duICovCisJcG93ZXIgfD0gMHgwMzAwOwkvKiBBREMgJiBEQUMgcG93ZXJkb3duICovCisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIHBvd2VyKTsKKwl1ZGVsYXkoMTAwKTsKKwlwb3dlciB8PSAweDA0MDA7CS8qIEFuYWxvZyBNaXhlciBwb3dlcmRvd24gKFZyZWYgb24pICovCisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIHBvd2VyKTsKKwl1ZGVsYXkoMTAwKTsKKyNpZiAwCisJLyogRklYTUU6IHRoaXMgY2F1c2VzIGNsaWNrIG5vaXNlcyBvbiBzb21lIGJvYXJkcyBhdCByZXN1bWUgKi8KKwlwb3dlciB8PSAweDM4MDA7CS8qIEFDLWxpbmsgcG93ZXJkb3duLCBpbnRlcm5hbCBDbGsgZGlzYWJsZSAqLworCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCBwb3dlcik7CisjZW5kaWYKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisvKioKKyAqIHNuZF9hYzk3X3N1c3BlbmQgLSBHZW5lcmFsIHN1c3BlbmQgZnVuY3Rpb24gZm9yIEFDOTcgY29kZWMKKyAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQorICoKKyAqIFN1c3BlbmRzIHRoZSBjb2RlYywgcG93ZXIgZG93biB0aGUgY2hpcC4KKyAqLwordm9pZCBzbmRfYWM5N19zdXNwZW5kKGFjOTdfdCAqYWM5NykKK3sKKwlpZiAoYWM5Ny0+YnVpbGRfb3BzLT5zdXNwZW5kKQorCQlhYzk3LT5idWlsZF9vcHMtPnN1c3BlbmQoYWM5Nyk7CisJc25kX2FjOTdfcG93ZXJkb3duKGFjOTcpOworfQorCisvKgorICogcmVzdG9yZSBhYzk3IHN0YXR1cworICovCit2b2lkIHNuZF9hYzk3X3Jlc3RvcmVfc3RhdHVzKGFjOTdfdCAqYWM5NykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDI7IGkgPCAweDdjIDsgaSArPSAyKSB7CisJCWlmIChpID09IEFDOTdfUE9XRVJET1dOIHx8IGkgPT0gQUM5N19FWFRFTkRFRF9JRCkKKwkJCWNvbnRpbnVlOworCQkvKiByZXN0b3JlIG9ubHkgYWNjZXNzaWJsZSByZWdpc3RlcnMKKwkJICogc29tZSBjaGlwIChlLmcuIG5tMjU2KSBtYXkgaGFuZyB1cCB3aGVuIHVuc3VwcG9ydGVkIHJlZ2lzdGVycworCQkgKiBhcmUgYWNjZXNzZWQuLiEKKwkJICovCisJCWlmICh0ZXN0X2JpdChpLCBhYzk3LT5yZWdfYWNjZXNzZWQpKSB7CisJCQlzbmRfYWM5N193cml0ZShhYzk3LCBpLCBhYzk3LT5yZWdzW2ldKTsKKwkJCXNuZF9hYzk3X3JlYWQoYWM5NywgaSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiByZXN0b3JlIElFQzk1OCBzdGF0dXMKKyAqLwordm9pZCBzbmRfYWM5N19yZXN0b3JlX2llYzk1OChhYzk3X3QgKmFjOTcpCit7CisJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpIHsKKwkJaWYgKGFjOTctPnJlZ3NbQUM5N19FWFRFTkRFRF9TVEFUVVNdICYgQUM5N19FQV9TUERJRikgeworCQkJLyogcmVzZXQgc3BkaWYgc3RhdHVzICovCisJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgMCk7CisJCQlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgYWM5Ny0+cmVnc1tBQzk3X0VYVEVOREVEX1NUQVRVU10pOworCQkJaWYgKGFjOTctPmZsYWdzICYgQUM5N19DU19TUERJRikKKwkJCQlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0NTUl9TUERJRiwgYWM5Ny0+cmVnc1tBQzk3X0NTUl9TUERJRl0pOworCQkJZWxzZQorCQkJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfU1BESUYsIGFjOTctPnJlZ3NbQUM5N19TUERJRl0pOworCQkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIEFDOTdfRUFfU1BESUYpOyAvKiB0dXJuIG9uIGFnYWluICovCisJCX0KKwl9Cit9CisKKy8qKgorICogc25kX2FjOTdfcmVzdW1lIC0gR2VuZXJhbCByZXN1bWUgZnVuY3Rpb24gZm9yIEFDOTcgY29kZWMKKyAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQorICoKKyAqIERvIHRoZSBzdGFuZGFyZCByZXN1bWUgcHJvY2VkdXJlLCBwb3dlciB1cCBhbmQgcmVzdG9yaW5nIHRoZQorICogb2xkIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLwordm9pZCBzbmRfYWM5N19yZXN1bWUoYWM5N190ICphYzk3KQoreworCWludCBpOworCisJaWYgKGFjOTctPmJ1cy0+b3BzLT5yZXNldCkgeworCQlhYzk3LT5idXMtPm9wcy0+cmVzZXQoYWM5Nyk7CisJCWdvdG8gIF9fcmVzZXRfcmVhZHk7CisJfQorCisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIDApOworCWlmICghIChhYzk3LT5mbGFncyAmIEFDOTdfREVGQVVMVF9QT1dFUl9PRkYpKSB7CisJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfUkVTRVQsIDApOworCQl1ZGVsYXkoMTAwKTsKKwkJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIDApOworCX0KKwlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMCk7CisKKwlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwgYWM5Ny0+cmVnc1tBQzk3X1BPV0VSRE9XTl0pOworCWlmIChhYzk3X2lzX2F1ZGlvKGFjOTcpKSB7CisJCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCBBQzk3X01BU1RFUiwgMHg4MTAxKTsKKwkJZm9yIChpID0gSFovMTA7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X01BU1RFUikgPT0gMHg4MTAxKQorCQkJCWJyZWFrOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCQkvKiBGSVhNRTogZXh0cmEgZGVsYXkgKi8KKwkJYWM5Ny0+YnVzLT5vcHMtPndyaXRlKGFjOTcsIEFDOTdfTUFTVEVSLCAweDgwMDApOworCQlpZiAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X01BU1RFUikgIT0gMHg4MDAwKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzQpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gSFovMTA7IGkgPj0gMDsgaS0tKSB7CisJCQl1bnNpZ25lZCBzaG9ydCB2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfTUlEKTsKKwkJCWlmICh2YWwgIT0gMHhmZmZmICYmICh2YWwgJiAxKSAhPSAwKQorCQkJCWJyZWFrOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0KK19fcmVzZXRfcmVhZHk6CisKKwlpZiAoYWM5Ny0+YnVzLT5vcHMtPmluaXQpCisJCWFjOTctPmJ1cy0+b3BzLT5pbml0KGFjOTcpOworCisJaWYgKGFjOTctPmJ1aWxkX29wcy0+cmVzdW1lKQorCQlhYzk3LT5idWlsZF9vcHMtPnJlc3VtZShhYzk3KTsKKwllbHNlIHsKKwkJc25kX2FjOTdfcmVzdG9yZV9zdGF0dXMoYWM5Nyk7CisJCXNuZF9hYzk3X3Jlc3RvcmVfaWVjOTU4KGFjOTcpOworCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBIYXJkd2FyZSB0dW5pbmcKKyAqLworc3RhdGljIHZvaWQgc2V0X2N0bF9uYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJaWYgKHN1ZmZpeCkKKwkJc3ByaW50Zihkc3QsICIlcyAlcyIsIHNyYywgc3VmZml4KTsKKwllbHNlCisJCXN0cmNweShkc3QsIHNyYyk7Cit9CQorCisvKiByZW1vdmUgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgc3VmZml4ICovCitpbnQgc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3X3QgKmFjOTcsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCBpZDsKKwltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwlzZXRfY3RsX25hbWUoaWQubmFtZSwgbmFtZSwgc3VmZml4KTsKKwlpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXJldHVybiBzbmRfY3RsX3JlbW92ZV9pZChhYzk3LT5idXMtPmNhcmQsICZpZCk7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfdCAqY3RsX2ZpbmQoYWM5N190ICphYzk3LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJc25kX2N0bF9lbGVtX2lkX3Qgc2lkOworCW1lbXNldCgmc2lkLCAwLCBzaXplb2Yoc2lkKSk7CisJc2V0X2N0bF9uYW1lKHNpZC5uYW1lLCBuYW1lLCBzdWZmaXgpOworCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXJldHVybiBzbmRfY3RsX2ZpbmRfaWQoYWM5Ny0+YnVzLT5jYXJkLCAmc2lkKTsKK30KKworLyogcmVuYW1lIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIHN1ZmZpeCAqLworaW50IHNuZF9hYzk3X3JlbmFtZV9jdGwoYWM5N190ICphYzk3LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3VmZml4KQoreworCXNuZF9rY29udHJvbF90ICprY3RsID0gY3RsX2ZpbmQoYWM5Nywgc3JjLCBzdWZmaXgpOworCWlmIChrY3RsKSB7CisJCXNldF9jdGxfbmFtZShrY3RsLT5pZC5uYW1lLCBkc3QsIHN1ZmZpeCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyogcmVuYW1lIGJvdGggVm9sdW1lIGFuZCBTd2l0Y2ggY29udHJvbHMgLSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlICovCit2b2lkIHNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKGFjOTdfdCAqYWM5NywgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCit7CisJc25kX2FjOTdfcmVuYW1lX2N0bChhYzk3LCBzcmMsIGRzdCwgIlN3aXRjaCIpOworCXNuZF9hYzk3X3JlbmFtZV9jdGwoYWM5Nywgc3JjLCBkc3QsICJWb2x1bWUiKTsKK30KKworLyogc3dhcCBjb250cm9scyAqLworaW50IHNuZF9hYzk3X3N3YXBfY3RsKGFjOTdfdCAqYWM5NywgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGwxLCAqa2N0bDI7CisJa2N0bDEgPSBjdGxfZmluZChhYzk3LCBzMSwgc3VmZml4KTsKKwlrY3RsMiA9IGN0bF9maW5kKGFjOTcsIHMyLCBzdWZmaXgpOworCWlmIChrY3RsMSAmJiBrY3RsMikgeworCQlzZXRfY3RsX25hbWUoa2N0bDEtPmlkLm5hbWUsIHMyLCBzdWZmaXgpOworCQlzZXRfY3RsX25hbWUoa2N0bDItPmlkLm5hbWUsIHMxLCBzdWZmaXgpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKyNpZiAxCisvKiBiaW5kIGhwIGFuZCBtYXN0ZXIgY29udHJvbHMgaW5zdGVhZCBvZiB1c2luZyBvbmx5IGhwIGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgYmluZF9ocF92b2xzd19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaW50IGVyciA9IHNuZF9hYzk3X3B1dF92b2xzdyhrY29udHJvbCwgdWNvbnRyb2wpOworCWlmIChlcnIgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgcHJpdl9zYXZlZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIH4weGZmKSB8IEFDOTdfSEVBRFBIT05FOworCQlzbmRfYWM5N19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKKwkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBwcml2X3NhdmVkOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBhYzk3IHR1bmU6IGJpbmQgTWFzdGVyIGFuZCBIZWFkcGhvbmUgY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgdHVuZV9ocF9vbmx5KGFjOTdfdCAqYWM5NykKK3sKKwlzbmRfa2NvbnRyb2xfdCAqbXN3ID0gY3RsX2ZpbmQoYWM5NywgIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBOVUxMKTsKKwlzbmRfa2NvbnRyb2xfdCAqbXZvbCA9IGN0bF9maW5kKGFjOTcsICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgTlVMTCk7CisJaWYgKCEgbXN3IHx8ICEgbXZvbCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJbXN3LT5wdXQgPSBiaW5kX2hwX3ZvbHN3X3B1dDsKKwltdm9sLT5wdXQgPSBiaW5kX2hwX3ZvbHN3X3B1dDsKKwlzbmRfYWM5N19yZW1vdmVfY3RsKGFjOTcsICJIZWFkcGhvbmUgUGxheWJhY2siLCAiU3dpdGNoIik7CisJc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIlZvbHVtZSIpOworCXJldHVybiAwOworfQorCisjZWxzZQorLyogYWM5NyB0dW5lOiB1c2UgSGVhZHBob25lIGNvbnRyb2wgYXMgbWFzdGVyICovCitzdGF0aWMgaW50IHR1bmVfaHBfb25seShhYzk3X3QgKmFjOTcpCit7CisJaWYgKGN0bF9maW5kKGFjOTcsICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgTlVMTCkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIiwgIlN3aXRjaCIpOworCXNuZF9hYzk3X3JlbW92ZV9jdGwoYWM5NywgIk1hc3RlciBQbGF5YmFjayIsICJWb2x1bWUiKTsKKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIk1hc3RlciBQbGF5YmFjayIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIGFjOTcgdHVuZTogc3dhcCBIZWFkcGhvbmUgYW5kIE1hc3RlciBjb250cm9scyAqLworc3RhdGljIGludCB0dW5lX3N3YXBfaHAoYWM5N190ICphYzk3KQoreworCWlmIChjdGxfZmluZChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCXNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKGFjOTcsICJNYXN0ZXIgUGxheWJhY2siLCAiTGluZS1PdXQgUGxheWJhY2siKTsKKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIk1hc3RlciBQbGF5YmFjayIpOworCXJldHVybiAwOworfQorCisvKiBhYzk3IHR1bmU6IHN3YXAgU3Vycm91bmQgYW5kIE1hc3RlciBjb250cm9scyAqLworc3RhdGljIGludCB0dW5lX3N3YXBfc3Vycm91bmQoYWM5N190ICphYzk3KQoreworCWlmIChzbmRfYWM5N19zd2FwX2N0bChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIiwgIlN1cnJvdW5kIFBsYXliYWNrIiwgIlN3aXRjaCIpIHx8CisJICAgIHNuZF9hYzk3X3N3YXBfY3RsKGFjOTcsICJNYXN0ZXIgUGxheWJhY2siLCAiU3Vycm91bmQgUGxheWJhY2siLCAiVm9sdW1lIikpCisJCXJldHVybiAtRU5PRU5UOworCXJldHVybiAwOworfQorCisvKiBhYzk3IHR1bmU6IHNldCB1cCBtaWMgc2hhcmluZyBmb3IgQUQgY29kZWNzICovCitzdGF0aWMgaW50IHR1bmVfYWRfc2hhcmluZyhhYzk3X3QgKmFjOTcpCit7CisJdW5zaWduZWQgc2hvcnQgc2NmZzsKKwlpZiAoKGFjOTctPmlkICYgMHhmZmZmZmYwMCkgIT0gMHg0MTQ0NTMwMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3X3F1aXJrIEFEX1NIQVJJTkcgaXMgb25seSBmb3IgQUQgY29kZWNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFR1cm4gb24gT01TIGJpdCB0byByb3V0ZSBtaWNyb3Bob25lIHRvIGJhY2sgcGFuZWwgKi8KKwlzY2ZnID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgc2NmZyB8IDB4MDIwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfYWxjX2phY2tfZGV0ZWN0ID0gCitBQzk3X1NJTkdMRSgiSmFjayBEZXRlY3QiLCBBQzk3X0FMQzY1MF9DTE9DSywgNSwgMSwgMCk7CisKKy8qIGFjOTcgdHVuZTogc2V0IHVwIEFMQyBqYWNrLXNlbGVjdCAqLworc3RhdGljIGludCB0dW5lX2FsY19qYWNrKGFjOTdfdCAqYWM5NykKK3sKKwlpZiAoKGFjOTctPmlkICYgMHhmZmZmZmYwMCkgIT0gMHg0MTRjNDcwMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3X3F1aXJrIEFMQ19KQUNLIGlzIG9ubHkgZm9yIFJlYWx0ZWsgY29kZWNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIDB4N2EsIDB4MjAsIDB4MjApOyAvKiBzZWxlY3QgamFjayBkZXRlY3QgZnVuY3Rpb24gKi8KKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCAweDdhLCAweDAxLCAweDAxKTsgLyogTGluZS1vdXQgYXV0byBtdXRlICovCisJcmV0dXJuIHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfYWxjX2phY2tfZGV0ZWN0LCBhYzk3KSk7Cit9CisKKy8qIGFjOTcgdHVuZTogaW52ZXJzZWQgRUFQRCBiaXQgKi8KK3N0YXRpYyBpbnQgdHVuZV9pbnZfZWFwZChhYzk3X3QgKmFjOTcpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGwgPSBjdGxfZmluZChhYzk3LCAiRXh0ZXJuYWwgQW1wbGlmaWVyIiwgTlVMTCk7CisJaWYgKCEga2N0bCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJc2V0X2ludl9lYXBkKGFjOTcsIGtjdGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hc3Rlcl9tdXRlX3N3X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpbnQgZXJyID0gc25kX2FjOTdfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7CisJaWYgKGVyciA+IDApIHsKKwkJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweDBmOworCQlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJCXVuc2lnbmVkIHNob3J0IG1hc2s7CisJCWlmIChzaGlmdCAhPSByc2hpZnQpCisJCQltYXNrID0gMHg4MDgwOworCQllbHNlCisJCQltYXNrID0gMHg4MDAwOworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X1BPV0VSRE9XTiwgMHg4MDAwLAorCQkJCSAgICAgKGFjOTctPnJlZ3NbQUM5N19NQVNURVJdICYgbWFzaykgPT0gbWFzayA/CisJCQkJICAgICAweDgwMDAgOiAwKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogYWM5NyB0dW5lOiBFQVBEIGNvbnRyb2xzIG11dGUgTEVEIGJvdW5kIHdpdGggdGhlIG1hc3RlciBtdXRlICovCitzdGF0aWMgaW50IHR1bmVfbXV0ZV9sZWQoYWM5N190ICphYzk3KQoreworCXNuZF9rY29udHJvbF90ICptc3cgPSBjdGxfZmluZChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIE5VTEwpOworCWlmICghIG1zdykKKwkJcmV0dXJuIC1FTk9FTlQ7CisJbXN3LT5wdXQgPSBtYXN0ZXJfbXV0ZV9zd19wdXQ7CisJc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3LCAiRXh0ZXJuYWwgQW1wbGlmaWVyIiwgTlVMTCk7CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19QT1dFUkRPV04sIDB4ODAwMCwgMHg4MDAwKTsgLyogbXV0ZSBMRUQgb24gKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHF1aXJrX3RhYmxlIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmZ1bmMpKGFjOTdfdCAqKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVpcmtfdGFibGUgYXBwbGljYWJsZV9xdWlya3NbXSA9IHsKKwl7ICJub25lIiwgTlVMTCB9LAorCXsgImhwX29ubHkiLCB0dW5lX2hwX29ubHkgfSwKKwl7ICJzd2FwX2hwIiwgdHVuZV9zd2FwX2hwIH0sCisJeyAic3dhcF9zdXJyb3VuZCIsIHR1bmVfc3dhcF9zdXJyb3VuZCB9LAorCXsgImFkX3NoYXJpbmciLCB0dW5lX2FkX3NoYXJpbmcgfSwKKwl7ICJhbGNfamFjayIsIHR1bmVfYWxjX2phY2sgfSwKKwl7ICJpbnZfZWFwZCIsIHR1bmVfaW52X2VhcGQgfSwKKwl7ICJtdXRlX2xlZCIsIHR1bmVfbXV0ZV9sZWQgfSwKK307CisKKy8qIGFwcGx5IHRoZSBxdWlyayB3aXRoIHRoZSBnaXZlbiB0eXBlICovCitzdGF0aWMgaW50IGFwcGx5X3F1aXJrKGFjOTdfdCAqYWM5NywgaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPD0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAodHlwZSA+PSBBUlJBWV9TSVpFKGFwcGxpY2FibGVfcXVpcmtzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGFwcGxpY2FibGVfcXVpcmtzW3R5cGVdLmZ1bmMpCisJCXJldHVybiBhcHBsaWNhYmxlX3F1aXJrc1t0eXBlXS5mdW5jKGFjOTcpOworCXJldHVybiAwOworfQorCisvKiBhcHBseSB0aGUgcXVpcmsgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAqLworc3RhdGljIGludCBhcHBseV9xdWlya19zdHIoYWM5N190ICphYzk3LCBjb25zdCBjaGFyICp0eXBlc3RyKQoreworCWludCBpOworCXN0cnVjdCBxdWlya190YWJsZSAqcTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFwcGxpY2FibGVfcXVpcmtzKTsgaSsrKSB7CisJCXEgPSAmYXBwbGljYWJsZV9xdWlya3NbaV07CisJCWlmIChxLT5uYW1lICYmICEgc3RyY21wKHR5cGVzdHIsIHEtPm5hbWUpKQorCQkJcmV0dXJuIGFwcGx5X3F1aXJrKGFjOTcsIGkpOworCX0KKwkvKiBmb3IgY29tcGF0aWJpbGl0eSwgYWNjZXB0IHRoZSBudW1iZXJzLCB0b28gKi8KKwlpZiAoKnR5cGVzdHIgPj0gJzAnICYmICp0eXBlc3RyIDw9ICc5JykKKwkJcmV0dXJuIGFwcGx5X3F1aXJrKGFjOTcsIChpbnQpc2ltcGxlX3N0cnRvdWwodHlwZXN0ciwgTlVMTCwgMTApKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBzbmRfYWM5N190dW5lX2hhcmR3YXJlIC0gdHVuZSB1cCB0aGUgaGFyZHdhcmUKKyAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQorICogQHF1aXJrOiBxdWlyayBsaXN0CisgKiBAb3ZlcnJpZGU6IGV4cGxpY2l0IHF1aXJrIHZhbHVlIChvdmVycmlkZXMgdGhlIGxpc3QgaWYgbm9uLU5VTEwpCisgKgorICogRG8gc29tZSB3b3JrYXJvdW5kIGZvciBlYWNoIHBjaSBkZXZpY2UsIHN1Y2ggYXMgcmVuYW1pbmcgb2YgdGhlCisgKiBoZWFkcGhvbmUgKHRydWUgbGluZS1vdXQpIGNvbnRyb2wgYXMgIk1hc3RlciIuCisgKiBUaGUgcXVpcmstbGlzdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8tZmlsbGVkIGVudHJ5LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworCitpbnQgc25kX2FjOTdfdHVuZV9oYXJkd2FyZShhYzk3X3QgKmFjOTcsIHN0cnVjdCBhYzk3X3F1aXJrICpxdWlyaywgY29uc3QgY2hhciAqb3ZlcnJpZGUpCit7CisJaW50IHJlc3VsdDsKKworCXNuZF9hc3NlcnQocXVpcmssIHJldHVybiAtRUlOVkFMKTsKKworCS8qIHF1aXJrIG92ZXJyaWRlbj8gKi8KKwlpZiAob3ZlcnJpZGUgJiYgc3RyY21wKG92ZXJyaWRlLCAiLTEiKSAmJiBzdHJjbXAob3ZlcnJpZGUsICJkZWZhdWx0IikpIHsKKwkJcmVzdWx0ID0gYXBwbHlfcXVpcmtfc3RyKGFjOTcsIG92ZXJyaWRlKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVzIGZhaWxlZCAoJWQpXG4iLCBvdmVycmlkZSwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlmb3IgKDsgcXVpcmstPnZlbmRvcjsgcXVpcmsrKykgeworCQlpZiAocXVpcmstPnZlbmRvciAhPSBhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yKQorCQkJY29udGludWU7CisJCWlmICgoISBxdWlyay0+bWFzayAmJiBxdWlyay0+ZGV2aWNlID09IGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpIHx8CisJCSAgICBxdWlyay0+ZGV2aWNlID09IChxdWlyay0+bWFzayAmIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpKSB7CisJCQlpZiAocXVpcmstPmNvZGVjX2lkICYmIHF1aXJrLT5jb2RlY19pZCAhPSBhYzk3LT5pZCkKKwkJCQljb250aW51ZTsKKwkJCXNuZF9wcmludGRkKCJhYzk3IHF1aXJrIGZvciAlcyAoJTA0eDolMDR4KVxuIiwgcXVpcmstPm5hbWUsIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IsIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpOworCQkJcmVzdWx0ID0gYXBwbHlfcXVpcmsoYWM5NywgcXVpcmstPnR5cGUpOworCQkJaWYgKHJlc3VsdCA8IDApCisJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlZCBmb3IgJXMgZmFpbGVkICglZClcbiIsIHF1aXJrLT50eXBlLCBxdWlyay0+bmFtZSwgcmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBFeHBvcnRlZCBzeW1ib2xzCisgKi8KKworRVhQT1JUX1NZTUJPTChzbmRfYWM5N193cml0ZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3JlYWQpOworRVhQT1JUX1NZTUJPTChzbmRfYWM5N193cml0ZV9jYWNoZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3VwZGF0ZV9iaXRzKTsKK0VYUE9SVF9TWU1CT0woc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUpOworRVhQT1JUX1NZTUJPTChzbmRfYWM5N19idXMpOworRVhQT1JUX1NZTUJPTChzbmRfYWM5N19taXhlcik7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3BjbV9hc3NpZ24pOworRVhQT1JUX1NZTUJPTChzbmRfYWM5N19wY21fb3Blbik7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3BjbV9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3BjbV9kb3VibGVfcmF0ZV9ydWxlcyk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3R1bmVfaGFyZHdhcmUpOworRVhQT1JUX1NZTUJPTChzbmRfYWM5N19zZXRfcmF0ZSk7CisjaWZkZWYgQ09ORklHX1BNCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3Jlc3VtZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3N1c3BlbmQpOworI2VuZGlmCisKKy8qCisgKiAgSU5JVCBwYXJ0CisgKi8KKworc3RhdGljIGludCBfX2luaXQgYWxzYV9hYzk3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfYWM5N19leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfYWM5N19pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9hYzk3X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2lkLmggYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkZjM4NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfaWQuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NworICoKKyAqICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIDIuMgorICogIGJ5IEludGVsIENvcnBvcmF0aW9uIChodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbSkuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2RlZmluZSBBQzk3X0lEX0FLNDU0MAkJMHg0MTRiNGQwMAorI2RlZmluZSBBQzk3X0lEX0FLNDU0MgkJMHg0MTRiNGQwMQorI2RlZmluZSBBQzk3X0lEX0FEMTgxOQkJMHg0MTQ0NTMwMworI2RlZmluZSBBQzk3X0lEX0FEMTg4MQkJMHg0MTQ0NTM0MAorI2RlZmluZSBBQzk3X0lEX0FEMTg4MUEJCTB4NDE0NDUzNDgKKyNkZWZpbmUgQUM5N19JRF9BRDE4ODUJCTB4NDE0NDUzNjAKKyNkZWZpbmUgQUM5N19JRF9BRDE4ODYJCTB4NDE0NDUzNjEKKyNkZWZpbmUgQUM5N19JRF9BRDE4ODcJCTB4NDE0NDUzNjIKKyNkZWZpbmUgQUM5N19JRF9BRDE4ODZBCQkweDQxNDQ1MzYzCisjZGVmaW5lIEFDOTdfSURfQUQxOTgwIAkJMHg0MTQ0NTM3MAorI2RlZmluZSBBQzk3X0lEX1RSMjgwMjgJCTB4NTQ1MjQxMDgKKyNkZWZpbmUgQUM5N19JRF9TVEFDOTcwMAkweDgzODQ3NjAwCisjZGVmaW5lIEFDOTdfSURfU1RBQzk3MDQJMHg4Mzg0NzYwNAorI2RlZmluZSBBQzk3X0lEX1NUQUM5NzA1CTB4ODM4NDc2MDUKKyNkZWZpbmUgQUM5N19JRF9TVEFDOTcwOAkweDgzODQ3NjA4CisjZGVmaW5lIEFDOTdfSURfU1RBQzk3MjEJMHg4Mzg0NzYwOQorI2RlZmluZSBBQzk3X0lEX1NUQUM5NzQ0CTB4ODM4NDc2NDQKKyNkZWZpbmUgQUM5N19JRF9TVEFDOTc1NgkweDgzODQ3NjU2CisjZGVmaW5lIEFDOTdfSURfQ1M0Mjk3QQkJMHg0MzUyNTkxMAorI2RlZmluZSBBQzk3X0lEX0NTNDI5OQkJMHg0MzUyNTkzMAorI2RlZmluZSBBQzk3X0lEX0NTNDIwMQkJMHg0MzUyNTk0OAorI2RlZmluZSBBQzk3X0lEX0NTNDIwNQkJMHg0MzUyNTk1OAorI2RlZmluZSBBQzk3X0lEX0NTX01BU0sJCTB4ZmZmZmZmZjgJLyogYml0IDAtMjogcmV2ICovCisjZGVmaW5lIEFDOTdfSURfQUxDMTAwCQkweDQxNGM0MzAwCisjZGVmaW5lIEFDOTdfSURfQUxDNjUwCQkweDQxNGM0NzIwCisjZGVmaW5lIEFDOTdfSURfQUxDNjUwRAkJMHg0MTRjNDcyMQorI2RlZmluZSBBQzk3X0lEX0FMQzY1MEUJCTB4NDE0YzQ3MjIKKyNkZWZpbmUgQUM5N19JRF9BTEM2NTBGCQkweDQxNGM0NzIzCisjZGVmaW5lIEFDOTdfSURfQUxDNjU1CQkweDQxNGM0NzYwCisjZGVmaW5lIEFDOTdfSURfQUxDNjU4CQkweDQxNGM0NzgwCisjZGVmaW5lIEFDOTdfSURfQUxDODUwCQkweDQxNGM0NzkwCisjZGVmaW5lIEFDOTdfSURfWU1GNzUzCQkweDU5NGQ0ODAzCisjZGVmaW5lIEFDOTdfSURfVlQxNjE2CQkweDQ5NDM0NTUxCisjZGVmaW5lIEFDOTdfSURfQ005NzM4CQkweDQzNGQ0OTQxCisjZGVmaW5lIEFDOTdfSURfQ005NzM5CQkweDQzNGQ0OTYxCisjZGVmaW5lIEFDOTdfSURfQ005NzYxXzc4CTB4NDM0ZDQ5NzgKKyNkZWZpbmUgQUM5N19JRF9DTTk3NjFfODIJMHg0MzRkNDk4MgorI2RlZmluZSBBQzk3X0lEX0NNOTc2MV84MwkweDQzNGQ0OTgzCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2xvY2FsLmggYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2xvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2YTRkNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfbG9jYWwuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NworICoKKyAqICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIDIuMgorICogIGJ5IEludGVsIENvcnBvcmF0aW9uIChodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbSkuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2RlZmluZSBBQzk3X1NJTkdMRV9WQUxVRShyZWcsc2hpZnQsbWFzayxpbnZlcnQpICgocmVnKSB8ICgoc2hpZnQpIDw8IDgpIHwgKChzaGlmdCkgPDwgMTIpIHwgKChtYXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpKQorI2RlZmluZSBBQzk3X1BBR0VfU0lOR0xFX1ZBTFVFKHJlZyxzaGlmdCxtYXNrLGludmVydCxwYWdlKSAoQUM5N19TSU5HTEVfVkFMVUUocmVnLHNoaWZ0LG1hc2ssaW52ZXJ0KSB8ICgxPDwyNSkgfCAoKHBhZ2UpIDw8IDI2KSkKKyNkZWZpbmUgQUM5N19TSU5HTEUoeG5hbWUsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LCBcCisgIC5nZXQgPSBzbmRfYWM5N19nZXRfdm9sc3csIC5wdXQgPSBzbmRfYWM5N19wdXRfdm9sc3csIFwKKyAgLnByaXZhdGVfdmFsdWUgPSAgQUM5N19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSB9CisjZGVmaW5lIEFDOTdfUEFHRV9TSU5HTEUoeG5hbWUsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCwgcGFnZSkJCVwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmZvID0gc25kX2FjOTdfaW5mb192b2xzdywgXAorICAuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX2FjOTdfcHV0X3ZvbHN3LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gIEFDOTdfUEFHRV9TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0LCBwYWdlKSB9CisjZGVmaW5lIEFDOTdfRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LCBcCisgIC5nZXQgPSBzbmRfYWM5N19nZXRfdm9sc3csIC5wdXQgPSBzbmRfYWM5N19wdXRfdm9sc3csIFwKKyAgLnByaXZhdGVfdmFsdWUgPSAocmVnKSB8ICgoc2hpZnRfbGVmdCkgPDwgOCkgfCAoKHNoaWZ0X3JpZ2h0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkgfQorI2RlZmluZSBBQzk3X0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdF9sLCB4c2hpZnRfciwgeG1hc2ssIHh0ZXh0cykgXAoreyAucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAorICAubWFzayA9IHhtYXNrLCAudGV4dHMgPSB4dGV4dHMgfQorI2RlZmluZSBBQzk3X0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cykgXAorCUFDOTdfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpCisjZGVmaW5lIEFDOTdfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmZvID0gc25kX2FjOTdfaW5mb19lbnVtX2RvdWJsZSwgXAorICAuZ2V0ID0gc25kX2FjOTdfZ2V0X2VudW1fZG91YmxlLCAucHV0ID0gc25kX2FjOTdfcHV0X2VudW1fZG91YmxlLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKworLyogYWM5N19jb2RlYy5jICovCitleHRlcm4gY29uc3QgY2hhciAqc25kX2FjOTdfc3RlcmVvX2VuaGFuY2VtZW50c1tdOworZXh0ZXJuIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc18zZFtdOworZXh0ZXJuIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19zcGRpZltdOworc25kX2tjb250cm9sX3QgKnNuZF9hYzk3X2NuZXcoY29uc3Qgc25kX2tjb250cm9sX25ld190ICpfdGVtcGxhdGUsIGFjOTdfdCAqIGFjOTcpOwordm9pZCBzbmRfYWM5N19nZXRfbmFtZShhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIGludCBpZCwgY2hhciAqbmFtZSwgaW50IG1vZGVtKTsKK2ludCBzbmRfYWM5N19pbmZvX3ZvbHN3KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKTsKK2ludCBzbmRfYWM5N19nZXRfdm9sc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCk7CitpbnQgc25kX2FjOTdfcHV0X3ZvbHN3KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworaW50IHNuZF9hYzk3X3RyeV9iaXQoYWM5N190ICogYWM5NywgaW50IHJlZywgaW50IGJpdCk7CitpbnQgc25kX2FjOTdfcmVtb3ZlX2N0bChhYzk3X3QgKmFjOTcsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CitpbnQgc25kX2FjOTdfcmVuYW1lX2N0bChhYzk3X3QgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzdWZmaXgpOworaW50IHNuZF9hYzk3X3N3YXBfY3RsKGFjOTdfdCAqYWM5NywgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzdWZmaXgpOwordm9pZCBzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3X3QgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KTsKK3ZvaWQgc25kX2FjOTdfcmVzdG9yZV9zdGF0dXMoYWM5N190ICphYzk3KTsKK3ZvaWQgc25kX2FjOTdfcmVzdG9yZV9pZWM5NTgoYWM5N190ICphYzk3KTsKK2ludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKTsKK2ludCBzbmRfYWM5N19nZXRfZW51bV9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCk7CitpbnQgc25kX2FjOTdfcHV0X2VudW1fZG91YmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworCitpbnQgc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKKworLyogYWM5N19wcm9jLmMgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBzbmRfYWM5N19idXNfcHJvY19pbml0KGFjOTdfYnVzX3QgKiBhYzk3KTsKK3ZvaWQgc25kX2FjOTdfYnVzX3Byb2NfZG9uZShhYzk3X2J1c190ICogYWM5Nyk7Cit2b2lkIHNuZF9hYzk3X3Byb2NfaW5pdChhYzk3X3QgKiBhYzk3KTsKK3ZvaWQgc25kX2FjOTdfcHJvY19kb25lKGFjOTdfdCAqIGFjOTcpOworI2Vsc2UKKyNkZWZpbmUgc25kX2FjOTdfYnVzX3Byb2NfaW5pdChhYzk3X2J1c190KSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNuZF9hYzk3X2J1c19wcm9jX2RvbmUoYWM5N19idXNfdCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzbmRfYWM5N19wcm9jX2luaXQoYWM5N190KSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNuZF9hYzk3X3Byb2NfZG9uZShhYzk3X3QpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzM0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKQEAgLTAsMCArMSwyMzA5IEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NworICoKKyAqICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIDIuMgorICogIGJ5IEludGVsIENvcnBvcmF0aW9uIChodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbSkgYW5kIHRvIGRhdGFzaGVldHMKKyAqICBmb3Igc3BlY2lmaWMgY29kZWNzLgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSAiYWM5N19wYXRjaC5oIgorI2luY2x1ZGUgImFjOTdfaWQuaCIKKyNpbmNsdWRlICJhYzk3X2xvY2FsLmgiCisKKy8qCisgKiAgQ2hpcCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICovCisKK3N0YXRpYyBpbnQgcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5N190ICogYWM5NywgY29uc3Qgc25kX2tjb250cm9sX25ld190ICpjb250cm9scywgaW50IGNvdW50KQoreworCWludCBpZHgsIGVycjsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrKQorCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmY29udHJvbHNbaWR4XSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKiBzZXQgdG8gdGhlIHBhZ2UsIHVwZGF0ZSBiaXRzIGFuZCByZXN0b3JlIHRoZSBwYWdlICovCitzdGF0aWMgaW50IGFjOTdfdXBkYXRlX2JpdHNfcGFnZShhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBhZ2UpCit7CisJdW5zaWduZWQgc2hvcnQgcGFnZV9zYXZlOworCWludCByZXQ7CisKKwlkb3duKCZhYzk3LT5wYWdlX211dGV4KTsKKwlwYWdlX3NhdmUgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfSU5UX1BBR0lORykgJiBBQzk3X1BBR0VfTUFTSzsKKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIEFDOTdfUEFHRV9NQVNLLCBwYWdlKTsKKwlyZXQgPSBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCByZWcsIG1hc2ssIHZhbHVlKTsKKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIEFDOTdfUEFHRV9NQVNLLCBwYWdlX3NhdmUpOworCXVwKCZhYzk3LT5wYWdlX211dGV4KTsgLyogdW5sb2NrIHBhZ2luZyAqLworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgc25kX2FjOTdfeW1mNzUzXy4uLiBpdGVtcyBhZGRlZCBieSBEYXZpZCBTaHVzdCAoZHNodXN0QHNodXN0cmluZy5jb20pICovCisKKy8qIEl0IGlzIHBvc3NpYmxlIHRvIGluZGljYXRlIHRvIHRoZSBZYW1haGEgWU1GNzUzIHRoZSB0eXBlIG9mIHNwZWFrZXJzIGJlaW5nIHVzZWQuICovCitzdGF0aWMgaW50IHNuZF9hYzk3X3ltZjc1M19pbmZvX3NwZWFrZXIoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzNdID0geworCQkiU3RhbmRhcmQiLCAiU21hbGwiLCAiU21hbGxlciIKKwl9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAyKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMjsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3ltZjc1M19nZXRfc3BlYWtlcihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfWU1GNzUzXzNEX01PREVfU0VMXTsKKwl2YWwgPSAodmFsID4+IDEwKSAmIDM7CisJaWYgKHZhbCA+IDApICAgIC8qIDAgPSBpbnZhbGlkICovCisJCXZhbC0tOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfeW1mNzUzX3B1dF9zcGVha2VyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKSA8PCAxMDsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlKGFjOTcsIEFDOTdfWU1GNzUzXzNEX01PREVfU0VMLCB2YWwpOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X3ltZjc1M19jb250cm9sc19zcGVha2VyID0KK3sKKwkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgICA9ICIzRCBDb250cm9sIC0gU3BlYWtlciIsCisJLmluZm8gICA9IHNuZF9hYzk3X3ltZjc1M19pbmZvX3NwZWFrZXIsCisJLmdldCAgICA9IHNuZF9hYzk3X3ltZjc1M19nZXRfc3BlYWtlciwKKwkucHV0ICAgID0gc25kX2FjOTdfeW1mNzUzX3B1dF9zcGVha2VyLAorfTsKKworLyogSXQgaXMgcG9zc2libGUgdG8gaW5kaWNhdGUgdG8gdGhlIFlhbWFoYSBZTUY3NTMgdGhlIHNvdXJjZSB0byBkaXJlY3QgdG8gdGhlIFMvUERJRiBvdXRwdXQuICovCitzdGF0aWMgaW50IHNuZF9hYzk3X3ltZjc1M19zcGRpZl9zb3VyY2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICJBQy1MaW5rIiwgIkEvRCBDb252ZXJ0ZXIiIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfeW1mNzUzX3NwZGlmX3NvdXJjZV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJdmFsID0gYWM5Ny0+cmVnc1tBQzk3X1lNRjc1M19ESVRfQ1RSTDJdOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IDEpICYgMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N195bWY3NTNfc3BkaWZfc291cmNlX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPDwgMTsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19ZTUY3NTNfRElUX0NUUkwyLCAweDAwMDIsIHZhbCk7Cit9CisKKy8qIFRoZSBBQyc5NyBzcGVjIHN0YXRlcyB0aGF0IHRoZSBTL1BESUYgc2lnbmFsIGlzIHRvIGJlIG91dHB1dCBhdCBwaW4gNDguCisgICBUaGUgWU1GNzUzIHdpbGwgb3V0cHV0IHRoZSBTL1BESUYgc2lnbmFsIHRvIHBpbiA0MywgNDcgKEVBUEQpLCBvciA0OC4KKyAgIEJ5IGRlZmF1bHQsIG5vIG91dHB1dCBwaW4gaXMgc2VsZWN0ZWQsIGFuZCB0aGUgUy9QRElGIHNpZ25hbCBpcyBub3Qgb3V0cHV0LgorICAgVGhlcmUgaXMgYWxzbyBhIGJpdCB0byBtdXRlIFMvUERJRiBvdXRwdXQgaW4gYSB2ZW5kb3Itc3BlY2lmaWMgcmVnaXN0ZXIuICovCitzdGF0aWMgaW50IHNuZF9hYzk3X3ltZjc1M19zcGRpZl9vdXRwdXRfcGluX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzNdID0geyAiRGlzYWJsZWQiLCAiUGluIDQzIiwgIlBpbiA0OCIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMikKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDI7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N195bWY3NTNfc3BkaWZfb3V0cHV0X3Bpbl9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJdmFsID0gYWM5Ny0+cmVnc1tBQzk3X1lNRjc1M19ESVRfQ1RSTDJdOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsICYgMHgwMDA4KSA/IDIgOiAodmFsICYgMHgwMDIwKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3ltZjc1M19zcGRpZl9vdXRwdXRfcGluX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDIpCisJCXJldHVybiAtRUlOVkFMOworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IDIpID8gMHgwMDA4IDoKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSAxKSA/IDB4MDAyMCA6IDA7CisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfWU1GNzUzX0RJVF9DVFJMMiwgMHgwMDI4LCB2YWwpOworCS8qIFRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQgdG8gZGlyZWN0IFMvUERJRiBvdXRwdXQgdG8gcGluIDQ3IChFQVBEKS4KKwkgICBzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDYyLCBzbmRfYWM5N19yZWFkKGFjOTcsIDB4NjIpIHwgMHgwMDA4KTsgKi8KK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N195bWY3NTNfY29udHJvbHNfc3BkaWZbM10gPSB7CisJeworCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUJPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlNvdXJjZSIsCisJCS5pbmZvCT0gc25kX2FjOTdfeW1mNzUzX3NwZGlmX3NvdXJjZV9pbmZvLAorCQkuZ2V0CT0gc25kX2FjOTdfeW1mNzUzX3NwZGlmX3NvdXJjZV9nZXQsCisJCS5wdXQJPSBzbmRfYWM5N195bWY3NTNfc3BkaWZfc291cmNlX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lCT0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJPdXRwdXQgUGluIiwKKwkJLmluZm8JPSBzbmRfYWM5N195bWY3NTNfc3BkaWZfb3V0cHV0X3Bpbl9pbmZvLAorCQkuZ2V0CT0gc25kX2FjOTdfeW1mNzUzX3NwZGlmX291dHB1dF9waW5fZ2V0LAorCQkucHV0CT0gc25kX2FjOTdfeW1mNzUzX3NwZGlmX291dHB1dF9waW5fcHV0LAorCX0sCisJQUM5N19TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLE5PTkUsTk9ORSkgIk11dGUiLCBBQzk3X1lNRjc1M19ESVRfQ1RSTDIsIDIsIDEsIDEpCit9OworCitzdGF0aWMgaW50IHBhdGNoX3lhbWFoYV95bWY3NTNfM2QoYWM5N190ICogYWM5NykKK3sKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIGtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc18zZFswXSwgYWM5NykpKSA8IDApCisJCXJldHVybiBlcnI7CisJc3RyY3B5KGtjdGwtPmlkLm5hbWUsICIzRCBDb250cm9sIC0gV2lkZSIpOworCWtjdGwtPnByaXZhdGVfdmFsdWUgPSBBQzk3X1NJTkdMRV9WQUxVRShBQzk3XzNEX0NPTlRST0wsIDksIDcsIDApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfM0RfQ09OVFJPTCwgMHgwMDAwKTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfeW1mNzUzX2NvbnRyb2xzX3NwZWFrZXIsIGFjOTcpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfWU1GNzUzXzNEX01PREVfU0VMLCAweDBjMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhdGNoX3lhbWFoYV95bWY3NTNfcG9zdF9zcGRpZihhYzk3X3QgKiBhYzk3KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X3ltZjc1M19jb250cm9sc19zcGRpZiwgQVJSQVlfU0laRShzbmRfYWM5N195bWY3NTNfY29udHJvbHNfc3BkaWYpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF95YW1haGFfeW1mNzUzX29wcyA9IHsKKwkuYnVpbGRfM2QJPSBwYXRjaF95YW1haGFfeW1mNzUzXzNkLAorCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfeWFtYWhhX3ltZjc1M19wb3N0X3NwZGlmCit9OworCitpbnQgcGF0Y2hfeWFtYWhhX3ltZjc1MyhhYzk3X3QgKiBhYzk3KQoreworCS8qIFBhdGNoIGZvciBZYW1haGEgWU1GNzUzLCBDb3B5cmlnaHQgKGMpIGJ5IERhdmlkIFNodXN0LCBkc2h1c3RAc2h1c3RyaW5nLmNvbS4KKwkgICBUaGlzIGNoaXAgaGFzIG5vbnN0YW5kYXJkIGFuZCBleHRlbmRlZCBiZWhhdmlvdXIgd2l0aCByZWdhcmQgdG8gaXRzIFMvUERJRiBvdXRwdXQuCisJICAgVGhlIEFDJzk3IHNwZWMgc3RhdGVzIHRoYXQgdGhlIFMvUERJRiBzaWduYWwgaXMgdG8gYmUgb3V0cHV0IGF0IHBpbiA0OC4KKwkgICBUaGUgWU1GNzUzIHdpbGwgb3VwdXQgdGhlIFMvUERJRiBzaWduYWwgdG8gcGluIDQzLCA0NyAoRUFQRCksIG9yIDQ4LgorCSAgIEJ5IGRlZmF1bHQsIG5vIG91dHB1dCBwaW4gaXMgc2VsZWN0ZWQsIGFuZCB0aGUgUy9QRElGIHNpZ25hbCBpcyBub3Qgb3V0cHV0LgorCSAgIFRoZXJlIGlzIGFsc28gYSBiaXQgdG8gbXV0ZSBTL1BESUYgb3V0cHV0IGluIGEgdmVuZG9yLXNwZWNpZmljIHJlZ2lzdGVyLgorCSovCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3lhbWFoYV95bWY3NTNfb3BzOworCWFjOTctPmNhcHMgfD0gQUM5N19CQ19CQVNTX1RSRUJMRTsKKwlhYzk3LT5jYXBzIHw9IDB4MDQgPDwgMTA7IC8qIFlhbWFoYSAzRCBlbmhhbmNlbWVudCAqLworCXJldHVybiAwOworfQorCisvKgorICogTWF5IDIsIDIwMDMgTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPgorICogIHJlbW92ZWQgYnJva2VuIHdvbGZzb24wMCBwYXRjaC4KKyAqICBhZGRlZCBzdXBwb3J0IGZvciBXTTk3MDUsV005NzA4LFdNOTcwOSxXTTk3MTAsV005NzExLFdNOTcxMiBhbmQgV005NzE3LgorICovCisKK2ludCBwYXRjaF93b2xmc29uMDMoYWM5N190ICogYWM5NykKK3sKKwkvKiBUaGlzIGlzIGtub3duIHRvIHdvcmsgZm9yIHRoZSBWaWV3U29uaWMgVmlld1BhZCAxMDAwCisJICAgUmFuZG9scGggQmVudHNvbiA8YmVudHNvbkBob2xtc2pvZW4uY29tPiAqLworCisJLy8gV005NzAzLzk3MDcvOTcwOC85NzE3CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3WFhfRk1JWEVSX1ZPTCwgMHgwODA4KTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMHg4MDAwKTsKKwlyZXR1cm4gMDsKK30KKyAgCitpbnQgcGF0Y2hfd29sZnNvbjA0KGFjOTdfdCAqIGFjOTcpCit7CisJLy8gV005NzA0TS85NzA0UQorCS8vIHNldCBmcm9udCBhbmQgcmVhciBtaXhlciB2b2x1bWUKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1dNOTdYWF9GTUlYRVJfVk9MLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfV005NzA0X1JNSVhFUl9WT0wsIDB4MDgwOCk7CisJCisJLy8gcGF0Y2ggZm9yIERWRCBub2lzZQorCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfV005NzA0X1RFU1QsIDB4MDIwMCk7CisgCisJLy8gaW5pdCB2b2wKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1dNOTcwNF9SUENNX1ZPTCwgMHgwODA4KTsKKyAKKwkvLyBzZXQgcmVhciBzdXJyb3VuZCB2b2x1bWUKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKyAgCitpbnQgcGF0Y2hfd29sZnNvbjA1KGFjOTdfdCAqIGFjOTcpCit7CisJLy8gV005NzA1LCBXTTk3MTAKKwkvLyBzZXQgZnJvbnQgbWl4ZXIgdm9sdW1lCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3WFhfRk1JWEVSX1ZPTCwgMHgwODA4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhdGNoX3dvbGZzb24xMShhYzk3X3QgKiBhYzk3KQoreworCS8vIFdNOTcxMSwgV005NzEyCisJLy8gc2V0IG91dDMgdm9sdW1lCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3MTFfT1VUM1ZPTCwgMHgwODA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19taWNfbWl4ZXJbXSA9IHsiU3RlcmVvIiwgIk1pYzEiLCAiTWljMiIsICJNdXRlIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzEzX3JlY19tdXhbXSA9IHsiU3RlcmVvIiwgIkxlZnQiLCAiUmlnaHQiLCAiTXV0ZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19yZWNfc3JjX2xbXSA9IHsiTWljMSIsICJNaWMyIiwgIkxpbmUgTCIsICJNb25vIEluIiwgIkhQIE1peCBMIiwgIlNwayBNaXgiLCAiTW9ubyBNaXgiLCAiWmgifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfcmVjX3NyY19yW10gPSB7Ik1pYzEiLCAiTWljMiIsICJMaW5lIFIiLCAiTW9ubyBJbiIsICJIUCBNaXggUiIsICJTcGsgTWl4IiwgIk1vbm8gTWl4IiwgIlpoIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWM5N19lbnVtIHdtOTcxM19lbnVtW10gPSB7CitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfTElORSwgMywgNCwgd205NzEzX21pY19taXhlciksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfVklERU8sIDE0LCA0LCB3bTk3MTNfcmVjX211eCksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfVklERU8sIDksIDQsIHdtOTcxM19yZWNfbXV4KSwKK0FDOTdfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgMywgOCwgd205NzEzX3JlY19zcmNfbCksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfVklERU8sIDAsIDgsIHdtOTcxM19yZWNfc3JjX3IpLAorfTsKKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2xpbmVfaW5bXSA9IHsKK0FDOTdfRE9VQkxFKCJMaW5lIEluIFZvbHVtZSIsIEFDOTdfUENfQkVFUCwgOCwgMCwgMzEsIDEpLAorQUM5N19TSU5HTEUoIkxpbmUgSW4gdG8gSGVhZHBob25lIE11dGUiLCBBQzk3X1BDX0JFRVAsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIEluIHRvIFNwZWFrZXIgTXV0ZSIsIEFDOTdfUENfQkVFUCwgMTQsIDEsIDEpLAorQUM5N19TSU5HTEUoIkxpbmUgSW4gdG8gTW9ubyBNdXRlIiwgQUM5N19QQ19CRUVQLCAxMywgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtMTNfc25kX2FjOTdfY29udHJvbHNfZGFjW10gPSB7CitBQzk3X0RPVUJMRSgiREFDIFZvbHVtZSIsIEFDOTdfUEhPTkUsIDgsIDAsIDMxLCAxKSwKK0FDOTdfU0lOR0xFKCJEQUMgdG8gSGVhZHBob25lIE11dGUiLCBBQzk3X1BIT05FLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiREFDIHRvIFNwZWFrZXIgTXV0ZSIsIEFDOTdfUEhPTkUsIDE0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJEQUMgdG8gTW9ubyBNdXRlIiwgQUM5N19QSE9ORSwgMTMsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX21pY1tdID0geworQUM5N19TSU5HTEUoIk1JQ0EgVm9sdW1lIiwgQUM5N19NSUMsIDgsIDMxLCAxKSwKK0FDOTdfU0lOR0xFKCJNSUNCIFZvbHVtZSIsIEFDOTdfTUlDLCAwLCAzMSwgMSksCitBQzk3X1NJTkdMRSgiTUlDQSB0byBNb25vIE11dGUiLCBBQzk3X0xJTkUsIDcsIDEsIDEpLAorQUM5N19TSU5HTEUoIk1JQ0IgdG8gTW9ubyBNdXRlIiwgQUM5N19MSU5FLCA2LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJNSUMgQm9vc3QgKCsyMGRCKSIsIEFDOTdfTElORSwgNSwgMSwgMSksCitBQzk3X0VOVU0oIk1JQyBIZWFkcGhvbmUgUm91dGluZyIsIHdtOTcxM19lbnVtWzBdKSwKK0FDOTdfU0lOR0xFKCJNSUMgSGVhZHBob25lIE1peGVyIFZvbHVtZSIsIEFDOTdfTElORSwgMCwgNywgMSkKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd20xM19zbmRfYWM5N19jb250cm9sc19hZGNbXSA9IHsKK0FDOTdfU0lOR0xFKCJBREMgTXV0ZSIsIEFDOTdfQ0QsIDE1LCAxLCAxKSwKK0FDOTdfRE9VQkxFKCJHYWluIFN0ZXAgU2l6ZSAoMS41ZEIvMC43NWRCKSIsIEFDOTdfQ0QsIDE0LCA2LCAxLCAxKSwKK0FDOTdfRE9VQkxFKCJBREMgVm9sdW1lIixBQzk3X0NELCA4LCAwLCAxNSwgMCksCitBQzk3X1NJTkdMRSgiQURDIFplcm8gQ3Jvc3MiLCBBQzk3X0NELCA3LCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd20xM19zbmRfYWM5N19jb250cm9sc19yZWNzZWxbXSA9IHsKK0FDOTdfRU5VTSgiUmVjb3JkIHRvIEhlYWRwaG9uZSBQYXRoIiwgd205NzEzX2VudW1bMV0pLAorQUM5N19TSU5HTEUoIlJlY29yZCB0byBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19WSURFTywgMTEsIDcsIDApLAorQUM5N19FTlVNKCJSZWNvcmQgdG8gTW9ubyBQYXRoIiwgd205NzEzX2VudW1bMl0pLAorQUM5N19TSU5HTEUoIlJlY29yZCB0byBNb25vIEJvb3N0ICgrMjBkQikiLCBBQzk3X1ZJREVPLCA4LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJSZWNvcmQgQURDIEJvb3N0ICgrMjBkQikiLCBBQzk3X1ZJREVPLCA2LCAxLCAwKSwKK0FDOTdfRU5VTSgiUmVjb3JkIFNlbGVjdCBMZWZ0Iiwgd205NzEzX2VudW1bM10pLAorQUM5N19FTlVNKCJSZWNvcmQgU2VsZWN0IFJpZ2h0Iiwgd205NzEzX2VudW1bNF0pLAorfTsKKworc3RhdGljIGludCBwYXRjaF93b2xmc29uX3dtOTcxM19zcGVjaWZpYyhhYzk3X3QgKiBhYzk3KQoreworCWludCBlcnIsIGk7CisJCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod20xM19zbmRfYWM5N19jb250cm9sc19saW5lX2luKTsgaSsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2xpbmVfaW5baV0sIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19QQ19CRUVQLCAweDA4MDgpOworCQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfZGFjKTsgaSsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2RhY1tpXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1BIT05FLCAweDA4MDgpOworCQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfbWljKTsgaSsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX21pY1tpXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X01JQywgMHgwODA4KTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0xJTkUsIDB4MDBkYSk7CisJCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod20xM19zbmRfYWM5N19jb250cm9sc19hZGMpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIHNuZF9hYzk3X2NuZXcoJndtMTNfc25kX2FjOTdfY29udHJvbHNfYWRjW2ldLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQ0QsIDB4MDgwOCk7CisJCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod20xM19zbmRfYWM5N19jb250cm9sc19yZWNzZWwpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIHNuZF9hYzk3X2NuZXcoJndtMTNfc25kX2FjOTdfY29udHJvbHNfcmVjc2VsW2ldLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfVklERU8sIDB4ZDYxMik7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19SRUNfR0FJTiwgMHgxYmEwKTsKKwkKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgcGF0Y2hfd29sZnNvbl93bTk3MTNfc3VzcGVuZCAoYWM5N190ICogYWM5NykKK3sKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01JRCwgMHhmZWZmKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX3dvbGZzb25fd205NzEzX3Jlc3VtZSAoYWM5N190ICogYWM5NykKK3sKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01JRCwgMHhkYTAwKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDB4MzgxMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19QT1dFUkRPV04sIDB4MCk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfd29sZnNvbl93bTk3MTNfb3BzID0geworCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzEzX3NwZWNpZmljLAorI2lmZGVmIENPTkZJR19QTQkKKwkuc3VzcGVuZCA9IHBhdGNoX3dvbGZzb25fd205NzEzX3N1c3BlbmQsCisJLnJlc3VtZSA9IHBhdGNoX3dvbGZzb25fd205NzEzX3Jlc3VtZQorI2VuZGlmCit9OworCitpbnQgcGF0Y2hfd29sZnNvbjEzKGFjOTdfdCAqIGFjOTcpCit7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3dvbGZzb25fd205NzEzX29wczsKKworCWFjOTctPmZsYWdzIHw9IEFDOTdfSEFTX05PX1JFQ19HQUlOIHwgQUM5N19TVEVSRU9fTVVURVMgfCBBQzk3X0hBU19OT19QSE9ORSB8CisJCUFDOTdfSEFTX05PX1BDX0JFRVAgfCBBQzk3X0hBU19OT19WSURFTyB8IEFDOTdfSEFTX05PX0NEOworCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9NSUQsIDB4ZGEwMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTLCAweDM4MTApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCAweDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcml0ZWNoIGNvZGVjCisgKi8KK2ludCBwYXRjaF90cml0ZWNoX3RyMjgwMjgoYWM5N190ICogYWM5NykKK3sKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDI2LCAweDAzMDApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4MjYsIDB4MDAwMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MDAwMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TUERJRiwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNpZ21hdGVsIFNUQUM5N3h4IGNvZGVjcworICovCitzdGF0aWMgaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwXzNkKGFjOTdfdCAqIGFjOTcpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfM2RbMF0sIGFjOTcpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN0cmNweShrY3RsLT5pZC5uYW1lLCAiM0QgQ29udHJvbCBTaWdtYXRlbCAtIERlcHRoIik7CisJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKEFDOTdfM0RfQ09OVFJPTCwgMiwgMywgMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N18zRF9DT05UUk9MLCAweDAwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzA4XzNkKGFjOTdfdCAqIGFjOTcpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfM2RbMF0sIGFjOTcpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN0cmNweShrY3RsLT5pZC5uYW1lLCAiM0QgQ29udHJvbCBTaWdtYXRlbCAtIERlcHRoIik7CisJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKEFDOTdfM0RfQ09OVFJPTCwgMCwgMywgMCk7CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIGtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc18zZFswXSwgYWM5NykpKSA8IDApCisJCXJldHVybiBlcnI7CisJc3RyY3B5KGtjdGwtPmlkLm5hbWUsICIzRCBDb250cm9sIFNpZ21hdGVsIC0gUmVhciBEZXB0aCIpOworCWtjdGwtPnByaXZhdGVfdmFsdWUgPSBBQzk3X1NJTkdMRV9WQUxVRShBQzk3XzNEX0NPTlRST0wsIDIsIDMsIDApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfM0RfQ09OVFJPTCwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zaWdtYXRlbF80c3BlYWtlciA9CitBQzk3X1NJTkdMRSgiU2lnbWF0ZWwgNC1TcGVha2VyIFN0ZXJlbyBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQsIDIsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X3NpZ21hdGVsX3BoYXNlaW52ZXJ0ID0KK0FDOTdfU0lOR0xFKCJTaWdtYXRlbCBTdXJyb3VuZCBQaGFzZSBJbnZlcnNpb24gUGxheWJhY2sgU3dpdGNoIiwgQUM5N19TSUdNQVRFTF9EQUMySU5WRVJULCAzLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zaWdtYXRlbF9jb250cm9sc1tdID0geworQUM5N19TSU5HTEUoIlNpZ21hdGVsIERBQyA2ZEIgQXR0ZW51YXRlIiwgQUM5N19TSUdNQVRFTF9BTkFMT0csIDEsIDEsIDApLAorQUM5N19TSU5HTEUoIlNpZ21hdGVsIEFEQyA2ZEIgQXR0ZW51YXRlIiwgQUM5N19TSUdNQVRFTF9BTkFMT0csIDAsIDEsIDApCit9OworCitzdGF0aWMgaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5N3h4X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJaW50IGVycjsKKworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQU5BTE9HLCBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfU0lHTUFURUxfQU5BTE9HKSAmIH4weDAwMDMpOworCWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIEFDOTdfU0lHTUFURUxfQU5BTE9HLCAxKSkKKwkJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfc2lnbWF0ZWxfY29udHJvbHNbMF0sIDEpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIEFDOTdfU0lHTUFURUxfQU5BTE9HLCAwKSkKKwkJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfc2lnbWF0ZWxfY29udHJvbHNbMV0sIDEpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIEFDOTdfU0lHTUFURUxfREFDMklOVkVSVCwgMikpCisJCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X3NpZ21hdGVsXzRzcGVha2VyLCAxKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwlpZiAoc25kX2FjOTdfdHJ5X2JpdChhYzk3LCBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQsIDMpKQorCQlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19zaWdtYXRlbF9waGFzZWludmVydCwgMSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwX29wcyA9IHsKKwkuYnVpbGRfM2QJPSBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwMF8zZCwKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF9zaWdtYXRlbF9zdGFjOTd4eF9zcGVjaWZpYworfTsKKworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwKGFjOTdfdCAqIGFjOTcpCit7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwX29wczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19zdGFjOTcwOF9wdXRfYmlhcyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGVycjsKKworCWRvd24oJmFjOTctPnBhZ2VfbXV0ZXgpOworCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJZXJyID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19TSUdNQVRFTF9CSUFTMiwgMHgwMDEwLAorCQkJCSAgICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDEpIDw8IDQpOworCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzEsIDApOworCXVwKCZhYzk3LT5wYWdlX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X3N0YWM5NzA4X2JpYXNfY29udHJvbCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJTaWdtYXRlbCBPdXRwdXQgQmlhcyBTd2l0Y2giLAorCS5pbmZvID0gc25kX2FjOTdfaW5mb192b2xzdywKKwkuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LAorCS5wdXQgPSBzbmRfYWM5N19zdGFjOTcwOF9wdXRfYmlhcywKKwkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKEFDOTdfU0lHTUFURUxfQklBUzIsIDQsIDEsIDApLAorfTsKKworc3RhdGljIGludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwOF9zcGVjaWZpYyhhYzk3X3QgKmFjOTcpCit7CisJaW50IGVycjsKKworCXNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKGFjOTcsICJIZWFkcGhvbmUgUGxheWJhY2siLCAiU2lnbWF0ZWwgU3Vycm91bmQgUGxheWJhY2siKTsKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19zdGFjOTcwOF9iaWFzX2NvbnRyb2wsIDEpKSA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHBhdGNoX3NpZ21hdGVsX3N0YWM5N3h4X3NwZWNpZmljKGFjOTcpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwOF9vcHMgPSB7CisJLmJ1aWxkXzNkCT0gcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDhfM2QsCisJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDhfc3BlY2lmaWMKK307CisKK2ludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwOChhYzk3X3QgKiBhYzk3KQoreworCXVuc2lnbmVkIGludCBjb2RlYzcyLCBjb2RlYzZjOworCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3NpZ21hdGVsX3N0YWM5NzA4X29wczsKKwlhYzk3LT5jYXBzIHw9IDB4MTA7CS8qIEhQIChzaWdtYXRlbCBzdXJyb3VuZCkgc3VwcG9ydCAqLworCisJY29kZWM3MiA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19TSUdNQVRFTF9CSUFTMikgJiAweDgwMDA7CisJY29kZWM2YyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19TSUdNQVRFTF9BTkFMT0cpOworCisJaWYgKChjb2RlYzcyPT0wKSAmJiAoY29kZWM2Yz09MCkpIHsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MTAwMCk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzIsIDB4MDAwNyk7CisJfSBlbHNlIGlmICgoY29kZWM3Mj09MHg4MDAwKSAmJiAoY29kZWM2Yz09MCkpIHsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MTAwMSk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfREFDMklOVkVSVCwgMHgwMDA4KTsKKwl9IGVsc2UgaWYgKChjb2RlYzcyPT0weDgwMDApICYmIChjb2RlYzZjPT0weDAwODApKSB7CisJCS8qIG5vdGhpbmcgKi8KKwl9CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9NVUxUSUNITiwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxKGFjOTdfdCAqIGFjOTcpCit7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwX29wczsKKwlpZiAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1NJR01BVEVMX0FOQUxPRykgPT0gMCkgeworCQkvLyBwYXRjaCBmb3IgU2lnbWFUZWwKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4NDAwMCk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQklBUzIsIDB4MDAwMik7CisJfQorCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDAwMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTc0NChhYzk3X3QgKiBhYzk3KQoreworCS8vIHBhdGNoIGZvciBTaWdtYVRlbAorCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9zaWdtYXRlbF9zdGFjOTcwMF9vcHM7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQ0lDMiwgMHgwMDAwKTsJLyogaXMgdGhpcyBjb3JyZWN0PyAtLWprICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9CSUFTMSwgMHhhYmJhKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NJR01BVEVMX0JJQVMyLCAweDAwMDIpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDAwMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTc1NihhYzk3X3QgKiBhYzk3KQoreworCS8vIHBhdGNoIGZvciBTaWdtYVRlbAorCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9zaWdtYXRlbF9zdGFjOTcwMF9vcHM7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfQ0lDMiwgMHgwMDAwKTsJLyogaXMgdGhpcyBjb3JyZWN0PyAtLWprICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TSUdNQVRFTF9CSUFTMSwgMHhhYmJhKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1NJR01BVEVMX0JJQVMyLCAweDAwMDIpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfb3V0cHV0X2phY2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s1XSA9IHsgIklucHV0L0Rpc2FibGVkIiwgIkZyb250IE91dHB1dCIsCisJCSJSZWFyIE91dHB1dCIsICJDZW50ZXIvTEZFIE91dHB1dCIsICJNaXhlciBPdXRwdXQiIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDQpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSA0OworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfb3V0cHV0X2phY2tfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgc2hpZnQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfU0lHTUFURUxfT1VUU0VMXSA+PiBzaGlmdDsKKwlpZiAoISh2YWwgJiA0KSkKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDA7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMSArICh2YWwgJiAzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19zdGFjOTc1OF9vdXRwdXRfamFja19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzaGlmdCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gMCkKKwkJdmFsID0gMDsKKwllbHNlCisJCXZhbCA9IDQgfCAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAtIDEpOworCXJldHVybiBhYzk3X3VwZGF0ZV9iaXRzX3BhZ2UoYWM5NywgQUM5N19TSUdNQVRFTF9PVVRTRUwsCisJCQkJICAgICA3IDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQsIDApOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3N0YWM5NzU4X2lucHV0X2phY2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s3XSA9IHsgIk1pYzIgSmFjayIsICJNaWMxIEphY2siLCAiTGluZSBJbiBKYWNrIiwKKwkJIkZyb250IEphY2siLCAiUmVhciBKYWNrIiwgIkNlbnRlci9MRkUgSmFjayIsICJNdXRlIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDc7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiA2KQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gNjsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3N0YWM5NzU4X2lucHV0X2phY2tfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgc2hpZnQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfU0lHTUFURUxfSU5TRUxdOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IHNoaWZ0KSAmIDc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfaW5wdXRfamFja19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzaGlmdCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJcmV0dXJuIGFjOTdfdXBkYXRlX2JpdHNfcGFnZShhYzk3LCBBQzk3X1NJR01BVEVMX0lOU0VMLCA3IDw8IHNoaWZ0LAorCQkJCSAgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBzaGlmdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfcGhvbmVzZWxfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1szXSA9IHsgIk5vbmUiLCAiRnJvbnQgSmFjayIsICJSZWFyIEphY2siIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfcGhvbmVzZWxfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBhYzk3LT5yZWdzW0FDOTdfU0lHTUFURUxfSU9NSVNDXSAmIDM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3RhYzk3NThfcGhvbmVzZWxfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXJldHVybiBhYzk3X3VwZGF0ZV9iaXRzX3BhZ2UoYWM5NywgQUM5N19TSUdNQVRFTF9JT01JU0MsIDMsCisJCQkJICAgICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdLCAwKTsKK30KKworI2RlZmluZSBTVEFDOTc1OF9PVVRQVVRfSkFDSyh4bmFtZSwgc2hpZnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9hYzk3X3N0YWM5NzU4X291dHB1dF9qYWNrX2luZm8sIFwKKwkuZ2V0ID0gc25kX2FjOTdfc3RhYzk3NThfb3V0cHV0X2phY2tfZ2V0LCBcCisJLnB1dCA9IHNuZF9hYzk3X3N0YWM5NzU4X291dHB1dF9qYWNrX3B1dCwgXAorCS5wcml2YXRlX3ZhbHVlID0gc2hpZnQgfQorI2RlZmluZSBTVEFDOTc1OF9JTlBVVF9KQUNLKHhuYW1lLCBzaGlmdCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX2FjOTdfc3RhYzk3NThfaW5wdXRfamFja19pbmZvLCBcCisJLmdldCA9IHNuZF9hYzk3X3N0YWM5NzU4X2lucHV0X2phY2tfZ2V0LCBcCisJLnB1dCA9IHNuZF9hYzk3X3N0YWM5NzU4X2lucHV0X2phY2tfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSBzaGlmdCB9CitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X3NpZ21hdGVsX3N0YWM5NzU4X2NvbnRyb2xzW10gPSB7CisJU1RBQzk3NThfT1VUUFVUX0pBQ0soIk1pYzEgSmFjayIsIDEpLAorCVNUQUM5NzU4X09VVFBVVF9KQUNLKCJMaW5lSW4gSmFjayIsIDQpLAorCVNUQUM5NzU4X09VVFBVVF9KQUNLKCJGcm9udCBKYWNrIiwgNyksCisJU1RBQzk3NThfT1VUUFVUX0pBQ0soIlJlYXIgSmFjayIsIDEwKSwKKwlTVEFDOTc1OF9PVVRQVVRfSkFDSygiQ2VudGVyL0xGRSBKYWNrIiwgMTMpLAorCVNUQUM5NzU4X0lOUFVUX0pBQ0soIk1pYyBJbnB1dCBTb3VyY2UiLCAwKSwKKwlTVEFDOTc1OF9JTlBVVF9KQUNLKCJMaW5lIElucHV0IFNvdXJjZSIsIDgpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkhlYWRwaG9uZSBBbXAiLAorCQkuaW5mbyA9IHNuZF9hYzk3X3N0YWM5NzU4X3Bob25lc2VsX2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19zdGFjOTc1OF9waG9uZXNlbF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19zdGFjOTc1OF9waG9uZXNlbF9wdXQKKwl9LAorCUFDOTdfU0lOR0xFKCJFeGNoYW5nZSBDZW50ZXIvTEZFIiwgQUM5N19TSUdNQVRFTF9JT01JU0MsIDQsIDEsIDApLAorCUFDOTdfU0lOR0xFKCJIZWFkcGhvbmUgKzNkQiBCb29zdCIsIEFDOTdfU0lHTUFURUxfSU9NSVNDLCA4LCAxLCAwKQorfTsKKworc3RhdGljIGludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTc1OF9zcGVjaWZpYyhhYzk3X3QgKmFjOTcpCit7CisJaW50IGVycjsKKworCWVyciA9IHBhdGNoX3NpZ21hdGVsX3N0YWM5N3h4X3NwZWNpZmljKGFjOTcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X3NpZ21hdGVsX3N0YWM5NzU4X2NvbnRyb2xzLAorCQkJCSAgIEFSUkFZX1NJWkUoc25kX2FjOTdfc2lnbWF0ZWxfc3RhYzk3NThfY29udHJvbHMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBEQUMtQSBkaXJlY3QgKi8KKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIkZyb250IFBsYXliYWNrIik7CisJLyogREFDLUEgdG8gTWl4ID0gUENNICovCisJLyogREFDLUIgZGlyZWN0ID0gU3Vycm91bmQgKi8KKwkvKiBEQUMtQiB0byBNaXggKi8KKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiVmlkZW8gUGxheWJhY2siLCAiU3Vycm91bmQgTWl4IFBsYXliYWNrIik7CisJLyogREFDLUMgZGlyZWN0ID0gQ2VudGVyL0xGRSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU4X29wcyA9IHsKKwkuYnVpbGRfM2QJPSBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwMF8zZCwKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF9zaWdtYXRlbF9zdGFjOTc1OF9zcGVjaWZpYworfTsKKworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU4KGFjOTdfdCAqIGFjOTcpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHJlZ3NbNF0gPSB7CisJCUFDOTdfU0lHTUFURUxfT1VUU0VMLAorCQlBQzk3X1NJR01BVEVMX0lPTUlTQywKKwkJQUM5N19TSUdNQVRFTF9JTlNFTCwKKwkJQUM5N19TSUdNQVRFTF9WQVJJT1VTCisJfTsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVmX3JlZ3NbNF0gPSB7CisJCS8qIE9VVFNFTCAqLyAweGQ3OTQsIC8qIENMOkNMLCBTUjpTUiwgTE86TVgsIExJOkRTLCBNSTpEUyAqLworCQkvKiBJT01JU0MgKi8gMHgyMDAxLAorCQkvKiBJTlNFTCAqLyAweDAyMDEsIC8qIExJOkxJLCBNSTpNMSAqLworCQkvKiBWQVJJT1VTICovIDB4MDA0MAorCX07CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IG02NzVfcmVnc1s0XSA9IHsKKwkJLyogT1VUU0VMICovIDB4ZmM3MCwgLyogQ0w6TVgsIFNSOk1YLCBMTzpEUywgTEk6TVgsIE1JOkRTICovCisJCS8qIElPTUlTQyAqLyAweDIxMDIsIC8qIEhQIGFtcCBvbiAqLworCQkvKiBJTlNFTCAqLyAweDAyMDMsIC8qIExJOkxJLCBNSTpGUiAqLworCQkvKiBWQVJJT1VTICovIDB4MDA0MSAvKiBzdGVyZW8gbWljICovCisJfTsKKwl1bnNpZ25lZCBzaG9ydCAqcHJlZ3MgPSBkZWZfcmVnczsKKwlpbnQgaTsKKworCS8qIEdhdGV3YXkgTTY3NSBub3RlYm9vayAqLworCWlmIChhYzk3LT5wY2kgJiYgCisJICAgIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDdiICYmCisJICAgIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwNjAxKQorCSAgICAJcHJlZ3MgPSBtNjc1X3JlZ3M7CisKKwkvLyBwYXRjaCBmb3IgU2lnbWFUZWwKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3NThfb3BzOworCS8qIEZJWE1FOiBhc3N1bWUgb25seSBwYWdlIDAgZm9yIHdyaXRpbmcgY2FjaGUgKi8KKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIEFDOTdfUEFHRV9NQVNLLCBBQzk3X1BBR0VfVkVORE9SKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCByZWdzW2ldLCBwcmVnc1tpXSk7CisKKwlhYzk3LT5mbGFncyB8PSBBQzk3X1NURVJFT19NVVRFUzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENpcnJ1cyBMb2dpYyBDUzQyeHggY29kZWNzCisgKi8KK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY2lycnVzX2NvbnRyb2xzX3NwZGlmWzJdID0geworCUFDOTdfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpLCBBQzk3X0NTUl9TUERJRiwgMTUsIDEsIDApLAorCUFDOTdfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiQUM5Ny1TUFNBIiwgQUM5N19DU1JfQUNNT0RFLCAwLCAzLCAwKQorfTsKKworc3RhdGljIGludCBwYXRjaF9jaXJydXNfYnVpbGRfc3BkaWYoYWM5N190ICogYWM5NykKK3sKKwlpbnQgZXJyOworCisJLyogY29uIG1hc2ssIHBybyBtYXNrLCBkZWZhdWx0ICovCisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfY29udHJvbHNfc3BkaWZbMF0sIDMpKSA8IDApCisJCXJldHVybiBlcnI7CisJLyogc3dpdGNoLCBzcHNhICovCisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfY2lycnVzX2NvbnRyb2xzX3NwZGlmWzBdLCAxKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN3aXRjaCAoYWM5Ny0+aWQgJiBBQzk3X0lEX0NTX01BU0spIHsKKwljYXNlIEFDOTdfSURfQ1M0MjA1OgorCQlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19jaXJydXNfY29udHJvbHNfc3BkaWZbMV0sIDEpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwl9CisJLyogc2V0IGRlZmF1bHQgUENNIFMvUERJRiBwYXJhbXMgKi8KKwkvKiBjb25zdW1lcixQQ00gYXVkaW8sbm8gY29weXJpZ2h0LG5vIHByZWVtcGhhc2lzLFBDTSBjb2RlcixvcmlnaW5hbCw0ODAwMEh6ICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19DU1JfU1BESUYsIDB4MGEyMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2NpcnJ1c19vcHMgPSB7CisJLmJ1aWxkX3NwZGlmID0gcGF0Y2hfY2lycnVzX2J1aWxkX3NwZGlmCit9OworCitpbnQgcGF0Y2hfY2lycnVzX3NwZGlmKGFjOTdfdCAqIGFjOTcpCit7CisJLyogQmFzaWNhbGx5LCB0aGUgY3M0MjAxL2NzNDIwNS9jczQyOTdhIGhhcyBub24tc3RhbmRhcmQgc3AvZGlmIHJlZ2lzdGVycy4KKwkgICBXSFkgQ0FOJ1QgQU5ZT05FIEZPTExPVyBUSEUgQkxPT0RZIFNQRUM/ICAqc2lnaCoKKwkgICAtIHNwL2RpZiBFQSBJRCBpcyBub3Qgc2V0LCBidXQgc3AvZGlmIGlzIGFsd2F5cyBwcmVzZW50LgorCSAgIC0gZW5hYmxlL2Rpc2FibGUgaXMgc3BkaWYgcmVnaXN0ZXIgYml0IDE1LgorCSAgIC0gc3AvZGlmIGNvbnRyb2wgcmVnaXN0ZXIgaXMgMHg2OC4gIGRpZmZlcnMgZnJvbSBBQzk3OgorCSAgIC0gdmFsaWQgaXMgYml0IDE0ICh2cyAxNSkKKwkgICAtIG5vIERSUworCSAgIC0gb25seSA0NC4xLzQ4ayBbMDAgPSA0OCwgMDE9NDQsMV0gKEFDOTcgaXMgMDA9NDQuMSwgMTA9NDgpCisJICAgLSBzcC9kaWYgc3NvdXJjZSBzZWxlY3QgaXMgaW4gMHg1ZSBiaXRzIDAsMS4KKwkqLworCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2NpcnJ1c19vcHM7CisJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19DU19TUERJRjsgCisJYWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19TUERJRl0gJj0gflNORFJWX1BDTV9SQVRFXzMyMDAwOworICAgICAgICBhYzk3LT5leHRfaWQgfD0gQUM5N19FSV9TUERJRjsJLyogZm9yY2UgdGhlIGRldGVjdGlvbiBvZiBzcGRpZiAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQ1NSX0FDTU9ERSwgMHgwMDgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhdGNoX2NpcnJ1c19jczQyOTkoYWM5N190ICogYWM5NykKK3sKKwkvKiBmb3JjZSB0aGUgZGV0ZWN0aW9uIG9mIFBDIEJlZXAgKi8KKwlhYzk3LT5mbGFncyB8PSBBQzk3X0hBU19QQ19CRUVQOworCQorCXJldHVybiBwYXRjaF9jaXJydXNfc3BkaWYoYWM5Nyk7Cit9CisKKy8qCisgKiBDb25leGFudCBjb2RlY3MKKyAqLworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb25leGFudF9jb250cm9sc19zcGRpZlsxXSA9IHsKKwlBQzk3X1NJTkdMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssU1dJVENIKSwgQUM5N19DWFJfQVVESU9fTUlTQywgMywgMSwgMCksCit9OworCitzdGF0aWMgaW50IHBhdGNoX2NvbmV4YW50X2J1aWxkX3NwZGlmKGFjOTdfdCAqIGFjOTcpCit7CisJaW50IGVycjsKKworCS8qIGNvbiBtYXNrLCBwcm8gbWFzaywgZGVmYXVsdCAqLworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2NvbnRyb2xzX3NwZGlmWzBdLCAzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIHN3aXRjaCAqLworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2NvbmV4YW50X2NvbnRyb2xzX3NwZGlmWzBdLCAxKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIHNldCBkZWZhdWx0IFBDTSBTL1BESUYgcGFyYW1zICovCisJLyogY29uc3VtZXIsUENNIGF1ZGlvLG5vIGNvcHlyaWdodCxubyBwcmVlbXBoYXNpcyxQQ00gY29kZXIsb3JpZ2luYWwsNDgwMDBIeiAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQ1hSX0FVRElPX01JU0MsCisJCQkgICAgIHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19DWFJfQVVESU9fTUlTQykgJiB+KEFDOTdfQ1hSX1NQRElGRU58QUM5N19DWFJfQ09QWVJHVHxBQzk3X0NYUl9TUERJRl9NQVNLKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2NvbmV4YW50X29wcyA9IHsKKwkuYnVpbGRfc3BkaWYgPSBwYXRjaF9jb25leGFudF9idWlsZF9zcGRpZgorfTsKKworaW50IHBhdGNoX2NvbmV4YW50KGFjOTdfdCAqIGFjOTcpCit7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2NvbmV4YW50X29wczsKKwlhYzk3LT5mbGFncyB8PSBBQzk3X0NYX1NQRElGOworICAgICAgICBhYzk3LT5leHRfaWQgfD0gQUM5N19FSV9TUERJRjsJLyogZm9yY2UgdGhlIGRldGVjdGlvbiBvZiBzcGRpZiAqLworCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZdID0gU05EUlZfUENNX1JBVEVfNDgwMDA7IC8qIDQ4ayBvbmx5ICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbmFsb2cgRGV2aWNlIEFEMTh4eCwgQUQxOXh4IGNvZGVjcworICovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBhZDE4eHhfcmVzdW1lKGFjOTdfdCAqYWM5NykKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2V0dXBfcmVnc1tdID0geworCQlBQzk3X0FEX01JU0MsIEFDOTdfQURfU0VSSUFMX0NGRywgQUM5N19BRF9KQUNLX1NQRElGLAorCX07CisJaW50IGksIGNvZGVjOworCisJZm9yIChpID0gMDsgaSA8IChpbnQpQVJSQVlfU0laRShzZXR1cF9yZWdzKTsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IHJlZyA9IHNldHVwX3JlZ3NbaV07CisJCWlmICh0ZXN0X2JpdChyZWcsIGFjOTctPnJlZ19hY2Nlc3NlZCkpIHsKKwkJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIHJlZywgYWM5Ny0+cmVnc1tyZWddKTsKKwkJCXNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKTsKKwkJfQorCX0KKworCWlmICghIChhYzk3LT5mbGFncyAmIEFDOTdfQURfTVVMVEkpKQorCQkvKiBub3JtYWwgcmVzdG9yZSAqLworCQlzbmRfYWM5N19yZXN0b3JlX3N0YXR1cyhhYzk3KTsKKwllbHNlIHsKKwkJLyogcmVzdG9yZSB0aGUgQUQxOHh4IGNvZGVjIGNvbmZpZ3VyYXRpb25zICovCisJCWZvciAoY29kZWMgPSAwOyBjb2RlYyA8IDM7IGNvZGVjKyspIHsKKwkJCWlmICghIGFjOTctPnNwZWMuYWQxOHh4LmlkW2NvZGVjXSkKKwkJCQljb250aW51ZTsKKwkJCS8qIHNlbGVjdCBzaW5nbGUgY29kZWMgKi8KKwkJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHg3MDAwLAorCQkJCQkgICAgIGFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFtjb2RlY10gfCBhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVkW2NvZGVjXSk7CisJCQlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgQUM5N19BRF9DT0RFQ19DRkcsIGFjOTctPnNwZWMuYWQxOHh4LmNvZGVjX2NmZ1tjb2RlY10pOworCQl9CisJCS8qIHNlbGVjdCBhbGwgY29kZWNzICovCisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHg3MDAwLCAweDcwMDApOworCisJCS8qIHJlc3RvcmUgc3RhdHVzICovCisJCWZvciAoaSA9IDI7IGkgPCAweDdjIDsgaSArPSAyKSB7CisJCQlpZiAoaSA9PSBBQzk3X1BPV0VSRE9XTiB8fCBpID09IEFDOTdfRVhURU5ERURfSUQpCisJCQkJY29udGludWU7CisJCQlpZiAodGVzdF9iaXQoaSwgYWM5Ny0+cmVnX2FjY2Vzc2VkKSkgeworCQkJCS8qIGhhbmRsZSBtdWx0aSBjb2RlY3MgZm9yIEFEMTh4eCAqLworCQkJCWlmIChpID09IEFDOTdfUENNKSB7CisJCQkJCWZvciAoY29kZWMgPSAwOyBjb2RlYyA8IDM7IGNvZGVjKyspIHsKKwkJCQkJCWlmICghIGFjOTctPnNwZWMuYWQxOHh4LmlkW2NvZGVjXSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCS8qIHNlbGVjdCBzaW5nbGUgY29kZWMgKi8KKwkJCQkJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHg3MDAwLAorCQkJCQkJCQkgICAgIGFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFtjb2RlY10gfCBhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVkW2NvZGVjXSk7CisJCQkJCQkvKiB1cGRhdGUgUENNIGJpdHMgKi8KKwkJCQkJCWFjOTctPmJ1cy0+b3BzLT53cml0ZShhYzk3LCBBQzk3X1BDTSwgYWM5Ny0+c3BlYy5hZDE4eHgucGNtcmVnW2NvZGVjXSk7CisJCQkJCX0KKwkJCQkJLyogc2VsZWN0IGFsbCBjb2RlY3MgKi8KKwkJCQkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLCAweDcwMDAsIDB4NzAwMCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoaSA9PSBBQzk3X0FEX1RFU1QgfHwKKwkJCQkJICAgaSA9PSBBQzk3X0FEX0NPREVDX0NGRyB8fAorCQkJCQkgICBpID09IEFDOTdfQURfU0VSSUFMX0NGRykKKwkJCQkJY29udGludWU7IC8qIGlnbm9yZSAqLworCQkJfQorCQkJc25kX2FjOTdfd3JpdGUoYWM5NywgaSwgYWM5Ny0+cmVnc1tpXSk7CisJCQlzbmRfYWM5N19yZWFkKGFjOTcsIGkpOworCQl9CisJfQorCisJc25kX2FjOTdfcmVzdG9yZV9pZWM5NTgoYWM5Nyk7Cit9CisjZW5kaWYKKworaW50IHBhdGNoX2FkMTgxOShhYzk3X3QgKiBhYzk3KQoreworCXVuc2lnbmVkIHNob3J0IHNjZmc7CisKKwkvLyBwYXRjaCBmb3IgQW5hbG9nIERldmljZXMKKwlzY2ZnID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgc2NmZyB8IDB4NzAwMCk7IC8qIHNlbGVjdCBhbGwgY29kZWNzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwYXRjaF9hZDE4ODFfdW5jaGFpbmVkKGFjOTdfdCAqIGFjOTcsIGludCBpZHgsIHVuc2lnbmVkIHNob3J0IG1hc2spCit7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJLy8gdGVzdCBmb3IgdW5jaGFpbmVkIGNvZGVjCisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLCAweDcwMDAsIG1hc2spOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfQ09ERUNfQ0ZHLCAweDAwMDApOwkvKiBJRDBDLCBJRDFDLCBTRElFID0gb2ZmICovCisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDIpOworCWlmICgodmFsICYgMHhmZjQwKSAhPSAweDUzNDApCisJCXJldHVybiAwOworCWFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFtpZHhdID0gbWFzazsKKwlhYzk3LT5zcGVjLmFkMTh4eC5pZFtpZHhdID0gdmFsOworCWFjOTctPnNwZWMuYWQxOHh4LmNvZGVjX2NmZ1tpZHhdID0gMHgwMDAwOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IHBhdGNoX2FkMTg4MV9jaGFpbmVkMShhYzk3X3QgKiBhYzk3LCBpbnQgaWR4LCB1bnNpZ25lZCBzaG9ydCBjb2RlY19iaXRzKQoreworCXN0YXRpYyBpbnQgY2ZnX2JpdHNbM10gPSB7IDE8PDEyLCAxPDwxNCwgMTw8MTMgfTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJCisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLCAweDcwMDAsIGNmZ19iaXRzW2lkeF0pOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfQ09ERUNfQ0ZHLCAweDAwMDQpOwkvLyBTRElFCisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDIpOworCWlmICgodmFsICYgMHhmZjQwKSAhPSAweDUzNDApCisJCXJldHVybiAwOworCWlmIChjb2RlY19iaXRzKQorCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FEX0NPREVDX0NGRywgY29kZWNfYml0cyk7CisJYWM5Ny0+c3BlYy5hZDE4eHguY2hhaW5lZFtpZHhdID0gY2ZnX2JpdHNbaWR4XTsKKwlhYzk3LT5zcGVjLmFkMTh4eC5pZFtpZHhdID0gdmFsOworCWFjOTctPnNwZWMuYWQxOHh4LmNvZGVjX2NmZ1tpZHhdID0gY29kZWNfYml0cyA/IGNvZGVjX2JpdHMgOiAweDAwMDQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX2FkMTg4MV9jaGFpbmVkKGFjOTdfdCAqIGFjOTcsIGludCB1bmNoYWluZWRfaWR4LCBpbnQgY2lkeDEsIGludCBjaWR4MikKK3sKKwkvLyBhbHJlYWR5IGRldGVjdGVkPworCWlmIChhYzk3LT5zcGVjLmFkMTh4eC51bmNoYWluZWRbY2lkeDFdIHx8IGFjOTctPnNwZWMuYWQxOHh4LmNoYWluZWRbY2lkeDFdKQorCQljaWR4MSA9IC0xOworCWlmIChhYzk3LT5zcGVjLmFkMTh4eC51bmNoYWluZWRbY2lkeDJdIHx8IGFjOTctPnNwZWMuYWQxOHh4LmNoYWluZWRbY2lkeDJdKQorCQljaWR4MiA9IC0xOworCWlmIChjaWR4MSA8IDAgJiYgY2lkeDIgPCAwKQorCQlyZXR1cm47CisJLy8gdGVzdCBmb3IgY2hhaW5lZCBjb2RlY3MKKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcsIDB4NzAwMCwKKwkJCSAgICAgYWM5Ny0+c3BlYy5hZDE4eHgudW5jaGFpbmVkW3VuY2hhaW5lZF9pZHhdKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FEX0NPREVDX0NGRywgMHgwMDAyKTsJCS8vIElEMUMKKwlhYzk3LT5zcGVjLmFkMTh4eC5jb2RlY19jZmdbdW5jaGFpbmVkX2lkeF0gPSAweDAwMDI7CisJaWYgKGNpZHgxID49IDApIHsKKwkJaWYgKHBhdGNoX2FkMTg4MV9jaGFpbmVkMShhYzk3LCBjaWR4MSwgMHgwMDA2KSkJCS8vIFNESUUgfCBJRDFDCisJCQlwYXRjaF9hZDE4ODFfY2hhaW5lZDEoYWM5NywgY2lkeDIsIDApOworCQllbHNlIGlmIChwYXRjaF9hZDE4ODFfY2hhaW5lZDEoYWM5NywgY2lkeDIsIDB4MDAwNikpCS8vIFNESUUgfCBJRDFDCisJCQlwYXRjaF9hZDE4ODFfY2hhaW5lZDEoYWM5NywgY2lkeDEsIDApOworCX0gZWxzZSBpZiAoY2lkeDIgPj0gMCkgeworCQlwYXRjaF9hZDE4ODFfY2hhaW5lZDEoYWM5NywgY2lkeDIsIDApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfYWQxODgxX2J1aWxkX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lID0gYWQxOHh4X3Jlc3VtZQorI2VuZGlmCit9OworCitpbnQgcGF0Y2hfYWQxODgxKGFjOTdfdCAqIGFjOTcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY2ZnX2lkeHNbM11bMl0gPSB7CisJCXsyLCAxfSwKKwkJezAsIDJ9LAorCQl7MCwgMX0KKwl9OworCQorCS8vIHBhdGNoIGZvciBBbmFsb2cgRGV2aWNlcworCXVuc2lnbmVkIHNob3J0IGNvZGVjc1szXTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJaW50IGlkeCwgbnVtOworCisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgdmFsKTsKKwljb2RlY3NbMF0gPSBwYXRjaF9hZDE4ODFfdW5jaGFpbmVkKGFjOTcsIDAsICgxPDwxMikpOworCWNvZGVjc1sxXSA9IHBhdGNoX2FkMTg4MV91bmNoYWluZWQoYWM5NywgMSwgKDE8PDE0KSk7CisJY29kZWNzWzJdID0gcGF0Y2hfYWQxODgxX3VuY2hhaW5lZChhYzk3LCAyLCAoMTw8MTMpKTsKKworCXNuZF9ydW50aW1lX2NoZWNrKGNvZGVjc1swXSB8IGNvZGVjc1sxXSB8IGNvZGVjc1syXSwgZ290byBfX2VuZCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDM7IGlkeCsrKQorCQlpZiAoYWM5Ny0+c3BlYy5hZDE4eHgudW5jaGFpbmVkW2lkeF0pCisJCQlwYXRjaF9hZDE4ODFfY2hhaW5lZChhYzk3LCBpZHgsIGNmZ19pZHhzW2lkeF1bMF0sIGNmZ19pZHhzW2lkeF1bMV0pOworCisJaWYgKGFjOTctPnNwZWMuYWQxOHh4LmlkWzFdKSB7CisJCWFjOTctPmZsYWdzIHw9IEFDOTdfQURfTVVMVEk7CisJCWFjOTctPnNjYXBzIHw9IEFDOTdfU0NBUF9TVVJST1VORF9EQUM7CisJfQorCWlmIChhYzk3LT5zcGVjLmFkMTh4eC5pZFsyXSkgeworCQlhYzk3LT5mbGFncyB8PSBBQzk3X0FEX01VTFRJOworCQlhYzk3LT5zY2FwcyB8PSBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUM7CisJfQorCisgICAgICBfX2VuZDoKKwkvKiBzZWxlY3QgYWxsIGNvZGVjcyAqLworCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHg3MDAwLCAweDcwMDApOworCS8qIGNoZWNrIGlmIG9ubHkgb25lIGNvZGVjIGlzIHByZXNlbnQgKi8KKwlmb3IgKGlkeCA9IG51bSA9IDA7IGlkeCA8IDM7IGlkeCsrKQorCQlpZiAoYWM5Ny0+c3BlYy5hZDE4eHguaWRbaWR4XSkKKwkJCW51bSsrOworCWlmIChudW0gPT0gMSkgeworCQkvKiBvaywgZGVzZWxlY3QgYWxsIElEIGJpdHMgKi8KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BRF9DT0RFQ19DRkcsIDB4MDAwMCk7CisJCWFjOTctPnNwZWMuYWQxOHh4LmNvZGVjX2NmZ1swXSA9IAorCQkJYWM5Ny0+c3BlYy5hZDE4eHguY29kZWNfY2ZnWzFdID0gCisJCQlhYzk3LT5zcGVjLmFkMTh4eC5jb2RlY19jZmdbMl0gPSAweDAwMDA7CisJfQorCS8qIHJlcXVpcmVkIGZvciBBRDE4ODYvQUQxODg1IGNvbWJpbmF0aW9uICovCisJYWM5Ny0+ZXh0X2lkID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX0lEKTsKKwlpZiAoYWM5Ny0+c3BlYy5hZDE4eHguaWRbMF0pIHsKKwkJYWM5Ny0+aWQgJj0gMHhmZmZmMDAwMDsKKwkJYWM5Ny0+aWQgfD0gYWM5Ny0+c3BlYy5hZDE4eHguaWRbMF07CisJfQorCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hZDE4ODFfYnVpbGRfb3BzOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2FkMTg4NVtdID0geworCUFDOTdfU0lOR0xFKCJEaWdpdGFsIE1vbm8gRGlyZWN0IiwgQUM5N19BRF9NSVNDLCAxMSwgMSwgMCksCisJLyogQUM5N19TSU5HTEUoIkRpZ2l0YWwgQXVkaW8gTW9kZSIsIEFDOTdfQURfTUlTQywgMTIsIDEsIDApLCAqLyAvKiBzZWVtcyBwcm9ibGVtYXRpYyAqLworCUFDOTdfU0lOR0xFKCJMb3cgUG93ZXIgTWl4ZXIiLCBBQzk3X0FEX01JU0MsIDE0LCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiWmVybyBGaWxsIERBQyIsIEFDOTdfQURfTUlTQywgMTUsIDEsIDApLAorCUFDOTdfU0lOR0xFKCJIZWFkcGhvbmUgSmFjayBTZW5zZSIsIEFDOTdfQURfSkFDS19TUERJRiwgOSwgMSwgMSksIC8qIGludmVydGVkICovCisJQUM5N19TSU5HTEUoIkxpbmUgSmFjayBTZW5zZSIsIEFDOTdfQURfSkFDS19TUERJRiwgOCwgMSwgMSksIC8qIGludmVydGVkICovCit9OworCitzdGF0aWMgaW50IHBhdGNoX2FkMTg4NV9zcGVjaWZpYyhhYzk3X3QgKiBhYzk3KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2NvbnRyb2xzX2FkMTg4NSwgQVJSQVlfU0laRShzbmRfYWM5N19jb250cm9sc19hZDE4ODUpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9hZDE4ODVfYnVpbGRfb3BzID0geworCS5idWlsZF9zcGVjaWZpYyA9ICZwYXRjaF9hZDE4ODVfc3BlY2lmaWMsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGFkMTh4eF9yZXN1bWUKKyNlbmRpZgorfTsKKworaW50IHBhdGNoX2FkMTg4NShhYzk3X3QgKiBhYzk3KQoreworCXBhdGNoX2FkMTg4MShhYzk3KTsKKwkvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGRlYWwgd2l0aCB0aGUgSW50ZWwgRDgxNUVFQUwyICovCisJLyogaS5lLiBMaW5lIG91dCBpcyBhY3R1YWxseSBoZWFkcGhvbmUgb3V0IGZyb20gY29kZWMgKi8KKworCS8qIHNldCBkZWZhdWx0ICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BRF9NSVNDLCAweDA0MDQpOworCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTg4NV9idWlsZF9vcHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXRjaF9hZDE4ODYoYWM5N190ICogYWM5NykKK3sKKwlwYXRjaF9hZDE4ODEoYWM5Nyk7CisJLyogUHJlc2FyaW83MDAgd29ya2Fyb3VuZCAqLworCS8qIGZvciBKYWNrIFNlbnNlL1NQRElGIFJlZ2lzdGVyIG1pc2V0dGluZyBjYXVzaW5nICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BRF9KQUNLX1NQRElGLCAweDAwMTApOworCXJldHVybiAwOworfQorCisvKiBNSVNDIGJpdHMgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfTUJDCQkweDAwMDMJLyogbWljIGJvb3N0ICovCisjZGVmaW5lIEFDOTdfQUQxOThYX01CQ18yMAkweDAwMDAJLyogKzIwZEIgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfTUJDXzEwCTB4MDAwMQkvKiArMTBkQiAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9NQkNfMzAJMHgwMDAyCS8qICszMGRCICovCisjZGVmaW5lIEFDOTdfQUQxOThYX1ZSRUZECTB4MDAwNAkvKiBWUkVGIGhpZ2gtWiAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9WUkVGSAkweDAwMDgJLyogMi4yNVYsIDMuN1YgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRl8wCTB4MDAwYwkvKiAwViAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9TUlUJCTB4MDAxMAkvKiBzYW1wbGUgcmF0ZSB1bmxvY2sgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfTE9TRUwJMHgwMDIwCS8qIExJTkVfT1VUIGFtcGxpZmllcnMgaW5wdXQgc2VsZWN0ICovCisjZGVmaW5lIEFDOTdfQUQxOThYXzJNSUMJMHgwMDQwCS8qIDItY2hhbm5lbCBtaWMgc2VsZWN0ICovCisjZGVmaW5lIEFDOTdfQUQxOThYX1NQUkQJMHgwMDgwCS8qIFNQUkVBRCBlbmFibGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfRE1JWDAJMHgwMTAwCS8qIGRvd25taXggbW9kZTogMCA9IDYtdG8tNCwgMSA9IDYtdG8tMiBkb3dubWl4ICovCisjZGVmaW5lIEFDOTdfQUQxOThYX0RNSVgxCTB4MDIwMAkvKiBkb3dubWl4IG1vZGU6IDEgPSBlbmFibGVkICovCisjZGVmaW5lIEFDOTdfQUQxOThYX0hQU0VMCTB4MDQwMAkvKiBoZWFkcGhvbmUgYW1wbGlmaWVyIGlucHV0IHNlbGVjdCAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9DTERJUwkweDA4MDAJLyogY2VudGVyL2xmZSBkaXNhYmxlICovCisjZGVmaW5lIEFDOTdfQUQxOThYX0xPRElTCTB4MTAwMAkvKiBMSU5FX09VVCBkaXNhYmxlICovCisjZGVmaW5lIEFDOTdfQUQxOThYX01TUExUCTB4MjAwMAkvKiBtdXRlIHNwbGl0ICovCisjZGVmaW5lIEFDOTdfQUQxOThYX0FDOTdOQwkweDQwMDAJLyogQUM5NyBubyBjb21wYXRpYmxlIG1vZGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfREFDWgkweDgwMDAJLyogREFDIHplcm8tZmlsbCBtb2RlICovCisKKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5OHhfc3BkaWZfc291cmNlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzJdID0geyAiQUMtTGluayIsICJBL0QgQ29udmVydGVyIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4eF9zcGRpZl9zb3VyY2VfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXZhbCA9IGFjOTctPnJlZ3NbQUM5N19BRF9TRVJJQUxfQ0ZHXTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHZhbCA+PiAyKSAmIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTh4X3NwZGlmX3NvdXJjZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IDI7CisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHgwMDA0LCB2YWwpOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2FkMTk4eF9zcGRpZl9zb3VyY2UgPSB7CisJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUJPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlNvdXJjZSIsCisJLmluZm8JPSBzbmRfYWM5N19hZDE5OHhfc3BkaWZfc291cmNlX2luZm8sCisJLmdldAk9IHNuZF9hYzk3X2FkMTk4eF9zcGRpZl9zb3VyY2VfZ2V0LAorCS5wdXQJPSBzbmRfYWM5N19hZDE5OHhfc3BkaWZfc291cmNlX3B1dCwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxOTh4X3Bvc3Rfc3BkaWYoYWM5N190ICogYWM5NykKK3sKKyAJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19hZDE5OHhfc3BkaWZfc291cmNlLCAxKTsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19hZDE5ODF4X2phY2tfc2Vuc2VbXSA9IHsKKwlBQzk3X1NJTkdMRSgiSGVhZHBob25lIEphY2sgU2Vuc2UiLCBBQzk3X0FEX0pBQ0tfU1BESUYsIDExLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiTGluZSBKYWNrIFNlbnNlIiwgQUM5N19BRF9KQUNLX1NQRElGLCAxMiwgMSwgMCksCit9OworCitzdGF0aWMgaW50IHBhdGNoX2FkMTk4MWFfc3BlY2lmaWMoYWM5N190ICogYWM5NykKK3sKKwlyZXR1cm4gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfYWQxOTgxeF9qYWNrX3NlbnNlLAorCQkJCSAgICBBUlJBWV9TSVpFKHNuZF9hYzk3X2FkMTk4MXhfamFja19zZW5zZSkpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9hZDE5ODFhX2J1aWxkX29wcyA9IHsKKwkuYnVpbGRfcG9zdF9zcGRpZiA9IHBhdGNoX2FkMTk4eF9wb3N0X3NwZGlmLAorCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX2FkMTk4MWFfc3BlY2lmaWMsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGFkMTh4eF9yZXN1bWUKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgY2hlY2tfYWQxOTgxX2hwX2phY2tfc2Vuc2UoYWM5N190ICphYzk3KQoreworCXUzMiBzdWJpZCA9ICgodTMyKWFjOTctPnN1YnN5c3RlbV92ZW5kb3IgPDwgMTYpIHwgYWM5Ny0+c3Vic3lzdGVtX2RldmljZTsKKwlzd2l0Y2ggKHN1YmlkKSB7CisJY2FzZSAweDEwM2MwODkwOiAvKiBIUCBuYzYwMDAgKi8KKwljYXNlIDB4MTAzYzAwNmQ6IC8qIEhQIG54OTEwNSAqLworCWNhc2UgMHgxNzM0MDA4ODogLyogRlNDIFNjZW5pYy1XICovCisJCS8qIGVuYWJsZSBoZWFkcGhvbmUgamFjayBzZW5zZSAqLworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX0pBQ0tfU1BESUYsIDE8PDExLCAxPDwxMSk7CisJCWJyZWFrOworCX0KK30KKworaW50IHBhdGNoX2FkMTk4MWEoYWM5N190ICphYzk3KQoreworCXBhdGNoX2FkMTg4MShhYzk3KTsKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWQxOTgxYV9idWlsZF9vcHM7CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLCBBQzk3X0FEMTk4WF9NU1BMVCwgQUM5N19BRDE5OFhfTVNQTFQpOworCWFjOTctPmZsYWdzIHw9IEFDOTdfU1RFUkVPX01VVEVTOworCWNoZWNrX2FkMTk4MV9ocF9qYWNrX3NlbnNlKGFjOTcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2FkMTk4eF8yY21pYyA9CitBQzk3X1NJTkdMRSgiU3RlcmVvIE1pYyIsIEFDOTdfQURfTUlTQywgNiwgMSwgMCk7CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxOTgxYl9zcGVjaWZpYyhhYzk3X3QgKmFjOTcpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2FkMTk4eF8yY21pYywgMSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfYWQxOTgxeF9qYWNrX3NlbnNlLAorCQkJCSAgICBBUlJBWV9TSVpFKHNuZF9hYzk3X2FkMTk4MXhfamFja19zZW5zZSkpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9hZDE5ODFiX2J1aWxkX29wcyA9IHsKKwkuYnVpbGRfcG9zdF9zcGRpZiA9IHBhdGNoX2FkMTk4eF9wb3N0X3NwZGlmLAorCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX2FkMTk4MWJfc3BlY2lmaWMsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGFkMTh4eF9yZXN1bWUKKyNlbmRpZgorfTsKKworaW50IHBhdGNoX2FkMTk4MWIoYWM5N190ICphYzk3KQoreworCXBhdGNoX2FkMTg4MShhYzk3KTsKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWQxOTgxYl9idWlsZF9vcHM7CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLCBBQzk3X0FEMTk4WF9NU1BMVCwgQUM5N19BRDE5OFhfTVNQTFQpOworCWFjOTctPmZsYWdzIHw9IEFDOTdfU1RFUkVPX01VVEVTOworCWNoZWNrX2FkMTk4MV9ocF9qYWNrX3NlbnNlKGFjOTcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE4ODhfbG9ocHNlbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXZhbCA9IGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEodmFsICYgQUM5N19BRDE5OFhfTE9TRUwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJdmFsID0gIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdCisJCT8gKEFDOTdfQUQxOThYX0xPU0VMIHwgQUM5N19BRDE5OFhfSFBTRUwpIDogMDsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLAorCQkJCSAgICBBQzk3X0FEMTk4WF9MT1NFTCB8IEFDOTdfQUQxOThYX0hQU0VMLCB2YWwpOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTg4OF9kb3dubWl4X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbM10gPSB7Ik9mZiIsICI2IC0+IDQiLCAiNiAtPiAyIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxODg4X2Rvd25taXhfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfQURfTUlTQ107CisJaWYgKCEodmFsICYgQUM5N19BRDE5OFhfRE1JWDEpKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMDsKKwllbHNlCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAxICsgKCh2YWwgPj4gOCkgJiAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gMCkKKwkJdmFsID0gMDsKKwllbHNlCisJCXZhbCA9IEFDOTdfQUQxOThYX0RNSVgxIHwKKwkJCSgodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAtIDEpIDw8IDgpOworCXJldHVybiBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX01JU0MsCisJCQkJICAgIEFDOTdfQUQxOThYX0RNSVgwIHwgQUM5N19BRDE5OFhfRE1JWDEsIHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfYWQxODg4X2NvbnRyb2xzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRXhjaGFuZ2UgRnJvbnQvU3Vycm91bmQiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE4ODhfbG9ocHNlbF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE4ODhfbG9ocHNlbF9wdXQKKwl9LAorCUFDOTdfU0lOR0xFKCJTcHJlYWQgRnJvbnQgdG8gU3Vycm91bmQgYW5kIENlbnRlci9MRkUiLCBBQzk3X0FEX01JU0MsIDcsIDEsIDApLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRvd25taXgiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTg4OF9kb3dubWl4X2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9wdXQKKwl9LAorCUFDOTdfU0lOR0xFKCJTdXJyb3VuZCBKYWNrIGFzIElucHV0IiwgQUM5N19BRF9NSVNDLCAxMiwgMSwgMCksCisJQUM5N19TSU5HTEUoIkNlbnRlci9MRkUgSmFjayBhcyBJbnB1dCIsIEFDOTdfQURfTUlTQywgMTEsIDEsIDApLAorfTsKKworc3RhdGljIGludCBwYXRjaF9hZDE4ODhfc3BlY2lmaWMoYWM5N190ICphYzk3KQoreworCS8qIHJlbmFtZSAweDA0IGFzICJNYXN0ZXIiIGFuZCAweDAyIGFzICJNYXN0ZXIgU3Vycm91bmQiICovCisJc25kX2FjOTdfcmVuYW1lX3ZvbF9jdGwoYWM5NywgIk1hc3RlciBQbGF5YmFjayIsICJNYXN0ZXIgU3Vycm91bmQgUGxheWJhY2siKTsKKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIk1hc3RlciBQbGF5YmFjayIpOworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19hZDE4ODhfY29udHJvbHMsIEFSUkFZX1NJWkUoc25kX2FjOTdfYWQxODg4X2NvbnRyb2xzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2FkMTg4OF9idWlsZF9vcHMgPSB7CisJLmJ1aWxkX3Bvc3Rfc3BkaWYgPSBwYXRjaF9hZDE5OHhfcG9zdF9zcGRpZiwKKwkuYnVpbGRfc3BlY2lmaWMgPSBwYXRjaF9hZDE4ODhfc3BlY2lmaWMsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGFkMTh4eF9yZXN1bWUKKyNlbmRpZgorfTsKKworaW50IHBhdGNoX2FkMTg4OChhYzk3X3QgKiBhYzk3KQoreworCXVuc2lnbmVkIHNob3J0IG1pc2M7CisJCisJcGF0Y2hfYWQxODgxKGFjOTcpOworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hZDE4ODhfYnVpbGRfb3BzOworCS8qIFN3aXRjaCBGUk9OVC9TVVJST1VORCBMSU5FLU9VVC9IUC1PVVQgZGVmYXVsdCBjb25uZWN0aW9uICovCisJLyogaXQgc2VlbXMgdGhhdCBtb3N0IHZlbmRvcnMgY29ubmVjdCBsaW5lLW91dCBjb25uZWN0b3IgdG8gaGVhZHBob25lIG91dCBvZiBBQyc5NyAqLworCS8qIEFELWNvbXBhdGlibGUgbW9kZSAqLworCS8qIFN0ZXJlbyBtdXRlcyBlbmFibGVkICovCisJbWlzYyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19BRF9NSVNDKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FEX01JU0MsIG1pc2MgfAorCQkJICAgICBBQzk3X0FEMTk4WF9MT1NFTCB8CisJCQkgICAgIEFDOTdfQUQxOThYX0hQU0VMIHwKKwkJCSAgICAgQUM5N19BRDE5OFhfTVNQTFQgfAorCQkJICAgICBBQzk3X0FEMTk4WF9BQzk3TkMpOworCWFjOTctPmZsYWdzIHw9IEFDOTdfU1RFUkVPX01VVEVTOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhdGNoX2FkMTk4MF9zcGVjaWZpYyhhYzk3X3QgKmFjOTcpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGF0Y2hfYWQxODg4X3NwZWNpZmljKGFjOTcpKSA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19hZDE5OHhfMmNtaWMsIDEpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9hZDE5ODBfYnVpbGRfb3BzID0geworCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfYWQxOTh4X3Bvc3Rfc3BkaWYsCisJLmJ1aWxkX3NwZWNpZmljID0gcGF0Y2hfYWQxOTgwX3NwZWNpZmljLAorI2lmZGVmIENPTkZJR19QTQorCS5yZXN1bWUgPSBhZDE4eHhfcmVzdW1lCisjZW5kaWYKK307CisKK2ludCBwYXRjaF9hZDE5ODAoYWM5N190ICogYWM5NykKK3sKKwlwYXRjaF9hZDE4ODgoYWM5Nyk7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTk4MF9idWlsZF9vcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfYWQxOTg1X2NvbnRyb2xzW10gPSB7CisJQUM5N19TSU5HTEUoIkNlbnRlci9MRkUgSmFjayBhcyBNaWMiLCBBQzk3X0FEX1NFUklBTF9DRkcsIDksIDEsIDApLAorCUFDOTdfU0lOR0xFKCJFeGNoYW5nZSBDZW50ZXIvTEZFIiwgQUM5N19BRF9TRVJJQUxfQ0ZHLCAzLCAxLCAwKQorfTsKKworc3RhdGljIGludCBwYXRjaF9hZDE5ODVfc3BlY2lmaWMoYWM5N190ICphYzk3KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBhdGNoX2FkMTk4MF9zcGVjaWZpYyhhYzk3KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19hZDE5ODVfY29udHJvbHMsIEFSUkFZX1NJWkUoc25kX2FjOTdfYWQxOTg1X2NvbnRyb2xzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2FkMTk4NV9idWlsZF9vcHMgPSB7CisJLmJ1aWxkX3Bvc3Rfc3BkaWYgPSBwYXRjaF9hZDE5OHhfcG9zdF9zcGRpZiwKKwkuYnVpbGRfc3BlY2lmaWMgPSBwYXRjaF9hZDE5ODVfc3BlY2lmaWMsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGFkMTh4eF9yZXN1bWUKKyNlbmRpZgorfTsKKworaW50IHBhdGNoX2FkMTk4NShhYzk3X3QgKiBhYzk3KQoreworCXVuc2lnbmVkIHNob3J0IG1pc2M7CisJCisJcGF0Y2hfYWQxODgxKGFjOTcpOworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hZDE5ODVfYnVpbGRfb3BzOworCW1pc2MgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQURfTUlTQyk7CisJLyogc3dpdGNoIGZyb250L3N1cnJvdW5kIGxpbmUtb3V0L2hwLW91dCAqLworCS8qIGNlbnRlci9MRkUsIG1pYyBpbiAzLjc1ViBtb2RlICovCisJLyogQUQtY29tcGF0aWJsZSBtb2RlICovCisJLyogU3RlcmVvIG11dGVzIGVuYWJsZWQgKi8KKwkvKiBpbiBhY2NvcmRhbmNlIHdpdGggQURJIGRyaXZlcjogbWlzYyB8IDB4NWMyOCAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfTUlTQywgbWlzYyB8CisJCQkgICAgIEFDOTdfQUQxOThYX1ZSRUZIIHwKKwkJCSAgICAgQUM5N19BRDE5OFhfTE9TRUwgfAorCQkJICAgICBBQzk3X0FEMTk4WF9IUFNFTCB8CisJCQkgICAgIEFDOTdfQUQxOThYX0NMRElTIHwKKwkJCSAgICAgQUM5N19BRDE5OFhfTE9ESVMgfAorCQkJICAgICBBQzk3X0FEMTk4WF9NU1BMVCB8CisJCQkgICAgIEFDOTdfQUQxOThYX0FDOTdOQyk7CisJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19TVEVSRU9fTVVURVM7CisJLyogb24gQUQxOTg1IHJldi4gMywgQUMnOTcgcmV2aXNpb24gYml0cyBhcmUgemVybyAqLworCWFjOTctPmV4dF9pZCA9IChhYzk3LT5leHRfaWQgJiB+QUM5N19FSV9SRVZfTUFTSykgfCBBQzk3X0VJX1JFVl8yMzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWx0ZWsgQUxDNjV4Lzg1MCBjb2RlY3MKKyAqLworc3RhdGljIGludCBzbmRfYWM5N19hbGM2NTBfbWljX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisgICAgICAgIGFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoYWM5Ny0+cmVnc1tBQzk3X0FMQzY1MF9NVUxUSUNIXSA+PiAxMCkgJiAxOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hbGM2NTBfbWljX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisgICAgICAgIGFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlLCB2YWw7CisJdmFsID0gISEoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9NVUxUSUNIKSAmICgxIDw8IDEwKSk7CisJY2hhbmdlID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IHZhbCk7CisJaWYgKGNoYW5nZSkgeworCQkvKiBkaXNhYmxlL2VuYWJsZSB2cmVmICovCisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX0NMT0NLLCAxIDw8IDEyLAorCQkJCSAgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAoMSA8PCAxMikgOiAwKTsKKwkJLyogdHVybiBvbi9vZmYgY2VudGVyLW9uLW1pYyAqLworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxIDw8IDEwLAorCQkJCSAgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAoMSA8PCAxMCkgOiAwKTsKKwkJLyogR1BJTzAgaGlnaCBmb3IgbWljICovCisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX0dQSU9fU1RBVFVTLCAweDEwMCwKKwkJCQkgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IDB4MTAwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NvbnRyb2xzX2FsYzY1MFtdID0geworCUFDOTdfU0lOR0xFKCJEdXBsaWNhdGUgRnJvbnQiLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAwLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiU3Vycm91bmQgRG93biBNaXgiLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiQ2VudGVyL0xGRSBEb3duIE1peCIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDIsIDEsIDApLAorCUFDOTdfU0lOR0xFKCJFeGNoYW5nZSBDZW50ZXIvTEZFIiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMywgMSwgMCksCisJLyogNDogQW5hbG9nIElucHV0IFRvIFN1cnJvdW5kICovCisJLyogNTogQW5hbG9nIElucHV0IFRvIENlbnRlci9MRkUgKi8KKwkvKiA2OiBJbmRlcGVuZGVudCBNYXN0ZXIgVm9sdW1lIFJpZ2h0ICovCisJLyogNzogSW5kZXBlbmRlbnQgTWFzdGVyIFZvbHVtZSBMZWZ0ICovCisJLyogODogcmVzZXJ2ZWQgKi8KKwlBQzk3X1NJTkdMRSgiTGluZS1JbiBBcyBTdXJyb3VuZCIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDksIDEsIDApLAorCS8qIDEwOiBtaWMsIHNlZSBiZWxvdyAqLworCS8qIDExLTEzOiBpbiBJRUM5NTggY29udHJvbHMgKi8KKwlBQzk3X1NJTkdMRSgiU3dhcCBTdXJyb3VuZCBTbG90IiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTQsIDEsIDApLAorI2lmIDAgLyogYWx3YXlzIHNldCBpbiBwYXRjaF9hbGM2NTAgKi8KKwlBQzk3X1NJTkdMRSgiSUVDOTU4IElucHV0IENsb2NrIEVuYWJsZSIsIEFDOTdfQUxDNjUwX0NMT0NLLCAwLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiSUVDOTU4IElucHV0IFBpbiBFbmFibGUiLCBBQzk3X0FMQzY1MF9DTE9DSywgMSwgMSwgMCksCisJQUM5N19TSU5HTEUoIlN1cnJvdW5kIERBQyBTd2l0Y2giLCBBQzk3X0FMQzY1MF9TVVJSX0RBQ19WT0wsIDE1LCAxLCAxKSwKKwlBQzk3X0RPVUJMRSgiU3Vycm91bmQgREFDIFZvbHVtZSIsIEFDOTdfQUxDNjUwX1NVUlJfREFDX1ZPTCwgOCwgMCwgMzEsIDEpLAorCUFDOTdfU0lOR0xFKCJDZW50ZXIvTEZFIERBQyBTd2l0Y2giLCBBQzk3X0FMQzY1MF9MRkVfREFDX1ZPTCwgMTUsIDEsIDEpLAorCUFDOTdfRE9VQkxFKCJDZW50ZXIvTEZFIERBQyBWb2x1bWUiLCBBQzk3X0FMQzY1MF9MRkVfREFDX1ZPTCwgOCwgMCwgMzEsIDEpLAorI2VuZGlmCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWljIEFzIENlbnRlci9MRkUiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2luZm9fdm9sc3csCisJCS5nZXQgPSBzbmRfYWM5N19hbGM2NTBfbWljX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FsYzY1MF9taWNfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKDAsIDAsIDEsIDApIC8qIG9ubHkgbWFzayBuZWVkZWQgKi8KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zcGRpZl9jb250cm9sc19hbGM2NTBbXSA9IHsKKyAgICAgICAgQUM5N19TSU5HTEUoIklFQzk1OCBDYXB0dXJlIFN3aXRjaCIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDExLCAxLCAwKSwKKyAgICAgICAgQUM5N19TSU5HTEUoIkFuYWxvZyB0byBJRUM5NTggT3V0cHV0IiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTIsIDEsIDApLAorCS8qIGRpc2FibGUgdGhpcyBjb250cm9scyBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgKi8KKwkvKiBBQzk3X1NJTkdMRSgiSUVDOTU4IElucHV0IE1vbml0b3IiLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxMywgMSwgMCksICovCit9OworCitzdGF0aWMgaW50IHBhdGNoX2FsYzY1MF9zcGVjaWZpYyhhYzk3X3QgKiBhYzk3KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2NvbnRyb2xzX2FsYzY1MCwgQVJSQVlfU0laRShzbmRfYWM5N19jb250cm9sc19hbGM2NTApKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKSB7CisJCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfc3BkaWZfY29udHJvbHNfYWxjNjUwLCBBUlJBWV9TSVpFKHNuZF9hYzk3X3NwZGlmX2NvbnRyb2xzX2FsYzY1MCkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfYWxjNjUwX29wcyA9IHsKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF9hbGM2NTBfc3BlY2lmaWMKK307CisKK2ludCBwYXRjaF9hbGM2NTAoYWM5N190ICogYWM5NykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWxjNjUwX29wczsKKworCS8qIGRldGVybWluZSB0aGUgcmV2aXNpb24gKi8KKwl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQUxDNjUwX1JFVklTSU9OKSAmIDB4M2Y7CisJaWYgKHZhbCA8IDMpCisJCWFjOTctPmlkID0gMHg0MTRjNDcyMDsgICAgICAgICAgLyogT2xkIHZlcnNpb24gKi8KKwllbHNlIGlmICh2YWwgPCAweDEwKQorCQlhYzk3LT5pZCA9IDB4NDE0YzQ3MjE7ICAgICAgICAgIC8qIEQgdmVyc2lvbiAqLworCWVsc2UgaWYgKHZhbCA8IDB4MjApCisJCWFjOTctPmlkID0gMHg0MTRjNDcyMjsgICAgICAgICAgLyogRSB2ZXJzaW9uICovCisJZWxzZSBpZiAodmFsIDwgMHgzMCkKKwkJYWM5Ny0+aWQgPSAweDQxNGM0NzIzOyAgICAgICAgICAvKiBGIHZlcnNpb24gKi8KKworCS8qIHJldmlzaW9uIEUgb3IgRiAqLworCS8qIEZJWE1FOiB3aGF0IGFib3V0IHJldmlzaW9uIEQgPyAqLworCWFjOTctPnNwZWMuZGV2X2ZsYWdzID0gKGFjOTctPmlkID09IDB4NDE0YzQ3MjIgfHwKKwkJCQlhYzk3LT5pZCA9PSAweDQxNGM0NzIzKTsKKworCS8qIGVuYWJsZSBBQzk3X0FMQzY1MF9HUElPX1NFVFVQLCBBQzk3X0FMQzY1MF9DTE9DSyBmb3IgUi9XICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfR1BJT19TVEFUVVMsIAorCQlzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQUxDNjUwX0dQSU9fU1RBVFVTKSB8IDB4ODAwMCk7CisKKwkvKiBFbmFibGUgU1BESUYtSU4gb25seSBvbiBSZXYuRSBhbmQgYWJvdmUgKi8KKwl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQUxDNjUwX0NMT0NLKTsKKwkvKiBTUERJRiBJTiB3aXRoIHBpbiA0NyAqLworCWlmIChhYzk3LT5zcGVjLmRldl9mbGFncykKKwkJdmFsIHw9IDB4MDM7IC8qIGVuYWJsZSAqLworCWVsc2UKKwkJdmFsICY9IH4weDAzOyAvKiBkaXNhYmxlICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfQ0xPQ0ssIHZhbCk7CisKKwkvKiBzZXQgZGVmYXVsdDogc2xvdCAzLDQsNyw4LDYsOQorCSAgIHNwZGlmLWluIG1vbml0b3Igb2ZmLCBhbmFsb2ctc3BkaWYgb2ZmLCBzcGRpZi1pbiBvZmYKKwkgICBjZW50ZXIgb24gbWljIG9mZiwgc3Vycm91bmQgb24gbGluZS1pbiBvZmYKKwkgICBkb3dubWl4IG9mZiwgZHVwbGljYXRlIGZyb250IG9mZgorCSovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfTVVMVElDSCwgMCk7CisKKwkvKiBzZXQgR1BJTzAgZm9yIG1pYyBiaWFzICovCisJLyogR1BJTzAgcGluIG91dHB1dCwgbm8gaW50ZXJydXB0LCBoaWdoICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfR1BJT19TRVRVUCwKKwkJCSAgICAgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9HUElPX1NFVFVQKSB8IDB4MDEpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQUxDNjUwX0dQSU9fU1RBVFVTLAorCQkJICAgICAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9HUElPX1NUQVRVUykgfCAweDEwMCkgJiB+MHgxMCk7CisKKwkvKiBmdWxsIERBQyB2b2x1bWUgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FMQzY1MF9TVVJSX0RBQ19WT0wsIDB4MDgwOCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfTEZFX0RBQ19WT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWxjNjU1X21pY19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworICAgICAgICBhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGFjOTctPnJlZ3NbQUM5N19BTEM2NTBfTVVMVElDSF0gPj4gMTApICYgMTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWxjNjU1X21pY19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworICAgICAgICBhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwkvKiBtaXNjIGNvbnRyb2w7IHZyZWZvdXQgZGlzYWJsZSAqLworCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX0NMT0NLLCAxIDw8IDEyLAorCQkJICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/ICgxIDw8IDEyKSA6IDApOworCXJldHVybiBhYzk3X3VwZGF0ZV9iaXRzX3BhZ2UoYWM5NywgQUM5N19BTEM2NTBfTVVMVElDSCwgMSA8PCAxMCwKKwkJCQkgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gKDEgPDwgMTApIDogMCwKKwkJCQkgICAgIDApOworfQorCisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY29udHJvbHNfYWxjNjU1W10gPSB7CisJQUM5N19QQUdFX1NJTkdMRSgiRHVwbGljYXRlIEZyb250IiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMCwgMSwgMCwgMCksCisJQUM5N19QQUdFX1NJTkdMRSgiTGluZS1JbiBBcyBTdXJyb3VuZCIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDksIDEsIDAsIDApLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1pYyBBcyBDZW50ZXIvTEZFIiwKKwkJLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAorCQkuZ2V0ID0gc25kX2FjOTdfYWxjNjU1X21pY19nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hbGM2NTVfbWljX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X1NJTkdMRV9WQUxVRSgwLCAwLCAxLCAwKSAvKiBvbmx5IG1hc2sgbmVlZGVkICovCisJfSwKK307CisKK3N0YXRpYyBpbnQgYWxjNjU1X2llYzk1OF9yb3V0ZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzXzY1NVszXSA9IHsgIlBDTSIsICJBbmFsb2cgSW4iLCAiSUVDOTU4IEluIiB9OworCXN0YXRpYyBjaGFyICp0ZXh0c182NThbNF0gPSB7ICJQQ00iLCAiQW5hbG9nMSBJbiIsICJBbmFsb2cyIEluIiwgIklFQzk1OCBJbiIgfTsKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gYWM5Ny0+c3BlYy5kZXZfZmxhZ3MgPyA0IDogMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgYWM5Ny0+c3BlYy5kZXZfZmxhZ3MgPworCSAgICAgICB0ZXh0c182NThbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0gOgorCSAgICAgICB0ZXh0c182NTVbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYzY1NV9pZWM5NThfcm91dGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfQUxDNjUwX01VTFRJQ0hdOworCXZhbCA9ICh2YWwgPj4gMTIpICYgMzsKKwlpZiAoYWM5Ny0+c3BlYy5kZXZfZmxhZ3MgJiYgdmFsID09IDMpCisJCXZhbCA9IDA7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGM2NTVfaWVjOTU4X3JvdXRlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlyZXR1cm4gYWM5N191cGRhdGVfYml0c19wYWdlKGFjOTcsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDMgPDwgMTIsCisJCQkJICAgICAodW5zaWduZWQgc2hvcnQpdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCAxMiwKKwkJCQkgICAgIDApOworfQorCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X3NwZGlmX2NvbnRyb2xzX2FsYzY1NVtdID0geworICAgICAgICBBQzk3X1BBR0VfU0lOR0xFKCJJRUM5NTggQ2FwdHVyZSBTd2l0Y2giLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxMSwgMSwgMCwgMCksCisJLyogZGlzYWJsZSB0aGlzIGNvbnRyb2xzIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCAqLworICAgICAgICAvKiBBQzk3X1BBR0VfU0lOR0xFKCJJRUM5NTggSW5wdXQgTW9uaXRvciIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDE0LCAxLCAwLCAwKSwgKi8KKwl7CisJCS5pZmFjZSAgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgICA9ICJJRUM5NTggUGxheWJhY2sgUm91dGUiLAorCQkuaW5mbyAgID0gYWxjNjU1X2llYzk1OF9yb3V0ZV9pbmZvLAorCQkuZ2V0ICAgID0gYWxjNjU1X2llYzk1OF9yb3V0ZV9nZXQsCisJCS5wdXQgICAgPSBhbGM2NTVfaWVjOTU4X3JvdXRlX3B1dCwKKwl9LAorfTsKKworc3RhdGljIGludCBwYXRjaF9hbGM2NTVfc3BlY2lmaWMoYWM5N190ICogYWM5NykKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19jb250cm9sc19hbGM2NTUsIEFSUkFZX1NJWkUoc25kX2FjOTdfY29udHJvbHNfYWxjNjU1KSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikgeworCQlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X3NwZGlmX2NvbnRyb2xzX2FsYzY1NSwgQVJSQVlfU0laRShzbmRfYWM5N19zcGRpZl9jb250cm9sc19hbGM2NTUpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2FsYzY1NV9vcHMgPSB7CisJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfYWxjNjU1X3NwZWNpZmljCit9OworCitpbnQgcGF0Y2hfYWxjNjU1KGFjOTdfdCAqIGFjOTcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWFjOTctPnNwZWMuZGV2X2ZsYWdzID0gKGFjOTctPmlkID09IDB4NDE0YzQ3ODApOyAvKiBBTEM2NTggKi8KKworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hbGM2NTVfb3BzOworCisJLyogYXNzdW1lIG9ubHkgcGFnZSAwIGZvciB3cml0aW5nIGNhY2hlICovCisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19JTlRfUEFHSU5HLCBBQzk3X1BBR0VfTUFTSywgQUM5N19QQUdFX1ZFTkRPUik7CisKKwkvKiBhZGp1c3QgZGVmYXVsdCB2YWx1ZXMgKi8KKwl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIDB4N2EpOyAvKiBtaXNjIGNvbnRyb2wgKi8KKwlpZiAoYWM5Ny0+aWQgPT0gMHg0MTRjNDc4MCkgLyogQUxDNjU4ICovCisJCXZhbCAmPSB+KDEgPDwgMSk7IC8qIFBpbiA0NyBpcyBzcGRpZiBpbnB1dCBwaW4gKi8KKwllbHNlIC8qIEFMQzY1NSAqLworCQl2YWwgfD0gKDEgPDwgMSk7IC8qIFBpbiA0NyBpcyBzcGRpZiBpbnB1dCBwaW4gKi8KKwl2YWwgJj0gfigxIDw8IDEyKTsgLyogdnJlZiBlbmFibGUgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDdhLCB2YWwpOworCS8qIHNldCBkZWZhdWx0OiBzcGRpZi1pbiBlbmFibGVkLAorCSAgIHNwZGlmLWluIG1vbml0b3Igb2ZmLCBzcGRpZi1pbiBQQ00gb2ZmCisJICAgY2VudGVyIG9uIG1pYyBvZmYsIHN1cnJvdW5kIG9uIGxpbmUtaW4gb2ZmCisJICAgZHVwbGljYXRlIGZyb250IG9mZgorCSovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfTVVMVElDSCwgMTw8MTUpOworCisJLyogZnVsbCBEQUMgdm9sdW1lICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfU1VSUl9EQUNfVk9MLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQUxDNjUwX0xGRV9EQUNfVk9MLCAweDA4MDgpOworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgQUM5N19BTEM4NTBfSkFDS19TRUxFQ1QJMHg3NgorI2RlZmluZSBBQzk3X0FMQzg1MF9NSVNDMQkweDdhCisKK3N0YXRpYyBpbnQgYWM5N19hbGM4NTBfc3Vycm91bmRfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKyAgICAgICAgYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworICAgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICgoYWM5Ny0+cmVnc1tBQzk3X0FMQzg1MF9KQUNLX1NFTEVDVF0gPj4gMTIpICYgNykgPT0gMjsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWM5N19hbGM4NTBfc3Vycm91bmRfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKyAgICAgICAgYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJLyogU1VSUiAxa09obSAoYml0NCksIEFtcCAoYml0NSkgKi8KKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzg1MF9NSVNDMSwgKDE8PDQpfCgxPDw1KSwKKwkJCSAgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAoMTw8NSkgOiAoMTw8NCkpOworCS8qIExJTkUtSU4gPSAwLCBTVVJST1VORCA9IDIgKi8KKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BTEM4NTBfSkFDS19TRUxFQ1QsIDcgPDwgMTIsCisJCQkJICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gKDI8PDEyKSA6ICgwPDwxMikpOworfQorCitzdGF0aWMgaW50IGFjOTdfYWxjODUwX21pY19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworICAgICAgICBhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKChhYzk3LT5yZWdzW0FDOTdfQUxDODUwX0pBQ0tfU0VMRUNUXSA+PiA0KSAmIDcpID09IDI7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjOTdfYWxjODUwX21pY19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworICAgICAgICBhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwkvKiBWcmVmIGRpc2FibGUgKGJpdDEyKSwgMWtPaG0gKGJpdDEzKSAqLworCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDODUwX01JU0MxLCAoMTw8MTIpfCgxPDwxMyksCisJCQkgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gKDE8PDEyKSA6ICgxPDwxMykpOworCS8qIE1JQy1JTiA9IDEsIENFTlRFUi1MRkUgPSAyICovCisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDODUwX0pBQ0tfU0VMRUNULCA3IDw8IDQsCisJCQkJICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gKDI8PDQpIDogKDE8PDQpKTsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19hbGM4NTBbXSA9IHsKKwlBQzk3X1BBR0VfU0lOR0xFKCJEdXBsaWNhdGUgRnJvbnQiLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAwLCAxLCAwLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJMaW5lLUluIEFzIFN1cnJvdW5kIiwKKwkJLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAorCQkuZ2V0ID0gYWM5N19hbGM4NTBfc3Vycm91bmRfZ2V0LAorCQkucHV0ID0gYWM5N19hbGM4NTBfc3Vycm91bmRfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfU0lOR0xFX1ZBTFVFKDAsIDAsIDEsIDApIC8qIG9ubHkgbWFzayBuZWVkZWQgKi8KKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1pYyBBcyBDZW50ZXIvTEZFIiwKKwkJLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAorCQkuZ2V0ID0gYWM5N19hbGM4NTBfbWljX2dldCwKKwkJLnB1dCA9IGFjOTdfYWxjODUwX21pY19wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19TSU5HTEVfVkFMVUUoMCwgMCwgMSwgMCkgLyogb25seSBtYXNrIG5lZWRlZCAqLworCX0sCisKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjODUwX3NwZWNpZmljKGFjOTdfdCAqYWM5NykKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19jb250cm9sc19hbGM4NTAsIEFSUkFZX1NJWkUoc25kX2FjOTdfY29udHJvbHNfYWxjODUwKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikgeworCQlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X3NwZGlmX2NvbnRyb2xzX2FsYzY1NSwgQVJSQVlfU0laRShzbmRfYWM5N19zcGRpZl9jb250cm9sc19hbGM2NTUpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2FsYzg1MF9vcHMgPSB7CisJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfYWxjODUwX3NwZWNpZmljCit9OworCitpbnQgcGF0Y2hfYWxjODUwKGFjOTdfdCAqYWM5NykKK3sKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWxjODUwX29wczsKKworCWFjOTctPnNwZWMuZGV2X2ZsYWdzID0gMDsgLyogZm9yIElFQzk1OCBwbGF5YmFjayByb3V0ZSAtIEFMQzY1NSBjb21wYXRpYmxlICovCisKKwkvKiBhc3N1bWUgb25seSBwYWdlIDAgZm9yIHdyaXRpbmcgY2FjaGUgKi8KKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIEFDOTdfUEFHRV9NQVNLLCBBQzk3X1BBR0VfVkVORE9SKTsKKworCS8qIGFkanVzdCBkZWZhdWx0IHZhbHVlcyAqLworCS8qIHNldCBkZWZhdWx0OiBzcGRpZi1pbiBlbmFibGVkLAorCSAgIHNwZGlmLWluIG1vbml0b3Igb2ZmLCBzcGRpZi1pbiBQQ00gb2ZmCisJICAgY2VudGVyIG9uIG1pYyBvZmYsIHN1cnJvdW5kIG9uIGxpbmUtaW4gb2ZmCisJICAgZHVwbGljYXRlIGZyb250IG9mZgorCSovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfTVVMVElDSCwgMTw8MTUpOworCS8qIFNVUlJfT1VUOiBvbiwgU3VyciAxa09obTogb24sIFN1cnIgQW1wOiBvZmYsIEZyb250IDFrT2htOiBvZmYKKwkgKiBGcm9udCBBbXA6IG9uLCBWcmVmOiBlbmFibGUsIENlbnRlciAxa09obTogb24sIE1peDogb24KKwkgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDdhLCAoMTw8MSl8KDE8PDQpfCgwPDw1KXwoMTw8Nil8CisJCQkgICAgICgxPDw3KXwoMDw8MTIpfCgxPDwxMyl8KDA8PDE0KSk7CisJLyogZGV0ZWN0aW9uIFVJTzIsMzogYWxsIHBhdGggZmxvYXRpbmcsIFVJTzM6IE1JQywgVnJlZjI6IGRpc2FibGUsCisJICogVUlPMTogRlJPTlQsIFZyZWYzOiBkaXNhYmxlLCBVSU8zOiBMSU5FLCBGcm9udC1NaWM6IG11dGUKKwkgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDc2LCAoMDw8MCl8KDA8PDIpfCgxPDw0KXwoMTw8Nyl8KDI8PDgpfAorCQkJICAgICAoMTw8MTEpfCgwPDwxMil8KDE8PDE1KSk7CisKKwkvKiBmdWxsIERBQyB2b2x1bWUgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0FMQzY1MF9TVVJSX0RBQ19WT0wsIDB4MDgwOCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BTEM2NTBfTEZFX0RBQ19WT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEMtTWVkaWEgQ005N3h4IGNvZGVjcworICovCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHNuZF9hYzk3X2NtOTczOF9jb250cm9sc1tdID0geworCUFDOTdfU0lOR0xFKCJMaW5lLUluIEFzIFN1cnJvdW5kIiwgQUM5N19DTTk3MzhfVkVORE9SX0NUUkwsIDEwLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiRHVwbGljYXRlIEZyb250IiwgQUM5N19DTTk3MzhfVkVORE9SX0NUUkwsIDEzLCAxLCAwKSwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfY205NzM4X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2NtOTczOF9jb250cm9scywgQVJSQVlfU0laRShzbmRfYWM5N19jbTk3MzhfY29udHJvbHMpKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfY205NzM4X29wcyA9IHsKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF9jbTk3Mzhfc3BlY2lmaWMKK307CisKK2ludCBwYXRjaF9jbTk3MzgoYWM5N190ICogYWM5NykKK3sKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfY205NzM4X29wczsKKwkvKiBGSVhNRTogY2FuIGFueW9uZSBjb25maXJtIGJlbG93PyAqLworCS8qIENNOTczOCBoYXMgbm8gUENNIHZvbHVtZSBhbHRob3VnaCB0aGUgcmVnaXN0ZXIgcmVhY3RzICovCisJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19IQVNfTk9fUENNX1ZPTDsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1BDTSwgMHg4MDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2NtZWRpYV9zcGRpZl9wbGF5YmFja19zb3VyY2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsgIkFuYWxvZyIsICJEaWdpdGFsIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2NtZWRpYV9zcGRpZl9wbGF5YmFja19zb3VyY2VfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXZhbCA9IGFjOTctPnJlZ3NbQUM5N19DTTk3MzlfU1BESUZfQ1RSTF07CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gMSkgJiAweDAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2NtZWRpYV9zcGRpZl9wbGF5YmFja19zb3VyY2VfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQ005NzM5X1NQRElGX0NUUkwsCisJCQkJICAgIDB4MDEgPDwgMSwgCisJCQkJICAgICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICYgMHgwMSkgPDwgMSk7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfY205NzM5X2NvbnRyb2xzX3NwZGlmW10gPSB7CisJLyogQklUIDA6IFNQRElfRU4gLSBhbHdheXMgdHJ1ZSAqLworCXsgLyogQklUIDE6IFNQRElGUyAqLworCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUJPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlNvdXJjZSIsCisJCS5pbmZvCT0gc25kX2FjOTdfY21lZGlhX3NwZGlmX3BsYXliYWNrX3NvdXJjZV9pbmZvLAorCQkuZ2V0CT0gc25kX2FjOTdfY21lZGlhX3NwZGlmX3BsYXliYWNrX3NvdXJjZV9nZXQsCisJCS5wdXQJPSBzbmRfYWM5N19jbWVkaWFfc3BkaWZfcGxheWJhY2tfc291cmNlX3B1dCwKKwl9LAorCS8qIEJJVCAyOiBJR19TUElWICovCisJQUM5N19TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsTk9ORSkgIlZhbGlkIFN3aXRjaCIsIEFDOTdfQ005NzM5X1NQRElGX0NUUkwsIDIsIDEsIDApLAorCS8qIEJJVCAzOiBTUEkyRiAqLworCUFDOTdfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLE5PTkUpICJNb25pdG9yIiwgQUM5N19DTTk3MzlfU1BESUZfQ1RSTCwgMywgMSwgMCksIAorCS8qIEJJVCA0OiBTUEkyU0RJICovCisJQUM5N19TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsU1dJVENIKSwgQUM5N19DTTk3MzlfU1BESUZfQ1RSTCwgNCwgMSwgMCksCisJLyogQklUIDg6IFNQRDMyIC0gMzJiaXQgU1BESUYgLSBub3Qgc3VwcG9ydGVkIHlldCAqLworfTsKKworc3RhdGljIGludCBzbmRfYWM5N19jbTk3MzlfY2VudGVyX21pY19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaWYgKGFjOTctPnJlZ3NbQUM5N19DTTk3MzlfTVVMVElfQ0hBTl0gJiAweDEwMDApCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwllbHNlCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19jbTk3MzlfY2VudGVyX21pY19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQ005NzM5X01VTFRJX0NIQU4sIDB4MzAwMCwKKwkJCQkgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAKKwkJCQkgICAgMHgxMDAwIDogMHgyMDAwKTsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jbTk3MzlfY29udHJvbHNbXSA9IHsKKwlBQzk3X1NJTkdMRSgiTGluZS1JbiBBcyBTdXJyb3VuZCIsIEFDOTdfQ005NzM5X01VTFRJX0NIQU4sIDEwLCAxLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNaWMgQXMgQ2VudGVyL0xGRSIsCisJCS5pbmZvID0gc25kX2FjOTdfaW5mb192b2xzdywKKwkJLmdldCA9IHNuZF9hYzk3X2NtOTczOV9jZW50ZXJfbWljX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2NtOTczOV9jZW50ZXJfbWljX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X1NJTkdMRV9WQUxVRSgwLCAwLCAxLCAwKSAvKiBvbmx5IG1hc2sgbmVlZGVkICovCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfY205NzM5X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2NtOTczOV9jb250cm9scywgQVJSQVlfU0laRShzbmRfYWM5N19jbTk3MzlfY29udHJvbHMpKTsKK30KKworc3RhdGljIGludCBwYXRjaF9jbTk3MzlfcG9zdF9zcGRpZihhYzk3X3QgKiBhYzk3KQoreworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19jbTk3MzlfY29udHJvbHNfc3BkaWYsIEFSUkFZX1NJWkUoc25kX2FjOTdfY205NzM5X2NvbnRyb2xzX3NwZGlmKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2NtOTczOV9vcHMgPSB7CisJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfY205NzM5X3NwZWNpZmljLAorCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfY205NzM5X3Bvc3Rfc3BkaWYKK307CisKK2ludCBwYXRjaF9jbTk3MzkoYWM5N190ICogYWM5NykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfY205NzM5X29wczsKKworCS8qIENNOTczOS9BIGhhcyBubyBNYXN0ZXIgYW5kIFBDTSB2b2x1bWUgYWx0aG91Z2ggdGhlIHJlZ2lzdGVyIHJlYWN0cyAqLworCWFjOTctPmZsYWdzIHw9IEFDOTdfSEFTX05PX01BU1RFUl9WT0wgfCBBQzk3X0hBU19OT19QQ01fVk9MOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfTUFTVEVSLCAweDgwMDApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUENNLCAweDgwMDApOworCisJLyogY2hlY2sgc3BkaWYgKi8KKwl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwlpZiAodmFsICYgQUM5N19FQV9TUENWKSB7CisJCS8qIGVuYWJsZSBzcGRpZiBpbiAqLworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NNOTczOV9TUERJRl9DVFJMLAorCQkJCSAgICAgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0NNOTczOV9TUERJRl9DVFJMKSB8IDB4MDEpOworCQlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX1NQRElGXSA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOyAvKiA0OGsgb25seSAqLworCX0gZWxzZSB7CisJCWFjOTctPmV4dF9pZCAmPSB+QUM5N19FSV9TUERJRjsgLyogZGlzYWJsZSBleHRlbmRlZC1pZCAqLworCQlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX1NQRElGXSA9IDA7CisJfQorCisJLyogc2V0LXVwIG11bHRpIGNoYW5uZWwgKi8KKwkvKiBiaXQgMTQ6IDAgPSBTUERJRiwgMSA9IEVBUEQgKi8KKwkvKiBiaXQgMTM6IGVuYWJsZSBpbnRlcm5hbCB2cmVmIG91dHB1dCBmb3IgbWljICovCisJLyogYml0IDEyOiBkaXNhYmxlIGNlbnRlci9sZmUgKHN3aXRoYWJsZSkgKi8KKwkvKiBiaXQgMTA6IGRpc2FibGUgc3Vycm91bmQvbGluZSAoc3dpdGNoYWJsZSkgKi8KKwkvKiBiaXQgOTogbWl4IDIgc3Vycm91bmQgb2ZmICovCisJLyogYml0IDQ6IHVuZG9jdW1lbnRlZDsgMCBtdXRlcyB0aGUgQ005NzM5QSwgd2hpY2ggZGVmYXVsdHMgdG8gMSAqLworCS8qIGJpdCAzOiB1bmRvY3VtZW50ZWQ7IHN1cnJvdW5kPyAqLworCS8qIGJpdCAwOiBkQiAqLworCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTikgJiAoMSA8PCA0KTsKKwl2YWwgfD0gKDEgPDwgMyk7CisJdmFsIHw9ICgxIDw8IDEzKTsKKwlpZiAoISAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikpCisJCXZhbCB8PSAoMSA8PCAxNCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTiwgdmFsKTsKKworCS8qIEZJWE1FOiBzZXQgdXAgR1BJTyAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4NzAsIDB4MDEwMCk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHg3MiwgMHgwMDIwKTsKKwkvKiBTcGVjaWFsIGV4Y2VwdGlvbiBmb3IgQVNVUyBXMTAwMC9DTUk5NzM5LiBJdCBkb2VzIG5vdCBoYXZlIGFuIFNQRElGIGluLiAqLworCWlmIChhYzk3LT5wY2kgJiYKKwkgICAgIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDQzICYmCisJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MTg0MykgeworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NNOTczOV9TUERJRl9DVFJMLAorCQkJc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0NNOTczOV9TUERJRl9DVFJMKSAmIH4weDAxKTsKKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTiwKKwkJCXNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTikgfCAoMSA8PCAxNCkpOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFDOTdfQ005NzYxX01VTFRJX0NIQU4JMHg2NAorI2RlZmluZSBBQzk3X0NNOTc2MV9TUERJRl9DVFJMCTB4NmMKKworc3RhdGljIGludCBzbmRfYWM5N19jbTk3NjFfbGluZWluX3JlYXJfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWM5N190ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWlmIChhYzk3LT5yZWdzW0FDOTdfQ005NzM5X01VTFRJX0NIQU5dICYgMHgwNDAwKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfY205NzYxX2xpbmVpbl9yZWFyX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWxzWzJdWzJdID0geworCQl7IDB4MDAwOCwgMHgwNDAwIH0sIC8qIG9mZiwgb24gKi8KKwkJeyAweDAwMDAsIDB4MDQwOCB9LCAvKiBvZmYsIG9uICg5NzYxLTgyIHJldi5CKSAqLworCX07CisJcmV0dXJuIHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQ005NzM5X01VTFRJX0NIQU4sIDB4MDQwOCwKKwkJCQkgICAgdmFsc1thYzk3LT5zcGVjLmRldl9mbGFnc11bISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXV0pOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2NtOTc2MV9jZW50ZXJfbWljX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFjOTdfdCAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpZiAoYWM5Ny0+cmVnc1tBQzk3X0NNOTczOV9NVUxUSV9DSEFOXSAmIDB4MTAwMCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCWlmIChhYzk3LT5zcGVjLmRldl9mbGFncykgLyogOTc2MS04MiByZXYuQiAqLworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19jbTk3NjFfY2VudGVyX21pY19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhYzk3X3QgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsc1syXVsyXSA9IHsKKwkJeyAweDIwMDAsIDB4MTg4MCB9LCAvKiBvZmYsIG9uICovCisJCXsgMHgxMDAwLCAweDI4ODAgfSwgLyogb2ZmLCBvbiAoOTc2MS04MiByZXYuQikgKi8KKwl9OworCXJldHVybiBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0NNOTczOV9NVUxUSV9DSEFOLCAweDM4ODAsCisJCQkJICAgIHZhbHNbYWM5Ny0+c3BlYy5kZXZfZmxhZ3NdWyEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF1dKTsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jbTk3NjFfY29udHJvbHNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJMaW5lLUluIEFzIFN1cnJvdW5kIiwKKwkJLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAorCQkuZ2V0ID0gc25kX2FjOTdfY205NzYxX2xpbmVpbl9yZWFyX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2NtOTc2MV9saW5laW5fcmVhcl9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19TSU5HTEVfVkFMVUUoMCwgMCwgMSwgMCkgLyogb25seSBtYXNrIG5lZWRlZCAqLworCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWljIEFzIENlbnRlci9MRkUiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2luZm9fdm9sc3csCisJCS5nZXQgPSBzbmRfYWM5N19jbTk3NjFfY2VudGVyX21pY19nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19jbTk3NjFfY2VudGVyX21pY19wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19TSU5HTEVfVkFMVUUoMCwgMCwgMSwgMCkgLyogb25seSBtYXNrIG5lZWRlZCAqLworCX0sCit9OworCitzdGF0aWMgaW50IHBhdGNoX2NtOTc2MV9zcGVjaWZpYyhhYzk3X3QgKiBhYzk3KQoreworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19jbTk3NjFfY29udHJvbHMsIEFSUkFZX1NJWkUoc25kX2FjOTdfY205NzYxX2NvbnRyb2xzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2NtOTc2MV9vcHMgPSB7CisJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfY205NzYxX3NwZWNpZmljLAorCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfY205NzM5X3Bvc3Rfc3BkaWYgLyogaG9wZSBpdCdzIGlkZW50aWNhbC4uLiAqLworfTsKKworaW50IHBhdGNoX2NtOTc2MShhYzk3X3QgKmFjOTcpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJLyogQ005NzYxIGhhcyBubyBQQ00gdm9sdW1lIGFsdGhvdWdoIHRoZSByZWdpc3RlciByZWFjdHMgKi8KKwkvKiBNYXN0ZXIgdm9sdW1lIHNlZW1zIHRvIGhhdmUgX3NvbWVfIGluZmx1ZW5jZSBvbiB0aGUgYW5hbG9nCisJICogaW5wdXQgc291bmRzCisJICovCisJYWM5Ny0+ZmxhZ3MgfD0gLypBQzk3X0hBU19OT19NQVNURVJfVk9MIHwqLyBBQzk3X0hBU19OT19QQ01fVk9MOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfTUFTVEVSLCAweDg4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUENNLCAweDg4MDgpOworCisJYWM5Ny0+c3BlYy5kZXZfZmxhZ3MgPSAwOyAvKiAxID0gbW9kZWwgODIgcmV2aXNpb24gQiAqLworCWlmIChhYzk3LT5pZCA9PSBBQzk3X0lEX0NNOTc2MV84MikgeworCQl1bnNpZ25lZCBzaG9ydCB0bXA7CisJCS8qIGNoZWNrIHBhZ2UgMSwgcmVnIDB4NjAgKi8KKwkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0lOVF9QQUdJTkcpOworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0lOVF9QQUdJTkcsICh2YWwgJiB+MHgwZikgfCAweDAxKTsKKwkJdG1wID0gc25kX2FjOTdfcmVhZChhYzk3LCAweDYwKTsKKwkJYWM5Ny0+c3BlYy5kZXZfZmxhZ3MgPSB0bXAgJiAxOyAvKiByZXZpc2lvbiBCPyAqLworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0lOVF9QQUdJTkcsIHZhbCk7CisJfQorCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2NtOTc2MV9vcHM7CisKKwkvKiBlbmFibGUgc3BkaWYgKi8KKwkvKiBmb3JjZSB0aGUgU1BESUYgYml0IGluIGV4dF9pZCAtIGNvZGVjIGRvZXNuJ3Qgc2V0IHRoaXMgYml0ISAqLworICAgICAgICBhYzk3LT5leHRfaWQgfD0gQUM5N19FSV9TUERJRjsKKwkvKiB0byBiZSBzdXJlOiB3ZSBvdmVyd3JpdGUgdGhlIGV4dCBzdGF0dXMgYml0cyAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTLCAweDA1YzApOworCS8qIERvbid0IHNldCAweDAyMDAgaGVyZS4gIFRoaXMgcmVzdWx0cyBpbiB0aGUgc2lsZW50IGFuYWxvZyBvdXRwdXQgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NNOTc2MV9TUERJRl9DVFJMLCAweDAwMDkpOworCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZdID0gU05EUlZfUENNX1JBVEVfNDgwMDA7IC8qIDQ4ayBvbmx5ICovCisKKwkvKiBzZXQtdXAgbXVsdGkgY2hhbm5lbCAqLworCS8qIGJpdCAxNTogcGMgbWFzdGVyIGJlZXAgb2ZmCisJICogYml0IDE0OiA/PworCSAqIGJpdCAxMzogdnJlZiBjdGwgWz0gY205NzM5XQorCSAqIGJpdCAxMjogY2VudGVyL21pYyBbPSBjbTk3MzldIChyZXZlcnRlZCBvbiByZXYgQikKKwkgKiBiaXQgMTE6ID8/IChtaWMvY2VudGVyL2xmZSkgKHJldmVydGVkIG9uIHJldiBCKQorCSAqIGJpdCAxMDogc3VkZG91bmQvbGluZSBbPSBjbTk3MzldCisJICogYml0ICA5OiBtaXggMiBzdXJyb3VuZAorCSAqIGJpdCAgODogPworCSAqIGJpdCAgNzogPz8gKG1pYy9jZW50ZXIvbGZlKQorCSAqIGJpdCAgNDogPz8gKGZyb250KQorCSAqIGJpdCAgMzogPz8gKGxpbmUtaW4vcmVhciBzaGFyZSkgKHJldmVyZXRlZCB3aXRoIHJldiBCKQorCSAqIGJpdCAgMjogPz8gKHN1cnJvdW5kKQorCSAqIGJpdCAgMTogZnJvbnQgbWljCisJICogYml0ICAwOiBtaWMgYm9vc3QKKwkgKi8KKworI2lmIDAKKwlpZiAoYWM5Ny0+c3BlYy5kZXZfZmxhZ3MpCisJCXZhbCA9IDB4MDIxNDsKKwllbHNlCisJCXZhbCA9IDB4MzIxYzsKKyNlbmRpZgorCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19DTTk3NjFfTVVMVElfQ0hBTik7CisJdmFsIHw9ICgxIDw8IDQpOyAvKiBmcm9udCBvbiAqLworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQ005NzYxX01VTFRJX0NIQU4sIHZhbCk7CisKKwkvKiBGSVhNRTogc2V0IHVwIEdQSU8gKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDcwLCAweDAxMDApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4NzIsIDB4MDAyMCk7CisKKwlyZXR1cm4gMDsKK30KKyAgICAgICAKKworLyoKKyAqIFZJQSBWVDE2MTYgY29kZWMKKyAqLworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc192dDE2MTZbXSA9IHsKK0FDOTdfU0lOR0xFKCJEQyBPZmZzZXQgcmVtb3ZhbCIsIDB4NWEsIDEwLCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJBbHRlcm5hdGUgTGV2ZWwgdG8gU3Vycm91bmQgT3V0IiwgMHg1YSwgMTUsIDEsIDApLAorQUM5N19TSU5HTEUoIkRvd25taXggTEZFIGFuZCBDZW50ZXIgdG8gRnJvbnQiLCAweDVhLCAxMiwgMSwgMCksCitBQzk3X1NJTkdMRSgiRG93bm1peCBTdXJyb3VuZCB0byBGcm9udCIsIDB4NWEsIDExLCAxLCAwKSwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNjE2X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJaW50IGVycjsKKworCWlmIChzbmRfYWM5N190cnlfYml0KGFjOTcsIDB4NWEsIDkpKQorCQlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19jb250cm9sc192dDE2MTZbMF0sIDEpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxNlsxXSwgQVJSQVlfU0laRShzbmRfYWM5N19jb250cm9sc192dDE2MTYpIC0gMSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfdnQxNjE2X29wcyA9IHsKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF92dDE2MTZfc3BlY2lmaWMKK307CisKK2ludCBwYXRjaF92dDE2MTYoYWM5N190ICogYWM5NykKK3sKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfdnQxNjE2X29wczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19jb250cm9sc19pdDI2NDZbXSA9IHsKKwlBQzk3X1NJTkdMRSgiTGluZS1JbiBBcyBTdXJyb3VuZCIsIDB4NzYsIDksIDEsIDApLAorCUFDOTdfU0lOR0xFKCJNaWMgQXMgQ2VudGVyL0xGRSIsIDB4NzYsIDEwLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FjOTdfc3BkaWZfY29udHJvbHNfaXQyNjQ2W10gPSB7CisJQUM5N19TSU5HTEUoIklFQzk1OCBDYXB0dXJlIFN3aXRjaCIsIDB4NzYsIDExLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiQW5hbG9nIHRvIElFQzk1OCBPdXRwdXQiLCAweDc2LCAxMiwgMSwgMCksCisJQUM5N19TSU5HTEUoIklFQzk1OCBJbnB1dCBNb25pdG9yIiwgMHg3NiwgMTMsIDEsIDApLAorfTsKKworc3RhdGljIGludCBwYXRjaF9pdDI2NDZfc3BlY2lmaWMoYWM5N190ICogYWM5NykKK3sKKwlpbnQgZXJyOworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfY29udHJvbHNfaXQyNjQ2LCBBUlJBWV9TSVpFKHNuZF9hYzk3X2NvbnRyb2xzX2l0MjY0NikpKSA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19zcGRpZl9jb250cm9sc19pdDI2NDYsIEFSUkFZX1NJWkUoc25kX2FjOTdfc3BkaWZfY29udHJvbHNfaXQyNjQ2KSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfaXQyNjQ2X29wcyA9IHsKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF9pdDI2NDZfc3BlY2lmaWMKK307CisKK2ludCBwYXRjaF9pdDI2NDYoYWM5N190ICogYWM5NykKK3sKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfaXQyNjQ2X29wczsKKwkvKiBmdWxsIERBQyB2b2x1bWUgKi8KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDVFLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4N0EsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNpMzAzNi84IHNwZWNpZmljIHJlZ2lzdGVycyAqLworI2RlZmluZSBBQzk3X1NJMzAzNl9DSElQX0lEICAgICAweDVhCisKK2ludCBtcGF0Y2hfc2kzMDM2KGFjOTdfdCAqIGFjOTcpCit7CisJLy9wcmludGsoIm1wYXRjaF9zaTMwMzY6IGNoaXAgaWQgPSAleFxuIiwgc25kX2FjOTdfcmVhZChhYzk3LCAweDVhKSk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHg1YywgMHhmMjEwICk7CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHg2OCwgMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmggYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNTFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NworICoKKyAqICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIDIuMgorICogIGJ5IEludGVsIENvcnBvcmF0aW9uIChodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbSkuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworaW50IHBhdGNoX3lhbWFoYV95bWY3NTMoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfd29sZnNvbjAwKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3dvbGZzb24wMyhhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF93b2xmc29uMDQoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfd29sZnNvbjA1KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3dvbGZzb24xMShhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF93b2xmc29uMTMoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfdHJpdGVjaF90cjI4MDI4KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzA4KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzQ0KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU4KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2NpcnJ1c19jczQyOTkoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfY2lycnVzX3NwZGlmKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2NvbmV4YW50KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2FkMTgxOShhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF9hZDE4ODEoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfYWQxODg1KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2FkMTg4NihhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF9hZDE4ODgoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfYWQxOTgwKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2FkMTk4MWEoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfYWQxOTgxYihhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF9hZDE5ODUoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfYWxjNjUwKGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2FsYzY1NShhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF9hbGM4NTAoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfY205NzM4KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2NtOTczOShhYzk3X3QgKiBhYzk3KTsKK2ludCBwYXRjaF9jbTk3NjEoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfdnQxNjE2KGFjOTdfdCAqIGFjOTcpOworaW50IHBhdGNoX2l0MjY0NihhYzk3X3QgKiBhYzk3KTsKK2ludCBtcGF0Y2hfc2kzMDM2KGFjOTdfdCAqIGFjOTcpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyODliOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgVW5pdmVyc2FsIGludGVyZmFjZSBmb3IgQXVkaW8gQ29kZWMgJzk3CisgKgorICogIEZvciBtb3JlIGRldGFpbHMgbG9vayB0byBBQyAnOTcgY29tcG9uZW50IHNwZWNpZmljYXRpb24gcmV2aXNpb24gMi4yCisgKiAgYnkgSW50ZWwgQ29ycG9yYXRpb24gKGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tKSBhbmQgdG8gZGF0YXNoZWV0cworICogIGZvciBzcGVjaWZpYyBjb2RlY3MuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgImFjOTdfcGF0Y2guaCIKKyNpbmNsdWRlICJhYzk3X2lkLmgiCisjaW5jbHVkZSAiYWM5N19sb2NhbC5oIgorCisvKgorICogIFBDTSBzdXBwb3J0CisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZV9yZWdfdGFibGVzWzJdWzRdWzldID0geworeworICAvKiBzdGFuZGFyZCByYXRlcyAqLworICB7CisgIAkvKiAzJjQgZnJvbnQsIDcmOCByZWFyLCA2JjkgY2VudGVyL2xmZSAqLworCUFDOTdfUENNX0ZST05UX0RBQ19SQVRFLAkvKiBzbG90IDMgKi8KKwlBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwJLyogc2xvdCA0ICovCisJMHhmZiwJCQkJLyogc2xvdCA1ICovCisJQUM5N19QQ01fTEZFX0RBQ19SQVRFLAkJLyogc2xvdCA2ICovCisJQUM5N19QQ01fU1VSUl9EQUNfUkFURSwJCS8qIHNsb3QgNyAqLworCUFDOTdfUENNX1NVUlJfREFDX1JBVEUsCQkvKiBzbG90IDggKi8KKwlBQzk3X1BDTV9MRkVfREFDX1JBVEUsCQkvKiBzbG90IDkgKi8KKwkweGZmLAkJCQkvKiBzbG90IDEwICovCisJMHhmZiwJCQkJLyogc2xvdCAxMSAqLworICB9LAorICB7CisgIAkvKiA3JjggZnJvbnQsIDYmOSByZWFyLCAxMCYxMSBjZW50ZXIvbGZlICovCisJMHhmZiwJCQkJLyogc2xvdCAzICovCisJMHhmZiwJCQkJLyogc2xvdCA0ICovCisJMHhmZiwJCQkJLyogc2xvdCA1ICovCisJQUM5N19QQ01fU1VSUl9EQUNfUkFURSwJCS8qIHNsb3QgNiAqLworCUFDOTdfUENNX0ZST05UX0RBQ19SQVRFLAkvKiBzbG90IDcgKi8KKwlBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwJLyogc2xvdCA4ICovCisJQUM5N19QQ01fU1VSUl9EQUNfUkFURSwJCS8qIHNsb3QgOSAqLworCUFDOTdfUENNX0xGRV9EQUNfUkFURSwJCS8qIHNsb3QgMTAgKi8KKwlBQzk3X1BDTV9MRkVfREFDX1JBVEUsCQkvKiBzbG90IDExICovCisgIH0sCisgIHsKKyAgCS8qIDYmOSBmcm9udCwgMTAmMTEgcmVhciwgMyY0IGNlbnRlci9sZmUgKi8KKwlBQzk3X1BDTV9MRkVfREFDX1JBVEUsCQkvKiBzbG90IDMgKi8KKwlBQzk3X1BDTV9MRkVfREFDX1JBVEUsCQkvKiBzbG90IDQgKi8KKwkweGZmLAkJCQkvKiBzbG90IDUgKi8KKwlBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwJLyogc2xvdCA2ICovCisJMHhmZiwJCQkJLyogc2xvdCA3ICovCisJMHhmZiwJCQkJLyogc2xvdCA4ICovCisJQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsCS8qIHNsb3QgOSAqLworCUFDOTdfUENNX1NVUlJfREFDX1JBVEUsCQkvKiBzbG90IDEwICovCisJQUM5N19QQ01fU1VSUl9EQUNfUkFURSwJCS8qIHNsb3QgMTEgKi8KKyAgfSwKKyAgeworICAJLyogMTAmMTEgZnJvbnQsIDMmNCByZWFyLCA3JjggY2VudGVyL2xmZSAqLworCUFDOTdfUENNX1NVUlJfREFDX1JBVEUsCQkvKiBzbG90IDMgKi8KKwlBQzk3X1BDTV9TVVJSX0RBQ19SQVRFLAkJLyogc2xvdCA0ICovCisJMHhmZiwJCQkJLyogc2xvdCA1ICovCisJMHhmZiwJCQkJLyogc2xvdCA2ICovCisJQUM5N19QQ01fTEZFX0RBQ19SQVRFLAkJLyogc2xvdCA3ICovCisJQUM5N19QQ01fTEZFX0RBQ19SQVRFLAkJLyogc2xvdCA4ICovCisJMHhmZiwJCQkJLyogc2xvdCA5ICovCisJQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsCS8qIHNsb3QgMTAgKi8KKwlBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwJLyogc2xvdCAxMSAqLworICB9LAorfSwKK3sKKyAgLyogZG91YmxlIHJhdGVzICovCisgIHsKKyAgCS8qIDMmNCBmcm9udCwgNyY4IGZyb250ICh0KzEpICovCisJQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsCS8qIHNsb3QgMyAqLworCUFDOTdfUENNX0ZST05UX0RBQ19SQVRFLAkvKiBzbG90IDQgKi8KKwkweGZmLAkJCQkvKiBzbG90IDUgKi8KKwkweGZmLAkJCQkvKiBzbG90IDYgKi8KKwlBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwJLyogc2xvdCA3ICovCisJQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsCS8qIHNsb3QgOCAqLworCTB4ZmYsCQkJCS8qIHNsb3QgOSAqLworCTB4ZmYsCQkJCS8qIHNsb3QgMTAgKi8KKwkweGZmLAkJCQkvKiBzbG90IDExICovCisgIH0sCisgIHsKKwkvKiBub3Qgc3BlY2lmaWVkIGluIHRoZSBzcGVjaWZpY2F0aW9uICovCisJMHhmZiwJCQkJLyogc2xvdCAzICovCisJMHhmZiwJCQkJLyogc2xvdCA0ICovCisJMHhmZiwJCQkJLyogc2xvdCA1ICovCisJMHhmZiwJCQkJLyogc2xvdCA2ICovCisJMHhmZiwJCQkJLyogc2xvdCA3ICovCisJMHhmZiwJCQkJLyogc2xvdCA4ICovCisJMHhmZiwJCQkJLyogc2xvdCA5ICovCisJMHhmZiwJCQkJLyogc2xvdCAxMCAqLworCTB4ZmYsCQkJCS8qIHNsb3QgMTEgKi8KKyAgfSwKKyAgeworCTB4ZmYsCQkJCS8qIHNsb3QgMyAqLworCTB4ZmYsCQkJCS8qIHNsb3QgNCAqLworCTB4ZmYsCQkJCS8qIHNsb3QgNSAqLworCTB4ZmYsCQkJCS8qIHNsb3QgNiAqLworCTB4ZmYsCQkJCS8qIHNsb3QgNyAqLworCTB4ZmYsCQkJCS8qIHNsb3QgOCAqLworCTB4ZmYsCQkJCS8qIHNsb3QgOSAqLworCTB4ZmYsCQkJCS8qIHNsb3QgMTAgKi8KKwkweGZmLAkJCQkvKiBzbG90IDExICovCisgIH0sCisgIHsKKwkweGZmLAkJCQkvKiBzbG90IDMgKi8KKwkweGZmLAkJCQkvKiBzbG90IDQgKi8KKwkweGZmLAkJCQkvKiBzbG90IDUgKi8KKwkweGZmLAkJCQkvKiBzbG90IDYgKi8KKwkweGZmLAkJCQkvKiBzbG90IDcgKi8KKwkweGZmLAkJCQkvKiBzbG90IDggKi8KKwkweGZmLAkJCQkvKiBzbG90IDkgKi8KKwkweGZmLAkJCQkvKiBzbG90IDEwICovCisJMHhmZiwJCQkJLyogc2xvdCAxMSAqLworICB9Cit9fTsKKworLyogRklYTUU6IG1vcmUgdmFyaW91cyBtYXBwaW5ncyBmb3IgQURDPyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZV9jcmVnc1s5XSA9IHsKKwlBQzk3X1BDTV9MUl9BRENfUkFURSwJLyogMyAqLworCUFDOTdfUENNX0xSX0FEQ19SQVRFLAkvKiA0ICovCisJMHhmZiwJCQkvKiA1ICovCisJQUM5N19QQ01fTUlDX0FEQ19SQVRFLAkvKiA2ICovCisJMHhmZiwJCQkvKiA3ICovCisJMHhmZiwJCQkvKiA4ICovCisJMHhmZiwJCQkvKiA5ICovCisJMHhmZiwJCQkvKiAxMCAqLworCTB4ZmYsCQkJLyogMTEgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9zbG90X3JlZyhzdHJ1Y3QgYWM5N19wY20gKnBjbSwgdW5zaWduZWQgc2hvcnQgY2lkeCwKKwkJCQkgIHVuc2lnbmVkIHNob3J0IHNsb3QsIGludCBkYmwpCit7CisJaWYgKHNsb3QgPCAzKQorCQlyZXR1cm4gMHhmZjsKKwlpZiAoc2xvdCA+IDExKQorCQlyZXR1cm4gMHhmZjsKKwlpZiAocGNtLT5zcGRpZikKKwkJcmV0dXJuIEFDOTdfU1BESUY7IC8qIHBzZXVkbyByZWdpc3RlciAqLworCWlmIChwY20tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXR1cm4gcmF0ZV9yZWdfdGFibGVzW2RibF1bcGNtLT5yW2RibF0ucmF0ZV90YWJsZVtjaWR4XV1bc2xvdCAtIDNdOworCWVsc2UKKwkJcmV0dXJuIHJhdGVfY3JlZ3Nbc2xvdCAtIDNdOworfQorCitzdGF0aWMgaW50IHNldF9zcGRpZl9yYXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBvbGQsIGJpdHMsIHJlZywgbWFzazsKKwl1bnNpZ25lZCBpbnQgc2JpdHM7CisKKwlpZiAoISAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVE9ETzogZG91YmxlIHJhdGUgc3VwcG9ydCAqLworCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfQ1NfU1BESUYpIHsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgNDgwMDA6IGJpdHMgPSAwOyBicmVhazsKKwkJY2FzZSA0NDEwMDogYml0cyA9IDEgPDwgQUM5N19TQ19TUFNSX1NISUZUOyBicmVhazsKKwkJZGVmYXVsdDogLyogaW52YWxpZCAtIGRpc2FibGUgb3V0cHV0ICovCisJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWcgPSBBQzk3X0NTUl9TUERJRjsKKwkJbWFzayA9IDEgPDwgQUM5N19TQ19TUFNSX1NISUZUOworCX0gZWxzZSB7CisJCWlmIChhYzk3LT5pZCA9PSBBQzk3X0lEX0NNOTczOSAmJiByYXRlICE9IDQ4MDAwKSB7CisJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSA0NDEwMDogYml0cyA9IEFDOTdfU0NfU1BTUl80NEs7IGJyZWFrOworCQljYXNlIDQ4MDAwOiBiaXRzID0gQUM5N19TQ19TUFNSXzQ4SzsgYnJlYWs7CisJCWNhc2UgMzIwMDA6IGJpdHMgPSBBQzk3X1NDX1NQU1JfMzJLOyBicmVhazsKKwkJZGVmYXVsdDogLyogaW52YWxpZCAtIGRpc2FibGUgb3V0cHV0ICovCisJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgQUM5N19FQV9TUERJRiwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWcgPSBBQzk3X1NQRElGOworCQltYXNrID0gQUM5N19TQ19TUFNSX01BU0s7CisJfQorCisJZG93bigmYWM5Ny0+cmVnX211dGV4KTsKKwlvbGQgPSBzbmRfYWM5N19yZWFkKGFjOTcsIHJlZykgJiBtYXNrOworCWlmIChvbGQgIT0gYml0cykgeworCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIDApOworCQlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgcmVnLCBtYXNrLCBiaXRzKTsKKwkJLyogdXBkYXRlIHRoZSBpbnRlcm5hbCBzcGRpZiBiaXRzICovCisJCXNiaXRzID0gYWM5Ny0+c3BkaWZfc3RhdHVzOworCQlpZiAoc2JpdHMgJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpIHsKKwkJCXNiaXRzICY9IH5JRUM5NThfQUVTMF9QUk9fRlM7CisJCQlzd2l0Y2ggKHJhdGUpIHsKKwkJCWNhc2UgNDQxMDA6IHNiaXRzIHw9IElFQzk1OF9BRVMwX1BST19GU180NDEwMDsgYnJlYWs7CisJCQljYXNlIDQ4MDAwOiBzYml0cyB8PSBJRUM5NThfQUVTMF9QUk9fRlNfNDgwMDA7IGJyZWFrOworCQkJY2FzZSAzMjAwMDogc2JpdHMgfD0gSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNiaXRzICY9IH4oSUVDOTU4X0FFUzNfQ09OX0ZTIDw8IDI0KTsKKwkJCXN3aXRjaCAocmF0ZSkgeworCQkJY2FzZSA0NDEwMDogc2JpdHMgfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzQ0MTAwPDwyNDsgYnJlYWs7CisJCQljYXNlIDQ4MDAwOiBzYml0cyB8PSBJRUM5NThfQUVTM19DT05fRlNfNDgwMDA8PDI0OyBicmVhazsKKwkJCWNhc2UgMzIwMDA6IHNiaXRzIHw9IElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMDw8MjQ7IGJyZWFrOworCQkJfQorCQl9CisJCWFjOTctPnNwZGlmX3N0YXR1cyA9IHNiaXRzOworCX0KKwlzbmRfYWM5N191cGRhdGVfYml0c19ub2xvY2soYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIEFDOTdfRUFfU1BESUYsIEFDOTdfRUFfU1BESUYpOworCXVwKCZhYzk3LT5yZWdfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9hYzk3X3NldF9yYXRlIC0gY2hhbmdlIHRoZSByYXRlIG9mIHRoZSBnaXZlbiBpbnB1dC9vdXRwdXQuCisgKiBAYWM5NzogdGhlIGFjOTcgaW5zdGFuY2UKKyAqIEByZWc6IHRoZSByZWdpc3RlciB0byBjaGFuZ2UKKyAqIEByYXRlOiB0aGUgc2FtcGxlIHJhdGUgdG8gc2V0CisgKgorICogQ2hhbmdlcyB0aGUgcmF0ZSBvZiB0aGUgZ2l2ZW4gaW5wdXQvb3V0cHV0IG9uIHRoZSBjb2RlYy4KKyAqIElmIHRoZSBjb2RlYyBkb2Vzbid0IHN1cHBvcnQgVkFSLCB0aGUgcmF0ZSBtdXN0IGJlIDQ4MDAwIChleGNlcHQKKyAqIGZvciBTUERJRikuCisgKgorICogVGhlIHZhbGlkIHJlZ2lzdGVycyBhcmUgQUM5N19QTUNfTUlDX0FEQ19SQVRFLAorICogQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsIEFDOTdfUENNX0xSX0FEQ19SQVRFLgorICogQUM5N19QQ01fU1VSUl9EQUNfUkFURSBhbmQgQUM5N19QQ01fTEZFX0RBQ19SQVRFIGFyZSBhY2NlcHRlZAorICogaWYgdGhlIGNvZGVjIHN1cHBvcnRzIHRoZW0uCisgKiBBQzk3X1NQRElGIGlzIGFjY2VwdGVkIGFzIGEgcHNldWRvIHJlZ2lzdGVyIHRvIG1vZGlmeSB0aGUgU1BESUYKKyAqIHN0YXR1cyBiaXRzLgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHNuZF9hYzk3X3NldF9yYXRlKGFjOTdfdCAqYWM5NywgaW50IHJlZywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJaW50IGRibDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCQorCWRibCA9IHJhdGUgPiA0ODAwMDsKKwlpZiAoZGJsKSB7CisJCWlmICghKGFjOTctPmZsYWdzICYgQUM5N19ET1VCTEVfUkFURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHJlZyAhPSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBBQzk3X1BDTV9NSUNfQURDX1JBVEU6CisJCWlmICgoYWM5Ny0+cmVnc1tBQzk3X0VYVEVOREVEX1NUQVRVU10gJiBBQzk3X0VBX1ZSTSkgPT0gMCkJLyogTUlDIFZSQSAqLworCQkJaWYgKHJhdGUgIT0gNDgwMDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQUM5N19QQ01fRlJPTlRfREFDX1JBVEU6CisJY2FzZSBBQzk3X1BDTV9MUl9BRENfUkFURToKKwkJaWYgKChhYzk3LT5yZWdzW0FDOTdfRVhURU5ERURfU1RBVFVTXSAmIEFDOTdfRUFfVlJBKSA9PSAwKQkvKiBWUkEgKi8KKwkJCWlmIChyYXRlICE9IDQ4MDAwICYmIHJhdGUgIT0gOTYwMDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQUM5N19QQ01fU1VSUl9EQUNfUkFURToKKwkJaWYgKCEgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NVUlJPVU5EX0RBQykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBQzk3X1BDTV9MRkVfREFDX1JBVEU6CisJCWlmICghIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9DRU5URVJfTEZFX0RBQykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBQzk3X1NQRElGOgorCQkvKiBzcGVjaWFsIGNhc2UgKi8KKwkJcmV0dXJuIHNldF9zcGRpZl9yYXRlKGFjOTcsIHJhdGUpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZGJsKQorCQlyYXRlIC89IDI7CisJdG1wID0gKHJhdGUgKiBhYzk3LT5idXMtPmNsb2NrKSAvIDQ4MDAwOworCWlmICh0bXAgPiA2NTUzNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX0RSQSkgJiYgcmVnID09IEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKQorCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCQkgICAgIEFDOTdfRUFfRFJBLCBkYmwgPyBBQzk3X0VBX0RSQSA6IDApOworCXNuZF9hYzk3X3VwZGF0ZShhYzk3LCByZWcsIHRtcCAmIDB4ZmZmZik7CisJc25kX2FjOTdfcmVhZChhYzk3LCByZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ2V0X3BzbG90cyhhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIGNoYXIgKnJhdGVfdGFibGUsIHVuc2lnbmVkIHNob3J0ICpzcGRpZl9zbG90cykKK3sKKwlpZiAoIWFjOTdfaXNfYXVkaW8oYWM5NykpCisJCXJldHVybiAwOworCWlmIChhYzk3X2lzX3JldjIyKGFjOTcpIHx8IGFjOTdfY2FuX2FtYXAoYWM5NykpIHsKKwkJdW5zaWduZWQgc2hvcnQgc2xvdHMgPSAwOworCQlpZiAoYWM5N19pc19yZXYyMihhYzk3KSkgeworCQkJLyogTm90ZTogaXQncyBzaW1wbHkgZW11bGF0aW9uIG9mIEFNQVAgYmVoYXZpb3VyICovCisJCQl1MTYgZXM7CisJCQllcyA9IGFjOTctPnJlZ3NbQUM5N19FWFRFTkRFRF9JRF0gJj0gfkFDOTdfRUlfREFDU19TTE9UX01BU0s7CisJCQlzd2l0Y2ggKGFjOTctPmFkZHIpIHsKKwkJCWNhc2UgMToKKwkJCWNhc2UgMjogZXMgfD0gKDE8PEFDOTdfRUlfREFDU19TTE9UX1NISUZUKTsgYnJlYWs7CisJCQljYXNlIDM6IGVzIHw9ICgyPDxBQzk3X0VJX0RBQ1NfU0xPVF9TSElGVCk7IGJyZWFrOworCQkJfQorCQkJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19FWFRFTkRFRF9JRCwgZXMpOworCQl9CisJCXN3aXRjaCAoYWM5Ny0+YWRkcikgeworCQljYXNlIDA6CisJCQlzbG90cyB8PSAoMTw8QUM5N19TTE9UX1BDTV9MRUZUKXwoMTw8QUM5N19TTE9UX1BDTV9SSUdIVCk7CisJCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfU1VSUk9VTkRfREFDKQorCQkJCXNsb3RzIHw9ICgxPDxBQzk3X1NMT1RfUENNX1NMRUZUKXwoMTw8QUM5N19TTE9UX1BDTV9TUklHSFQpOworCQkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKQorCQkJCXNsb3RzIHw9ICgxPDxBQzk3X1NMT1RfUENNX0NFTlRFUil8KDE8PEFDOTdfU0xPVF9MRkUpOworCQkJaWYgKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpIHsKKwkJCQlpZiAoIShhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpKQorCQkJCQkqc3BkaWZfc2xvdHMgPSAoMTw8QUM5N19TTE9UX1NQRElGX0xFRlQpfCgxPDxBQzk3X1NMT1RfU1BESUZfUklHSFQpOworCQkJCWVsc2UgaWYgKCEoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUMpKQorCQkJCQkqc3BkaWZfc2xvdHMgPSAoMTw8QUM5N19TTE9UX1NQRElGX0xFRlQxKXwoMTw8QUM5N19TTE9UX1NQRElGX1JJR0hUMSk7CisJCQkJZWxzZQorCQkJCQkqc3BkaWZfc2xvdHMgPSAoMTw8QUM5N19TTE9UX1NQRElGX0xFRlQyKXwoMTw8QUM5N19TTE9UX1NQRElGX1JJR0hUMik7CisJCQl9CisJCQkqcmF0ZV90YWJsZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlzbG90cyB8PSAoMTw8QUM5N19TTE9UX1BDTV9TTEVGVCl8KDE8PEFDOTdfU0xPVF9QQ01fU1JJR0hUKTsKKwkJCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpCisJCQkJc2xvdHMgfD0gKDE8PEFDOTdfU0xPVF9QQ01fQ0VOVEVSKXwoMTw8QUM5N19TTE9UX0xGRSk7CisJCQlpZiAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikgeworCQkJCWlmICghKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NVUlJPVU5EX0RBQykpCisJCQkJCSpzcGRpZl9zbG90cyA9ICgxPDxBQzk3X1NMT1RfU1BESUZfTEVGVDEpfCgxPDxBQzk3X1NMT1RfU1BESUZfUklHSFQxKTsKKwkJCQllbHNlCisJCQkJCSpzcGRpZl9zbG90cyA9ICgxPDxBQzk3X1NMT1RfU1BESUZfTEVGVDIpfCgxPDxBQzk3X1NMT1RfU1BESUZfUklHSFQyKTsKKwkJCX0KKwkJCSpyYXRlX3RhYmxlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzbG90cyB8PSAoMTw8QUM5N19TTE9UX1BDTV9DRU5URVIpfCgxPDxBQzk3X1NMT1RfTEZFKTsKKwkJCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKQorCQkJCSpzcGRpZl9zbG90cyA9ICgxPDxBQzk3X1NMT1RfU1BESUZfTEVGVDIpfCgxPDxBQzk3X1NMT1RfU1BESUZfUklHSFQyKTsKKwkJCSpyYXRlX3RhYmxlID0gMjsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBzbG90czsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBzaG9ydCBzbG90czsKKwkJc2xvdHMgPSAoMTw8QUM5N19TTE9UX1BDTV9MRUZUKXwoMTw8QUM5N19TTE9UX1BDTV9SSUdIVCk7CisJCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpCisJCQlzbG90cyB8PSAoMTw8QUM5N19TTE9UX1BDTV9TTEVGVCl8KDE8PEFDOTdfU0xPVF9QQ01fU1JJR0hUKTsKKwkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKQorCQkJc2xvdHMgfD0gKDE8PEFDOTdfU0xPVF9QQ01fQ0VOVEVSKXwoMTw8QUM5N19TTE9UX0xGRSk7CisJCWlmIChhYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKSB7CisJCQlpZiAoIShhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpKQorCQkJCSpzcGRpZl9zbG90cyA9ICgxPDxBQzk3X1NMT1RfU1BESUZfTEVGVCl8KDE8PEFDOTdfU0xPVF9TUERJRl9SSUdIVCk7CisJCQllbHNlIGlmICghKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKSkKKwkJCQkqc3BkaWZfc2xvdHMgPSAoMTw8QUM5N19TTE9UX1NQRElGX0xFRlQxKXwoMTw8QUM5N19TTE9UX1NQRElGX1JJR0hUMSk7CisJCQllbHNlCisJCQkJKnNwZGlmX3Nsb3RzID0gKDE8PEFDOTdfU0xPVF9TUERJRl9MRUZUMil8KDE8PEFDOTdfU0xPVF9TUERJRl9SSUdIVDIpOworCQl9CisJCSpyYXRlX3RhYmxlID0gMDsKKwkJcmV0dXJuIHNsb3RzOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdldF9jc2xvdHMoYWM5N190ICphYzk3KQoreworCXVuc2lnbmVkIHNob3J0IHNsb3RzOworCisJaWYgKCFhYzk3X2lzX2F1ZGlvKGFjOTcpKQorCQlyZXR1cm4gMDsKKwlzbG90cyA9ICgxPDxBQzk3X1NMT1RfUENNX0xFRlQpfCgxPDxBQzk3X1NMT1RfUENNX1JJR0hUKTsKKwlzbG90cyB8PSAoMTw8QUM5N19TTE9UX01JQyk7CisJcmV0dXJuIHNsb3RzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9yYXRlcyhzdHJ1Y3QgYWM5N19wY20gKnBjbSwgdW5zaWduZWQgaW50IGNpZHgsIHVuc2lnbmVkIHNob3J0IHNsb3RzLCBpbnQgZGJsKQoreworCWludCBpLCBpZHg7CisJdW5zaWduZWQgaW50IHJhdGVzID0gfjA7CisJdW5zaWduZWQgY2hhciByZWc7CisKKwlmb3IgKGkgPSAzOyBpIDwgMTI7IGkrKykgeworCQlpZiAoIShzbG90cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlyZWcgPSBnZXRfc2xvdF9yZWcocGNtLCBjaWR4LCBpLCBkYmwpOworCQlzd2l0Y2ggKHJlZykgeworCQljYXNlIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFOglpZHggPSBBQzk3X1JBVEVTX0ZST05UX0RBQzsgYnJlYWs7CisJCWNhc2UgQUM5N19QQ01fU1VSUl9EQUNfUkFURToJaWR4ID0gQUM5N19SQVRFU19TVVJSX0RBQzsgYnJlYWs7CisJCWNhc2UgQUM5N19QQ01fTEZFX0RBQ19SQVRFOglpZHggPSBBQzk3X1JBVEVTX0xGRV9EQUM7IGJyZWFrOworCQljYXNlIEFDOTdfUENNX0xSX0FEQ19SQVRFOglpZHggPSBBQzk3X1JBVEVTX0FEQzsgYnJlYWs7CisJCWNhc2UgQUM5N19QQ01fTUlDX0FEQ19SQVRFOglpZHggPSBBQzk3X1JBVEVTX01JQ19BREM7IGJyZWFrOworCQlkZWZhdWx0OgkJCWlkeCA9IEFDOTdfUkFURVNfU1BESUY7IGJyZWFrOworCQl9CisJCXJhdGVzICY9IHBjbS0+cltkYmxdLmNvZGVjW2NpZHhdLT5yYXRlc1tpZHhdOworCX0KKwlpZiAoIWRibCkKKwkJcmF0ZXMgJj0gfihTTkRSVl9QQ01fUkFURV82NDAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJCSAgIFNORFJWX1BDTV9SQVRFXzk2MDAwKTsKKwlyZXR1cm4gcmF0ZXM7Cit9CisKKy8qKgorICogc25kX2FjOTdfcGNtX2Fzc2lnbiAtIGFzc2lnbiBBQzk3IHNsb3RzIHRvIGdpdmVuIFBDTSBzdHJlYW1zCisgKiBAYnVzOiB0aGUgYWM5NyBidXMgaW5zdGFuY2UKKyAqIEBwY21zX2NvdW50OiBjb3VudCBvZiBQQ01zIHRvIGJlIGFzc2lnbmVkCisgKiBAcGNtczogUENNcyB0byBiZSBhc3NpZ25lZAorICoKKyAqIEl0IGFzc2lnbnMgYXZhaWxhYmxlIEFDOTcgc2xvdHMgZm9yIGdpdmVuIFBDTXMuIElmIG5vbmUgb3Igb25seQorICogc29tZSBzbG90cyBhcmUgYXZhaWxhYmxlLCBwY20tPnh4eC5zbG90cyBhbmQgcGNtLT54eHgucnNsb3RzW10gbWVtYmVycworICogYXJlIHJlZHVjZWQgYW5kIG1pZ2h0IGJlIHplcm8uCisgKi8KK2ludCBzbmRfYWM5N19wY21fYXNzaWduKGFjOTdfYnVzX3QgKmJ1cywKKwkJCXVuc2lnbmVkIHNob3J0IHBjbXNfY291bnQsCisJCQljb25zdCBzdHJ1Y3QgYWM5N19wY20gKnBjbXMpCit7CisJaW50IGksIGosIGs7CisJY29uc3Qgc3RydWN0IGFjOTdfcGNtICpwY207CisJc3RydWN0IGFjOTdfcGNtICpycGNtcywgKnJwY207CisJdW5zaWduZWQgc2hvcnQgYXZhaWxfc2xvdHNbMl1bNF07CisJdW5zaWduZWQgY2hhciByYXRlX3RhYmxlWzJdWzRdOworCXVuc2lnbmVkIHNob3J0IHRtcCwgc2xvdHM7CisJdW5zaWduZWQgc2hvcnQgc3BkaWZfc2xvdHNbNF07CisJdW5zaWduZWQgaW50IHJhdGVzOworCWFjOTdfdCAqY29kZWM7CisKKwlycGNtcyA9IGtjYWxsb2MocGNtc19jb3VudCwgc2l6ZW9mKHN0cnVjdCBhYzk3X3BjbSksIEdGUF9LRVJORUwpOworCWlmIChycGNtcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoYXZhaWxfc2xvdHMsIDAsIHNpemVvZihhdmFpbF9zbG90cykpOworCW1lbXNldChyYXRlX3RhYmxlLCAwLCBzaXplb2YocmF0ZV90YWJsZSkpOworCW1lbXNldChzcGRpZl9zbG90cywgMCwgc2l6ZW9mKHNwZGlmX3Nsb3RzKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljb2RlYyA9IGJ1cy0+Y29kZWNbaV07CisJCWlmICghY29kZWMpCisJCQljb250aW51ZTsKKwkJYXZhaWxfc2xvdHNbMF1baV0gPSBnZXRfcHNsb3RzKGNvZGVjLCAmcmF0ZV90YWJsZVswXVtpXSwgJnNwZGlmX3Nsb3RzW2ldKTsKKwkJYXZhaWxfc2xvdHNbMV1baV0gPSBnZXRfY3Nsb3RzKGNvZGVjKTsKKwkJaWYgKCEoY29kZWMtPnNjYXBzICYgQUM5N19TQ0FQX0lOREVQX1NESU4pKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJaWYgKGJ1cy0+Y29kZWNbal0pCisJCQkJCWF2YWlsX3Nsb3RzWzFdW2ldICY9IH5hdmFpbF9zbG90c1sxXVtqXTsKKwkJCX0KKwkJfQorCX0KKwkvKiBmaXJzdCBzdGVwIC0gZXhjbHVzaXZlIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGNtc19jb3VudDsgaSsrKSB7CisJCXBjbSA9ICZwY21zW2ldOworCQlycGNtID0gJnJwY21zW2ldOworCQkvKiBsb3ctbGV2ZWwgZHJpdmVyIHRoaW5rcyB0aGF0IGl0J3MgbW9yZSBjbGV2ZXIgKi8KKwkJaWYgKHBjbS0+Y29weV9mbGFnKSB7CisJCQkqcnBjbSA9ICpwY207CisJCQljb250aW51ZTsKKwkJfQorCQlycGNtLT5zdHJlYW0gPSBwY20tPnN0cmVhbTsKKwkJcnBjbS0+ZXhjbHVzaXZlID0gcGNtLT5leGNsdXNpdmU7CisJCXJwY20tPnNwZGlmID0gcGNtLT5zcGRpZjsKKwkJcnBjbS0+cHJpdmF0ZV92YWx1ZSA9IHBjbS0+cHJpdmF0ZV92YWx1ZTsKKwkJcnBjbS0+YnVzID0gYnVzOworCQlycGNtLT5yYXRlcyA9IH4wOworCQlzbG90cyA9IHBjbS0+clswXS5zbG90czsKKwkJZm9yIChqID0gMDsgaiA8IDQgJiYgc2xvdHM7IGorKykgeworCQkJaWYgKCFidXMtPmNvZGVjW2pdKQorCQkJCWNvbnRpbnVlOworCQkJcmF0ZXMgPSB+MDsKKwkJCWlmIChwY20tPnNwZGlmICYmIHBjbS0+c3RyZWFtID09IDApCisJCQkJdG1wID0gc3BkaWZfc2xvdHNbal07CisJCQllbHNlCisJCQkJdG1wID0gYXZhaWxfc2xvdHNbcGNtLT5zdHJlYW1dW2pdOworCQkJaWYgKHBjbS0+ZXhjbHVzaXZlKSB7CisJCQkJLyogZXhjbHVzaXZlIGFjY2VzcyAqLworCQkJCXRtcCAmPSBzbG90czsKKwkJCQlmb3IgKGsgPSAwOyBrIDwgaTsgaysrKSB7CisJCQkJCWlmIChycGNtLT5zdHJlYW0gPT0gcnBjbXNba10uc3RyZWFtKQorCQkJCQkJdG1wICY9IH5ycGNtc1trXS5yWzBdLnJzbG90c1tqXTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIG5vbi1leGNsdXNpdmUgYWNjZXNzICovCisJCQkJdG1wICY9IHBjbS0+clswXS5zbG90czsKKwkJCX0KKwkJCWlmICh0bXApIHsKKwkJCQlycGNtLT5yWzBdLnJzbG90c1tqXSA9IHRtcDsKKwkJCQlycGNtLT5yWzBdLmNvZGVjW2pdID0gYnVzLT5jb2RlY1tqXTsKKwkJCQlycGNtLT5yWzBdLnJhdGVfdGFibGVbal0gPSByYXRlX3RhYmxlW3BjbS0+c3RyZWFtXVtqXTsKKwkJCQlpZiAoYnVzLT5ub192cmEpCisJCQkJCXJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CisJCQkJZWxzZQorCQkJCQlyYXRlcyA9IGdldF9yYXRlcyhycGNtLCBqLCB0bXAsIDApOworCQkJCWlmIChwY20tPmV4Y2x1c2l2ZSkKKwkJCQkJYXZhaWxfc2xvdHNbcGNtLT5zdHJlYW1dW2pdICY9IH50bXA7CisJCQl9CisJCQlzbG90cyAmPSB+dG1wOworCQkJcnBjbS0+clswXS5zbG90cyB8PSB0bXA7CisJCQlycGNtLT5yYXRlcyAmPSByYXRlczsKKwkJfQorCQkvKiBmb3IgZG91YmxlIHJhdGUsIHdlIGNoZWNrIHRoZSBmaXJzdCBjb2RlYyBvbmx5ICovCisJCWlmIChwY20tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICYmCisJCSAgICBidXMtPmNvZGVjWzBdICYmIChidXMtPmNvZGVjWzBdLT5mbGFncyAmIEFDOTdfRE9VQkxFX1JBVEUpICYmCisJCSAgICByYXRlX3RhYmxlW3BjbS0+c3RyZWFtXVswXSA9PSAwKSB7CisJCQl0bXAgPSAoMTw8QUM5N19TTE9UX1BDTV9MRUZUKSB8ICgxPDxBQzk3X1NMT1RfUENNX1JJR0hUKSB8CisJCQkgICAgICAoMTw8QUM5N19TTE9UX1BDTV9MRUZUXzApIHwgKDE8PEFDOTdfU0xPVF9QQ01fUklHSFRfMCk7CisJCQlpZiAoKHRtcCAmIHBjbS0+clsxXS5zbG90cykgPT0gdG1wKSB7CisJCQkJcnBjbS0+clsxXS5zbG90cyA9IHRtcDsKKwkJCQlycGNtLT5yWzFdLnJzbG90c1swXSA9IHRtcDsKKwkJCQlycGNtLT5yWzFdLnJhdGVfdGFibGVbMF0gPSAwOworCQkJCXJwY20tPnJbMV0uY29kZWNbMF0gPSBidXMtPmNvZGVjWzBdOworCQkJCWlmIChwY20tPmV4Y2x1c2l2ZSkKKwkJCQkJYXZhaWxfc2xvdHNbcGNtLT5zdHJlYW1dWzBdICY9IH50bXA7CisJCQkJaWYgKGJ1cy0+bm9fdnJhKQorCQkJCQlyYXRlcyA9IFNORFJWX1BDTV9SQVRFXzk2MDAwOworCQkJCWVsc2UKKwkJCQkJcmF0ZXMgPSBnZXRfcmF0ZXMocnBjbSwgMCwgdG1wLCAxKTsKKwkJCQlycGNtLT5yYXRlcyB8PSByYXRlczsKKwkJCX0KKwkJfQorCQlpZiAocnBjbS0+cmF0ZXMgPT0gfjApCisJCQlycGNtLT5yYXRlcyA9IDA7IC8qIG5vdCB1c2VkICovCisJfQorCWJ1cy0+cGNtc19jb3VudCA9IHBjbXNfY291bnQ7CisJYnVzLT5wY21zID0gcnBjbXM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2FjOTdfcGNtX29wZW4gLSBvcGVucyB0aGUgZ2l2ZW4gQUM5NyBwY20KKyAqIEBwY206IHRoZSBhYzk3IHBjbSBpbnN0YW5jZQorICogQHJhdGU6IHJhdGUgaW4gSHosIGlmIGNvZGVjIGRvZXMgbm90IHN1cHBvcnQgVlJBLCB0aGlzIHZhbHVlIG11c3QgYmUgNDgwMDBIegorICogQGNmZzogb3V0cHV0IHN0cmVhbSBjaGFyYWN0ZXJpc3RpY3MKKyAqIEBzbG90czogYSBzdWJzZXQgb2YgYWxsb2NhdGVkIHNsb3RzIChzbmRfYWM5N19wY21fYXNzaWduKSBmb3IgdGhpcyBwY20KKyAqCisgKiBJdCBsb2NrcyB0aGUgc3BlY2lmaWVkIHNsb3RzIGFuZCBzZXRzIHRoZSBnaXZlbiByYXRlIHRvIEFDOTcgcmVnaXN0ZXJzLgorICovCitpbnQgc25kX2FjOTdfcGNtX29wZW4oc3RydWN0IGFjOTdfcGNtICpwY20sIHVuc2lnbmVkIGludCByYXRlLAorCQkgICAgICBlbnVtIGFjOTdfcGNtX2NmZyBjZmcsIHVuc2lnbmVkIHNob3J0IHNsb3RzKQoreworCWFjOTdfYnVzX3QgKmJ1czsKKwlpbnQgaSwgY2lkeCwgciwgb2tfZmxhZzsKKwl1bnNpZ25lZCBpbnQgcmVnX29rWzRdID0gezAsMCwwLDB9OworCXVuc2lnbmVkIGNoYXIgcmVnOworCWludCBlcnIgPSAwOworCisJciA9IHJhdGUgPiA0ODAwMDsKKwlidXMgPSBwY20tPmJ1czsKKwlpZiAoY2ZnID09IEFDOTdfUENNX0NGR19TUERJRikgeworCQlpbnQgZXJyOworCQlmb3IgKGNpZHggPSAwOyBjaWR4IDwgNDsgY2lkeCsrKQorCQkJaWYgKGJ1cy0+Y29kZWNbY2lkeF0gJiYgKGJ1cy0+Y29kZWNbY2lkeF0tPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpKSB7CisJCQkJZXJyID0gc2V0X3NwZGlmX3JhdGUoYnVzLT5jb2RlY1tjaWR4XSwgcmF0ZSk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJfQorCXNwaW5fbG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7CisJZm9yIChpID0gMzsgaSA8IDEyOyBpKyspIHsKKwkJaWYgKCEoc2xvdHMgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJb2tfZmxhZyA9IDA7CisJCWZvciAoY2lkeCA9IDA7IGNpZHggPCA0OyBjaWR4KyspIHsKKwkJCWlmIChidXMtPnVzZWRfc2xvdHNbcGNtLT5zdHJlYW1dW2NpZHhdICYgKDEgPDwgaSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7CisJCQkJZXJyID0gLUVCVVNZOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlpZiAocGNtLT5yW3JdLnJzbG90c1tjaWR4XSAmICgxIDw8IGkpKSB7CisJCQkJYnVzLT51c2VkX3Nsb3RzW3BjbS0+c3RyZWFtXVtjaWR4XSB8PSAoMSA8PCBpKTsKKwkJCQlva19mbGFnKys7CisJCQl9CisJCX0KKwkJaWYgKCFva19mbGFnKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIGZvciBBQzk3IHNsb3QgJWlcbiIsIGkpOworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwY20tPmJ1cy0+YnVzX2xvY2spOworCWZvciAoaSA9IDM7IGkgPCAxMjsgaSsrKSB7CisJCWlmICghKHNsb3RzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWZvciAoY2lkeCA9IDA7IGNpZHggPCA0OyBjaWR4KyspIHsKKwkJCWlmIChwY20tPnJbcl0ucnNsb3RzW2NpZHhdICYgKDEgPDwgaSkpIHsKKwkJCQlyZWcgPSBnZXRfc2xvdF9yZWcocGNtLCBjaWR4LCBpLCByKTsKKwkJCQlpZiAocmVnID09IDB4ZmYpIHsKKwkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBBQzk3IHNsb3QgJWk/XG4iLCBpKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChyZWdfb2tbY2lkeF0gJiAoMSA8PCAocmVnIC0gQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpKSkKKwkJCQkJY29udGludWU7CisJCQkJLy9wcmludGsoS0VSTl9ERUJVRyAic2V0dGluZyBhYzk3IHJlZyAweCV4IHRvIHJhdGUgJWRcbiIsIHJlZywgcmF0ZSk7CisJCQkJZXJyID0gc25kX2FjOTdfc2V0X3JhdGUocGNtLT5yW3JdLmNvZGVjW2NpZHhdLCByZWcsIHJhdGUpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBpbiBzbmRfYWM5N19zZXRfcmF0ZTogY2lkeD0lZCwgcmVnPTB4JXgsIHJhdGU9JWQsIGVycj0lZFxuIiwgY2lkeCwgcmVnLCByYXRlLCBlcnIpOworCQkJCWVsc2UKKwkJCQkJcmVnX29rW2NpZHhdIHw9ICgxIDw8IChyZWcgLSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSkpOworCQkJfQorCQl9CisJfQorCXBjbS0+YXNsb3RzID0gc2xvdHM7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlwY20tPmFzbG90cyA9IHNsb3RzOworCXNuZF9hYzk3X3BjbV9jbG9zZShwY20pOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc25kX2FjOTdfcGNtX2Nsb3NlIC0gY2xvc2VzIHRoZSBnaXZlbiBBQzk3IHBjbQorICogQHBjbTogdGhlIGFjOTcgcGNtIGluc3RhbmNlCisgKgorICogSXQgZnJlZXMgdGhlIGxvY2tlZCBBQzk3IHNsb3RzLgorICovCitpbnQgc25kX2FjOTdfcGNtX2Nsb3NlKHN0cnVjdCBhYzk3X3BjbSAqcGNtKQoreworCWFjOTdfYnVzX3QgKmJ1czsKKwl1bnNpZ25lZCBzaG9ydCBzbG90cyA9IHBjbS0+YXNsb3RzOworCWludCBpLCBjaWR4OworCisJYnVzID0gcGNtLT5idXM7CisJc3Bpbl9sb2NrX2lycSgmcGNtLT5idXMtPmJ1c19sb2NrKTsKKwlmb3IgKGkgPSAzOyBpIDwgMTI7IGkrKykgeworCQlpZiAoIShzbG90cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGNpZHggPSAwOyBjaWR4IDwgNDsgY2lkeCsrKQorCQkJYnVzLT51c2VkX3Nsb3RzW3BjbS0+c3RyZWFtXVtjaWR4XSAmPSB+KDEgPDwgaSk7CisJfQorCXBjbS0+YXNsb3RzID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnBjbS0+YnVzLT5idXNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG91YmxlX3JhdGVfaHdfY29uc3RyYWludF9yYXRlKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCQkJICBzbmRfcGNtX2h3X3J1bGVfdCAqcnVsZSkKK3sKKwlzbmRfaW50ZXJ2YWxfdCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJaWYgKGNoYW5uZWxzLT5taW4gPiAyKSB7CisJCXN0YXRpYyBjb25zdCBzbmRfaW50ZXJ2YWxfdCBzaW5nbGVfcmF0ZXMgPSB7CisJCQkubWluID0gMSwKKwkJCS5tYXggPSA0ODAwMCwKKwkJfTsKKwkJc25kX2ludGVydmFsX3QgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUocmF0ZSwgJnNpbmdsZV9yYXRlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvdWJsZV9yYXRlX2h3X2NvbnN0cmFpbnRfY2hhbm5lbHMoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCQkgICAgICBzbmRfcGNtX2h3X3J1bGVfdCAqcnVsZSkKK3sKKwlzbmRfaW50ZXJ2YWxfdCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCWlmIChyYXRlLT5taW4gPiA0ODAwMCkgeworCQlzdGF0aWMgY29uc3Qgc25kX2ludGVydmFsX3QgZG91YmxlX3JhdGVfY2hhbm5lbHMgPSB7CisJCQkubWluID0gMiwKKwkJCS5tYXggPSAyLAorCQl9OworCQlzbmRfaW50ZXJ2YWxfdCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKGNoYW5uZWxzLCAmZG91YmxlX3JhdGVfY2hhbm5lbHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzbmRfYWM5N19wY21fZG91YmxlX3JhdGVfcnVsZXMgLSBzZXQgZG91YmxlIHJhdGUgY29uc3RyYWludHMKKyAqIEBydW50aW1lOiB0aGUgcnVudGltZSBvZiB0aGUgYWM5NyBmcm9udCBwbGF5YmFjayBwY20KKyAqCisgKiBJbnN0YWxscyB0aGUgaGFyZHdhcmUgY29uc3RyYWludCBydWxlcyB0byBwcmV2ZW50IHVzaW5nIGRvdWJsZSByYXRlcyBhbmQKKyAqIG1vcmUgdGhhbiB0d28gY2hhbm5lbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworaW50IHNuZF9hYzk3X3BjbV9kb3VibGVfcmF0ZV9ydWxlcyhzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgIGRvdWJsZV9yYXRlX2h3X2NvbnN0cmFpbnRfcmF0ZSwgTlVMTCwKKwkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJCSAgZG91YmxlX3JhdGVfaHdfY29uc3RyYWludF9jaGFubmVscywgTlVMTCwKKwkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcHJvYy5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MGIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcHJvYy5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NworICoKKyAqICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgdG8gQUMgJzk3IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uIHJldmlzaW9uIDIuMgorICogIGJ5IEludGVsIENvcnBvcmF0aW9uIChodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbSkuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSAiYWM5N19sb2NhbC5oIgorI2luY2x1ZGUgImFjOTdfaWQuaCIKKworLyoKKyAqIHByb2MgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQgc25kX2FjOTdfcHJvY19yZWFkX2Z1bmN0aW9ucyhhYzk3X3QgKmFjOTcsIHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIpCit7CisJaW50IGhlYWRlciA9IDAsIGZ1bmN0aW9uOworCXVuc2lnbmVkIHNob3J0IGluZm8sIHNlbnNlX2luZm87CisJc3RhdGljIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWVzWzEyXSA9IHsKKwkJIk1hc3RlciBPdXQiLCAiQVVYIE91dCIsICJDZW50ZXIvTEZFIE91dCIsICJTUERJRiBPdXQiLAorCQkiUGhvbmUgSW4iLCAiTWljIDEiLCAiTWljIDIiLCAiTGluZSBJbiIsICJDRCBJbiIsICJWaWRlbyBJbiIsCisJCSJBdXggSW4iLCAiTW9ubyBPdXQiCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbG9jYXRpb25zWzhdID0geworCQkiUmVhciBJL08gUGFuZWwiLCAiRnJvbnQgUGFuZWwiLCAiTW90aGVyYm9hcmQiLCAiRG9jay9FeHRlcm5hbCIsCisJCSJyZXNlcnZlZCIsICJyZXNlcnZlZCIsICJyZXNlcnZlZCIsICJOQy91bnVzZWQiCisJfTsKKworCWZvciAoZnVuY3Rpb24gPSAwOyBmdW5jdGlvbiA8IDEyOyArK2Z1bmN0aW9uKSB7CisJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfRlVOQ19TRUxFQ1QsIGZ1bmN0aW9uIDw8IDEpOworCQlpbmZvID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0ZVTkNfSU5GTyk7CisJCWlmICghKGluZm8gJiAweDAwMDEpKQorCQkJY29udGludWU7CisJCWlmICghaGVhZGVyKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiAgICAgICAgICAgICAgICAgICAgR2FpbiAgICAgSW52ZXJ0ZWQgIEJ1ZmZlciBkZWxheSAgTG9jYXRpb25cbiIpOworCQkJaGVhZGVyID0gMTsKKwkJfQorCQlzZW5zZV9pbmZvID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1NFTlNFX0lORk8pOworCQlzbmRfaXByaW50ZihidWZmZXIsICIlLTE3czogJTNkLiVkIGRCViAgICAlYyAgICAgICUyZC9mcyAgICAgICAgICVzXG4iLAorCQkJICAgIGZ1bmN0aW9uX25hbWVzW2Z1bmN0aW9uXSwKKwkJCSAgICAoaW5mbyAmIDB4ODAwMCA/IC0xIDogMSkgKiAoKGluZm8gJiAweDcwMDApID4+IDEyKSAqIDMgLyAyLAorCQkJICAgICgoaW5mbyAmIDB4MDgwMCkgPj4gMTEpICogNSwKKwkJCSAgICBpbmZvICYgMHgwNDAwID8gJ1gnIDogJy0nLAorCQkJICAgIChpbmZvICYgMHgwM2UwKSA+PiA1LAorCQkJICAgIGxvY2F0aW9uc1tzZW5zZV9pbmZvID4+IDEzXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfYWM5N19wcm9jX3JlYWRfbWFpbihhYzk3X3QgKmFjOTcsIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyLCBpbnQgc3ViaWR4KQoreworCWNoYXIgbmFtZVs2NF07CisJdW5zaWduZWQgc2hvcnQgdmFsLCB0bXAsIGV4dCwgbWV4dDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3BkaWZfc2xvdHNbNF0gPSB7ICIgU1BESUY9My80IiwgIiBTUERJRj03LzgiLCAiIFNQRElGPTYvOSIsICIgU1BESUY9MTAvMTEiIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKnNwZGlmX3JhdGVzWzRdID0geyAiIFJhdGU9NDQuMWtIeiIsICIgUmF0ZT1yZXMiLCAiIFJhdGU9NDhrSHoiLCAiIFJhdGU9MzJrSHoiIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKnNwZGlmX3JhdGVzX2NzNDIwNVs0XSA9IHsgIiBSYXRlPTQ4a0h6IiwgIiBSYXRlPTQ0LjFrSHoiLCAiIFJhdGU9cmVzIiwgIiBSYXRlPXJlcyIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqZG91YmxlX3JhdGVfc2xvdHNbNF0gPSB7ICIxMC8xMSIsICI3LzgiLCAicmVzZXJ2ZWQiLCAicmVzZXJ2ZWQiIH07CisKKwlzbmRfYWM5N19nZXRfbmFtZShOVUxMLCBhYzk3LT5pZCwgbmFtZSwgMCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiJWQtJWQvJWQ6ICVzXG5cbiIsIGFjOTctPmFkZHIsIGFjOTctPm51bSwgc3ViaWR4LCBuYW1lKTsKKwlpZiAoKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0FVRElPKSA9PSAwKQorCQlnb3RvIF9fbW9kZW07CisKKwlpZiAoKGFjOTctPmV4dF9pZCAmIEFDOTdfRUlfUkVWX01BU0spID49IEFDOTdfRUlfUkVWXzIzKSB7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19JTlRfUEFHSU5HKTsKKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19JTlRfUEFHSU5HLAorCQkJCSAgICAgQUM5N19QQUdFX01BU0ssIEFDOTdfUEFHRV8xKTsKKwkJdG1wID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0NPREVDX0NMQVNTX1JFVik7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJldmlzaW9uICAgICAgICAgOiAweCUwMnhcbiIsIHRtcCAmIDB4ZmYpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJDb21wYXQuIENsYXNzICAgIDogMHglMDJ4XG4iLCAodG1wID4+IDgpICYgMHgxZik7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN1YnN5cy4gVmVuZG9yIElEOiAweCUwNHhcbiIsCisJCQkgICAgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1BDSV9TVklEKSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN1YnN5cy4gSUQgICAgICAgOiAweCUwNHhcblxuIiwKKwkJCSAgICBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfUENJX1NJRCkpOworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsCisJCQkJICAgICBBQzk3X1BBR0VfTUFTSywgdmFsICYgQUM5N19QQUdFX01BU0spOworCX0KKworCS8vIHZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19SRVNFVCk7CisJdmFsID0gYWM5Ny0+Y2FwczsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDYXBhYmlsaXRpZXMgICAgIDolcyVzJXMlcyVzJXNcbiIsCisJICAgIAkgICAgdmFsICYgQUM5N19CQ19ERURJQ0FURURfTUlDID8gIiAtZGVkaWNhdGVkIE1JQyBQQ00gSU4gY2hhbm5lbC0iIDogIiIsCisJCSAgICB2YWwgJiBBQzk3X0JDX1JFU0VSVkVEMSA/ICIgLXJlc2VydmVkMS0iIDogIiIsCisJCSAgICB2YWwgJiBBQzk3X0JDX0JBU1NfVFJFQkxFID8gIiAtYmFzcyAmIHRyZWJsZS0iIDogIiIsCisJCSAgICB2YWwgJiBBQzk3X0JDX1NJTV9TVEVSRU8gPyAiIC1zaW11bGF0ZWQgc3RlcmVvLSIgOiAiIiwKKwkJICAgIHZhbCAmIEFDOTdfQkNfSEVBRFBIT05FID8gIiAtaGVhZHBob25lIG91dC0iIDogIiIsCisJCSAgICB2YWwgJiBBQzk3X0JDX0xPVURORVNTID8gIiAtbG91ZG5lc3MtIiA6ICIiKTsKKwl0bXAgPSBhYzk3LT5jYXBzICYgQUM5N19CQ19EQUNfTUFTSzsKKwlzbmRfaXByaW50ZihidWZmZXIsICJEQUMgcmVzb2x1dGlvbiAgIDogJXMlcyVzJXNcbiIsCisJCSAgICB0bXAgPT0gQUM5N19CQ18xNkJJVF9EQUMgPyAiMTYtYml0IiA6ICIiLAorCQkgICAgdG1wID09IEFDOTdfQkNfMThCSVRfREFDID8gIjE4LWJpdCIgOiAiIiwKKwkJICAgIHRtcCA9PSBBQzk3X0JDXzIwQklUX0RBQyA/ICIyMC1iaXQiIDogIiIsCisJCSAgICB0bXAgPT0gQUM5N19CQ19EQUNfTUFTSyA/ICI/Pz8iIDogIiIpOworCXRtcCA9IGFjOTctPmNhcHMgJiBBQzk3X0JDX0FEQ19NQVNLOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQyByZXNvbHV0aW9uICAgOiAlcyVzJXMlc1xuIiwKKwkJICAgIHRtcCA9PSBBQzk3X0JDXzE2QklUX0FEQyA/ICIxNi1iaXQiIDogIiIsCisJCSAgICB0bXAgPT0gQUM5N19CQ18xOEJJVF9BREMgPyAiMTgtYml0IiA6ICIiLAorCQkgICAgdG1wID09IEFDOTdfQkNfMjBCSVRfQURDID8gIjIwLWJpdCIgOiAiIiwKKwkJICAgIHRtcCA9PSBBQzk3X0JDX0FEQ19NQVNLID8gIj8/PyIgOiAiIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiM0QgZW5oYW5jZW1lbnQgICA6ICVzXG4iLAorCQlzbmRfYWM5N19zdGVyZW9fZW5oYW5jZW1lbnRzWyh2YWwgPj4gMTApICYgMHgxZl0pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQ3VycmVudCBzZXR1cFxuIik7CisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X01JQyk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiTWljIGdhaW4gICAgICAgICA6ICVzIFslc11cbiIsIHZhbCAmIDB4MDA0MCA/ICIrMjBkQiIgOiAiKzBkQiIsIGFjOTctPnJlZ3NbQUM5N19NSUNdICYgMHgwMDQwID8gIisyMGRCIiA6ICIrMGRCIik7CisJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0dFTkVSQUxfUFVSUE9TRSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiUE9QIHBhdGggICAgICAgICA6ICVzIDNEXG4iCisJCSAgICAiU2ltLiBzdGVyZW8gICAgICA6ICVzXG4iCisJCSAgICAiM0QgZW5oYW5jZW1lbnQgICA6ICVzXG4iCisJCSAgICAiTG91ZG5lc3MgICAgICAgICA6ICVzXG4iCisJCSAgICAiTW9ubyBvdXRwdXQgICAgICA6ICVzXG4iCisJCSAgICAiTWljIHNlbGVjdCAgICAgICA6ICVzXG4iCisJCSAgICAiQURDL0RBQyBsb29wYmFjayA6ICVzXG4iLAorCQkgICAgdmFsICYgMHg4MDAwID8gInBvc3QiIDogInByZSIsCisJCSAgICB2YWwgJiAweDQwMDAgPyAib24iIDogIm9mZiIsCisJCSAgICB2YWwgJiAweDIwMDAgPyAib24iIDogIm9mZiIsCisJCSAgICB2YWwgJiAweDEwMDAgPyAib24iIDogIm9mZiIsCisJCSAgICB2YWwgJiAweDAyMDAgPyAiTWljIiA6ICJNSVgiLAorCQkgICAgdmFsICYgMHgwMTAwID8gIk1pYzIiIDogIk1pYzEiLAorCQkgICAgdmFsICYgMHgwMDgwID8gIm9uIiA6ICJvZmYiKTsKKwlpZiAoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9EUkEpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkRvdWJsZSByYXRlIHNsb3RzOiAlc1xuIiwKKwkJCSAgICBkb3VibGVfcmF0ZV9zbG90c1sodmFsID4+IDEwKSAmIDNdKTsKKworCWV4dCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9JRCk7CisJaWYgKGV4dCA9PSAwKQorCQlnb3RvIF9fbW9kZW07CisJCQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkV4dGVuZGVkIElEICAgICAgOiBjb2RlYz0laSByZXY9JWklcyVzJXMlcyBEU0E9JWklcyVzJXMlc1xuIiwKKwkJCShleHQgJiBBQzk3X0VJX0FERFJfTUFTSykgPj4gQUM5N19FSV9BRERSX1NISUZULAorCQkJKGV4dCAmIEFDOTdfRUlfUkVWX01BU0spID4+IEFDOTdfRUlfUkVWX1NISUZULAorCQkJZXh0ICYgQUM5N19FSV9BTUFQID8gIiBBTUFQIiA6ICIiLAorCQkJZXh0ICYgQUM5N19FSV9MREFDID8gIiBMREFDIiA6ICIiLAorCQkJZXh0ICYgQUM5N19FSV9TREFDID8gIiBTREFDIiA6ICIiLAorCQkJZXh0ICYgQUM5N19FSV9DREFDID8gIiBDREFDIiA6ICIiLAorCQkJKGV4dCAmIEFDOTdfRUlfREFDU19TTE9UX01BU0spID4+IEFDOTdfRUlfREFDU19TTE9UX1NISUZULAorCQkJZXh0ICYgQUM5N19FSV9WUk0gPyAiIFZSTSIgOiAiIiwKKwkJCWV4dCAmIEFDOTdfRUlfU1BESUYgPyAiIFNQRElGIiA6ICIiLAorCQkJZXh0ICYgQUM5N19FSV9EUkEgPyAiIERSQSIgOiAiIiwKKwkJCWV4dCAmIEFDOTdfRUlfVlJBID8gIiBWUkEiIDogIiIpOworCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkV4dGVuZGVkIHN0YXR1cyAgOiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCQl2YWwgJiBBQzk3X0VBX1BSTCA/ICIgUFJMIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9QUksgPyAiIFBSSyIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfRUFfUFJKID8gIiBQUkoiIDogIiIsCisJCQl2YWwgJiBBQzk3X0VBX1BSSSA/ICIgUFJJIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9TUENWID8gIiBTUENWIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9NREFDID8gIiBNQURDIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9MREFDID8gIiBMREFDIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9TREFDID8gIiBTREFDIiA6ICIiLAorCQkJdmFsICYgQUM5N19FQV9DREFDID8gIiBDREFDIiA6ICIiLAorCQkJZXh0ICYgQUM5N19FSV9TUERJRiA/IHNwZGlmX3Nsb3RzWyh2YWwgJiBBQzk3X0VBX1NQU0FfU0xPVF9NQVNLKSA+PiBBQzk3X0VBX1NQU0FfU0xPVF9TSElGVF0gOiAiIiwKKwkJCXZhbCAmIEFDOTdfRUFfVlJNID8gIiBWUk0iIDogIiIsCisJCQl2YWwgJiBBQzk3X0VBX1NQRElGID8gIiBTUERJRiIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfRUFfRFJBID8gIiBEUkEiIDogIiIsCisJCQl2YWwgJiBBQzk3X0VBX1ZSQSA/ICIgVlJBIiA6ICIiKTsKKwlpZiAoZXh0ICYgQUM5N19FSV9WUkEpIHsJLyogVlJBICovCisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJQQ00gZnJvbnQgREFDICAgIDogJWlIelxuIiwgdmFsKTsKKwkJaWYgKGV4dCAmIEFDOTdfRUlfU0RBQykgeworCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlBDTSBTdXJyIERBQyAgICAgOiAlaUh6XG4iLCB2YWwpOworCQl9CisJCWlmIChleHQgJiBBQzk3X0VJX0xEQUMpIHsKKwkJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19QQ01fTEZFX0RBQ19SQVRFKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlBDTSBMRkUgREFDICAgICAgOiAlaUh6XG4iLCB2YWwpOworCQl9CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19QQ01fTFJfQURDX1JBVEUpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJQQ00gQURDICAgICAgICAgIDogJWlIelxuIiwgdmFsKTsKKwl9CisJaWYgKGV4dCAmIEFDOTdfRUlfVlJNKSB7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19QQ01fTUlDX0FEQ19SQVRFKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUENNIE1JQyBBREMgICAgICA6ICVpSHpcbiIsIHZhbCk7CisJfQorCWlmICgoZXh0ICYgQUM5N19FSV9TUERJRikgfHwgKGFjOTctPmZsYWdzICYgQUM5N19DU19TUERJRikpIHsKKwkgICAgICAgIGlmIChhYzk3LT5mbGFncyAmIEFDOTdfQ1NfU1BESUYpCisJCQl2YWwgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQ1NSX1NQRElGKTsKKwkJZWxzZQorCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1NQRElGKTsKKworCQlzbmRfaXByaW50ZihidWZmZXIsICJTUERJRiBDb250cm9sICAgIDolcyVzJXMlcyBDYXRlZ29yeT0weCV4IEdlbmVyYXRpb249JWklcyVzJXNcbiIsCisJCQl2YWwgJiBBQzk3X1NDX1BSTyA/ICIgUFJPIiA6ICIgQ29uc3VtZXIiLAorCQkJdmFsICYgQUM5N19TQ19OQVVESU8gPyAiIE5vbi1hdWRpbyIgOiAiIFBDTSIsCisJCQl2YWwgJiBBQzk3X1NDX0NPUFkgPyAiIiA6ICIgQ29weXJpZ2h0IiwKKwkJCXZhbCAmIEFDOTdfU0NfUFJFID8gIiBQcmVlbXBoNTAvMTUiIDogIiIsCisJCQkodmFsICYgQUM5N19TQ19DQ19NQVNLKSA+PiBBQzk3X1NDX0NDX1NISUZULAorCQkJKHZhbCAmIEFDOTdfU0NfTCkgPj4gMTEsCisJCQkoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0NTX1NQRElGKSA/CisJCQkgICAgc3BkaWZfcmF0ZXNfY3M0MjA1Wyh2YWwgJiBBQzk3X1NDX1NQU1JfTUFTSykgPj4gQUM5N19TQ19TUFNSX1NISUZUXSA6CisJCQkgICAgc3BkaWZfcmF0ZXNbKHZhbCAmIEFDOTdfU0NfU1BTUl9NQVNLKSA+PiBBQzk3X1NDX1NQU1JfU0hJRlRdLAorCQkJKGFjOTctPmZsYWdzICYgQUM5N19DU19TUERJRikgPworCQkJICAgICh2YWwgJiBBQzk3X1NDX0RSUyA/ICIgVmFsaWRpdHkiIDogIiIpIDoKKwkJCSAgICAodmFsICYgQUM5N19TQ19EUlMgPyAiIERSUyIgOiAiIiksCisJCQkoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0NTX1NQRElGKSA/CisJCQkgICAgKHZhbCAmIEFDOTdfU0NfViA/ICIgRW5hYmxlZCIgOiAiIikgOgorCQkJICAgICh2YWwgJiBBQzk3X1NDX1YgPyAiIFZhbGlkaXR5IiA6ICIiKSk7CisJCS8qIEFMQzY1MCBzcGVjaWZpYyovCisJCWlmICgoYWM5Ny0+aWQgJiAweGZmZmZmZmYwKSA9PSAweDQxNGM0NzIwICYmCisJCSAgICAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9DTE9DSykgJiAweDAxKSkgeworCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9TUERJRl9JTlBVVF9TVEFUVVMyKTsKKwkJCWlmICh2YWwgJiBBQzk3X0FMQzY1MF9DTE9DS19MT0NLKSB7CisJCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9TUERJRl9JTlBVVF9TVEFUVVMxKTsKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICJTUERJRiBJbiBTdGF0dXMgIDolcyVzJXMlcyBDYXRlZ29yeT0weCV4IEdlbmVyYXRpb249JWkiLAorCQkJCQkgICAgdmFsICYgQUM5N19BTEM2NTBfUFJPID8gIiBQUk8iIDogIiBDb25zdW1lciIsCisJCQkJCSAgICB2YWwgJiBBQzk3X0FMQzY1MF9OQVVESU8gPyAiIE5vbi1hdWRpbyIgOiAiIFBDTSIsCisJCQkJCSAgICB2YWwgJiBBQzk3X0FMQzY1MF9DT1BZID8gIiIgOiAiIENvcHlyaWdodCIsCisJCQkJCSAgICB2YWwgJiBBQzk3X0FMQzY1MF9QUkUgPyAiIFByZWVtcGg1MC8xNSIgOiAiIiwKKwkJCQkJICAgICh2YWwgJiBBQzk3X0FMQzY1MF9DQ19NQVNLKSA+PiBBQzk3X0FMQzY1MF9DQ19TSElGVCwKKwkJCQkJICAgICh2YWwgJiBBQzk3X0FMQzY1MF9MKSA+PiAxNSk7CisJCQkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9TUERJRl9JTlBVVF9TVEFUVVMyKTsKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICIlcyBBY2N1cmFjeT0laSVzJXNcbiIsCisJCQkJCSAgICBzcGRpZl9yYXRlc1sodmFsICYgQUM5N19BTEM2NTBfU1BTUl9NQVNLKSA+PiBBQzk3X0FMQzY1MF9TUFNSX1NISUZUXSwKKwkJCQkJICAgICh2YWwgJiBBQzk3X0FMQzY1MF9DTE9DS19BQ0NVUkFDWSkgPj4gQUM5N19BTEM2NTBfQ0xPQ0tfU0hJRlQsCisJCQkJCSAgICAodmFsICYgQUM5N19BTEM2NTBfQ0xPQ0tfTE9DSyA/ICIgTG9ja2VkIiA6ICIgVW5sb2NrZWQiKSwKKwkJCQkJICAgICh2YWwgJiBBQzk3X0FMQzY1MF9WID8gIiBWYWxpZGl0eT8iIDogIiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJc25kX2lwcmludGYoYnVmZmVyLCAiU1BESUYgSW4gU3RhdHVzICA6IE5vdCBMb2NrZWRcbiIpOworCQkJfQorCQl9CisJfQorCWlmICgoYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9SRVZfTUFTSykgPj0gQUM5N19FSV9SRVZfMjMpIHsKKwkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0lOVF9QQUdJTkcpOworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0lOVF9QQUdJTkcsCisJCQkJICAgICBBQzk3X1BBR0VfTUFTSywgQUM5N19QQUdFXzEpOworCQlzbmRfYWM5N19wcm9jX3JlYWRfZnVuY3Rpb25zKGFjOTcsIGJ1ZmZlcik7CisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfSU5UX1BBR0lORywKKwkJCQkgICAgIEFDOTdfUEFHRV9NQVNLLCB2YWwgJiBBQzk3X1BBR0VfTUFTSyk7CisJfQorCisKKyAgICAgIF9fbW9kZW06CisJbWV4dCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9NSUQpOworCWlmIChtZXh0ID09IDApCisJCXJldHVybjsKKwkKKwlzbmRfaXByaW50ZihidWZmZXIsICJFeHRlbmRlZCBtb2RlbSBJRDogY29kZWM9JWklcyVzJXMlcyVzXG4iLAorCQkJKG1leHQgJiBBQzk3X01FSV9BRERSX01BU0spID4+IEFDOTdfTUVJX0FERFJfU0hJRlQsCisJCQltZXh0ICYgQUM5N19NRUlfQ0lEMiA/ICIgQ0lEMiIgOiAiIiwKKwkJCW1leHQgJiBBQzk3X01FSV9DSUQxID8gIiBDSUQxIiA6ICIiLAorCQkJbWV4dCAmIEFDOTdfTUVJX0hBTkRTRVQgPyAiIEhTRVQiIDogIiIsCisJCQltZXh0ICYgQUM5N19NRUlfTElORTIgPyAiIExJTjIiIDogIiIsCisJCQltZXh0ICYgQUM5N19NRUlfTElORTEgPyAiIExJTjEiIDogIiIpOworCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9NU1RBVFVTKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJNb2RlbSBzdGF0dXMgICAgIDolcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCXZhbCAmIEFDOTdfTUVBX0dQSU8gPyAiIEdQSU8iIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9NUkVGID8gIiBNUkVGIiA6ICIiLAorCQkJdmFsICYgQUM5N19NRUFfQURDMSA/ICIgQURDMSIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfTUVBX0RBQzEgPyAiIERBQzEiIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9BREMyID8gIiBBREMyIiA6ICIiLAorCQkJdmFsICYgQUM5N19NRUFfREFDMiA/ICIgREFDMiIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfTUVBX0hBREMgPyAiIEhBREMiIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9IREFDID8gIiBIREFDIiA6ICIiLAorCQkJdmFsICYgQUM5N19NRUFfUFJBID8gIiBQUkEoR1BJTykiIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9QUkIgPyAiIFBSQihyZXMpIiA6ICIiLAorCQkJdmFsICYgQUM5N19NRUFfUFJDID8gIiBQUkMoQURDMSkiIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9QUkQgPyAiIFBSRChEQUMxKSIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfTUVBX1BSRSA/ICIgUFJFKEFEQzIpIiA6ICIiLAorCQkJdmFsICYgQUM5N19NRUFfUFJGID8gIiBQUkYoREFDMikiIDogIiIsCisJCQl2YWwgJiBBQzk3X01FQV9QUkcgPyAiIFBSRyhIQURDKSIgOiAiIiwKKwkJCXZhbCAmIEFDOTdfTUVBX1BSSCA/ICIgUFJIKEhEQUMpIiA6ICIiKTsKKwlpZiAobWV4dCAmIEFDOTdfTUVJX0xJTkUxKSB7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19MSU5FMV9SQVRFKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiTGluZTEgcmF0ZSAgICAgICA6ICVpSHpcbiIsIHZhbCk7CisJfQorCWlmIChtZXh0ICYgQUM5N19NRUlfTElORTIpIHsKKwkJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0xJTkUyX1JBVEUpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJMaW5lMiByYXRlICAgICAgIDogJWlIelxuIiwgdmFsKTsKKwl9CisJaWYgKG1leHQgJiBBQzk3X01FSV9IQU5EU0VUKSB7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19IQU5EU0VUX1JBVEUpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJIZWFkc2V0IHJhdGUgICAgIDogJWlIelxuIiwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hYzk3X3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJYWM5N190ICphYzk3ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwkKKwlkb3duKCZhYzk3LT5wYWdlX211dGV4KTsKKwlpZiAoKGFjOTctPmlkICYgMHhmZmZmZmY0MCkgPT0gQUM5N19JRF9BRDE4ODEpIHsJLy8gQW5hbG9nIERldmljZXMgQUQxODgxLzg1Lzg2CisJCWludCBpZHg7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgMzsgaWR4KyspCisJCQlpZiAoYWM5Ny0+c3BlYy5hZDE4eHguaWRbaWR4XSkgeworCQkJCS8qIHNlbGVjdCBzaW5nbGUgY29kZWMgKi8KKwkJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcsIDB4NzAwMCwKKwkJCQkJCSAgICAgYWM5Ny0+c3BlYy5hZDE4eHgudW5jaGFpbmVkW2lkeF0gfCBhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVkW2lkeF0pOworCQkJCXNuZF9hYzk3X3Byb2NfcmVhZF9tYWluKGFjOTcsIGJ1ZmZlciwgaWR4KTsKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICJcblxuIik7CisJCQl9CisJCS8qIHNlbGVjdCBhbGwgY29kZWNzICovCisJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfU0VSSUFMX0NGRywgMHg3MDAwLCAweDcwMDApOworCQkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG5BRDE4WFggY29uZmlndXJhdGlvblxuIik7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlVuY2hhaW5lZCAgICAgICAgOiAweCUwNHgsMHglMDR4LDB4JTA0eFxuIiwKKwkJCWFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFswXSwKKwkJCWFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFsxXSwKKwkJCWFjOTctPnNwZWMuYWQxOHh4LnVuY2hhaW5lZFsyXSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNoYWluZWQgICAgICAgICAgOiAweCUwNHgsMHglMDR4LDB4JTA0eFxuIiwKKwkJCWFjOTctPnNwZWMuYWQxOHh4LmNoYWluZWRbMF0sCisJCQlhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVkWzFdLAorCQkJYWM5Ny0+c3BlYy5hZDE4eHguY2hhaW5lZFsyXSk7CisJfSBlbHNlIHsKKwkJc25kX2FjOTdfcHJvY19yZWFkX21haW4oYWM5NywgYnVmZmVyLCAwKTsKKwl9CisJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOworfQorCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworLyogZGlyZWN0IHJlZ2lzdGVyIHdyaXRlIGZvciBkZWJ1Z2dpbmcgKi8KK3N0YXRpYyB2b2lkIHNuZF9hYzk3X3Byb2NfcmVnc193cml0ZShzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlcikKK3sKKwlhYzk3X3QgKmFjOTcgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgbGluZVs2NF07CisJdW5zaWduZWQgaW50IHJlZywgdmFsOworCWRvd24oJmFjOTctPnBhZ2VfbXV0ZXgpOworCXdoaWxlICghc25kX2luZm9fZ2V0X2xpbmUoYnVmZmVyLCBsaW5lLCBzaXplb2YobGluZSkpKSB7CisJCWlmIChzc2NhbmYobGluZSwgIiV4ICV4IiwgJnJlZywgJnZhbCkgIT0gMikKKwkJCWNvbnRpbnVlOworCQkvKiByZWdpc3RlciBtdXN0IGJlIGV2ZW4gKi8KKwkJaWYgKHJlZyA8IDB4ODAgJiYgKHJlZyAmIDEpID09IDAgJiYgdmFsIDw9IDB4ZmZmZikKKwkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIHJlZywgdmFsKTsKKwl9CisJdXAoJmFjOTctPnBhZ2VfbXV0ZXgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNuZF9hYzk3X3Byb2NfcmVnc19yZWFkX21haW4oYWM5N190ICphYzk3LCBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlciwgaW50IHN1YmlkeCkKK3sKKwlpbnQgcmVnLCB2YWw7CisKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IDB4ODA7IHJlZyArPSAyKSB7CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoYWM5NywgcmVnKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJWk6JTAyeCA9ICUwNHhcbiIsIHN1YmlkeCwgcmVnLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX2FjOTdfcHJvY19yZWdzX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIAorCQkJCSAgICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlhYzk3X3QgKmFjOTcgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCisJZG93bigmYWM5Ny0+cGFnZV9tdXRleCk7CisJaWYgKChhYzk3LT5pZCAmIDB4ZmZmZmZmNDApID09IEFDOTdfSURfQUQxODgxKSB7CS8vIEFuYWxvZyBEZXZpY2VzIEFEMTg4MS84NS84NgorCisJCWludCBpZHg7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgMzsgaWR4KyspCisJCQlpZiAoYWM5Ny0+c3BlYy5hZDE4eHguaWRbaWR4XSkgeworCQkJCS8qIHNlbGVjdCBzaW5nbGUgY29kZWMgKi8KKwkJCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcsIDB4NzAwMCwKKwkJCQkJCSAgICAgYWM5Ny0+c3BlYy5hZDE4eHgudW5jaGFpbmVkW2lkeF0gfCBhYzk3LT5zcGVjLmFkMTh4eC5jaGFpbmVkW2lkeF0pOworCQkJCXNuZF9hYzk3X3Byb2NfcmVnc19yZWFkX21haW4oYWM5NywgYnVmZmVyLCBpZHgpOworCQkJfQorCQkvKiBzZWxlY3QgYWxsIGNvZGVjcyAqLworCQlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcsIDB4NzAwMCwgMHg3MDAwKTsKKwl9IGVsc2UgeworCQlzbmRfYWM5N19wcm9jX3JlZ3NfcmVhZF9tYWluKGFjOTcsIGJ1ZmZlciwgMCk7CisJfQkKKwl1cCgmYWM5Ny0+cGFnZV9tdXRleCk7Cit9CisKK3ZvaWQgc25kX2FjOTdfcHJvY19pbml0KGFjOTdfdCAqIGFjOTcpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJY2hhciBuYW1lWzMyXTsKKwljb25zdCBjaGFyICpwcmVmaXg7CisKKwlpZiAoYWM5Ny0+YnVzLT5wcm9jID09IE5VTEwpCisJCXJldHVybjsKKwlwcmVmaXggPSBhYzk3X2lzX2F1ZGlvKGFjOTcpID8gImFjOTciIDogIm1jOTciOworCXNwcmludGYobmFtZSwgIiVzIyVkLSVkIiwgcHJlZml4LCBhYzk3LT5hZGRyLCBhYzk3LT5udW0pOworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShhYzk3LT5idXMtPmNhcmQsIG5hbWUsIGFjOTctPmJ1cy0+cHJvYykpICE9IE5VTEwpIHsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBhYzk3LCAxMDI0LCBzbmRfYWM5N19wcm9jX3JlYWQpOworCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgeworCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9CisJYWM5Ny0+cHJvYyA9IGVudHJ5OworCXNwcmludGYobmFtZSwgIiVzIyVkLSVkK3JlZ3MiLCBwcmVmaXgsIGFjOTctPmFkZHIsIGFjOTctPm51bSk7CisJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGFjOTctPmJ1cy0+Y2FyZCwgbmFtZSwgYWM5Ny0+YnVzLT5wcm9jKSkgIT0gTlVMTCkgeworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGFjOTcsIDEwMjQsIHNuZF9hYzk3X3Byb2NfcmVnc19yZWFkKTsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJCWVudHJ5LT5tb2RlIHw9IFNfSVdVU1I7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDEwMjQ7CisJCWVudHJ5LT5jLnRleHQud3JpdGUgPSBzbmRfYWM5N19wcm9jX3JlZ3Nfd3JpdGU7CisjZW5kaWYKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCWFjOTctPnByb2NfcmVncyA9IGVudHJ5OworfQorCit2b2lkIHNuZF9hYzk3X3Byb2NfZG9uZShhYzk3X3QgKiBhYzk3KQoreworCWlmIChhYzk3LT5wcm9jX3JlZ3MpIHsKKwkJc25kX2luZm9fdW5yZWdpc3RlcihhYzk3LT5wcm9jX3JlZ3MpOworCQlhYzk3LT5wcm9jX3JlZ3MgPSBOVUxMOworCX0KKwlpZiAoYWM5Ny0+cHJvYykgeworCQlzbmRfaW5mb191bnJlZ2lzdGVyKGFjOTctPnByb2MpOworCQlhYzk3LT5wcm9jID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgc25kX2FjOTdfYnVzX3Byb2NfaW5pdChhYzk3X2J1c190ICogYnVzKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCWNoYXIgbmFtZVszMl07CisKKwlzcHJpbnRmKG5hbWUsICJjb2RlYzk3IyVkIiwgYnVzLT5udW0pOworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShidXMtPmNhcmQsIG5hbWUsIGJ1cy0+Y2FyZC0+cHJvY19yb290KSkgIT0gTlVMTCkgeworCQllbnRyeS0+bW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCWJ1cy0+cHJvYyA9IGVudHJ5OworfQorCit2b2lkIHNuZF9hYzk3X2J1c19wcm9jX2RvbmUoYWM5N19idXNfdCAqIGJ1cykKK3sKKwlpZiAoYnVzLT5wcm9jKSB7CisJCXNuZF9pbmZvX3VucmVnaXN0ZXIoYnVzLT5wcm9jKTsKKwkJYnVzLT5wcm9jID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FrNDUzMV9jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2UwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYwpAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBVbml2ZXJzYWwgcm91dGluZXMgZm9yIEFLNDUzMSBjb2RlYworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2FrNDUzMV9jb2RlYy5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVuaXZlcnNhbCByb3V0aW5lcyBmb3IgQUs0NTMxIGNvZGVjIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIHNuZF9hazQ1MzFfcHJvY19pbml0KHNuZF9jYXJkX3QgKiBjYXJkLCBhazQ1MzFfdCAqIGFrNDUzMSk7CisKKy8qCisgKgorICovCisgCisjaWYgMAorCitzdGF0aWMgdm9pZCBzbmRfYWs0NTMxX2R1bXAoYWs0NTMxX3QgKmFrNDUzMSkKK3sKKwlpbnQgaWR4OworCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgMHgxOTsgaWR4KyspCisJCXByaW50aygiYWs0NTMxIDB4JXg6IDB4JXhcbiIsIGlkeCwgYWs0NTMxLT5yZWdzW2lkeF0pOworfQorCisjZW5kaWYKKworLyoKKyAqCisgKi8KKworI2RlZmluZSBBSzQ1MzFfU0lOR0xFKHhuYW1lLCB4aW5kZXgsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2FrNDUzMV9pbmZvX3NpbmdsZSwgXAorICAuZ2V0ID0gc25kX2FrNDUzMV9nZXRfc2luZ2xlLCAucHV0ID0gc25kX2FrNDUzMV9wdXRfc2luZ2xlLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gcmVnIHwgKHNoaWZ0IDw8IDE2KSB8IChtYXNrIDw8IDI0KSB8IChpbnZlcnQgPDwgMjIpIH0KKworc3RhdGljIGludCBzbmRfYWs0NTMxX2luZm9fc2luZ2xlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCisJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7CisJcmV0dXJuIDA7Cit9CisgCitzdGF0aWMgaW50IHNuZF9hazQ1MzFfZ2V0X3NpbmdsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWFrNDUzMV90ICphazQ1MzEgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHgwNzsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjIpICYgMTsKKwlpbnQgdmFsOworCisJZG93bigmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXZhbCA9IChhazQ1MzEtPnJlZ3NbcmVnXSA+PiBzaGlmdCkgJiBtYXNrOworCXVwKCZhazQ1MzEtPnJlZ19tdXRleCk7CisJaWYgKGludmVydCkgeworCQl2YWwgPSBtYXNrIC0gdmFsOworCX0KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWs0NTMxX3B1dF9zaW5nbGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhazQ1MzFfdCAqYWs0NTMxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MDc7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIyKSAmIDE7CisJaW50IGNoYW5nZTsKKwlpbnQgdmFsOworCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl9CisJdmFsIDw8PSBzaGlmdDsKKwlkb3duKCZhazQ1MzEtPnJlZ19tdXRleCk7CisJdmFsID0gKGFrNDUzMS0+cmVnc1tyZWddICYgfihtYXNrIDw8IHNoaWZ0KSkgfCB2YWw7CisJY2hhbmdlID0gdmFsICE9IGFrNDUzMS0+cmVnc1tyZWddOworCWFrNDUzMS0+d3JpdGUoYWs0NTMxLCByZWcsIGFrNDUzMS0+cmVnc1tyZWddID0gdmFsKTsKKwl1cCgmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgQUs0NTMxX0RPVUJMRSh4bmFtZSwgeGluZGV4LCBsZWZ0X3JlZywgcmlnaHRfcmVnLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfYWs0NTMxX2luZm9fZG91YmxlLCBcCisgIC5nZXQgPSBzbmRfYWs0NTMxX2dldF9kb3VibGUsIC5wdXQgPSBzbmRfYWs0NTMxX3B1dF9kb3VibGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBsZWZ0X3JlZyB8IChyaWdodF9yZWcgPDwgOCkgfCAobGVmdF9zaGlmdCA8PCAxNikgfCAocmlnaHRfc2hpZnQgPDwgMTkpIHwgKG1hc2sgPDwgMjQpIHwgKGludmVydCA8PCAyMikgfQorCitzdGF0aWMgaW50IHNuZF9hazQ1MzFfaW5mb19kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgc25kX2FrNDUzMV9nZXRfZG91YmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWs0NTMxX3QgKmFrNDUzMSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgbGVmdF9yZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHJpZ2h0X3JlZyA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IGxlZnRfc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHgwNzsKKwlpbnQgcmlnaHRfc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHgwNzsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjIpICYgMTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlkb3duKCZhazQ1MzEtPnJlZ19tdXRleCk7CisJbGVmdCA9IChhazQ1MzEtPnJlZ3NbbGVmdF9yZWddID4+IGxlZnRfc2hpZnQpICYgbWFzazsKKwlyaWdodCA9IChhazQ1MzEtPnJlZ3NbcmlnaHRfcmVnXSA+PiByaWdodF9zaGlmdCkgJiBtYXNrOworCXVwKCZhazQ1MzEtPnJlZ19tdXRleCk7CisJaWYgKGludmVydCkgeworCQlsZWZ0ID0gbWFzayAtIGxlZnQ7CisJCXJpZ2h0ID0gbWFzayAtIHJpZ2h0OworCX0KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGxlZnQ7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSByaWdodDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWs0NTMxX3B1dF9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhazQ1MzFfdCAqYWs0NTMxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgbGVmdF9zaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCByaWdodF9zaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCWludCBjaGFuZ2U7CisJaW50IGxlZnQsIHJpZ2h0OworCisJbGVmdCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKKwlyaWdodCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzazsKKwlpZiAoaW52ZXJ0KSB7CisJCWxlZnQgPSBtYXNrIC0gbGVmdDsKKwkJcmlnaHQgPSBtYXNrIC0gcmlnaHQ7CisJfQorCWxlZnQgPDw9IGxlZnRfc2hpZnQ7CisJcmlnaHQgPDw9IHJpZ2h0X3NoaWZ0OworCWRvd24oJmFrNDUzMS0+cmVnX211dGV4KTsKKwlpZiAobGVmdF9yZWcgPT0gcmlnaHRfcmVnKSB7CisJCWxlZnQgPSAoYWs0NTMxLT5yZWdzW2xlZnRfcmVnXSAmIH4oKG1hc2sgPDwgbGVmdF9zaGlmdCkgfCAobWFzayA8PCByaWdodF9zaGlmdCkpKSB8IGxlZnQgfCByaWdodDsKKwkJY2hhbmdlID0gbGVmdCAhPSBhazQ1MzEtPnJlZ3NbbGVmdF9yZWddOworCQlhazQ1MzEtPndyaXRlKGFrNDUzMSwgbGVmdF9yZWcsIGFrNDUzMS0+cmVnc1tsZWZ0X3JlZ10gPSBsZWZ0KTsKKwl9IGVsc2UgeworCQlsZWZ0ID0gKGFrNDUzMS0+cmVnc1tsZWZ0X3JlZ10gJiB+KG1hc2sgPDwgbGVmdF9zaGlmdCkpIHwgbGVmdDsKKwkJcmlnaHQgPSAoYWs0NTMxLT5yZWdzW3JpZ2h0X3JlZ10gJiB+KG1hc2sgPDwgcmlnaHRfc2hpZnQpKSB8IHJpZ2h0OworCQljaGFuZ2UgPSBsZWZ0ICE9IGFrNDUzMS0+cmVnc1tsZWZ0X3JlZ10gfHwgcmlnaHQgIT0gYWs0NTMxLT5yZWdzW3JpZ2h0X3JlZ107CisJCWFrNDUzMS0+d3JpdGUoYWs0NTMxLCBsZWZ0X3JlZywgYWs0NTMxLT5yZWdzW2xlZnRfcmVnXSA9IGxlZnQpOworCQlhazQ1MzEtPndyaXRlKGFrNDUzMSwgcmlnaHRfcmVnLCBhazQ1MzEtPnJlZ3NbcmlnaHRfcmVnXSA9IHJpZ2h0KTsKKwl9CisJdXAoJmFrNDUzMS0+cmVnX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEFLNDUzMV9JTlBVVF9TVyh4bmFtZSwgeGluZGV4LCByZWcxLCByZWcyLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2FrNDUzMV9pbmZvX2lucHV0X3N3LCBcCisgIC5nZXQgPSBzbmRfYWs0NTMxX2dldF9pbnB1dF9zdywgLnB1dCA9IHNuZF9hazQ1MzFfcHV0X2lucHV0X3N3LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gcmVnMSB8IChyZWcyIDw8IDgpIHwgKGxlZnRfc2hpZnQgPDwgMTYpIHwgKHJpZ2h0X3NoaWZ0IDw8IDI0KSB9CisKK3N0YXRpYyBpbnQgc25kX2FrNDUzMV9pbmZvX2lucHV0X3N3KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSA0OworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgc25kX2FrNDUzMV9nZXRfaW5wdXRfc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhazQ1MzFfdCAqYWs0NTMxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcxID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCByZWcyID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgbGVmdF9zaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDBmOworCWludCByaWdodF9zaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDBmOworCisJZG93bigmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGFrNDUzMS0+cmVnc1tyZWcxXSA+PiBsZWZ0X3NoaWZ0KSAmIDE7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAoYWs0NTMxLT5yZWdzW3JlZzJdID4+IGxlZnRfc2hpZnQpICYgMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IChhazQ1MzEtPnJlZ3NbcmVnMV0gPj4gcmlnaHRfc2hpZnQpICYgMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9IChhazQ1MzEtPnJlZ3NbcmVnMl0gPj4gcmlnaHRfc2hpZnQpICYgMTsKKwl1cCgmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hazQ1MzFfcHV0X2lucHV0X3N3KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYWs0NTMxX3QgKmFrNDUzMSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnMSA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IGxlZnRfc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHgwZjsKKwlpbnQgcmlnaHRfc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwZjsKKwlpbnQgY2hhbmdlOworCWludCB2YWwxLCB2YWwyOworCisJZG93bigmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXZhbDEgPSBhazQ1MzEtPnJlZ3NbcmVnMV0gJiB+KCgxIDw8IGxlZnRfc2hpZnQpIHwgKDEgPDwgcmlnaHRfc2hpZnQpKTsKKwl2YWwyID0gYWs0NTMxLT5yZWdzW3JlZzJdICYgfigoMSA8PCBsZWZ0X3NoaWZ0KSB8ICgxIDw8IHJpZ2h0X3NoaWZ0KSk7CisJdmFsMSB8PSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxKSA8PCBsZWZ0X3NoaWZ0OworCXZhbDIgfD0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgMSkgPDwgbGVmdF9zaGlmdDsKKwl2YWwxIHw9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAmIDEpIDw8IHJpZ2h0X3NoaWZ0OworCXZhbDIgfD0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdICYgMSkgPDwgcmlnaHRfc2hpZnQ7CisJY2hhbmdlID0gdmFsMSAhPSBhazQ1MzEtPnJlZ3NbcmVnMV0gfHwgdmFsMiAhPSBhazQ1MzEtPnJlZ3NbcmVnMl07CisJYWs0NTMxLT53cml0ZShhazQ1MzEsIHJlZzEsIGFrNDUzMS0+cmVnc1tyZWcxXSA9IHZhbDEpOworCWFrNDUzMS0+d3JpdGUoYWs0NTMxLCByZWcyLCBhazQ1MzEtPnJlZ3NbcmVnMl0gPSB2YWwyKTsKKwl1cCgmYWs0NTMxLT5yZWdfbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2FrNDUzMV9jb250cm9sc1tdID0geworCitBSzQ1MzFfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMCwgQUs0NTMxX0xNQVNURVIsIEFLNDUzMV9STUFTVEVSLCA3LCA3LCAxLCAxKSwKK0FLNDUzMV9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAwLCBBSzQ1MzFfTE1BU1RFUiwgQUs0NTMxX1JNQVNURVIsIDAsIDAsIDB4MWYsIDEpLAorCitBSzQ1MzFfU0lOR0xFKCJNYXN0ZXIgTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAwLCBBSzQ1MzFfTU9OT19PVVQsIDcsIDEsIDEpLAorQUs0NTMxX1NJTkdMRSgiTWFzdGVyIE1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMCwgQUs0NTMxX01PTk9fT1VULCAwLCAweDA3LCAxKSwKKworQUs0NTMxX0RPVUJMRSgiUENNIFN3aXRjaCIsIDAsIEFLNDUzMV9MVk9JQ0UsIEFLNDUzMV9SVk9JQ0UsIDcsIDcsIDEsIDEpLAorQUs0NTMxX0RPVUJMRSgiUENNIFZvbHVtZSIsIDAsIEFLNDUzMV9MVk9JQ0UsIEFLNDUzMV9SVk9JQ0UsIDAsIDAsIDB4MWYsIDEpLAorQUs0NTMxX0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsIEFLNDUzMV9PVVRfU1cyLCBBSzQ1MzFfT1VUX1NXMiwgMywgMiwgMSwgMCksCitBSzQ1MzFfRE9VQkxFKCJQQ00gQ2FwdHVyZSBTd2l0Y2giLCAwLCBBSzQ1MzFfTElOX1NXMiwgQUs0NTMxX1JJTl9TVzIsIDIsIDIsIDEsIDApLAorCitBSzQ1MzFfRE9VQkxFKCJQQ00gU3dpdGNoIiwgMSwgQUs0NTMxX0xGTSwgQUs0NTMxX1JGTSwgNywgNywgMSwgMSksCitBSzQ1MzFfRE9VQkxFKCJQQ00gVm9sdW1lIiwgMSwgQUs0NTMxX0xGTSwgQUs0NTMxX1JGTSwgMCwgMCwgMHgxZiwgMSksCitBSzQ1MzFfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMSwgQUs0NTMxX09VVF9TVzEsIEFLNDUzMV9PVVRfU1cxLCA2LCA1LCAxLCAwKSwKK0FLNDUzMV9JTlBVVF9TVygiUENNIENhcHR1cmUgUm91dGUiLCAxLCBBSzQ1MzFfTElOX1NXMSwgQUs0NTMxX1JJTl9TVzEsIDYsIDUpLAorCitBSzQ1MzFfRE9VQkxFKCJDRCBTd2l0Y2giLCAwLCBBSzQ1MzFfTENELCBBSzQ1MzFfUkNELCA3LCA3LCAxLCAxKSwKK0FLNDUzMV9ET1VCTEUoIkNEIFZvbHVtZSIsIDAsIEFLNDUzMV9MQ0QsIEFLNDUzMV9SQ0QsIDAsIDAsIDB4MWYsIDEpLAorQUs0NTMxX0RPVUJMRSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMCwgQUs0NTMxX09VVF9TVzEsIEFLNDUzMV9PVVRfU1cxLCAyLCAxLCAxLCAwKSwKK0FLNDUzMV9JTlBVVF9TVygiQ0QgQ2FwdHVyZSBSb3V0ZSIsIDAsIEFLNDUzMV9MSU5fU1cxLCBBSzQ1MzFfUklOX1NXMSwgMiwgMSksCisKK0FLNDUzMV9ET1VCTEUoIkxpbmUgU3dpdGNoIiwgMCwgQUs0NTMxX0xMSU5FLCBBSzQ1MzFfUkxJTkUsIDcsIDcsIDEsIDEpLAorQUs0NTMxX0RPVUJMRSgiTGluZSBWb2x1bWUiLCAwLCBBSzQ1MzFfTExJTkUsIEFLNDUzMV9STElORSwgMCwgMCwgMHgxZiwgMSksCitBSzQ1MzFfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDAsIEFLNDUzMV9PVVRfU1cxLCBBSzQ1MzFfT1VUX1NXMSwgNCwgMywgMSwgMCksCitBSzQ1MzFfSU5QVVRfU1coIkxpbmUgQ2FwdHVyZSBSb3V0ZSIsIDAsIEFLNDUzMV9MSU5fU1cxLCBBSzQ1MzFfUklOX1NXMSwgNCwgMyksCisKK0FLNDUzMV9ET1VCTEUoIkF1eCBTd2l0Y2giLCAwLCBBSzQ1MzFfTEFVWEEsIEFLNDUzMV9SQVVYQSwgNywgNywgMSwgMSksCitBSzQ1MzFfRE9VQkxFKCJBdXggVm9sdW1lIiwgMCwgQUs0NTMxX0xBVVhBLCBBSzQ1MzFfUkFVWEEsIDAsIDAsIDB4MWYsIDEpLAorQUs0NTMxX0RPVUJMRSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIDAsIEFLNDUzMV9PVVRfU1cyLCBBSzQ1MzFfT1VUX1NXMiwgNSwgNCwgMSwgMCksCitBSzQ1MzFfSU5QVVRfU1coIkF1eCBDYXB0dXJlIFJvdXRlIiwgMCwgQUs0NTMxX0xJTl9TVzIsIEFLNDUzMV9SSU5fU1cyLCA0LCAzKSwKKworQUs0NTMxX1NJTkdMRSgiTW9ubyBTd2l0Y2giLCAwLCBBSzQ1MzFfTU9OTzEsIDcsIDEsIDEpLAorQUs0NTMxX1NJTkdMRSgiTW9ubyBWb2x1bWUiLCAwLCBBSzQ1MzFfTU9OTzEsIDAsIDB4MWYsIDEpLAorQUs0NTMxX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAwLCBBSzQ1MzFfT1VUX1NXMiwgMCwgMSwgMCksCitBSzQ1MzFfRE9VQkxFKCJNb25vIENhcHR1cmUgU3dpdGNoIiwgMCwgQUs0NTMxX0xJTl9TVzIsIEFLNDUzMV9SSU5fU1cyLCAwLCAwLCAxLCAwKSwKKworQUs0NTMxX1NJTkdMRSgiTW9ubyBTd2l0Y2giLCAxLCBBSzQ1MzFfTU9OTzIsIDcsIDEsIDEpLAorQUs0NTMxX1NJTkdMRSgiTW9ubyBWb2x1bWUiLCAxLCBBSzQ1MzFfTU9OTzIsIDAsIDB4MWYsIDEpLAorQUs0NTMxX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAxLCBBSzQ1MzFfT1VUX1NXMiwgMSwgMSwgMCksCitBSzQ1MzFfRE9VQkxFKCJNb25vIENhcHR1cmUgU3dpdGNoIiwgMSwgQUs0NTMxX0xJTl9TVzIsIEFLNDUzMV9SSU5fU1cyLCAxLCAxLCAxLCAwKSwKKworQUs0NTMxX1NJTkdMRSgiTWljIFZvbHVtZSIsIDAsIEFLNDUzMV9NSUMsIDAsIDB4MWYsIDEpLAorQUs0NTMxX1NJTkdMRSgiTWljIFN3aXRjaCIsIDAsIEFLNDUzMV9NSUMsIDcsIDEsIDEpLAorQUs0NTMxX1NJTkdMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsIEFLNDUzMV9PVVRfU1cxLCAwLCAxLCAwKSwKK0FLNDUzMV9ET1VCTEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIDAsIEFLNDUzMV9MSU5fU1cxLCBBSzQ1MzFfUklOX1NXMSwgMCwgMCwgMSwgMCksCisKK0FLNDUzMV9ET1VCTEUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBTd2l0Y2giLCAwLCBBSzQ1MzFfTElOX1NXMiwgQUs0NTMxX1JJTl9TVzIsIDcsIDcsIDEsIDApLAorQUs0NTMxX0RPVUJMRSgiTW9ubzEgQnlwYXNzIENhcHR1cmUgU3dpdGNoIiwgMCwgQUs0NTMxX0xJTl9TVzIsIEFLNDUzMV9SSU5fU1cyLCA2LCA2LCAxLCAwKSwKK0FLNDUzMV9ET1VCTEUoIk1vbm8yIEJ5cGFzcyBDYXB0dXJlIFN3aXRjaCIsIDAsIEFLNDUzMV9MSU5fU1cyLCBBSzQ1MzFfUklOX1NXMiwgNSwgNSwgMSwgMCksCisKK0FLNDUzMV9TSU5HTEUoIkFEIElucHV0IFNlbGVjdCIsIDAsIEFLNDUzMV9BRF9JTiwgMCwgMSwgMCksCitBSzQ1MzFfU0lOR0xFKCJNaWMgQm9vc3QgKCszMGRCKSIsIDAsIEFLNDUzMV9NSUNfR0FJTiwgMCwgMSwgMCkKK307CisKK3N0YXRpYyBpbnQgc25kX2FrNDUzMV9mcmVlKGFrNDUzMV90ICphazQ1MzEpCit7CisJaWYgKGFrNDUzMSkgeworCQlpZiAoYWs0NTMxLT5wcml2YXRlX2ZyZWUpCisJCQlhazQ1MzEtPnByaXZhdGVfZnJlZShhazQ1MzEpOworCQlrZnJlZShhazQ1MzEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWs0NTMxX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWFrNDUzMV90ICphazQ1MzEgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfYWs0NTMxX2ZyZWUoYWs0NTMxKTsKK30KKworc3RhdGljIHU4IHNuZF9hazQ1MzFfaW5pdGlhbF9tYXBbMHgxOSArIDFdID0geworCTB4OWYsCQkvKiAwMDogTWFzdGVyIFZvbHVtZSBMY2ggKi8KKwkweDlmLAkJLyogMDE6IE1hc3RlciBWb2x1bWUgUmNoICovCisJMHg5ZiwJCS8qIDAyOiBWb2ljZSBWb2x1bWUgTGNoICovCisJMHg5ZiwJCS8qIDAzOiBWb2ljZSBWb2x1bWUgUmNoICovCisJMHg5ZiwJCS8qIDA0OiBGTSBWb2x1bWUgTGNoICovCisJMHg5ZiwJCS8qIDA1OiBGTSBWb2x1bWUgUmNoICovCisJMHg5ZiwJCS8qIDA2OiBDRCBBdWRpbyBWb2x1bWUgTGNoICovCisJMHg5ZiwJCS8qIDA3OiBDRCBBdWRpbyBWb2x1bWUgUmNoICovCisJMHg5ZiwJCS8qIDA4OiBMaW5lIFZvbHVtZSBMY2ggKi8KKwkweDlmLAkJLyogMDk6IExpbmUgVm9sdW1lIFJjaCAqLworCTB4OWYsCQkvKiAwYTogQXV4IFZvbHVtZSBMY2ggKi8KKwkweDlmLAkJLyogMGI6IEF1eCBWb2x1bWUgUmNoICovCisJMHg5ZiwJCS8qIDBjOiBNb25vMSBWb2x1bWUgKi8KKwkweDlmLAkJLyogMGQ6IE1vbm8yIFZvbHVtZSAqLworCTB4OWYsCQkvKiAwZTogTWljIFZvbHVtZSAqLworCTB4ODcsCQkvKiAwZjogTW9uby1vdXQgVm9sdW1lICovCisJMHgwMCwJCS8qIDEwOiBPdXRwdXQgTWl4ZXIgU1cxICovCisJMHgwMCwJCS8qIDExOiBPdXRwdXQgTWl4ZXIgU1cyICovCisJMHgwMCwJCS8qIDEyOiBMY2ggSW5wdXQgTWl4ZXIgU1cxICovCisJMHgwMCwJCS8qIDEzOiBSY2ggSW5wdXQgTWl4ZXIgU1cxICovCisJMHgwMCwJCS8qIDE0OiBMY2ggSW5wdXQgTWl4ZXIgU1cyICovCisJMHgwMCwJCS8qIDE1OiBSY2ggSW5wdXQgTWl4ZXIgU1cyICovCisJMHgwMCwJCS8qIDE2OiBSZXNldCAmIFBvd2VyIERvd24gKi8KKwkweDAwLAkJLyogMTc6IENsb2NrIFNlbGVjdCAqLworCTB4MDAsCQkvKiAxODogQUQgSW5wdXQgU2VsZWN0ICovCisJMHgwMQkJLyogMTk6IE1pYyBBbXAgU2V0dXAgKi8KK307CisKK2ludCBzbmRfYWs0NTMxX21peGVyKHNuZF9jYXJkX3QgKiBjYXJkLCBhazQ1MzFfdCAqIF9hazQ1MzEsIGFrNDUzMV90ICoqIHJhazQ1MzEpCit7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCWFrNDUzMV90ICogYWs0NTMxOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX2FrNDUzMV9kZXZfZnJlZSwKKwl9OworCisJc25kX2Fzc2VydChyYWs0NTMxICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwkqcmFrNDUzMSA9IE5VTEw7CisJc25kX2Fzc2VydChjYXJkICE9IE5VTEwgJiYgX2FrNDUzMSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJYWs0NTMxID0ga2NhbGxvYygxLCBzaXplb2YoKmFrNDUzMSksIEdGUF9LRVJORUwpOworCWlmIChhazQ1MzEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJKmFrNDUzMSA9ICpfYWs0NTMxOworCWluaXRfTVVURVgoJmFrNDUzMS0+cmVnX211dGV4KTsKKwlpZiAoKGVyciA9IHNuZF9jb21wb25lbnRfYWRkKGNhcmQsICJBSzQ1MzEiKSkgPCAwKSB7CisJCXNuZF9hazQ1MzFfZnJlZShhazQ1MzEpOworCQlyZXR1cm4gZXJyOworCX0KKwlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiQXNhaGkgS2FzZWkgQUs0NTMxIik7CisJYWs0NTMxLT53cml0ZShhazQ1MzEsIEFLNDUzMV9SRVNFVCwgMHgwMyk7CS8qIG5vIFJTVCwgUEQgKi8KKwl1ZGVsYXkoMTAwKTsKKwlhazQ1MzEtPndyaXRlKGFrNDUzMSwgQUs0NTMxX0NMT0NLLCAweDAwKTsJLyogQ09ERUMgQURDIGFuZCBDT0RFQyBEQUMgdXNlIHtMUixCfUNMSzIgYW5kIHJ1biBvZmYgTFJDTEsyIFBMTCAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgMHgxOTsgaWR4KyspIHsKKwkJaWYgKGlkeCA9PSBBSzQ1MzFfUkVTRVQgfHwgaWR4ID09IEFLNDUzMV9DTE9DSykKKwkJCWNvbnRpbnVlOworCQlhazQ1MzEtPndyaXRlKGFrNDUzMSwgaWR4LCBhazQ1MzEtPnJlZ3NbaWR4XSA9IHNuZF9hazQ1MzFfaW5pdGlhbF9tYXBbaWR4XSk7CS8qIHJlY29yZGluZyBzb3VyY2UgaXMgbWl4ZXIgKi8KKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9hazQ1MzFfY29udHJvbHMpOyBpZHgrKykgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2FrNDUzMV9jb250cm9sc1tpZHhdLCBhazQ1MzEpKSkgPCAwKSB7CisJCQlzbmRfYWs0NTMxX2ZyZWUoYWs0NTMxKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJc25kX2FrNDUzMV9wcm9jX2luaXQoY2FyZCwgYWs0NTMxKTsKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9DT0RFQywgYWs0NTMxLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9hazQ1MzFfZnJlZShhazQ1MzEpOworCQlyZXR1cm4gZXJyOworCX0KKworI2lmIDAKKwlzbmRfYWs0NTMxX2R1bXAoYWs0NTMxKTsKKyNlbmRpZgorCSpyYWs0NTMxID0gYWs0NTMxOworCXJldHVybiAwOworfQorCisvKgorCisgKi8KKworc3RhdGljIHZvaWQgc25kX2FrNDUzMV9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIAorCQkJCSBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlhazQ1MzFfdCAqYWs0NTMxID0gZW50cnktPnByaXZhdGVfZGF0YTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFzYWhpIEthc2VpIEFLNDUzMVxuXG4iKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJSZWNvcmRpbmcgc291cmNlICAgOiAlc1xuIgorCQkgICAgIk1JQyBnYWluICAgICAgICAgICA6ICVzXG4iLAorCQkgICAgYWs0NTMxLT5yZWdzW0FLNDUzMV9BRF9JTl0gJiAxID8gImV4dGVybmFsIiA6ICJtaXhlciIsCisJCSAgICBhazQ1MzEtPnJlZ3NbQUs0NTMxX01JQ19HQUlOXSAmIDEgPyAiKzMwZEIiIDogIiswZEIiKTsKK30KKworc3RhdGljIHZvaWQgc25kX2FrNDUzMV9wcm9jX2luaXQoc25kX2NhcmRfdCAqIGNhcmQsIGFrNDUzMV90ICogYWs0NTMxKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2FyZCwgImFrNDUzMSIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgYWs0NTMxLCAxMDI0LCBzbmRfYWs0NTMxX3Byb2NfcmVhZCk7Cit9CisKK0VYUE9SVF9TWU1CT0woc25kX2FrNDUzMV9taXhlcik7CisKKy8qCisgKiAgSU5JVCBwYXJ0CisgKi8KKworc3RhdGljIGludCBfX2luaXQgYWxzYV9hazQ1MzFfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9hazQ1MzFfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChhbHNhX2FrNDUzMV9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9hazQ1MzFfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL01ha2VmaWxlIGIvc291bmQvcGNpL2FsaTU0NTEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxODMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIworIyBNYWtlZmlsZSBmb3IgQUxTQQorIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorIworCitzbmQtYWxpNTQ1MS1vYmpzIDo9IGFsaTU0NTEubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX0FMSTU0NTEpICs9IHNuZC1hbGk1NDUxLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRkNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC0wLDAgKzEsMjI4MiBAQAorLyoKKyAqICBNYXR0IFd1IDxNYXR0X1d1QGFjZXJzb2Z0ZWNoLmNvbS5jbj4KKyAqICBBcHIgMjYsIDIwMDEKKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBBTGkgcGNpIGF1ZGlvIE01NDUxCisgKgorICogIEJVR1M6CisgKiAgICAtLQorICoKKyAqICBUT0RPOgorICogICAgLS0KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExjb2RlY25zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGNvZGVjbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExjb2RlY25zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExjb2RlY25zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiTWF0dCBXdSA8TWF0dF9XdUBhY2Vyc29mdGVjaC5jb20uY24+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMSSBNNTQ1MSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7QUxJLE01NDUxLHBjaX0se0FMSSxNNTQ1MX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKK3N0YXRpYyBpbnQgcGNtX2NoYW5uZWxzW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMzJ9Oworc3RhdGljIGludCBzcGRpZltTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEFMSSBNNTQ1MSBQQ0kgQXVkaW8uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIEFMSSBNNTQ1MSBQQ0kgQXVkaW8uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEFMSSA1NDUxIFBDSSBBdWRpby4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwY21fY2hhbm5lbHMsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjbV9jaGFubmVscywgIlBDTSBDaGFubmVscyIpOworbW9kdWxlX3BhcmFtX2FycmF5KHNwZGlmLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWYsICJTdXBwb3J0IFNQRElGIEkvTyIpOworCisvKgorICogIERlYnVnIHBhcnQgZGVmaW5pdGlvbnMKKyAqLworCisvLyNkZWZpbmUgQUxJX0RFQlVHCisKKyNpZmRlZiBBTElfREVCVUcKKyNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0LCAjI2FyZ3MpOworI2Vsc2UKKyNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qCisgKiAgQ29uc3RhbnRzIGRlZmluaXRpb24KKyAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQUxJCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxJCTB4MTBiOQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTElfNTQ1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxCTB4NTQ1MQorI2VuZGlmCisKKyNkZWZpbmUgREVWSUNFX0lEX0FMSTU0NTEJKChQQ0lfVkVORE9SX0lEX0FMSTw8MTYpfFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpCisKKworI2RlZmluZSBBTElfQ0hBTk5FTFMJCTMyCisKKyNkZWZpbmUgQUxJX1BDTV9JTl9DSEFOTkVMCTMxCisjZGVmaW5lIEFMSV9TUERJRl9JTl9DSEFOTkVMCTE5CisjZGVmaW5lIEFMSV9TUERJRl9PVVRfQ0hBTk5FTAkxNQorI2RlZmluZSBBTElfQ0VOVEVSX0NIQU5ORUwJMjQKKyNkZWZpbmUgQUxJX0xFRl9DSEFOTkVMCQkyMworI2RlZmluZSBBTElfU1VSUl9MRUZUX0NIQU5ORUwJMjYKKyNkZWZpbmUgQUxJX1NVUlJfUklHSFRfQ0hBTk5FTAkyNQorCisjZGVmaW5lCVNORFJWX0FMSV9WT0lDRV9UWVBFX1BDTQkwMQorI2RlZmluZSBTTkRSVl9BTElfVk9JQ0VfVFlQRV9PVEgJMDIKKworI2RlZmluZQlBTElfNTQ1MV9WMDIJCTB4MDIKKworLyoKKyAqICBEaXJlY3QgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBBTElfTEVHQUNZX0RNQVIwICAgICAgICAweDAwICAvLyBBRFIwCisjZGVmaW5lIEFMSV9MRUdBQ1lfRE1BUjQgICAgICAgIDB4MDQgIC8vIENOVDAKKyNkZWZpbmUgQUxJX0xFR0FDWV9ETUFSMTEgICAgICAgMHgwYiAgLy8gTU9EIAorI2RlZmluZSBBTElfTEVHQUNZX0RNQVIxNSAgICAgICAweDBmICAvLyBNTVIgCisjZGVmaW5lIEFMSV9NUFVSMAkJMHgyMAorI2RlZmluZSBBTElfTVBVUjEJCTB4MjEKKyNkZWZpbmUgQUxJX01QVVIyCQkweDIyCisjZGVmaW5lIEFMSV9NUFVSMwkJMHgyMworCisjZGVmaW5lCUFMSV9BQzk3X1dSSVRFCQkweDQwCisjZGVmaW5lIEFMSV9BQzk3X1JFQUQJCTB4NDQKKworI2RlZmluZSBBTElfU0NUUkwJCTB4NDgKKyNkZWZpbmUgICBBTElfU1BESUZfT1VUX0VOQUJMRQkJMHgyMAorI2RlZmluZSBBTElfQUM5N19HUElPCQkweDRjCisjZGVmaW5lIEFMSV9TUERJRl9DUwkJMHg3MAorI2RlZmluZSBBTElfU1BESUZfQ1RSTAkJMHg3NAorI2RlZmluZSAgIEFMSV9TUERJRl9JTl9GVU5DX0VOQUJMRQkweDAyCisjZGVmaW5lICAgQUxJX1NQRElGX0lOX0NIX1NUQVRVUwkweDQwCisjZGVmaW5lICAgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMJMHhiZgorI2RlZmluZSBBTElfU1RBUlQJCTB4ODAKKyNkZWZpbmUgQUxJX1NUT1AJCTB4ODQKKyNkZWZpbmUgQUxJX0NTUEYJCTB4OTAKKyNkZWZpbmUgQUxJX0FJTlQJCTB4OTgKKyNkZWZpbmUgQUxJX0dDX0NJUgkJMHhhMAorCSNkZWZpbmUgRU5ETFBfSUUJCTB4MDAwMDEwMDAKKwkjZGVmaW5lIE1JRExQX0lFCQkweDAwMDAyMDAwCisjZGVmaW5lIEFMSV9BSU5URU4JCTB4YTQKKyNkZWZpbmUgQUxJX1ZPTFVNRQkJMHhhOAorI2RlZmluZSBBTElfU0JERUxUQV9ERUxUQV9SICAgICAweGFjCisjZGVmaW5lIEFMSV9NSVNDSU5UCQkweGIwCisJI2RlZmluZSBBRERSRVNTX0lSUQkJMHgwMDAwMDAyMAorCSNkZWZpbmUgVEFSR0VUX1JFQUNIRUQJCTB4MDAwMDgwMDAKKwkjZGVmaW5lIE1JWEVSX09WRVJGTE9XCQkweDAwMDAwODAwCisJI2RlZmluZSBNSVhFUl9VTkRFUkZMT1cJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQUxJX1NCQkxfU0JDTCAgICAgICAgICAgMHhjMAorI2RlZmluZSBBTElfU0JDVFJMX1NCRTJSX1NCREQgICAweGM0CisjZGVmaW5lIEFMSV9TVElNRVIJCTB4YzgKKyNkZWZpbmUgQUxJX0dMT0JBTF9DT05UUk9MCTB4ZDQKKyNkZWZpbmUgICBBTElfU1BESUZfT1VUX1NFTF9QQ00JCTB4MDAwMDA0MDAgLyogYml0IDEwICovCisjZGVmaW5lICAgQUxJX1NQRElGX0lOX1NVUFBPUlQJCTB4MDAwMDA4MDAgLyogYml0IDExICovCisjZGVmaW5lICAgQUxJX1NQRElGX09VVF9DSF9FTkFCTEUJMHgwMDAwODAwMCAvKiBiaXQgMTUgKi8KKyNkZWZpbmUgICBBTElfU1BESUZfSU5fQ0hfRU5BQkxFCTB4MDAwODAwMDAgLyogYml0IDE5ICovCisjZGVmaW5lICAgQUxJX1BDTV9JTl9FTkFCTEUJCTB4ODAwMDAwMDAgLyogYml0IDMxICovCisKKyNkZWZpbmUgQUxJX0NTT19BTFBIQV9GTVMJMHhlMAorI2RlZmluZSBBTElfTEJBCQkJMHhlNAorI2RlZmluZSBBTElfRVNPX0RFTFRBCQkweGU4CisjZGVmaW5lIEFMSV9HVlNFTF9QQU5fVk9DX0NUUkxfRUMJMHhmMAorI2RlZmluZSBBTElfRUJVRjEJCTB4ZjQKKyNkZWZpbmUgQUxJX0VCVUYyCQkweGY4CisKKyNkZWZpbmUgQUxJX1JFRyhjb2RlYywgeCkgKChjb2RlYyktPnBvcnQgKyB4KQorCit0eXBlZGVmIHN0cnVjdCBzbmRfc3RydV9hbGkgYWxpX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfYWxpX3N0cnVfdm9pY2Ugc25kX2FsaV92b2ljZV90OworCit0eXBlZGVmIHN0cnVjdCBzbmRfYWxpX2NoYW5uZWxfY29udHJvbCB7CisJLy8gcmVnaXN0ZXIgZGF0YQorCXN0cnVjdCBSRUdEQVRBIHsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OworCQl1bnNpZ25lZCBpbnQgc3RvcDsKKwkJdW5zaWduZWQgaW50IGFpbnQ7CisJCXVuc2lnbmVkIGludCBhaW50ZW47CisJfSBkYXRhOworCQkKKwkvLyByZWdpc3RlciBhZGRyZXNzZXMKKwlzdHJ1Y3QgUkVHUyB7CisJCXVuc2lnbmVkIGludCBzdGFydDsKKwkJdW5zaWduZWQgaW50IHN0b3A7CisJCXVuc2lnbmVkIGludCBhaW50OworCQl1bnNpZ25lZCBpbnQgYWludGVuOworCQl1bnNpZ25lZCBpbnQgYWM5N3JlYWQ7CisJCXVuc2lnbmVkIGludCBhYzk3d3JpdGU7CisJfSByZWdzOworCit9IHNuZF9hbGlfY2hhbm5lbF9jb250cm9sX3Q7CisKK3N0cnVjdCBzbmRfYWxpX3N0cnVfdm9pY2UgeworCXVuc2lnbmVkIGludCBudW1iZXI7CisJdW5zaWduZWQgaW50IHVzZTogMSwKKwkgICAgcGNtOiAxLAorCSAgICBtaWRpOiAxLAorCSAgICBtb2RlOiAxLAorCSAgICBzeW50aDogMTsKKworCS8qIFBDTSBkYXRhICovCisJYWxpX3QgKmNvZGVjOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwlzbmRfYWxpX3ZvaWNlX3QgKmV4dHJhOworCQorCXVuc2lnbmVkIGludCBydW5uaW5nOiAxOworCisJaW50IGVzbzsgICAgICAgICAgICAgICAgLyogZmluYWwgRVNPIHZhbHVlIGZvciBjaGFubmVsICovCisJaW50IGNvdW50OyAgICAgICAgICAgICAgLyogcnVudGltZS0+cGVyaW9kX3NpemUgKi8KKworCS8qIC0tLSAqLworCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCXZvaWQgKCpwcml2YXRlX2ZyZWUpKHZvaWQgKnByaXZhdGVfZGF0YSk7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IHNuZF9zdHJ1X2FsaWRldiB7CisKKwlzbmRfYWxpX3ZvaWNlX3Qgdm9pY2VzW0FMSV9DSEFOTkVMU107CQorCisJdW5zaWduZWQgaW50CWNoY250OwkJCS8qIG51bSBvZiBvcGVuZWQgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQJY2htYXA7CQkJLyogYml0bWFwIGZvciBvcGVuZWQgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgc3ludGhjb3VudDsKKworfSBhbGlkZXZfdDsKKworCisjaWZkZWYgQ09ORklHX1BNCisjZGVmaW5lIEFMSV9HTE9CQUxfUkVHUwkJNTYKKyNkZWZpbmUgQUxJX0NIQU5ORUxfUkVHUwk4Cit0eXBlZGVmIHN0cnVjdCBzbmRfYWxpX2ltYWdlIHsKKwl1bnNpZ25lZCBsb25nIHJlZ3NbQUxJX0dMT0JBTF9SRUdTXTsKKwl1bnNpZ25lZCBsb25nIGNoYW5uZWxfcmVnc1tBTElfQ0hBTk5FTFNdW0FMSV9DSEFOTkVMX1JFR1NdOworfSBhbGlfaW1hZ2VfdDsKKyNlbmRpZgorCisKK3N0cnVjdCBzbmRfc3RydV9hbGkgeworCXVuc2lnbmVkIGxvbmcJaXJxOworCXVuc2lnbmVkIGxvbmcJcG9ydDsKKwl1bnNpZ25lZCBjaGFyCXJldmlzaW9uOworCisJdW5zaWduZWQgaW50IGh3X2luaXRpYWxpemVkOiAxOworCXVuc2lnbmVkIGludCBzcGRpZl9zdXBwb3J0OiAxOworCisJc3RydWN0IHBjaV9kZXYJKnBjaTsKKwlzdHJ1Y3QgcGNpX2RldgkqcGNpX20xNTMzOworCXN0cnVjdCBwY2lfZGV2CSpwY2lfbTcxMDE7CisKKwlzbmRfY2FyZF90CSpjYXJkOworCXNuZF9wY21fdAkqcGNtOworCWFsaWRldl90CXN5bnRoOworCXNuZF9hbGlfY2hhbm5lbF9jb250cm9sX3QgY2hyZWdzOworCisJLyogUy9QRElGIE1hc2sgKi8KKwl1bnNpZ25lZCBpbnQJc3BkaWZfbWFzazsKKworCXVuc2lnbmVkIGludCBzcHVyaW91c19pcnFfY291bnQ7CisJdW5zaWduZWQgaW50IHNwdXJpb3VzX2lycV9tYXhfZGVsdGE7CisKKwlhYzk3X2J1c190ICphYzk3X2J1czsKKwlhYzk3X3QgKmFjOTc7CisJdW5zaWduZWQgc2hvcnQJYWM5N19leHRfaWQ7CisJdW5zaWduZWQgc2hvcnQJYWM5N19leHRfc3RhdHVzOworCisJc3BpbmxvY2tfdAlyZWdfbG9jazsKKwlzcGlubG9ja190CXZvaWNlX2FsbG9jOworCisjaWZkZWYgQ09ORklHX1BNCisJYWxpX2ltYWdlX3QgKmltYWdlOworI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2FsaV9pZHNbXSA9IHsKKwl7MHgxMGI5LCAweDU0NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJezAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2FsaV9pZHMpOworCitzdGF0aWMgdm9pZCBzbmRfYWxpX2NsZWFyX3ZvaWNlcyhhbGlfdCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2FsaV9jb2RlY19wZWVrKGFsaV90ICosIGludCwgdW5zaWduZWQgc2hvcnQpOworc3RhdGljIHZvaWQgc25kX2FsaV9jb2RlY19wb2tlKGFsaV90ICosIGludCwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKKworLyoKKyAqICBEZWJ1ZyBQYXJ0CisgKi8KKworI2lmZGVmIEFMSV9ERUJVRworCitzdGF0aWMgdm9pZCBhbGlfcmVhZF9yZWdzKGFsaV90ICpjb2RlYywgaW50IGNoYW5uZWwpCit7CisJaW50IGksajsKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisKKwlwcmludGsoImNoYW5uZWwgJWQgcmVnaXN0ZXJzIG1hcDpcbiIsIGNoYW5uZWwpOworCW91dGIoKHVuc2lnbmVkIGNoYXIpKGNoYW5uZWwgJiAweDAwMWYpLCBBTElfUkVHKGNvZGVjLEFMSV9HQ19DSVIpKTsKKworCXByaW50aygiICAgICIpOworCWZvcihqPTA7ajw4O2orKykKKwkJcHJpbnRrKCIlMi4yeCAgICAgICAiLCBqKjQpOworCXByaW50aygiXG4iKTsKKworCWZvciAoaT0wOyBpPD0weGY4LzQ7aSsrKSB7CisJCWlmKGklOCA9PSAwKQorCQkJcHJpbnRrKCIlMi4yeCAgIiwgKGkqNC8weDEwKSoweDEwKTsKKwkJZHdWYWwgPSBpbmwoQUxJX1JFRyhjb2RlYyxpKjQpKTsKKwkJcHJpbnRrKCIlOC44eCAiLCBkd1ZhbCk7CisJCWlmICgoaSsxKSU4ID09IDApCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKK30KK3N0YXRpYyB2b2lkIGFsaV9yZWFkX2NmZyh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBkZXZpY2VpZCkKK3sKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCWludCBpLGo7CisKKworICAgICAgICBwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKHZlbmRvciwgZGV2aWNlaWQsIHBjaV9kZXYpOworICAgICAgICBpZiAocGNpX2RldiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiA7CisKKwlwcmludGsoIlxuTSV4IFBDSSBDRkdcbiIsIGRldmljZWlkKTsKKwlwcmludGsoIiAgICAiKTsKKwlmb3Ioaj0wO2o8ODtqKyspCisJCXByaW50aygiJWQgICAgICAgICIsaik7CisJcHJpbnRrKCJcbiIpOworCisJZm9yKGk9MDtpPDg7aSsrKSB7CisJCXByaW50aygiJWQgICAiLGkpOworCQlmb3Ioaj0wO2o8ODtqKyspCisJCXsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBpKjB4MjAraio0LCAmZHdWYWwpOworCQkJcHJpbnRrKCIlOC44eCAiLCBkd1ZhbCk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKyB9CitzdGF0aWMgdm9pZCBhbGlfcmVhZF9hYzk3cmVncyhhbGlfdCAqY29kZWMsIGludCBzZWNvbmRhcnkpCit7CisJdW5zaWduZWQgc2hvcnQgaSxqOworCXVuc2lnbmVkIHNob3J0IHdWYWw7CisKKwlwcmludGsoIlxuY29kZWMgJWQgcmVnaXN0ZXJzIG1hcDpcbiIsIHNlY29uZGFyeSk7CisKKwlwcmludGsoIiAgICAiKTsKKwlmb3Ioaj0wO2o8ODtqKyspCisJCXByaW50aygiJTIuMnggICAiLGoqMik7CisJcHJpbnRrKCJcbiIpOworCisJZm9yIChpPTA7IGk8NjQ7aSsrKSB7CisJCWlmKGklOCA9PSAwKQorCQkJcHJpbnRrKCIlMi4yeCAgIiwgKGkvOCkqMHgxMCk7CisJCXdWYWwgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIHNlY29uZGFyeSwgaSoyKTsKKwkJcHJpbnRrKCIlNC40eCAiLCB3VmFsKTsKKwkJaWYgKChpKzEpJTggPT0gMCkKKwkJCXByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisjZW5kaWYKKworLyoKKyAqICBBQzk3IEFDQ0VTUworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9hbGlfNTQ1MV9wZWVrKGFsaV90ICpjb2RlYywKKwkJCQkJCXVuc2lnbmVkIGludCBwb3J0ICkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGludClpbmwoQUxJX1JFRyhjb2RlYywgcG9ydCkpOyAKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9hbGlfNTQ1MV9wb2tlKAlhbGlfdCAqY29kZWMsCisJCQkJCXVuc2lnbmVkIGludCBwb3J0LAorCQkJCQl1bnNpZ25lZCBpbnQgdmFsICkKK3sKKwlvdXRsKCh1bnNpZ25lZCBpbnQpdmFsLCBBTElfUkVHKGNvZGVjLCBwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsaV9jb2RlY19yZWFkeSgJYWxpX3QgKmNvZGVjLAorCQkJCXVuc2lnbmVkIGludCBwb3J0LAorCQkJCWludCBzY2hlZCApCit7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1bnNpZ25lZCBpbnQgcmVzOworCQorCWVuZF90aW1lID0gamlmZmllcyArIDEwICogKEhaID4+IDIpOworCWRvIHsKKwkJcmVzID0gc25kX2FsaV81NDUxX3BlZWsoY29kZWMscG9ydCk7CisJCWlmICghIChyZXMgJiAweDgwMDApKQorCQkJcmV0dXJuIDA7CisJCWlmIChzY2hlZCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwlzbmRfYWxpXzU0NTFfcG9rZShjb2RlYywgcG9ydCwgcmVzICYgfjB4ODAwMCk7CisJc25kX3ByaW50ZGQoImFsaV9jb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5LlxuICIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHNuZF9hbGlfc3RpbWVyX3JlYWR5KGFsaV90ICpjb2RlYywgaW50IHNjaGVkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgbG9uZyBkd0NoazEsZHdDaGsyOworCQorCWR3Q2hrMSA9IHNuZF9hbGlfNTQ1MV9wZWVrKGNvZGVjLCBBTElfU1RJTUVSKTsKKwlkd0NoazIgPSBzbmRfYWxpXzU0NTFfcGVlayhjb2RlYywgQUxJX1NUSU1FUik7CisKKwllbmRfdGltZSA9IGppZmZpZXMgKyAxMCAqIChIWiA+PiAyKTsKKwlkbyB7CisJCWR3Q2hrMiA9IHNuZF9hbGlfNTQ1MV9wZWVrKGNvZGVjLCBBTElfU1RJTUVSKTsKKwkJaWYgKGR3Q2hrMiAhPSBkd0NoazEpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHNjaGVkKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOworCXNuZF9wcmludGsoImFsaV9zdGltZXJfcmVhZDogc3RpbWVyIGlzIG5vdCByZWFkeS5cbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2NvZGVjX3Bva2UoYWxpX3QgKmNvZGVjLGludCBzZWNvbmRhcnksCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdW5zaWduZWQgaW50IGR3VmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IDA7CisKKwlpZiAocmVnID49IDB4ODApIHsKKwkJc25kX3ByaW50aygiYWxpX2NvZGVjX3Bva2U6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOworCQlyZXR1cm47CisJfQorCisJcG9ydCA9IGNvZGVjLT5jaHJlZ3MucmVncy5hYzk3d3JpdGU7CisKKwlpZiAoc25kX2FsaV9jb2RlY19yZWFkeShjb2RlYywgcG9ydCwgMCkgPCAwKQorCQlyZXR1cm47CisJaWYgKHNuZF9hbGlfc3RpbWVyX3JlYWR5KGNvZGVjLCAwKSA8IDApCisJCXJldHVybjsKKworCWR3VmFsICA9ICh1bnNpZ25lZCBpbnQpIChyZWcgJiAweGZmKTsKKwlkd1ZhbCB8PSAweDgwMDAgfCAodmFsIDw8IDE2KTsKKwlpZiAoc2Vjb25kYXJ5KSBkd1ZhbCB8PSAweDAwODA7CisJaWYgKGNvZGVjLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIGR3VmFsIHw9IDB4MDEwMDsKKworCXNuZF9hbGlfNTQ1MV9wb2tlKGNvZGVjLHBvcnQsZHdWYWwpOworCisJcmV0dXJuIDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9hbGlfY29kZWNfcGVlayggYWxpX3QgKmNvZGVjLAorCQkJCQkgIGludCBzZWNvbmRhcnksCisJCQkJCSAgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIGludCBkd1ZhbCA9IDA7CisJdW5zaWduZWQgaW50IHBvcnQgPSAwOworCisJaWYgKHJlZyA+PSAweDgwKSB7CisJCXNuZF9wcmludGsoImFsaV9jb2RlY19wZWVrOiByZWcoJXhoKSBpbnZhbGlkLlxuIiwgcmVnKTsKKwkJcmV0dXJuIH4wOworCX0KKworCXBvcnQgPSBjb2RlYy0+Y2hyZWdzLnJlZ3MuYWM5N3JlYWQ7CisKKwlpZiAoc25kX2FsaV9jb2RlY19yZWFkeShjb2RlYywgcG9ydCwgMCkgPCAwKQorCQlyZXR1cm4gfjA7CisJaWYgKHNuZF9hbGlfc3RpbWVyX3JlYWR5KGNvZGVjLCAwKSA8IDApCisJCXJldHVybiB+MDsKKworCWR3VmFsICA9ICh1bnNpZ25lZCBpbnQpIChyZWcgJiAweGZmKTsKKwlkd1ZhbCB8PSAweDgwMDA7CQkJCS8qIGJpdCAxNSovCisJaWYgKHNlY29uZGFyeSkgZHdWYWwgfD0gMHgwMDgwOworCisJc25kX2FsaV81NDUxX3Bva2UoY29kZWMsIHBvcnQsIGR3VmFsKTsKKworCWlmIChzbmRfYWxpX3N0aW1lcl9yZWFkeShjb2RlYywgMCkgPCAwKQorCQlyZXR1cm4gfjA7CisJaWYgKHNuZF9hbGlfY29kZWNfcmVhZHkoY29kZWMsIHBvcnQsIDApIDwgMCkKKwkJcmV0dXJuIH4wOworCQorCXJldHVybiAoc25kX2FsaV81NDUxX3BlZWsoY29kZWMsIHBvcnQpICYgMHhmZmZmMDAwMCk+PjE2OworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywKKwkJCQl1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJdW5zaWduZWQgc2hvcnQgdmFsICkKK3sKKwlhbGlfdCAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisKKwlzbmRfYWxpX3ByaW50aygiY29kZWNfd3JpdGU6IHJlZz0leGggZGF0YT0leGguXG4iLCByZWcsIHZhbCk7CisJc25kX2FsaV9jb2RlY19wb2tlKGNvZGVjLCAwLCByZWcsIHZhbCk7CisJcmV0dXJuIDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2FsaV9jb2RlY19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWFsaV90ICpjb2RlYyA9IGFjOTctPnByaXZhdGVfZGF0YTsKKworCXNuZF9hbGlfcHJpbnRrKCJjb2RlY19yZWFkIHJlZz0leGguXG4iLCByZWcpOworCXJldHVybiAoc25kX2FsaV9jb2RlY19wZWVrKGNvZGVjLCAwLCByZWcpKTsKK30KKworLyoKKyAqCUFDOTcgUmVzZXQKKyAqLworCitzdGF0aWMgaW50IHNuZF9hbGlfcmVzZXRfNTQ1MShhbGlfdCAqY29kZWMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXVuc2lnbmVkIHNob3J0IHdDb3VudCwgd1JlZzsKKwl1bnNpZ25lZCBpbnQgICBkd1ZhbDsKKwkKKwlpZiAoKHBjaV9kZXYgPSBjb2RlYy0+cGNpX20xNTMzKSAhPSBOVUxMKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsIGR3VmFsIHwgMHgwODAwMDAwMCk7CisJCXVkZWxheSg1MDAwKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgJiAweGY3ZmZmZmZmKTsKKwkJdWRlbGF5KDUwMDApOworCX0KKwkKKwlwY2lfZGV2ID0gY29kZWMtPnBjaTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgJmR3VmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsIGR3VmFsIHwgMHgwMDBjMDAwMCk7CisJdWRlbGF5KDUwMCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsICZkd1ZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCBkd1ZhbCAmIDB4ZmZmYmZmZmYpOworCXVkZWxheSg1MDAwKTsKKwkKKwl3Q291bnQgPSAyMDA7CisJd2hpbGUod0NvdW50LS0pIHsKKwkJd1JlZyA9IHNuZF9hbGlfY29kZWNfcGVlayhjb2RlYywgMCwgQUM5N19QT1dFUkRPV04pOworCQlpZigod1JlZyAmIDB4MDAwZikgPT0gMHgwMDBmKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSg1MDAwKTsKKwl9CisKKwkvKiBub24tZmF0YWwgaWYgeW91IGhhdmUgYSBub24gUE0gY2FwYWJsZSBjb2RlYyAqLworCS8qIHNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGk1NDUxOiByZXNldCB0aW1lIG91dFxuIik7ICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT0RFQ19SRVNFVAorCitzdGF0aWMgaW50IHNuZF9hbGlfcmVzZXRfY29kZWMoYWxpX3QgKmNvZGVjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGJWYWwgPSAwOworCXVuc2lnbmVkIGludCAgIGR3VmFsOworCXVuc2lnbmVkIHNob3J0IHdDb3VudCwgd1JlZzsKKworCXBjaV9kZXYgPSBjb2RlYy0+cGNpX20xNTMzOworCQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgfCAweDA4MDAwMDAwKTsKKwl1ZGVsYXkoNTAwMCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCBkd1ZhbCAmIDB4ZjdmZmZmZmYpOworCXVkZWxheSg1MDAwKTsKKworCWJWYWwgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU0NUUkwpKTsKKwliVmFsIHw9IDB4MDI7CisJb3V0YihBTElfUkVHKGNvZGVjLEFMSV9TQ1RSTCksYlZhbCk7CisJdWRlbGF5KDUwMDApOworCWJWYWwgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU0NUUkwpKTsKKwliVmFsICY9IDB4ZmQ7CisJb3V0YihBTElfUkVHKGNvZGVjLEFMSV9TQ1RSTCksYlZhbCk7CisJdWRlbGF5KDE1MDAwKTsKKworCXdDb3VudCA9IDIwMDsKKwl3aGlsZSh3Q291bnQtLSkgeworCQl3UmVnID0gc25kX2FsaV9jb2RlY19yZWFkKGNvZGVjLT5hYzk3LCBBQzk3X1BPV0VSRE9XTik7CisJCWlmKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDUwMDApOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKyNlbmRpZgorCisvKgorICogIEFMSSA1NDUxIENvbnRyb2xsZXIKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoYWxpX3QgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBsb25nIGR3VmFsID0gMDsKKworCWR3VmFsICA9IGlubChBTElfUkVHKGNvZGVjLEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCWR3VmFsIHw9IDEgPDwgKGNoYW5uZWwgJiAweDAwMDAwMDFmKTsKKwlvdXRsKGR3VmFsLCBBTElfUkVHKGNvZGVjLEFMSV9HTE9CQUxfQ09OVFJPTCkpOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGFsaV90ICpjb2RlYywgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgbG9uZyBkd1ZhbCA9IDA7CisKKwlkd1ZhbCAgPSBpbmwoQUxJX1JFRyhjb2RlYyxBTElfR0xPQkFMX0NPTlRST0wpKTsKKwlkd1ZhbCAmPSB+KDEgPDwgKGNoYW5uZWwgJiAweDAwMDAwMDFmKSk7CisJb3V0bChkd1ZhbCwgQUxJX1JFRyhjb2RlYyxBTElfR0xPQkFMX0NPTlRST0wpKTsKK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9lbmFibGVfYWRkcmVzc19pbnRlcnJ1cHQoYWxpX3QgKiBjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgZ2M7CisKKwlnYyAgPSBpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOworCWdjIHw9IEVORExQX0lFOworCWdjIHw9IE1JRExQX0lFOworCW91dGwoIGdjLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfZGlzYWJsZV9hZGRyZXNzX2ludGVycnVwdChhbGlfdCAqIGNvZGVjKQoreworCXVuc2lnbmVkIGludCBnYzsKKworCWdjICA9IGlubChBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7CisJZ2MgJj0gfkVORExQX0lFOworCWdjICY9IH5NSURMUF9JRTsKKwlvdXRsKGdjLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7Cit9CisKKyNpZiAwIC8vIG5vdCB1c2VkCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV92b2ljZV9pcnEoYWxpX3QgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlzbmRfYWxpX2NoYW5uZWxfY29udHJvbF90ICpwY2hyZWdzID0gJihjb2RlYy0+Y2hyZWdzKTsKKworCXNuZF9hbGlfcHJpbnRrKCJlbmFibGVfdm9pY2VfaXJxIGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJCisJbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlwY2hyZWdzLT5kYXRhLmFpbnRlbiAgPSBpbmwoQUxJX1JFRyhjb2RlYyxwY2hyZWdzLT5yZWdzLmFpbnRlbikpOworCXBjaHJlZ3MtPmRhdGEuYWludGVuIHw9IG1hc2s7CisJb3V0bChwY2hyZWdzLT5kYXRhLmFpbnRlbixBTElfUkVHKGNvZGVjLHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc25kX2FsaV9kaXNhYmxlX3ZvaWNlX2lycShhbGlfdCAqY29kZWMsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXNuZF9hbGlfY2hhbm5lbF9jb250cm9sX3QgKnBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOworCisJc25kX2FsaV9wcmludGsoImRpc2FibGVfdm9pY2VfaXJxIGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisKKwltYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOworCXBjaHJlZ3MtPmRhdGEuYWludGVuICA9IGlubChBTElfUkVHKGNvZGVjLHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7CisJcGNocmVncy0+ZGF0YS5haW50ZW4gJj0gfm1hc2s7CisJb3V0bChwY2hyZWdzLT5kYXRhLmFpbnRlbixBTElfUkVHKGNvZGVjLHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChhbGlfdCAqY29kZWMsIGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCBpZHggPSAgY2hhbm5lbCAmIDB4MWY7CisKKwlpZiAoY29kZWMtPnN5bnRoLmNoY250ID49IEFMSV9DSEFOTkVMUyl7CisJCXNuZF9wcmludGsoImFsaV9hbGxvY19wY21fY2hhbm5lbDogbm8gZnJlZSBjaGFubmVscy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCEoY29kZWMtPnN5bnRoLmNobWFwICYgKDEgPDwgaWR4KSkpIHsKKwkJY29kZWMtPnN5bnRoLmNobWFwIHw9IDEgPDwgaWR4OworCQljb2RlYy0+c3ludGguY2hjbnQrKzsKKwkJc25kX2FsaV9wcmludGsoImFsbG9jX3BjbV9jaGFubmVsIG5vLiAlZC5cbiIsaWR4KTsKKwkJcmV0dXJuIGlkeDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNuZF9hbGlfZmluZF9mcmVlX2NoYW5uZWwoYWxpX3QgKiBjb2RlYywgaW50IHJlYykKK3sKKwlpbnQgaWR4OworCWludCByZXN1bHQgPSAtMTsKKworCXNuZF9hbGlfcHJpbnRrKCJmaW5kX2ZyZWVfY2hhbm5lbDogZm9yICVzXG4iLHJlYyA/ICJyZWMiIDogInBjbSIpOworCisJLy8gcmVjb3JkaW5nCisJaWYgKHJlYykgeworCQlpZiAoY29kZWMtPnNwZGlmX3N1cHBvcnQgJiYKKwkJICAgIChpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiBBTElfU1BESUZfSU5fU1VQUE9SVCkpCisJCQlpZHggPSBBTElfU1BESUZfSU5fQ0hBTk5FTDsKKwkJZWxzZQorCQkJaWR4ID0gQUxJX1BDTV9JTl9DSEFOTkVMOworCisJCWlmICgocmVzdWx0ID0gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYyxpZHgpKSA+PSAwKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJc25kX3ByaW50aygiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiByZWNvcmQgY2hhbm5lbCBpcyBidXN5IG5vdy5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLy9wbGF5YmFjay4uLgorCWlmIChjb2RlYy0+c3BkaWZfc3VwcG9ydCAmJgorCSAgICAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpKSB7CisJCWlkeCA9IEFMSV9TUERJRl9PVVRfQ0hBTk5FTDsKKwkJaWYgKChyZXN1bHQgPSBzbmRfYWxpX2FsbG9jX3BjbV9jaGFubmVsKGNvZGVjLGlkeCkpID49IDApIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlzbmRfcHJpbnRrKCJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IFMvUERJRiBvdXQgY2hhbm5lbCBpcyBpbiBidXN5IG5vdy5cbiIpOworCQl9CisJfQorCisJZm9yIChpZHggPSAwOyBpZHggPCBBTElfQ0hBTk5FTFM7IGlkeCsrKSB7CisJCWlmICgocmVzdWx0ID0gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYyxpZHgpKSA+PSAwKQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisJc25kX3ByaW50aygiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBubyBmcmVlIGNoYW5uZWxzLlxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2ZyZWVfY2hhbm5lbF9wY20oYWxpX3QgKmNvZGVjLCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2hhbm5lbCAmIDB4MDAwMDAwMWY7CisKKwlzbmRfYWxpX3ByaW50aygiZnJlZV9jaGFubmVsX3BjbSBjaGFubmVsPSVkXG4iLGNoYW5uZWwpOworCisJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPj0gQUxJX0NIQU5ORUxTKQorCQlyZXR1cm47CisKKwlpZiAoIShjb2RlYy0+c3ludGguY2htYXAgJiAoMSA8PCBpZHgpKSkgeworCQlzbmRfcHJpbnRrKCJhbGlfZnJlZV9jaGFubmVsX3BjbTogY2hhbm5lbCAlZCBpcyBub3QgaW4gdXNlLlxuIixjaGFubmVsKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWNvZGVjLT5zeW50aC5jaG1hcCAmPSB+KDEgPDwgaWR4KTsKKwkJY29kZWMtPnN5bnRoLmNoY250LS07CisJfQorfQorCisjaWYgMCAvLyBub3QgdXNlZAorc3RhdGljIHZvaWQgc25kX2FsaV9zdGFydF92b2ljZShhbGlfdCAqIGNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwkKKwlzbmRfYWxpX3ByaW50aygic3RhcnRfdm9pY2U6IGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJb3V0bChtYXNrLCBBTElfUkVHKGNvZGVjLGNvZGVjLT5jaHJlZ3MucmVncy5zdGFydCkpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfc3RvcF92b2ljZShhbGlfdCAqIGNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKworCXNuZF9hbGlfcHJpbnRrKCJzdG9wX3ZvaWNlOiBjaGFubmVsPSVkXG4iLGNoYW5uZWwpOworCW91dGwobWFzaywgQUxJX1JFRyhjb2RlYywgY29kZWMtPmNocmVncy5yZWdzLnN0b3ApKTsKK30KKworLyoKKyAqICAgIFMvUERJRiBQYXJ0CisgKi8KKworc3RhdGljIHZvaWQgc25kX2FsaV9kZWxheShhbGlfdCAqY29kZWMsaW50IGludGVydmFsKQoreworCXVuc2lnbmVkIGxvbmcgIGJlZ2ludGltZXIsY3VycmVudHRpbWVyOworCisJYmVnaW50aW1lciAgID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9TVElNRVIpKTsKKwljdXJyZW50dGltZXIgPSBpbmwoQUxJX1JFRyhjb2RlYywgQUxJX1NUSU1FUikpOworCisJd2hpbGUgKGN1cnJlbnR0aW1lciA8IGJlZ2ludGltZXIgKyBpbnRlcnZhbCkgeworCQlpZihzbmRfYWxpX3N0aW1lcl9yZWFkeShjb2RlYywgMSkgPCAwKQorCQkJYnJlYWs7CisJCWN1cnJlbnR0aW1lciA9IGlubChBTElfUkVHKGNvZGVjLCAgQUxJX1NUSU1FUikpOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9kZXRlY3Rfc3BkaWZfcmF0ZShhbGlfdCAqY29kZWMpCit7CisJdTE2IHd2YWwgID0gMDsKKwl1MTYgY291bnQgPSAwOworCXU4ICBidmFsID0gMCwgUjEgPSAwLCBSMiA9IDA7CisKKwlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMSkpOworCWJ2YWwgfD0gMHgxRjsKKwlvdXRiKGJ2YWwsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCArIDEpKTsKKworCXdoaWxlICgoKFIxIDwgMHgwQiApfHwoUjEgPiAweDBFKSkgJiYgKFIxICE9IDB4MTIpICYmIGNvdW50IDw9IDUwMDAwKSB7CisJCWNvdW50ICsrOworCQlzbmRfYWxpX2RlbGF5KGNvZGVjLCA2KTsKKwkJYnZhbCA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMSkpOworCQlSMSA9IGJ2YWwgJiAweDFGOworCX0KKworCWlmIChjb3VudCA+IDUwMDAwKSB7CisJCXNuZF9wcmludGsoImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZTogdGltZW91dCFcbiIpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSAwOworCXdoaWxlIChjb3VudCsrIDw9IDUwMDAwKSB7CisJCXNuZF9hbGlfZGVsYXkoY29kZWMsIDYpOworCQlidmFsID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCVIyID0gYnZhbCAmIDB4MUY7CisJCWlmIChSMiAhPSBSMSkgUjEgPSBSMjsgZWxzZSBicmVhazsKKwl9CisKKwlpZiAoY291bnQgPiA1MDAwMCkgeworCQlzbmRfcHJpbnRrKCJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChSMiA+PSAweDBiICYmIFIyIDw9IDB4MGUpIHsKKwkJd3ZhbCAgPSBpbncoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCArIDIpKTsKKwkJd3ZhbCAmPSAweEUwRjA7CisJCXd2YWwgfD0gKHUxNikweDA5IDw8IDggfCAodTE2KTB4MDU7CisJCW91dHcod3ZhbCxBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMikpOworCisJCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NTICszKSkgJiAweEYwOworCQlvdXRiKGJ2YWx8MHgwMixBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DUyArIDMpKTsKKwl9IGVsc2UgaWYgKFIyID09IDB4MTIpIHsKKwkJd3ZhbCAgPSBpbncoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCArIDIpKTsKKwkJd3ZhbCAmPSAweEUwRjA7CisJCXd2YWwgfD0gKHUxNikweDBFIDw8IDggfCAodTE2KTB4MDg7CisJCW91dHcod3ZhbCxBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMikpOworCisJCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NTICszKSkgJiAweEYwOworCQlvdXRiKGJ2YWx8MHgwMyxBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DUyArIDMpKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2FsaV9nZXRfc3BkaWZfaW5fcmF0ZShhbGlfdCAqY29kZWMpCit7CisJdTMyCWR3UmF0ZSA9IDA7CisJdTgJYnZhbCA9IDA7CisKKwlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7CisJYnZhbCAmPSAweDdGOworCWJ2YWwgfD0gMHg0MDsKKwlvdXRiKGJ2YWwsIEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwpKTsKKworCXNuZF9hbGlfZGV0ZWN0X3NwZGlmX3JhdGUoY29kZWMpOworCisJYnZhbCAgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1MgKyAzKSk7CisJYnZhbCAmPSAweDBGOworCisJaWYgKGJ2YWwgPT0gMCkgZHdSYXRlID0gNDQxMDA7CisJaWYgKGJ2YWwgPT0gMSkgZHdSYXRlID0gNDgwMDA7CisJaWYgKGJ2YWwgPT0gMikgZHdSYXRlID0gMzIwMDA7CisKKwlyZXR1cm4gZHdSYXRlOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV9zcGRpZl9pbihhbGlfdCAqY29kZWMpCit7CQorCXVuc2lnbmVkIGludCBkd1ZhbDsKKworCWR3VmFsID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCWR3VmFsIHw9IEFMSV9TUERJRl9JTl9TVVBQT1JUOworCW91dGwoZHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCisJZHdWYWwgPSBpbmIoQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwpKTsKKwlkd1ZhbCB8PSAweDAyOworCW91dGIoZHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CisKKwlzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMsIEFMSV9TUERJRl9JTl9DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9kaXNhYmxlX3NwZGlmX2luKGFsaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisJCisJZHdWYWwgPSBpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJZHdWYWwgJj0gfkFMSV9TUERJRl9JTl9TVVBQT1JUOworCW91dGwoZHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCQorCXNuZF9hbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMsIEFMSV9TUERJRl9JTl9DSEFOTkVMKTsJCit9CisKKworc3RhdGljIHZvaWQgc25kX2FsaV9zZXRfc3BkaWZfb3V0X3JhdGUoYWxpX3QgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICBiVmFsOworCXVuc2lnbmVkIGludCAgZHdSYXRlID0gMDsKKwkKKwlpZiAocmF0ZSA9PSAzMjAwMCkgZHdSYXRlID0gMHgzMDA7CisJaWYgKHJhdGUgPT0gNDQxMDApIGR3UmF0ZSA9IDA7CisJaWYgKHJhdGUgPT0gNDgwMDApIGR3UmF0ZSA9IDB4MjAwOworCQorCWJWYWwgID0gaW5iKEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CisJYlZhbCAmPSAodW5zaWduZWQgY2hhcikofigxPDw2KSk7CisJCisJYlZhbCB8PSAweDgwOwkJLy9zZWxlY3QgcmlnaHQKKwlvdXRiKGJWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CisJb3V0Yihkd1JhdGUgfCAweDIwLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1MgKyAyKSk7CisJCisJYlZhbCAmPSAofjB4ODApOwkvL3NlbGVjdCBsZWZ0CisJb3V0YihiVmFsLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1RSTCkpOworCW91dHcocmF0ZSB8IDB4MTAsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DUyArIDIpKTsKK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9lbmFibGVfc3BkaWZfb3V0KGFsaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBzaG9ydCB3VmFsOworCXVuc2lnbmVkIGNoYXIgYlZhbDsKKworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKyAgICAgICAgcGNpX2RldiA9IGNvZGVjLT5wY2lfbTE1MzM7CisgICAgICAgIGlmIChwY2lfZGV2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDYxLCAmYlZhbCk7CisgICAgICAgIGJWYWwgfD0gMHg0MDsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsIGJWYWwpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdkLCAmYlZhbCk7CisgICAgICAgIGJWYWwgfD0gMHgwMTsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsIGJWYWwpOworCisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZiVmFsKTsKKyAgICAgICAgYlZhbCAmPSAofjB4MjApOworICAgICAgICBiVmFsIHw9IDB4MTA7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCBiVmFsKTsKKworCWJWYWwgPSBpbmIoQUxJX1JFRyhjb2RlYywgQUxJX1NDVFJMKSk7CisJb3V0YihiVmFsIHwgQUxJX1NQRElGX09VVF9FTkFCTEUsIEFMSV9SRUcoY29kZWMsIEFMSV9TQ1RSTCkpOworCisJYlZhbCA9IGluYihBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1RSTCkpOworCW91dGIoYlZhbCAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1RSTCkpOworICAgCisJeworICAgCQl3VmFsID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworICAgCQl3VmFsIHw9IEFMSV9TUERJRl9PVVRfU0VMX1BDTTsKKyAgIAkJb3V0dyh3VmFsLCBBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKwkJc25kX2FsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjb2RlYyxBTElfU1BESUZfT1VUX0NIQU5ORUwpOworICAgCX0KK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9lbmFibGVfc3BkaWZfY2hub3V0KGFsaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBzaG9ydCB3VmFsID0gMDsKKworCXdWYWwgID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworICAgCXdWYWwgJj0gfkFMSV9TUERJRl9PVVRfU0VMX1BDTTsKKyAgIAlvdXR3KHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworLyoKKwl3VmFsID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DUykpOworCWlmIChmbGFnICYgQUxJX1NQRElGX09VVF9OT05fUENNKQorICAgCQl3VmFsIHw9IDB4MDAwMjsKKwllbHNlCQorCQl3VmFsICY9ICh+MHgwMDAyKTsKKyAgIAlvdXR3KHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DUykpOworKi8KKwlzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMsQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9kaXNhYmxlX3NwZGlmX2Nobm91dChhbGlfdCAqY29kZWMpCit7CisJdW5zaWduZWQgc2hvcnQgd1ZhbCA9IDA7CisgIAl3VmFsICA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKyAgIAl3VmFsIHw9IEFMSV9TUERJRl9PVVRfU0VMX1BDTTsKKyAgIAlvdXR3KHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCisJc25kX2FsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKGNvZGVjLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2Rpc2FibGVfc3BkaWZfb3V0KGFsaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBjaGFyICBiVmFsOworCisJYlZhbCA9IGluYihBTElfUkVHKGNvZGVjLCBBTElfU0NUUkwpKTsKKwlvdXRiKGJWYWwgJiB+QUxJX1NQRElGX09VVF9FTkFCTEUsIEFMSV9SRUcoY29kZWMsIEFMSV9TQ1RSTCkpOworCisJc25kX2FsaV9kaXNhYmxlX3NwZGlmX2Nobm91dChjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfdXBkYXRlX3B0cihhbGlfdCAqY29kZWMsaW50IGNoYW5uZWwpCit7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSBOVUxMOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lOworCXNuZF9hbGlfY2hhbm5lbF9jb250cm9sX3QgKnBjaHJlZ3MgPSBOVUxMOworCXVuc2lnbmVkIGludCBvbGQsIG1hc2s7CisjaWZkZWYgQUxJX0RFQlVHCisJdW5zaWduZWQgaW50IHRlbXAsIGNzcGY7CisjZW5kaWYKKworCXBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOworCisJLy8gY2hlY2sgaWYgaW50ZXJydXB0IG9jY3VycmVkIGZvciBjaGFubmVsCisJb2xkICA9IHBjaHJlZ3MtPmRhdGEuYWludDsKKwltYXNrID0gKCh1bnNpZ25lZCBpbnQpIDFMKSA8PCAoY2hhbm5lbCAmIDB4MWYpOworCisJaWYgKCEob2xkICYgbWFzaykpCisJCXJldHVybjsKKworCXB2b2ljZSA9ICZjb2RlYy0+c3ludGgudm9pY2VzW2NoYW5uZWxdOworCXJ1bnRpbWUgPSBwdm9pY2UtPnN1YnN0cmVhbS0+cnVudGltZTsKKworCXVkZWxheSgxMDApOworCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKworCWlmIChwdm9pY2UtPnBjbSAmJiBwdm9pY2UtPnN1YnN0cmVhbSkgeworCQkvKiBwY20gaW50ZXJydXB0ICovCisjaWZkZWYgQUxJX0RFQlVHCisJCW91dGIoKHU4KShwdm9pY2UtPm51bWJlciksIEFMSV9SRUcoY29kZWMsIEFMSV9HQ19DSVIpKTsKKwkJdGVtcCA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKKwkJY3NwZiA9IChpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0NTUEYpKSAmIG1hc2spID09IG1hc2s7CisjZW5kaWYKKwkJaWYgKHB2b2ljZS0+cnVubmluZykgeworCQkJc25kX2FsaV9wcmludGsoInVwZGF0ZV9wdHI6IGNzbz0lNC40eCBjc3BmPSVkLlxuIiwodTE2KXRlbXAsY3NwZik7CisJCQlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5zdWJzdHJlYW0pOworCQkJc3Bpbl9sb2NrKCZjb2RlYy0+cmVnX2xvY2spOworCQl9IGVsc2UgeworCQkJc25kX2FsaV9zdG9wX3ZvaWNlKGNvZGVjLCBjaGFubmVsKTsKKwkJCXNuZF9hbGlfZGlzYWJsZV92b2ljZV9pcnEoY29kZWMsIGNoYW5uZWwpOworCQl9CQorCX0gZWxzZSBpZiAoY29kZWMtPnN5bnRoLnZvaWNlc1tjaGFubmVsXS5zeW50aCkgeworCQkvKiBzeW50aCBpbnRlcnJ1cHQgKi8KKwl9IGVsc2UgaWYgKGNvZGVjLT5zeW50aC52b2ljZXNbY2hhbm5lbF0ubWlkaSkgeworCQkvKiBtaWRpIGludGVycnVwdCAqLworCX0gZWxzZSB7CisJCS8qIHVua25vd24gaW50ZXJydXB0ICovCisJCXNuZF9hbGlfc3RvcF92b2ljZShjb2RlYywgY2hhbm5lbCk7CisJCXNuZF9hbGlfZGlzYWJsZV92b2ljZV9pcnEoY29kZWMsIGNoYW5uZWwpOworCX0KKwlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwlvdXRsKG1hc2ssQUxJX1JFRyhjb2RlYyxwY2hyZWdzLT5yZWdzLmFpbnQpKTsKKwlwY2hyZWdzLT5kYXRhLmFpbnQgPSBvbGQgJiAofm1hc2spOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxpX2ludGVycnVwdChhbGlfdCAqIGNvZGVjKQoreworCWludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBhdWRpb19pbnQ7CisJc25kX2FsaV9jaGFubmVsX2NvbnRyb2xfdCAqcGNocmVncyA9IE5VTEw7CisJcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CisKKwlhdWRpb19pbnQgPSBpbmwoQUxJX1JFRyhjb2RlYywgQUxJX01JU0NJTlQpKTsKKwlpZiAoYXVkaW9faW50ICYgQUREUkVTU19JUlEpIHsKKwkJLy8gZ2V0IGludGVycnVwdCBzdGF0dXMgZm9yIGFsbCBjaGFubmVscworCQlwY2hyZWdzLT5kYXRhLmFpbnQgPSBpbmwoQUxJX1JFRyhjb2RlYyxwY2hyZWdzLT5yZWdzLmFpbnQpKTsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IEFMSV9DSEFOTkVMUzsgY2hhbm5lbCsrKSB7CisJCQlzbmRfYWxpX3VwZGF0ZV9wdHIoY29kZWMsIGNoYW5uZWwpOworCQl9CisJfQorCW91dGwoKFRBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLAorCQlBTElfUkVHKGNvZGVjLEFMSV9NSVNDSU5UKSk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHNuZF9hbGlfY2FyZF9pbnRlcnJ1cHQoaW50IGlycSwKKwkJCQkgICB2b2lkICpkZXZfaWQsCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWxpX3QgCSpjb2RlYyA9IGRldl9pZDsKKworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc25kX2FsaV9pbnRlcnJ1cHQoY29kZWMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgc25kX2FsaV92b2ljZV90ICpzbmRfYWxpX2FsbG9jX3ZvaWNlKGFsaV90ICogY29kZWMsIGludCB0eXBlLCBpbnQgcmVjKQoreworCXNuZF9hbGlfdm9pY2VfdCAqcHZvaWNlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZHg7CisKKwlzbmRfYWxpX3ByaW50aygiYWxsb2Nfdm9pY2U6IHR5cGU9JWQgcmVjPSVkXG4iLHR5cGUscmVjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb2RlYy0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwlpZiAodHlwZSA9PSBTTkRSVl9BTElfVk9JQ0VfVFlQRV9QQ00pIHsKKwkJaWR4ID0gc25kX2FsaV9maW5kX2ZyZWVfY2hhbm5lbChjb2RlYyxyZWMpOworCQlpZihpZHggPCAwKSB7CisJCQlzbmRfcHJpbnRrKCJhbGlfYWxsb2Nfdm9pY2U6IGVyci5cbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnZvaWNlX2FsbG9jLCBmbGFncyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwdm9pY2UgPSAmKGNvZGVjLT5zeW50aC52b2ljZXNbaWR4XSk7CisJCXB2b2ljZS0+dXNlID0gMTsKKwkJcHZvaWNlLT5wY20gPSAxOworCQlwdm9pY2UtPm1vZGUgPSByZWM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT52b2ljZV9hbGxvYywgZmxhZ3MpOworCQlyZXR1cm4gcHZvaWNlOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2RlYy0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBzbmRfYWxpX2ZyZWVfdm9pY2UoYWxpX3QgKiBjb2RlYywgc25kX2FsaV92b2ljZV90ICpwdm9pY2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICgqcHJpdmF0ZV9mcmVlKSh2b2lkICopOworCXZvaWQgKnByaXZhdGVfZGF0YTsKKworCXNuZF9hbGlfcHJpbnRrKCJmcmVlX3ZvaWNlOiBjaGFubmVsPSVkXG4iLHB2b2ljZS0+bnVtYmVyKTsKKwlpZiAocHZvaWNlID09IE5VTEwgfHwgIXB2b2ljZS0+dXNlKQorCQlyZXR1cm47CisJc25kX2FsaV9jbGVhcl92b2ljZXMoY29kZWMsIHB2b2ljZS0+bnVtYmVyLCBwdm9pY2UtPm51bWJlcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvZGVjLT52b2ljZV9hbGxvYywgZmxhZ3MpOworCXByaXZhdGVfZnJlZSA9IHB2b2ljZS0+cHJpdmF0ZV9mcmVlOworCXByaXZhdGVfZGF0YSA9IHB2b2ljZS0+cHJpdmF0ZV9kYXRhOworCXB2b2ljZS0+cHJpdmF0ZV9mcmVlID0gTlVMTDsKKwlwdm9pY2UtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJaWYgKHB2b2ljZS0+cGNtKSB7CisJCXNuZF9hbGlfZnJlZV9jaGFubmVsX3BjbShjb2RlYywgcHZvaWNlLT5udW1iZXIpOworCX0KKwlwdm9pY2UtPnVzZSA9IHB2b2ljZS0+cGNtID0gcHZvaWNlLT5zeW50aCA9IDA7CisJcHZvaWNlLT5zdWJzdHJlYW0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT52b2ljZV9hbGxvYywgZmxhZ3MpOworCWlmIChwcml2YXRlX2ZyZWUpCisJCXByaXZhdGVfZnJlZShwcml2YXRlX2RhdGEpOworfQorCisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfY2xlYXJfdm9pY2VzKGFsaV90ICogY29kZWMsCisJCQkgIHVuc2lnbmVkIGludCB2X21pbiwKKwkJCSAgdW5zaWduZWQgaW50IHZfbWF4KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gdl9taW47IGkgPD0gdl9tYXg7IGkrKykgeworCQlzbmRfYWxpX3N0b3Bfdm9pY2UoY29kZWMsIGkpOworCQlzbmRfYWxpX2Rpc2FibGVfdm9pY2VfaXJxKGNvZGVjLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfd3JpdGVfdm9pY2VfcmVncyhhbGlfdCAqIGNvZGVjLAorCQkJIHVuc2lnbmVkIGludCBDaGFubmVsLAorCQkJIHVuc2lnbmVkIGludCBMQkEsCisJCQkgdW5zaWduZWQgaW50IENTTywKKwkJCSB1bnNpZ25lZCBpbnQgRVNPLAorCQkJIHVuc2lnbmVkIGludCBERUxUQSwKKwkJCSB1bnNpZ25lZCBpbnQgQUxQSEFfRk1TLAorCQkJIHVuc2lnbmVkIGludCBHVlNFTCwKKwkJCSB1bnNpZ25lZCBpbnQgUEFOLAorCQkJIHVuc2lnbmVkIGludCBWT0wsCisJCQkgdW5zaWduZWQgaW50IENUUkwsCisJCQkgdW5zaWduZWQgaW50IEVDKQoreworCXVuc2lnbmVkIGludCBjdGxjbWRzWzRdOworCQorCW91dGIoKHVuc2lnbmVkIGNoYXIpKENoYW5uZWwgJiAweDAwMWYpLEFMSV9SRUcoY29kZWMsQUxJX0dDX0NJUikpOworCisJY3RsY21kc1swXSA9ICAoQ1NPIDw8IDE2KSB8IChBTFBIQV9GTVMgJiAweDAwMDBmZmZmKTsKKwljdGxjbWRzWzFdID0gIExCQTsKKwljdGxjbWRzWzJdID0gIChFU08gPDwgMTYpIHwgKERFTFRBICYgMHgwZmZmZik7CisJY3RsY21kc1szXSA9ICAoR1ZTRUwgPDwgMzEpIHwKKwkJICAgICAgKChQQU4gJiAweDAwMDAwMDdmKSA8PCAyNCkgfAorCQkgICAgICAoKFZPTCAmIDB4MDAwMDAwZmYpIDw8IDE2KSB8CisJCSAgICAgICgoQ1RSTCAmIDB4MDAwMDAwMGYpIDw8IDEyKSB8CisJCSAgICAgIChFQyAmIDB4MDAwMDBmZmYpOworCisJb3V0YihDaGFubmVsLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7CisKKwlvdXRsKGN0bGNtZHNbMF0sIEFMSV9SRUcoY29kZWMsQUxJX0NTT19BTFBIQV9GTVMpKTsKKwlvdXRsKGN0bGNtZHNbMV0sIEFMSV9SRUcoY29kZWMsQUxJX0xCQSkpOworCW91dGwoY3RsY21kc1syXSwgQUxJX1JFRyhjb2RlYyxBTElfRVNPX0RFTFRBKSk7CisJb3V0bChjdGxjbWRzWzNdLCBBTElfUkVHKGNvZGVjLEFMSV9HVlNFTF9QQU5fVk9DX0NUUkxfRUMpKTsKKworCW91dGwoMHgzMDAwMDAwMCwgQUxJX1JFRyhjb2RlYywgQUxJX0VCVUYxKSk7CS8qIFN0aWxsIE1vZGUgKi8KKwlvdXRsKDB4MzAwMDAwMDAsIEFMSV9SRUcoY29kZWMsIEFMSV9FQlVGMikpOwkvKiBTdGlsbCBNb2RlICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2FsaV9jb252ZXJ0X3JhdGUodW5zaWduZWQgaW50IHJhdGUsIGludCByZWMpCit7CisJdW5zaWduZWQgaW50IGRlbHRhOworCisJaWYgKHJhdGUgPCA0MDAwKSAgcmF0ZSA9IDQwMDA7CisJaWYgKHJhdGUgPiA0ODAwMCkgcmF0ZSA9IDQ4MDAwOworCisJaWYgKHJlYykgeworCQlpZiAocmF0ZSA9PSA0NDEwMCkKKwkJCWRlbHRhID0gMHgxMTZhOworCQllbHNlIGlmIChyYXRlID09IDgwMDApCisJCQlkZWx0YSA9IDB4NjAwMDsKKwkJZWxzZSBpZiAocmF0ZSA9PSA0ODAwMCkKKwkJCWRlbHRhID0gMHgxMDAwOworCQllbHNlCisJCQlkZWx0YSA9ICgoNDgwMDAgPDwgMTIpIC8gcmF0ZSkgJiAweDAwMDBmZmZmOworCX0gZWxzZSB7CisJCWlmIChyYXRlID09IDQ0MTAwKQorCQkJZGVsdGEgPSAweGViMzsKKwkJZWxzZSBpZiAocmF0ZSA9PSA4MDAwKQorCQkJZGVsdGEgPSAweDJhYjsKKwkJZWxzZSBpZiAocmF0ZSA9PSA0ODAwMCkKKwkJCWRlbHRhID0gMHgxMDAwOworCQllbHNlIAorCQkJZGVsdGEgPSAoKChyYXRlIDw8IDEyKSArIHJhdGUpIC8gNDgwMDApICYgMHgwMDAwZmZmZjsKKwl9CisKKwlyZXR1cm4gZGVsdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2FsaV9jb250cm9sX21vZGUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXVuc2lnbmVkIGludCBDVFJMOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJLyogc2V0IGN0cmwgbW9kZQorCSAgIENUUkwgZGVmYXVsdDogOC1iaXQgKHVuc2lnbmVkKSBtb25vLCBsb29wIG1vZGUgZW5hYmxlZAorCSAqLworCUNUUkwgPSAweDAwMDAwMDAxOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQlDVFJMIHw9IDB4MDAwMDAwMDg7CS8vIDE2LWJpdCBkYXRhCisJaWYgKCFzbmRfcGNtX2Zvcm1hdF91bnNpZ25lZChydW50aW1lLT5mb3JtYXQpKQorCQlDVFJMIHw9IDB4MDAwMDAwMDI7CS8vIHNpZ25lZCBkYXRhCisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID4gMSkKKwkJQ1RSTCB8PSAweDAwMDAwMDA0OwkvLyBzdGVyZW8gZGF0YQorCXJldHVybiBDVFJMOworfQorCisvKgorICogIFBDTSBwYXJ0CisgKi8KKworc3RhdGljIGludCBzbmRfYWxpX2lvY3RsKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IHNuZF9hbGlfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkgICAgICAgaW50IGNtZCkKKwkJCQkgICAgCit7CisJYWxpX3QgKmNvZGVjID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCXVuc2lnbmVkIGludCB3aGF0LCB3aGF0aSwgY2FwdHVyZV9mbGFnOworCXNuZF9hbGlfdm9pY2VfdCAqcHZvaWNlID0gTlVMTCwgKmV2b2ljZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgZG9fc3RhcnQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWRvX3N0YXJ0ID0gMTsgYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJZG9fc3RhcnQgPSAwOyBicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3aGF0ID0gd2hhdGkgPSBjYXB0dXJlX2ZsYWcgPSAwOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKKwkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCWlmICgoYWxpX3QgKikgc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzKSA9PSBjb2RlYykgeworCQkJcHZvaWNlID0gKHNuZF9hbGlfdm9pY2VfdCAqKSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCQlldm9pY2UgPSBwdm9pY2UtPmV4dHJhOworCQkJd2hhdCB8PSAxIDw8IChwdm9pY2UtPm51bWJlciAmIDB4MWYpOworCQkJaWYgKGV2b2ljZSA9PSBOVUxMKSB7CisJCQkJd2hhdGkgfD0gMSA8PCAocHZvaWNlLT5udW1iZXIgJiAweDFmKTsKKwkJCX0gZWxzZSB7CisJCQkJd2hhdGkgfD0gMSA8PCAoZXZvaWNlLT5udW1iZXIgJiAweDFmKTsKKwkJCQl3aGF0IHw9IDEgPDwgKGV2b2ljZS0+bnVtYmVyICYgMHgxZik7CisJCQl9CisJCQlpZiAoZG9fc3RhcnQpIHsKKwkJCQlwdm9pY2UtPnJ1bm5pbmcgPSAxOworCQkJCWlmIChldm9pY2UgIT0gTlVMTCkKKwkJCQkJZXZvaWNlLT5ydW5uaW5nID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcHZvaWNlLT5ydW5uaW5nID0gMDsKKwkJCQlpZiAoZXZvaWNlICE9IE5VTEwpCisJCQkJCWV2b2ljZS0+cnVubmluZyA9IDA7CisJCQl9CisJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOworCQkJaWYgKHB2b2ljZS0+bW9kZSkKKwkJCQljYXB0dXJlX2ZsYWcgPSAxOworCQl9CisJfQorCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwlpZiAoISBkb19zdGFydCkgeworCQlvdXRsKHdoYXQsIEFMSV9SRUcoY29kZWMsIEFMSV9TVE9QKSk7CisJfQorCXZhbCA9IGlubChBTElfUkVHKGNvZGVjLCBBTElfQUlOVEVOKSk7CisJaWYgKGRvX3N0YXJ0KSB7CisJCXZhbCB8PSB3aGF0aTsKKwl9IGVsc2UgeworCQl2YWwgJj0gfndoYXRpOworCX0KKwlvdXRsKHZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX0FJTlRFTikpOworCWlmIChkb19zdGFydCkgeworCQlvdXRsKHdoYXQsIEFMSV9SRUcoY29kZWMsIEFMSV9TVEFSVCkpOworCX0KKwlzbmRfYWxpX3ByaW50aygidHJpZ2dlcjogd2hhdD0leGggd2hhdGk9JXhoXG4iLHdoYXQsd2hhdGkpOworCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsaV9wbGF5YmFja19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfYWxpX3ZvaWNlX3QgKmV2b2ljZSA9IHB2b2ljZS0+ZXh0cmE7CisJaW50IGVycjsKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKSByZXR1cm4gZXJyOworCQorCS8qIHZvaWNlIG1hbmFnZW1lbnQgKi8KKworCWlmIChwYXJhbXNfYnVmZmVyX3NpemUoaHdfcGFyYW1zKS8yICE9IHBhcmFtc19wZXJpb2Rfc2l6ZShod19wYXJhbXMpKSB7CisJCWlmIChldm9pY2UgPT0gTlVMTCkgeworCQkJZXZvaWNlID0gc25kX2FsaV9hbGxvY192b2ljZShjb2RlYywgU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNLCAwKTsKKwkJCWlmIChldm9pY2UgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXB2b2ljZS0+ZXh0cmEgPSBldm9pY2U7CisJCQlldm9pY2UtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChldm9pY2UgIT0gTlVMTCkgeworCQkJc25kX2FsaV9mcmVlX3ZvaWNlKGNvZGVjLCBldm9pY2UpOworCQkJcHZvaWNlLT5leHRyYSA9IGV2b2ljZSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWxpX3BsYXliYWNrX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfYWxpX3ZvaWNlX3QgKmV2b2ljZSA9IHB2b2ljZSA/IHB2b2ljZS0+ZXh0cmEgOiBOVUxMOworCisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCWlmIChldm9pY2UgIT0gTlVMTCkgeworCQlzbmRfYWxpX2ZyZWVfdm9pY2UoY29kZWMsIGV2b2ljZSk7CisJCXB2b2ljZS0+ZXh0cmEgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWxpX2NhcHR1cmVfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsaV9jYXB0dXJlX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF9hbGlfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWFsaV90ICpjb2RlYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfYWxpX3ZvaWNlX3QgKnB2b2ljZSA9IChzbmRfYWxpX3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9hbGlfdm9pY2VfdCAqZXZvaWNlID0gcHZvaWNlLT5leHRyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdW5zaWduZWQgaW50IExCQTsKKwl1bnNpZ25lZCBpbnQgRGVsdGE7CisJdW5zaWduZWQgaW50IEVTTzsKKwl1bnNpZ25lZCBpbnQgQ1RSTDsKKwl1bnNpZ25lZCBpbnQgR1ZTRUw7CisJdW5zaWduZWQgaW50IFBBTjsKKwl1bnNpZ25lZCBpbnQgVk9MOworCXVuc2lnbmVkIGludCBFQzsKKwkKKwlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZSAuLi5cbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOwkKKwkKKwkvKiBzZXQgRGVsdGEgKHJhdGUpIHZhbHVlICovCisJRGVsdGEgPSBzbmRfYWxpX2NvbnZlcnRfcmF0ZShydW50aW1lLT5yYXRlLCAwKTsKKworCWlmICgocHZvaWNlLT5udW1iZXIgPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8IAorCSAgICAocHZvaWNlLT5udW1iZXIgPT0gQUxJX1BDTV9JTl9DSEFOTkVMKSkKKwkJc25kX2FsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjb2RlYywgcHZvaWNlLT5udW1iZXIpOworCWVsc2UgaWYgKGNvZGVjLT5zcGRpZl9zdXBwb3J0ICYmCisJCSAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpCisJCSAmJiAocHZvaWNlLT5udW1iZXIgPT0gQUxJX1NQRElGX09VVF9DSEFOTkVMKSkgeworCQlzbmRfYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShjb2RlYywgcnVudGltZS0+cmF0ZSk7CisJCURlbHRhID0gMHgxMDAwOworCX0KKwkKKwkvKiBzZXQgTG9vcCBCYWNrIEFkZHJlc3MgKi8KKwlMQkEgPSBydW50aW1lLT5kbWFfYWRkcjsKKworCS8qIHNldCBpbnRlcnJ1cHQgY291bnQgc2l6ZSAqLworCXB2b2ljZS0+Y291bnQgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKworCS8qIHNldCB0YXJnZXQgRVNPIGZvciBjaGFubmVsICovCisJcHZvaWNlLT5lc28gPSBydW50aW1lLT5idWZmZXJfc2l6ZTsgCisKKwlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIscHZvaWNlLT5lc28scHZvaWNlLT5jb3VudCk7CisKKwkvKiBzZXQgRVNPIHRvIGNhcHR1cmUgZmlyc3QgTUlETFAgaW50ZXJydXB0ICovCisJRVNPID0gcHZvaWNlLT5lc28gLTE7CisJLyogc2V0IGN0cmwgbW9kZSAqLworCUNUUkwgPSBzbmRfYWxpX2NvbnRyb2xfbW9kZShzdWJzdHJlYW0pOworCisJR1ZTRUwgPSAxOworCVBBTiA9IDA7CisJVk9MID0gMDsKKwlFQyA9IDA7CisJc25kX2FsaV9wcmludGsoInBsYXliYWNrX3ByZXBhcmU6XG4gICAgY2g9JWQsIFJhdGU9JWQgRGVsdGE9JXhoLEdWU0VMPSV4aCxQQU49JXhoLENUUkw9JXhoXG4iLHB2b2ljZS0+bnVtYmVyLHJ1bnRpbWUtPnJhdGUsRGVsdGEsR1ZTRUwsUEFOLENUUkwpOworCXNuZF9hbGlfd3JpdGVfdm9pY2VfcmVncyggICAgY29kZWMsCisJCQkJICAgICBwdm9pY2UtPm51bWJlciwKKwkJCQkgICAgIExCQSwKKwkJCQkgICAgIDAsCS8qIGNzbyAqLworCQkJCSAgICAgRVNPLAorCQkJCSAgICAgRGVsdGEsCisJCQkJICAgICAwLAkvKiBhbHBoYSAqLworCQkJCSAgICAgR1ZTRUwsCisJCQkJICAgICBQQU4sCisJCQkJICAgICBWT0wsCisJCQkJICAgICBDVFJMLAorCQkJCSAgICAgRUMpOworCWlmIChldm9pY2UgIT0gTlVMTCkgeworCQlldm9pY2UtPmNvdW50ID0gcHZvaWNlLT5jb3VudDsKKwkJZXZvaWNlLT5lc28gPSBwdm9pY2UtPmNvdW50IDw8IDE7CisJCUVTTyA9IGV2b2ljZS0+ZXNvIC0gMTsKKwkJc25kX2FsaV93cml0ZV92b2ljZV9yZWdzKGNvZGVjLAorCQkJCSAgICAgZXZvaWNlLT5udW1iZXIsCisJCQkJICAgICBMQkEsCisJCQkJICAgICAwLAkvKiBjc28gKi8KKwkJCQkgICAgIEVTTywKKwkJCQkgICAgIERlbHRhLAorCQkJCSAgICAgMCwJLyogYWxwaGEgKi8KKwkJCQkgICAgIEdWU0VMLAorCQkJCSAgICAgKHVuc2lnbmVkIGludCkweDdmLAorCQkJCSAgICAgKHVuc2lnbmVkIGludCkweDNmZiwKKwkJCQkgICAgIENUUkwsCisJCQkJICAgICBFQyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc25kX2FsaV9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBMQkE7CisJdW5zaWduZWQgaW50IERlbHRhOworCXVuc2lnbmVkIGludCBFU087CisJdW5zaWduZWQgaW50IENUUkw7CisJdW5zaWduZWQgaW50IEdWU0VMOworCXVuc2lnbmVkIGludCBQQU47CisJdW5zaWduZWQgaW50IFZPTDsKKwl1bnNpZ25lZCBpbnQgRUM7CisJdTgJIGJWYWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb2RlYy0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXNuZF9hbGlfcHJpbnRrKCJjYXB0dXJlX3ByZXBhcmUuLi5cbiIpOworCisJc25kX2FsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKGNvZGVjLHB2b2ljZS0+bnVtYmVyKTsKKworCURlbHRhID0gc25kX2FsaV9jb252ZXJ0X3JhdGUocnVudGltZS0+cmF0ZSwgMSk7CisKKwkvLyBQcmVwYXJlIGNhcHR1cmUgaW50ciBjaGFubmVsCisJaWYgKHB2b2ljZS0+bnVtYmVyID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSB7CisKKwkJdW5zaWduZWQgaW50IHJhdGU7CisJCQorCQlpZiAoY29kZWMtPnJldmlzaW9uICE9IEFMSV81NDUxX1YwMikgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CQkJCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmF0ZSA9IHNuZF9hbGlfZ2V0X3NwZGlmX2luX3JhdGUoY29kZWMpOworCQlpZiAocmF0ZSA9PSAwKSB7CisJCQlzbmRfcHJpbnRrKCJhbGlfY2FwdHVyZV9wcmVhcHJlOiBzcGRpZiByYXRlIGRldGVjdCBlcnIhXG4iKTsKKwkJCXJhdGUgPSA0ODAwMDsKKwkJfQorCQliVmFsdWUgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCkpOworCQlpZiAoYlZhbHVlICYgMHgxMCkgeworCQkJb3V0YihiVmFsdWUsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCkpOworCQkJcHJpbnRrKCJjbGVhciBTUERJRiBwYXJpdHkgZXJyb3IgZmxhZy5cbiIpOworCQl9CisKKwkJaWYgKHJhdGUgIT0gNDgwMDApCisJCQlEZWx0YSA9ICgocmF0ZSA8PCAxMikvcnVudGltZS0+cmF0ZSkmMHgwMGZmZmY7CisJfQorCisJLy8gc2V0IHRhcmdldCBFU08gZm9yIGNoYW5uZWwgCisJcHZvaWNlLT5lc28gPSBydW50aW1lLT5idWZmZXJfc2l6ZTsgCisKKwkvLyBzZXQgaW50ZXJydXB0IGNvdW50IHNpemUgCisJcHZvaWNlLT5jb3VudCA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCisJLy8gc2V0IExvb3AgQmFjayBBZGRyZXNzIAorCUxCQSA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCisJLy8gc2V0IEVTTyB0byBjYXB0dXJlIGZpcnN0IE1JRExQIGludGVycnVwdCAKKwlFU08gPSBwdm9pY2UtPmVzbyAtIDE7CisJQ1RSTCA9IHNuZF9hbGlfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CisJR1ZTRUwgPSAwOworCVBBTiA9IDB4MDA7CisJVk9MID0gMHgwMDsKKwlFQyA9IDA7CisKKwlzbmRfYWxpX3dyaXRlX3ZvaWNlX3JlZ3MoICAgIGNvZGVjLAorCQkJCSAgICAgcHZvaWNlLT5udW1iZXIsCisJCQkJICAgICBMQkEsCisJCQkJICAgICAwLAkvKiBjc28gKi8KKwkJCQkgICAgIEVTTywKKwkJCQkgICAgIERlbHRhLAorCQkJCSAgICAgMCwJLyogYWxwaGEgKi8KKwkJCQkgICAgIEdWU0VMLAorCQkJCSAgICAgUEFOLAorCQkJCSAgICAgVk9MLAorCQkJCSAgICAgQ1RSTCwKKwkJCQkgICAgIEVDKTsKKworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2FsaV9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3NvOworCisJc3Bpbl9sb2NrKCZjb2RlYy0+cmVnX2xvY2spOworCWlmICghcHZvaWNlLT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJb3V0Yihwdm9pY2UtPm51bWJlciwgQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOworCWNzbyA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKKwlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwlzbmRfYWxpX3ByaW50aygicGxheWJhY2sgcG9pbnRlciByZXR1cm5lZCBjc289JXhoLlxuIiwgY3NvKTsKKworCXJldHVybiBjc287Cit9CisKKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hbGlfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3NvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKCFwdm9pY2UtPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwlvdXRiKHB2b2ljZS0+bnVtYmVyLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7CisJY3NvID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9DU09fQUxQSEFfRk1TICsgMikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNzbzsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfYWxpX3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JCShTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSBTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUpLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgyNTYqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgyNTYqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworLyoKKyAqICBDYXB0dXJlIHN1cHBvcnQgZGV2aWNlIGRlc2NyaXB0aW9uCisgKi8KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfYWxpX2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJKFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSksCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgdm9pZCBzbmRfYWxpX3BjbV9mcmVlX3N1YnN0cmVhbShzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNuZF9hbGlfdm9pY2VfdCAqcHZvaWNlID0gKHNuZF9hbGlfdm9pY2VfdCAqKSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJYWxpX3QgKmNvZGVjOworCisJaWYgKHB2b2ljZSkgeworCQljb2RlYyA9IHB2b2ljZS0+Y29kZWM7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjb2RlYy0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc25kX2FsaV9mcmVlX3ZvaWNlKHB2b2ljZS0+Y29kZWMsIHB2b2ljZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludCBzbmRfYWxpX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2U7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJcHZvaWNlID0gc25kX2FsaV9hbGxvY192b2ljZShjb2RlYywgU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNLCAwKTsKKwlpZiAocHZvaWNlID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlwdm9pY2UtPmNvZGVjID0gY29kZWM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlwdm9pY2UtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwdm9pY2U7CisJcnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX2FsaV9wY21fZnJlZV9zdWJzdHJlYW07CisKKwlydW50aW1lLT5odyA9IHNuZF9hbGlfcGxheWJhY2s7CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCAwLCA2NCoxMDI0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNuZF9hbGlfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJYWxpX3QgKmNvZGVjID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF9hbGlfdm9pY2VfdCAqcHZvaWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJcHZvaWNlID0gc25kX2FsaV9hbGxvY192b2ljZShjb2RlYywgU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNLCAxKTsKKwlpZiAocHZvaWNlID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlwdm9pY2UtPmNvZGVjID0gY29kZWM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlwdm9pY2UtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwdm9pY2U7CisJcnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX2FsaV9wY21fZnJlZV9zdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfYWxpX2NhcHR1cmU7CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCAwLCA2NCoxMDI0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNuZF9hbGlfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWxpX2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2FsaV92b2ljZV90ICpwdm9pY2UgPSAoc25kX2FsaV92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXNuZF9hbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMscHZvaWNlLT5udW1iZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9hbGlfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9hbGlfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYWxpX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9hbGlfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hbGlfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2FsaV9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2FsaV9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2FsaV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2FsaV9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2FsaV9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfYWxpX2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYWxpX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX2FsaV9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2FsaV9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hbGlfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2FsaV9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYWxpX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfYWxpX2NhcHR1cmVfcG9pbnRlciwKK307CisKKworc3RhdGljIHZvaWQgc25kX2FsaV9wY21fZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwlhbGlfdCAqY29kZWMgPSBwY20tPnByaXZhdGVfZGF0YTsKKwljb2RlYy0+cGNtID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2FsaV9wY20oYWxpX3QgKiBjb2RlYywgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKSAqcnBjbSA9IE5VTEw7CisJZXJyID0gc25kX3BjbV9uZXcoY29kZWMtPmNhcmQsICJBTEkgNTQ1MSIsIGRldmljZSwgQUxJX0NIQU5ORUxTLCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRrKCJzbmRfYWxpX3BjbTogZXJyIGNhbGxlZCBzbmRfcGNtX25ldy5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY20tPnByaXZhdGVfZGF0YSA9IGNvZGVjOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2FsaV9wY21fZnJlZTsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfYWxpX3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2FsaV9jYXB0dXJlX29wcyk7CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNvZGVjLT5wY2kpLCA2NCoxMDI0LCAxMjgqMTAyNCk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+ZGV2X3N1YmNsYXNzID0gU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYOworCXN0cmNweShwY20tPm5hbWUsICJBTEkgNTQ1MSIpOworCWNvZGVjLT5wY20gPSBwY207CisJaWYgKHJwY20pICpycGNtID0gcGNtOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFMSTU0NTFfU1BESUYoeG5hbWUsIHhpbmRleCwgdmFsdWUpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCxcCisuaW5mbyA9IHNuZF9hbGk1NDUxX3NwZGlmX2luZm8sIC5nZXQgPSBzbmRfYWxpNTQ1MV9zcGRpZl9nZXQsIFwKKy5wdXQgPSBzbmRfYWxpNTQ1MV9zcGRpZl9wdXQsIC5wcml2YXRlX3ZhbHVlID0gdmFsdWV9CisKK3N0YXRpYyBpbnQgc25kX2FsaTU0NTFfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworICAgICAgICB1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKyAgICAgICAgdWluZm8tPmNvdW50ID0gMTsKKyAgICAgICAgdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKyAgICAgICAgdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsaTU0NTFfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhbGlfdCAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBlbmFibGU7CisKKwllbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDEgOiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOworCXN3aXRjaChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCWNhc2UgMDoKKwkJZW5hYmxlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMikgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQllbmFibGUgPSAoKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMikgJiYgKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwNCkpID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZW5hYmxlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMSkgPyAxIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZW5hYmxlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvZGVjLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbGk1NDUxX3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYWxpX3QgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY2hhbmdlID0gMCwgZW5hYmxlID0gMDsKKworCWVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJc3dpdGNoIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCWNhc2UgMDoKKwkJY2hhbmdlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMikgPyAxIDogMDsKKwkJY2hhbmdlID0gY2hhbmdlIF4gZW5hYmxlOworCQlpZiAoY2hhbmdlKSB7CisJCQlpZiAoZW5hYmxlKSB7CisJCQkJY29kZWMtPnNwZGlmX21hc2sgfD0gMHgwMjsKKwkJCQlzbmRfYWxpX2VuYWJsZV9zcGRpZl9vdXQoY29kZWMpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlYy0+c3BkaWZfbWFzayAmPSB+KDB4MDIpOworCQkJCWNvZGVjLT5zcGRpZl9tYXNrICY9IH4oMHgwNCk7CisJCQkJc25kX2FsaV9kaXNhYmxlX3NwZGlmX291dChjb2RlYyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOiAKKwkJY2hhbmdlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwNCkgPyAxIDogMDsKKwkJY2hhbmdlID0gY2hhbmdlIF4gZW5hYmxlOworCQlpZiAoY2hhbmdlICYmIChjb2RlYy0+c3BkaWZfbWFzayAmIDB4MDIpKSB7CisJCQlpZiAoZW5hYmxlKSB7CisJCQkJY29kZWMtPnNwZGlmX21hc2sgfD0gMHgwNDsKKwkJCQlzbmRfYWxpX2VuYWJsZV9zcGRpZl9jaG5vdXQoY29kZWMpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlYy0+c3BkaWZfbWFzayAmPSB+KDB4MDQpOworCQkJCXNuZF9hbGlfZGlzYWJsZV9zcGRpZl9jaG5vdXQoY29kZWMpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY2hhbmdlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMSkgPyAxIDogMDsKKwkJY2hhbmdlID0gY2hhbmdlIF4gZW5hYmxlOworCQlpZiAoY2hhbmdlKSB7CisJCQlpZiAoZW5hYmxlKSB7CisJCQkJY29kZWMtPnNwZGlmX21hc2sgfD0gMHgwMTsKKwkJCQlzbmRfYWxpX2VuYWJsZV9zcGRpZl9pbihjb2RlYyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVjLT5zcGRpZl9tYXNrICY9IH4oMHgwMSk7CisJCQkJc25kX2FsaV9kaXNhYmxlX3NwZGlmX2luKGNvZGVjKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29kZWMtPnJlZ19sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWxpNTQ1MV9taXhlcl9zcGRpZltdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogc3BkaWYgYXBsYXliYWNrIHN3aXRjaCAqLworCS8qIEZJWE1FOiAiSUVDOTU4IFBsYXliYWNrIFN3aXRjaCIgbWF5IGNvbmZsaWN0IHdpdGggb25lIG9uIGFjOTdfY29kZWMgKi8KKwlBTEk1NDUxX1NQRElGKCJJRUM5NTggT3V0cHV0IHN3aXRjaCIsIDAsIDApLAorCS8qIHNwZGlmIG91dCB0byBzcGRpZiBjaGFubmVsICovCisJQUxJNTQ1MV9TUERJRigiSUVDOTU4IENoYW5uZWwgT3V0cHV0IFN3aXRjaCIsIDAsIDEpLAorCS8qIHNwZGlmIGluIGZyb20gc3BkaWYgY2hhbm5lbCAqLworCUFMSTU0NTFfU1BESUYoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsU1dJVENIKSwgMCwgMikKK307CisKK3N0YXRpYyB2b2lkIHNuZF9hbGlfbWl4ZXJfZnJlZV9hYzk3X2J1cyhhYzk3X2J1c190ICpidXMpCit7CisJYWxpX3QgKmNvZGVjID0gYnVzLT5wcml2YXRlX2RhdGE7CisJY29kZWMtPmFjOTdfYnVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc25kX2FsaV9taXhlcl9mcmVlX2FjOTcoYWM5N190ICphYzk3KQoreworCWFsaV90ICpjb2RlYyA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwljb2RlYy0+YWM5NyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hbGlfbWl4ZXIoYWxpX3QgKiBjb2RlYykKK3sKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX2FsaV9jb2RlY193cml0ZSwKKwkJLnJlYWQgPSBzbmRfYWxpX2NvZGVjX3JlYWQsCisJfTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNvZGVjLT5jYXJkLCAwLCAmb3BzLCBjb2RlYywgJmNvZGVjLT5hYzk3X2J1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljb2RlYy0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9hbGlfbWl4ZXJfZnJlZV9hYzk3X2J1czsKKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnByaXZhdGVfZGF0YSA9IGNvZGVjOworCWFjOTcucHJpdmF0ZV9mcmVlID0gc25kX2FsaV9taXhlcl9mcmVlX2FjOTc7CisJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihjb2RlYy0+YWM5N19idXMsICZhYzk3LCAmY29kZWMtPmFjOTcpKSA8IDApIHsKKwkJc25kX3ByaW50aygiYWxpIG1peGVyIGNyZWF0aW5nIGVycm9yLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChjb2RlYy0+c3BkaWZfc3VwcG9ydCkgeworCQlmb3IoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfYWxpNTQ1MV9taXhlcl9zcGRpZik7IGlkeCsrKSB7CisJCQllcnI9c25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2FsaTU0NTFfbWl4ZXJfc3BkaWZbaWR4XSwgY29kZWMpKTsKKwkJCWlmIChlcnIgPCAwKSByZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFsaV9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlhbGlfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlhbGlfaW1hZ2VfdCAqaW07CisJaW50IGksIGo7CisKKwlpbSA9IGNoaXAtPmltYWdlOworCWlmICghIGltKQorCQlyZXR1cm4gMDsKKworCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKKwlzbmRfYWM5N19zdXNwZW5kKGNoaXAtPmFjOTcpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQorCWltLT5yZWdzW0FMSV9NSVNDSU5UID4+IDJdID0gaW5sKEFMSV9SRUcoY2hpcCwgQUxJX01JU0NJTlQpKTsKKwkvLyBpbS0+cmVnc1tBTElfU1RBUlQgPj4gMl0gPSBpbmwoQUxJX1JFRyhjaGlwLCBBTElfU1RBUlQpKTsKKwlpbS0+cmVnc1tBTElfU1RPUCA+PiAyXSA9IGlubChBTElfUkVHKGNoaXAsIEFMSV9TVE9QKSk7CisJCisJLy8gZGlzYWJsZSBhbGwgSVJRIGJpdHMKKwlvdXRsKDAsIEFMSV9SRUcoY2hpcCwgQUxJX01JU0NJTlQpKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsJCisJCWlmICgoaSo0ID09IEFMSV9NSVNDSU5UKSB8fCAoaSo0ID09IEFMSV9TVE9QKSkKKwkJCWNvbnRpbnVlOworCQlpbS0+cmVnc1tpXSA9IGlubChBTElfUkVHKGNoaXAsIGkqNCkpOworCX0KKwkKKwlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKKwkJb3V0YihpLCBBTElfUkVHKGNoaXAsIEFMSV9HQ19DSVIpKTsKKwkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykgCisJCQlpbS0+Y2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKEFMSV9SRUcoY2hpcCwgaio0ICsgMHhlMCkpOworCX0KKworCS8vIHN0b3AgYWxsIEhXIGNoYW5uZWwKKwlvdXRsKDB4ZmZmZmZmZmYsIEFMSV9SRUcoY2hpcCwgQUxJX1NUT1ApKTsKKworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsaV9yZXN1bWUoc25kX2NhcmRfdCAqY2FyZCkKK3sKKwlhbGlfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlhbGlfaW1hZ2VfdCAqaW07CisJaW50IGksIGo7CisKKwlpbSA9IGNoaXAtPmltYWdlOworCWlmICghIGltKQorCQlyZXR1cm4gMDsKKworCXBjaV9lbmFibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCisJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CisJCW91dGIoaSwgQUxJX1JFRyhjaGlwLCBBTElfR0NfQ0lSKSk7CisJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspIAorCQkJb3V0bChpbS0+Y2hhbm5lbF9yZWdzW2ldW2pdLCBBTElfUkVHKGNoaXAsIGoqNCArIDB4ZTApKTsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CQorCQlpZiAoKGkqNCA9PSBBTElfTUlTQ0lOVCkgfHwgKGkqNCA9PSBBTElfU1RPUCkgfHwgKGkqNCA9PSBBTElfU1RBUlQpKQorCQkJY29udGludWU7CisJCW91dGwoaW0tPnJlZ3NbaV0sIEFMSV9SRUcoY2hpcCwgaSo0KSk7CisJfQorCQorCS8vIHN0YXJ0IEhXIGNoYW5uZWwKKwlvdXRsKGltLT5yZWdzW0FMSV9TVEFSVCA+PiAyXSwgQUxJX1JFRyhjaGlwLCBBTElfU1RBUlQpKTsKKwkvLyByZXN0b3JlIElSUSBlbmFibGUgYml0cworCW91dGwoaW0tPnJlZ3NbQUxJX01JU0NJTlQgPj4gMl0sIEFMSV9SRUcoY2hpcCwgQUxJX01JU0NJTlQpKTsKKwkKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3KTsKKwkKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBzbmRfYWxpX2ZyZWUoYWxpX3QgKiBjb2RlYykKK3sKKwlpZiAoY29kZWMtPmh3X2luaXRpYWxpemVkKQorCQlzbmRfYWxpX2Rpc2FibGVfYWRkcmVzc19pbnRlcnJ1cHQoY29kZWMpOworCWlmIChjb2RlYy0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNvZGVjLT5pcnEpOworCQlmcmVlX2lycShjb2RlYy0+aXJxLCAodm9pZCAqKWNvZGVjKTsKKwl9CisJaWYgKGNvZGVjLT5wb3J0KQorCQlwY2lfcmVsZWFzZV9yZWdpb25zKGNvZGVjLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjb2RlYy0+cGNpKTsKKyNpZmRlZiBDT05GSUdfUE0KKwlrZnJlZShjb2RlYy0+aW1hZ2UpOworI2VuZGlmCisJa2ZyZWUoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbGlfY2hpcF9pbml0KGFsaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgbGVnYWN5OworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwlzbmRfYWxpX3ByaW50aygiY2hpcCBpbml0aWFsaXppbmcgLi4uIFxuIik7CisKKwlpZiAoc25kX2FsaV9yZXNldF81NDUxKGNvZGVjKSkgeworCQlzbmRfcHJpbnRrKCJhbGlfY2hpcF9pbml0OiByZXNldCA1NDUxIGVycm9yLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgeworICAgICAgICAJcGNpX2RldiA9IGNvZGVjLT5wY2lfbTE1MzM7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKKwkJdGVtcCB8PSAweDgwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgdGVtcCk7CisJCisJCXBjaV9kZXYgPSBjb2RlYy0+cGNpX203MTAxOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweGI4LCAmdGVtcCk7CisJCXRlbXAgfD0gMHgyMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4QjgsIHRlbXApOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjb2RlYy0+cGNpLCAweDQ0LCAmbGVnYWN5KTsKKwlsZWdhY3kgJj0gMHhmZjAwZmYwMDsKKwlsZWdhY3kgfD0gMHgwMDA4MDBhYTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNvZGVjLT5wY2ksIDB4NDQsIGxlZ2FjeSk7CisKKwlvdXRsKDB4ODAwMDAwMDEsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCW91dGwoMHgwMDAwMDAwMCwgQUxJX1JFRyhjb2RlYywgQUxJX0FJTlRFTikpOworCW91dGwoMHhmZmZmZmZmZiwgQUxJX1JFRyhjb2RlYywgQUxJX0FJTlQpKTsKKwlvdXRsKDB4MDAwMDAwMDAsIEFMSV9SRUcoY29kZWMsIEFMSV9WT0xVTUUpKTsKKwlvdXRiKDB4MTAsIAkgQUxJX1JFRyhjb2RlYywgQUxJX01QVVIyKSk7CisKKwljb2RlYy0+YWM5N19leHRfaWQgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIDAsIEFDOTdfRVhURU5ERURfSUQpOworCWNvZGVjLT5hYzk3X2V4dF9zdGF0dXMgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIDAsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwlpZiAoY29kZWMtPnNwZGlmX3N1cHBvcnQpIHsKKwkJc25kX2FsaV9lbmFibGVfc3BkaWZfb3V0KGNvZGVjKTsKKwkJY29kZWMtPnNwZGlmX21hc2sgPSAweDAwMDAwMDAyOworCX0KKworCXNuZF9hbGlfcHJpbnRrKCJjaGlwIGluaXRpYWxpemUgc3VjY2VlZC5cbiIpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hbGlfcmVzb3VyY2VzKGFsaV90ICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJc25kX2FsaV9wcmludGsoInJlc291Y2VzIGFsbG9jYXRpb24gLi4uXG4iKTsKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoY29kZWMtPnBjaSwgIkFMSSA1NDUxIikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljb2RlYy0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChjb2RlYy0+cGNpLCAwKTsKKworCWlmIChyZXF1ZXN0X2lycShjb2RlYy0+cGNpLT5pcnEsIHNuZF9hbGlfY2FyZF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgIkFMSSA1NDUxIiwgKHZvaWQgKiljb2RlYykpIHsKKwkJc25kX3ByaW50aygiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNvZGVjLT5pcnEgPSBjb2RlYy0+cGNpLT5pcnE7CisJc25kX2FsaV9wcmludGsoInJlc291Y2VzIGFsbG9jYXRlZC5cbiIpOworCXJldHVybiAwOworfQorc3RhdGljIGludCBzbmRfYWxpX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKSAKK3sKKwlhbGlfdCAqY29kZWM9ZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzbmRfYWxpX2ZyZWUoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxpX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgaW50IHBjbV9zdHJlYW1zLAorCQkJCSAgICBpbnQgc3BkaWZfc3VwcG9ydCwKKwkJCQkgICAgYWxpX3QgKiogcl9hbGkpCit7CisJYWxpX3QgKmNvZGVjOworCWludCBpLCBlcnI7CisJdW5zaWduZWQgc2hvcnQgY21kdyA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworICAgICAgICBzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCShzbmRfZGV2X2ZyZWVfdCAqKXNuZF9hbGlfZGV2X2ZyZWUsCisJCU5VTEwsCisJCU5VTEwKKyAgICAgICAgfTsKKworCSpyX2FsaSA9IE5VTEw7CisKKwlzbmRfYWxpX3ByaW50aygiY3JlYXRpbmcgLi4uXG4iKTsKKworCS8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMSBiaXRzICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCAweDdmZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgMHg3ZmZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKChjb2RlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjb2RlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnZvaWNlX2FsbG9jKTsKKworCWNvZGVjLT5jYXJkID0gY2FyZDsKKwljb2RlYy0+cGNpID0gcGNpOworCWNvZGVjLT5pcnEgPSAtMTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJmNvZGVjLT5yZXZpc2lvbik7CisJY29kZWMtPnNwZGlmX3N1cHBvcnQgPSBzcGRpZl9zdXBwb3J0OworCisJaWYgKHBjbV9zdHJlYW1zIDwgMSkKKwkJcGNtX3N0cmVhbXMgPSAxOworCWlmIChwY21fc3RyZWFtcyA+IDMyKQorCQlwY21fc3RyZWFtcyA9IDMyOworCQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfQ09NTUFORCwgJmNtZHcpOworCWlmICgoY21kdyAmIFBDSV9DT01NQU5EX0lPKSAhPSBQQ0lfQ09NTUFORF9JTykgeworCQljbWR3IHw9IFBDSV9DT01NQU5EX0lPOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lfQ09NTUFORCwgY21kdyk7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJCisJaWYgKHNuZF9hbGlfcmVzb3VyY2VzKGNvZGVjKSkgeworCQlzbmRfYWxpX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXN5bmNocm9uaXplX2lycShwY2ktPmlycSk7CisKKwljb2RlYy0+c3ludGguY2htYXAgPSAwOworCWNvZGVjLT5zeW50aC5jaGNudCA9IDA7CisJY29kZWMtPnNwZGlmX21hc2sgPSAwOworCWNvZGVjLT5zeW50aC5zeW50aGNvdW50ID0gMDsKKworCWlmIChjb2RlYy0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQorCQljb2RlYy0+Y2hyZWdzLnJlZ3MuYWM5N3JlYWQgPSBBTElfQUM5N19XUklURTsKKwllbHNlCisJCWNvZGVjLT5jaHJlZ3MucmVncy5hYzk3cmVhZCA9IEFMSV9BQzk3X1JFQUQ7CisJY29kZWMtPmNocmVncy5yZWdzLmFjOTd3cml0ZSA9IEFMSV9BQzk3X1dSSVRFOworCisJY29kZWMtPmNocmVncy5yZWdzLnN0YXJ0ICA9IEFMSV9TVEFSVDsKKwljb2RlYy0+Y2hyZWdzLnJlZ3Muc3RvcCAgID0gQUxJX1NUT1A7CisJY29kZWMtPmNocmVncy5yZWdzLmFpbnQgICA9IEFMSV9BSU5UOworCWNvZGVjLT5jaHJlZ3MucmVncy5haW50ZW4gPSBBTElfQUlOVEVOOworCisJY29kZWMtPmNocmVncy5kYXRhLnN0YXJ0ICA9IDB4MDA7CisJY29kZWMtPmNocmVncy5kYXRhLnN0b3AgICA9IDB4MDA7CisJY29kZWMtPmNocmVncy5kYXRhLmFpbnQgICA9IDB4MDA7CisJY29kZWMtPmNocmVncy5kYXRhLmFpbnRlbiA9IDB4MDA7CisKKwkvKiBNMTUzMzogc291dGhicmlkZ2UgKi8KKyAgICAgICAJcGNpX2RldiA9IHBjaV9maW5kX2RldmljZSgweDEwYjksIDB4MTUzMywgTlVMTCk7CisJY29kZWMtPnBjaV9tMTUzMyA9IHBjaV9kZXY7CisJaWYgKCEgY29kZWMtPnBjaV9tMTUzMykgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBjYW5ub3QgZmluZCBBTGkgMTUzMyBjaGlwLlxuIik7CisJCXNuZF9hbGlfZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBNNzEwMTogcG93ZXIgbWFuYWdlbWVudCAqLworICAgICAgIAlwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKDB4MTBiOSwgMHg3MTAxLCBOVUxMKTsKKwljb2RlYy0+cGNpX203MTAxID0gcGNpX2RldjsKKwlpZiAoISBjb2RlYy0+cGNpX203MTAxICYmIGNvZGVjLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpNTQ1MTogY2Fubm90IGZpbmQgQUxpIDcxMDEgY2hpcC5cbiIpOworCQlzbmRfYWxpX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzbmRfYWxpX3ByaW50aygic25kX2RldmljZV9uZXcgaXMgY2FsbGVkLlxuIik7CisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNvZGVjLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9hbGlfZnJlZShjb2RlYyk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogaW5pdGlhbGlzZSBzeW50aCB2b2ljZXMqLworCWZvciAoaSA9IDA7IGkgPCBBTElfQ0hBTk5FTFM7IGkrKyApIHsKKwkJY29kZWMtPnN5bnRoLnZvaWNlc1tpXS5udW1iZXIgPSBpOworCX0KKworCWlmICgoZXJyID0gc25kX2FsaV9jaGlwX2luaXQoY29kZWMpKSA8IDApIHsKKwkJc25kX3ByaW50aygiYWxpIGNyZWF0ZTogY2hpcCBpbml0IGVycm9yLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisjaWZkZWYgQ09ORklHX1BNCisJY29kZWMtPmltYWdlID0ga21hbGxvYyhzaXplb2YoKmNvZGVjLT5pbWFnZSksIEdGUF9LRVJORUwpOworCWlmICghIGNvZGVjLT5pbWFnZSkKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGFsbG9jYXRlIGFwbSBidWZmZXJcbiIpOworCWVsc2UKKwkJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIGFsaV9zdXNwZW5kLCBhbGlfcmVzdW1lLCBjb2RlYyk7CisjZW5kaWYKKworCXNuZF9hbGlfZW5hYmxlX2FkZHJlc3NfaW50ZXJydXB0KGNvZGVjKTsKKwljb2RlYy0+aHdfaW5pdGlhbGl6ZWQgPSAxOworCisJKnJfYWxpID0gY29kZWM7CisJc25kX2FsaV9wcmludGsoImNyZWF0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2FsaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlhbGlfdCAqY29kZWM7CisJaW50IGVycjsKKworCXNuZF9hbGlfcHJpbnRrKCJwcm9iZSAuLi5cbiIpOworCisgICAgICAgIGlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGVyciA9IHNuZF9hbGlfY3JlYXRlKGNhcmQsIHBjaSwgcGNtX2NoYW5uZWxzW2Rldl0sIHNwZGlmW2Rldl0sICZjb2RlYykpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9hbGlfcHJpbnRrKCJtaXhlciBidWlsZGluZyAuLi5cbiIpOworCWlmICgoZXJyID0gc25kX2FsaV9taXhlcihjb2RlYykpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlzbmRfYWxpX3ByaW50aygicGNtIGJ1aWxkaW5nIC4uLlxuIik7CisJaWYgKChlcnIgPSBzbmRfYWxpX3BjbShjb2RlYywgMCwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJBTEk1NDUxIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkFMSSA1NDUxIik7CisJCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWxpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBjb2RlYy0+cG9ydCwgY29kZWMtPmlycSk7CisKKwlzbmRfYWxpX3ByaW50aygicmVnaXN0ZXIgY2FyZC5cbiIpOworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9hbGlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiQUxJIDU0NTEiLAorCS5pZF90YWJsZSA9IHNuZF9hbGlfaWRzLAorCS5wcm9iZSA9IHNuZF9hbGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hbGlfcmVtb3ZlKSwKKwlTTkRfUENJX1BNX0NBTExCQUNLUworfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfYWxpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2FsaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfYWxpX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfYWxpX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWE1ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2FsczQwMDAuYwpAQCAtMCwwICsxLDc4OSBAQAorLyoKKyAqICBjYXJkLWFsczQwMDAuYyAtIGRyaXZlciBmb3IgQXZhbmNlIExvZ2ljIEFMUzQwMDAgYmFzZWQgc291bmRjYXJkcy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgQmFydCBIYXJ0Z2VycyA8YmFydEBldHBtb2QucGh5cy50dWUubmw+LAorICoJCQkgIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgQW5kcmVhcyBNb2hyIDxodzdvc2h5dXYzMDAxQHNuZWFrZW1haWwuY29tPgorICoKKyAqICBGcmFtZXdvcmsgYm9ycm93ZWQgZnJvbSBNYXNzaW1vIFBpY2Npb25pJ3MgY2FyZC1hbHMxMDAuYy4KKyAqCisgKiBOT1RFUworICoKKyAqICBTaW5jZSBBdmFuY2UgZG9lcyBub3QgcHJvdmlkZSBhbnkgbWVhbmluZ2Z1bCBkb2N1bWVudGF0aW9uLCBhbmQgSQorICogIGJvdWdodCBhbiBBTFM0MDAwIGJhc2VkIHNvdW5kY2FyZCwgSSB3YXMgZm9yY2VkIHRvIGJhc2UgdGhpcyBkcml2ZXIKKyAqICBvbiByZXZlcnNlIGVuZ2luZWVyaW5nLgorICoKKyAqICBOb3RlOiB0aGlzIGlzIG5vIGxvbmdlciB0cnVlLiBQcmV0dHkgdmVyYm9zZSBjaGlwIGRvY3UgKEFMUzQwMDBhLlBERikKKyAqICBjYW4gYmUgZm91bmQgb24gdGhlIEFMU0Egd2ViIHNpdGUuCisgKgorICogIFRoZSBBTFM0MDAwIHNlZW1zIHRvIGJlIHRoZSBQQ0ktY291c2luIG9mIHRoZSBBTFMxMDAuIEl0IGNvbnRhaW5zIGFuCisgKiAgQUxTMTAwLWxpa2UgU0IgRFNQL21peGVyLCBhbiBPUEwzIHN5bnRoLCBhIE1QVTQwMSBhbmQgYSBnYW1lcG9ydCAKKyAqICBpbnRlcmZhY2UuIFRoZXNlIHN1YnN5c3RlbXMgY2FuIGJlIG1hcHBlZCBpbnRvIElTQSBpby1wb3J0IHNwYWNlLCAKKyAqICB1c2luZyB0aGUgUENJLWludGVyZmFjZS4gSW4gYWRkaXRpb24sIHRoZSBQQ0ktYml0IHByb3ZpZGVzIERNQSBhbmQgSVJRIAorICogIHNlcnZpY2VzIHRvIHRoZSBzdWJzeXN0ZW1zLgorICogCisgKiBXaGlsZSBBTFM0MDAwIGlzIHZlcnkgc2ltaWxhciB0byBhIFNvdW5kQmxhc3RlciwgdGhlIGRpZmZlcmVuY2VzIGluCisgKiBETUEgYW5kIGNhcHR1cmluZyByZXF1aXJlIG1vcmUgY2hhbmdlcyB0byB0aGUgU291bmRCbGFzdGVyIHRoYW4KKyAqIGRlc2lyYWJsZSwgc28gSSBtYWRlIHRoaXMgc2VwYXJhdGUgZHJpdmVyLgorICogCisgKiBUaGUgQUxTNDAwMCBjYW4gZG8gcmVhbCBmdWxsIGR1cGxleCBwbGF5YmFjay9jYXB0dXJlLgorICoKKyAqIEZNREFDOgorICogLSAweDRmIC0+IHBvcnQgMHgxNAorICogLSBwb3J0IDB4MTUgfD0gMQorICoKKyAqIEVuYWJsZS9kaXNhYmxlIDNEIHNvdW5kOgorICogLSAweDUwIC0+IHBvcnQgMHgxNAorICogLSBjaGFuZ2UgYml0IDYgKDB4NDApIG9mIHBvcnQgMHgxNQorICoKKyAqIFNldCBRU291bmQ6CisgKiAtIDB4ZGIgLT4gcG9ydCAweDE0CisgKiAtIHNldCBwb3J0IDB4MTU6CisgKiAgIDB4M2UgKG1vZGUgMyksIDB4M2MgKG1vZGUgMiksIDB4M2EgKG1vZGUgMSksIDB4MzggKG1vZGUgMCkKKyAqCisgKiBTZXQgS1NvdW5kOgorICogLSB2YWx1ZSAtPiBzb21lIHBvcnQgMHgwYzBkCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvb3BsMy5oPgorI2luY2x1ZGUgPHNvdW5kL3NiLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXZhbmNlIExvZ2ljIEFMUzQwMDAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0F2YW5jZSBMb2dpYyxBTFM0MDAwfX0iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK3N0YXRpYyBpbnQgam95c3RpY2tfcG9ydFtTTkRSVl9DQVJEU107CisjZW5kaWYKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBTFM0MDAwIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgQUxTNDAwMCBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEFMUzQwMDAgc291bmRjYXJkLiIpOworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK21vZHVsZV9wYXJhbV9hcnJheShqb3lzdGlja19wb3J0LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhqb3lzdGlja19wb3J0LCAiSm95c3RpY2sgcG9ydCBhZGRyZXNzIGZvciBBTFM0MDAwIHNvdW5kY2FyZC4gKDAgPSBkaXNhYmxlZCkiKTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwl1bnNpZ25lZCBsb25nIGdjcjsKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKyNlbmRpZgorfSBzbmRfY2FyZF9hbHM0MDAwX3Q7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYWxzNDAwMF9pZHNbXSA9IHsKKwl7IDB4NDAwNSwgMHg0MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LCAgIC8qIEFMUzQwMDAgKi8KKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfYWxzNDAwMF9pZHMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsczQwMDBfZ2NyX3dyaXRlX2FkZHIodW5zaWduZWQgbG9uZyBwb3J0LCB1MzIgcmVnLCB1MzIgdmFsKQoreworCW91dGIocmVnLCBwb3J0KzB4MGMpOworCW91dGwodmFsLCBwb3J0KzB4MDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsczQwMDBfZ2NyX3dyaXRlKHNiX3QgKnNiLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXNuZF9hbHM0MDAwX2djcl93cml0ZV9hZGRyKHNiLT5hbHRfcG9ydCwgcmVnLCB2YWwpOworfQkKKworc3RhdGljIGlubGluZSB1MzIgc25kX2FsczQwMDBfZ2NyX3JlYWRfYWRkcih1bnNpZ25lZCBsb25nIHBvcnQsIHUzMiByZWcpCit7CisJb3V0YihyZWcsIHBvcnQrMHgwYyk7CisJcmV0dXJuIGlubChwb3J0KzB4MDgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzbmRfYWxzNDAwMF9nY3JfcmVhZChzYl90ICpzYiwgdTMyIHJlZykKK3sKKwlyZXR1cm4gc25kX2FsczQwMDBfZ2NyX3JlYWRfYWRkcihzYi0+YWx0X3BvcnQsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hbHM0MDAwX3NldF9yYXRlKHNiX3QgKmNoaXAsIHVuc2lnbmVkIGludCByYXRlKQoreworCWlmICghKGNoaXAtPm1vZGUgJiBTQl9SQVRFX0xPQ0spKSB7CisJCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIFNCX0RTUF9TQU1QTEVfUkFURV9PVVQpOworCQlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCByYXRlPj44KTsKKwkJc25kX3NiZHNwX2NvbW1hbmQoY2hpcCwgcmF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfYWxzNDAwMF9zZXRfY2FwdHVyZV9kbWEoc2JfdCAqY2hpcCwgZG1hX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBzaXplKQoreworCXNuZF9hbHM0MDAwX2djcl93cml0ZShjaGlwLCAweGEyLCBhZGRyKTsKKwlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHhhMywgKHNpemUtMSkpOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxzNDAwMF9zZXRfcGxheWJhY2tfZG1hKHNiX3QgKmNoaXAsIGRtYV9hZGRyX3QgYWRkciwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHg5MSwgYWRkcik7CisJc25kX2FsczQwMDBfZ2NyX3dyaXRlKGNoaXAsIDB4OTIsIChzaXplLTEpfDB4MTgwMDAwKTsKK30KKworI2RlZmluZSBBTFM0MDAwX0ZPUk1BVF9TSUdORUQJKDE8PDApCisjZGVmaW5lIEFMUzQwMDBfRk9STUFUXzE2QklUCSgxPDwxKQorI2RlZmluZSBBTFM0MDAwX0ZPUk1BVF9TVEVSRU8JKDE8PDIpCisKK3N0YXRpYyBpbnQgc25kX2FsczQwMDBfZ2V0X2Zvcm1hdChzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gMDsKKwlpZiAoc25kX3BjbV9mb3JtYXRfc2lnbmVkKHJ1bnRpbWUtPmZvcm1hdCkpCisJCXJlc3VsdCB8PSBBTFM0MDAwX0ZPUk1BVF9TSUdORUQ7CisJaWYgKHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYpCisJCXJlc3VsdCB8PSBBTFM0MDAwX0ZPUk1BVF8xNkJJVDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKQorCQlyZXN1bHQgfD0gQUxTNDAwMF9GT1JNQVRfU1RFUkVPOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHN0cnVjdHVyZSBmb3Igc2V0dGluZyB1cCBwbGF5YmFjayAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBkc3BfY21kLCBkbWFfb24sIGRtYV9vZmYsIGZvcm1hdDsKK30gcGxheWJhY2tfY21kX3ZhbHNbXT17CisvKiBBTFM0MDAwX0ZPUk1BVF9VOF9NT05PICovCit7IFNCX0RTUDRfT1VUOF9BSSwgU0JfRFNQX0RNQThfT04sIFNCX0RTUF9ETUE4X09GRiwgU0JfRFNQNF9NT0RFX1VOU19NT05PIH0sCisvKiBBTFM0MDAwX0ZPUk1BVF9TOF9NT05PICovCQoreyBTQl9EU1A0X09VVDhfQUksIFNCX0RTUF9ETUE4X09OLCBTQl9EU1BfRE1BOF9PRkYsIFNCX0RTUDRfTU9ERV9TSUdOX01PTk8gfSwKKy8qIEFMUzQwMDBfRk9STUFUX1UxNkxfTU9OTyAqLworeyBTQl9EU1A0X09VVDE2X0FJLCBTQl9EU1BfRE1BMTZfT04sIFNCX0RTUF9ETUExNl9PRkYsIFNCX0RTUDRfTU9ERV9VTlNfTU9OTyB9LAorLyogQUxTNDAwMF9GT1JNQVRfUzE2TF9NT05PICovCit7IFNCX0RTUDRfT1VUMTZfQUksIFNCX0RTUF9ETUExNl9PTiwgU0JfRFNQX0RNQTE2X09GRiwgU0JfRFNQNF9NT0RFX1NJR05fTU9OTyB9LAorLyogQUxTNDAwMF9GT1JNQVRfVThfU1RFUkVPICovCit7IFNCX0RTUDRfT1VUOF9BSSwgU0JfRFNQX0RNQThfT04sIFNCX0RTUF9ETUE4X09GRiwgU0JfRFNQNF9NT0RFX1VOU19TVEVSRU8gfSwKKy8qIEFMUzQwMDBfRk9STUFUX1M4X1NURVJFTyAqLwkKK3sgU0JfRFNQNF9PVVQ4X0FJLCBTQl9EU1BfRE1BOF9PTiwgU0JfRFNQX0RNQThfT0ZGLCBTQl9EU1A0X01PREVfU0lHTl9TVEVSRU8gfSwKKy8qIEFMUzQwMDBfRk9STUFUX1UxNkxfU1RFUkVPICovCit7IFNCX0RTUDRfT1VUMTZfQUksIFNCX0RTUF9ETUExNl9PTiwgU0JfRFNQX0RNQTE2X09GRiwgU0JfRFNQNF9NT0RFX1VOU19TVEVSRU8gfSwKKy8qIEFMUzQwMDBfRk9STUFUX1MxNkxfU1RFUkVPICovCit7IFNCX0RTUDRfT1VUMTZfQUksIFNCX0RTUF9ETUExNl9PTiwgU0JfRFNQX0RNQTE2X09GRiwgU0JfRFNQNF9NT0RFX1NJR05fU1RFUkVPIH0sCit9OworI2RlZmluZSBwbGF5YmFja19jbWQoY2hpcCkgKHBsYXliYWNrX2NtZF92YWxzWyhjaGlwKS0+cGxheWJhY2tfZm9ybWF0XSkKKworLyogc3RydWN0dXJlIGZvciBzZXR0aW5nIHVwIGNhcHR1cmUgKi8KK2VudW0geyBDTURfV0lEVEg4PTB4MDQsIENNRF9TSUdORUQ9MHgxMCwgQ01EX01PTk89MHg4MCwgQ01EX1NURVJFTz0weEEwIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBjYXB0dXJlX2NtZF92YWxzW109Cit7CitDTURfV0lEVEg4fENNRF9NT05PLAkJCS8qIEFMUzQwMDBfRk9STUFUX1U4X01PTk8gKi8KK0NNRF9XSURUSDh8Q01EX1NJR05FRHxDTURfTU9OTywJCS8qIEFMUzQwMDBfRk9STUFUX1M4X01PTk8gKi8JCitDTURfTU9OTywJCQkJLyogQUxTNDAwMF9GT1JNQVRfVTE2TF9NT05PICovCitDTURfU0lHTkVEfENNRF9NT05PLAkJCS8qIEFMUzQwMDBfRk9STUFUX1MxNkxfTU9OTyAqLworQ01EX1dJRFRIOHxDTURfU1RFUkVPLAkJCS8qIEFMUzQwMDBfRk9STUFUX1U4X1NURVJFTyAqLworQ01EX1dJRFRIOHxDTURfU0lHTkVEfENNRF9TVEVSRU8sCS8qIEFMUzQwMDBfRk9STUFUX1M4X1NURVJFTyAqLwkKK0NNRF9TVEVSRU8sCQkJCS8qIEFMUzQwMDBfRk9STUFUX1UxNkxfU1RFUkVPICovCitDTURfU0lHTkVEfENNRF9TVEVSRU8sCQkJLyogQUxTNDAwMF9GT1JNQVRfUzE2TF9TVEVSRU8gKi8KK307CQorI2RlZmluZSBjYXB0dXJlX2NtZChjaGlwKSAoY2FwdHVyZV9jbWRfdmFsc1soY2hpcCktPmNhcHR1cmVfZm9ybWF0XSkKKworc3RhdGljIGludCBzbmRfYWxzNDAwMF9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfYWxzNDAwMF9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbHM0MDAwX2NhcHR1cmVfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2JfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgY291bnQ7CisKKwljaGlwLT5jYXB0dXJlX2Zvcm1hdCA9IHNuZF9hbHM0MDAwX2dldF9mb3JtYXQocnVudGltZSk7CisJCQorCXNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwljb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCQorCWlmIChjaGlwLT5jYXB0dXJlX2Zvcm1hdCAmIEFMUzQwMDBfRk9STUFUXzE2QklUKQorCQljb3VudCA+Pj0xOworCWNvdW50LS07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfYWxzNDAwMF9zZXRfcmF0ZShjaGlwLCBydW50aW1lLT5yYXRlKTsKKwlzbmRfYWxzNDAwMF9zZXRfY2FwdHVyZV9kbWEoY2hpcCwgcnVudGltZS0+ZG1hX2FkZHIsIHNpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzICk7CisJc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhkYywgY291bnQpOworCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsIDB4ZGQsIGNvdW50Pj44KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5taXhlcl9sb2NrLCBmbGFncyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbHM0MDAwX3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2JfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgY291bnQ7CisKKwljaGlwLT5wbGF5YmFja19mb3JtYXQgPSBzbmRfYWxzNDAwMF9nZXRfZm9ybWF0KHJ1bnRpbWUpOworCQorCXNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwljb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCQorCWlmIChjaGlwLT5wbGF5YmFja19mb3JtYXQgJiBBTFM0MDAwX0ZPUk1BVF8xNkJJVCkKKwkJY291bnQgPj49MTsKKwljb3VudC0tOworCQorCS8qIEZJWE1FOiBmcm9tIHNlY29uZCBwbGF5YmFjayBvbiwgdGhlcmUncyBhIGxvdCBtb3JlIGNsaWNrcyBhbmQgcG9wcworCSAqIGludm9sdmVkIGhlcmUgdGhhbiBvbiBmaXJzdCBwbGF5YmFjay4gRmlkZGxpbmcgd2l0aAorCSAqIHRvbnMgb2YgZGlmZmVyZW50IHNldHRpbmdzIGRpZG4ndCBoZWxwIChETUEsIHNwZWFrZXIgb24vb2ZmLAorCSAqIHJlb3JkZXJpbmcsIC4uLikuIFNvbWV0aGluZyBzZWVtcyB0byBnZXQgZW5hYmxlZCBvbiBwbGF5YmFjaworCSAqIHRoYXQgSSBoYXZlbid0IGZvdW5kIG91dCBob3cgdG8gZGlzYWJsZSBhZ2Fpbiwgd2hpY2ggdGhlbiBjYXVzZXMKKwkgKiB0aGUgc3dpdGNoaW5nIHBvcHMgdG8gcmVhY2ggdGhlIHNwZWFrZXJzIHRoZSBuZXh0IHRpbWUgaGVyZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfYWxzNDAwMF9zZXRfcmF0ZShjaGlwLCBydW50aW1lLT5yYXRlKTsKKwlzbmRfYWxzNDAwMF9zZXRfcGxheWJhY2tfZG1hKGNoaXAsIHJ1bnRpbWUtPmRtYV9hZGRyLCBzaXplKTsKKwkKKwkvKiBTUEVBS0VSX09OIG5vdCBuZWVkZWQsIHNpbmNlIGRtYV9vbiBzZWVtcyB0byBhbHNvIGVuYWJsZSBzcGVha2VyICovCisJLyogc25kX3NiZHNwX2NvbW1hbmQoY2hpcCwgU0JfRFNQX1NQRUFLRVJfT04pOyAqLworCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIHBsYXliYWNrX2NtZChjaGlwKS5kc3BfY21kKTsKKwlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBwbGF5YmFja19jbWQoY2hpcCkuZm9ybWF0KTsKKwlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBjb3VudCk7CisJc25kX3NiZHNwX2NvbW1hbmQoY2hpcCwgY291bnQ+PjgpOworCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIHBsYXliYWNrX2NtZChjaGlwKS5kbWFfb2ZmKTsJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWxzNDAwMF9jYXB0dXJlX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzYl90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCByZXN1bHQgPSAwOworCQorCXNwaW5fbG9jaygmY2hpcC0+bWl4ZXJfbG9jayk7CisJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkgeworCQljaGlwLT5tb2RlIHw9IFNCX1JBVEVfTE9DS19DQVBUVVJFOworCQlzbmRfc2JtaXhlcl93cml0ZShjaGlwLCAweGRlLCBjYXB0dXJlX2NtZChjaGlwKSk7CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQljaGlwLT5tb2RlICY9IH5TQl9SQVRFX0xPQ0tfQ0FQVFVSRTsKKwkJc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhkZSwgMCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPm1peGVyX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsczQwMDBfcGxheWJhY2tfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXNiX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CisJCWNoaXAtPm1vZGUgfD0gU0JfUkFURV9MT0NLX1BMQVlCQUNLOworCQlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBwbGF5YmFja19jbWQoY2hpcCkuZG1hX29uKTsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QKSB7CisJCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIHBsYXliYWNrX2NtZChjaGlwKS5kbWFfb2ZmKTsKKwkJY2hpcC0+bW9kZSAmPSB+U0JfUkFURV9MT0NLX1BMQVlCQUNLOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hbHM0MDAwX2NhcHR1cmVfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNiX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwkKKwlyZXN1bHQgPSBzbmRfYWxzNDAwMF9nY3JfcmVhZChjaGlwLCAweGE0KSAmIDB4ZmZmZjsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiBieXRlc190b19mcmFtZXMoIHN1YnN0cmVhbS0+cnVudGltZSwgcmVzdWx0ICk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfYWxzNDAwMF9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc2JfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCByZXN1bHQ7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsJCisJcmVzdWx0ID0gc25kX2FsczQwMDBfZ2NyX3JlYWQoY2hpcCwgMHhhMCkgJiAweGZmZmY7CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlc3VsdCApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2FsczQwMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2JfdCAqY2hpcCA9IGRldl9pZDsKKwl1bnNpZ25lZCBnY3Jfc3RhdHVzOworCXVuc2lnbmVkIHNiX3N0YXR1czsKKworCS8qIGZpbmQgb3V0IHdoaWNoIGJpdCBvZiB0aGUgQUxTNDAwMCBwcm9kdWNlZCB0aGUgaW50ZXJydXB0ICovCisJZ2NyX3N0YXR1cyA9IGluYihjaGlwLT5hbHRfcG9ydCArIDB4ZSk7CisKKwlpZiAoKGdjcl9zdGF0dXMgJiAweDgwKSAmJiAoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKSkgLyogcGxheWJhY2sgKi8KKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pOworCWlmICgoZ2NyX3N0YXR1cyAmIDB4NDApICYmIChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSkpIC8qIGNhcHR1cmluZyAqLworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwlpZiAoKGdjcl9zdGF0dXMgJiAweDEwKSAmJiAoY2hpcC0+cm1pZGkpKSAvKiBNUFU0MDEgaW50ZXJydXB0ICovCisJCXNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaXJxLCBjaGlwLT5ybWlkaSwgcmVncyk7CisJLyogcmVsZWFzZSB0aGUgZ2NyICovCisJb3V0YihnY3Jfc3RhdHVzLCBjaGlwLT5hbHRfcG9ydCArIDB4ZSk7CisJCisJc3Bpbl9sb2NrKCZjaGlwLT5taXhlcl9sb2NrKTsKKwlzYl9zdGF0dXMgPSBzbmRfc2JtaXhlcl9yZWFkKGNoaXAsIFNCX0RTUDRfSVJRU1RBVFVTKTsKKwlzcGluX3VubG9jaygmY2hpcC0+bWl4ZXJfbG9jayk7CisJCisJaWYgKHNiX3N0YXR1cyAmIFNCX0lSUVRZUEVfOEJJVCkgCisJCXNuZF9zYl9hY2tfOGJpdChjaGlwKTsKKwlpZiAoc2Jfc3RhdHVzICYgU0JfSVJRVFlQRV8xNkJJVCkgCisJCXNuZF9zYl9hY2tfMTZiaXQoY2hpcCk7CisJaWYgKHNiX3N0YXR1cyAmIFNCX0lSUVRZUEVfTVBVSU4pCisJCWluYihjaGlwLT5tcHVfcG9ydCk7CisJaWYgKHNiX3N0YXR1cyAmIDB4MjApCisJCWluYihTQlAoY2hpcCwgUkVTRVQpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfYWxzNDAwMF9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSwJLyogZm9ybWF0cyAqLworCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CTY1NTM2LAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQk2NTUzNiwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2FsczQwMDBfY2FwdHVyZSA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSwJLyogZm9ybWF0cyAqLworCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CTY1NTM2LAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQk2NTUzNiwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzbmRfYWxzNDAwMF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc2JfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9hbHM0MDAwX3BsYXliYWNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbHM0MDAwX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc2JfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hbHM0MDAwX2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNiX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9hbHM0MDAwX2NhcHR1cmU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FsczQwMDBfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNiX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfYWxzNDAwMF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2FsczQwMDBfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYWxzNDAwMF9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2FsczQwMDBfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2FsczQwMDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9hbHM0MDAwX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYWxzNDAwMF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2FsczQwMDBfcGxheWJhY2tfcG9pbnRlcgorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2FsczQwMDBfY2FwdHVyZV9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2FsczQwMDBfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CXNuZF9hbHM0MDAwX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hbHM0MDAwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hbHM0MDAwX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfYWxzNDAwMF9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYWxzNDAwMF9jYXB0dXJlX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfYWxzNDAwMF9jYXB0dXJlX3BvaW50ZXIKK307CisKK3N0YXRpYyB2b2lkIHNuZF9hbHM0MDAwX3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXNiX3QgKmNoaXAgPSBwY20tPnByaXZhdGVfZGF0YTsKKwljaGlwLT5wY20gPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxzNDAwMF9wY20oc2JfdCAqY2hpcCwgaW50IGRldmljZSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQUxTNDAwMCBEU1AiLCBkZXZpY2UsIDEsIDEsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfYWxzNDAwMF9wY21fZnJlZTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5pbmZvX2ZsYWdzID0gU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfYWxzNDAwMF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9hbHM0MDAwX2NhcHR1cmVfb3BzKTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJICAgICAgNjQqMTAyNCwgNjQqMTAyNCk7CisKKwljaGlwLT5wY20gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc25kX2FsczQwMDBfc2V0X2FkZHIodW5zaWduZWQgbG9uZyBnY3IsCisJCQkJCXVuc2lnbmVkIGludCBzYiwKKwkJCQkJdW5zaWduZWQgaW50IG1wdSwKKwkJCQkJdW5zaWduZWQgaW50IG9wbCwKKwkJCQkJdW5zaWduZWQgaW50IGdhbWUpCit7CisJdTMyIGNvbmZBID0gMDsKKwl1MzIgY29uZkIgPSAwOworCisJaWYgKG1wdSA+IDApCisJCWNvbmZCIHw9IChtcHUgfCAxKSA8PCAxNjsKKwlpZiAoc2IgPiAwKQorCQljb25mQiB8PSAoc2IgfCAxKTsKKwlpZiAoZ2FtZSA+IDApCisJCWNvbmZBIHw9IChnYW1lIHwgMSkgPDwgMTY7CisJaWYgKG9wbCA+IDApCQorCQljb25mQSB8PSAob3BsIHwgMSk7CisJc25kX2FsczQwMDBfZ2NyX3dyaXRlX2FkZHIoZ2NyLCAweGE4LCBjb25mQSk7CisJc25kX2FsczQwMDBfZ2NyX3dyaXRlX2FkZHIoZ2NyLCAweGE5LCBjb25mQik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfYWxzNDAwMF9jb25maWd1cmUoc2JfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCB0bXA7CisJaW50IGk7CisKKwkvKiBkbyBzb21lIG1vcmUgY29uZmlndXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnEoJmNoaXAtPm1peGVyX2xvY2spOworCXRtcCA9IHNuZF9zYm1peGVyX3JlYWQoY2hpcCwgMHhjMCk7CisJc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhjMCwgdG1wfDB4ODApOworCS8qIGFsd2F5cyBzZWxlY3QgRE1BIGNoYW5uZWwgMCwgc2luY2Ugd2UgZG8gbm90IGFjdHVhbGx5IHVzZSBETUEgKi8KKwlzbmRfc2JtaXhlcl93cml0ZShjaGlwLCBTQl9EU1A0X0RNQVNFVFVQLCBTQl9ETUFTRVRVUF9ETUEwKTsKKwlzbmRfc2JtaXhlcl93cml0ZShjaGlwLCAweGMwLCB0bXAmMHg3Zik7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5taXhlcl9sb2NrKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogbWFnaWMgbnVtYmVyLiBFbmFibGVzIGludGVycnVwdHMoPykgKi8KKwlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHg4YywgMHgyODAwMCk7CisJZm9yKGkgPSAweDkxOyBpIDw9IDB4OTY7ICsraSkKKwkJc25kX2FsczQwMDBfZ2NyX3dyaXRlKGNoaXAsIGksIDApOworCQorCXNuZF9hbHM0MDAwX2djcl93cml0ZShjaGlwLCAweDk5LCBzbmRfYWxzNDAwMF9nY3JfcmVhZChjaGlwLCAweDk5KSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Cit9CisKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxzNDAwMF9jcmVhdGVfZ2FtZXBvcnQoc25kX2NhcmRfYWxzNDAwMF90ICphY2FyZCwgaW50IGRldikKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgaW9fcG9ydDsKKworCWlmIChqb3lzdGlja19wb3J0W2Rldl0gPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoam95c3RpY2tfcG9ydFtkZXZdID09IDEpIHsgLyogYXV0by1kZXRlY3QgKi8KKwkJZm9yIChpb19wb3J0ID0gMHgyMDA7IGlvX3BvcnQgPD0gMHgyMTg7IGlvX3BvcnQgKz0gOCkgeworCQkJciA9IHJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDgsICJBTFM0MDAwIGdhbWVwb3J0Iik7CisJCQlpZiAocikKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWlvX3BvcnQgPSBqb3lzdGlja19wb3J0W2Rldl07CisJCXIgPSByZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCA4LCAiQUxTNDAwMCBnYW1lcG9ydCIpOworCX0KKworCWlmICghcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbHM0MDAwOiBjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJYWNhcmQtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJBTFM0MDAwIEdhbWVwb3J0Iik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShhY2FyZC0+cGNpKSk7CisJZ2FtZXBvcnRfc2V0X2Rldl9wYXJlbnQoZ3AsICZhY2FyZC0+cGNpLT5kZXYpOworCWdwLT5pbyA9IGlvX3BvcnQ7CisJZ2FtZXBvcnRfc2V0X3BvcnRfZGF0YShncCwgcik7CisKKwkvKiBFbmFibGUgbGVnYWN5IGpveXN0aWNrIHBvcnQgKi8KKwlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+Z2NyLCAwLCAwLCAwLCAxKTsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoYWNhcmQtPmdhbWVwb3J0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfYWxzNDAwMF9mcmVlX2dhbWVwb3J0KHNuZF9jYXJkX2FsczQwMDBfdCAqYWNhcmQpCit7CisJaWYgKGFjYXJkLT5nYW1lcG9ydCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGFjYXJkLT5nYW1lcG9ydCk7CisKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGFjYXJkLT5nYW1lcG9ydCk7CisJCWFjYXJkLT5nYW1lcG9ydCA9IE5VTEw7CisKKwkJc25kX2FsczQwMDBfc2V0X2FkZHIoYWNhcmQtPmdjciwgMCwgMCwgMCwgMCk7IC8qIGRpc2FibGUgam95c3RpY2sgKi8KKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX2FsczQwMDBfY3JlYXRlX2dhbWVwb3J0KHNuZF9jYXJkX2FsczQwMDBfdCAqYWNhcmQsIGludCBkZXYpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYWxzNDAwMF9mcmVlX2dhbWVwb3J0KHNuZF9jYXJkX2FsczQwMDBfdCAqYWNhcmQpIHsgfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNuZF9jYXJkX2FsczQwMDBfZnJlZSggc25kX2NhcmRfdCAqY2FyZCApCit7CisJc25kX2NhcmRfYWxzNDAwMF90ICogYWNhcmQgPSAoc25kX2NhcmRfYWxzNDAwMF90ICopY2FyZC0+cHJpdmF0ZV9kYXRhOworCisJLyogbWFrZSBzdXJlIHRoYXQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKwlzbmRfYWxzNDAwMF9nY3Jfd3JpdGVfYWRkciggYWNhcmQtPmdjciwgMHg4YywgMCk7CisJLyogZnJlZSByZXNvdXJjZXMgKi8KKwlzbmRfYWxzNDAwMF9mcmVlX2dhbWVwb3J0KGFjYXJkKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGFjYXJkLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShhY2FyZC0+cGNpKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NhcmRfYWxzNDAwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfY2FyZF9hbHM0MDAwX3QgKmFjYXJkOworCXVuc2lnbmVkIGxvbmcgZ2NyOworCXNiX3QgKmNoaXA7CisJb3BsM190ICpvcGwzOworCXVuc2lnbmVkIHNob3J0IHdvcmQ7CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApIHsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCAweDAwZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgMHgwMGZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkFMUzQwMDAiKSkgPCAwKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwlnY3IgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX0NPTU1BTkQsICZ3b3JkKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lfQ09NTUFORCwgd29yZCB8IFBDSV9DT01NQU5EX0lPKTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCQorCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIAorCQkJICAgIHNpemVvZiggc25kX2NhcmRfYWxzNDAwMF90ICkgKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFjYXJkID0gKHNuZF9jYXJkX2FsczQwMDBfdCAqKWNhcmQtPnByaXZhdGVfZGF0YTsKKwlhY2FyZC0+cGNpID0gcGNpOworCWFjYXJkLT5nY3IgPSBnY3I7CisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2NhcmRfYWxzNDAwMF9mcmVlOworCisJLyogZGlzYWJsZSBhbGwgbGVnYWN5IElTQSBzdHVmZiAqLworCXNuZF9hbHM0MDAwX3NldF9hZGRyKGFjYXJkLT5nY3IsIDAsIDAsIDAsIDApOworCisJaWYgKChlcnIgPSBzbmRfc2Jkc3BfY3JlYXRlKGNhcmQsCisJCQkJICAgIGdjciArIDB4MTAsCisJCQkJICAgIHBjaS0+aXJxLAorCQkJCSAgICBzbmRfYWxzNDAwMF9pbnRlcnJ1cHQsCisJCQkJICAgIC0xLAorCQkJCSAgICAtMSwKKwkJCQkgICAgU0JfSFdfQUxTNDAwMCwKKwkJCQkgICAgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+YWx0X3BvcnQgPSBnY3I7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJc25kX2FsczQwMDBfY29uZmlndXJlKGNoaXApOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkFMUzQwMDAiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQXZhbmNlIExvZ2ljIEFMUzQwMDAiKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+YWx0X3BvcnQsIGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoIGNhcmQsIDAsIE1QVTQwMV9IV19BTFM0MDAwLAorCQkJCSAgICAgICAgZ2NyKzB4MzAsIDEsIHBjaS0+aXJxLCAwLAorCQkJCSAgICAgICAgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXByaW50ayhLRVJOX0VSUiAiYWxzNDAwMDogbm8gTVBVLTQwMWRldmljZSBhdCAweCVseCA/XG4iLCBnY3IrMHgzMCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfYWxzNDAwMF9wY20oY2hpcCwgMCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9zYm1peGVyX25ldyhjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQkgICAgCisKKwlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGdjcisweDEwLCBnY3IrMHgxMiwKKwkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBPUEwgZGV2aWNlIGF0IDB4JWx4LTB4JWx4ID9cbiIsCisJCQkgICBnY3IrMHgxMCwgZ2NyKzB4MTIgKTsKKwl9IGVsc2UgeworCQlpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CisJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXNuZF9hbHM0MDAwX2NyZWF0ZV9nYW1lcG9ydChhY2FyZCwgZGV2KTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9jYXJkX2FsczQwMDBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiQUxTNDAwMCIsCisJLmlkX3RhYmxlID0gc25kX2FsczQwMDBfaWRzLAorCS5wcm9iZSA9IHNuZF9jYXJkX2FsczQwMDBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2FsczQwMDBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9hbHM0MDAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2FsczQwMDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2FsczQwMDBfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9hbHM0MDAwX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwNGMwYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMCwwICsxLDE2NTcgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBBVEkgSVhQIDE1MC8yMDAvMjUwLzMwMCBBQzk3IGNvbnRyb2xsZXJzCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFUSSBJWFAgQUM5NyBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tBVEksSVhQMTUwLzIwMC8yNTAvMzAwLzQwMH19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBhYzk3X2Nsb2NrW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNDgwMDB9Oworc3RhdGljIGNoYXIgKmFjOTdfcXVpcmtbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBzcGRpZl9hY2xpbmtbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBVEkgSVhQIGNvbnRyb2xsZXIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIEFUSSBJWFAgY29udHJvbGxlci4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgYXVkaW8gcGFydCBvZiBBVEkgSVhQIGNvbnRyb2xsZXIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYWM5N19jbG9jaywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19jbG9jaywgIkFDJzk3IGNvZGVjIGNsb2NrIChkZWZhdWx0IDQ4MDAwSHopLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGFjOTdfcXVpcmssIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19xdWlyaywgIkFDJzk3IHdvcmthcm91bmQgZm9yIHN0cmFuZ2UgaGFyZHdhcmUuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3BkaWZfYWNsaW5rLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWZfYWNsaW5rLCAiUy9QRElGIG92ZXIgQUMtbGluay4iKTsKKworCisvKgorICovCisKKyNkZWZpbmUgQVRJX1JFR19JU1IJCQkweDAwCS8qIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgIEFUSV9SRUdfSVNSX0lOX1hSVU4JCSgxVTw8MCkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX0lOX1NUQVRVUwkJKDFVPDwxKQorI2RlZmluZSAgQVRJX1JFR19JU1JfT1VUX1hSVU4JCSgxVTw8MikKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX09VVF9TVEFUVVMJCSgxVTw8MykKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX1NQREZfWFJVTgkJKDFVPDw0KQorI2RlZmluZSAgQVRJX1JFR19JU1JfU1BERl9TVEFUVVMJKDFVPDw1KQorI2RlZmluZSAgQVRJX1JFR19JU1JfUEhZU19JTlRSCQkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX0lTUl9QSFlTX01JU01BVENICSgxVTw8OSkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX0NPREVDMF9OT1RfUkVBRFkJKDFVPDwxMCkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX0NPREVDMV9OT1RfUkVBRFkJKDFVPDwxMSkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX0NPREVDMl9OT1RfUkVBRFkJKDFVPDwxMikKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX05FV19GUkFNRQkJKDFVPDwxMykKKworI2RlZmluZSBBVElfUkVHX0lFUgkJCTB4MDQJLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgQVRJX1JFR19JRVJfSU5fWFJVTl9FTgkJKDFVPDwwKQorI2RlZmluZSAgQVRJX1JFR19JRVJfSU9fU1RBVFVTX0VOCSgxVTw8MSkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX09VVF9YUlVOX0VOCSgxVTw8MikKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX09VVF9YUlVOX0NPTkQJKDFVPDwzKQorI2RlZmluZSAgQVRJX1JFR19JRVJfU1BERl9YUlVOX0VOCSgxVTw8NCkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX1NQREZfU1RBVFVTX0VOCSgxVTw8NSkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX1BIWVNfSU5UUl9FTgkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX0lFUl9QSFlTX01JU01BVENIX0VOCSgxVTw8OSkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX0NPREVDMF9JTlRSX0VOCSgxVTw8MTApCisjZGVmaW5lICBBVElfUkVHX0lFUl9DT0RFQzFfSU5UUl9FTgkoMVU8PDExKQorI2RlZmluZSAgQVRJX1JFR19JRVJfQ09ERUMyX0lOVFJfRU4JKDFVPDwxMikKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX05FV19GUkFNRV9FTgkoMVU8PDEzKQkvKiAoUk8gKi8KKyNkZWZpbmUgIEFUSV9SRUdfSUVSX1NFVF9CVVNfQlVTWQkoMVU8PDE0KQkvKiAoV08pIGF1ZGlvIGlzIHJ1bm5pbmcgKi8KKworI2RlZmluZSBBVElfUkVHX0NNRAkJCTB4MDgJLyogY29tbWFuZCAqLworI2RlZmluZSAgQVRJX1JFR19DTURfUE9XRVJET1dOCQkoMVU8PDApCisjZGVmaW5lICBBVElfUkVHX0NNRF9SRUNFSVZFX0VOCQkoMVU8PDEpCisjZGVmaW5lICBBVElfUkVHX0NNRF9TRU5EX0VOCQkoMVU8PDIpCisjZGVmaW5lICBBVElfUkVHX0NNRF9TVEFUVVNfTUVNCQkoMVU8PDMpCisjZGVmaW5lICBBVElfUkVHX0NNRF9TUERGX09VVF9FTgkoMVU8PDQpCisjZGVmaW5lICBBVElfUkVHX0NNRF9TUERGX1NUQVRVU19NRU0JKDFVPDw1KQorI2RlZmluZSAgQVRJX1JFR19DTURfU1BERl9USFJFU0hPTEQJKDNVPDw2KQorI2RlZmluZSAgQVRJX1JFR19DTURfU1BERl9USFJFU0hPTERfU0hJRlQJNgorI2RlZmluZSAgQVRJX1JFR19DTURfSU5fRE1BX0VOCQkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX0NNRF9PVVRfRE1BX0VOCQkoMVU8PDkpCisjZGVmaW5lICBBVElfUkVHX0NNRF9TUERGX0RNQV9FTgkoMVU8PDEwKQorI2RlZmluZSAgQVRJX1JFR19DTURfU1BERl9PVVRfU1RPUFBFRAkoMVU8PDExKQorI2RlZmluZSAgQVRJX1JFR19DTURfU1BERl9DT05GSUdfTUFTSwkoN1U8PDEyKQorI2RlZmluZSAgIEFUSV9SRUdfQ01EX1NQREZfQ09ORklHXzM0CSgxVTw8MTIpCisjZGVmaW5lICAgQVRJX1JFR19DTURfU1BERl9DT05GSUdfNzgJKDJVPDwxMikKKyNkZWZpbmUgICBBVElfUkVHX0NNRF9TUERGX0NPTkZJR182OQkoM1U8PDEyKQorI2RlZmluZSAgIEFUSV9SRUdfQ01EX1NQREZfQ09ORklHXzAxCSg0VTw8MTIpCisjZGVmaW5lICBBVElfUkVHX0NNRF9JTlRFUkxFQVZFX1NQREYJKDFVPDwxNikKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0FVRElPX1BSRVNFTlQJKDFVPDwyMCkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfSU4JKDFVPDwyMSkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfT1VUCSgxVTw8MjIpCisjZGVmaW5lICBBVElfUkVHX0NNRF9MT09QQkFDS19FTgkoMVU8PDIzKQorI2RlZmluZSAgQVRJX1JFR19DTURfUEFDS0VEX0RJUwkJKDFVPDwyNCkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0JVUlNUX0VOCQkoMVU8PDI1KQorI2RlZmluZSAgQVRJX1JFR19DTURfUEFOSUNfRU4JCSgxVTw8MjYpCisjZGVmaW5lICBBVElfUkVHX0NNRF9NT0RFTV9QUkVTRU5UCSgxVTw8MjcpCisjZGVmaW5lICBBVElfUkVHX0NNRF9BQ0xJTktfQUNUSVZFCSgxVTw8MjgpCisjZGVmaW5lICBBVElfUkVHX0NNRF9BQ19TT0ZUX1JFU0VUCSgxVTw8MjkpCisjZGVmaW5lICBBVElfUkVHX0NNRF9BQ19TWU5DCQkoMVU8PDMwKQorI2RlZmluZSAgQVRJX1JFR19DTURfQUNfUkVTRVQJCSgxVTw8MzEpCisKKyNkZWZpbmUgQVRJX1JFR19QSFlTX09VVF9BRERSCQkweDBjCisjZGVmaW5lICBBVElfUkVHX1BIWVNfT1VUX0NPREVDX01BU0sJKDNVPDwwKQorI2RlZmluZSAgQVRJX1JFR19QSFlTX09VVF9SVwkJKDFVPDwyKQorI2RlZmluZSAgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOCSgxVTw8OCkKKyNkZWZpbmUgIEFUSV9SRUdfUEhZU19PVVRfQUREUl9TSElGVAk5CisjZGVmaW5lICBBVElfUkVHX1BIWVNfT1VUX0RBVEFfU0hJRlQJMTYKKworI2RlZmluZSBBVElfUkVHX1BIWVNfSU5fQUREUgkJMHgxMAorI2RlZmluZSAgQVRJX1JFR19QSFlTX0lOX1JFQURfRkxBRwkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX1BIWVNfSU5fQUREUl9TSElGVAk5CisjZGVmaW5lICBBVElfUkVHX1BIWVNfSU5fREFUQV9TSElGVAkxNgorCisjZGVmaW5lIEFUSV9SRUdfU0xPVFJFUQkJCTB4MTQKKworI2RlZmluZSBBVElfUkVHX0NPVU5URVIJCQkweDE4CisjZGVmaW5lICBBVElfUkVHX0NPVU5URVJfU0xPVAkJKDNVPDwwKQkvKiBzbG90ICMgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ09VTlRFUl9CSVRDTE9DSwkoMzFVPDw4KQorCisjZGVmaW5lIEFUSV9SRUdfSU5fRklGT19USFJFU0hPTEQJMHgxYworCisjZGVmaW5lIEFUSV9SRUdfSU5fRE1BX0xJTktQVFIJCTB4MjAKKyNkZWZpbmUgQVRJX1JFR19JTl9ETUFfRFRfU1RBUlQJCTB4MjQJLyogUk8gKi8KKyNkZWZpbmUgQVRJX1JFR19JTl9ETUFfRFRfTkVYVAkJMHgyOAkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX0lOX0RNQV9EVF9DVVIJCTB4MmMJLyogUk8gKi8KKyNkZWZpbmUgQVRJX1JFR19JTl9ETUFfRFRfU0laRQkJMHgzMAorCisjZGVmaW5lIEFUSV9SRUdfT1VUX0RNQV9TTE9UCQkweDM0CisjZGVmaW5lICBBVElfUkVHX09VVF9ETUFfU0xPVF9CSVQoeCkJKDFVIDw8ICgoeCkgLSAzKSkKKyNkZWZpbmUgIEFUSV9SRUdfT1VUX0RNQV9TTE9UX01BU0sJMHgxZmYKKyNkZWZpbmUgIEFUSV9SRUdfT1VUX0RNQV9USFJFU0hPTERfTUFTSwkweGY4MDAKKyNkZWZpbmUgIEFUSV9SRUdfT1VUX0RNQV9USFJFU0hPTERfU0hJRlQJMTEKKworI2RlZmluZSBBVElfUkVHX09VVF9ETUFfTElOS1BUUgkJMHgzOAorI2RlZmluZSBBVElfUkVHX09VVF9ETUFfRFRfU1RBUlQJMHgzYwkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX09VVF9ETUFfRFRfTkVYVAkJMHg0MAkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX09VVF9ETUFfRFRfQ1VSCQkweDQ0CS8qIFJPICovCisjZGVmaW5lIEFUSV9SRUdfT1VUX0RNQV9EVF9TSVpFCQkweDQ4CisKKyNkZWZpbmUgQVRJX1JFR19TUERGX0NNRAkJMHg0YworI2RlZmluZSAgQVRJX1JFR19TUERGX0NNRF9MRlNSCQkoMVU8PDQpCisjZGVmaW5lICBBVElfUkVHX1NQREZfQ01EX1NJTkdMRV9DSAkoMVU8PDUpCisjZGVmaW5lICBBVElfUkVHX1NQREZfQ01EX0xGU1JfQUNDCSgweGZmPDw4KQkvKiBSTyAqLworCisjZGVmaW5lIEFUSV9SRUdfU1BERl9ETUFfTElOS1BUUgkweDUwCisjZGVmaW5lIEFUSV9SRUdfU1BERl9ETUFfRFRfU1RBUlQJMHg1NAkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX1NQREZfRE1BX0RUX05FWFQJMHg1OAkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX1NQREZfRE1BX0RUX0NVUgkJMHg1YwkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX1NQREZfRE1BX0RUX1NJWkUJMHg2MAorCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fTUlSUk9SCQkweDdjCisjZGVmaW5lIEFUSV9SRUdfQVVESU9fTUlSUk9SCQkweDgwCisKKyNkZWZpbmUgQVRJX1JFR182Q0hfUkVPUkRFUgkJMHg4NAkvKiByZW9yZGVyIHNsb3RzIGZvciA2Y2ggKi8KKyNkZWZpbmUgIEFUSV9SRUdfNkNIX1JFT1JERVJfRU4JCSgxVTw8MCkJLyogMyw0LDcsOCw2LDkgLT4gMyw0LDYsOSw3LDggKi8KKworI2RlZmluZSBBVElfUkVHX0ZJRk9fRkxVU0gJCTB4ODgKKyNkZWZpbmUgIEFUSV9SRUdfRklGT19PVVRfRkxVU0gJCSgxVTw8MCkKKyNkZWZpbmUgIEFUSV9SRUdfRklGT19JTl9GTFVTSAkJKDFVPDwxKQorCisvKiBMSU5LUFRSICovCisjZGVmaW5lICBBVElfUkVHX0xJTktQVFJfRU4JCSgxVTw8MCkKKworLyogW0lOVHxPVVR8U1BESUZdX0RNQV9EVF9TSVpFICovCisjZGVmaW5lICBBVElfUkVHX0RNQV9EVF9TSVpFCQkoMHhmZmZmVTw8MCkKKyNkZWZpbmUgIEFUSV9SRUdfRE1BX0ZJRk9fVVNFRAkJKDB4MWZVPDwxNikKKyNkZWZpbmUgIEFUSV9SRUdfRE1BX0ZJRk9fRlJFRQkJKDB4MWZVPDwyMSkKKyNkZWZpbmUgIEFUSV9SRUdfRE1BX1NUQVRFCQkoN1U8PDI2KQorCisKKyNkZWZpbmUgQVRJX01BWF9ERVNDUklQVE9SUwkyNTYJLyogbWF4IG51bWJlciBvZiBkZXNjcmlwdG9yIHBhY2tldHMgKi8KKworCisvKgorICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9hdGlpeHAgYXRpaXhwX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfYXRpaXhwX2RtYSBhdGlpeHBfZG1hX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfYXRpaXhwX2RtYV9vcHMgYXRpaXhwX2RtYV9vcHNfdDsKKworCisvKgorICogRE1BIHBhY2thdGUgZGVzY3JpcHRvcgorICovCisKK3R5cGVkZWYgc3RydWN0IGF0aWl4cF9kbWFfZGVzYyB7CisJdTMyIGFkZHI7CS8qIERNQSBidWZmZXIgYWRkcmVzcyAqLworCXUxNiBzdGF0dXM7CS8qIHN0YXR1cyBiaXRzICovCisJdTE2IHNpemU7CS8qIHNpemUgb2YgdGhlIHBhY2tldCBpbiBkd29yZHMgKi8KKwl1MzIgbmV4dDsJLyogYWRkcmVzcyBvZiB0aGUgbmV4dCBwYWNrZXQgZGVzY3JpcHRvciAqLworfSBhdGlpeHBfZG1hX2Rlc2NfdDsKKworLyoKKyAqIHN0cmVhbSBlbnVtCisgKi8KK2VudW0geyBBVElfRE1BX1BMQVlCQUNLLCBBVElfRE1BX0NBUFRVUkUsIEFUSV9ETUFfU1BESUYsIE5VTV9BVElfRE1BUyB9OyAvKiBETUFzICovCitlbnVtIHsgQVRJX1BDTV9PVVQsIEFUSV9QQ01fSU4sIEFUSV9QQ01fU1BESUYsIE5VTV9BVElfUENNUyB9OyAvKiBBQzk3IHBjbSBzbG90cyAqLworZW51bSB7IEFUSV9QQ01ERVZfQU5BTE9HLCBBVElfUENNREVWX0RJR0lUQUwsIE5VTV9BVElfUENNREVWUyB9OyAvKiBwY20gZGV2aWNlcyAqLworCisjZGVmaW5lIE5VTV9BVElfQ09ERUNTCTMKKworCisvKgorICogY29uc3RhbnRzIGFuZCBjYWxsYmFja3MgZm9yIGVhY2ggRE1BIHR5cGUKKyAqLworc3RydWN0IHNuZF9hdGlpeHBfZG1hX29wcyB7CisJaW50IHR5cGU7CQkJLyogQVRJX0RNQV9YWFggKi8KKwl1bnNpZ25lZCBpbnQgbGxwX29mZnNldDsJLyogTElOS1BUUiBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgZHRfY3VyOwkJLyogRFRfQ1VSIG9mZnNldCAqLworCXZvaWQgKCplbmFibGVfZG1hKShhdGlpeHBfdCAqY2hpcCwgaW50IG9uKTsJLyogY2FsbGVkIGZyb20gb3BlbiBjYWxsYmFjayAqLworCXZvaWQgKCplbmFibGVfdHJhbnNmZXIpKGF0aWl4cF90ICpjaGlwLCBpbnQgb24pOyAvKiBjYWxsZWQgZnJvbSB0cmlnZ2VyIChTVEFSVC9TVE9QKSAqLworCXZvaWQgKCpmbHVzaF9kbWEpKGF0aWl4cF90ICpjaGlwKTsJCS8qIGNhbGxlZCBmcm9tIHRyaWdnZXIgKFNUT1Agb25seSkgKi8KK307CisKKy8qCisgKiBETUEgc3RyZWFtCisgKi8KK3N0cnVjdCBzbmRfYXRpaXhwX2RtYSB7CisJY29uc3QgYXRpaXhwX2RtYV9vcHNfdCAqb3BzOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkZXNjX2J1ZjsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CS8qIGFzc2lnbmVkIFBDTSBzdWJzdHJlYW0gKi8KKwl1bnNpZ25lZCBpbnQgYnVmX2FkZHIsIGJ1Zl9ieXRlczsJLyogRE1BIGJ1ZmZlciBhZGRyZXNzLCBieXRlcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsIHBlcmlvZHM7CisJaW50IG9wZW5lZDsKKwlpbnQgcnVubmluZzsKKwlpbnQgcGNtX29wZW5fZmxhZzsKKwlpbnQgYWM5N19wY21fdHlwZTsJLyogaW5kZXggIyBvZiBhYzk3X3BjbSB0byBhY2Nlc3MsIC0xID0gbm90IHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQgc2F2ZWRfY3VycHRyOworfTsKKworLyoKKyAqIEFUSSBJWFAgY2hpcAorICovCitzdHJ1Y3Qgc25kX2F0aWl4cCB7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCisJdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKKwlpbnQgaXJxOworCQorCWFjOTdfYnVzX3QgKmFjOTdfYnVzOworCWFjOTdfdCAqYWM5N1tOVU1fQVRJX0NPREVDU107CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCisJYXRpaXhwX2RtYV90IGRtYXNbTlVNX0FUSV9ETUFTXTsKKwlzdHJ1Y3QgYWM5N19wY20gKnBjbXNbTlVNX0FUSV9QQ01TXTsKKwlzbmRfcGNtX3QgKnBjbWRldnNbTlVNX0FUSV9QQ01ERVZTXTsKKworCWludCBtYXhfY2hhbm5lbHM7CQkvKiBtYXguIGNoYW5uZWxzIGZvciBQQ00gb3V0ICovCisKKwl1bnNpZ25lZCBpbnQgY29kZWNfbm90X3JlYWR5X2JpdHM7CS8qIGZvciBjb2RlYyBkZXRlY3Rpb24gKi8KKworCWludCBzcGRpZl9vdmVyX2FjbGluazsJCS8qIHBhc3NlZCBmcm9tIHRoZSBtb2R1bGUgb3B0aW9uICovCisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX211dGV4OwkvKiBwbGF5YmFjayBvcGVuIG11dGV4ICovCit9OworCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYXRpaXhwX2lkc1tdID0geworCXsgMHgxMDAyLCAweDQzNDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwgLyogU0IyMDAgKi8KKwl7IDB4MTAwMiwgMHg0MzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIFNCMzAwICovCisJeyAweDEwMDIsIDB4NDM3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBTQjQwMCAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9hdGlpeHBfaWRzKTsKKworCisvKgorICogbG93bGV2ZWwgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIHVwZGF0ZSB0aGUgYml0cyBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIuCisgKiByZXR1cm4gMSBpZiB0aGUgYml0cyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfdXBkYXRlX2JpdHMoYXRpaXhwX3QgKmNoaXAsIHVuc2lnbmVkIGludCByZWcsCisJCQkJIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICphZGRyID0gY2hpcC0+cmVtYXBfYWRkciArIHJlZzsKKwl1bnNpZ25lZCBpbnQgZGF0YSwgb2xkX2RhdGE7CisJb2xkX2RhdGEgPSBkYXRhID0gcmVhZGwoYWRkcik7CisJZGF0YSAmPSB+bWFzazsKKwlkYXRhIHw9IHZhbHVlOworCWlmIChvbGRfZGF0YSA9PSBkYXRhKQorCQlyZXR1cm4gMDsKKwl3cml0ZWwoZGF0YSwgYWRkcik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBtYWNyb3MgZm9yIGVhc3kgdXNlCisgKi8KKyNkZWZpbmUgYXRpaXhwX3dyaXRlKGNoaXAscmVnLHZhbHVlKSBcCisJd3JpdGVsKHZhbHVlLCBjaGlwLT5yZW1hcF9hZGRyICsgQVRJX1JFR18jI3JlZykKKyNkZWZpbmUgYXRpaXhwX3JlYWQoY2hpcCxyZWcpIFwKKwlyZWFkbChjaGlwLT5yZW1hcF9hZGRyICsgQVRJX1JFR18jI3JlZykKKyNkZWZpbmUgYXRpaXhwX3VwZGF0ZShjaGlwLHJlZyxtYXNrLHZhbCkgXAorCXNuZF9hdGlpeHBfdXBkYXRlX2JpdHMoY2hpcCwgQVRJX1JFR18jI3JlZywgbWFzaywgdmFsKQorCisvKiBkZWxheSBmb3Igb25lIHRpY2sgKi8KKyNkZWZpbmUgZG9fZGVsYXkoKSBkbyB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7IFwKKwlzY2hlZHVsZV90aW1lb3V0KDEpOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBoYW5kbGluZyBETUEgcGFja2V0cworICoKKyAqIHdlIGFsbG9jYXRlIGEgbGluZWFyIGJ1ZmZlciBmb3IgdGhlIERNQSwgYW5kIHNwbGl0IGl0IHRvICBlYWNoIHBhY2tldC4KKyAqIGluIGEgZnV0dXJlIHZlcnNpb24sIGEgc2NhdHRlci1nYXRoZXIgYnVmZmVyIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4KKyAqLworCisjZGVmaW5lIEFUSV9ERVNDX0xJU1RfU0laRSBcCisJUEFHRV9BTElHTihBVElfTUFYX0RFU0NSSVBUT1JTICogc2l6ZW9mKGF0aWl4cF9kbWFfZGVzY190KSkKKworLyoKKyAqIGJ1aWxkIHBhY2tldHMgcmluZyBmb3IgdGhlIGdpdmVuIGJ1ZmZlciBzaXplLgorICoKKyAqIElYUCBoYW5kbGVzIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMsIHdoaWNoIGFyZSBjb25uZWN0ZWQgYXMgYSBsaW5rZWQKKyAqIGxpc3QuICBhbHRob3VnaCB3ZSBjYW4gY2hhbmdlIHRoZSBsaXN0IGR5bmFtaWNhbGx5LCBpbiB0aGlzIHZlcnNpb24sCisgKiBhIHN0YXRpYyBSSU5HIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycyBpcyB1c2VkLgorICoKKyAqIHRoZSByaW5nIGlzIGJ1aWx0IGluIHRoaXMgZnVuY3Rpb24sIGFuZCBpcyBzZXQgdXAgdG8gdGhlIGhhcmR3YXJlLiAKKyAqLworc3RhdGljIGludCBhdGlpeHBfYnVpbGRfZG1hX3BhY2tldHMoYXRpaXhwX3QgKmNoaXAsIGF0aWl4cF9kbWFfdCAqZG1hLAorCQkJCSAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgcGVyaW9kcywKKwkJCQkgICB1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzKQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBhZGRyLCBkZXNjX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwZXJpb2RzID4gQVRJX01BWF9ERVNDUklQVE9SUykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZG1hLT5kZXNjX2J1Zi5hcmVhID09IE5VTEwpIHsKKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCUFUSV9ERVNDX0xJU1RfU0laRSwgJmRtYS0+ZGVzY19idWYpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlkbWEtPnBlcmlvZF9ieXRlcyA9IGRtYS0+cGVyaW9kcyA9IDA7IC8qIGNsZWFyICovCisJfQorCisJaWYgKGRtYS0+cGVyaW9kcyA9PSBwZXJpb2RzICYmIGRtYS0+cGVyaW9kX2J5dGVzID09IHBlcmlvZF9ieXRlcykKKwkJcmV0dXJuIDA7CisKKwkvKiByZXNldCBETUEgYmVmb3JlIGNoYW5naW5nIHRoZSBkZXNjcmlwdG9yIHRhYmxlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJd3JpdGVsKDAsIGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+bGxwX29mZnNldCk7CisJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMCk7CisJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCS8qIGZpbGwgdGhlIGVudHJpZXMgKi8KKwlhZGRyID0gKHUzMilzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCWRlc2NfYWRkciA9ICh1MzIpZG1hLT5kZXNjX2J1Zi5hZGRyOworCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKKwkJYXRpaXhwX2RtYV9kZXNjX3QgKmRlc2MgPSAmKChhdGlpeHBfZG1hX2Rlc2NfdCAqKWRtYS0+ZGVzY19idWYuYXJlYSlbaV07CisJCWRlc2MtPmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJZGVzYy0+c3RhdHVzID0gMDsKKwkJZGVzYy0+c2l6ZSA9IHBlcmlvZF9ieXRlcyA+PiAyOyAvKiBpbiBkd29yZHMgKi8KKwkJZGVzY19hZGRyICs9IHNpemVvZihhdGlpeHBfZG1hX2Rlc2NfdCk7CisJCWlmIChpID09IHBlcmlvZHMgLSAxKQorCQkJZGVzYy0+bmV4dCA9IGNwdV90b19sZTMyKCh1MzIpZG1hLT5kZXNjX2J1Zi5hZGRyKTsKKwkJZWxzZQorCQkJZGVzYy0+bmV4dCA9IGNwdV90b19sZTMyKGRlc2NfYWRkcik7CisJCWFkZHIgKz0gcGVyaW9kX2J5dGVzOworCX0KKworCXdyaXRlbCgodTMyKWRtYS0+ZGVzY19idWYuYWRkciB8IEFUSV9SRUdfTElOS1BUUl9FTiwKKwkgICAgICAgY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5sbHBfb2Zmc2V0KTsKKworCWRtYS0+cGVyaW9kX2J5dGVzID0gcGVyaW9kX2J5dGVzOworCWRtYS0+cGVyaW9kcyA9IHBlcmlvZHM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlbW92ZSB0aGUgcmluZyBidWZmZXIgYW5kIHJlbGVhc2UgaXQgaWYgYXNzaWduZWQKKyAqLworc3RhdGljIHZvaWQgYXRpaXhwX2NsZWFyX2RtYV9wYWNrZXRzKGF0aWl4cF90ICpjaGlwLCBhdGlpeHBfZG1hX3QgKmRtYSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWlmIChkbWEtPmRlc2NfYnVmLmFyZWEpIHsKKwkJd3JpdGVsKDAsIGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+bGxwX29mZnNldCk7CisJCXNuZF9kbWFfZnJlZV9wYWdlcygmZG1hLT5kZXNjX2J1Zik7CisJCWRtYS0+ZGVzY19idWYuYXJlYSA9IE5VTEw7CisJfQorfQorCisvKgorICogQUM5NyBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX2FjcXVpcmVfY29kZWMoYXRpaXhwX3QgKmNoaXApCit7CisJaW50IHRpbWVvdXQgPSAxMDAwOworCisJd2hpbGUgKGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfT1VUX0FERFIpICYgQVRJX1JFR19QSFlTX09VVF9BRERSX0VOKSB7CisJCWlmICghIHRpbWVvdXQtLSkgeworCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImF0aWl4cDogY29kZWMgYWNxdWlyZSB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9hdGlpeHBfY29kZWNfcmVhZChhdGlpeHBfdCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgY29kZWMsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlpbnQgdGltZW91dDsKKworCWlmIChzbmRfYXRpaXhwX2FjcXVpcmVfY29kZWMoY2hpcCkgPCAwKQorCQlyZXR1cm4gMHhmZmZmOworCWRhdGEgPSAocmVnIDw8IEFUSV9SRUdfUEhZU19PVVRfQUREUl9TSElGVCkgfAorCQlBVElfUkVHX1BIWVNfT1VUX0FERFJfRU4gfAorCQlBVElfUkVHX1BIWVNfT1VUX1JXIHwKKwkJY29kZWM7CisJYXRpaXhwX3dyaXRlKGNoaXAsIFBIWVNfT1VUX0FERFIsIGRhdGEpOworCWlmIChzbmRfYXRpaXhwX2FjcXVpcmVfY29kZWMoY2hpcCkgPCAwKQorCQlyZXR1cm4gMHhmZmZmOworCXRpbWVvdXQgPSAxMDAwOworCWRvIHsKKwkJZGF0YSA9IGF0aWl4cF9yZWFkKGNoaXAsIFBIWVNfSU5fQUREUik7CisJCWlmIChkYXRhICYgQVRJX1JFR19QSFlTX0lOX1JFQURfRkxBRykKKwkJCXJldHVybiBkYXRhID4+IEFUSV9SRUdfUEhZU19JTl9EQVRBX1NISUZUOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoLS10aW1lb3V0KTsKKwkvKiB0aW1lIG91dCBtYXkgaGFwcGVuIGR1cmluZyByZXNldCAqLworCWlmIChyZWcgPCAweDdjKQorCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYXRpaXhwOiBjb2RlYyByZWFkIHRpbWVvdXQgKHJlZyAleClcbiIsIHJlZyk7CisJcmV0dXJuIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBzbmRfYXRpaXhwX2NvZGVjX3dyaXRlKGF0aWl4cF90ICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBjb2RlYywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisgICAgCisJaWYgKHNuZF9hdGlpeHBfYWNxdWlyZV9jb2RlYyhjaGlwKSA8IDApCisJCXJldHVybjsKKwlkYXRhID0gKCh1bnNpZ25lZCBpbnQpdmFsIDw8IEFUSV9SRUdfUEhZU19PVVRfREFUQV9TSElGVCkgfAorCQkoKHVuc2lnbmVkIGludClyZWcgPDwgQVRJX1JFR19QSFlTX09VVF9BRERSX1NISUZUKSB8CisJCUFUSV9SRUdfUEhZU19PVVRfQUREUl9FTiB8IGNvZGVjOworCWF0aWl4cF93cml0ZShjaGlwLCBQSFlTX09VVF9BRERSLCBkYXRhKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2F0aWl4cF9hYzk3X3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIHNuZF9hdGlpeHBfY29kZWNfcmVhZChjaGlwLCBhYzk3LT5udW0sIHJlZyk7CisgICAgCit9CisKK3N0YXRpYyB2b2lkIHNuZF9hdGlpeHBfYWM5N193cml0ZShhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWF0aWl4cF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXNuZF9hdGlpeHBfY29kZWNfd3JpdGUoY2hpcCwgYWM5Ny0+bnVtLCByZWcsIHZhbCk7Cit9CisKKy8qCisgKiByZXNldCBBQyBsaW5rCisgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9hY2xpbmtfcmVzZXQoYXRpaXhwX3QgKmNoaXApCit7CisJaW50IHRpbWVvdXQ7CisKKwkvKiByZXNldCBwb3dlcmRvZXduICovCisJaWYgKGF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9QT1dFUkRPV04sIDApKQorCQl1ZGVsYXkoMTApOworCisJLyogcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0ICovCisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1NPRlRfUkVTRVQsIEFUSV9SRUdfQ01EX0FDX1NPRlRfUkVTRVQpOworCWF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJdWRlbGF5KDEwKTsKKwlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfQUNfU09GVF9SRVNFVCwgMCk7CisgICAgCisJdGltZW91dCA9IDEwOworCXdoaWxlICghIChhdGlpeHBfcmVhZChjaGlwLCBDTUQpICYgQVRJX1JFR19DTURfQUNMSU5LX0FDVElWRSkpIHsKKwkJLyogZG8gYSBoYXJkIHJlc2V0ICovCisJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9BQ19TWU5DfEFUSV9SRUdfQ01EX0FDX1JFU0VULAorCQkJICAgICAgQVRJX1JFR19DTURfQUNfU1lOQyk7CisJCWF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJCWRvX2RlbGF5KCk7CisJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9BQ19SRVNFVCwgQVRJX1JFR19DTURfQUNfUkVTRVQpOworCQlpZiAoLS10aW1lb3V0KSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhdGlpeHA6IGNvZGVjIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBkZWFzc2VydCBSRVNFVCBhbmQgYXNzZXJ0IFNZTkMgdG8gbWFrZSBzdXJlICovCisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1NZTkN8QVRJX1JFR19DTURfQUNfUkVTRVQsCisJCSAgICAgIEFUSV9SRUdfQ01EX0FDX1NZTkN8QVRJX1JFR19DTURfQUNfUkVTRVQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9hY2xpbmtfZG93bihhdGlpeHBfdCAqY2hpcCkKK3sKKwkvLyBpZiAoYXRpaXhwX3JlYWQoY2hpcCwgTU9ERU1fTUlSUk9SKSAmIDB4MSkgLyogbW9kZW0gcnVubmluZywgdG9vPyAqLworCS8vCXJldHVybiAtRUJVU1k7CisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsCisJCSAgICAgQVRJX1JFR19DTURfUE9XRVJET1dOIHwgQVRJX1JFR19DTURfQUNfUkVTRVQsCisJCSAgICAgQVRJX1JFR19DTURfUE9XRVJET1dOKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogYXV0by1kZXRlY3Rpb24gb2YgY29kZWNzCisgKgorICogdGhlIElYUCBjaGlwIGNhbiBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGZvciB0aGUgbm9uLWV4aXN0aW5nIGNvZGVjcy4KKyAqIE5FV19GUkFNRSBpbnRlcnJ1cHQgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZAorICogZXZlbiBpZiBhbGwgdGhyZWUgY29kZWNzIGFyZSBjb25uZWN0ZWQuCisgKi8KKworI2RlZmluZSBBTExfQ09ERUNfTk9UX1JFQURZIFwKKwkgICAgKEFUSV9SRUdfSVNSX0NPREVDMF9OT1RfUkVBRFkgfFwKKwkgICAgIEFUSV9SRUdfSVNSX0NPREVDMV9OT1RfUkVBRFkgfFwKKwkgICAgIEFUSV9SRUdfSVNSX0NPREVDMl9OT1RfUkVBRFkpCisjZGVmaW5lIENPREVDX0NIRUNLX0JJVFMgKEFMTF9DT0RFQ19OT1RfUkVBRFl8QVRJX1JFR19JU1JfTkVXX0ZSQU1FKQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY29kZWNfZGV0ZWN0KGF0aWl4cF90ICpjaGlwKQoreworCWludCB0aW1lb3V0OworCisJY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMgPSAwOworCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIENPREVDX0NIRUNLX0JJVFMpOworCS8qIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHRzICovCisJdGltZW91dCA9IEhaIC8gMTA7CisJd2hpbGUgKHRpbWVvdXQtLSA+IDApIHsKKwkJZG9fZGVsYXkoKTsKKwkJaWYgKGNoaXAtPmNvZGVjX25vdF9yZWFkeV9iaXRzKQorCQkJYnJlYWs7CisJfQorCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIDApOyAvKiBkaXNhYmxlIGlycXMgKi8KKworCWlmICgoY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMgJiBBTExfQ09ERUNfTk9UX1JFQURZKSA9PSBBTExfQ09ERUNfTk9UX1JFQURZKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImF0aWl4cDogbm8gY29kZWMgZGV0ZWN0ZWQhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGVuYWJsZSBETUEgYW5kIGlycXMKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX2NoaXBfc3RhcnQoYXRpaXhwX3QgKmNoaXApCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCS8qIHNldCB1cCBzcGRpZiwgZW5hYmxlIGJ1cnN0IG1vZGUgKi8KKwlyZWcgPSBhdGlpeHBfcmVhZChjaGlwLCBDTUQpOworCXJlZyB8PSAweDAyIDw8IEFUSV9SRUdfQ01EX1NQREZfVEhSRVNIT0xEX1NISUZUOworCXJlZyB8PSBBVElfUkVHX0NNRF9CVVJTVF9FTjsKKwlhdGlpeHBfd3JpdGUoY2hpcCwgQ01ELCByZWcpOworCisJcmVnID0gYXRpaXhwX3JlYWQoY2hpcCwgU1BERl9DTUQpOworCXJlZyAmPSB+KEFUSV9SRUdfU1BERl9DTURfTEZTUnxBVElfUkVHX1NQREZfQ01EX1NJTkdMRV9DSCk7CisJYXRpaXhwX3dyaXRlKGNoaXAsIFNQREZfQ01ELCByZWcpOworCisJLyogY2xlYXIgYWxsIGludGVycnVwdCBzb3VyY2UgKi8KKwlhdGlpeHBfd3JpdGUoY2hpcCwgSVNSLCAweGZmZmZmZmZmKTsKKwkvKiBlbmFibGUgaXJxcyAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsCisJCSAgICAgQVRJX1JFR19JRVJfSU9fU1RBVFVTX0VOIHwKKwkJICAgICBBVElfUkVHX0lFUl9JTl9YUlVOX0VOIHwKKwkJICAgICBBVElfUkVHX0lFUl9PVVRfWFJVTl9FTiB8CisJCSAgICAgQVRJX1JFR19JRVJfU1BERl9YUlVOX0VOIHwKKwkJICAgICBBVElfUkVHX0lFUl9TUERGX1NUQVRVU19FTik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGRpc2FibGUgRE1BIGFuZCBJUlFzCisgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9jaGlwX3N0b3AoYXRpaXhwX3QgKmNoaXApCit7CisJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZSAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJU1IsIGF0aWl4cF9yZWFkKGNoaXAsIElTUikpOworCS8qIGRpc2FibGUgaXJxcyAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQQ00gc2VjdGlvbgorICovCisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrIHNpbXBsbHkgcmVhZHMgWFhYX0RNQV9EVF9DVVIgcmVnaXN0ZXIgYXMgdGhlIGN1cnJlbnQKKyAqIHBvc2l0aW9uLiAgd2hlbiBTRy1idWZmZXIgaXMgaW1wbGVtZW50ZWQsIHRoZSBvZmZzZXQgbXVzdCBiZSBjYWxjdWxhdGVkCisgKiBjb3JyZWN0bHkuLi4KKyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hdGlpeHBfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWF0aWl4cF9kbWFfdCAqZG1hID0gKGF0aWl4cF9kbWFfdCAqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3VycHRyOworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJY3VycHRyID0gcmVhZGwoY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5kdF9jdXIpOworCQlpZiAoY3VycHRyIDwgZG1hLT5idWZfYWRkcikKKwkJCWNvbnRpbnVlOworCQljdXJwdHIgLT0gZG1hLT5idWZfYWRkcjsKKwkJaWYgKGN1cnB0ciA+PSBkbWEtPmJ1Zl9ieXRlcykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGN1cnB0cik7CisJfQorCXNuZF9wcmludGQoImF0aWl4cDogaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCisJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBYUlVOIGRldGVjdGVkLCBhbmQgc3RvcCB0aGUgUENNIHN1YnN0cmVhbQorICovCitzdGF0aWMgdm9pZCBzbmRfYXRpaXhwX3hydW5fZG1hKGF0aWl4cF90ICpjaGlwLCBhdGlpeHBfZG1hX3QgKmRtYSkKK3sKKwlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKKwkJcmV0dXJuOworCXNuZF9wcmludGRkKCJhdGlpeHA6IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKK30KKworLyoKKyAqIHRoZSBwZXJpb2QgYWNrLiAgdXBkYXRlIHRoZSBzdWJzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9hdGlpeHBfdXBkYXRlX2RtYShhdGlpeHBfdCAqY2hpcCwgYXRpaXhwX2RtYV90ICpkbWEpCit7CisJaWYgKCEgZG1hLT5zdWJzdHJlYW0gfHwgISBkbWEtPnJ1bm5pbmcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGRtYS0+c3Vic3RyZWFtKTsKK30KKworLyogc2V0IEJVU19CVVNZIGludGVycnVwdCBiaXQgaWYgYW55IERNQSBpcyBydW5uaW5nICovCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgc25kX2F0aWl4cF9jaGVja19idXNfYnVzeShhdGlpeHBfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgYnVzX2J1c3k7CisJaWYgKGF0aWl4cF9yZWFkKGNoaXAsIENNRCkgJiAoQVRJX1JFR19DTURfU0VORF9FTiB8CisJCQkJICAgICAgQVRJX1JFR19DTURfUkVDRUlWRV9FTiB8CisJCQkJICAgICAgQVRJX1JFR19DTURfU1BERl9PVVRfRU4pKQorCQlidXNfYnVzeSA9IEFUSV9SRUdfSUVSX1NFVF9CVVNfQlVTWTsKKwllbHNlCisJCWJ1c19idXN5ID0gMDsKKwlhdGlpeHBfdXBkYXRlKGNoaXAsIElFUiwgQVRJX1JFR19JRVJfU0VUX0JVU19CVVNZLCBidXNfYnVzeSk7Cit9CisKKy8qIGNvbW1vbiB0cmlnZ2VyIGNhbGxiYWNrCisgKiBjYWxsaW5nIHRoZSBsb3dsZXZlbCBjYWxsYmFja3MgaW4gaXQKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlhdGlpeHBfZG1hX3QgKmRtYSA9IChhdGlpeHBfZG1hX3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCXNuZF9hc3NlcnQoZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlciAmJiBkbWEtPm9wcy0+Zmx1c2hfZG1hLCByZXR1cm4gLUVJTlZBTCk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWRtYS0+b3BzLT5lbmFibGVfdHJhbnNmZXIoY2hpcCwgMSk7CisJCWRtYS0+cnVubmluZyA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlcihjaGlwLCAwKTsKKwkJZG1hLT5ydW5uaW5nID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmICghIGVycikgeworCQlzbmRfYXRpaXhwX2NoZWNrX2J1c19idXN5KGNoaXApOworCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUT1ApIHsKKwkJCWRtYS0+b3BzLT5mbHVzaF9kbWEoY2hpcCk7CisJCQlzbmRfYXRpaXhwX2NoZWNrX2J1c19idXN5KGNoaXApOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogbG93bGV2ZWwgY2FsbGJhY2tzIGZvciBlYWNoIERNQSB0eXBlCisgKgorICogZXZlcnkgY2FsbGJhY2sgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGluIGNoaXAtPnJlZ19sb2NrIHNwaW5sb2NrCisgKi8KKworLyogZmx1c2ggRklGTyBvZiBhbmFsb2cgT1VUIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX291dF9mbHVzaF9kbWEoYXRpaXhwX3QgKmNoaXApCit7CisJYXRpaXhwX3dyaXRlKGNoaXAsIEZJRk9fRkxVU0gsIEFUSV9SRUdfRklGT19PVVRfRkxVU0gpOworfQorCisvKiBlbmFibGUvZGlzYWJsZSBhbmFsb2cgT1VUIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX291dF9lbmFibGVfZG1hKGF0aWl4cF90ICpjaGlwLCBpbnQgb24pCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJZGF0YSA9IGF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJaWYgKG9uKSB7CisJCWlmIChkYXRhICYgQVRJX1JFR19DTURfT1VUX0RNQV9FTikKKwkJCXJldHVybjsKKwkJYXRpaXhwX291dF9mbHVzaF9kbWEoY2hpcCk7CisJCWRhdGEgfD0gQVRJX1JFR19DTURfT1VUX0RNQV9FTjsKKwl9IGVsc2UKKwkJZGF0YSAmPSB+QVRJX1JFR19DTURfT1VUX0RNQV9FTjsKKwlhdGlpeHBfd3JpdGUoY2hpcCwgQ01ELCBkYXRhKTsKK30KKworLyogc3RhcnQvc3RvcCB0cmFuc2ZlciBvdmVyIE9VVCBETUEgKi8KK3N0YXRpYyB2b2lkIGF0aWl4cF9vdXRfZW5hYmxlX3RyYW5zZmVyKGF0aWl4cF90ICpjaGlwLCBpbnQgb24pCit7CisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX1NFTkRfRU4sCisJCSAgICAgIG9uID8gQVRJX1JFR19DTURfU0VORF9FTiA6IDApOworfQorCisvKiBlbmFibGUvZGlzYWJsZSBhbmFsb2cgSU4gRE1BICovCitzdGF0aWMgdm9pZCBhdGlpeHBfaW5fZW5hYmxlX2RtYShhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9JTl9ETUFfRU4sCisJCSAgICAgIG9uID8gQVRJX1JFR19DTURfSU5fRE1BX0VOIDogMCk7Cit9CisKKy8qIHN0YXJ0L3N0b3AgYW5hbG9nIElOIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX2luX2VuYWJsZV90cmFuc2ZlcihhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCWlmIChvbikgeworCQl1bnNpZ25lZCBpbnQgZGF0YSA9IGF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJCWlmICghIChkYXRhICYgQVRJX1JFR19DTURfUkVDRUlWRV9FTikpIHsKKwkJCWRhdGEgfD0gQVRJX1JFR19DTURfUkVDRUlWRV9FTjsKKyNpZiAwIC8qIEZJWE1FOiB0aGlzIGNhdXNlcyB0aGUgZW5kbGVzcyBsb29wICovCisJCQkvKiB3YWl0IHVudGlsIHNsb3QgMy80IGFyZSBmaW5pc2hlZCAqLworCQkJd2hpbGUgKChhdGlpeHBfcmVhZChjaGlwLCBDT1VOVEVSKSAmCisJCQkJQVRJX1JFR19DT1VOVEVSX1NMT1QpICE9IDUpCisJCQkJOworI2VuZGlmCisJCQlhdGlpeHBfd3JpdGUoY2hpcCwgQ01ELCBkYXRhKTsKKwkJfQorCX0gZWxzZQorCQlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfUkVDRUlWRV9FTiwgMCk7Cit9CisKKy8qIGZsdXNoIEZJRk8gb2YgYW5hbG9nIElOIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX2luX2ZsdXNoX2RtYShhdGlpeHBfdCAqY2hpcCkKK3sKKwlhdGlpeHBfd3JpdGUoY2hpcCwgRklGT19GTFVTSCwgQVRJX1JFR19GSUZPX0lOX0ZMVVNIKTsKK30KKworLyogZW5hYmxlL2Rpc2FibGUgU1BESUYgT1VUIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX3NwZGlmX2VuYWJsZV9kbWEoYXRpaXhwX3QgKmNoaXAsIGludCBvbikKK3sKKwlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfU1BERl9ETUFfRU4sCisJCSAgICAgIG9uID8gQVRJX1JFR19DTURfU1BERl9ETUFfRU4gOiAwKTsKK30KKworLyogc3RhcnQvc3RvcCBTUERJRiBPVVQgRE1BICovCitzdGF0aWMgdm9pZCBhdGlpeHBfc3BkaWZfZW5hYmxlX3RyYW5zZmVyKGF0aWl4cF90ICpjaGlwLCBpbnQgb24pCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJZGF0YSA9IGF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJaWYgKG9uKQorCQlkYXRhIHw9IEFUSV9SRUdfQ01EX1NQREZfT1VUX0VOOworCWVsc2UKKwkJZGF0YSAmPSB+QVRJX1JFR19DTURfU1BERl9PVVRfRU47CisJYXRpaXhwX3dyaXRlKGNoaXAsIENNRCwgZGF0YSk7Cit9CisKKy8qIGZsdXNoIEZJRk8gb2YgU1BESUYgT1VUIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX3NwZGlmX2ZsdXNoX2RtYShhdGlpeHBfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dDsKKworCS8qIERNQSBvZmYsIHRyYW5zZmVyIG9uICovCisJYXRpaXhwX3NwZGlmX2VuYWJsZV9kbWEoY2hpcCwgMCk7CisJYXRpaXhwX3NwZGlmX2VuYWJsZV90cmFuc2ZlcihjaGlwLCAxKTsKKwkKKwl0aW1lb3V0ID0gMTAwOworCWRvIHsKKwkJaWYgKCEgKGF0aWl4cF9yZWFkKGNoaXAsIFNQREZfRE1BX0RUX1NJWkUpICYgQVRJX1JFR19ETUFfRklGT19VU0VEKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAodGltZW91dC0tID4gMCk7CisKKwlhdGlpeHBfc3BkaWZfZW5hYmxlX3RyYW5zZmVyKGNoaXAsIDApOworfQorCisvKiBzZXQgdXAgc2xvdHMgYW5kIGZvcm1hdHMgZm9yIFNQRElGIE9VVCAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX3NwZGlmX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWlmIChjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykgeworCQl1bnNpZ25lZCBpbnQgZGF0YTsKKwkJLyogZW5hYmxlIHNsb3RzIDEwLzExICovCisJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9TUERGX0NPTkZJR19NQVNLLAorCQkJICAgICAgQVRJX1JFR19DTURfU1BERl9DT05GSUdfMDEpOworCQlkYXRhID0gYXRpaXhwX3JlYWQoY2hpcCwgT1VUX0RNQV9TTE9UKSAmIH5BVElfUkVHX09VVF9ETUFfU0xPVF9NQVNLOworCQlkYXRhIHw9IEFUSV9SRUdfT1VUX0RNQV9TTE9UX0JJVCgxMCkgfAorCQkJQVRJX1JFR19PVVRfRE1BX1NMT1RfQklUKDExKTsKKwkJZGF0YSB8PSAweDA0IDw8IEFUSV9SRUdfT1VUX0RNQV9USFJFU0hPTERfU0hJRlQ7CisJCWF0aWl4cF93cml0ZShjaGlwLCBPVVRfRE1BX1NMT1QsIGRhdGEpOworCQlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfSU5URVJMRUFWRV9PVVQsCisJCQkgICAgICBzdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSA/CisJCQkgICAgICBBVElfUkVHX0NNRF9JTlRFUkxFQVZFX09VVCA6IDApOworCX0gZWxzZSB7CisJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9TUERGX0NPTkZJR19NQVNLLCAwKTsKKwkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfU1BERiwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKiBzZXQgdXAgc2xvdHMgYW5kIGZvcm1hdHMgZm9yIGFuYWxvZyBPVVQgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlkYXRhID0gYXRpaXhwX3JlYWQoY2hpcCwgT1VUX0RNQV9TTE9UKSAmIH5BVElfUkVHX09VVF9ETUFfU0xPVF9NQVNLOworCXN3aXRjaCAoc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscykgeworCWNhc2UgODoKKwkJZGF0YSB8PSBBVElfUkVHX09VVF9ETUFfU0xPVF9CSVQoMTApIHwKKwkJCUFUSV9SRUdfT1VUX0RNQV9TTE9UX0JJVCgxMSk7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSA2OgorCQlkYXRhIHw9IEFUSV9SRUdfT1VUX0RNQV9TTE9UX0JJVCg3KSB8CisJCQlBVElfUkVHX09VVF9ETUFfU0xPVF9CSVQoOCk7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSA0OgorCQlkYXRhIHw9IEFUSV9SRUdfT1VUX0RNQV9TTE9UX0JJVCg2KSB8CisJCQlBVElfUkVHX09VVF9ETUFfU0xPVF9CSVQoOSk7CisJCS8qIGZhbGx0aHJ1ICovCisJZGVmYXVsdDoKKwkJZGF0YSB8PSBBVElfUkVHX09VVF9ETUFfU0xPVF9CSVQoMykgfAorCQkJQVRJX1JFR19PVVRfRE1BX1NMT1RfQklUKDQpOworCQlicmVhazsKKwl9CisKKwkvKiBzZXQgb3V0cHV0IHRocmVzaG9sZCAqLworCWRhdGEgfD0gMHgwNCA8PCBBVElfUkVHX09VVF9ETUFfVEhSRVNIT0xEX1NISUZUOworCWF0aWl4cF93cml0ZShjaGlwLCBPVVRfRE1BX1NMT1QsIGRhdGEpOworCisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfT1VULAorCQkgICAgICBzdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSA/CisJCSAgICAgIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfT1VUIDogMCk7CisKKwkvKgorCSAqIGVuYWJsZSA2IGNoYW5uZWwgcmUtb3JkZXJpbmcgYml0IGlmIG5lZWRlZAorCSAqLworCWF0aWl4cF91cGRhdGUoY2hpcCwgNkNIX1JFT1JERVIsIEFUSV9SRUdfNkNIX1JFT1JERVJfRU4sCisJCSAgICAgIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMgPj0gNiA/IEFUSV9SRUdfNkNIX1JFT1JERVJfRU46IDApOworICAgIAorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKiBzZXQgdXAgc2xvdHMgYW5kIGZvcm1hdHMgZm9yIGFuYWxvZyBJTiAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX2NhcHR1cmVfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0lOVEVSTEVBVkVfSU4sCisJCSAgICAgIHN1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFID8KKwkJICAgICAgQVRJX1JFR19DTURfSU5URVJMRUFWRV9JTiA6IDApOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKgorICogaHdfcGFyYW1zIC0gYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgc2V0IHVwIGJ1ZmZlciBkZXNjcmlwdG9ycworICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgc25kX3BjbV9od19wYXJhbXNfdCAqaHdfcGFyYW1zKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWF0aWl4cF9kbWFfdCAqZG1hID0gKGF0aWl4cF9kbWFfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRtYS0+YnVmX2FkZHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCWRtYS0+YnVmX2J5dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpOworCisJZXJyID0gYXRpaXhwX2J1aWxkX2RtYV9wYWNrZXRzKGNoaXAsIGRtYSwgc3Vic3RyZWFtLAorCQkJCSAgICAgICBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpLAorCQkJCSAgICAgICBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGRtYS0+YWM5N19wY21fdHlwZSA+PSAwKSB7CisJCXN0cnVjdCBhYzk3X3BjbSAqcGNtID0gY2hpcC0+cGNtc1tkbWEtPmFjOTdfcGNtX3R5cGVdOworCQkvKiBQQ00gaXMgYm91bmQgdG8gQUM5NyBjb2RlYyhzKQorCQkgKiBzZXQgdXAgdGhlIEFDOTcgY29kZWNzCisJCSAqLworCQlpZiAoZG1hLT5wY21fb3Blbl9mbGFnKSB7CisJCQlzbmRfYWM5N19wY21fY2xvc2UocGNtKTsKKwkJCWRtYS0+cGNtX29wZW5fZmxhZyA9IDA7CisJCX0KKwkJZXJyID0gc25kX2FjOTdfcGNtX29wZW4ocGNtLCBwYXJhbXNfcmF0ZShod19wYXJhbXMpLAorCQkJCQlwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSwKKwkJCQkJcGNtLT5yWzBdLnNsb3RzKTsKKwkJaWYgKGVyciA+PSAwKQorCQkJZG1hLT5wY21fb3Blbl9mbGFnID0gMTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfcGNtX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlhdGlpeHBfZG1hX3QgKmRtYSA9IChhdGlpeHBfZG1hX3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChkbWEtPnBjbV9vcGVuX2ZsYWcpIHsKKwkJc3RydWN0IGFjOTdfcGNtICpwY20gPSBjaGlwLT5wY21zW2RtYS0+YWM5N19wY21fdHlwZV07CisJCXNuZF9hYzk3X3BjbV9jbG9zZShwY20pOworCQlkbWEtPnBjbV9vcGVuX2ZsYWcgPSAwOworCX0KKwlhdGlpeHBfY2xlYXJfZG1hX3BhY2tldHMoY2hpcCwgZG1hLCBzdWJzdHJlYW0pOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcGNtIGhhcmR3YXJlIGRlZmluaXRpb24sIGlkZW50aWNhbCBmb3IgYWxsIERNQSB0eXBlcworICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9hdGlpeHBfcGNtX2h3ID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTIsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMjU2ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJQVRJX01BWF9ERVNDUklQVE9SUywKK307CisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9wY21fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGF0aWl4cF9kbWFfdCAqZG1hLCBpbnQgcGNtX3R5cGUpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCXNuZF9hc3NlcnQoZG1hLT5vcHMgJiYgZG1hLT5vcHMtPmVuYWJsZV9kbWEsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChkbWEtPm9wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlkbWEtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9hdGlpeHBfcGNtX2h3OworCWRtYS0+YWM5N19wY21fdHlwZSA9IHBjbV90eXBlOworCWlmIChwY21fdHlwZSA+PSAwKSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVzID0gY2hpcC0+cGNtc1twY21fdHlwZV0tPnJhdGVzOworCQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCX0gZWxzZSB7CisJCS8qIGRpcmVjdCBTUERJRiAqLworCQlydW50aW1lLT5ody5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9JRUM5NThfU1VCRlJBTUVfTEU7CisJfQorCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZG1hOworCisJLyogZW5hYmxlIERNQSBiaXRzICovCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNoaXAsIDEpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWRtYS0+b3BlbmVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgYXRpaXhwX2RtYV90ICpkbWEpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJLyogZGlzYWJsZSBETUEgYml0cyAqLworCXNuZF9hc3NlcnQoZG1hLT5vcHMgJiYgZG1hLT5vcHMtPmVuYWJsZV9kbWEsIHJldHVybiAtRUlOVkFMKTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZG1hLT5zdWJzdHJlYW0gPSBOVUxMOworCWRtYS0+b3BlbmVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBlcnI7CisKKwlkb3duKCZjaGlwLT5vcGVuX211dGV4KTsKKwllcnIgPSBzbmRfYXRpaXhwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10sIDApOworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNoaXAtPm1heF9jaGFubmVsczsKKwlpZiAoY2hpcC0+bWF4X2NoYW5uZWxzID4gMikKKwkJLyogY2hhbm5lbHMgbXVzdCBiZSBldmVuICovCisJCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXRpaXhwX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCWRvd24oJmNoaXAtPm9wZW5fbXV0ZXgpOworCWVyciA9IHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10pOworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX2F0aWl4cF9wY21fb3BlbihzdWJzdHJlYW0sICZjaGlwLT5kbWFzW0FUSV9ETUFfQ0FQVFVSRV0sIDEpOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9DQVBUVVJFXSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCWRvd24oJmNoaXAtPm9wZW5fbXV0ZXgpOworCWlmIChjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykgLyogc2hhcmUgRE1BX1BMQVlCQUNLICovCisJCWVyciA9IHNuZF9hdGlpeHBfcGNtX29wZW4oc3Vic3RyZWFtLCAmY2hpcC0+ZG1hc1tBVElfRE1BX1BMQVlCQUNLXSwgMik7CisJZWxzZQorCQllcnIgPSBzbmRfYXRpaXhwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9TUERJRl0sIC0xKTsKKwl1cCgmY2hpcC0+b3Blbl9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbmRfYXRpaXhwX3NwZGlmX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCWRvd24oJmNoaXAtPm9wZW5fbXV0ZXgpOworCWlmIChjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykKKwkJZXJyID0gc25kX2F0aWl4cF9wY21fY2xvc2Uoc3Vic3RyZWFtLCAmY2hpcC0+ZG1hc1tBVElfRE1BX1BMQVlCQUNLXSk7CisJZWxzZQorCQllcnIgPSBzbmRfYXRpaXhwX3BjbV9jbG9zZShzdWJzdHJlYW0sICZjaGlwLT5kbWFzW0FUSV9ETUFfU1BESUZdKTsKKwl1cCgmY2hpcC0+b3Blbl9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyogQUM5NyBwbGF5YmFjayAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2F0aWl4cF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9hdGlpeHBfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hdGlpeHBfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfYXRpaXhwX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYXRpaXhwX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2F0aWl4cF9wY21fcG9pbnRlciwKK307CisKKy8qIEFDOTcgY2FwdHVyZSAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfYXRpaXhwX2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYXRpaXhwX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hdGlpeHBfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfYXRpaXhwX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9hdGlpeHBfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfYXRpaXhwX3BjbV9wb2ludGVyLAorfTsKKworLyogU1BESUYgcGxheWJhY2sgKi8KK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9hdGlpeHBfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF9hdGlpeHBfc3BkaWZfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYXRpaXhwX3NwZGlmX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfYXRpaXhwX3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfYXRpaXhwX3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2F0aWl4cF9zcGRpZl9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2F0aWl4cF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9hdGlpeHBfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGFjOTdfcGNtIGF0aWl4cF9wY21fZGVmc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogZnJvbnQgUENNICovCisJeworCQkuZXhjbHVzaXZlID0gMSwKKwkJLnIgPSB7CXsKKwkJCQkuc2xvdHMgPSAoMSA8PCBBQzk3X1NMT1RfUENNX0xFRlQpIHwKKwkJCQkJICgxIDw8IEFDOTdfU0xPVF9QQ01fUklHSFQpIHwKKwkJCQkJICgxIDw8IEFDOTdfU0xPVF9QQ01fQ0VOVEVSKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX1NMRUZUKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX1NSSUdIVCkgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX0xGRSkKKwkJCX0KKwkJfQorCX0sCisJLyogUENNIElOICMxICovCisJeworCQkuc3RyZWFtID0gMSwKKwkJLmV4Y2x1c2l2ZSA9IDEsCisJCS5yID0gewl7CisJCQkJLnNsb3RzID0gKDEgPDwgQUM5N19TTE9UX1BDTV9MRUZUKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX1JJR0hUKQorCQkJfQorCQl9CisJfSwKKwkvKiBTL1BESUYgT1VUIChvcHRpb25hbCkgKi8KKwl7CisJCS5leGNsdXNpdmUgPSAxLAorCQkuc3BkaWYgPSAxLAorCQkuciA9IHsJeworCQkJCS5zbG90cyA9ICgxIDw8IEFDOTdfU0xPVF9TUERJRl9MRUZUMikgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1NQRElGX1JJR0hUMikKKwkJCX0KKwkJfQorCX0sCit9OworCitzdGF0aWMgYXRpaXhwX2RtYV9vcHNfdCBzbmRfYXRpaXhwX3BsYXliYWNrX2RtYV9vcHMgPSB7CisJLnR5cGUgPSBBVElfRE1BX1BMQVlCQUNLLAorCS5sbHBfb2Zmc2V0ID0gQVRJX1JFR19PVVRfRE1BX0xJTktQVFIsCisJLmR0X2N1ciA9IEFUSV9SRUdfT1VUX0RNQV9EVF9DVVIsCisJLmVuYWJsZV9kbWEgPSBhdGlpeHBfb3V0X2VuYWJsZV9kbWEsCisJLmVuYWJsZV90cmFuc2ZlciA9IGF0aWl4cF9vdXRfZW5hYmxlX3RyYW5zZmVyLAorCS5mbHVzaF9kbWEgPSBhdGlpeHBfb3V0X2ZsdXNoX2RtYSwKK307CisJCitzdGF0aWMgYXRpaXhwX2RtYV9vcHNfdCBzbmRfYXRpaXhwX2NhcHR1cmVfZG1hX29wcyA9IHsKKwkudHlwZSA9IEFUSV9ETUFfQ0FQVFVSRSwKKwkubGxwX29mZnNldCA9IEFUSV9SRUdfSU5fRE1BX0xJTktQVFIsCisJLmR0X2N1ciA9IEFUSV9SRUdfSU5fRE1BX0RUX0NVUiwKKwkuZW5hYmxlX2RtYSA9IGF0aWl4cF9pbl9lbmFibGVfZG1hLAorCS5lbmFibGVfdHJhbnNmZXIgPSBhdGlpeHBfaW5fZW5hYmxlX3RyYW5zZmVyLAorCS5mbHVzaF9kbWEgPSBhdGlpeHBfaW5fZmx1c2hfZG1hLAorfTsKKwkKK3N0YXRpYyBhdGlpeHBfZG1hX29wc190IHNuZF9hdGlpeHBfc3BkaWZfZG1hX29wcyA9IHsKKwkudHlwZSA9IEFUSV9ETUFfU1BESUYsCisJLmxscF9vZmZzZXQgPSBBVElfUkVHX1NQREZfRE1BX0xJTktQVFIsCisJLmR0X2N1ciA9IEFUSV9SRUdfU1BERl9ETUFfRFRfQ1VSLAorCS5lbmFibGVfZG1hID0gYXRpaXhwX3NwZGlmX2VuYWJsZV9kbWEsCisJLmVuYWJsZV90cmFuc2ZlciA9IGF0aWl4cF9zcGRpZl9lbmFibGVfdHJhbnNmZXIsCisJLmZsdXNoX2RtYSA9IGF0aWl4cF9zcGRpZl9mbHVzaF9kbWEsCit9OworCQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYXRpaXhwX3BjbV9uZXcoYXRpaXhwX3QgKmNoaXApCit7CisJc25kX3BjbV90ICpwY207CisJYWM5N19idXNfdCAqcGJ1cyA9IGNoaXAtPmFjOTdfYnVzOworCWludCBlcnIsIGksIG51bV9wY21zOworCisJLyogaW5pdGlhbGl6ZSBjb25zdGFudHMgKi8KKwljaGlwLT5kbWFzW0FUSV9ETUFfUExBWUJBQ0tdLm9wcyA9ICZzbmRfYXRpaXhwX3BsYXliYWNrX2RtYV9vcHM7CisJY2hpcC0+ZG1hc1tBVElfRE1BX0NBUFRVUkVdLm9wcyA9ICZzbmRfYXRpaXhwX2NhcHR1cmVfZG1hX29wczsKKwlpZiAoISBjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykKKwkJY2hpcC0+ZG1hc1tBVElfRE1BX1NQRElGXS5vcHMgPSAmc25kX2F0aWl4cF9zcGRpZl9kbWFfb3BzOworCisJLyogYXNzaWduIEFDOTcgcGNtICovCisJaWYgKGNoaXAtPnNwZGlmX292ZXJfYWNsaW5rKQorCQludW1fcGNtcyA9IDM7CisJZWxzZQorCQludW1fcGNtcyA9IDI7CisJZXJyID0gc25kX2FjOTdfcGNtX2Fzc2lnbihwYnVzLCBudW1fcGNtcywgYXRpaXhwX3BjbV9kZWZzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BjbXM7IGkrKykKKwkJY2hpcC0+cGNtc1tpXSA9ICZwYnVzLT5wY21zW2ldOworCisJY2hpcC0+bWF4X2NoYW5uZWxzID0gMjsKKwlpZiAocGJ1cy0+cGNtc1tBVElfUENNX09VVF0uclswXS5zbG90cyAmICgxIDw8IEFDOTdfU0xPVF9QQ01fU0xFRlQpKSB7CisJCWlmIChwYnVzLT5wY21zW0FUSV9QQ01fT1VUXS5yWzBdLnNsb3RzICYgKDEgPDwgQUM5N19TTE9UX0xGRSkpCisJCQljaGlwLT5tYXhfY2hhbm5lbHMgPSA2OworCQllbHNlCisJCQljaGlwLT5tYXhfY2hhbm5lbHMgPSA0OworCX0KKworCS8qIFBDTSAjMDogYW5hbG9nIEkvTyAqLworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBVEkgSVhQIEFDOTciLCBBVElfUENNREVWX0FOQUxPRywgMSwgMSwgJnBjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9hdGlpeHBfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfYXRpaXhwX2NhcHR1cmVfb3BzKTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIkFUSSBJWFAgQUM5NyIpOworCWNoaXAtPnBjbWRldnNbQVRJX1BDTURFVl9BTkFMT0ddID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCAxMjgqMTAyNCk7CisKKwkvKiBubyBTUERJRiBzdXBwb3J0IG9uIGNvZGVjPyAqLworCWlmIChjaGlwLT5wY21zW0FUSV9QQ01fU1BESUZdICYmICEgY2hpcC0+cGNtc1tBVElfUENNX1NQRElGXS0+cmF0ZXMpCisJCXJldHVybiAwOworCQkKKwkvKiBGSVhNRTogbm9uLTQ4ayBzYW1wbGUgcmF0ZSBkb2Vzbid0IHdvcmsgb24gbXkgdGVzdCBtYWNoaW5lIHdpdGggQUQxODg4ICovCisJaWYgKGNoaXAtPnBjbXNbQVRJX1BDTV9TUERJRl0pCisJCWNoaXAtPnBjbXNbQVRJX1BDTV9TUERJRl0tPnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CisKKwkvKiBQQ00gIzE6IHNwZGlmIHBsYXliYWNrICovCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkFUSSBJWFAgSUVDOTU4IiwgQVRJX1BDTURFVl9ESUdJVEFMLCAxLCAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2F0aWl4cF9zcGRpZl9vcHMpOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlpZiAoY2hpcC0+c3BkaWZfb3Zlcl9hY2xpbmspCisJCXN0cmNweShwY20tPm5hbWUsICJBVEkgSVhQIElFQzk1OCAoQUM5NykiKTsKKwllbHNlCisJCXN0cmNweShwY20tPm5hbWUsICJBVEkgSVhQIElFQzk1OCAoRGlyZWN0KSIpOworCWNoaXAtPnBjbWRldnNbQVRJX1BDTURFVl9ESUdJVEFMXSA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJLyogcHJlLXNlbGVjdCBBQzk3IFNQRElGIHNsb3RzIDEwLzExICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9BVElfQ09ERUNTOyBpKyspIHsKKwkJaWYgKGNoaXAtPmFjOTdbaV0pCisJCQlzbmRfYWM5N191cGRhdGVfYml0cyhjaGlwLT5hYzk3W2ldLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgMHgwMyA8PCA0LCAweDAzIDw8IDQpOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyoKKyAqIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfYXRpaXhwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWF0aWl4cF90ICpjaGlwID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBhdGlpeHBfcmVhZChjaGlwLCBJU1IpOworCisJaWYgKCEgc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBwcm9jZXNzIGF1ZGlvIERNQSAqLworCWlmIChzdGF0dXMgJiBBVElfUkVHX0lTUl9PVVRfWFJVTikKKwkJc25kX2F0aWl4cF94cnVuX2RtYShjaGlwLCAgJmNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10pOworCWVsc2UgaWYgKHN0YXR1cyAmIEFUSV9SRUdfSVNSX09VVF9TVEFUVVMpCisJCXNuZF9hdGlpeHBfdXBkYXRlX2RtYShjaGlwLCAmY2hpcC0+ZG1hc1tBVElfRE1BX1BMQVlCQUNLXSk7CisJaWYgKHN0YXR1cyAmIEFUSV9SRUdfSVNSX0lOX1hSVU4pCisJCXNuZF9hdGlpeHBfeHJ1bl9kbWEoY2hpcCwgICZjaGlwLT5kbWFzW0FUSV9ETUFfQ0FQVFVSRV0pOworCWVsc2UgaWYgKHN0YXR1cyAmIEFUSV9SRUdfSVNSX0lOX1NUQVRVUykKKwkJc25kX2F0aWl4cF91cGRhdGVfZG1hKGNoaXAsICZjaGlwLT5kbWFzW0FUSV9ETUFfQ0FQVFVSRV0pOworCWlmICghIGNoaXAtPnNwZGlmX292ZXJfYWNsaW5rKSB7CisJCWlmIChzdGF0dXMgJiBBVElfUkVHX0lTUl9TUERGX1hSVU4pCisJCQlzbmRfYXRpaXhwX3hydW5fZG1hKGNoaXAsICAmY2hpcC0+ZG1hc1tBVElfRE1BX1NQRElGXSk7CisJCWVsc2UgaWYgKHN0YXR1cyAmIEFUSV9SRUdfSVNSX1NQREZfU1RBVFVTKQorCQkJc25kX2F0aWl4cF91cGRhdGVfZG1hKGNoaXAsICZjaGlwLT5kbWFzW0FUSV9ETUFfU1BESUZdKTsKKwl9CisKKwkvKiBmb3IgY29kZWMgZGV0ZWN0aW9uICovCisJaWYgKHN0YXR1cyAmIENPREVDX0NIRUNLX0JJVFMpIHsKKwkJdW5zaWduZWQgaW50IGRldGVjdGVkOworCQlkZXRlY3RlZCA9IHN0YXR1cyAmIENPREVDX0NIRUNLX0JJVFM7CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQljaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyB8PSBkZXRlY3RlZDsKKwkJYXRpaXhwX3VwZGF0ZShjaGlwLCBJRVIsIGRldGVjdGVkLCAwKTsgLyogZGlzYWJsZSB0aGUgZGV0ZWN0ZWQgaXJxcyAqLworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCX0KKworCS8qIGFjayAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJU1IsIHN0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoKKyAqIGFjOTcgbWl4ZXIgc2VjdGlvbgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYWM5N19xdWlyayBhYzk3X3F1aXJrc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgwMDZiLAorCQkubmFtZSA9ICJIUCBQYXZpbGlvbiBaVjUwMzBVUyIsCisJCS50eXBlID0gQUM5N19UVU5FX01VVEVfTEVECisJfSwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F0aWl4cF9taXhlcl9uZXcoYXRpaXhwX3QgKmNoaXAsIGludCBjbG9jaywgY29uc3QgY2hhciAqcXVpcmtfb3ZlcnJpZGUpCit7CisJYWM5N19idXNfdCAqcGJ1czsKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwlpbnQgaSwgZXJyOworCWludCBjb2RlY19jb3VudDsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSBzbmRfYXRpaXhwX2FjOTdfd3JpdGUsCisJCS5yZWFkID0gc25kX2F0aWl4cF9hYzk3X3JlYWQsCisJfTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVjX3NraXBbTlVNX0FUSV9DT0RFQ1NdID0geworCQlBVElfUkVHX0lTUl9DT0RFQzBfTk9UX1JFQURZLAorCQlBVElfUkVHX0lTUl9DT0RFQzFfTk9UX1JFQURZLAorCQlBVElfUkVHX0lTUl9DT0RFQzJfTk9UX1JFQURZLAorCX07CisKKwlpZiAoc25kX2F0aWl4cF9jb2RlY19kZXRlY3QoY2hpcCkgPCAwKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2hpcC0+Y2FyZCwgMCwgJm9wcywgY2hpcCwgJnBidXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcGJ1cy0+Y2xvY2sgPSBjbG9jazsKKwlwYnVzLT5zaGFyZWRfdHlwZSA9IEFDOTdfU0hBUkVEX1RZUEVfQVRJSVhQOwkvKiBzaGFyZWQgd2l0aCBtb2RlbSBkcml2ZXIgKi8KKwljaGlwLT5hYzk3X2J1cyA9IHBidXM7CisKKwljb2RlY19jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BVElfQ09ERUNTOyBpKyspIHsKKwkJaWYgKGNoaXAtPmNvZGVjX25vdF9yZWFkeV9iaXRzICYgY29kZWNfc2tpcFtpXSkKKwkJCWNvbnRpbnVlOworCQltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwkJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7CisJCWFjOTcubnVtID0gaTsKKwkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCQlpZiAoISBjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykKKwkJCWFjOTcuc2NhcHMgfD0gQUM5N19TQ0FQX05PX1NQRElGOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5N1tpXSkpIDwgMCkgeworCQkJY2hpcC0+YWM5N1tpXSA9IE5VTEw7IC8qIHRvIGJlIHN1cmUgKi8KKwkJCXNuZF9wcmludGRkKCJhdGlpeHA6IGNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIGF1ZGlvXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvZGVjX2NvdW50Kys7CisJfQorCisJaWYgKCEgY29kZWNfY291bnQpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzbmRfYWM5N190dW5lX2hhcmR3YXJlKGNoaXAtPmFjOTdbMF0sIGFjOTdfcXVpcmtzLCBxdWlya19vdmVycmlkZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9QQ01ERVZTOyBpKyspCisJCWlmIChjaGlwLT5wY21kZXZzW2ldKSB7CisJCQlhdGlpeHBfZG1hX3QgKmRtYSA9ICZjaGlwLT5kbWFzW2ldOworCQkJaWYgKGRtYS0+c3Vic3RyZWFtICYmIGRtYS0+cnVubmluZykKKwkJCQlkbWEtPnNhdmVkX2N1cnB0ciA9IHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKTsKKwkJCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtZGV2c1tpXSk7CisJCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9DT0RFQ1M7IGkrKykKKwkJaWYgKGNoaXAtPmFjOTdbaV0pCisJCQlzbmRfYWM5N19zdXNwZW5kKGNoaXAtPmFjOTdbaV0pOworCXNuZF9hdGlpeHBfYWNsaW5rX2Rvd24oY2hpcCk7CisJc25kX2F0aWl4cF9jaGlwX3N0b3AoY2hpcCk7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMyk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9yZXN1bWUoc25kX2NhcmRfdCAqY2FyZCkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCXBjaV9lbmFibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShjaGlwLT5wY2ksIDApOworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisKKwlzbmRfYXRpaXhwX2FjbGlua19yZXNldChjaGlwKTsKKwlzbmRfYXRpaXhwX2NoaXBfc3RhcnQoY2hpcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9DT0RFQ1M7IGkrKykKKwkJaWYgKGNoaXAtPmFjOTdbaV0pCisJCQlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5N1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9QQ01ERVZTOyBpKyspCisJCWlmIChjaGlwLT5wY21kZXZzW2ldKSB7CisJCQlhdGlpeHBfZG1hX3QgKmRtYSA9ICZjaGlwLT5kbWFzW2ldOworCQkJaWYgKGRtYS0+c3Vic3RyZWFtICYmIGRtYS0+cnVubmluZykgeworCQkJCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNoaXAsIDEpOworCQkJCXdyaXRlbCgodTMyKWRtYS0+ZGVzY19idWYuYWRkciB8IEFUSV9SRUdfTElOS1BUUl9FTiwKKwkJCQkgICAgICAgY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5sbHBfb2Zmc2V0KTsKKwkJCQl3cml0ZWwoZG1hLT5zYXZlZF9jdXJwdHIsIGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKTsKKwkJCX0KKwkJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworLyoKKyAqIHByb2MgaW50ZXJmYWNlIGZvciByZWdpc3RlciBkdW1wCisgKi8KKworc3RhdGljIHZvaWQgc25kX2F0aWl4cF9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSA0KQorCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJ4OiAlMDh4XG4iLCBpLCByZWFkbChjaGlwLT5yZW1hcF9hZGRyICsgaSkpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2F0aWl4cF9wcm9jX2luaXQoYXRpaXhwX3QgKmNoaXApCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAiYXRpaXhwIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBzbmRfYXRpaXhwX3Byb2NfcmVhZCk7Cit9CisKKworCisvKgorICogZGVzdHJ1Y3RvcgorICovCisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9mcmVlKGF0aWl4cF90ICpjaGlwKQoreworCWlmIChjaGlwLT5pcnEgPCAwKQorCQlnb3RvIF9faHdfZW5kOworCXNuZF9hdGlpeHBfY2hpcF9zdG9wKGNoaXApOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworICAgICAgX19od19lbmQ6CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJaWYgKGNoaXAtPnJlbWFwX2FkZHIpCisJCWlvdW5tYXAoY2hpcC0+cmVtYXBfYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfYXRpaXhwX2ZyZWUoY2hpcCk7Cit9CisKKy8qCisgKiBjb25zdHJ1Y3RvciBmb3IgY2hpcCBpbnN0YW5jZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYXRpaXhwX2NyZWF0ZShzbmRfY2FyZF90ICpjYXJkLAorCQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgYXRpaXhwX3QgKipyX2NoaXApCit7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfYXRpaXhwX2Rldl9mcmVlLAorCX07CisJYXRpaXhwX3QgKmNoaXA7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwlpbml0X01VVEVYKCZjaGlwLT5vcGVuX211dGV4KTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+aXJxID0gLTE7CisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkFUSSBJWFAgQUM5NyIpKSA8IDApIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCWtmcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJY2hpcC0+cmVtYXBfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5hZGRyLCBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkpOworCWlmIChjaGlwLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJc25kX2F0aWl4cF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hdGlpeHBfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsIGNhcmQtPnNob3J0bmFtZSwgKHZvaWQgKiljaGlwKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2F0aWl4cF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2F0aWl4cF9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyX2NoaXAgPSBjaGlwOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hdGlpeHBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlhdGlpeHBfdCAqY2hpcDsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCWludCBlcnI7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgUENJX1JFVklTSU9OX0lELCAmcmV2aXNpb24pOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgc3BkaWZfYWNsaW5rW2Rldl0gPyAiQVRJSVhQIiA6ICJBVElJWFAtU1BETUEiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQVRJIElYUCIpOworCWlmICgoZXJyID0gc25kX2F0aWl4cF9jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCisJaWYgKChlcnIgPSBzbmRfYXRpaXhwX2FjbGlua19yZXNldChjaGlwKSkgPCAwKQorCQlnb3RvIF9fZXJyb3I7CisKKwljaGlwLT5zcGRpZl9vdmVyX2FjbGluayA9IHNwZGlmX2FjbGlua1tkZXZdOworCisJaWYgKChlcnIgPSBzbmRfYXRpaXhwX21peGVyX25ldyhjaGlwLCBhYzk3X2Nsb2NrW2Rldl0sIGFjOTdfcXVpcmtbZGV2XSkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCisJaWYgKChlcnIgPSBzbmRfYXRpaXhwX3BjbV9uZXcoY2hpcCkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCQorCXNuZF9hdGlpeHBfcHJvY19pbml0KGNoaXApOworCisJc25kX2F0aWl4cF9jaGlwX3N0YXJ0KGNoaXApOworCisJc25wcmludGYoY2FyZC0+bG9uZ25hbWUsIHNpemVvZihjYXJkLT5sb25nbmFtZSksCisJCSAiJXMgcmV2ICV4IHdpdGggJXMgYXQgJSNseCwgaXJxICVpIiwgY2FyZC0+c2hvcnRuYW1lLCByZXZpc2lvbiwKKwkJIGNoaXAtPmFjOTdbMF0gPyBzbmRfYWM5N19nZXRfc2hvcnRfbmFtZShjaGlwLT5hYzk3WzBdKSA6ICI/IiwKKwkJIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CisKKwlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2FyZCwgc25kX2F0aWl4cF9zdXNwZW5kLCBzbmRfYXRpaXhwX3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworCisgX19lcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfYXRpaXhwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIkFUSSBJWFAgQUM5NyBjb250cm9sbGVyIiwKKwkuaWRfdGFibGUgPSBzbmRfYXRpaXhwX2lkcywKKwkucHJvYmUgPSBzbmRfYXRpaXhwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYXRpaXhwX3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2F0aWl4cF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9hdGlpeHBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2F0aWl4cF9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2F0aWl4cF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2U1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTAsMCArMSwxMzQ0IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgQVRJIElYUCAxNTAvMjAwLzI1MCBBQzk3IG1vZGVtIGNvbnRyb2xsZXJzCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFUSSBJWFAgTUM5NyBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tBVEksSVhQMTUwLzIwMC8yNTB9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gLTJ9OyAvKiBFeGNsdWRlIHRoZSBmaXJzdCBjYXJkICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBhYzk3X2Nsb2NrW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNDgwMDB9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEFUSSBJWFAgY29udHJvbGxlci4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgQVRJIElYUCBjb250cm9sbGVyLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBhdWRpbyBwYXJ0IG9mIEFUSSBJWFAgY29udHJvbGxlci4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShhYzk3X2Nsb2NrLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhYzk3X2Nsb2NrLCAiQUMnOTcgY29kZWMgY2xvY2sgKGRlZmF1bHQgNDgwMDBIeikuIik7CisKKworLyoKKyAqLworCisjZGVmaW5lIEFUSV9SRUdfSVNSCQkJMHgwMAkvKiBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lICBBVElfUkVHX0lTUl9NT0RFTV9JTl9YUlVOCSgxVTw8MCkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX01PREVNX0lOX1NUQVRVUwkoMVU8PDEpCisjZGVmaW5lICBBVElfUkVHX0lTUl9NT0RFTV9PVVQxX1hSVU4JKDFVPDwyKQorI2RlZmluZSAgQVRJX1JFR19JU1JfTU9ERU1fT1VUMV9TVEFUVVMJKDFVPDwzKQorI2RlZmluZSAgQVRJX1JFR19JU1JfTU9ERU1fT1VUMl9YUlVOCSgxVTw8NCkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX01PREVNX09VVDJfU1RBVFVTCSgxVTw8NSkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX01PREVNX09VVDNfWFJVTgkoMVU8PDYpCisjZGVmaW5lICBBVElfUkVHX0lTUl9NT0RFTV9PVVQzX1NUQVRVUwkoMVU8PDcpCisjZGVmaW5lICBBVElfUkVHX0lTUl9QSFlTX0lOVFIJCSgxVTw8OCkKKyNkZWZpbmUgIEFUSV9SRUdfSVNSX1BIWVNfTUlTTUFUQ0gJKDFVPDw5KQorI2RlZmluZSAgQVRJX1JFR19JU1JfQ09ERUMwX05PVF9SRUFEWQkoMVU8PDEwKQorI2RlZmluZSAgQVRJX1JFR19JU1JfQ09ERUMxX05PVF9SRUFEWQkoMVU8PDExKQorI2RlZmluZSAgQVRJX1JFR19JU1JfQ09ERUMyX05PVF9SRUFEWQkoMVU8PDEyKQorI2RlZmluZSAgQVRJX1JFR19JU1JfTkVXX0ZSQU1FCQkoMVU8PDEzKQorI2RlZmluZSAgQVRJX1JFR19JU1JfTU9ERU1fR1BJT19EQVRBCSgxVTw8MTQpCisKKyNkZWZpbmUgQVRJX1JFR19JRVIJCQkweDA0CS8qIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgIEFUSV9SRUdfSUVSX01PREVNX0lOX1hSVU5fRU4JKDFVPDwwKQorI2RlZmluZSAgQVRJX1JFR19JRVJfTU9ERU1fU1RBVFVTX0VOCSgxVTw8MSkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX01PREVNX09VVDFfWFJVTl9FTgkoMVU8PDIpCisjZGVmaW5lICBBVElfUkVHX0lFUl9NT0RFTV9PVVQyX1hSVU5fRU4JKDFVPDw0KQorI2RlZmluZSAgQVRJX1JFR19JRVJfTU9ERU1fT1VUM19YUlVOX0VOCSgxVTw8NikKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX1BIWVNfSU5UUl9FTgkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX0lFUl9QSFlTX01JU01BVENIX0VOCSgxVTw8OSkKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX0NPREVDMF9JTlRSX0VOCSgxVTw8MTApCisjZGVmaW5lICBBVElfUkVHX0lFUl9DT0RFQzFfSU5UUl9FTgkoMVU8PDExKQorI2RlZmluZSAgQVRJX1JFR19JRVJfQ09ERUMyX0lOVFJfRU4JKDFVPDwxMikKKyNkZWZpbmUgIEFUSV9SRUdfSUVSX05FV19GUkFNRV9FTgkoMVU8PDEzKQkvKiAoUk8gKi8KKyNkZWZpbmUgIEFUSV9SRUdfSUVSX01PREVNX0dQSU9fREFUQV9FTgkoMVU8PDE0KQkvKiAoV08pIG1vZGVtIGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgIEFUSV9SRUdfSUVSX01PREVNX1NFVF9CVVNfQlVTWQkoMVU8PDE1KQorCisjZGVmaW5lIEFUSV9SRUdfQ01ECQkJMHgwOAkvKiBjb21tYW5kICovCisjZGVmaW5lICBBVElfUkVHX0NNRF9QT1dFUkRPV04JKDFVPDwwKQorI2RlZmluZSAgQVRJX1JFR19DTURfTU9ERU1fUkVDRUlWRV9FTgkoMVU8PDEpCS8qIG1vZGVtIG9ubHkgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ01EX01PREVNX1NFTkQxX0VOCSgxVTw8MikJLyogbW9kZW0gb25seSAqLworI2RlZmluZSAgQVRJX1JFR19DTURfTU9ERU1fU0VORDJfRU4JKDFVPDwzKQkvKiBtb2RlbSBvbmx5ICovCisjZGVmaW5lICBBVElfUkVHX0NNRF9NT0RFTV9TRU5EM19FTgkoMVU8PDQpCS8qIG1vZGVtIG9ubHkgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ01EX01PREVNX1NUQVRVU19NRU0JKDFVPDw1KQkvKiBtb2RlbSBvbmx5ICovCisjZGVmaW5lICBBVElfUkVHX0NNRF9NT0RFTV9JTl9ETUFfRU4JKDFVPDw4KQkvKiBtb2RlbSBvbmx5ICovCisjZGVmaW5lICBBVElfUkVHX0NNRF9NT0RFTV9PVVRfRE1BMV9FTgkoMVU8PDkpCS8qIG1vZGVtIG9ubHkgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ01EX01PREVNX09VVF9ETUEyX0VOCSgxVTw8MTApCS8qIG1vZGVtIG9ubHkgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ01EX01PREVNX09VVF9ETUEzX0VOCSgxVTw8MTEpCS8qIG1vZGVtIG9ubHkgKi8KKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0FVRElPX1BSRVNFTlQJKDFVPDwyMCkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX01PREVNX0dQSU9fVEhSVV9ETUEJKDFVPDwyMikJLyogbW9kZW0gb25seSAqLworI2RlZmluZSAgQVRJX1JFR19DTURfTE9PUEJBQ0tfRU4JKDFVPDwyMykKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX1BBQ0tFRF9ESVMJCSgxVTw8MjQpCisjZGVmaW5lICBBVElfUkVHX0NNRF9CVVJTVF9FTgkJKDFVPDwyNSkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX1BBTklDX0VOCQkoMVU8PDI2KQorI2RlZmluZSAgQVRJX1JFR19DTURfTU9ERU1fUFJFU0VOVAkoMVU8PDI3KQorI2RlZmluZSAgQVRJX1JFR19DTURfQUNMSU5LX0FDVElWRQkoMVU8PDI4KQorI2RlZmluZSAgQVRJX1JFR19DTURfQUNfU09GVF9SRVNFVAkoMVU8PDI5KQorI2RlZmluZSAgQVRJX1JFR19DTURfQUNfU1lOQwkJKDFVPDwzMCkKKyNkZWZpbmUgIEFUSV9SRUdfQ01EX0FDX1JFU0VUCQkoMVU8PDMxKQorCisjZGVmaW5lIEFUSV9SRUdfUEhZU19PVVRfQUREUgkJMHgwYworI2RlZmluZSAgQVRJX1JFR19QSFlTX09VVF9DT0RFQ19NQVNLCSgzVTw8MCkKKyNkZWZpbmUgIEFUSV9SRUdfUEhZU19PVVRfUlcJCSgxVTw8MikKKyNkZWZpbmUgIEFUSV9SRUdfUEhZU19PVVRfQUREUl9FTgkoMVU8PDgpCisjZGVmaW5lICBBVElfUkVHX1BIWVNfT1VUX0FERFJfU0hJRlQJOQorI2RlZmluZSAgQVRJX1JFR19QSFlTX09VVF9EQVRBX1NISUZUCTE2CisKKyNkZWZpbmUgQVRJX1JFR19QSFlTX0lOX0FERFIJCTB4MTAKKyNkZWZpbmUgIEFUSV9SRUdfUEhZU19JTl9SRUFEX0ZMQUcJKDFVPDw4KQorI2RlZmluZSAgQVRJX1JFR19QSFlTX0lOX0FERFJfU0hJRlQJOQorI2RlZmluZSAgQVRJX1JFR19QSFlTX0lOX0RBVEFfU0hJRlQJMTYKKworI2RlZmluZSBBVElfUkVHX1NMT1RSRVEJCQkweDE0CisKKyNkZWZpbmUgQVRJX1JFR19DT1VOVEVSCQkJMHgxOAorI2RlZmluZSAgQVRJX1JFR19DT1VOVEVSX1NMT1QJCSgzVTw8MCkJLyogc2xvdCAjICovCisjZGVmaW5lICBBVElfUkVHX0NPVU5URVJfQklUQ0xPQ0sJKDMxVTw8OCkKKworI2RlZmluZSBBVElfUkVHX0lOX0ZJRk9fVEhSRVNIT0xECTB4MWMKKworI2RlZmluZSBBVElfUkVHX01PREVNX0lOX0RNQV9MSU5LUFRSCTB4MjAKKyNkZWZpbmUgQVRJX1JFR19NT0RFTV9JTl9ETUFfRFRfU1RBUlQJMHgyNAkvKiBSTyAqLworI2RlZmluZSBBVElfUkVHX01PREVNX0lOX0RNQV9EVF9ORVhUCTB4MjgJLyogUk8gKi8KKyNkZWZpbmUgQVRJX1JFR19NT0RFTV9JTl9ETUFfRFRfQ1VSCTB4MmMJLyogUk8gKi8KKyNkZWZpbmUgQVRJX1JFR19NT0RFTV9JTl9ETUFfRFRfU0laRQkweDMwCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0ZJRk8JCTB4MzQJLyogb3V0cHV0IHRocmVzaG9sZCAqLworI2RlZmluZSAgQVRJX1JFR19NT0RFTV9PVVQxX0RNQV9USFJFU0hPTERfTUFTSwkoMHhmPDwxNikKKyNkZWZpbmUgIEFUSV9SRUdfTU9ERU1fT1VUMV9ETUFfVEhSRVNIT0xEX1NISUZUCTE2CisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTFfTElOS1BUUgkweDM4CisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTJfTElOS1BUUgkweDNjCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTNfTElOS1BUUgkweDQwCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTFfRFRfU1RBUlQJMHg0NAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUExX0RUX05FWFQJMHg0OAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUExX0RUX0NVUgkweDRjCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTJfRFRfU1RBUlQJMHg1MAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUEyX0RUX05FWFQJMHg1NAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUEyX0RUX0NVUgkweDU4CisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTNfRFRfU1RBUlQJMHg1YworI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUEzX0RUX05FWFQJMHg2MAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUEzX0RUX0NVUgkweDY0CisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fT1VUX0RNQTEyX0RUX1NJWkUJMHg2OAorI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9ETUEzX0RUX1NJWkUJMHg2YworI2RlZmluZSBBVElfUkVHX01PREVNX09VVF9GSUZPX1VTRUQgICAgIDB4NzAKKyNkZWZpbmUgQVRJX1JFR19NT0RFTV9PVVRfR1BJTwkJMHg3NAorI2RlZmluZSAgQVRJX1JFR19NT0RFTV9PVVRfR1BJT19FTgkgICAxCisjZGVmaW5lICBBVElfUkVHX01PREVNX09VVF9HUElPX0RBVEFfU0hJRlQgNQorI2RlZmluZSBBVElfUkVHX01PREVNX0lOX0dQSU8JCTB4NzgKKworI2RlZmluZSBBVElfUkVHX01PREVNX01JUlJPUgkJMHg3YworI2RlZmluZSBBVElfUkVHX0FVRElPX01JUlJPUgkJMHg4MAorCisjZGVmaW5lIEFUSV9SRUdfTU9ERU1fRklGT19GTFVTSAkweDg4CisjZGVmaW5lICBBVElfUkVHX01PREVNX0ZJRk9fT1VUMV9GTFVTSAkoMVU8PDApCisjZGVmaW5lICBBVElfUkVHX01PREVNX0ZJRk9fT1VUMl9GTFVTSAkoMVU8PDEpCisjZGVmaW5lICBBVElfUkVHX01PREVNX0ZJRk9fT1VUM19GTFVTSAkoMVU8PDIpCisjZGVmaW5lICBBVElfUkVHX01PREVNX0ZJRk9fSU5fRkxVU0gJKDFVPDwzKQorCisvKiBMSU5LUFRSICovCisjZGVmaW5lICBBVElfUkVHX0xJTktQVFJfRU4JCSgxVTw8MCkKKworI2RlZmluZSBBVElfTUFYX0RFU0NSSVBUT1JTCTI1NgkvKiBtYXggbnVtYmVyIG9mIGRlc2NyaXB0b3IgcGFja2V0cyAqLworCisKKy8qCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc25kX2F0aWl4cCBhdGlpeHBfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9hdGlpeHBfZG1hIGF0aWl4cF9kbWFfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9hdGlpeHBfZG1hX29wcyBhdGlpeHBfZG1hX29wc190OworCisKKy8qCisgKiBETUEgcGFja2F0ZSBkZXNjcmlwdG9yCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYXRpaXhwX2RtYV9kZXNjIHsKKwl1MzIgYWRkcjsJLyogRE1BIGJ1ZmZlciBhZGRyZXNzICovCisJdTE2IHN0YXR1czsJLyogc3RhdHVzIGJpdHMgKi8KKwl1MTYgc2l6ZTsJLyogc2l6ZSBvZiB0aGUgcGFja2V0IGluIGR3b3JkcyAqLworCXUzMiBuZXh0OwkvKiBhZGRyZXNzIG9mIHRoZSBuZXh0IHBhY2tldCBkZXNjcmlwdG9yICovCit9IGF0aWl4cF9kbWFfZGVzY190OworCisvKgorICogc3RyZWFtIGVudW0KKyAqLworZW51bSB7IEFUSV9ETUFfUExBWUJBQ0ssIEFUSV9ETUFfQ0FQVFVSRSwgTlVNX0FUSV9ETUFTIH07IC8qIERNQXMgKi8KK2VudW0geyBBVElfUENNX09VVCwgQVRJX1BDTV9JTiwgTlVNX0FUSV9QQ01TIH07IC8qIEFDOTcgcGNtIHNsb3RzICovCitlbnVtIHsgQVRJX1BDTURFVl9BTkFMT0csIE5VTV9BVElfUENNREVWUyB9OyAvKiBwY20gZGV2aWNlcyAqLworCisjZGVmaW5lIE5VTV9BVElfQ09ERUNTCTMKKworCisvKgorICogY29uc3RhbnRzIGFuZCBjYWxsYmFja3MgZm9yIGVhY2ggRE1BIHR5cGUKKyAqLworc3RydWN0IHNuZF9hdGlpeHBfZG1hX29wcyB7CisJaW50IHR5cGU7CQkJLyogQVRJX0RNQV9YWFggKi8KKwl1bnNpZ25lZCBpbnQgbGxwX29mZnNldDsJLyogTElOS1BUUiBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgZHRfY3VyOwkJLyogRFRfQ1VSIG9mZnNldCAqLworCXZvaWQgKCplbmFibGVfZG1hKShhdGlpeHBfdCAqY2hpcCwgaW50IG9uKTsJLyogY2FsbGVkIGZyb20gb3BlbiBjYWxsYmFjayAqLworCXZvaWQgKCplbmFibGVfdHJhbnNmZXIpKGF0aWl4cF90ICpjaGlwLCBpbnQgb24pOyAvKiBjYWxsZWQgZnJvbSB0cmlnZ2VyIChTVEFSVC9TVE9QKSAqLworCXZvaWQgKCpmbHVzaF9kbWEpKGF0aWl4cF90ICpjaGlwKTsJCS8qIGNhbGxlZCBmcm9tIHRyaWdnZXIgKFNUT1Agb25seSkgKi8KK307CisKKy8qCisgKiBETUEgc3RyZWFtCisgKi8KK3N0cnVjdCBzbmRfYXRpaXhwX2RtYSB7CisJY29uc3QgYXRpaXhwX2RtYV9vcHNfdCAqb3BzOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkZXNjX2J1ZjsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CS8qIGFzc2lnbmVkIFBDTSBzdWJzdHJlYW0gKi8KKwl1bnNpZ25lZCBpbnQgYnVmX2FkZHIsIGJ1Zl9ieXRlczsJLyogRE1BIGJ1ZmZlciBhZGRyZXNzLCBieXRlcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsIHBlcmlvZHM7CisJaW50IG9wZW5lZDsKKwlpbnQgcnVubmluZzsKKwlpbnQgcGNtX29wZW5fZmxhZzsKKwlpbnQgYWM5N19wY21fdHlwZTsJLyogaW5kZXggIyBvZiBhYzk3X3BjbSB0byBhY2Nlc3MsIC0xID0gbm90IHVzZWQgKi8KK307CisKKy8qCisgKiBBVEkgSVhQIGNoaXAKKyAqLworc3RydWN0IHNuZF9hdGlpeHAgeworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwkJLyogbWVtb3J5IGkvbyAqLworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKnJlbWFwX2FkZHI7CisJaW50IGlycTsKKwkKKwlhYzk3X2J1c190ICphYzk3X2J1czsKKwlhYzk3X3QgKmFjOTdbTlVNX0FUSV9DT0RFQ1NdOworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKworCWF0aWl4cF9kbWFfdCBkbWFzW05VTV9BVElfRE1BU107CisJc3RydWN0IGFjOTdfcGNtICpwY21zW05VTV9BVElfUENNU107CisJc25kX3BjbV90ICpwY21kZXZzW05VTV9BVElfUENNREVWU107CisKKwlpbnQgbWF4X2NoYW5uZWxzOwkJLyogbWF4LiBjaGFubmVscyBmb3IgUENNIG91dCAqLworCisJdW5zaWduZWQgaW50IGNvZGVjX25vdF9yZWFkeV9iaXRzOwkvKiBmb3IgY29kZWMgZGV0ZWN0aW9uICovCisKKwlpbnQgc3BkaWZfb3Zlcl9hY2xpbms7CQkvKiBwYXNzZWQgZnJvbSB0aGUgbW9kdWxlIG9wdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9tdXRleDsJLyogcGxheWJhY2sgb3BlbiBtdXRleCAqLworfTsKKworCisvKgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2F0aWl4cF9pZHNbXSA9IHsKKwl7IDB4MTAwMiwgMHg0MzRkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIFNCMjAwICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2F0aWl4cF9pZHMpOworCisKKy8qCisgKiBsb3dsZXZlbCBmdW5jdGlvbnMKKyAqLworCisvKgorICogdXBkYXRlIHRoZSBiaXRzIG9mIHRoZSBnaXZlbiByZWdpc3Rlci4KKyAqIHJldHVybiAxIGlmIHRoZSBiaXRzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF91cGRhdGVfYml0cyhhdGlpeHBfdCAqY2hpcCwgdW5zaWduZWQgaW50IHJlZywKKwkJCQkgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBjaGlwLT5yZW1hcF9hZGRyICsgcmVnOworCXVuc2lnbmVkIGludCBkYXRhLCBvbGRfZGF0YTsKKwlvbGRfZGF0YSA9IGRhdGEgPSByZWFkbChhZGRyKTsKKwlkYXRhICY9IH5tYXNrOworCWRhdGEgfD0gdmFsdWU7CisJaWYgKG9sZF9kYXRhID09IGRhdGEpCisJCXJldHVybiAwOworCXdyaXRlbChkYXRhLCBhZGRyKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKKyAqLworI2RlZmluZSBhdGlpeHBfd3JpdGUoY2hpcCxyZWcsdmFsdWUpIFwKKwl3cml0ZWwodmFsdWUsIGNoaXAtPnJlbWFwX2FkZHIgKyBBVElfUkVHXyMjcmVnKQorI2RlZmluZSBhdGlpeHBfcmVhZChjaGlwLHJlZykgXAorCXJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBBVElfUkVHXyMjcmVnKQorI2RlZmluZSBhdGlpeHBfdXBkYXRlKGNoaXAscmVnLG1hc2ssdmFsKSBcCisJc25kX2F0aWl4cF91cGRhdGVfYml0cyhjaGlwLCBBVElfUkVHXyMjcmVnLCBtYXNrLCB2YWwpCisKKy8qIGRlbGF5IGZvciBvbmUgdGljayAqLworI2RlZmluZSBkb19kZWxheSgpIGRvIHsgXAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsgXAorCXNjaGVkdWxlX3RpbWVvdXQoMSk7IFwKK30gd2hpbGUgKDApCisKKworLyoKKyAqIGhhbmRsaW5nIERNQSBwYWNrZXRzCisgKgorICogd2UgYWxsb2NhdGUgYSBsaW5lYXIgYnVmZmVyIGZvciB0aGUgRE1BLCBhbmQgc3BsaXQgaXQgdG8gIGVhY2ggcGFja2V0LgorICogaW4gYSBmdXR1cmUgdmVyc2lvbiwgYSBzY2F0dGVyLWdhdGhlciBidWZmZXIgc2hvdWxkIGJlIGltcGxlbWVudGVkLgorICovCisKKyNkZWZpbmUgQVRJX0RFU0NfTElTVF9TSVpFIFwKKwlQQUdFX0FMSUdOKEFUSV9NQVhfREVTQ1JJUFRPUlMgKiBzaXplb2YoYXRpaXhwX2RtYV9kZXNjX3QpKQorCisvKgorICogYnVpbGQgcGFja2V0cyByaW5nIGZvciB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUuCisgKgorICogSVhQIGhhbmRsZXMgdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycywgd2hpY2ggYXJlIGNvbm5lY3RlZCBhcyBhIGxpbmtlZAorICogbGlzdC4gIGFsdGhvdWdoIHdlIGNhbiBjaGFuZ2UgdGhlIGxpc3QgZHluYW1pY2FsbHksIGluIHRoaXMgdmVyc2lvbiwKKyAqIGEgc3RhdGljIFJJTkcgb2YgYnVmZmVyIGRlc2NyaXB0b3JzIGlzIHVzZWQuCisgKgorICogdGhlIHJpbmcgaXMgYnVpbHQgaW4gdGhpcyBmdW5jdGlvbiwgYW5kIGlzIHNldCB1cCB0byB0aGUgaGFyZHdhcmUuIAorICovCitzdGF0aWMgaW50IGF0aWl4cF9idWlsZF9kbWFfcGFja2V0cyhhdGlpeHBfdCAqY2hpcCwgYXRpaXhwX2RtYV90ICpkbWEsCisJCQkJICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgIHVuc2lnbmVkIGludCBwZXJpb2RzLAorCQkJCSAgIHVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIGFkZHIsIGRlc2NfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHBlcmlvZHMgPiBBVElfTUFYX0RFU0NSSVBUT1JTKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChkbWEtPmRlc2NfYnVmLmFyZWEgPT0gTlVMTCkgeworCQlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJQVRJX0RFU0NfTElTVF9TSVpFLCAmZG1hLT5kZXNjX2J1ZikgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRtYS0+cGVyaW9kX2J5dGVzID0gZG1hLT5wZXJpb2RzID0gMDsgLyogY2xlYXIgKi8KKwl9CisKKwlpZiAoZG1hLT5wZXJpb2RzID09IHBlcmlvZHMgJiYgZG1hLT5wZXJpb2RfYnl0ZXMgPT0gcGVyaW9kX2J5dGVzKQorCQlyZXR1cm4gMDsKKworCS8qIHJlc2V0IERNQSBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlc2NyaXB0b3IgdGFibGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWwoMCwgY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5sbHBfb2Zmc2V0KTsKKwlkbWEtPm9wcy0+ZW5hYmxlX2RtYShjaGlwLCAwKTsKKwlkbWEtPm9wcy0+ZW5hYmxlX2RtYShjaGlwLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCisJLyogZmlsbCB0aGUgZW50cmllcyAqLworCWFkZHIgPSAodTMyKXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisJZGVzY19hZGRyID0gKHUzMilkbWEtPmRlc2NfYnVmLmFkZHI7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgeworCQlhdGlpeHBfZG1hX2Rlc2NfdCAqZGVzYyA9ICYoKGF0aWl4cF9kbWFfZGVzY190ICopZG1hLT5kZXNjX2J1Zi5hcmVhKVtpXTsKKwkJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCQlkZXNjLT5zdGF0dXMgPSAwOworCQlkZXNjLT5zaXplID0gcGVyaW9kX2J5dGVzID4+IDI7IC8qIGluIGR3b3JkcyAqLworCQlkZXNjX2FkZHIgKz0gc2l6ZW9mKGF0aWl4cF9kbWFfZGVzY190KTsKKwkJaWYgKGkgPT0gcGVyaW9kcyAtIDEpCisJCQlkZXNjLT5uZXh0ID0gY3B1X3RvX2xlMzIoKHUzMilkbWEtPmRlc2NfYnVmLmFkZHIpOworCQllbHNlCisJCQlkZXNjLT5uZXh0ID0gY3B1X3RvX2xlMzIoZGVzY19hZGRyKTsKKwkJYWRkciArPSBwZXJpb2RfYnl0ZXM7CisJfQorCisJd3JpdGVsKCh1MzIpZG1hLT5kZXNjX2J1Zi5hZGRyIHwgQVRJX1JFR19MSU5LUFRSX0VOLAorCSAgICAgICBjaGlwLT5yZW1hcF9hZGRyICsgZG1hLT5vcHMtPmxscF9vZmZzZXQpOworCisJZG1hLT5wZXJpb2RfYnl0ZXMgPSBwZXJpb2RfYnl0ZXM7CisJZG1hLT5wZXJpb2RzID0gcGVyaW9kczsKKworCXJldHVybiAwOworfQorCisvKgorICogcmVtb3ZlIHRoZSByaW5nIGJ1ZmZlciBhbmQgcmVsZWFzZSBpdCBpZiBhc3NpZ25lZAorICovCitzdGF0aWMgdm9pZCBhdGlpeHBfY2xlYXJfZG1hX3BhY2tldHMoYXRpaXhwX3QgKmNoaXAsIGF0aWl4cF9kbWFfdCAqZG1hLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaWYgKGRtYS0+ZGVzY19idWYuYXJlYSkgeworCQl3cml0ZWwoMCwgY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5sbHBfb2Zmc2V0KTsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZkbWEtPmRlc2NfYnVmKTsKKwkJZG1hLT5kZXNjX2J1Zi5hcmVhID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBBQzk3IGludGVyZmFjZQorICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfYWNxdWlyZV9jb2RlYyhhdGlpeHBfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl3aGlsZSAoYXRpaXhwX3JlYWQoY2hpcCwgUEhZU19PVVRfQUREUikgJiBBVElfUkVHX1BIWVNfT1VUX0FERFJfRU4pIHsKKwkJaWYgKCEgdGltZW91dC0tKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYXRpaXhwOiBjb2RlYyBhY3F1aXJlIHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2F0aWl4cF9jb2RlY19yZWFkKGF0aWl4cF90ICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBjb2RlYywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCWludCB0aW1lb3V0OworCisJaWYgKHNuZF9hdGlpeHBfYWNxdWlyZV9jb2RlYyhjaGlwKSA8IDApCisJCXJldHVybiAweGZmZmY7CisJZGF0YSA9IChyZWcgPDwgQVRJX1JFR19QSFlTX09VVF9BRERSX1NISUZUKSB8CisJCUFUSV9SRUdfUEhZU19PVVRfQUREUl9FTiB8CisJCUFUSV9SRUdfUEhZU19PVVRfUlcgfAorCQljb2RlYzsKKwlhdGlpeHBfd3JpdGUoY2hpcCwgUEhZU19PVVRfQUREUiwgZGF0YSk7CisJaWYgKHNuZF9hdGlpeHBfYWNxdWlyZV9jb2RlYyhjaGlwKSA8IDApCisJCXJldHVybiAweGZmZmY7CisJdGltZW91dCA9IDEwMDA7CisJZG8geworCQlkYXRhID0gYXRpaXhwX3JlYWQoY2hpcCwgUEhZU19JTl9BRERSKTsKKwkJaWYgKGRhdGEgJiBBVElfUkVHX1BIWVNfSU5fUkVBRF9GTEFHKQorCQkJcmV0dXJuIGRhdGEgPj4gQVRJX1JFR19QSFlTX0lOX0RBVEFfU0hJRlQ7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCS8qIHRpbWUgb3V0IG1heSBoYXBwZW4gZHVyaW5nIHJlc2V0ICovCisJaWYgKHJlZyA8IDB4N2MpCisJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdGlpeHA6IGNvZGVjIHJlYWQgdGltZW91dCAocmVnICV4KVxuIiwgcmVnKTsKKwlyZXR1cm4gMHhmZmZmOworfQorCisKK3N0YXRpYyB2b2lkIHNuZF9hdGlpeHBfY29kZWNfd3JpdGUoYXRpaXhwX3QgKmNoaXAsIHVuc2lnbmVkIHNob3J0IGNvZGVjLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKyAgICAKKwlpZiAoc25kX2F0aWl4cF9hY3F1aXJlX2NvZGVjKGNoaXApIDwgMCkKKwkJcmV0dXJuOworCWRhdGEgPSAoKHVuc2lnbmVkIGludCl2YWwgPDwgQVRJX1JFR19QSFlTX09VVF9EQVRBX1NISUZUKSB8CisJCSgodW5zaWduZWQgaW50KXJlZyA8PCBBVElfUkVHX1BIWVNfT1VUX0FERFJfU0hJRlQpIHwKKwkJQVRJX1JFR19QSFlTX09VVF9BRERSX0VOIHwgY29kZWM7CisJYXRpaXhwX3dyaXRlKGNoaXAsIFBIWVNfT1VUX0FERFIsIGRhdGEpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYXRpaXhwX2FjOTdfcmVhZChhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gc25kX2F0aWl4cF9jb2RlY19yZWFkKGNoaXAsIGFjOTctPm51bSwgcmVnKTsKKyAgICAKK30KKworc3RhdGljIHZvaWQgc25kX2F0aWl4cF9hYzk3X3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJc25kX2F0aWl4cF9jb2RlY193cml0ZShjaGlwLCBhYzk3LT5udW0sIHJlZywgdmFsKTsKK30KKworLyoKKyAqIHJlc2V0IEFDIGxpbmsKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX2FjbGlua19yZXNldChhdGlpeHBfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dDsKKworCS8qIHJlc2V0IHBvd2VyZG9ld24gKi8KKwlpZiAoYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX1BPV0VSRE9XTiwgMCkpCisJCXVkZWxheSgxMCk7CisKKwkvKiBwZXJmb3JtIGEgc29mdHdhcmUgcmVzZXQgKi8KKwlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfQUNfU09GVF9SRVNFVCwgQVRJX1JFR19DTURfQUNfU09GVF9SRVNFVCk7CisJYXRpaXhwX3JlYWQoY2hpcCwgQ01EKTsKKwl1ZGVsYXkoMTApOworCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9BQ19TT0ZUX1JFU0VULCAwKTsKKyAgICAKKwl0aW1lb3V0ID0gMTA7CisJd2hpbGUgKCEgKGF0aWl4cF9yZWFkKGNoaXAsIENNRCkgJiBBVElfUkVHX0NNRF9BQ0xJTktfQUNUSVZFKSkgeworCQkvKiBkbyBhIGhhcmQgcmVzZXQgKi8KKwkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1NZTkN8QVRJX1JFR19DTURfQUNfUkVTRVQsCisJCQkgICAgICBBVElfUkVHX0NNRF9BQ19TWU5DKTsKKwkJYXRpaXhwX3JlYWQoY2hpcCwgQ01EKTsKKwkJZG9fZGVsYXkoKTsKKwkJYXRpaXhwX3VwZGF0ZShjaGlwLCBDTUQsIEFUSV9SRUdfQ01EX0FDX1JFU0VULCBBVElfUkVHX0NNRF9BQ19SRVNFVCk7CisJCWlmICgtLXRpbWVvdXQpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImF0aWl4cDogY29kZWMgcmVzZXQgdGltZW91dFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRlYXNzZXJ0IFJFU0VUIGFuZCBhc3NlcnQgU1lOQyB0byBtYWtlIHN1cmUgKi8KKwlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwgQVRJX1JFR19DTURfQUNfU1lOQ3xBVElfUkVHX0NNRF9BQ19SRVNFVCwKKwkJICAgICAgQVRJX1JFR19DTURfQUNfU1lOQ3xBVElfUkVHX0NNRF9BQ19SRVNFVCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzbmRfYXRpaXhwX2FjbGlua19kb3duKGF0aWl4cF90ICpjaGlwKQoreworCS8vIGlmIChhdGlpeHBfcmVhZChjaGlwLCBNT0RFTV9NSVJST1IpICYgMHgxKSAvKiBtb2RlbSBydW5uaW5nLCB0b28/ICovCisJLy8JcmV0dXJuIC1FQlVTWTsKKwlhdGlpeHBfdXBkYXRlKGNoaXAsIENNRCwKKwkJICAgICBBVElfUkVHX0NNRF9QT1dFUkRPV04gfCBBVElfUkVHX0NNRF9BQ19SRVNFVCwKKwkJICAgICBBVElfUkVHX0NNRF9QT1dFUkRPV04pOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBhdXRvLWRldGVjdGlvbiBvZiBjb2RlY3MKKyAqCisgKiB0aGUgSVhQIGNoaXAgY2FuIGdlbmVyYXRlIGludGVycnVwdHMgZm9yIHRoZSBub24tZXhpc3RpbmcgY29kZWNzLgorICogTkVXX0ZSQU1FIGludGVycnVwdCBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkCisgKiBldmVuIGlmIGFsbCB0aHJlZSBjb2RlY3MgYXJlIGNvbm5lY3RlZC4KKyAqLworCisjZGVmaW5lIEFMTF9DT0RFQ19OT1RfUkVBRFkgXAorCSAgICAoQVRJX1JFR19JU1JfQ09ERUMwX05PVF9SRUFEWSB8XAorCSAgICAgQVRJX1JFR19JU1JfQ09ERUMxX05PVF9SRUFEWSB8XAorCSAgICAgQVRJX1JFR19JU1JfQ09ERUMyX05PVF9SRUFEWSkKKyNkZWZpbmUgQ09ERUNfQ0hFQ0tfQklUUyAoQUxMX0NPREVDX05PVF9SRUFEWXxBVElfUkVHX0lTUl9ORVdfRlJBTUUpCisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9jb2RlY19kZXRlY3QoYXRpaXhwX3QgKmNoaXApCit7CisJaW50IHRpbWVvdXQ7CisKKwljaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyA9IDA7CisJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgQ09ERUNfQ0hFQ0tfQklUUyk7CisJLyogd2FpdCBmb3IgdGhlIGludGVycnVwdHMgKi8KKwl0aW1lb3V0ID0gSFogLyAxMDsKKwl3aGlsZSAodGltZW91dC0tID4gMCkgeworCQlkb19kZWxheSgpOworCQlpZiAoY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMpCisJCQlicmVhazsKKwl9CisJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwgMCk7IC8qIGRpc2FibGUgaXJxcyAqLworCisJaWYgKChjaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyAmIEFMTF9DT0RFQ19OT1RfUkVBRFkpID09IEFMTF9DT0RFQ19OT1RfUkVBRFkpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogZW5hYmxlIERNQSBhbmQgaXJxcworICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY2hpcF9zdGFydChhdGlpeHBfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJLyogc2V0IHVwIHNwZGlmLCBlbmFibGUgYnVyc3QgbW9kZSAqLworCXJlZyA9IGF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJcmVnIHw9IEFUSV9SRUdfQ01EX0JVUlNUX0VOOworCWlmKCEocmVnICYgQVRJX1JFR19DTURfTU9ERU1fUFJFU0VOVCkpCisJCXJlZyB8PSBBVElfUkVHX0NNRF9NT0RFTV9QUkVTRU5UOworCWF0aWl4cF93cml0ZShjaGlwLCBDTUQsIHJlZyk7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IHNvdXJjZSAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJU1IsIDB4ZmZmZmZmZmYpOworCS8qIGVuYWJsZSBpcnFzICovCisJYXRpaXhwX3dyaXRlKGNoaXAsIElFUiwKKwkJICAgICBBVElfUkVHX0lFUl9NT0RFTV9TVEFUVVNfRU4gfAorCQkgICAgIEFUSV9SRUdfSUVSX01PREVNX0lOX1hSVU5fRU4gfAorCQkgICAgIEFUSV9SRUdfSUVSX01PREVNX09VVDFfWFJVTl9FTik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGRpc2FibGUgRE1BIGFuZCBJUlFzCisgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9jaGlwX3N0b3AoYXRpaXhwX3QgKmNoaXApCit7CisJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZSAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJU1IsIGF0aWl4cF9yZWFkKGNoaXAsIElTUikpOworCS8qIGRpc2FibGUgaXJxcyAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQQ00gc2VjdGlvbgorICovCisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrIHNpbXBsbHkgcmVhZHMgWFhYX0RNQV9EVF9DVVIgcmVnaXN0ZXIgYXMgdGhlIGN1cnJlbnQKKyAqIHBvc2l0aW9uLiAgd2hlbiBTRy1idWZmZXIgaXMgaW1wbGVtZW50ZWQsIHRoZSBvZmZzZXQgbXVzdCBiZSBjYWxjdWxhdGVkCisgKiBjb3JyZWN0bHkuLi4KKyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hdGlpeHBfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWF0aWl4cF9kbWFfdCAqZG1hID0gKGF0aWl4cF9kbWFfdCAqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3VycHRyOworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJY3VycHRyID0gcmVhZGwoY2hpcC0+cmVtYXBfYWRkciArIGRtYS0+b3BzLT5kdF9jdXIpOworCQlpZiAoY3VycHRyIDwgZG1hLT5idWZfYWRkcikKKwkJCWNvbnRpbnVlOworCQljdXJwdHIgLT0gZG1hLT5idWZfYWRkcjsKKwkJaWYgKGN1cnB0ciA+PSBkbWEtPmJ1Zl9ieXRlcykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGN1cnB0cik7CisJfQorCXNuZF9wcmludGQoImF0aWl4cC1tb2RlbTogaW52YWxpZCBETUEgcG9pbnRlciByZWFkIDB4JXggKGJ1Zj0leClcbiIsCisJCSAgIHJlYWRsKGNoaXAtPnJlbWFwX2FkZHIgKyBkbWEtPm9wcy0+ZHRfY3VyKSwgZG1hLT5idWZfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBYUlVOIGRldGVjdGVkLCBhbmQgc3RvcCB0aGUgUENNIHN1YnN0cmVhbQorICovCitzdGF0aWMgdm9pZCBzbmRfYXRpaXhwX3hydW5fZG1hKGF0aWl4cF90ICpjaGlwLCBhdGlpeHBfZG1hX3QgKmRtYSkKK3sKKwlpZiAoISBkbWEtPnN1YnN0cmVhbSB8fCAhIGRtYS0+cnVubmluZykKKwkJcmV0dXJuOworCXNuZF9wcmludGRkKCJhdGlpeHA6IFhSVU4gZGV0ZWN0ZWQgKERNQSAlZClcbiIsIGRtYS0+b3BzLT50eXBlKTsKKwlzbmRfcGNtX3N0b3AoZG1hLT5zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKK30KKworLyoKKyAqIHRoZSBwZXJpb2QgYWNrLiAgdXBkYXRlIHRoZSBzdWJzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9hdGlpeHBfdXBkYXRlX2RtYShhdGlpeHBfdCAqY2hpcCwgYXRpaXhwX2RtYV90ICpkbWEpCit7CisJaWYgKCEgZG1hLT5zdWJzdHJlYW0gfHwgISBkbWEtPnJ1bm5pbmcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGRtYS0+c3Vic3RyZWFtKTsKK30KKworLyogc2V0IEJVU19CVVNZIGludGVycnVwdCBiaXQgaWYgYW55IERNQSBpcyBydW5uaW5nICovCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgc25kX2F0aWl4cF9jaGVja19idXNfYnVzeShhdGlpeHBfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgYnVzX2J1c3k7CisJaWYgKGF0aWl4cF9yZWFkKGNoaXAsIENNRCkgJiAoQVRJX1JFR19DTURfTU9ERU1fU0VORDFfRU4gfAorCQkJCSAgICAgIEFUSV9SRUdfQ01EX01PREVNX1JFQ0VJVkVfRU4pKQorCQlidXNfYnVzeSA9IEFUSV9SRUdfSUVSX01PREVNX1NFVF9CVVNfQlVTWTsKKwllbHNlCisJCWJ1c19idXN5ID0gMDsKKwlhdGlpeHBfdXBkYXRlKGNoaXAsIElFUiwgQVRJX1JFR19JRVJfTU9ERU1fU0VUX0JVU19CVVNZLCBidXNfYnVzeSk7Cit9CisKKy8qIGNvbW1vbiB0cmlnZ2VyIGNhbGxiYWNrCisgKiBjYWxsaW5nIHRoZSBsb3dsZXZlbCBjYWxsYmFja3MgaW4gaXQKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlhdGlpeHBfZG1hX3QgKmRtYSA9IChhdGlpeHBfZG1hX3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gMDsKKwlpbnQgaTsKKworCXNuZF9hc3NlcnQoZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlciAmJiBkbWEtPm9wcy0+Zmx1c2hfZG1hLCByZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoY21kICE9IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUICYmIGNtZCAhPSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJLyogaG9vayBvZmYvb246IHZpYSBHUElPX09VVCAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVRJX0NPREVDUzsgaSsrKSB7CisJCWlmIChjaGlwLT5hYzk3W2ldKSB7CisJCQlyZWcgPSBzbmRfYWM5N19yZWFkKGNoaXAtPmFjOTdbaV0sIEFDOTdfR1BJT19TVEFUVVMpOworCQkJYnJlYWs7CisJfQorCX0KKwlpZihjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpCisJCXJlZyB8PSBBQzk3X0dQSU9fTElORTFfT0g7CisJZWxzZQorCQlyZWcgJj0gfkFDOTdfR1BJT19MSU5FMV9PSDsKKwlyZWcgPSAocmVnIDw8IEFUSV9SRUdfTU9ERU1fT1VUX0dQSU9fREFUQV9TSElGVCkgfCBBVElfUkVHX01PREVNX09VVF9HUElPX0VOIDsKKwlhdGlpeHBfd3JpdGUoY2hpcCwgTU9ERU1fT1VUX0dQSU8sIHJlZyk7CisKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CisJCWRtYS0+b3BzLT5lbmFibGVfdHJhbnNmZXIoY2hpcCwgMSk7CisJCWRtYS0+cnVubmluZyA9IDE7CisJfSBlbHNlIHsKKwkJZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlcihjaGlwLCAwKTsKKwkJZG1hLT5ydW5uaW5nID0gMDsKKwl9CisJc25kX2F0aWl4cF9jaGVja19idXNfYnVzeShjaGlwKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUT1ApIHsKKwkJZG1hLT5vcHMtPmZsdXNoX2RtYShjaGlwKTsKKwkJc25kX2F0aWl4cF9jaGVja19idXNfYnVzeShjaGlwKTsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogbG93bGV2ZWwgY2FsbGJhY2tzIGZvciBlYWNoIERNQSB0eXBlCisgKgorICogZXZlcnkgY2FsbGJhY2sgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGluIGNoaXAtPnJlZ19sb2NrIHNwaW5sb2NrCisgKi8KKworLyogZmx1c2ggRklGTyBvZiBhbmFsb2cgT1VUIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX291dF9mbHVzaF9kbWEoYXRpaXhwX3QgKmNoaXApCit7CisJYXRpaXhwX3dyaXRlKGNoaXAsIE1PREVNX0ZJRk9fRkxVU0gsIEFUSV9SRUdfTU9ERU1fRklGT19PVVQxX0ZMVVNIKTsKK30KKworLyogZW5hYmxlL2Rpc2FibGUgYW5hbG9nIE9VVCBETUEgKi8KK3N0YXRpYyB2b2lkIGF0aWl4cF9vdXRfZW5hYmxlX2RtYShhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCWRhdGEgPSBhdGlpeHBfcmVhZChjaGlwLCBDTUQpOworCWlmIChvbikgeworCQlpZiAoZGF0YSAmIEFUSV9SRUdfQ01EX01PREVNX09VVF9ETUExX0VOKQorCQkJcmV0dXJuOworCQlhdGlpeHBfb3V0X2ZsdXNoX2RtYShjaGlwKTsKKwkJZGF0YSB8PSBBVElfUkVHX0NNRF9NT0RFTV9PVVRfRE1BMV9FTjsKKwl9IGVsc2UKKwkJZGF0YSAmPSB+QVRJX1JFR19DTURfTU9ERU1fT1VUX0RNQTFfRU47CisJYXRpaXhwX3dyaXRlKGNoaXAsIENNRCwgZGF0YSk7Cit9CisKKy8qIHN0YXJ0L3N0b3AgdHJhbnNmZXIgb3ZlciBPVVQgRE1BICovCitzdGF0aWMgdm9pZCBhdGlpeHBfb3V0X2VuYWJsZV90cmFuc2ZlcihhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9NT0RFTV9TRU5EMV9FTiwKKwkJICAgICAgb24gPyBBVElfUkVHX0NNRF9NT0RFTV9TRU5EMV9FTiA6IDApOworfQorCisvKiBlbmFibGUvZGlzYWJsZSBhbmFsb2cgSU4gRE1BICovCitzdGF0aWMgdm9pZCBhdGlpeHBfaW5fZW5hYmxlX2RtYShhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9NT0RFTV9JTl9ETUFfRU4sCisJCSAgICAgIG9uID8gQVRJX1JFR19DTURfTU9ERU1fSU5fRE1BX0VOIDogMCk7Cit9CisKKy8qIHN0YXJ0L3N0b3AgYW5hbG9nIElOIERNQSAqLworc3RhdGljIHZvaWQgYXRpaXhwX2luX2VuYWJsZV90cmFuc2ZlcihhdGlpeHBfdCAqY2hpcCwgaW50IG9uKQoreworCWlmIChvbikgeworCQl1bnNpZ25lZCBpbnQgZGF0YSA9IGF0aWl4cF9yZWFkKGNoaXAsIENNRCk7CisJCWlmICghIChkYXRhICYgQVRJX1JFR19DTURfTU9ERU1fUkVDRUlWRV9FTikpIHsKKwkJCWRhdGEgfD0gQVRJX1JFR19DTURfTU9ERU1fUkVDRUlWRV9FTjsKKwkJCWF0aWl4cF93cml0ZShjaGlwLCBDTUQsIGRhdGEpOworCQl9CisJfSBlbHNlCisJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9NT0RFTV9SRUNFSVZFX0VOLCAwKTsKK30KKworLyogZmx1c2ggRklGTyBvZiBhbmFsb2cgSU4gRE1BICovCitzdGF0aWMgdm9pZCBhdGlpeHBfaW5fZmx1c2hfZG1hKGF0aWl4cF90ICpjaGlwKQoreworCWF0aWl4cF93cml0ZShjaGlwLCBNT0RFTV9GSUZPX0ZMVVNILCBBVElfUkVHX01PREVNX0ZJRk9fSU5fRkxVU0gpOworfQorCisvKiBzZXQgdXAgc2xvdHMgYW5kIGZvcm1hdHMgZm9yIGFuYWxvZyBPVVQgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkvKiBzZXQgb3V0cHV0IHRocmVzaG9sZCAqLworCWRhdGEgPSBhdGlpeHBfcmVhZChjaGlwLCBNT0RFTV9PVVRfRklGTyk7CisJZGF0YSAmPSB+QVRJX1JFR19NT0RFTV9PVVQxX0RNQV9USFJFU0hPTERfTUFTSzsKKwlkYXRhIHw9IDB4MDQgPDwgQVRJX1JFR19NT0RFTV9PVVQxX0RNQV9USFJFU0hPTERfU0hJRlQ7CisJYXRpaXhwX3dyaXRlKGNoaXAsIE1PREVNX09VVF9GSUZPLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHVwIHNsb3RzIGFuZCBmb3JtYXRzIGZvciBhbmFsb2cgSU4gKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCisvKgorICogaHdfcGFyYW1zIC0gYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgc2V0IHVwIGJ1ZmZlciBkZXNjcmlwdG9ycworICovCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgc25kX3BjbV9od19wYXJhbXNfdCAqaHdfcGFyYW1zKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWF0aWl4cF9kbWFfdCAqZG1hID0gKGF0aWl4cF9kbWFfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisJaW50IGk7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRtYS0+YnVmX2FkZHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCWRtYS0+YnVmX2J5dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpOworCisJZXJyID0gYXRpaXhwX2J1aWxkX2RtYV9wYWNrZXRzKGNoaXAsIGRtYSwgc3Vic3RyZWFtLAorCQkJCSAgICAgICBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpLAorCQkJCSAgICAgICBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogc2V0IHVwIG1vZGVtIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9DT0RFQ1M7IGkrKykgeworCQlpZiAoISBjaGlwLT5hYzk3W2ldKQorCQkJY29udGludWU7CisJCXNuZF9hYzk3X3dyaXRlKGNoaXAtPmFjOTdbaV0sIEFDOTdfTElORTFfUkFURSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSk7CisJCXNuZF9hYzk3X3dyaXRlKGNoaXAtPmFjOTdbaV0sIEFDOTdfTElORTFfTEVWRUwsIDApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9wY21faHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWF0aWl4cF9kbWFfdCAqZG1hID0gKGF0aWl4cF9kbWFfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJYXRpaXhwX2NsZWFyX2RtYV9wYWNrZXRzKGNoaXAsIGRtYSwgc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHBjbSBoYXJkd2FyZSBkZWZpbml0aW9uLCBpZGVudGljYWwgZm9yIGFsbCBETUEgdHlwZXMKKyAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfYXRpaXhwX3BjbV9odyA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQkxNjAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTIsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMjU2ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJQVRJX01BWF9ERVNDUklQVE9SUywKK307CisKK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9wY21fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGF0aWl4cF9kbWFfdCAqZG1hLCBpbnQgcGNtX3R5cGUpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzW10gPSB7IDgwMDAsICA5NjAwLCAxMjAwMCwgMTYwMDAgfTsKKwlzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCBod19jb25zdHJhaW50c19yYXRlcyA9IHsKKwkJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlcyksCisJCS5saXN0ID0gcmF0ZXMsCisJCS5tYXNrID0gMCwKKwl9OworCisJc25kX2Fzc2VydChkbWEtPm9wcyAmJiBkbWEtPm9wcy0+ZW5hYmxlX2RtYSwgcmV0dXJuIC1FSU5WQUwpOworCisJaWYgKGRtYS0+b3BlbmVkKQorCQlyZXR1cm4gLUVCVVNZOworCWRtYS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2F0aWl4cF9wY21faHc7CisJZG1hLT5hYzk3X3BjbV90eXBlID0gcGNtX3R5cGU7CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX3JhdGVzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZG1hOworCisJLyogZW5hYmxlIERNQSBiaXRzICovCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNoaXAsIDEpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWRtYS0+b3BlbmVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgYXRpaXhwX2RtYV90ICpkbWEpCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJLyogZGlzYWJsZSBETUEgYml0cyAqLworCXNuZF9hc3NlcnQoZG1hLT5vcHMgJiYgZG1hLT5vcHMtPmVuYWJsZV9kbWEsIHJldHVybiAtRUlOVkFMKTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZG1hLT5zdWJzdHJlYW0gPSBOVUxMOworCWRtYS0+b3BlbmVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqLworc3RhdGljIGludCBzbmRfYXRpaXhwX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWF0aWl4cF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBlcnI7CisKKwlkb3duKCZjaGlwLT5vcGVuX211dGV4KTsKKwllcnIgPSBzbmRfYXRpaXhwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10sIDApOworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXRpaXhwX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCWRvd24oJmNoaXAtPm9wZW5fbXV0ZXgpOworCWVyciA9IHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10pOworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX2F0aWl4cF9wY21fb3BlbihzdWJzdHJlYW0sICZjaGlwLT5kbWFzW0FUSV9ETUFfQ0FQVFVSRV0sIDEpOworfQorCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJYXRpaXhwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9hdGlpeHBfcGNtX2Nsb3NlKHN1YnN0cmVhbSwgJmNoaXAtPmRtYXNbQVRJX0RNQV9DQVBUVVJFXSk7Cit9CisKKworLyogQUM5NyBwbGF5YmFjayAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2F0aWl4cF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9hdGlpeHBfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hdGlpeHBfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfYXRpaXhwX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYXRpaXhwX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2F0aWl4cF9wY21fcG9pbnRlciwKK307CisKKy8qIEFDOTcgY2FwdHVyZSAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfYXRpaXhwX2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfYXRpaXhwX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9hdGlpeHBfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9hdGlpeHBfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfYXRpaXhwX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9hdGlpeHBfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfYXRpaXhwX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIGF0aWl4cF9kbWFfb3BzX3Qgc25kX2F0aWl4cF9wbGF5YmFja19kbWFfb3BzID0geworCS50eXBlID0gQVRJX0RNQV9QTEFZQkFDSywKKwkubGxwX29mZnNldCA9IEFUSV9SRUdfTU9ERU1fT1VUX0RNQTFfTElOS1BUUiwKKwkuZHRfY3VyID0gQVRJX1JFR19NT0RFTV9PVVRfRE1BMV9EVF9DVVIsCisJLmVuYWJsZV9kbWEgPSBhdGlpeHBfb3V0X2VuYWJsZV9kbWEsCisJLmVuYWJsZV90cmFuc2ZlciA9IGF0aWl4cF9vdXRfZW5hYmxlX3RyYW5zZmVyLAorCS5mbHVzaF9kbWEgPSBhdGlpeHBfb3V0X2ZsdXNoX2RtYSwKK307CisJCitzdGF0aWMgYXRpaXhwX2RtYV9vcHNfdCBzbmRfYXRpaXhwX2NhcHR1cmVfZG1hX29wcyA9IHsKKwkudHlwZSA9IEFUSV9ETUFfQ0FQVFVSRSwKKwkubGxwX29mZnNldCA9IEFUSV9SRUdfTU9ERU1fSU5fRE1BX0xJTktQVFIsCisJLmR0X2N1ciA9IEFUSV9SRUdfTU9ERU1fSU5fRE1BX0RUX0NVUiwKKwkuZW5hYmxlX2RtYSA9IGF0aWl4cF9pbl9lbmFibGVfZG1hLAorCS5lbmFibGVfdHJhbnNmZXIgPSBhdGlpeHBfaW5fZW5hYmxlX3RyYW5zZmVyLAorCS5mbHVzaF9kbWEgPSBhdGlpeHBfaW5fZmx1c2hfZG1hLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F0aWl4cF9wY21fbmV3KGF0aWl4cF90ICpjaGlwKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwkvKiBpbml0aWFsaXplIGNvbnN0YW50cyAqLworCWNoaXAtPmRtYXNbQVRJX0RNQV9QTEFZQkFDS10ub3BzID0gJnNuZF9hdGlpeHBfcGxheWJhY2tfZG1hX29wczsKKwljaGlwLT5kbWFzW0FUSV9ETUFfQ0FQVFVSRV0ub3BzID0gJnNuZF9hdGlpeHBfY2FwdHVyZV9kbWFfb3BzOworCisJLyogUENNICMwOiBhbmFsb2cgSS9PICovCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkFUSSBJWFAgTUM5NyIsIEFUSV9QQ01ERVZfQU5BTE9HLCAxLCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2F0aWl4cF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9hdGlpeHBfY2FwdHVyZV9vcHMpOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiQVRJIElYUCBNQzk3Iik7CisJY2hpcC0+cGNtZGV2c1tBVElfUENNREVWX0FOQUxPR10gPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KTsKKworCXJldHVybiAwOworfQorCisKKworLyoKKyAqIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfYXRpaXhwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWF0aWl4cF90ICpjaGlwID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBhdGlpeHBfcmVhZChjaGlwLCBJU1IpOworCisJaWYgKCEgc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBwcm9jZXNzIGF1ZGlvIERNQSAqLworCWlmIChzdGF0dXMgJiBBVElfUkVHX0lTUl9NT0RFTV9PVVQxX1hSVU4pCisJCXNuZF9hdGlpeHBfeHJ1bl9kbWEoY2hpcCwgICZjaGlwLT5kbWFzW0FUSV9ETUFfUExBWUJBQ0tdKTsKKwllbHNlIGlmIChzdGF0dXMgJiBBVElfUkVHX0lTUl9NT0RFTV9PVVQxX1NUQVRVUykKKwkJc25kX2F0aWl4cF91cGRhdGVfZG1hKGNoaXAsICZjaGlwLT5kbWFzW0FUSV9ETUFfUExBWUJBQ0tdKTsKKwlpZiAoc3RhdHVzICYgQVRJX1JFR19JU1JfTU9ERU1fSU5fWFJVTikKKwkJc25kX2F0aWl4cF94cnVuX2RtYShjaGlwLCAgJmNoaXAtPmRtYXNbQVRJX0RNQV9DQVBUVVJFXSk7CisJZWxzZSBpZiAoc3RhdHVzICYgQVRJX1JFR19JU1JfTU9ERU1fSU5fU1RBVFVTKQorCQlzbmRfYXRpaXhwX3VwZGF0ZV9kbWEoY2hpcCwgJmNoaXAtPmRtYXNbQVRJX0RNQV9DQVBUVVJFXSk7CisKKwkvKiBmb3IgY29kZWMgZGV0ZWN0aW9uICovCisJaWYgKHN0YXR1cyAmIENPREVDX0NIRUNLX0JJVFMpIHsKKwkJdW5zaWduZWQgaW50IGRldGVjdGVkOworCQlkZXRlY3RlZCA9IHN0YXR1cyAmIENPREVDX0NIRUNLX0JJVFM7CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQljaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyB8PSBkZXRlY3RlZDsKKwkJYXRpaXhwX3VwZGF0ZShjaGlwLCBJRVIsIGRldGVjdGVkLCAwKTsgLyogZGlzYWJsZSB0aGUgZGV0ZWN0ZWQgaXJxcyAqLworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCX0KKworCS8qIGFjayAqLworCWF0aWl4cF93cml0ZShjaGlwLCBJU1IsIHN0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoKKyAqIGFjOTcgbWl4ZXIgc2VjdGlvbgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hdGlpeHBfbWl4ZXJfbmV3KGF0aWl4cF90ICpjaGlwLCBpbnQgY2xvY2spCit7CisJYWM5N19idXNfdCAqcGJ1czsKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwlpbnQgaSwgZXJyOworCWludCBjb2RlY19jb3VudDsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSBzbmRfYXRpaXhwX2FjOTdfd3JpdGUsCisJCS5yZWFkID0gc25kX2F0aWl4cF9hYzk3X3JlYWQsCisJfTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVjX3NraXBbTlVNX0FUSV9DT0RFQ1NdID0geworCQlBVElfUkVHX0lTUl9DT0RFQzBfTk9UX1JFQURZLAorCQlBVElfUkVHX0lTUl9DT0RFQzFfTk9UX1JFQURZLAorCQlBVElfUkVHX0lTUl9DT0RFQzJfTk9UX1JFQURZLAorCX07CisKKwlpZiAoc25kX2F0aWl4cF9jb2RlY19kZXRlY3QoY2hpcCkgPCAwKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2hpcC0+Y2FyZCwgMCwgJm9wcywgY2hpcCwgJnBidXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcGJ1cy0+Y2xvY2sgPSBjbG9jazsKKwlwYnVzLT5zaGFyZWRfdHlwZSA9IEFDOTdfU0hBUkVEX1RZUEVfQVRJSVhQOwkvKiBzaGFyZWQgd2l0aCBhdWRpbyBkcml2ZXIgKi8KKwljaGlwLT5hYzk3X2J1cyA9IHBidXM7CisKKwljb2RlY19jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BVElfQ09ERUNTOyBpKyspIHsKKwkJaWYgKGNoaXAtPmNvZGVjX25vdF9yZWFkeV9iaXRzICYgY29kZWNfc2tpcFtpXSkKKwkJCWNvbnRpbnVlOworCQltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwkJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7CisJCWFjOTcubnVtID0gaTsKKwkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5N1tpXSkpIDwgMCkgeworCQkJY2hpcC0+YWM5N1tpXSA9IE5VTEw7IC8qIHRvIGJlIHN1cmUgKi8KKwkJCXNuZF9wcmludGRkKCJhdGlpeHA6IGNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIG1vZGVtXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvZGVjX2NvdW50Kys7CisJfQorCisJaWYgKCEgY29kZWNfY291bnQpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBubyBjb2RlYyBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzbmRfYWM5N190dW5lX2hhcmR3YXJlKGNoaXAtPmFjOTcsIGFjOTdfcXVpcmtzKTsgKi8KKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBwb3dlciBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBpbnQgc25kX2F0aWl4cF9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlhdGlpeHBfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVRJX1BDTURFVlM7IGkrKykKKwkJaWYgKGNoaXAtPnBjbWRldnNbaV0pCisJCQlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbWRldnNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVRJX0NPREVDUzsgaSsrKQorCQlpZiAoY2hpcC0+YWM5N1tpXSkKKwkJCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5N1tpXSk7CisJc25kX2F0aWl4cF9hY2xpbmtfZG93bihjaGlwKTsKKwlzbmRfYXRpaXhwX2NoaXBfc3RvcChjaGlwKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoY2hpcC0+cGNpLCAzKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXRpaXhwX3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWF0aWl4cF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBpOworCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMCk7CisJcGNpX3NldF9tYXN0ZXIoY2hpcC0+cGNpKTsKKworCXNuZF9hdGlpeHBfYWNsaW5rX3Jlc2V0KGNoaXApOworCXNuZF9hdGlpeHBfY2hpcF9zdGFydChjaGlwKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVRJX0NPREVDUzsgaSsrKQorCQlpZiAoY2hpcC0+YWM5N1tpXSkKKwkJCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3W2ldKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKKy8qCisgKiBwcm9jIGludGVyZmFjZSBmb3IgcmVnaXN0ZXIgZHVtcAorICovCisKK3N0YXRpYyB2b2lkIHNuZF9hdGlpeHBfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWF0aWl4cF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gNCkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeDogJTA4eFxuIiwgaSwgcmVhZGwoY2hpcC0+cmVtYXBfYWRkciArIGkpKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9hdGlpeHBfcHJvY19pbml0KGF0aWl4cF90ICpjaGlwKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImF0aWl4cCIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX2F0aWl4cF9wcm9jX3JlYWQpOworfQorCisKKworLyoKKyAqIGRlc3RydWN0b3IKKyAqLworCitzdGF0aWMgaW50IHNuZF9hdGlpeHBfZnJlZShhdGlpeHBfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+aXJxIDwgMCkKKwkJZ290byBfX2h3X2VuZDsKKwlzbmRfYXRpaXhwX2NoaXBfc3RvcChjaGlwKTsKKwlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKKyAgICAgIF9faHdfZW5kOgorCWlmIChjaGlwLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOworCWlmIChjaGlwLT5yZW1hcF9hZGRyKQorCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXRpaXhwX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWF0aWl4cF90ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX2F0aWl4cF9mcmVlKGNoaXApOworfQorCisvKgorICogY29uc3RydWN0b3IgZm9yIGNoaXAgaW5zdGFuY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F0aWl4cF9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwKKwkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgIGF0aWl4cF90ICoqcl9jaGlwKQoreworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX2F0aWl4cF9kZXZfZnJlZSwKKwl9OworCWF0aWl4cF90ICpjaGlwOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CisJaW5pdF9NVVRFWCgmY2hpcC0+b3Blbl9tdXRleCk7CisJY2hpcC0+Y2FyZCA9IGNhcmQ7CisJY2hpcC0+cGNpID0gcGNpOworCWNoaXAtPmlycSA9IC0xOworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJBVEkgSVhQIE1DOTciKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWNoaXAtPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YWRkciwgcGNpX3Jlc291cmNlX2xlbihwY2ksIDApKTsKKwlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXRpaXhwX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBjYXJkLT5zaG9ydG5hbWUsICh2b2lkICopY2hpcCkpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcl9jaGlwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYXRpaXhwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWF0aWl4cF90ICpjaGlwOworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT05fSUQsICZyZXZpc2lvbik7CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQVRJSVhQLU1PREVNIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkFUSSBJWFAgTW9kZW0iKTsKKwlpZiAoKGVyciA9IHNuZF9hdGlpeHBfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKworCWlmICgoZXJyID0gc25kX2F0aWl4cF9hY2xpbmtfcmVzZXQoY2hpcCkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCisJaWYgKChlcnIgPSBzbmRfYXRpaXhwX21peGVyX25ldyhjaGlwLCBhYzk3X2Nsb2NrW2Rldl0pKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKworCWlmICgoZXJyID0gc25kX2F0aWl4cF9wY21fbmV3KGNoaXApKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKwkKKwlzbmRfYXRpaXhwX3Byb2NfaW5pdChjaGlwKTsKKworCXNuZF9hdGlpeHBfY2hpcF9zdGFydChjaGlwKTsKKworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyByZXYgJXggYXQgMHglbHgsIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgcmV2aXNpb24sIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CisKKwlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2FyZCwgc25kX2F0aWl4cF9zdXNwZW5kLCBzbmRfYXRpaXhwX3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworCisgX19lcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfYXRpaXhwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIkFUSSBJWFAgTUM5NyBjb250cm9sbGVyIiwKKwkuaWRfdGFibGUgPSBzbmRfYXRpaXhwX2lkcywKKwkucHJvYmUgPSBzbmRfYXRpaXhwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYXRpaXhwX3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2F0aWl4cF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9hdGlpeHBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2F0aWl4cF9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2F0aWl4cF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9NYWtlZmlsZSBiL3NvdW5kL3BjaS9hdTg4eDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNjZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACitzbmQtYXU4ODEwLW9ianMgOj0gYXU4ODEwLm8KK3NuZC1hdTg4MjAtb2JqcyA6PSBhdTg4MjAubworc25kLWF1ODgzMC1vYmpzIDo9IGF1ODgzMC5vCisKK29iai0kKENPTkZJR19TTkRfQVU4ODEwKSArPSBzbmQtYXU4ODEwLm8KK29iai0kKENPTkZJR19TTkRfQVU4ODIwKSArPSBzbmQtYXU4ODIwLm8KK29iai0kKENPTkZJR19TTkRfQVU4ODMwKSArPSBzbmQtYXU4ODMwLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODEwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTIyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgxMC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICJhdTg4MTAuaCIKKyNpbmNsdWRlICJhdTg4eDAuaCIKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfdm9ydGV4X2lkc1tdID0geworCXtQQ0lfVkVORE9SX0lEX0FVUkVBTCwgUENJX0RFVklDRV9JRF9BVVJFQUxfQURWQU5UQUdFLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxLH0sCisJezAsfQorfTsKKworI2luY2x1ZGUgImF1ODh4MF9jb3JlLmMiCisjaW5jbHVkZSAiYXU4OHgwX3BjbS5jIgorI2luY2x1ZGUgImF1ODh4MF9taXhlci5jIgorI2luY2x1ZGUgImF1ODh4MF9tcHU0MDEuYyIKKyNpbmNsdWRlICJhdTg4eDBfZ2FtZS5jIgorI2luY2x1ZGUgImF1ODh4MF9lcS5jIgorI2luY2x1ZGUgImF1ODh4MF9hM2QuYyIKKyNpbmNsdWRlICJhdTg4eDBfeHRhbGsuYyIKKyNpbmNsdWRlICJhdTg4eDAuYyIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODEwLmggYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzdkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgxMC5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICAgIEF1cmVhbCBBZHZhbnRhZ2UgU291bmRjYXJkIGRyaXZlci4KKyAqLworCisjZGVmaW5lIENISVBfQVU4ODEwCisKKyNkZWZpbmUgQ0FSRF9OQU1FICJBdXJlYWwgQWR2YW50YWdlIDNEIFNvdW5kIFByb2Nlc3NvciIKKyNkZWZpbmUgQ0FSRF9OQU1FX1NIT1JUICJhdTg4MTAiCisKKyNkZWZpbmUgTlJfQURCCQkweDEwCisjZGVmaW5lIE5SX1dUCQkweDAwCisjZGVmaW5lIE5SX1NSQwkJMHgxMAorI2RlZmluZSBOUl9BM0QJCTB4MTAKKyNkZWZpbmUgTlJfTUlYSU4JMHgyMAorI2RlZmluZSBOUl9NSVhPVVQJMHgxMAorCisKKy8qIEFEQkRNQSAqLworI2RlZmluZSBWT1JURVhfQURCRE1BX1NUQVQgMHgyN2UwMAkvKiByZWFkIG9ubHksIHN1YmJ1ZmZlciwgRE1BIHBvcyAqLworI2RlZmluZQkJUE9TX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgUE9TX1NISUZUIDB4MAorI2RlZmluZSAJQURCX1NVQkJVRl9NQVNLIDB4MDAwMDMwMDAJLyogQURCIG9ubHkuICovCisjZGVmaW5lICAgICBBREJfU1VCQlVGX1NISUZUIDB4YwkvKiBBREIgb25seS4gKi8KKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9DVFJMIDB4MjcxODAJLyogd3JpdGUgb25seTsgZm9ybWF0LCBmbGFncywgRE1BIHBvcyAqLworI2RlZmluZQkJT0ZGU0VUX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgT0ZGU0VUX1NISUZUIDB4MAorI2RlZmluZQkJSUVfTUFTSyAweDAwMDAxMDAwCS8qIGludGVycnVwdCBlbmFibGUuICovCisjZGVmaW5lICAgICBJRV9TSElGVCAweGMKKyNkZWZpbmUgICAgIERJUl9NQVNLIDB4MDAwMDIwMDAJLyogRGlyZWN0aW9uICovCisjZGVmaW5lICAgICBESVJfU0hJRlQgMHhkCisjZGVmaW5lCQlGTVRfTUFTSyAweDAwMDNjMDAwCisjZGVmaW5lCQlGTVRfU0hJRlQgMHhlCisvLyBUaGUgQURCIG1hc2tzIGFuZCBzaGlmdCBhbHNvIGFyZSB2YWxpZCBmb3IgdGhlIHd0ZG1hLCBleGNlcHQgaWYgc3BlY2lmaWVkIG90aGVyd2lzZS4KKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9CVUZDRkcwIDB4MjcxMDAKKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9CVUZDRkcxIDB4MjcxMDQKKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9CVUZCQVNFIDB4MjcwMDAKKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9TVEFSVCAweDI3YzAwCS8qIFdoaWNoIHN1YmJ1ZmZlciBzdGFydHMgKi8KKworI2RlZmluZSBWT1JURVhfQURCRE1BX1NUQVRVUyAweDI3QTkwCS8qIHN0b3JlZCBhdCBBZGJEbWEtPnRoaXNfMTAgLyAyIERXT1JEIGluIHNpemUuICovCisKKy8qIFdURE1BICovCisjZGVmaW5lIFZPUlRFWF9XVERNQV9DVFJMIDB4MjdmZDgJLyogZm9ybWF0LCBETUEgcG9zICovCisjZGVmaW5lIFZPUlRFWF9XVERNQV9TVEFUIDB4MjdmZTgJLyogRE1BIHN1YmJ1ZiwgRE1BIHBvcyAqLworI2RlZmluZSAgICAgV1RfU1VCQlVGX01BU0sgMHgzCisjZGVmaW5lICAgICBXVF9TVUJCVUZfU0hJRlQgMHhjCisjZGVmaW5lIFZPUlRFWF9XVERNQV9CVUZCQVNFIDB4MjdmYzAKKyNkZWZpbmUgVk9SVEVYX1dURE1BX0JVRkNGRzAgMHgyN2ZkMAorI2RlZmluZSBWT1JURVhfV1RETUFfQlVGQ0ZHMSAweDI3ZmQ0CisjZGVmaW5lIFZPUlRFWF9XVERNQV9TVEFSVCAweDI3ZmU0CS8qIHdoaWNoIHN1YmJ1ZmZlciBpcyBmaXJzdCAqLworCisvKiBBREIgKi8KKyNkZWZpbmUgVk9SVEVYX0FEQl9TUiAweDI4NDAwCS8qIFNhbXBsZXJhdGVzIGVuYWJsZS9kaXNhYmxlICovCisjZGVmaW5lIFZPUlRFWF9BREJfUlRCQVNFIDB4MjgwMDAKKyNkZWZpbmUgVk9SVEVYX0FEQl9SVEJBU0VfQ09VTlQgMTczCisjZGVmaW5lIFZPUlRFWF9BREJfQ0hOQkFTRSAweDI4MmI0CisjZGVmaW5lIFZPUlRFWF9BREJfQ0hOQkFTRV9DT1VOVCAyNAorI2RlZmluZSAJUk9VVEVfTUFTSwkweGZmZmYKKyNkZWZpbmUJCVNPVVJDRV9NQVNLCTB4ZmYwMAorI2RlZmluZSAgICAgQURCX01BU0sgICAweGZmCisjZGVmaW5lCQlBREJfU0hJRlQgMHg4CisKKy8qIEFEQiBhZGRyZXNzICovCisjZGVmaW5lCQlPRkZTRVRfQURCRE1BCTB4MDAKKyNkZWZpbmUJCU9GRlNFVF9TUkNJTgkweDQwCisjZGVmaW5lCQlPRkZTRVRfU1JDT1VUCTB4MjAKKyNkZWZpbmUJCU9GRlNFVF9NSVhJTgkweDUwCisjZGVmaW5lCQlPRkZTRVRfTUlYT1VUCTB4MzAKKyNkZWZpbmUJCU9GRlNFVF9DT0RFQ0lOCTB4NzAKKyNkZWZpbmUJCU9GRlNFVF9DT0RFQ09VVAkweDg4CisjZGVmaW5lCQlPRkZTRVRfU1BPUlRJTgkweDc4CS8qIGNoIDB4MTMgKi8KKyNkZWZpbmUJCU9GRlNFVF9TUE9SVE9VVAkweDkwCisjZGVmaW5lCQlPRkZTRVRfU1BESUZPVVQJMHg5MgkvKiBjaCAweDE0IGNoZWNrIHRoaXMhICovCisjZGVmaW5lCQlPRkZTRVRfRVFJTgkweGEwCisjZGVmaW5lCQlPRkZTRVRfRVFPVVQJMHg3ZQkvKiAyIHJvdXRlcyBvbiBjaCAweDExICovCisjZGVmaW5lCQlPRkZTRVRfWFRBTEtPVVQJMHg2NgkvKiBjcm9zc3RhbGsgY2FuY2VsbGVyIChzb3VyY2UpICovCisjZGVmaW5lCQlPRkZTRVRfWFRBTEtJTgkweDk2CS8qIGNyb3NzdGFsayBjYW5jZWxsZXIgKHNpbmspICovCisjZGVmaW5lCQlPRkZTRVRfQTNESU4JMHg3MAkvKiBBREIgc2luay4gKi8KKyNkZWZpbmUJCU9GRlNFVF9BM0RPVVQJMHhBNgkvKiBBREIgc291cmNlLiAyIHJvdXRlcyBwZXIgc2xpY2UgPSA4ICovCisjZGVmaW5lCQlPRkZTRVRfRUZYSU4JMHg4MAkvKiBBREIgc2luay4gKi8KKyNkZWZpbmUJCU9GRlNFVF9FRlhPVVQJMHg2OAkvKiBBREIgc291cmNlLiAqLworCisvKiBBREIgcm91dGUgdHJhbnNsYXRlIGhlbHBlciAqLworI2RlZmluZSBBREJfRE1BKHgpICh4KQorI2RlZmluZSBBREJfU1JDT1VUKHgpICh4ICsgT0ZGU0VUX1NSQ09VVCkKKyNkZWZpbmUgQURCX1NSQ0lOKHgpICh4ICsgT0ZGU0VUX1NSQ0lOKQorI2RlZmluZSBBREJfTUlYT1VUKHgpICh4ICsgT0ZGU0VUX01JWE9VVCkKKyNkZWZpbmUgQURCX01JWElOKHgpICh4ICsgT0ZGU0VUX01JWElOKQorI2RlZmluZSBBREJfQ09ERUNJTih4KSAoeCArIE9GRlNFVF9DT0RFQ0lOKQorI2RlZmluZSBBREJfQ09ERUNPVVQoeCkgKHggKyBPRkZTRVRfQ09ERUNPVVQpCisjZGVmaW5lIEFEQl9TUE9SVElOKHgpICh4ICsgT0ZGU0VUX1NQT1JUSU4pCisjZGVmaW5lIEFEQl9TUE9SVE9VVCh4KSAoeCArIE9GRlNFVF9TUE9SVE9VVCkKKyNkZWZpbmUgQURCX1NQRElGT1VUKHgpCSh4ICsgT0ZGU0VUX1NQRElGT1VUKQorI2RlZmluZSBBREJfRVFJTih4KSAoeCArIE9GRlNFVF9FUUlOKQorI2RlZmluZSBBREJfRVFPVVQoeCkgKHggKyBPRkZTRVRfRVFPVVQpCisjZGVmaW5lIEFEQl9BM0RPVVQoeCkgKHggKyBPRkZTRVRfQTNET1VUKQkvKiAweDEwIEEzRCBibG9ja3MgKi8KKyNkZWZpbmUgQURCX0EzRElOKHgpICh4ICsgT0ZGU0VUX0EzRElOKQorI2RlZmluZSBBREJfWFRBTEtJTih4KSAoeCArIE9GRlNFVF9YVEFMS0lOKQorI2RlZmluZSBBREJfWFRBTEtPVVQoeCkgKHggKyBPRkZTRVRfWFRBTEtPVVQpCisKKyNkZWZpbmUgTUlYX09VVEwgICAgMHhlCisjZGVmaW5lIE1JWF9PVVRSICAgIDB4ZgorI2RlZmluZSBNSVhfSU5MICAgICAweDFlCisjZGVmaW5lIE1JWF9JTlIgICAgIDB4MWYKKyNkZWZpbmUgTUlYX0RFRklHQUlOIDB4MDgJLyogMHg4ID0+IDZkQiAqLworI2RlZmluZSBNSVhfREVGT0dBSU4gMHgwOAorCisvKiBNSVhFUiAqLworI2RlZmluZSBWT1JURVhfTUlYRVJfU1IgMHgyMWYwMAorI2RlZmluZSBWT1JURVhfTUlYRVJfQ0xJUCAweDIxZjgwCisjZGVmaW5lIFZPUlRFWF9NSVhFUl9DSE5CQVNFIDB4MjFlNDAKKyNkZWZpbmUgVk9SVEVYX01JWEVSX1JUQkFTRSAweDIxZTAwCisjZGVmaW5lIAlNSVhFUl9SVEJBU0VfU0laRSAweDM4CisjZGVmaW5lIFZPUlRFWF9NSVhfRU5JTiAweDIxYTAwCS8qIElucHV0IGVuYWJsZSBiaXRzLiA0IGJpdHMgd2lkZS4gKi8KKyNkZWZpbmUgVk9SVEVYX01JWF9TTVAgMHgyMWMwMAkvKiBBVTg4MjA6IDB4OWMwMCAqLworCisvKiBNSVggKi8KKyNkZWZpbmUgVk9SVEVYX01JWF9JTlZPTF9BIDB4MjEwMDAJLyogaW4/ICovCisjZGVmaW5lIFZPUlRFWF9NSVhfSU5WT0xfQiAweDIwMDAwCS8qIG91dD8gKi8KKyNkZWZpbmUgVk9SVEVYX01JWF9WT0xfQSAweDIxODAwCisjZGVmaW5lIFZPUlRFWF9NSVhfVk9MX0IgMHgyMDgwMAorCisjZGVmaW5lIAlWT0xfTUlOIDB4ODAJLyogSW5wdXQgdm9sdW1lIHdoZW4gbXV0ZWQuICovCisjZGVmaW5lCQlWT0xfTUFYIDB4N2YJLyogRklYTUU6IE5vdCBjb25maXJtZWQhIEp1c3QgZ3Vlc3NlZC4gKi8KKworLyogU1JDICovCisjZGVmaW5lIFZPUlRFWF9TUkNfQ0hOQkFTRQkJMHgyNmM0MAorI2RlZmluZSBWT1JURVhfU1JDX1JUQkFTRQkJMHgyNmMwMAorI2RlZmluZSBWT1JURVhfU1JDQkxPQ0tfU1IJCTB4MjZjYzAKKyNkZWZpbmUgVk9SVEVYX1NSQ19TT1VSQ0UJCTB4MjZjYzQKKyNkZWZpbmUgVk9SVEVYX1NSQ19TT1VSQ0VTSVpFCTB4MjZjYzgKKy8qIFBhcmFtcworCTB4MjZlMDAJOiAxIFUwCisJMHgyNmU0MAk6IDIgQ1IKKwkweDI2ZTgwCTogMyBVMworCTB4MjZlYzAJOiA0IERSSUZUMQorCTB4MjZmMDAgOiA1IFUxCisJMHgyNmY0MAk6IDYgRFJJRlQyCisJMHgyNmY4MAk6IDcgVTIgOiBUYXJnZXQgcmF0ZSwgZGlyZWN0aW9uCisqLworCisjZGVmaW5lIFZPUlRFWF9TUkNfQ09OVlJBVElPCTB4MjZlNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDAJCTB4MjZlODAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDEJCTB4MjZlYzAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDIJCTB4MjZmNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19VMAkJCTB4MjZlMDAKKyNkZWZpbmUJCVUwX1NMT1dMT0NLCQkweDIwMAorI2RlZmluZSBWT1JURVhfU1JDX1UxCQkJMHgyNmYwMAorI2RlZmluZSBWT1JURVhfU1JDX1UyCQkJMHgyNmY4MAorI2RlZmluZSBWT1JURVhfU1JDX0RBVEEJCQkweDI2ODAwCS8qIDB4YzgwMCAqLworI2RlZmluZSBWT1JURVhfU1JDX0RBVEEwCQkweDI2MDAwCisKKy8qIEZJRk8gKi8KKyNkZWZpbmUgVk9SVEVYX0ZJRk9fQURCQ1RSTCAweDE2MTAwCS8qIENvbnRyb2wgYml0cy4gKi8KKyNkZWZpbmUgVk9SVEVYX0ZJRk9fV1RDVFJMIDB4MTYwMDAKKyNkZWZpbmUJCUZJRk9fUkRPTkxZCTB4MDAwMDAwMDEKKyNkZWZpbmUJCUZJRk9fQ1RSTAkweDAwMDAwMDAyCS8qIEFsbG93IGN0cmwuID8gKi8KKyNkZWZpbmUJCUZJRk9fVkFMSUQJMHgwMDAwMDAxMAorI2RlZmluZSAJRklGT19FTVBUWQkweDAwMDAwMDIwCisjZGVmaW5lCQlGSUZPX1UwCQkweDAwMDAxMDAwCS8qIFVua25vd24uICovCisjZGVmaW5lCQlGSUZPX1UxCQkweDAwMDEwMDAwCisjZGVmaW5lCQlGSUZPX1NJWkVfQklUUyA1CisjZGVmaW5lCQlGSUZPX1NJWkUJKDE8PEZJRk9fU0laRV9CSVRTKQkvLyAweDIwCisjZGVmaW5lIAlGSUZPX01BU0sJKEZJRk9fU0laRS0xKQkvLzB4MWYgICAgLyogYXQgc2hpZnQgbGVmdCAweGMgKi8KKy8vI2RlZmluZSAgICAgICBGSUZPX01BU0sgICAgICAgMHgxZiAgICAvKiBhdCBzaGlmdCBsZWZ0IDB4YiAqLworLy8jZGVmaW5lICAgICAgICAgICAgICAgRklGT19TSVpFICAgICAgIDB4MjAKKyNkZWZpbmUgCUZJRk9fQklUUwkweDAzODgwMDAwCisjZGVmaW5lIFZPUlRFWF9GSUZPX0FEQkRBVEEJMHgxNDAwMAorI2RlZmluZSBWT1JURVhfRklGT19XVERBVEEJMHgxMDAwMAorCisvKiBDT0RFQyAqLworI2RlZmluZSBWT1JURVhfQ09ERUNfQ1RSTAkweDI5MTg0CisjZGVmaW5lIFZPUlRFWF9DT0RFQ19FTgkJMHgyOTE5MAorI2RlZmluZQkJRU5fQ09ERUMwCTB4MDAwMDAzMDAKKyNkZWZpbmUgCUVOX0FDOTgJCTB4MDAwMDBjMDAgLyogTW9kZW0gQUM5OCBzbG90cy4gKi8KKyNkZWZpbmUJCUVOX0NPREVDMQkweDAwMDAzMDAwCisjZGVmaW5lCQlFTl9DT0RFQwkoRU5fQ09ERUMwIHwgRU5fQ09ERUMxKQorI2RlZmluZQkJRU5fU1BPUlQJMHgwMDAzMDAwMAorI2RlZmluZQkJRU5fU1BESUYJMHgwMDBjMDAwMAorCisjZGVmaW5lIFZPUlRFWF9DT0RFQ19DSE4gCTB4MjkwODAKKyNkZWZpbmUgVk9SVEVYX0NPREVDX1dSSVRFCTB4MDA4MDAwMDAKKyNkZWZpbmUgVk9SVEVYX0NPREVDX0FERFNISUZUIAkxNgorI2RlZmluZSBWT1JURVhfQ09ERUNfQURETUFTSwkweDdmMDAwMAkvKiAweDAwMGYwMDAwICovCisjZGVmaW5lIFZPUlRFWF9DT0RFQ19EQVRTSElGVAkwCisjZGVmaW5lIFZPUlRFWF9DT0RFQ19EQVRNQVNLCTB4ZmZmZgorI2RlZmluZSBWT1JURVhfQ09ERUNfSU8JCTB4MjkxODgKKworLyogU1BESUYgKi8KKyNkZWZpbmUgVk9SVEVYX1NQRElGX0ZMQUdTCTB4MjIwNWMKKyNkZWZpbmUgVk9SVEVYX1NQRElGX0NGRzAJMHgyOTFEMAorI2RlZmluZSBWT1JURVhfU1BESUZfQ0ZHMQkweDI5MUQ0CisjZGVmaW5lIFZPUlRFWF9TUERJRl9TTVBSQVRFCTB4MjkxOTQKKworLyogU2FtcGxlIHRpbWVyICovCisjZGVmaW5lIFZPUlRFWF9TTVBfVElNRQkJMHgyOTE5OAorCisjZGVmaW5lIFZPUlRFWF9NT0RFTV9DVFJMCTB4MjkxYWMKKworLyogSVJRICovCisjZGVmaW5lIFZPUlRFWF9JUlFfU09VUkNFIDB4MmEwMDAJLyogSW50ZXJydXB0IHNvdXJjZSBmbGFncy4gKi8KKyNkZWZpbmUgVk9SVEVYX0lSUV9DVFJMIDB4MmEwMDQJLyogSW50ZXJydXB0IHNvdXJjZSBtYXNrLiAqLworCisjZGVmaW5lIFZPUlRFWF9TVEFUCTB4MmEwMDgJLyogU3RhdHVzICovCisKKyNkZWZpbmUgVk9SVEVYX0NUUkwJCTB4MmEwMGMKKyNkZWZpbmUgCUNUUkxfTUlESV9FTgkweDAwMDAwMDAxCisjZGVmaW5lIAlDVFJMX01JRElfUE9SVAkweDAwMDAwMDYwCisjZGVmaW5lIAlDVFJMX0dBTUVfRU4JMHgwMDAwMDAwOAorI2RlZmluZSAJQ1RSTF9HQU1FX1BPUlQJMHgwMDAwMGUwMAorLy8jZGVmaW5lICAgICAgIENUUkxfSVJRX0VOQUJMRSAweDAxMDA0MDAwCisjZGVmaW5lIAlDVFJMX0lSUV9FTkFCTEUJMHgwMDAwNDAwMAorCisvKiB3cml0ZTogVGltZXIgcGVyaW9kIGNvbmZpZyAvIHJlYWQ6IFRJTUVSIElSUSBhY2suICovCisjZGVmaW5lIFZPUlRFWF9JUlFfU1RBVAkJMHgyOTE5YworCisvKiBETUEgKi8KKyNkZWZpbmUgVk9SVEVYX0VOR0lORV9DVFJMCTB4MjdhZTgKKyNkZWZpbmUgCUVOR0lORV9JTklUCTB4MTM4MDAwMAorCisvKiBNSURJICovLyogR0FNRS4gKi8KKyNkZWZpbmUgVk9SVEVYX01JRElfREFUQQkweDI4ODAwCisjZGVmaW5lIFZPUlRFWF9NSURJX0NNRAkJMHgyODgwNAkvKiBXcml0ZSBjb21tYW5kIC8gUmVhZCBzdGF0dXMgKi8KKworI2RlZmluZSBWT1JURVhfQ1RSTDIJCTB4Mjg4MGMKKyNkZWZpbmUJCUNUUkwyX0dBTUVfQURDTU9ERSAweDQwCisjZGVmaW5lIFZPUlRFWF9HQU1FX0xFR0FDWQkweDI4ODA4CisjZGVmaW5lIFZPUlRFWF9HQU1FX0FYSVMJMHgyODgxMAorI2RlZmluZQkJQVhJU19TSVpFIDQKKyNkZWZpbmUJCUFYSVNfUkFOR0UgMHgxZmZmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODgyMC5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZiY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4MjAuYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiYXU4ODIwLmgiCisjaW5jbHVkZSAiYXU4OHgwLmgiCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3ZvcnRleF9pZHNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9BVVJFQUwsIFBDSV9ERVZJQ0VfSURfQVVSRUFMX1ZPUlRFWF8xLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLH0sCisJezAsfQorfTsKKworI2luY2x1ZGUgImF1ODh4MF9zeW50aC5jIgorI2luY2x1ZGUgImF1ODh4MF9jb3JlLmMiCisjaW5jbHVkZSAiYXU4OHgwX3BjbS5jIgorI2luY2x1ZGUgImF1ODh4MF9tcHU0MDEuYyIKKyNpbmNsdWRlICJhdTg4eDBfZ2FtZS5jIgorI2luY2x1ZGUgImF1ODh4MF9taXhlci5jIgorI2luY2x1ZGUgImF1ODh4MC5jIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4MjAuaCBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MDIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODIwLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgICAgQXVyZWFsIFZvcnRleCBTb3VuZGNhcmQgZHJpdmVyLgorCisgICAgSU8gYWRkciBjb2xsZWN0ZWQgZnJvbSBhc3A0Y29yZS52eGQ6CisgICAgZnVuY3Rpb24gICAgYWRkcmVzcworICAgIDAwMDVENUEwICAgIDEzMDA0CisgICAgMDAwODA2NzQgICAgMTQwMDQKKyAgICAwMDA4MEFGRiAgICAxMjgxOAorCisgKi8KKworI2RlZmluZSBDSElQX0FVODgyMAorCisjZGVmaW5lIENBUkRfTkFNRSAiQXVyZWFsIFZvcnRleCAzRCBTb3VuZCBQcm9jZXNzb3IiCisjZGVmaW5lIENBUkRfTkFNRV9TSE9SVCAiYXU4ODIwIgorCisvKiBOdW1iZXIgb2YgQURCIGFuZCBXVCBjaGFubmVscyAqLworI2RlZmluZSBOUl9BREIJCTB4MTAKKyNkZWZpbmUgTlJfV1QJCTB4MjAKKyNkZWZpbmUgTlJfU1JDCQkweDEwCisjZGVmaW5lIE5SX0EzRAkJMHgwMAorI2RlZmluZSBOUl9NSVhJTgkweDEwCisjZGVmaW5lIE5SX01JWE9VVCAJMHgxMAorCisKKy8qIEFEQkRNQSAqLworI2RlZmluZSBWT1JURVhfQURCRE1BX1NUQVQgMHgxMDVjMAkvKiByZWFkIG9ubHksIHN1YmJ1ZmZlciwgRE1BIHBvcyAqLworI2RlZmluZQkJUE9TX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgUE9TX1NISUZUIDB4MAorI2RlZmluZSAJQURCX1NVQkJVRl9NQVNLIDB4MDAwMDMwMDAJLyogQURCIG9ubHkuICovCisjZGVmaW5lICAgICBBREJfU1VCQlVGX1NISUZUIDB4YwkvKiBBREIgb25seS4gKi8KKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9DVFJMIDB4MTA1ODAJLyogd3JpdGUgb25seSwgZm9ybWF0LCBmbGFncywgRE1BIHBvcyAqLworI2RlZmluZQkJT0ZGU0VUX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgT0ZGU0VUX1NISUZUIDB4MAorI2RlZmluZQkJSUVfTUFTSyAweDAwMDAxMDAwCS8qIGludGVycnVwdCBlbmFibGUuICovCisjZGVmaW5lICAgICBJRV9TSElGVCAweGMKKyNkZWZpbmUgICAgIERJUl9NQVNLIDB4MDAwMDIwMDAJLyogRGlyZWN0aW9uLiAqLworI2RlZmluZSAgICAgRElSX1NISUZUIDB4ZAorI2RlZmluZQkJRk1UX01BU0sgMHgwMDAzYzAwMAorI2RlZmluZQkJRk1UX1NISUZUIDB4ZQorLy8gVGhlIG1hc2tzIGFuZCBzaGlmdCBhbHNvIHdvcmsgZm9yIHRoZSB3dGRtYSwgaWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UuCisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQ0ZHMCAweDEwNDAwCisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQ0ZHMSAweDEwNDA0CisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQkFTRSAweDEwMjAwCisjZGVmaW5lIFZPUlRFWF9BREJETUFfU1RBUlQgMHgxMDZjMAkvKiBXaGljaCBzdWJidWZmZXIgc3RhcnRzICovCisjZGVmaW5lIFZPUlRFWF9BREJETUFfU1RBVFVTIDB4MTA2MDAJLyogc3RvcmVkIGF0IEFkYkRtYS0+dGhpc18xMCAvIDIgRFdPUkQgaW4gc2l6ZS4gKi8KKworLyogQURCICovCisjZGVmaW5lIFZPUlRFWF9BREJfU1IgMHgxMGEwMAkvKiBTYW1wbGVyYXRlcyBlbmFibGUvZGlzYWJsZSAqLworI2RlZmluZSBWT1JURVhfQURCX1JUQkFTRSAweDEwODAwCisjZGVmaW5lIFZPUlRFWF9BREJfUlRCQVNFX0NPVU5UIDEwMworI2RlZmluZSBWT1JURVhfQURCX0NITkJBU0UgMHgxMDk5YworI2RlZmluZSBWT1JURVhfQURCX0NITkJBU0VfQ09VTlQgMjIKKyNkZWZpbmUgCVJPVVRFX01BU0sJMHgzZmZmCisjZGVmaW5lICAgICBBREJfTUFTSyAgIDB4N2YKKyNkZWZpbmUJCUFEQl9TSElGVCAweDcKKy8vI2RlZmluZSAgICAgQURCX01JWF9NQVNLIDB4ZgorLyogQURCIGFkZHJlc3MgKi8KKyNkZWZpbmUJCU9GRlNFVF9BREJETUEJMHgwMAorI2RlZmluZQkJT0ZGU0VUX1NSQ09VVAkweDEwCS8qIG9uIGNoYW5uZWwgMHgxMSAqLworI2RlZmluZQkJT0ZGU0VUX1NSQ0lOCTB4MTAJLyogb24gY2hhbm5lbCA8IDB4MTEgKi8KKyNkZWZpbmUJCU9GRlNFVF9NSVhPVVQJMHgyMAkvKiBzb3VyY2UgKi8KKyNkZWZpbmUJCU9GRlNFVF9NSVhJTgkweDMwCS8qIHNpbmsgKi8KKyNkZWZpbmUJCU9GRlNFVF9DT0RFQ0lOCTB4NDgJLyogQURCIHNvdXJjZSAqLworI2RlZmluZQkJT0ZGU0VUX0NPREVDT1VUCTB4NTgJLyogQURCIHNpbmsvdGFyZ2V0ICovCisjZGVmaW5lCQlPRkZTRVRfU1BPUlRPVVQJMHg2MAkvKiBzaW5rICovCisjZGVmaW5lCQlPRkZTRVRfU1BPUlRJTgkweDUwCS8qIHNvdXJjZSAqLworI2RlZmluZQkJT0ZGU0VUX0VGWE9VVAkweDUwCS8qIHNpbmsgKi8KKyNkZWZpbmUJCU9GRlNFVF9FRlhJTgkweDQwCS8qIHNvdXJjZSAqLworI2RlZmluZQkJT0ZGU0VUX0EzRE9VVAkweDAwCS8qIFRoaXMgY2FyZCBoYXMgbm8gSFJURiA6KCAqLworI2RlZmluZQkJT0ZGU0VUX0EzRElOCTB4MDAKKyNkZWZpbmUJCU9GRlNFVF9XVE9VVAkweDU4CS8qICAqLworCisvKiBBREIgcm91dGUgdHJhbnNsYXRlIGhlbHBlciAqLworI2RlZmluZSBBREJfRE1BKHgpICh4ICsgT0ZGU0VUX0FEQkRNQSkKKyNkZWZpbmUgQURCX1NSQ09VVCh4KSAoeCArIE9GRlNFVF9TUkNPVVQpCisjZGVmaW5lIEFEQl9TUkNJTih4KSAoeCArIE9GRlNFVF9TUkNJTikKKyNkZWZpbmUgQURCX01JWE9VVCh4KSAoeCArIE9GRlNFVF9NSVhPVVQpCisjZGVmaW5lIEFEQl9NSVhJTih4KSAoeCArIE9GRlNFVF9NSVhJTikKKyNkZWZpbmUgQURCX0NPREVDSU4oeCkgKHggKyBPRkZTRVRfQ09ERUNJTikKKyNkZWZpbmUgQURCX0NPREVDT1VUKHgpICh4ICsgT0ZGU0VUX0NPREVDT1VUKQorI2RlZmluZSBBREJfU1BPUlRPVVQoeCkgKHggKyBPRkZTRVRfU1BPUlRPVVQpCisjZGVmaW5lIEFEQl9TUE9SVElOKHgpICh4ICsgT0ZGU0VUX1NQT1JUSU4pCS8qICAqLworI2RlZmluZSBBREJfQTNET1VUKHgpICh4ICsgT0ZGU0VUX0EzRE9VVCkJLyogOCBBM0QgYmxvY2tzICovCisjZGVmaW5lIEFEQl9BM0RJTih4KSAoeCArIE9GRlNFVF9BM0RJTikKKyNkZWZpbmUgQURCX1dUT1VUKHgseSkgKHkgKyBPRkZTRVRfV1RPVVQpCisKKy8qIFdURE1BICovCisjZGVmaW5lIFZPUlRFWF9XVERNQV9DVFJMIDB4MTA1MDAJLyogZm9ybWF0LCBETUEgcG9zICovCisjZGVmaW5lIFZPUlRFWF9XVERNQV9TVEFUIDB4MTA1MDAJLyogRE1BIHN1YmJ1ZiwgRE1BIHBvcyAqLworI2RlZmluZSAgICAgV1RfU1VCQlVGX01BU0sgKDB4MyA8PCBXVF9TVUJCVUZfU0hJRlQpCisjZGVmaW5lICAgICBXVF9TVUJCVUZfU0hJRlQgMHgxNQorI2RlZmluZSBWT1JURVhfV1RETUFfQlVGQkFTRSAweDEwMDAwCisjZGVmaW5lIFZPUlRFWF9XVERNQV9CVUZDRkcwIDB4MTAzMDAKKyNkZWZpbmUgVk9SVEVYX1dURE1BX0JVRkNGRzEgMHgxMDMwNAorI2RlZmluZSBWT1JURVhfV1RETUFfU1RBUlQgMHgxMDY0MAkvKiB3aGljaCBzdWJidWZmZXIgaXMgZmlyc3QgKi8KKworI2RlZmluZSBWT1JURVhfV1RfQkFTRSAweDkwMDAKKworLyogTUlYRVIgKi8KKyNkZWZpbmUgVk9SVEVYX01JWEVSX1NSIDB4OWYwMAorI2RlZmluZSBWT1JURVhfTUlYRVJfQ0xJUCAweDlmODAKKyNkZWZpbmUgVk9SVEVYX01JWEVSX0NITkJBU0UgMHg5ZTQwCisjZGVmaW5lIFZPUlRFWF9NSVhFUl9SVEJBU0UgMHg5ZTAwCisjZGVmaW5lIAlNSVhFUl9SVEJBU0VfU0laRSAweDI2CisjZGVmaW5lIFZPUlRFWF9NSVhfRU5JTiAweDlhMDAJLyogSW5wdXQgZW5hYmxlIGJpdHMuIDQgYml0cyB3aWRlLiAqLworI2RlZmluZSBWT1JURVhfTUlYX1NNUCAweDljMDAKKworLyogTUlYICovCisjZGVmaW5lIFZPUlRFWF9NSVhfSU5WT0xfQSAweDkwMDAJLyogaW4/ICovCisjZGVmaW5lIFZPUlRFWF9NSVhfSU5WT0xfQiAweDgwMDAJLyogb3V0PyAqLworI2RlZmluZSBWT1JURVhfTUlYX1ZPTF9BIDB4OTgwMAorI2RlZmluZSBWT1JURVhfTUlYX1ZPTF9CIDB4ODgwMAorCisjZGVmaW5lIAlWT0xfTUlOIDB4ODAJLyogSW5wdXQgdm9sdW1lIHdoZW4gbXV0ZWQuICovCisjZGVmaW5lCQlWT0xfTUFYIDB4N2YJLyogRklYTUU6IE5vdCBjb25maXJtZWQhIEp1c3QgZ3Vlc3NlZC4gKi8KKworLy8jZGVmaW5lIE1JWF9PVVRMICAgIDB4ZQorLy8jZGVmaW5lIE1JWF9PVVRSICAgIDB4ZgorLy8jZGVmaW5lIE1JWF9JTkwgICAgIDB4ZQorLy8jZGVmaW5lIE1JWF9JTlIgICAgIDB4ZgorI2RlZmluZSBNSVhfREVGSUdBSU4gMHgwOAkvKiAweDggPT4gNmRCICovCisjZGVmaW5lIE1JWF9ERUZPR0FJTiAweDA4CisKKy8qIFNSQyAqLworI2RlZmluZSBWT1JURVhfU1JDQkxPQ0tfU1IJMHhjY2MwCisjZGVmaW5lIFZPUlRFWF9TUkNfQ0hOQkFTRQkweGNjNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19SVEJBU0UJMHhjYzAwCisjZGVmaW5lIFZPUlRFWF9TUkNfU09VUkNFCTB4Y2NjNAorI2RlZmluZSBWT1JURVhfU1JDX1NPVVJDRVNJWkUgMHhjY2M4CisjZGVmaW5lIFZPUlRFWF9TUkNfVTAJCTB4Y2UwMAorI2RlZmluZSBWT1JURVhfU1JDX0RSSUZUMAkweGNlODAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDEJMHhjZWMwCisjZGVmaW5lIFZPUlRFWF9TUkNfVTEJCTB4Y2YwMAorI2RlZmluZSBWT1JURVhfU1JDX0RSSUZUMgkweGNmNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19VMgkJMHhjZjgwCisjZGVmaW5lIFZPUlRFWF9TUkNfREFUQQkJMHhjODAwCisjZGVmaW5lIFZPUlRFWF9TUkNfREFUQTAJMHhjMDAwCisjZGVmaW5lIFZPUlRFWF9TUkNfQ09OVlJBVElPIDB4Y2U0MAorLy8jZGVmaW5lICAgICBTUkNfUkFUSU8oeCkgKCgoKHg8PDE1KS80ODAwMCkgKyAxKS8yKSAvKiBQbGF5YmFjayAqLworLy8jZGVmaW5lICAgICBTUkNfUkFUSU8yKHgpICgoKCg0ODAwMDw8MTUpL3gpICsgMSkvMikgLyogUmVjb3JkaW5nICovCisKKy8qIEZJRk8gKi8KKyNkZWZpbmUgVk9SVEVYX0ZJRk9fQURCQ1RSTCAweGY4MDAJLyogQ29udHJvbCBiaXRzLiAqLworI2RlZmluZSBWT1JURVhfRklGT19XVENUUkwgMHhmODQwCisjZGVmaW5lCQlGSUZPX1JET05MWQkweDAwMDAwMDAxCisjZGVmaW5lCQlGSUZPX0NUUkwJMHgwMDAwMDAwMgkvKiBBbGxvdyBjdHJsLiA/ICovCisjZGVmaW5lCQlGSUZPX1ZBTElECTB4MDAwMDAwMTAKKyNkZWZpbmUgCUZJRk9fRU1QVFkJMHgwMDAwMDAyMAorI2RlZmluZQkJRklGT19VMAkJMHgwMDAwMTAwMAkvKiBVbmtub3duLiAqLworI2RlZmluZQkJRklGT19VMQkJMHgwMDAxMDAwMAorI2RlZmluZQkJRklGT19TSVpFX0JJVFMgNQorI2RlZmluZQkJRklGT19TSVpFCSgxPDxGSUZPX1NJWkVfQklUUykJLy8gMHgyMAorI2RlZmluZSAJRklGT19NQVNLCShGSUZPX1NJWkUtMSkJLy8weDFmICAgIC8qIGF0IHNoaWZ0IGxlZnQgMHhjICovCisjZGVmaW5lIFZPUlRFWF9GSUZPX0FEQkRBVEEgMHhlMDAwCisjZGVmaW5lIFZPUlRFWF9GSUZPX1dUREFUQSAweGU4MDAKKworLyogQ09ERUMgKi8KKyNkZWZpbmUgVk9SVEVYX0NPREVDX0NUUkwgMHgxMTk4NAorI2RlZmluZSBWT1JURVhfQ09ERUNfRU4gMHgxMTk5MAorI2RlZmluZQkJRU5fQ09ERUMJMHgwMDAwMDMwMAorI2RlZmluZQkJRU5fU1BPUlQJMHgwMDAzMDAwMAorI2RlZmluZQkJRU5fU1BESUYJMHgwMDBjMDAwMAorI2RlZmluZSBWT1JURVhfQ09ERUNfQ0hOIDB4MTE4ODAKKyNkZWZpbmUgVk9SVEVYX0NPREVDX1dSSVRFIDB4MDA4MDAwMDAKKyNkZWZpbmUgVk9SVEVYX0NPREVDX0FERFNISUZUIDE2CisjZGVmaW5lIFZPUlRFWF9DT0RFQ19BRERNQVNLIDB4N2YwMDAwCS8qIDB4MDAwZjAwMDAgKi8KKyNkZWZpbmUgVk9SVEVYX0NPREVDX0RBVFNISUZUIDAKKyNkZWZpbmUgVk9SVEVYX0NPREVDX0RBVE1BU0sgMHhmZmZmCisjZGVmaW5lIFZPUlRFWF9DT0RFQ19JTyAweDExOTg4CisKKyNkZWZpbmUgVk9SVEVYX1NQRElGX0ZMQUdTCQkweDEwMDVjCS8qIEZJWE1FICovCisjZGVmaW5lIFZPUlRFWF9TUERJRl9DRkcwCQkweDExOUQwCisjZGVmaW5lIFZPUlRFWF9TUERJRl9DRkcxCQkweDExOUQ0CisjZGVmaW5lIFZPUlRFWF9TUERJRl9TTVBSQVRFCTB4MTE5OTQKKworLyogU2FtcGxlIHRpbWVyICovCisjZGVmaW5lIFZPUlRFWF9TTVBfVElNRSAweDExOTk4CisKKy8qIElSUSAqLworI2RlZmluZSBWT1JURVhfSVJRX1NPVVJDRSAweDEyODAwCS8qIEludGVycnVwdCBzb3VyY2UgZmxhZ3MuICovCisjZGVmaW5lIFZPUlRFWF9JUlFfQ1RSTCAweDEyODA0CS8qIEludGVycnVwdCBzb3VyY2UgbWFzay4gKi8KKworI2RlZmluZSBWT1JURVhfU1RBVAkJMHgxMjgwOAkvKiA/PyAqLworCisjZGVmaW5lIFZPUlRFWF9DVFJMIDB4MTI4MGMKKyNkZWZpbmUgCUNUUkxfTUlESV9FTiAweDAwMDAwMDAxCisjZGVmaW5lIAlDVFJMX01JRElfUE9SVCAweDAwMDAwMDYwCisjZGVmaW5lIAlDVFJMX0dBTUVfRU4gMHgwMDAwMDAwOAorI2RlZmluZSAJQ1RSTF9HQU1FX1BPUlQgMHgwMDAwMGUwMAorI2RlZmluZSAJQ1RSTF9JUlFfRU5BQkxFIDB4NDAwMAorCisvKiB3cml0ZTogVGltZXIgcGVyaW9kIGNvbmZpZyAvIHJlYWQ6IFRJTUVSIElSUSBhY2suICovCisjZGVmaW5lIFZPUlRFWF9JUlFfU1RBVCAweDExOTljCisKKy8qIERNQSAqLworI2RlZmluZSBWT1JURVhfRE1BX0JVRkZFUiAweDEwMjAwCisjZGVmaW5lIFZPUlRFWF9FTkdJTkVfQ1RSTCAweDEwNjBjCisjZGVmaW5lIAlFTkdJTkVfSU5JVCAweDBMCisKKwkJICAgICAvKiBNSURJICovLyogR0FNRS4gKi8KKyNkZWZpbmUgVk9SVEVYX01JRElfREFUQSAweDExMDAwCisjZGVmaW5lIFZPUlRFWF9NSURJX0NNRCAweDExMDA0CS8qIFdyaXRlIGNvbW1hbmQgLyBSZWFkIHN0YXR1cyAqLworI2RlZmluZSBWT1JURVhfR0FNRV9MRUdBQ1kgMHgxMTAwOAorI2RlZmluZSBWT1JURVhfQ1RSTDIgMHgxMTAwYworI2RlZmluZSAJQ1RSTDJfR0FNRV9BRENNT0RFIDB4NDAKKyNkZWZpbmUgVk9SVEVYX0dBTUVfQVhJUyAweDExMDEwCisjZGVmaW5lIAlBWElTX1NJWkUgNAorI2RlZmluZQkJQVhJU19SQU5HRSAweDFmZmYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODMwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjI3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODgzMC5jCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlICJhdTg4MzAuaCIKKyNpbmNsdWRlICJhdTg4eDAuaCIKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfdm9ydGV4X2lkc1tdID0geworCXtQQ0lfVkVORE9SX0lEX0FVUkVBTCwgUENJX0RFVklDRV9JRF9BVVJFQUxfVk9SVEVYXzIsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsfSwKKwl7MCx9Cit9OworCisjaW5jbHVkZSAiYXU4OHgwX3N5bnRoLmMiCisjaW5jbHVkZSAiYXU4OHgwX2NvcmUuYyIKKyNpbmNsdWRlICJhdTg4eDBfcGNtLmMiCisjaW5jbHVkZSAiYXU4OHgwX21peGVyLmMiCisjaW5jbHVkZSAiYXU4OHgwX21wdTQwMS5jIgorI2luY2x1ZGUgImF1ODh4MF9nYW1lLmMiCisjaW5jbHVkZSAiYXU4OHgwX2VxLmMiCisjaW5jbHVkZSAiYXU4OHgwX2EzZC5jIgorI2luY2x1ZGUgImF1ODh4MF94dGFsay5jIgorI2luY2x1ZGUgImF1ODh4MC5jIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4MzAuaCBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3NzgyNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4ODMwLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgICAgQXVyZWFsIFZvcnRleCBTb3VuZGNhcmQgZHJpdmVyLgorCisgICAgSU8gYWRkciBjb2xsZWN0ZWQgZnJvbSBhc3A0Y29yZS52eGQ6CisgICAgZnVuY3Rpb24gICAgYWRkcmVzcworICAgIDAwMDVENUEwICAgIDEzMDA0CisgICAgMDAwODA2NzQgICAgMTQwMDQKKyAgICAwMDA4MEFGRiAgICAxMjgxOAorCisgKi8KKworI2RlZmluZSBDSElQX0FVODgzMAorCisjZGVmaW5lIENBUkRfTkFNRSAiQXVyZWFsIFZvcnRleCAyIDNEIFNvdW5kIFByb2Nlc3NvciIKKyNkZWZpbmUgQ0FSRF9OQU1FX1NIT1JUICJhdTg4MzAiCisKKyNkZWZpbmUgTlJfQURCIDB4MjAKKyNkZWZpbmUgTlJfU1JDIDB4MTAKKyNkZWZpbmUgTlJfQTNEIDB4MTAKKyNkZWZpbmUgTlJfTUlYSU4gMHgyMAorI2RlZmluZSBOUl9NSVhPVVQgMHgxMAorI2RlZmluZSBOUl9XVCAweDQwCisKKy8qIEFEQkRNQSAqLworI2RlZmluZSBWT1JURVhfQURCRE1BX1NUQVQgMHgyN2UwMAkvKiByZWFkIG9ubHksIHN1YmJ1ZmZlciwgRE1BIHBvcyAqLworI2RlZmluZQkJUE9TX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgUE9TX1NISUZUIDB4MAorI2RlZmluZSAJQURCX1NVQkJVRl9NQVNLIDB4MDAwMDMwMDAJLyogQURCIG9ubHkuICovCisjZGVmaW5lICAgICBBREJfU1VCQlVGX1NISUZUIDB4YwkvKiBBREIgb25seS4gKi8KKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9DVFJMIDB4MjdhMDAJLyogd3JpdGUgb25seTsgZm9ybWF0LCBmbGFncywgRE1BIHBvcyAqLworI2RlZmluZQkJT0ZGU0VUX01BU0sgMHgwMDAwMGZmZgorI2RlZmluZSAgICAgT0ZGU0VUX1NISUZUIDB4MAorI2RlZmluZQkJSUVfTUFTSyAweDAwMDAxMDAwCS8qIGludGVycnVwdCBlbmFibGUuICovCisjZGVmaW5lICAgICBJRV9TSElGVCAweGMKKyNkZWZpbmUgICAgIERJUl9NQVNLIDB4MDAwMDIwMDAJLyogRGlyZWN0aW9uLiAqLworI2RlZmluZSAgICAgRElSX1NISUZUIDB4ZAorI2RlZmluZQkJRk1UX01BU0sgMHgwMDAzYzAwMAorI2RlZmluZQkJRk1UX1NISUZUIDB4ZQorI2RlZmluZQkJQURCX0ZJRk9fRU5fU0hJRlQJMHgxNQorI2RlZmluZQkJQURCX0ZJRk9fRU4JCQkoMSA8PCAweDE1KQorLy8gVGhlIEFEQiBtYXNrcyBhbmQgc2hpZnQgYWxzbyBhcmUgdmFsaWQgZm9yIHRoZSB3dGRtYSwgZXhjZXB0IGlmIHNwZWNpZmllZCBvdGhlcndpc2UuCisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQ0ZHMCAweDI3ODAwCisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQ0ZHMSAweDI3ODA0CisjZGVmaW5lIFZPUlRFWF9BREJETUFfQlVGQkFTRSAweDI3NDAwCisjZGVmaW5lIFZPUlRFWF9BREJETUFfU1RBUlQgMHgyN2MwMAkvKiBXaGljaCBzdWJidWZmZXIgc3RhcnRzICovCisKKyNkZWZpbmUgVk9SVEVYX0FEQkRNQV9TVEFUVVMgMHgyN0E5MAkvKiBzdG9yZWQgYXQgQWRiRG1hLT50aGlzXzEwIC8gMiBEV09SRCBpbiBzaXplLiAqLworLyogU3RhcnRpbmcgYXQgdGhlIE1TQiwgZWFjaCBwYWlyIG9mIGJpdHMgc2VlbSB0byBiZSB0aGUgY3VycmVudCBETUEgcGFnZS4gKi8KKy8qIFRoaXMgY3VycmVudCBwYWdlIGJpdHMgYXJlIGNvbnNpc3RlbnQgKHNhbWUgdmFsdWUpIHdpdGggVk9SVEVYX0FEQkRNQV9TVEFUKSAqLworCisvKiBETUEgKi8KKyNkZWZpbmUgVk9SVEVYX0VOR0lORV9DVFJMIDB4MjdhZTgKKyNkZWZpbmUgCUVOR0lORV9JTklUIDB4MTM4MDAwMAorCisvKiBXVERNQSAqLworI2RlZmluZSBWT1JURVhfV1RETUFfQ1RSTCAweDI3OTAwCS8qIGZvcm1hdCwgRE1BIHBvcyAqLworI2RlZmluZSBWT1JURVhfV1RETUFfU1RBVCAweDI3ZDAwCS8qIERNQSBzdWJidWYsIERNQSBwb3MgKi8KKyNkZWZpbmUgICAgIFdUX1NVQkJVRl9NQVNLIDB4MworI2RlZmluZSAgICAgV1RfU1VCQlVGX1NISUZUIDB4YworI2RlZmluZSBWT1JURVhfV1RETUFfQlVGQkFTRSAweDI3MDAwCisjZGVmaW5lIFZPUlRFWF9XVERNQV9CVUZDRkcwIDB4Mjc2MDAKKyNkZWZpbmUgVk9SVEVYX1dURE1BX0JVRkNGRzEgMHgyNzYwNAorI2RlZmluZSBWT1JURVhfV1RETUFfU1RBUlQgMHgyN2IwMAkvKiB3aGljaCBzdWJidWZmZXIgaXMgZmlyc3QgKi8KKworLyogQURCICovCisjZGVmaW5lIFZPUlRFWF9BREJfU1IgMHgyODQwMAkvKiBTYW1wbGVyYXRlcyBlbmFibGUvZGlzYWJsZSAqLworI2RlZmluZSBWT1JURVhfQURCX1JUQkFTRSAweDI4MDAwCisjZGVmaW5lIFZPUlRFWF9BREJfUlRCQVNFX0NPVU5UIDE3MworI2RlZmluZSBWT1JURVhfQURCX0NITkJBU0UgMHgyODJiNAorI2RlZmluZSBWT1JURVhfQURCX0NITkJBU0VfQ09VTlQgMjQKKyNkZWZpbmUgCVJPVVRFX01BU0sJMHhmZmZmCisjZGVmaW5lCQlTT1VSQ0VfTUFTSwkweGZmMDAKKyNkZWZpbmUgICAgIEFEQl9NQVNLICAgMHhmZgorI2RlZmluZQkJQURCX1NISUZUIDB4OAorLyogQURCIGFkZHJlc3MgKi8KKyNkZWZpbmUJCU9GRlNFVF9BREJETUEJMHgwMAorI2RlZmluZQkJT0ZGU0VUX0FEQkRNQUIJMHgyMAorI2RlZmluZQkJT0ZGU0VUX1NSQ0lOCTB4NDAKKyNkZWZpbmUJCU9GRlNFVF9TUkNPVVQJMHgyMAkvKiBjaCAweDExICovCisjZGVmaW5lCQlPRkZTRVRfTUlYSU4JMHg1MAkvKiBjaCAweDExICovCisjZGVmaW5lCQlPRkZTRVRfTUlYT1VUCTB4MzAJLyogY2ggMHgxMSAqLworI2RlZmluZQkJT0ZGU0VUX0NPREVDSU4JMHg3MCAvKiBjaCAweDExICovCS8qIGFkYiBzb3VyY2UgKi8KKyNkZWZpbmUJCU9GRlNFVF9DT0RFQ09VVAkweDg4IC8qIGNoIDB4MTEgKi8JLyogYWRiIHRhcmdldCAqLworI2RlZmluZQkJT0ZGU0VUX1NQT1JUSU4JMHg3OAkvKiBjaCAweDEzIEFEQiBzb3VyY2UuIDIgcm91dGVzLiAqLworI2RlZmluZQkJT0ZGU0VUX1NQT1JUT1VUCTB4OTAJLyogY2ggMHgxMyBBREIgc2luay4gMiByb3V0ZXMuICovCisjZGVmaW5lCQlPRkZTRVRfU1BESUZJTgkweDdBCS8qIGNoIDB4MTQgQURCIHNvdXJjZS4gKi8KKyNkZWZpbmUJCU9GRlNFVF9TUERJRk9VVAkweDkyCS8qIGNoIDB4MTQgQURCIHNpbmsuICovCisjZGVmaW5lCQlPRkZTRVRfQUM5OElOCTB4N2MJLyogY2ggMHgxNCBBREIgc291cmNlLiAqLworI2RlZmluZQkJT0ZGU0VUX0FDOThPVVQJMHg5NAkvKiBjaCAweDE0IEFEQiBzaW5rLiAqLworI2RlZmluZQkJT0ZGU0VUX0VRSU4JCTB4YTAJLyogY2ggMHgxMSAqLworI2RlZmluZQkJT0ZGU0VUX0VRT1VUCTB4N2UgLyogY2ggMHgxMSAqLwkvKiAyIHJvdXRlcyBvbiBjaCAweDExICovCisjZGVmaW5lCQlPRkZTRVRfQTNESU4JMHg3MAkvKiBBREIgc2luay4gKi8KKyNkZWZpbmUJCU9GRlNFVF9BM0RPVVQJMHhBNgkvKiBBREIgc291cmNlLiAyIHJvdXRlcyBwZXIgc2xpY2UgPSA4ICovCisjZGVmaW5lCQlPRkZTRVRfV1QwCQkweDQwCS8qIFdUIGJhbmsgMCBvdXRwdXQuIDB4NDAgLSAweDY1ICovCisjZGVmaW5lCQlPRkZTRVRfV1QxCQkweDgwCS8qIFdUIGJhbmsgMSBvdXRwdXQuIDB4ODAgLSAweEE1ICovCisvKiBXVCBzb3VyY2VzIG9mZnNldCA6IDB4MDAtMHgxZiBEaXJlY3Qgc3RyZWFtLiAqLworLyogV1Qgc291cmNlcyBvZmZzZXQgOiAweDIwLTB4MjUgTWl4ZWQgT3V0cHV0LiAqLworI2RlZmluZQkJT0ZGU0VUX1hUQUxLT1VUCTB4NjYJLyogY3Jvc3N0YWxrIGNhbmNlbGxlciAoc291cmNlKSAyIHJvdXRlcyAqLworI2RlZmluZQkJT0ZGU0VUX1hUQUxLSU4JMHg5NgkvKiBjcm9zc3RhbGsgY2FuY2VsbGVyIChzaW5rKS4gMTAgcm91dGVzICovCisjZGVmaW5lCQlPRkZTRVRfRUZYT1VUCTB4NjgJLyogQURCIHNvdXJjZS4gOCByb3V0ZXMuICovCisjZGVmaW5lCQlPRkZTRVRfRUZYSU4JMHg4MAkvKiBBREIgc2luay4gOCByb3V0ZXMuICovCisKKy8qIEFEQiByb3V0ZSB0cmFuc2xhdGUgaGVscGVyICovCisjZGVmaW5lIEFEQl9ETUEoeCkgKHgpCisjZGVmaW5lIEFEQl9TUkNPVVQoeCkgKHggKyBPRkZTRVRfU1JDT1VUKQorI2RlZmluZSBBREJfU1JDSU4oeCkgKHggKyBPRkZTRVRfU1JDSU4pCisjZGVmaW5lIEFEQl9NSVhPVVQoeCkgKHggKyBPRkZTRVRfTUlYT1VUKQorI2RlZmluZSBBREJfTUlYSU4oeCkgKHggKyBPRkZTRVRfTUlYSU4pCisjZGVmaW5lIEFEQl9DT0RFQ0lOKHgpICh4ICsgT0ZGU0VUX0NPREVDSU4pCisjZGVmaW5lIEFEQl9DT0RFQ09VVCh4KSAoeCArIE9GRlNFVF9DT0RFQ09VVCkKKyNkZWZpbmUgQURCX1NQT1JUSU4oeCkgKHggKyBPRkZTRVRfU1BPUlRJTikKKyNkZWZpbmUgQURCX1NQT1JUT1VUKHgpICh4ICsgT0ZGU0VUX1NQT1JUT1VUKQorI2RlZmluZSBBREJfU1BESUZJTih4KQkoeCArIE9GRlNFVF9TUERJRklOKQorI2RlZmluZSBBREJfU1BESUZPVVQoeCkJKHggKyBPRkZTRVRfU1BESUZPVVQpCisjZGVmaW5lIEFEQl9FUUlOKHgpICh4ICsgT0ZGU0VUX0VRSU4pCisjZGVmaW5lIEFEQl9FUU9VVCh4KSAoeCArIE9GRlNFVF9FUU9VVCkKKyNkZWZpbmUgQURCX0EzRE9VVCh4KSAoeCArIE9GRlNFVF9BM0RPVVQpCS8qIDB4MTAgQTNEIGJsb2NrcyAqLworI2RlZmluZSBBREJfQTNESU4oeCkgKHggKyBPRkZTRVRfQTNESU4pCisvLyNkZWZpbmUgQURCX1dUT1VUKHgpICgoeDx4MjApPyh4ICsgT0ZGU0VUX1dUMCk6KHggKyBPRkZTRVRfV1QxKSkKKyNkZWZpbmUgQURCX1dUT1VUKHgseSkgKCgoeCk9PTApPygoeSkgKyBPRkZTRVRfV1QwKTooKHkpICsgT0ZGU0VUX1dUMSkpCisjZGVmaW5lIEFEQl9YVEFMS0lOKHgpICgoeCkgKyBPRkZTRVRfWFRBTEtJTikKKyNkZWZpbmUgQURCX1hUQUxLT1VUKHgpICgoeCkgKyBPRkZTRVRfWFRBTEtPVVQpCisKKyNkZWZpbmUgTUlYX0RFRklHQUlOIDB4MDgKKyNkZWZpbmUgTUlYX0RFRk9HQUlOIDB4MDgJLyogMHg4LT42ZEIgICg2ZEIgPSB4NCkgMTYgdG8gMTggYml0IGNvbnZlcnNpb24/ICovCisKKy8qIE1JWEVSICovCisjZGVmaW5lIFZPUlRFWF9NSVhFUl9TUiAweDIxZjAwCisjZGVmaW5lIFZPUlRFWF9NSVhFUl9DTElQIDB4MjFmODAKKyNkZWZpbmUgVk9SVEVYX01JWEVSX0NITkJBU0UgMHgyMWU0MAorI2RlZmluZSBWT1JURVhfTUlYRVJfUlRCQVNFIDB4MjFlMDAKKyNkZWZpbmUgCU1JWEVSX1JUQkFTRV9TSVpFIDB4MzgKKyNkZWZpbmUgVk9SVEVYX01JWF9FTklOIDB4MjFhMDAJLyogSW5wdXQgZW5hYmxlIGJpdHMuIDQgYml0cyB3aWRlLiAqLworI2RlZmluZSBWT1JURVhfTUlYX1NNUCAweDIxYzAwCS8qIHdhdmUgZGF0YSBidWZmZXJzLiBBVTg4MjA6IDB4OWMwMCAqLworCisvKiBNSVggKi8KKyNkZWZpbmUgVk9SVEVYX01JWF9JTlZPTF9CIDB4MjAwMDAJLyogSW5wdXQgdm9sdW1lIGN1cnJlbnQgKi8KKyNkZWZpbmUgVk9SVEVYX01JWF9WT0xfQiAweDIwODAwCS8qIE91dHB1dCBWb2x1bWUgY3VycmVudCAqLworI2RlZmluZSBWT1JURVhfTUlYX0lOVk9MX0EgMHgyMTAwMAkvKiBJbnB1dCBWb2x1bWUgdGFyZ2V0ICovCisjZGVmaW5lIFZPUlRFWF9NSVhfVk9MX0EgMHgyMTgwMAkvKiBPdXRwdXQgVm9sdW1lIHRhcmdldCAqLworCisjZGVmaW5lIAlWT0xfTUlOIDB4ODAJLyogSW5wdXQgdm9sdW1lIHdoZW4gbXV0ZWQuICovCisjZGVmaW5lCQlWT0xfTUFYIDB4N2YJLyogRklYTUU6IE5vdCBjb25maXJtZWQhIEp1c3QgZ3Vlc3NlZC4gKi8KKworLyogU1JDICovCisjZGVmaW5lIFZPUlRFWF9TUkNfQ0hOQkFTRQkJMHgyNmM0MAorI2RlZmluZSBWT1JURVhfU1JDX1JUQkFTRQkJMHgyNmMwMAorI2RlZmluZSBWT1JURVhfU1JDQkxPQ0tfU1IJCTB4MjZjYzAKKyNkZWZpbmUgVk9SVEVYX1NSQ19TT1VSQ0UJCTB4MjZjYzQKKyNkZWZpbmUgVk9SVEVYX1NSQ19TT1VSQ0VTSVpFCTB4MjZjYzgKKy8qIFBhcmFtcworCTB4MjZlMDAJOiAxIFUwCisJMHgyNmU0MAk6IDIgQ1IKKwkweDI2ZTgwCTogMyBVMworCTB4MjZlYzAJOiA0IERSSUZUMQorCTB4MjZmMDAgOiA1IFUxCisJMHgyNmY0MAk6IDYgRFJJRlQyCisJMHgyNmY4MAk6IDcgVTIgOiBUYXJnZXQgcmF0ZSwgZGlyZWN0aW9uCisqLworCisjZGVmaW5lIFZPUlRFWF9TUkNfQ09OVlJBVElPCTB4MjZlNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDAJCTB4MjZlODAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDEJCTB4MjZlYzAKKyNkZWZpbmUgVk9SVEVYX1NSQ19EUklGVDIJCTB4MjZmNDAKKyNkZWZpbmUgVk9SVEVYX1NSQ19VMAkJCTB4MjZlMDAKKyNkZWZpbmUJCVUwX1NMT1dMT0NLCQkweDIwMAorI2RlZmluZSBWT1JURVhfU1JDX1UxCQkJMHgyNmYwMAorI2RlZmluZSBWT1JURVhfU1JDX1UyCQkJMHgyNmY4MAorI2RlZmluZSBWT1JURVhfU1JDX0RBVEEJCQkweDI2ODAwCS8qIDB4YzgwMCAqLworI2RlZmluZSBWT1JURVhfU1JDX0RBVEEwCQkweDI2MDAwCisKKy8qIEZJRk8gKi8KKyNkZWZpbmUgVk9SVEVYX0ZJRk9fQURCQ1RSTCAweDE2MTAwCS8qIENvbnRyb2wgYml0cy4gKi8KKyNkZWZpbmUgVk9SVEVYX0ZJRk9fV1RDVFJMIDB4MTYwMDAKKyNkZWZpbmUJCUZJRk9fUkRPTkxZCTB4MDAwMDAwMDEKKyNkZWZpbmUJCUZJRk9fQ1RSTAkweDAwMDAwMDAyCS8qIEFsbG93IGN0cmwuID8gKi8KKyNkZWZpbmUJCUZJRk9fVkFMSUQJMHgwMDAwMDAxMAorI2RlZmluZSAJRklGT19FTVBUWQkweDAwMDAwMDIwCisjZGVmaW5lCQlGSUZPX1UwCQkweDAwMDAyMDAwCS8qIFVua25vd24uICovCisjZGVmaW5lCQlGSUZPX1UxCQkweDAwMDQwMDAwCisjZGVmaW5lCQlGSUZPX1NJWkVfQklUUyA2CisjZGVmaW5lCQlGSUZPX1NJWkUJKDE8PChGSUZPX1NJWkVfQklUUykpCS8vIDB4NDAKKyNkZWZpbmUgCUZJRk9fTUFTSwkoRklGT19TSVpFLTEpCS8vMHgzZiAgICAvKiBhdCBzaGlmdCBsZWZ0IDB4YyAqLworI2RlZmluZSAJRklGT19CSVRTCTB4MWM0MDAwMDAKKyNkZWZpbmUgVk9SVEVYX0ZJRk9fQURCREFUQSAweDE0MDAwCisjZGVmaW5lIFZPUlRFWF9GSUZPX1dUREFUQSAweDEwMDAwCisKKyNkZWZpbmUgVk9SVEVYX0ZJRk9fR0lSVAkweDE3MDAwCS8qIHd0MCwgd3QxLCBhZGIgKi8KKyNkZWZpbmUJCUdJUlRfQ09VTlQJMworCisvKiBDT0RFQyAqLworCisjZGVmaW5lIFZPUlRFWF9DT0RFQ19DSE4gMHgyOTA4MAkvKiBUaGUgbmFtZSAiQ0hOIiBpcyB3cm9uZy4gKi8KKworI2RlZmluZSBWT1JURVhfQ09ERUNfQ1RSTCAweDI5MTg0CisjZGVmaW5lIFZPUlRFWF9DT0RFQ19JTyAweDI5MTg4CisjZGVmaW5lIAlWT1JURVhfQ09ERUNfV1JJVEUgMHgwMDgwMDAwMAorI2RlZmluZSAJVk9SVEVYX0NPREVDX0FERFNISUZUIDE2CisjZGVmaW5lIAlWT1JURVhfQ09ERUNfQURETUFTSyAweDdmMDAwMAkvKiAweDAwMGYwMDAwICovCisjZGVmaW5lIAlWT1JURVhfQ09ERUNfREFUU0hJRlQgMAorI2RlZmluZSAJVk9SVEVYX0NPREVDX0RBVE1BU0sgMHhmZmZmCisKKyNkZWZpbmUgVk9SVEVYX0NPREVDX1NQT1JUQ1RSTCAweDI5MThjCisKKyNkZWZpbmUgVk9SVEVYX0NPREVDX0VOIDB4MjkxOTAKKyNkZWZpbmUJCUVOX0FVRElPMAkJMHgwMDAwMDMwMAorI2RlZmluZQkJRU5fTU9ERU0JCTB4MDAwMDBjMDAKKyNkZWZpbmUJCUVOX0FVRElPMQkJMHgwMDAwMzAwMAorI2RlZmluZQkJRU5fU1BPUlQJCTB4MDAwMzAwMDAKKyNkZWZpbmUJCUVOX1NQRElGCQkweDAwMGMwMDAwCisjZGVmaW5lCQlFTl9DT0RFQwkJKEVOX0FVRElPMSB8IEVOX0FVRElPMCkKKworI2RlZmluZSBWT1JURVhfU1BESUZfU01QUkFURQkweDI5MTk0CisKKyNkZWZpbmUgVk9SVEVYX1NQRElGX0ZMQUdTCQkweDIyMDVjCisjZGVmaW5lIFZPUlRFWF9TUERJRl9DRkcwCQkweDI5MUQwCS8qIHN0YXR1cyBkYXRhICovCisjZGVmaW5lIFZPUlRFWF9TUERJRl9DRkcxCQkweDI5MUQ0CisKKyNkZWZpbmUgVk9SVEVYX1NNUF9USU1FCQkJMHgyOTE5OAkvKiBTYW1wbGUgY291bnRlci90aW1lciAqLworI2RlZmluZSBWT1JURVhfU01QX1RJTUVSCQkweDI5MTljCisjZGVmaW5lIFZPUlRFWF9DT0RFQzJfQ1RSTAkJMHgyOTFhMAorCisjZGVmaW5lIFZPUlRFWF9NT0RFTV9DVFJMCQkweDI5MWFjCisKKy8qIElSUSAqLworI2RlZmluZSBWT1JURVhfSVJRX1NPVVJDRSAweDJhMDAwCS8qIEludGVycnVwdCBzb3VyY2UgZmxhZ3MuICovCisjZGVmaW5lIFZPUlRFWF9JUlFfQ1RSTCAweDJhMDA0CS8qIEludGVycnVwdCBzb3VyY2UgbWFzay4gKi8KKworLy8jZGVmaW5lIFZPUlRFWF9JUlFfVTAgMHgyYTAwOCAvKiA/PyAqLworI2RlZmluZSBWT1JURVhfU1RBVAkJMHgyYTAwOAkvKiBTb21lIHNvcnQgb2Ygc3RhdHVzICovCisjZGVmaW5lIAlTVEFUX0lSUQkweDAwMDAwMDAxCS8qIFRoaXMgYml0aXMgc2V0IGlmIHRoZSBJUlEgaXMgdmFsaWQuICovCisKKyNkZWZpbmUgVk9SVEVYX0NUUkwJCTB4MmEwMGMKKyNkZWZpbmUgCUNUUkxfTUlESV9FTgkweDAwMDAwMDAxCisjZGVmaW5lIAlDVFJMX01JRElfUE9SVAkweDAwMDAwMDYwCisjZGVmaW5lIAlDVFJMX0dBTUVfRU4JMHgwMDAwMDAwOAorI2RlZmluZSAJQ1RSTF9HQU1FX1BPUlQJMHgwMDAwMGUwMAorI2RlZmluZSAJQ1RSTF9JUlFfRU5BQkxFCTB4MDAwMDQwMDAKKyNkZWZpbmUJCUNUUkxfU1BESUYJCTB4MDAwMDAwMDAJLyogdW5rbm93bi4gUGxlYXNlIGZpbmQgdGhpcyB2YWx1ZSAqLworI2RlZmluZSAJQ1RSTF9TUE9SVAkJMHgwMDIwMDAwMAorI2RlZmluZSAJQ1RSTF9SU1QJCTB4MDA4MDAwMDAKKyNkZWZpbmUgCUNUUkxfVU5LTk9XTgkweDAxMDAwMDAwCisKKy8qIHdyaXRlOiBUaW1lciBwZXJpb2QgY29uZmlnIC8gcmVhZDogVElNRVIgSVJRIGFjay4gKi8KKyNkZWZpbmUgVk9SVEVYX0lSUV9TVEFUIDB4MjkxOWMKKworCQkgICAgIC8qIE1JREkgKi8vKiBHQU1FLiAqLworI2RlZmluZSBWT1JURVhfTUlESV9EQVRBIDB4Mjg4MDAKKyNkZWZpbmUgVk9SVEVYX01JRElfQ01EIDB4Mjg4MDQJLyogV3JpdGUgY29tbWFuZCAvIFJlYWQgc3RhdHVzICovCisKKyNkZWZpbmUgVk9SVEVYX0dBTUVfTEVHQUNZIDB4Mjg4MDgKKyNkZWZpbmUgVk9SVEVYX0NUUkwyIDB4Mjg4MGMKKyNkZWZpbmUJCUNUUkwyX0dBTUVfQURDTU9ERSAweDQwCisjZGVmaW5lIFZPUlRFWF9HQU1FX0FYSVMgMHgyODgxMAkvKiBBeGlzIGJhc2UgcmVnaXN0ZXIuIDQgYXhpcydzICovCisjZGVmaW5lCQlBWElTX1NJWkUgNAorI2RlZmluZQkJQVhJU19SQU5HRSAweDFmZmYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWI0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQUxTQSBkcml2ZXIgZm9yIHRoZSBBdXJlYWwgVm9ydGV4IGZhbWlseSBvZiBzb3VuZHByb2Nlc3NvcnMuCisgKiBBdXRob3I6IE1hbnVlbCBKYW5kZXIgKG1qYW5kZXJAZW1iZWRkZWQuY2wpCisgKgorICogICBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBPcGVuVm9ydGV4IFByb2plY3QgZnJvbSBTYXZhbm5haAorICogKHNhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvb3BlbnZvcnRleCkuIEkgd291bGQgbGlrZSB0byB0aGFuaworICogdGhlIGRldmVsb3BlcnMgb2YgT3BlblZvcnRleCwgSmVmZiBNdWl6ZWxhYXIgYW5kIEtlc3RlciBNYWRkb2NrLCBmcm9tCisgKiB3aG9tIGkgZ290IHBsZW50eSBvZiBoZWxwLCBhbmQgdGhlaXIgY29kZWJhc2Ugd2FzIGludmFsdWFibGUuCisgKiAgIFRoYW5rcyB0byB0aGUgQUxTQSBkZXZlbG9wZXJzLCB0aGV5IGhlbHBlZCBhIGxvdCB3b3JraW5nIG91dAorICogdGhlIEFMU0EgcGFydC4KKyAqICAgVGhhbmtzIGFsc28gdG8gU291cmNlZm9yZ2UgZm9yIG1haW50YWluaW5nIHRoZSBvbGQgYmluYXJ5IGRyaXZlcnMsCisgKiBhbmQgdGhlIGZvcnVtLCB3aGVyZSBkZXZlbG9wZXJzIGNvdWxkIGNvbXVuaWNhdGUuCisgKgorICogTm93IGF0IGxlYXN0IGkgY2FuIHBsYXkgTGVnYWN5IERPT00gd2l0aCBNSURJIG11c2ljIDotKQorICovCisKKyNpbmNsdWRlICJhdTg4eDAuaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisvLyBtb2R1bGUgcGFyYW1ldGVycyAoc2VlICJNb2R1bGUgUGFyYW1ldGVycyIpCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOworc3RhdGljIGludCBwY2lmaXhbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAyNTUgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjaWZpeCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGNpZml4LCAiRW5hYmxlIFZJQS13b3JrYXJvdW5kIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdXJlYWwgdm9ydGV4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tBdXJlYWwgU2VtaWNvbmR1Y3RvciBJbmMuLCBBdXJlYWwgVm9ydGV4IFNvdW5kIFByb2Nlc3Nvcn19Iik7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfdm9ydGV4X2lkcyk7CisKK3N0YXRpYyB2b2lkIHZvcnRleF9maXhfbGF0ZW5jeShzdHJ1Y3QgcGNpX2RldiAqdm9ydGV4KQoreworCWludCByYzsKKwlpZiAoIShyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZSh2b3J0ZXgsIDB4NDAsIDB4ZmYpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBDQVJEX05BTUUKKwkJCSAgICAgICAiOiB2b3J0ZXggbGF0ZW5jeSBpcyAweGZmXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIENBUkRfTkFNRQorCQkJCSI6IGNvdWxkIG5vdCBzZXQgdm9ydGV4IGxhdGVuY3k6IHBjaSBlcnJvciAweCV4XG4iLCByYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfZml4X2FncF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnZpYSkKK3sKKwlpbnQgcmM7CisJdTggdmFsdWU7CisKKwkvKgorCSAqIG9ubHkgc2V0IHRoZSBiaXQgKEV4dGVuZCBQQ0kjMiBJbnRlcm5hbCBNYXN0ZXIgZm9yCisJICogRWZmaWNpZW50IEhhbmRsaW5nIG9mIER1bW15IFJlcXVlc3RzKSBpZiB0aGUgY2FuCisJICogcmVhZCB0aGUgY29uZmlnIGFuZCBpdCBpcyBub3QgYWxyZWFkeSBzZXQKKwkgKi8KKworCWlmICghKHJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUodmlhLCAweDQyLCAmdmFsdWUpKQorCQkJJiYgKCh2YWx1ZSAmIDB4MTApCisJCQkJfHwgIShyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZSh2aWEsIDB4NDIsIHZhbHVlIHwgMHgxMCkpKSkgeworCQlwcmludGsoS0VSTl9JTkZPIENBUkRfTkFNRQorCQkJCSI6IGJyaWRnZSBjb25maWcgaXMgMHgleFxuIiwgdmFsdWUgfCAweDEwKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIENBUkRfTkFNRQorCQkJCSI6IGNvdWxkIG5vdCBzZXQgdm9ydGV4IGxhdGVuY3k6IHBjaSBlcnJvciAweCV4XG4iLCByYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3ZvcnRleF93b3JrYXJvdW5kKHN0cnVjdCBwY2lfZGV2ICp2b3J0ZXgsIGludCBmaXgpCit7CisJc3RydWN0IHBjaV9kZXYgKnZpYTsKKworCS8qIGF1dG9kZXRlY3QgaWYgd29ya2Fyb3VuZHMgYXJlIHJlcXVpcmVkICovCisJaWYgKGZpeCA9PSAyNTUpIHsKKwkJLyogVklBIEtUMTMzICovCisJCXZpYSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODM2NV8xLCBOVUxMKTsKKwkJLyogVklBIEFwb2xsbyAqLworCQlpZiAodmlhID09IE5VTEwpIHsKKwkJCXZpYSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTk4XzEsIE5VTEwpOworCQl9CisJCS8qIEFNRCBJcm9uZ2F0ZSAqLworCQlpZiAodmlhID09IE5VTEwpIHsKKwkJCXZpYSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA3LCBOVUxMKTsKKwkJfQorCQlpZiAodmlhKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIENBUkRfTkFNRSAiOiBBY3RpdmF0aW5nIGxhdGVuY3kgd29ya2Fyb3VuZC4uLlxuIik7CisJCQl2b3J0ZXhfZml4X2xhdGVuY3kodm9ydGV4KTsKKwkJCXZvcnRleF9maXhfYWdwX2JyaWRnZSh2aWEpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGZpeCAmIDB4MSkKKwkJCXZvcnRleF9maXhfbGF0ZW5jeSh2b3J0ZXgpOworCQlpZiAoKGZpeCAmIDB4MikgJiYgKHZpYSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODM2NV8xLCBOVUxMKSkpCisJCQl2b3J0ZXhfZml4X2FncF9icmlkZ2UodmlhKTsKKwkJaWYgKChmaXggJiAweDQpICYmICh2aWEgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5OF8xLCBOVUxMKSkpCisJCQl2b3J0ZXhfZml4X2FncF9icmlkZ2UodmlhKTsKKwkJaWYgKChmaXggJiAweDgpICYmICh2aWEgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwNywgTlVMTCkpKQorCQkJdm9ydGV4X2ZpeF9hZ3BfYnJpZGdlKHZpYSk7CisJfQorfQorCisvLyBjb21wb25lbnQtZGVzdHJ1Y3RvcgorLy8gKHNlZSAiTWFuYWdlbWVudCBvZiBDYXJkcyBhbmQgQ29tcG9uZW50cyIpCitzdGF0aWMgaW50IHNuZF92b3J0ZXhfZGV2X2ZyZWUoc25kX2RldmljZV90ICogZGV2aWNlKQoreworCXZvcnRleF90ICp2b3J0ZXggPSBkZXZpY2UtPmRldmljZV9kYXRhOworCisJdm9ydGV4X2dhbWVwb3J0X3VucmVnaXN0ZXIodm9ydGV4KTsKKwl2b3J0ZXhfY29yZV9zaHV0ZG93bih2b3J0ZXgpOworCS8vIFRha2UgZG93biBQQ0kgaW50ZXJmYWNlLgorCXN5bmNocm9uaXplX2lycSh2b3J0ZXgtPmlycSk7CisJZnJlZV9pcnEodm9ydGV4LT5pcnEsIHZvcnRleCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyh2b3J0ZXgtPnBjaV9kZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSh2b3J0ZXgtPnBjaV9kZXYpOworCWtmcmVlKHZvcnRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLy8gY2hpcC1zcGVjaWZpYyBjb25zdHJ1Y3RvcgorLy8gKHNlZSAiTWFuYWdlbWVudCBvZiBDYXJkcyBhbmQgQ29tcG9uZW50cyIpCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX3ZvcnRleF9jcmVhdGUoc25kX2NhcmRfdCAqIGNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksIHZvcnRleF90ICoqIHJjaGlwKQoreworCXZvcnRleF90ICpjaGlwOworCWludCBlcnI7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPSBzbmRfdm9ydGV4X2Rldl9mcmVlLAorCX07CisKKwkqcmNoaXAgPSBOVUxMOworCisJLy8gY2hlY2sgUENJIGF2YWlsYWJpbGl0eSAoRE1BKS4KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaSwgVk9SVEVYX0RNQV9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVycm9yIHRvIHNldCBETUEgbWFza1xuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXBjaV9zZXRfZG1hX21hc2socGNpLCBWT1JURVhfRE1BX01BU0spOworCisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwLT5jYXJkID0gY2FyZDsKKworCS8vIGluaXRpYWxpemUgdGhlIHN0dWZmCisJY2hpcC0+cGNpX2RldiA9IHBjaTsKKwljaGlwLT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWNoaXAtPnZlbmRvciA9IHBjaS0+dmVuZG9yOworCWNoaXAtPmRldmljZSA9IHBjaS0+ZGV2aWNlOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPmlycSA9IC0xOworCisJLy8gKDEpIFBDSSByZXNvdXJjZSBhbGxvY2F0aW9uCisJLy8gR2V0IE1NSU8gYXJlYQorCS8vCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgQ0FSRF9OQU1FX1NIT1JUKSkgIT0gMCkKKwkJZ290byByZWdpb25zX291dDsKKworCWNoaXAtPm1taW8gPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkpOworCWlmICghY2hpcC0+bW1pbykgeworCQlwcmludGsoS0VSTl9FUlIgIk1NSU8gYXJlYSByZW1hcCBmYWlsZWQuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBpb3JlbWFwX291dDsKKwl9CisKKwkvKiBJbml0IGF1ZGlvIGNvcmUuCisJICogVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHdlIGRvIHJlcXVlc3RfaXJxIG90aGVyd2lzZSB3ZSBjYW4gZ2V0IHNwdXJpb3VzCisJICogaW50ZXJ1cHRzIHRoYXQgd2UgZG8gbm90IGhhbmRsZSBwcm9wZXJseSBhbmQgbWFrZSBhIG1lc3Mgb2YgdGhpbmdzICovCisJaWYgKChlcnIgPSB2b3J0ZXhfY29yZV9pbml0KGNoaXApKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHcgY29yZSBpbml0IGZhaWxlZFxuIik7CisJCWdvdG8gY29yZV9vdXQ7CisJfQorCisJaWYgKChlcnIgPSByZXF1ZXN0X2lycShwY2ktPmlycSwgdm9ydGV4X2ludGVycnVwdCwKKwkgICAgICAgICAgICAgICAgICAgICAgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLCBDQVJEX05BTUVfU0hPUlQsCisJICAgICAgICAgICAgICAgICAgICAgICBjaGlwKSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CisJCWdvdG8gaXJxX291dDsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCS8vIEVuZCBvZiBQQ0kgc2V0dXAuCisKKwkvLyBSZWdpc3RlciBhbHNhIHJvb3QgZGV2aWNlLgorCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCWdvdG8gYWxsb2Nfb3V0OworCX0KKworCSpyY2hpcCA9IGNoaXA7CisKKwlyZXR1cm4gMDsKKworICAgICAgYWxsb2Nfb3V0OgorCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisgICAgICBpcnFfb3V0OgorCXZvcnRleF9jb3JlX3NodXRkb3duKGNoaXApOworICAgICAgY29yZV9vdXQ6CisJaW91bm1hcChjaGlwLT5tbWlvKTsKKyAgICAgIGlvcmVtYXBfb3V0OgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpX2Rldik7CisgICAgICByZWdpb25zX291dDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpX2Rldik7CisJLy9GSVhNRTogdGhpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIHRvIHVucmVnaXN0ZXIgdGhlIGdhbWVwb3J0CisJdm9ydGV4X2dhbWVwb3J0X3VucmVnaXN0ZXIoY2hpcCk7CisJcmV0dXJuIGVycjsKK30KKworLy8gY29uc3RydWN0b3IgLS0gc2VlICJDb25zdHJ1Y3RvciIgc3ViLXNlY3Rpb24KK3N0YXRpYyBpbnQgX19kZXZpbml0CitzbmRfdm9ydGV4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwl2b3J0ZXhfdCAqY2hpcDsKKwlpbnQgZXJyOworCisJLy8gKDEpCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCS8vICgyKQorCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLy8gKDMpCisJaWYgKChlcnIgPSBzbmRfdm9ydGV4X2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF92b3J0ZXhfd29ya2Fyb3VuZChwY2ksIHBjaWZpeFtkZXZdKTsKKwkvLyAoNCkgQWxsb2MgY29tcG9uZW50cy4KKwkvLyBBREIgcGNtLgorCWlmICgoZXJyID0gc25kX3ZvcnRleF9uZXdfcGNtKGNoaXAsIFZPUlRFWF9QQ01fQURCLCBOUl9BREIpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisjaWZuZGVmIENISVBfQVU4ODIwCisJLy8gQURCIFNQRElGCisJaWYgKChlcnIgPSBzbmRfdm9ydGV4X25ld19wY20oY2hpcCwgVk9SVEVYX1BDTV9TUERJRiwgMSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBBM0QKKwlpZiAoKGVyciA9IHNuZF92b3J0ZXhfbmV3X3BjbShjaGlwLCBWT1JURVhfUENNX0EzRCwgTlJfQTNEKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisJLyoKKwkgICAvLyBBREIgSTJTCisJICAgaWYgKChlcnIgPSBzbmRfdm9ydGV4X25ld19wY20oY2hpcCwgVk9SVEVYX1BDTV9JMlMsIDEpKSA8IDApIHsKKwkgICBzbmRfY2FyZF9mcmVlKGNhcmQpOworCSAgIHJldHVybiBlcnI7CisJICAgfQorCSAqLworI2lmbmRlZiBDSElQX0FVODgxMAorCS8vIFdUIHBjbS4KKwlpZiAoKGVyciA9IHNuZF92b3J0ZXhfbmV3X3BjbShjaGlwLCBWT1JURVhfUENNX1dULCBOUl9XVCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCS8vIHNuZF9hYzk3X21peGVyIGFuZCBWb3J0ZXggbWl4ZXIuCisJaWYgKChlcnIgPSBzbmRfdm9ydGV4X21peGVyKGNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfdm9ydGV4X21pZGkoY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZvcnRleF9nYW1lcG9ydF9yZWdpc3RlcihjaGlwKTsKKworI2lmIDAKKwlpZiAoc25kX3NlcV9kZXZpY2VfbmV3KGNhcmQsIDEsIFNORFJWX1NFUV9ERVZfSURfVk9SVEVYX1NZTlRILAorCQkJICAgICAgIHNpemVvZihzbmRfdm9ydGV4X3N5bnRoX2FyZ190KSwgJndhdmUpIDwgMAorCSAgICB8fCB3YXZlID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygiQ2FuJ3QgaW5pdGlhbGl6ZSBBdXJlYWwgd2F2ZXRhYmxlIHN5bnRoXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfdm9ydGV4X3N5bnRoX2FyZ190ICphcmc7CisKKwkJYXJnID0gU05EUlZfU0VRX0RFVklDRV9BUkdQVFIod2F2ZSk7CisJCXN0cmNweSh3YXZlLT5uYW1lLCAiQXVyZWFsIFN5bnRoIik7CisJCWFyZy0+aHdwdHIgPSB2b3J0ZXg7CisJCWFyZy0+aW5kZXggPSAxOworCQlhcmctPnNlcV9wb3J0cyA9IHNlcV9wb3J0c1tkZXZdOworCQlhcmctPm1heF92b2ljZXMgPSBtYXhfc3ludGhfdm9pY2VzW2Rldl07CisJfQorI2VuZGlmCisKKwkvLyAoNSkKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBDQVJEX05BTUVfU0hPUlQpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIENBUkRfTkFNRV9TSE9SVCk7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4IGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+aW8sIGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX0RFVklDRV9JRCwKKwkJCQkgICYoY2hpcC0+ZGV2aWNlKSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0JCisJaWYgKChlcnIgPSBwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9WRU5ET1JfSUQsCisJCQkJICAmKGNoaXAtPnZlbmRvcikpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwKKwkJCQkgICYoY2hpcC0+cmV2KSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNpZmRlZiBDSElQX0FVODgzMAorCWlmICgoY2hpcC0+cmV2KSAhPSAweGZlICYmIChjaGlwLT5yZXYpICE9IDB4ZmEpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJICAgICAgICJ2b3J0ZXg6IFRoZSByZXZpc2lvbiAoJXgpIG9mIHlvdXIgY2FyZCBoYXMgbm90IGJlZW4gc2VlbiBiZWZvcmUuXG4iLAorCQkgICAgICAgY2hpcC0+cmV2KTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJICAgICAgICJ2b3J0ZXg6IFBsZWFzZSBlbWFpbCB0aGUgcmVzdWx0cyBvZiAnbHNwY2kgLXZ2JyB0byBvcGVudm9ydGV4LWRldkBub25nbnUub3JnLlxuIik7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisKKwkvLyAoNikKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gKDcpCisJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CisJZGV2Kys7CisJdm9ydGV4X2Nvbm5lY3RfZGVmYXVsdChjaGlwLCAxKTsKKwl2b3J0ZXhfZW5hYmxlX2ludChjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworLy8gZGVzdHJ1Y3RvciAtLSBzZWUgIkRlc3RydWN0b3IiIHN1Yi1zZWN0aW9uCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3ZvcnRleF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworLy8gcGNpX2RyaXZlciBkZWZpbml0aW9uCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gQ0FSRF9OQU1FX1NIT1JULAorCS5pZF90YWJsZSA9IHNuZF92b3J0ZXhfaWRzLAorCS5wcm9iZSA9IHNuZF92b3J0ZXhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF92b3J0ZXhfcmVtb3ZlKSwKK307CisKKy8vIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb2R1bGUKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF92b3J0ZXhfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKKy8vIGNsZWFuIHVwIHRoZSBtb2R1bGUKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfdm9ydGV4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF92b3J0ZXhfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF92b3J0ZXhfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmggYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWVkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19TT1VORF9BVTg4WDBfSAorI2RlZmluZSBfX1NPVU5EX0FVODhYMF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisKKyNlbmRpZgorCisjaWZuZGVmIENISVBfQVU4ODIwCisjaW5jbHVkZSAiYXU4OHgwX2VxLmgiCisjaW5jbHVkZSAiYXU4OHgwX2EzZC5oIgorI2VuZGlmCisjaWZuZGVmIENISVBfQVU4ODEwCisjaW5jbHVkZSAiYXU4OHgwX3d0LmgiCisjZW5kaWYKKworI2RlZmluZQlWT1JURVhfRE1BX01BU0sJMHhmZmZmZmZmZgorCisjZGVmaW5lCWh3cmVhZCh4LHkpIHJlYWRsKCh4KSsoKHkpPj4yKSkKKyNkZWZpbmUJaHd3cml0ZSh4LHkseikgd3JpdGVsKCh6KSwoeCkrKCh5KT4+MikpCisKKy8qIFZvcnRleCBNUFU0MDEgZGVmaW5lcy4gKi8KKyNkZWZpbmUJTUlESV9DTE9DS19ESVYJCTB4NjEKKy8qIFN0YW5kYXJ0IE1QVTQwMSBkZWZpbmVzLiAqLworI2RlZmluZQlNUFU0MDFfUkVTRVQJCTB4ZmYKKyNkZWZpbmUJTVBVNDAxX0VOVEVSX1VBUlQJMHgzZgorI2RlZmluZQlNUFU0MDFfQUNLCQkweGZlCisKKy8vIEdldCBzcmMgcmVnaXN0ZXIgdmFsdWUgdG8gY29udmVydCBmcm9tIHggdG8geS4KKyNkZWZpbmUJU1JDX1JBVElPKHgseSkJCSgoKCh4PDwxNSkveSkgKyAxKS8yKQorCisvKiBGSUZPIHNvZnR3YXJlIHN0YXRlIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgRklGT19TVE9QIDAKKyNkZWZpbmUgRklGT19TVEFSVCAxCisjZGVmaW5lIEZJRk9fUEFVU0UgMgorCisvKiBJUlEgZmxhZ3MgKi8KKyNkZWZpbmUgSVJRX0VSUl9NQVNLCTB4MDBmZgorI2RlZmluZSBJUlFfRkFUQUwJMHgwMDAxCisjZGVmaW5lIElSUV9QQVJJVFkJMHgwMDAyCisjZGVmaW5lIElSUV9SRUcJCTB4MDAwNAorI2RlZmluZSBJUlFfRklGTwkweDAwMDgKKyNkZWZpbmUgSVJRX0RNQQkJMHgwMDEwCisjZGVmaW5lIElSUV9QQ01PVVQJMHgwMDIwCS8qIFBDTSBPVVQgcGFnZSBjcm9zc2luZyAqLworI2RlZmluZSBJUlFfVElNRVIJMHgxMDAwCisjZGVmaW5lIElSUV9NSURJCTB4MjAwMAorI2RlZmluZSBJUlFfTU9ERU0JMHg0MDAwCisKKy8qIEFEQiBSZXNvdXJjZSAqLworI2RlZmluZSBWT1JURVhfUkVTT1VSQ0VfRE1BCTB4MDAwMDAwMDAKKyNkZWZpbmUgVk9SVEVYX1JFU09VUkNFX1NSQwkweDAwMDAwMDAxCisjZGVmaW5lIFZPUlRFWF9SRVNPVVJDRV9NSVhJTgkweDAwMDAwMDAyCisjZGVmaW5lIFZPUlRFWF9SRVNPVVJDRV9NSVhPVVQJMHgwMDAwMDAwMworI2RlZmluZSBWT1JURVhfUkVTT1VSQ0VfQTNECTB4MDAwMDAwMDQKKyNkZWZpbmUgVk9SVEVYX1JFU09VUkNFX0xBU1QJMHgwMDAwMDAwNQorCisvKiBDaGVjayBmb3IgU0RBQyBiaXQgaW4gIkV4dGVuZGVkIGF1ZGlvIElEIiBBQzk3IHJlZ2lzdGVyICovCisvLyNkZWZpbmUgVk9SVEVYX0lTX1FVQUQoeCkgKCgoeCktPmNvZGVjID09IE5VTEwpID8gIDAgOiAoKHgpLT5jb2RlYy0+ZXh0X2lkJjB4ODApKQorI2RlZmluZSBWT1JURVhfSVNfUVVBRCh4KSAoKHgpLT5pc3F1YWQpCisvKiBDaGVjayBpZiBjaGlwIGhhcyBidWcuICovCisjZGVmaW5lIElTX0JBRF9DSElQKHgpIChcCisJKHgtPnJldiA9PSAweGZlICYmIHgtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FVUkVBTF9WT1JURVhfMikgfHwgXAorCSh4LT5yZXYgPT0gMHhmZSAmJiB4LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BVVJFQUxfQURWQU5UQUdFKSkKKworCisvKiBQQ00gZGV2aWNlcyAqLworI2RlZmluZSBWT1JURVhfUENNX0FEQgkJMAorI2RlZmluZSBWT1JURVhfUENNX1NQRElGCTEKKyNkZWZpbmUgVk9SVEVYX1BDTV9BM0QJCTIKKyNkZWZpbmUgVk9SVEVYX1BDTV9XVAkJMworI2RlZmluZSBWT1JURVhfUENNX0kyUwkJNAorI2RlZmluZSBWT1JURVhfUENNX0xBU1QJCTUKKworI2RlZmluZSBNSVhfQ0FQVCh4KSAodm9ydGV4LT5taXhjYXB0W3hdKQorI2RlZmluZSBNSVhfUExBWUIoeCkgKHZvcnRleC0+bWl4cGxheWJbeF0pCisjZGVmaW5lIE1JWF9TUERJRih4KSAodm9ydGV4LT5taXhzcGRpZlt4XSkKKworI2RlZmluZSBOUl9XVFBCIDB4MjAJCS8qIFdUIGNoYW5uZWxzIHBlciBlYWhjIGJhbmsuICovCisKKy8qIFN0cnVjdHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvL2ludCB0aGlzXzA4OyAgICAgICAgICAvKiBTdGlsbCB1bmtub3duICovCisJaW50IGZpZm9fZW5hYmxlZDsJLyogdGhpc18yNCAqLworCWludCBmaWZvX3N0YXR1czsJLyogdGhpc18xYyAqLworCWludCBkbWFfY3RybDsJCS8qIHRoaXNfNzggKEFEQiksIHRoaXNfN2MgKFdUKSAqLworCWludCBkbWFfdW5rbm93bjsJLyogdGhpc183NCAoQURCKSwgdGhpc183OCAoV1QpLiBXRE06ICs4ICovCisJaW50IGNmZzA7CisJaW50IGNmZzE7CisKKwlpbnQgbnJfY2g7CQkvKiBOciBvZiBQQ00gY2hhbm5lbHMgaW4gdXNlICovCisJaW50IHR5cGU7CQkvKiBPdXRwdXQgdHlwZSAoYWM5NywgYTNkLCBzcGRpZiwgaTJzLCBkc3ApICovCisJaW50IGRtYTsJCS8qIEhhcmR3YXJlIERNQSBpbmRleC4gKi8KKwlpbnQgZGlyOwkJLyogU3RyZWFtIERpcmVjdGlvbi4gKi8KKwl1MzIgcmVzb3VyY2VzWzVdOworCisJLyogVmlydHVhbCBwYWdlIGV4dGVuZGVyIHN0dWZmICovCisJaW50IG5yX3BlcmlvZHM7CisJaW50IHBlcmlvZF9ieXRlczsKKwlzbmRfcGNtX3NnYnVmX3QgKnNnYnVmOwkvKiBETUEgU2NhdHRlciBHYXRoZXIgc3RydWN0ICovCisJaW50IHBlcmlvZF9yZWFsOworCWludCBwZXJpb2RfdmlydDsKKworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKK30gc3RyZWFtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNuZF92b3J0ZXggdm9ydGV4X3Q7CitzdHJ1Y3Qgc25kX3ZvcnRleCB7CisJLyogQUxTQSBzdHJ1Y3RzLiAqLworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc25kX3BjbV90ICpwY21bVk9SVEVYX1BDTV9MQVNUXTsKKworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOwkvKiBMZWdhY3kgTWlkaSBpbnRlcmZhY2UuICovCisJYWM5N190ICpjb2RlYzsKKworCS8qIFN0cmVhbSBzdHJ1Y3RzLiAqLworCXN0cmVhbV90IGRtYV9hZGJbTlJfQURCXTsKKwlpbnQgc3BkaWZfc3I7CisjaWZuZGVmIENISVBfQVU4ODEwCisJc3RyZWFtX3QgZG1hX3d0W05SX1dUXTsKKwl3dF92b2ljZV90IHd0X3ZvaWNlW05SX1dUXTsJLyogV1QgcmVnaXN0ZXIgY2FjaGUuICovCisJY2hhciBtaXh3dFsoTlJfV1QgLyBOUl9XVFBCKSAqIDZdOwkvKiBXVCBtaXhpbiBvYmplY3RzICovCisjZW5kaWYKKworCS8qIEdsb2JhbCByZXNvdXJjZXMgKi8KKwlzOCBtaXhjYXB0WzJdOworCXM4IG1peHBsYXliWzRdOworI2lmbmRlZiBDSElQX0FVODgyMAorCXM4IG1peHNwZGlmWzJdOworCXM4IG1peGEzZFsyXTsJLyogbWl4ZXJzIHdoaWNoIGNvbGxlY3QgYWxsIGEzZCBzdHJlYW1zLiAqLworCXM4IG1peHh0bGtbMl07CS8qIGNyb3NzdGFsayBjYW5jZWxlciBtaXhlciBpbnB1dHMuICovCisjZW5kaWYKKwl1MzIgZml4ZWRfcmVzWzVdOworCisjaWZuZGVmIENISVBfQVU4ODIwCisJLyogSGFyZHdhcmUgZXF1YWxpemVyIHN0cnVjdHMgKi8KKwllcWx6cl90IGVxOworCS8qIEEzRCBzdHJ1Y3RzICovCisJYTNkc3JjX3QgYTNkW05SX0EzRF07CisJLyogWHRhbGsgY2FuY2VsZXIgKi8KKwlpbnQgeHRfbW9kZTsJCS8qIDE6IHNwZWFrZXJzLCAwOmhlYWRwaG9uZXMuICovCisjZW5kaWYKKworCWludCBpc3F1YWQ7CQkvKiBjYWNoZSBvZiBleHRlbmRlZCBJRCBjb2RlYyBmbGFnLiAqLworCisJLyogR2FtZXBvcnQgc3R1ZmYuICovCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKworCS8qIFBDSSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqbW1pbzsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIFBDSSBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1MTYgdmVuZG9yOworCXUxNiBkZXZpY2U7CisJdTggcmV2OworfTsKKworLyogRnVuY3Rpb25zLiAqLworCisvKiBTUkMgKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJfc2V0c3JjKHZvcnRleF90ICogdm9ydGV4LCBpbnQgYWRiZG1hLAorCQkJICAgICAgdW5zaWduZWQgaW50IGN2cnQsIGludCBkaXIpOworCisvKiBETUEgRW5naW5lcy4gKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc2V0YnVmZmVycyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSwKKwkJCQkgICAgIHNuZF9wY21fc2didWZfdCAqIHNnYnVmLCBpbnQgc2l6ZSwKKwkJCQkgICAgIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiZG1hX3NldG1vZGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsIGludCBpZSwKKwkJCQkgIGludCBkaXIsIGludCBmbXQsIGludCBkLAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworc3RhdGljIHZvaWQgdm9ydGV4X2FkYmRtYV9zZXRzdGFydGJ1ZmZlcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSwgaW50IHNiKTsKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zZXRidWZmZXJzKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEsCisJCQkJICAgIHNuZF9wY21fc2didWZfdCAqIHNnYnVmLCBpbnQgc2l6ZSwKKwkJCQkgICAgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zZXRtb2RlKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEsIGludCBpZSwgaW50IGZtdCwgaW50IGQsCS8qaW50IGUsICovCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zZXRzdGFydGJ1ZmZlcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hLCBpbnQgc2IpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc3RhcnRmaWZvKHZvcnRleF90ICogdm9ydGV4LCBpbnQgYWRiZG1hKTsKKy8vc3RhdGljIHZvaWQgdm9ydGV4X2FkYmRtYV9zdG9wZmlmbyh2b3J0ZXhfdCAqdm9ydGV4LCBpbnQgYWRiZG1hKTsKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfcGF1c2VmaWZvKHZvcnRleF90ICogdm9ydGV4LCBpbnQgYWRiZG1hKTsKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfcmVzdW1lZmlmbyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSk7CitzdGF0aWMgaW50IGlubGluZSB2b3J0ZXhfYWRiZG1hX2dldGxpbmVhcnBvcyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiZG1hX3Jlc2V0dXAodm9ydGV4X3QgKnZvcnRleCwgaW50IGFkYmRtYSk7CisKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zdGFydGZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfc3RvcGZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfcGF1c2VmaWZvKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEpOworc3RhdGljIHZvaWQgdm9ydGV4X3d0ZG1hX3Jlc3VtZWZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSk7CitzdGF0aWMgaW50IGlubGluZSB2b3J0ZXhfd3RkbWFfZ2V0bGluZWFycG9zKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEpOworI2VuZGlmCisKKy8qIGdsb2JhbCBzdHVmZi4gKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9jb2RlY19pbml0KHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyB2b2lkIHZvcnRleF9jb2RlY193cml0ZShhYzk3X3QgKiBjb2RlYywgdW5zaWduZWQgc2hvcnQgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB2b3J0ZXhfY29kZWNfcmVhZChhYzk3X3QgKiBjb2RlYywgdW5zaWduZWQgc2hvcnQgYWRkcik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfc3BkaWZfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHNwZGlmX3NyLCBpbnQgc3BkaWZfbW9kZSk7CisKK3N0YXRpYyBpbnQgdm9ydGV4X2NvcmVfaW5pdCh2b3J0ZXhfdCAqIGNhcmQpOworc3RhdGljIGludCB2b3J0ZXhfY29yZV9zaHV0ZG93bih2b3J0ZXhfdCAqIGNhcmQpOworc3RhdGljIHZvaWQgdm9ydGV4X2VuYWJsZV9pbnQodm9ydGV4X3QgKiBjYXJkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2b3J0ZXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB2b3J0ZXhfYWxzYWZtdF9hc3BmbXQoaW50IGFsc2FmbXQpOworCisvKiBDb25uZWN0aW9uICBzdHVmZi4gKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9jb25uZWN0X2RlZmF1bHQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbik7CitzdGF0aWMgaW50IHZvcnRleF9hZGJfYWxsb2Nyb3V0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGRtYSwgaW50IG5yX2NoLAorCQkJCSBpbnQgZGlyLCBpbnQgdHlwZSk7CitzdGF0aWMgY2hhciB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCByZXNtYXBbXSwgaW50IG91dCwKKwkJCQkgIGludCByZXN0eXBlKTsKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKK3N0YXRpYyBpbnQgdm9ydGV4X3d0X2FsbG9jcm91dGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBkbWEsIGludCBucl9jaCk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RfY29ubmVjdCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuKTsKK3N0YXRpYyB2b2lkIHZvcnRleF93dF9pbml0KHZvcnRleF90ICogdm9ydGV4KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2b3J0ZXhfcm91dGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCQkJIHVuc2lnbmVkIGNoYXIgc291cmNlLCB1bnNpZ25lZCBjaGFyIGRlc3QpOworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9yb3V0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCQkJICB1bnNpZ25lZCBjaGFyIHNvdXJjZSwgdW5zaWduZWQgY2hhciBkZXN0MCwKKwkJCSAgdW5zaWduZWQgY2hhciBkZXN0MSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZvcnRleF9jb25uZWN0aW9uX21peGluX21peCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLAorCQkJCQl1bnNpZ25lZCBjaGFyIG1peGluLAorCQkJCQl1bnNpZ25lZCBjaGFyIG1peCwgaW50IGEpOworc3RhdGljIHZvaWQgdm9ydGV4X21peF9zZXRpbnB1dHZvbHVtZWJ5dGUodm9ydGV4X3QgKiB2b3J0ZXgsCisJCQkJCSAgdW5zaWduZWQgY2hhciBtaXgsIGludCBtaXhpbiwKKwkJCQkJICB1bnNpZ25lZCBjaGFyIHZvbCk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfbWl4X3NldHZvbHVtZWJ5dGUodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgbWl4LAorCQkJCSAgICAgdW5zaWduZWQgY2hhciB2b2wpOworCisvKiBBM0QgZnVuY3Rpb25zLiAqLworI2lmbmRlZiBDSElQX0FVODgyMAorc3RhdGljIHZvaWQgdm9ydGV4X1ZvcnQzRCh2b3J0ZXhfdCAqIHYsIGludCBlbik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfVm9ydDNEX2Nvbm5lY3Qodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfVm9ydDNEX0luaXRpYWxpemVTb3VyY2UoYTNkc3JjX3QgKiBhLCBpbnQgZW4pOworI2VuZGlmCisKKy8qIERyaXZlciBzdHVmZi4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHZvcnRleF9nYW1lcG9ydF9yZWdpc3Rlcih2b3J0ZXhfdCAqIGNhcmQpOworc3RhdGljIHZvaWQgdm9ydGV4X2dhbWVwb3J0X3VucmVnaXN0ZXIodm9ydGV4X3QgKiBjYXJkKTsKKyNpZm5kZWYgQ0hJUF9BVTg4MjAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZvcnRleF9lcV9pbml0KHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IHZvcnRleF9lcV9mcmVlKHZvcnRleF90ICogdm9ydGV4KTsKKyNlbmRpZgorLyogQUxTQSBzdHVmZi4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92b3J0ZXhfbmV3X3BjbSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGlkeCwgaW50IG5yKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92b3J0ZXhfbWl4ZXIodm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZvcnRleF9taWRpKHZvcnRleF90ICogdm9ydGV4KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfYTNkLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9hM2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEyYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfYTNkLmMKQEAgLTAsMCArMSw5MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgYXU4OHgwX2EzZC5jCisgKgorICogIEZyaSBKdWwgMTggMTQ6MTY6MjIgMjAwMworICogIENvcHlyaWdodCAgMjAwMyAgbWphbmRlcgorICogIG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0CisgKgorICogQTNELiBZb3UgbWF5IHRoaW5rIGknbSBjcmF6eSwgYnV0IHRoaXMgbWF5IHdvcmsgc29tZWRheS4gV2hvIGtub3dzLi4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJhdTg4eDBfYTNkLmgiCisjaW5jbHVkZSAiYXU4OHgwX2EzZGRhdGEuYyIKKyNpbmNsdWRlICJhdTg4eDBfeHRhbGsuaCIKKyNpbmNsdWRlICJhdTg4eDAuaCIKKworc3RhdGljIHZvaWQKK2EzZHNyY19TZXRUaW1lQ29uc3RzKGEzZHNyY190ICogYSwgc2hvcnQgSHJ0ZlRyYWNrLCBzaG9ydCBJdGRUcmFjaywKKwkJICAgICBzaG9ydCBHVHJhY2ssIHNob3J0IENUcmFjaykKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfSHJ0ZlRyYWNrVEMpLCBIcnRmVHJhY2spOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfSVREVHJhY2tUQyksIEl0ZFRyYWNrKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0dhaW5UcmFja1RDKSwgR1RyYWNrKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0NvZWZmVHJhY2tUQyksIENUcmFjayk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorYTNkc3JjX0dldFRpbWVDb25zdHMoYTNkc3JjX3QgKiBhLCBzaG9ydCAqSHJ0ZlRyYWNrLCBzaG9ydCAqSXRkVHJhY2ssCisJCSAgICAgc2hvcnQgKkdUcmFjaywgc2hvcnQgKkNUcmFjaykKK3sKKwkvLyBzdHViIQorfQorCisjZW5kaWYKKy8qIEF0bW9zcGhlcmljIGFic29yYnRpb24uICovCisKK3N0YXRpYyB2b2lkCithM2RzcmNfU2V0QXRtb3NUYXJnZXQoYTNkc3JjX3QgKiBhLCBzaG9ydCBhYSwgc2hvcnQgYiwgc2hvcnQgYywgc2hvcnQgZCwKKwkJICAgICAgc2hvcnQgZSkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0JfQTIxVGFyZ2V0KSwKKwkJKGUgPDwgMHgxMCkgfCBkKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJYTNkX2FkZHJCKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9CX0IxMFRhcmdldCksCisJCShiIDw8IDB4MTApIHwgYWEpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0JfQjJUYXJnZXQpLCBjKTsKK30KKworc3RhdGljIHZvaWQKK2EzZHNyY19TZXRBdG1vc0N1cnJlbnQoYTNkc3JjX3QgKiBhLCBzaG9ydCBhYSwgc2hvcnQgYiwgc2hvcnQgYywgc2hvcnQgZCwKKwkJICAgICAgIHNob3J0IGUpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJYTNkX2FkZHJCKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9CX0ExMkN1cnJlbnQpLAorCQkoZSA8PCAweDEwKSB8IGQpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0JfQjAxQ3VycmVudCksCisJCShiIDw8IDB4MTApIHwgYWEpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0JfQjJDdXJyZW50KSwgYyk7Cit9CisKK3N0YXRpYyB2b2lkCithM2RzcmNfU2V0QXRtb3NTdGF0ZShhM2RzcmNfdCAqIGEsIHNob3J0IHgxLCBzaG9ydCB4Miwgc2hvcnQgeTEsIHNob3J0IHkyKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV94MSksIHgxKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX3gyKSwgeDIpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfeTEpLCB5MSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV95MiksIHkyKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCithM2RzcmNfR2V0QXRtb3NUYXJnZXQoYTNkc3JjX3QgKiBhLCBzaG9ydCAqYWEsIHNob3J0ICpiLCBzaG9ydCAqYywKKwkJICAgICAgc2hvcnQgKmQsIHNob3J0ICplKQoreworfQorc3RhdGljIHZvaWQKK2EzZHNyY19HZXRBdG1vc0N1cnJlbnQoYTNkc3JjX3QgKiBhLCBzaG9ydCAqYmIwMSwgc2hvcnQgKmFiMDEsIHNob3J0ICpiMiwKKwkJICAgICAgIHNob3J0ICphYTEyLCBzaG9ydCAqYmExMikKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCSphYTEyID0KKwkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJICAgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0ExMkN1cnJlbnQpKTsKKwkqYmExMiA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9BMTJDdXJyZW50KSk7CisJKmFiMDEgPQorCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkgICBhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfQjAxQ3VycmVudCkpOworCSpiYjAxID0KKwkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJICAgYTNkX2FkZHJCKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9CX0IwMUN1cnJlbnQpKTsKKwkqYjIgPQorCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkgICBhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfQjJDdXJyZW50KSk7Cit9CisKK3N0YXRpYyB2b2lkCithM2RzcmNfR2V0QXRtb3NTdGF0ZShhM2RzcmNfdCAqIGEsIHNob3J0ICp4MSwgc2hvcnQgKngyLCBzaG9ydCAqeTEsIHNob3J0ICp5MikKK3sKKworfQorCisjZW5kaWYKKy8qIEhSVEYgKi8KKworc3RhdGljIHZvaWQKK2EzZHNyY19TZXRIcnRmVGFyZ2V0KGEzZHNyY190ICogYSwgYTNkX0hydGZfdCBjb25zdCBhYSwgYTNkX0hydGZfdCBjb25zdCBiKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLAorCQkJCSAgQTNEX0JfSHJ0ZlRhcmdldCkgKyAoaSA8PCAyKSwKKwkJCShiW2ldIDw8IDB4MTApIHwgYWFbaV0pOworfQorCitzdGF0aWMgdm9pZAorYTNkc3JjX1NldEhydGZDdXJyZW50KGEzZHNyY190ICogYSwgYTNkX0hydGZfdCBjb25zdCBhYSwgYTNkX0hydGZfdCBjb25zdCBiKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLAorCQkJCSAgQTNEX0JfSHJ0ZkN1cnJlbnQpICsgKGkgPDwgMiksCisJCQkoYltpXSA8PCAweDEwKSB8IGFhW2ldKTsKK30KKworc3RhdGljIHZvaWQKK2EzZHNyY19TZXRIcnRmU3RhdGUoYTNkc3JjX3QgKiBhLCBhM2RfSHJ0Zl90IGNvbnN0IGFhLCBhM2RfSHJ0Zl90IGNvbnN0IGIpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIUlRGX1NaOyBpKyspCisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJYTNkX2FkZHJCKGEtPnNsaWNlLCBhLT5zb3VyY2UsCisJCQkJICBBM0RfQl9IcnRmRGVsYXlMaW5lKSArIChpIDw8IDIpLAorCQkJKGJbaV0gPDwgMHgxMCkgfCBhYVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19TZXRIcnRmT3V0cHV0KGEzZHNyY190ICogYSwgc2hvcnQgbGVmdCwgc2hvcnQgcmlnaHQpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0hydGZPdXRMKSwgbGVmdCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCWEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV9IcnRmT3V0UiksIHJpZ2h0KTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGEzZHNyY19HZXRIcnRmVGFyZ2V0KGEzZHNyY190ICogYSwgYTNkX0hydGZfdCBhYSwgYTNkX0hydGZfdCBiKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQlhYVtpXSA9CisJCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkJICAgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsCisJCQkJICAgICBBM0RfQV9IcnRmVGFyZ2V0ICsgKGkgPDwgMikpKTsKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQliW2ldID0KKwkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICBhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwKKwkJCQkgICAgIEEzRF9CX0hydGZUYXJnZXQgKyAoaSA8PCAyKSkpOworfQorCitzdGF0aWMgdm9pZCBhM2RzcmNfR2V0SHJ0ZkN1cnJlbnQoYTNkc3JjX3QgKiBhLCBhM2RfSHJ0Zl90IGFhLCBhM2RfSHJ0Zl90IGIpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIUlRGX1NaOyBpKyspCisJCWFhW2ldID0KKwkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICBhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwKKwkJCQkgICAgIEEzRF9BX0hydGZDdXJyZW50ICsgKGkgPDwgMikpKTsKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQliW2ldID0KKwkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICBhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwKKwkJCQkgICAgIEEzRF9CX0hydGZDdXJyZW50ICsgKGkgPDwgMikpKTsKK30KKworc3RhdGljIHZvaWQgYTNkc3JjX0dldEhydGZTdGF0ZShhM2RzcmNfdCAqIGEsIGEzZF9IcnRmX3QgYWEsIGEzZF9IcnRmX3QgYikKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWludCBpOworCS8vIEZJWE1FOiB2ZXJpZnkgdGhpcyEKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQlhYVtpXSA9CisJCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkJICAgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsCisJCQkJICAgICBBM0RfQV9IcnRmRGVsYXlMaW5lICsgKGkgPDwgMikpKTsKKwlmb3IgKGkgPSAwOyBpIDwgSFJURl9TWjsgaSsrKQorCQliW2ldID0KKwkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICBhM2RfYWRkckIoYS0+c2xpY2UsIGEtPnNvdXJjZSwKKwkJCQkgICAgIEEzRF9CX0hydGZEZWxheUxpbmUgKyAoaSA8PCAyKSkpOworfQorCitzdGF0aWMgdm9pZCBhM2RzcmNfR2V0SHJ0Zk91dHB1dChhM2RzcmNfdCAqIGEsIHNob3J0ICpsZWZ0LCBzaG9ydCAqcmlnaHQpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwkqbGVmdCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV9IcnRmT3V0TCkpOworCSpyaWdodCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV9IcnRmT3V0UikpOworfQorCisjZW5kaWYKKworLyogSW50ZXJhdXJhbCBUaW1lIERpZmZlcmVuY2UuIAorICogIlRoZSBvdGhlciBtYWluIGNsdWUgdGhhdCBodW1hbnMgdXNlIHRvIGxvY2F0ZSBzb3VuZHMsIGlzIGNhbGxlZCAKKyAqIEludGVyYXVyYWwgVGltZSBEaWZmZXJlbmNlIChJVEQpLiBUaGUgZGlmZmVyZW5jZXMgaW4gZGlzdGFuY2UgZnJvbSAKKyAqIHRoZSBzb3VuZCBzb3VyY2UgdG8gYSBsaXN0ZW5lcnMgZWFycyBtZWFucyAgdGhhdCB0aGUgc291bmQgd2lsbCAKKyAqIHJlYWNoIG9uZSBlYXIgc2xpZ2h0bHkgYmVmb3JlIHRoZSBvdGhlci4uLi4iLCBmb3VuZCBzb21ld2hlcmUgd2l0aCBnb29nbGUuKi8KK3N0YXRpYyB2b2lkIGEzZHNyY19TZXRJdGRUYXJnZXQoYTNkc3JjX3QgKiBhLCBzaG9ydCBsaXRkLCBzaG9ydCByaXRkKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisKKwlpZiAobGl0ZCA8IDApCisJCWxpdGQgPSAwOworCWlmIChsaXRkID4gMHg1N0ZGKQorCQlsaXRkID0gMHg1N0ZGOworCWlmIChyaXRkIDwgMCkKKwkJcml0ZCA9IDA7CisJaWYgKHJpdGQgPiAweDU3RkYpCisJCXJpdGQgPSAweDU3RkY7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9JVERUYXJnZXQpLAorCQkocml0ZCA8PCAweDEwKSB8IGxpdGQpOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIoMHgxOTFERis1LCB0aGlzMDQsIHRoaXMwOCksIChyaXRkPDwweDEwKXxsaXRkKTsKK30KKworc3RhdGljIHZvaWQgYTNkc3JjX1NldEl0ZEN1cnJlbnQoYTNkc3JjX3QgKiBhLCBzaG9ydCBsaXRkLCBzaG9ydCByaXRkKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisKKwlpZiAobGl0ZCA8IDApCisJCWxpdGQgPSAwOworCWlmIChsaXRkID4gMHg1N0ZGKQorCQlsaXRkID0gMHg1N0ZGOworCWlmIChyaXRkIDwgMCkKKwkJcml0ZCA9IDA7CisJaWYgKHJpdGQgPiAweDU3RkYpCisJCXJpdGQgPSAweDU3RkY7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9JVERDdXJyZW50KSwKKwkJKHJpdGQgPDwgMHgxMCkgfCBsaXRkKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyKDB4MTkxREYrMSwgdGhpczA0LCB0aGlzMDgpLCAocml0ZDw8MHgxMCl8bGl0ZCk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19TZXRJdGREbGluZShhM2RzcmNfdCAqIGEsIGEzZF9JdGREbGluZV90IGNvbnN0IGRsaW5lKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaW50IGk7CisJLyogNDUgIT0gNDAgLT4gQ2hlY2sgdGhpcyAhICovCisJZm9yIChpID0gMDsgaSA8IERMSU5FX1NaOyBpKyspCisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsCisJCQkJICBBM0RfQV9JVEREZWxheUxpbmUpICsgKGkgPDwgMiksIGRsaW5lW2ldKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGEzZHNyY19HZXRJdGRUYXJnZXQoYTNkc3JjX3QgKiBhLCBzaG9ydCAqbGl0ZCwgc2hvcnQgKnJpdGQpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwkqcml0ZCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQV9JVERUYXJnZXQpKTsKKwkqbGl0ZCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9JVERUYXJnZXQpKTsKK30KKworc3RhdGljIHZvaWQgYTNkc3JjX0dldEl0ZEN1cnJlbnQoYTNkc3JjX3QgKiBhLCBzaG9ydCAqbGl0ZCwgc2hvcnQgKnJpdGQpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKworCSpyaXRkID0KKwkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJICAgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0lUREN1cnJlbnQpKTsKKwkqbGl0ZCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9JVERDdXJyZW50KSk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19HZXRJdGREbGluZShhM2RzcmNfdCAqIGEsIGEzZF9JdGREbGluZV90IGRsaW5lKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRExJTkVfU1o7IGkrKykKKwkJZGxpbmVbaV0gPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgIGEzZF9hZGRyQShhLT5zbGljZSwgYS0+c291cmNlLAorCQkJCSAgICAgQTNEX0FfSVRERGVsYXlMaW5lICsgKGkgPDwgMikpKTsKK30KKworI2VuZGlmCisvKiBUaGlzIGlzIG1heSBiZSB1c2VkIGZvciBJTEQgSW50ZXJhdXJhbCBMZXZlbCBEaWZmZXJlbmNlLiAqLworCitzdGF0aWMgdm9pZCBhM2RzcmNfU2V0R2FpblRhcmdldChhM2RzcmNfdCAqIGEsIHNob3J0IGxlZnQsIHNob3J0IHJpZ2h0KQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9HYWluVGFyZ2V0KSwKKwkJKHJpZ2h0IDw8IDB4MTApIHwgbGVmdCk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19TZXRHYWluQ3VycmVudChhM2RzcmNfdCAqIGEsIHNob3J0IGxlZnQsIHNob3J0IHJpZ2h0KQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCWEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9HYWluQ3VycmVudCksCisJCShyaWdodCA8PCAweDEwKSB8IGxlZnQpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgYTNkc3JjX0dldEdhaW5UYXJnZXQoYTNkc3JjX3QgKiBhLCBzaG9ydCAqbGVmdCwgc2hvcnQgKnJpZ2h0KQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJKnJpZ2h0ID0KKwkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJICAgYTNkX2FkZHJBKGEtPnNsaWNlLCBhLT5zb3VyY2UsIEEzRF9BX0dhaW5UYXJnZXQpKTsKKwkqbGVmdCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9HYWluVGFyZ2V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19HZXRHYWluQ3VycmVudChhM2RzcmNfdCAqIGEsIHNob3J0ICpsZWZ0LCBzaG9ydCAqcmlnaHQpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwkqcmlnaHQgPQorCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkgICBhM2RfYWRkckEoYS0+c2xpY2UsIGEtPnNvdXJjZSwgQTNEX0FfR2FpbkN1cnJlbnQpKTsKKwkqbGVmdCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIGEzZF9hZGRyQihhLT5zbGljZSwgYS0+c291cmNlLCBBM0RfQl9HYWluQ3VycmVudCkpOworfQorCisvKiBDQTNkSU8gdGhpcyBmdW5jIHNlZW1zIHRvIGJlIGlubGluZWQgYWxsIG92ZXIgdGhpcyBwbGFjZS4gKi8KK3N0YXRpYyB2b2lkIENBM2RJT19Xcml0ZVJlZyhhM2RzcmNfdCAqIGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2hvcnQgYWEsIHNob3J0IGIpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgYWRkciwgKGFhIDw8IDB4MTApIHwgYik7Cit9CisKKyNlbmRpZgorLyogR2VuZXJpYyBBM0Qgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQgYTNkc3JjX1NldEEzRFNhbXBsZVJhdGUoYTNkc3JjX3QgKiBhLCBpbnQgc3IpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlpbnQgZXNwMCA9IDA7CisKKwllc3AwID0gKCgoZXNwMCAmIDB4N2ZmZmZmZmYpIHwgMHhCODAwMDAwMCkgJiAweDcpIHwgKChzciAmIDB4MWYpIDw8IDMpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBBM0RfU0xJQ0VfQ29udHJvbCArICgoYS0+c2xpY2UpIDw8IDB4ZCksIGVzcDApOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MTlDMzggKyAodGhpczA4PDwweGQpLCBlc3AwKTsKK30KKworc3RhdGljIHZvaWQgYTNkc3JjX0VuYWJsZUEzRChhM2RzcmNfdCAqIGEpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgQTNEX1NMSUNFX0NvbnRyb2wgKyAoKGEtPnNsaWNlKSA8PCAweGQpLAorCQkweEYwMDAwMDAxKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCAweDE5QzM4ICsgKHRoaXMwODw8MHhkKSwgMHhGMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19EaXNhYmxlQTNEKGEzZHNyY190ICogYSkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBBM0RfU0xJQ0VfQ29udHJvbCArICgoYS0+c2xpY2UpIDw8IDB4ZCksCisJCTB4RjAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZCBhM2RzcmNfU2V0QTNEQ29udHJvbFJlZyhhM2RzcmNfdCAqIGEsIHVuc2lnbmVkIGxvbmcgY3RybCkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBBM0RfU0xJQ0VfQ29udHJvbCArICgoYS0+c2xpY2UpIDw8IDB4ZCksIGN0cmwpOworfQorCitzdGF0aWMgdm9pZCBhM2RzcmNfU2V0QTNEUG9pbnRlclJlZyhhM2RzcmNfdCAqIGEsIHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXZvcnRleF90ICp2b3J0ZXggPSAodm9ydGV4X3QgKikgKGEtPnZvcnRleCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIEEzRF9TTElDRV9Qb2ludGVycyArICgoYS0+c2xpY2UpIDw8IDB4ZCksIHB0cik7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBhM2RzcmNfR2V0QTNEU2FtcGxlUmF0ZShhM2RzcmNfdCAqIGEsIGludCAqc3IpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwkqc3IgPSAoKGh3cmVhZCh2b3J0ZXgtPm1taW8sIEEzRF9TTElDRV9Db250cm9sICsgKGEtPnNsaWNlIDw8IDB4ZCkpCisJCT4+IDMpICYgMHgxZik7CisJLy8qc3IgPSAoKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MTlDMzggKyAodGhpczA4PDwweGQpKT4+MykmMHgxZik7Cit9CisKK3N0YXRpYyB2b2lkIGEzZHNyY19HZXRBM0RDb250cm9sUmVnKGEzZHNyY190ICogYSwgdW5zaWduZWQgbG9uZyAqY3RybCkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCSpjdHJsID0gaHdyZWFkKHZvcnRleC0+bW1pbywgQTNEX1NMSUNFX0NvbnRyb2wgKyAoKGEtPnNsaWNlKSA8PCAweGQpKTsKK30KKworc3RhdGljIHZvaWQgYTNkc3JjX0dldEEzRFBvaW50ZXJSZWcoYTNkc3JjX3QgKiBhLCB1bnNpZ25lZCBsb25nICpwdHIpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9ICh2b3J0ZXhfdCAqKSAoYS0+dm9ydGV4KTsKKwkqcHRyID0gaHdyZWFkKHZvcnRleC0+bW1pbywgQTNEX1NMSUNFX1BvaW50ZXJzICsgKChhLT5zbGljZSkgPDwgMHhkKSk7Cit9CisKKyNlbmRpZgorc3RhdGljIHZvaWQgYTNkc3JjX1plcm9TbGljZUlPKGEzZHNyY190ICogYSkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQlBM0RfU0xJQ0VfVkRCRGVzdCArCisJCQkoKCgoYS0+c2xpY2UpIDw8IDB4YikgKyBpKSA8PCAyKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQlBM0RfU0xJQ0VfVkRCU291cmNlICsKKwkJCSgoKChhLT5zbGljZSkgPDwgMHhiKSArIGkpIDw8IDIpLCAwKTsKK30KKworLyogUmVzZXQgU2luZ2xlIEEzRCBzb3VyY2UuICovCitzdGF0aWMgdm9pZCBhM2RzcmNfWmVyb1N0YXRlKGEzZHNyY190ICogYSkKK3sKKworCS8vcHJpbnRrKCJ2b3J0ZXg6IFplcm9TdGF0ZSBzbGljZTogJWQsIHNvdXJjZSAlZFxuIiwgYS0+c2xpY2UsIGEtPnNvdXJjZSk7CisKKwlhM2RzcmNfU2V0QXRtb3NTdGF0ZShhLCAwLCAwLCAwLCAwKTsKKwlhM2RzcmNfU2V0SHJ0ZlN0YXRlKGEsIEEzZEhyaXJaZXJvcywgQTNkSHJpclplcm9zKTsKKwlhM2RzcmNfU2V0SXRkRGxpbmUoYSwgQTNkSXRkRGxpbmVaZXJvcyk7CisJYTNkc3JjX1NldEhydGZPdXRwdXQoYSwgMCwgMCk7CisJYTNkc3JjX1NldFRpbWVDb25zdHMoYSwgMCwgMCwgMCwgMCk7CisKKwlhM2RzcmNfU2V0QXRtb3NDdXJyZW50KGEsIDAsIDAsIDAsIDAsIDApOworCWEzZHNyY19TZXRBdG1vc1RhcmdldChhLCAwLCAwLCAwLCAwLCAwKTsKKwlhM2RzcmNfU2V0SXRkQ3VycmVudChhLCAwLCAwKTsKKwlhM2RzcmNfU2V0SXRkVGFyZ2V0KGEsIDAsIDApOworCWEzZHNyY19TZXRHYWluQ3VycmVudChhLCAwLCAwKTsKKwlhM2RzcmNfU2V0R2FpblRhcmdldChhLCAwLCAwKTsKKworCWEzZHNyY19TZXRIcnRmQ3VycmVudChhLCBBM2RIcmlyWmVyb3MsIEEzZEhyaXJaZXJvcyk7CisJYTNkc3JjX1NldEhydGZUYXJnZXQoYSwgQTNkSHJpclplcm9zLCBBM2RIcmlyWmVyb3MpOworfQorCisvKiBSZXNldCBlbnRpcmUgQTNEIGVuZ2luZSAqLworc3RhdGljIHZvaWQgYTNkc3JjX1plcm9TdGF0ZUEzRChhM2RzcmNfdCAqIGEpCit7CisJaW50IGksIHZhciwgdmFyMjsKKworCWlmICgoYS0+dm9ydGV4KSA9PSBOVUxMKSB7CisJCXByaW50aygidm9ydGV4OiBaZXJvU3RhdGVBM0Q6IEVSUk9SOiBhLT52b3J0ZXggaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlhM2RzcmNfU2V0QTNEQ29udHJvbFJlZyhhLCAwKTsKKwlhM2RzcmNfU2V0QTNEUG9pbnRlclJlZyhhLCAwKTsKKworCXZhciA9IGEtPnNsaWNlOworCXZhcjIgPSBhLT5zb3VyY2U7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlhLT5zbGljZSA9IGk7CisJCWEzZHNyY19aZXJvU2xpY2VJTyhhKTsKKwkJLy9hM2RzcmNfWmVyb1N0YXRlKGEpOworCX0KKwlhLT5zb3VyY2UgPSB2YXIyOworCWEtPnNsaWNlID0gdmFyOworfQorCisvKiBQcm9ncmFtIEEzRCBibG9jayBhcyBwYXNzIHRocm91Z2ggKi8KK3N0YXRpYyB2b2lkIGEzZHNyY19Qcm9ncmFtUGlwZShhM2RzcmNfdCAqIGEpCit7CisJYTNkc3JjX1NldFRpbWVDb25zdHMoYSwgMCwgMCwgMCwgMCk7CisJYTNkc3JjX1NldEF0bW9zQ3VycmVudChhLCAwLCAweDQwMDAsIDAsIDAsIDApOworCWEzZHNyY19TZXRBdG1vc1RhcmdldChhLCAweDQwMDAsIDAsIDAsIDAsIDApOworCWEzZHNyY19TZXRJdGRDdXJyZW50KGEsIDAsIDApOworCWEzZHNyY19TZXRJdGRUYXJnZXQoYSwgMCwgMCk7CisJYTNkc3JjX1NldEdhaW5DdXJyZW50KGEsIDB4N2ZmZiwgMHg3ZmZmKTsKKwlhM2RzcmNfU2V0R2FpblRhcmdldChhLCAweDdmZmYsIDB4N2ZmZik7CisKKwkvKiBTRVQgSFJURiBIRVJFICovCisKKwkvKiBTaW5nbGUgc3Bpa2UgbGVhZHMgdG8gaWRlbnRpdHkgdHJhbnNmZXIgZnVuY3Rpb24uICovCisJYTNkc3JjX1NldEhydGZDdXJyZW50KGEsIEEzZEhyaXJJbXB1bHNlLCBBM2RIcmlySW1wdWxzZSk7CisJYTNkc3JjX1NldEhydGZUYXJnZXQoYSwgQTNkSHJpckltcHVsc2UsIEEzZEhyaXJJbXB1bHNlKTsKKworCS8qIFRlc3Q6IFNvdW5kcyBzYXR1cmF0ZWQuICovCisJLy9hM2RzcmNfU2V0SHJ0ZkN1cnJlbnQoYSwgQTNkSHJpclNhdFRlc3QsIEEzZEhyaXJTYXRUZXN0KTsKKwkvL2EzZHNyY19TZXRIcnRmVGFyZ2V0KGEsIEEzZEhyaXJTYXRUZXN0LCBBM2RIcmlyU2F0VGVzdCk7ICAgICAgCit9CisKKy8qIFZEQiA9IFZvcnRleCBhdWRpbyBEYXRhZmxvdyBCdXMgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBhM2RzcmNfQ2xlYXJWREJEYXRhKGEzZHNyY190ICogYSwgdW5zaWduZWQgbG9uZyBhYSkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gKHZvcnRleF90ICopIChhLT52b3J0ZXgpOworCisJLy8gKChhYSA+PiAyKSA8PCA4KSAtIChhYSA+PiAyKQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkclMoYS0+c2xpY2UsIEEzRF9TTElDRV9WREJEZXN0KSArIChhLT5zb3VyY2UgPDwgMiksIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlhM2RfYWRkclMoYS0+c2xpY2UsCisJCQkgIEEzRF9TTElDRV9WREJEZXN0ICsgNCkgKyAoYS0+c291cmNlIDw8IDIpLCAwKTsKKwkvKgorCSAgIGh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDE5YzAwICsgKCgoYWE+PjIpKjI1NSo0KSthYSkqOCwgMCk7CisJICAgaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MTljMDQgKyAoKChhYT4+MikqMjU1KjQpK2FhKSo4LCAwKTsKKwkgKi8KK30KKyNlbmRpZgorCisvKiBBM0QgSHdTb3VyY2Ugc3R1ZmYuICovCisKK3N0YXRpYyB2b2lkIHZvcnRleF9BM2RTb3VyY2VId19Jbml0aWFsaXplKHZvcnRleF90ICogdiwgaW50IHNvdXJjZSwgaW50IHNsaWNlKQoreworCWEzZHNyY190ICphM2RzcmMgPSAmKHYtPmEzZFtzb3VyY2UgKyAoc2xpY2UgKiA0KV0pOworCS8vYTNkc3JjX3QgKmEzZHNyYyA9ICYodi0+YTNkW3NvdXJjZSArIChzbGljZSo0KV0pOworCisJYTNkc3JjLT52b3J0ZXggPSAodm9pZCAqKXY7CisJYTNkc3JjLT5zb3VyY2UgPSBzb3VyY2U7CS8qIHNvdXJjZSAqLworCWEzZHNyYy0+c2xpY2UgPSBzbGljZTsJLyogc2xpY2UgKi8KKwlhM2RzcmNfWmVyb1N0YXRlKGEzZHNyYyk7CisJLyogQWRkZWQgYnkgbWUuICovCisJYTNkc3JjX1NldEEzRFNhbXBsZVJhdGUoYTNkc3JjLCAweDExKTsKK30KKworc3RhdGljIGludCBWb3J0M0RSZW5kX0luaXRpYWxpemUodm9ydGV4X3QgKiB2LCB1bnNpZ25lZCBzaG9ydCBtb2RlKQoreworCXYtPnh0X21vZGUgPSBtb2RlOwkvKiB0aGlzXzE0ICovCisKKwl2b3J0ZXhfWHRhbGtId19pbml0KHYpOworCXZvcnRleF9YdGFsa0h3X1NldEdhaW5zQWxsQ2hhbih2KTsKKwlzd2l0Y2ggKHYtPnh0X21vZGUpIHsKKwljYXNlIFhUX1NQRUFLRVIwOgorCQl2b3J0ZXhfWHRhbGtId19Qcm9ncmFtWHRhbGtOYXJyb3codik7CisJCWJyZWFrOworCWNhc2UgWFRfU1BFQUtFUjE6CisJCXZvcnRleF9YdGFsa0h3X1Byb2dyYW1YdGFsa1dpZGUodik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBYVF9IRUFEUEhPTkU6CisJCXZvcnRleF9YdGFsa0h3X1Byb2dyYW1QaXBlKHYpOworCQlicmVhazsKKwljYXNlIFhUX0RJQU1PTkQ6CisJCXZvcnRleF9YdGFsa0h3X1Byb2dyYW1EaWFtb25kWHRhbGsodik7CisJCWJyZWFrOworCX0KKwl2b3J0ZXhfWHRhbGtId19TZXRTYW1wbGVSYXRlKHYsIDB4MTEpOworCXZvcnRleF9YdGFsa0h3X0VuYWJsZSh2KTsKKwlyZXR1cm4gMDsKK30KKworLyogM0QgU291bmQgZW50cnkgcG9pbnRzLiAqLworCitzdGF0aWMgaW50IHZvcnRleF9hM2RfcmVnaXN0ZXJfY29udHJvbHModm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIHZvaWQgdm9ydGV4X2EzZF91bnJlZ2lzdGVyX2NvbnRyb2xzKHZvcnRleF90ICogdm9ydGV4KTsKKy8qIEEzRCBiYXNlIHN1cHBvcnQgaW5pdC9zaHVkb3duICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfVm9ydDNEKHZvcnRleF90ICogdiwgaW50IGVuKQoreworCWludCBpOworCWlmIChlbikgeworCQlWb3J0M0RSZW5kX0luaXRpYWxpemUodiwgWFRfSEVBRFBIT05FKTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0EzRDsgaSsrKSB7CisJCQl2b3J0ZXhfQTNkU291cmNlSHdfSW5pdGlhbGl6ZSh2LCBpICUgNCwgaSA+PiAyKTsKKwkJCWEzZHNyY19aZXJvU3RhdGVBM0QoJih2LT5hM2RbMF0pKTsKKwkJfQorCX0gZWxzZSB7CisJCXZvcnRleF9YdGFsa0h3X0Rpc2FibGUodik7CisJfQorCS8qIFJlZ2lzdGVyIEFMU0EgY29udHJvbHMgKi8KKwlpZiAoZW4pIHsKKwkJdm9ydGV4X2EzZF9yZWdpc3Rlcl9jb250cm9scyh2KTsKKwl9IGVsc2UgeworCQl2b3J0ZXhfYTNkX3VucmVnaXN0ZXJfY29udHJvbHModik7CisJfQorfQorCisvKiBNYWtlIEEzRCBzdWJzeXN0ZW0gY29ubmVjdGlvbnMuICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfVm9ydDNEX2Nvbm5lY3Qodm9ydGV4X3QgKiB2LCBpbnQgZW4pCit7CisJaW50IGk7CisJCisvLyBEaXNhYmxlIEFVODgxMCByb3V0ZXMsIHNpbmNlIHRoZXkgc2VlbSB0byBiZSB3cm9uZyAoaW4gYXU4ODEwLmgpLgorI2lmZGVmIENISVBfQVU4ODEwCisJcmV0dXJuOworI2VuZGlmCisJCisjaWYgMQorCS8qIEFsbG9jIFh0YWxrIG1peGluIHJlc291cmNlcyAqLworCXYtPm1peHh0bGtbMF0gPQorCSAgICB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodiwgdi0+Zml4ZWRfcmVzLCBlbiwgVk9SVEVYX1JFU09VUkNFX01JWElOKTsKKwlpZiAodi0+bWl4eHRsa1swXSA8IDApIHsKKwkJcHJpbnRrCisJCSAgICAoInZvcnRleDogdm9ydGV4X1ZvcnQzRDogRVJST1I6IG5vdCBlbm91Z2ggZnJlZSBtaXhlciByZXNvdXJjZXMuXG4iKTsKKwkJcmV0dXJuOworCX0KKwl2LT5taXh4dGxrWzFdID0KKwkgICAgdm9ydGV4X2FkYl9jaGVja2lub3V0KHYsIHYtPmZpeGVkX3JlcywgZW4sIFZPUlRFWF9SRVNPVVJDRV9NSVhJTik7CisJaWYgKHYtPm1peHh0bGtbMV0gPCAwKSB7CisJCXByaW50aworCQkgICAgKCJ2b3J0ZXg6IHZvcnRleF9Wb3J0M0Q6IEVSUk9SOiBub3QgZW5vdWdoIGZyZWUgbWl4ZXIgcmVzb3VyY2VzLlxuIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIENvbm5lY3QgQTNEIC0+IFhUQUxLICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkvLyAyIG91dHB1dHMgcGVyIGVhY2ggQTNEIHNsaWNlLiAKKwkJdm9ydGV4X3JvdXRlKHYsIGVuLCAweDExLCBBREJfQTNET1VUKGkgKiAyKSwgQURCX1hUQUxLSU4oaSkpOworCQl2b3J0ZXhfcm91dGUodiwgZW4sIDB4MTEsIEFEQl9BM0RPVVQoaSAqIDIpICsgMSwgQURCX1hUQUxLSU4oNSArIGkpKTsKKwl9CisjaWYgMAorCXZvcnRleF9yb3V0ZSh2LCBlbiwgMHgxMSwgQURCX1hUQUxLT1VUKDApLCBBREJfRVFJTigyKSk7CisJdm9ydGV4X3JvdXRlKHYsIGVuLCAweDExLCBBREJfWFRBTEtPVVQoMSksIEFEQl9FUUlOKDMpKTsKKyNlbHNlCisJLyogQ29ubmVjdCBYVGFsayAtPiBtaXhlciAqLworCXZvcnRleF9yb3V0ZSh2LCBlbiwgMHgxMSwgQURCX1hUQUxLT1VUKDApLCBBREJfTUlYSU4odi0+bWl4eHRsa1swXSkpOworCXZvcnRleF9yb3V0ZSh2LCBlbiwgMHgxMSwgQURCX1hUQUxLT1VUKDEpLCBBREJfTUlYSU4odi0+bWl4eHRsa1sxXSkpOworCXZvcnRleF9jb25uZWN0aW9uX21peGluX21peCh2LCBlbiwgdi0+bWl4eHRsa1swXSwgdi0+bWl4cGxheWJbMF0sIDApOworCXZvcnRleF9jb25uZWN0aW9uX21peGluX21peCh2LCBlbiwgdi0+bWl4eHRsa1sxXSwgdi0+bWl4cGxheWJbMV0sIDApOworCXZvcnRleF9taXhfc2V0aW5wdXR2b2x1bWVieXRlKHYsIHYtPm1peHBsYXliWzBdLCB2LT5taXh4dGxrWzBdLAorCQkJCSAgICAgIGVuID8gTUlYX0RFRklHQUlOIDogVk9MX01JTik7CisJdm9ydGV4X21peF9zZXRpbnB1dHZvbHVtZWJ5dGUodiwgdi0+bWl4cGxheWJbMV0sIHYtPm1peHh0bGtbMV0sCisJCQkJICAgICAgZW4gPyBNSVhfREVGSUdBSU4gOiBWT0xfTUlOKTsKKwlpZiAoVk9SVEVYX0lTX1FVQUQodikpIHsKKwkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHYsIGVuLCB2LT5taXh4dGxrWzBdLAorCQkJCQkgICAgdi0+bWl4cGxheWJbMl0sIDApOworCQl2b3J0ZXhfY29ubmVjdGlvbl9taXhpbl9taXgodiwgZW4sIHYtPm1peHh0bGtbMV0sCisJCQkJCSAgICB2LT5taXhwbGF5YlszXSwgMCk7CisJCXZvcnRleF9taXhfc2V0aW5wdXR2b2x1bWVieXRlKHYsIHYtPm1peHBsYXliWzJdLAorCQkJCQkgICAgICB2LT5taXh4dGxrWzBdLAorCQkJCQkgICAgICBlbiA/IE1JWF9ERUZJR0FJTiA6IFZPTF9NSU4pOworCQl2b3J0ZXhfbWl4X3NldGlucHV0dm9sdW1lYnl0ZSh2LCB2LT5taXhwbGF5YlszXSwKKwkJCQkJICAgICAgdi0+bWl4eHRsa1sxXSwKKwkJCQkJICAgICAgZW4gPyBNSVhfREVGSUdBSU4gOiBWT0xfTUlOKTsKKwl9CisjZW5kaWYKK30KKworLyogSW5pdGlhbGl6ZSBvbmUgc2luZ2xlIEEzRCBzb3VyY2UuICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfVm9ydDNEX0luaXRpYWxpemVTb3VyY2UoYTNkc3JjX3QgKiBhLCBpbnQgZW4pCit7CisJaWYgKGEtPnZvcnRleCA9PSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJ2b3J0ZXg6IFZvcnQzRF9Jbml0aWFsaXplU291cmNlOiBBM0Qgc291cmNlIG5vdCBpbml0aWFsaXplZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKGVuKSB7CisJCWEzZHNyY19Qcm9ncmFtUGlwZShhKTsKKwkJYTNkc3JjX1NldEEzRFNhbXBsZVJhdGUoYSwgMHgxMSk7CisJCWEzZHNyY19TZXRUaW1lQ29uc3RzKGEsIEhydGZUQ0RlZmF1bHQsCisJCQkJICAgICBJdGRUQ0RlZmF1bHQsIEdhaW5UQ0RlZmF1bHQsCisJCQkJICAgICBDb2VmVENEZWZhdWx0KTsKKwkJLyogUmVtYXJrOiB6ZXJvIGdhaW4gaXMgbXV0ZWQuICovCisJCS8vYTNkc3JjX1NldEdhaW5UYXJnZXQoYSwwLDApOworCQkvL2EzZHNyY19TZXRHYWluQ3VycmVudChhLDAsMCk7CisJCWEzZHNyY19FbmFibGVBM0QoYSk7CisJfSBlbHNlIHsKKwkJYTNkc3JjX0Rpc2FibGVBM0QoYSk7CisJCWEzZHNyY19aZXJvU3RhdGUoYSk7CisJfQorfQorCisvKiBDb252ZXJzaW9uIG9mIGNvb3JkaW5hdGVzIGludG8gM0QgcGFyYW1ldGVycy4gKi8KKworc3RhdGljIHZvaWQgdm9ydGV4X2EzZF9jb29yZDJocnRmKGEzZF9IcnRmX3QgaHJ0ZiwgaW50ICpjb29yZCkKK3sKKwkvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMuICovCisKK30KK3N0YXRpYyB2b2lkIHZvcnRleF9hM2RfY29vcmQyaXRkKGEzZF9JdGRfdCBpdGQsIGludCAqY29vcmQpCit7CisJLyogRklYTUU6IGltcGxlbWVudCB0aGlzLiAqLworCit9CitzdGF0aWMgdm9pZCB2b3J0ZXhfYTNkX2Nvb3JkMmlsZChhM2RfTFJHYWluc190IGlsZCwgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwkvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMuICovCisKK30KK3N0YXRpYyB2b2lkIHZvcnRleF9hM2RfdHJhbnNsYXRlX2ZpbHRlcihhM2RfYXRtb3NfdCBmaWx0ZXIsIGludCAqcGFyYW1zKQoreworCS8qIEZJWE1FOiBpbXBsZW1lbnQgdGhpcy4gKi8KKworfQorCisvKiBBTFNBIGNvbnRyb2wgaW50ZXJmYWNlLiAgKi8KKworc3RhdGljIGludAorc25kX3ZvcnRleF9hM2RfaHJ0Zl9pbmZvKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSA2OworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDB4MDAwMDAwMDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHhmZmZmZmZmZjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfYTNkX2l0ZF9pbmZvKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDB4MDAwMDAwMDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHhmZmZmZmZmZjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfYTNkX2lsZF9pbmZvKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDB4MDAwMDAwMDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHhmZmZmZmZmZjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfYTNkX2ZpbHRlcl9pbmZvKHNuZF9rY29udHJvbF90ICoKKwkJCSAgIGtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gNDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAweDAwMDAwMDAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4ZmZmZmZmZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfYTNkX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCS8vYTNkc3JjX3QgKmEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCS8qIE5vIHJlYWQgeWV0LiBXb3VsZCB0aGlzIGJlIHJlYWxseSB1c2VhYmxlL25lZWRlZCA/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3ZvcnRleF9hM2RfaHJ0Zl9wdXQoc25kX2tjb250cm9sX3QgKgorCQkJa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYTNkc3JjX3QgKmEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBjaGFuZ2VkID0gMSwgaTsKKwlpbnQgY29vcmRbNl07CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJY29vcmRbaV0gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKKwkvKiBUcmFuc2xhdGUgb3JpZW50YXRpb24gY29vcmRpbmF0ZXMgdG8gYTNkIHBhcmFtcy4gKi8KKwl2b3J0ZXhfYTNkX2Nvb3JkMmhydGYoYS0+aHJ0ZlswXSwgY29vcmQpOworCXZvcnRleF9hM2RfY29vcmQyaHJ0ZihhLT5ocnRmWzFdLCBjb29yZCk7CisJYTNkc3JjX1NldEhydGZUYXJnZXQoYSwgYS0+aHJ0ZlswXSwgYS0+aHJ0ZlsxXSk7CisJYTNkc3JjX1NldEhydGZDdXJyZW50KGEsIGEtPmhydGZbMF0sIGEtPmhydGZbMV0pOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgaW50CitzbmRfdm9ydGV4X2EzZF9pdGRfcHV0KHNuZF9rY29udHJvbF90ICoKKwkJICAgICAgIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWEzZHNyY190ICphID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlpbnQgY29vcmRbNl07CisJaW50IGksIGNoYW5nZWQgPSAxOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWNvb3JkW2ldID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJLyogVHJhbnNsYXRlIG9yaWVudGF0aW9uIGNvb3JkaW5hdGVzIHRvIGEzZCBwYXJhbXMuICovCisJdm9ydGV4X2EzZF9jb29yZDJpdGQoYS0+aHJ0ZlswXSwgY29vcmQpOworCXZvcnRleF9hM2RfY29vcmQyaXRkKGEtPmhydGZbMV0sIGNvb3JkKTsKKwkvKiBJbnRlciBhdXJhbCB0aW1lIGRpZmZlcmVuY2UuICovCisJYTNkc3JjX1NldEl0ZFRhcmdldChhLCBhLT5pdGRbMF0sIGEtPml0ZFsxXSk7CisJYTNkc3JjX1NldEl0ZEN1cnJlbnQoYSwgYS0+aXRkWzBdLCBhLT5pdGRbMV0pOworCWEzZHNyY19TZXRJdGREbGluZShhLCBhLT5kbGluZSk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfYTNkX2lsZF9wdXQoc25kX2tjb250cm9sX3QgKgorCQkgICAgICAga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYTNkc3JjX3QgKmEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBjaGFuZ2VkID0gMTsKKwlpbnQgbCwgcjsKKwkvKiBUaGVyZSBtYXkgYmUgc29tZSBzY2FsZSB0cmFubGF0aW9uIG5lZWRlZCBoZXJlLiAqLworCWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJdm9ydGV4X2EzZF9jb29yZDJpbGQoYS0+aWxkLCBsLCByKTsKKwkvKiBMZWZ0IFJpZ2h0IHBhbm5pbmcuICovCisJYTNkc3JjX1NldEdhaW5UYXJnZXQoYSwgbCwgcik7CisJYTNkc3JjX1NldEdhaW5DdXJyZW50KGEsIGwsIHIpOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgaW50CitzbmRfdm9ydGV4X2EzZF9maWx0ZXJfcHV0KHNuZF9rY29udHJvbF90CisJCQkgICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYTNkc3JjX3QgKmEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBpLCBjaGFuZ2VkID0gMTsKKwlpbnQgcGFyYW1zWzZdOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXBhcmFtc1tpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCS8qIFRyYW5zbGF0ZSBnZW5lcmljIGZpbHRlciBwYXJhbXMgdG8gYTNkIGZpbHRlciBwYXJhbXMuICovCisJdm9ydGV4X2EzZF90cmFuc2xhdGVfZmlsdGVyKGEtPmZpbHRlciwgcGFyYW1zKTsKKwkvKiBBdG1vc3BoZXJpYyBhYnNvcmJ0aW9uIGFuZCBmaWx0ZXJpbmcuICovCisJYTNkc3JjX1NldEF0bW9zVGFyZ2V0KGEsIGEtPmZpbHRlclswXSwKKwkJCSAgICAgIGEtPmZpbHRlclsxXSwgYS0+ZmlsdGVyWzJdLAorCQkJICAgICAgYS0+ZmlsdGVyWzNdLCBhLT5maWx0ZXJbNF0pOworCWEzZHNyY19TZXRBdG1vc0N1cnJlbnQoYSwgYS0+ZmlsdGVyWzBdLAorCQkJICAgICAgIGEtPmZpbHRlclsxXSwgYS0+ZmlsdGVyWzJdLAorCQkJICAgICAgIGEtPmZpbHRlclszXSwgYS0+ZmlsdGVyWzRdKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCB2b3J0ZXhfYTNkX2tjb250cm9sIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gIlBsYXliYWNrIFBDTSBhZHZhbmNlZCBwcm9jZXNzaW5nIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IHNuZF92b3J0ZXhfYTNkX2hydGZfaW5mbywKKwkuZ2V0ID0gc25kX3ZvcnRleF9hM2RfZ2V0LAorCS5wdXQgPSBzbmRfdm9ydGV4X2EzZF9ocnRmX3B1dCwKK307CisKKy8qIENvbnRyb2wgKHVuKXJlZ2lzdHJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdm9ydGV4X2EzZF9yZWdpc3Rlcl9jb250cm9scyh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2w7CisJaW50IGVyciwgaTsKKwkvKiBIUlRGIGNvbnRyb2xzLiAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BM0Q7IGkrKykgeworCQlpZiAoKGtjb250cm9sID0KKwkJICAgICBzbmRfY3RsX25ldzEoJnZvcnRleF9hM2Rfa2NvbnRyb2wsICZ2b3J0ZXgtPmEzZFtpXSkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJa2NvbnRyb2wtPmlkLm51bWlkID0gQ1RSTElEX0hSVEY7CisJCWtjb250cm9sLT5pbmZvID0gc25kX3ZvcnRleF9hM2RfaHJ0Zl9pbmZvOworCQlrY29udHJvbC0+cHV0ID0gc25kX3ZvcnRleF9hM2RfaHJ0Zl9wdXQ7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQodm9ydGV4LT5jYXJkLCBrY29udHJvbCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCS8qIElURCBjb250cm9scy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQTNEOyBpKyspIHsKKwkJaWYgKChrY29udHJvbCA9CisJCSAgICAgc25kX2N0bF9uZXcxKCZ2b3J0ZXhfYTNkX2tjb250cm9sLCAmdm9ydGV4LT5hM2RbaV0pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWtjb250cm9sLT5pZC5udW1pZCA9IENUUkxJRF9JVEQ7CisJCWtjb250cm9sLT5pbmZvID0gc25kX3ZvcnRleF9hM2RfaXRkX2luZm87CisJCWtjb250cm9sLT5wdXQgPSBzbmRfdm9ydGV4X2EzZF9pdGRfcHV0OworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKHZvcnRleC0+Y2FyZCwga2NvbnRyb2wpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwkvKiBJTEQgKGdhaW5zKSBjb250cm9scy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQTNEOyBpKyspIHsKKwkJaWYgKChrY29udHJvbCA9CisJCSAgICAgc25kX2N0bF9uZXcxKCZ2b3J0ZXhfYTNkX2tjb250cm9sLCAmdm9ydGV4LT5hM2RbaV0pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWtjb250cm9sLT5pZC5udW1pZCA9IENUUkxJRF9HQUlOUzsKKwkJa2NvbnRyb2wtPmluZm8gPSBzbmRfdm9ydGV4X2EzZF9pbGRfaW5mbzsKKwkJa2NvbnRyb2wtPnB1dCA9IHNuZF92b3J0ZXhfYTNkX2lsZF9wdXQ7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQodm9ydGV4LT5jYXJkLCBrY29udHJvbCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCS8qIEZpbHRlciBjb250cm9scy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQTNEOyBpKyspIHsKKwkJaWYgKChrY29udHJvbCA9CisJCSAgICAgc25kX2N0bF9uZXcxKCZ2b3J0ZXhfYTNkX2tjb250cm9sLCAmdm9ydGV4LT5hM2RbaV0pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWtjb250cm9sLT5pZC5udW1pZCA9IENUUkxJRF9GSUxURVI7CisJCWtjb250cm9sLT5pbmZvID0gc25kX3ZvcnRleF9hM2RfZmlsdGVyX2luZm87CisJCWtjb250cm9sLT5wdXQgPSBzbmRfdm9ydGV4X2EzZF9maWx0ZXJfcHV0OworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKHZvcnRleC0+Y2FyZCwga2NvbnRyb2wpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2EzZF91bnJlZ2lzdGVyX2NvbnRyb2xzKHZvcnRleF90ICogdm9ydGV4KQoreworCit9CisKKy8qIEVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2EzZC5oIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfYTNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NGM2NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2EzZC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIGF1ODh4MF9hM2QuaAorICoKKyAqICBGcmkgSnVsIDE4IDE0OjE2OjAzIDIwMDMKKyAqICBDb3B5cmlnaHQgIDIwMDMgIG1qYW5kZXIKKyAqICBtamFuZGVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BVTg4WDBfQTNEX0gKKyNkZWZpbmUgX0FVODhYMF9BM0RfSAorCisvLyNpbmNsdWRlIDxvcGVuYWwuaD4KKworI2RlZmluZSBIUlRGX1NaIDB4MzgKKyNkZWZpbmUgRExJTkVfU1ogMHgyOAorCisjZGVmaW5lIENUUkxJRF9IUlRGCQkxCisjZGVmaW5lIENUUkxJRF9JVEQJCTIKKyNkZWZpbmUgQ1RSTElEX0lMRAkJNAorI2RlZmluZSBDVFJMSURfRklMVEVSCTgKKyNkZWZpbmUgQ1RSTElEX0dBSU5TCTE2CisKKy8qIDNEIHBhcmFtZXRlciBzdHJ1Y3RzICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBhM2RfSHJ0Zl90W0hSVEZfU1pdOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgYTNkX0l0ZERsaW5lX3RbRExJTkVfU1pdOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgYTNkX2F0bW9zX3RbNV07Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBhM2RfTFJHYWluc190WzJdOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgYTNkX0l0ZF90WzJdOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgYTNkX0lsZF90WzJdOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqdm9ydGV4OwkJLy8gRm9ybWVybHkgQ0FzcDRId0lPKiwgbm93IHZvcnRleF90Ki4KKwl1bnNpZ25lZCBpbnQgc291cmNlOwkvKiB0aGlzXzA0ICovCisJdW5zaWduZWQgaW50IHNsaWNlOwkvKiB0aGlzXzA4ICovCisJYTNkX0hydGZfdCBocnRmWzJdOworCWEzZF9JdGRfdCBpdGQ7CisJYTNkX0lsZF90IGlsZDsKKwlhM2RfSXRkRGxpbmVfdCBkbGluZTsKKwlhM2RfYXRtb3NfdCBmaWx0ZXI7Cit9IGEzZHNyY190OworCisvKiBGaXJzdCBSZWdpc3RlciBiYW5rICovCisKKyNkZWZpbmUgQTNEX0FfSHJ0ZkN1cnJlbnQJMHgxODAwMAkvKiA1NiBVTE9ORyAqLworI2RlZmluZSBBM0RfQV9HYWluQ3VycmVudAkweDE4MEUwCisjZGVmaW5lIEEzRF9BX0dhaW5UYXJnZXQJMHgxODBFNAorI2RlZmluZSBBM0RfQV9BMTJDdXJyZW50CTB4MTgwRTgJLyogQXRtb3NwaGVyaWMgY3VycmVudC4gKi8KKyNkZWZpbmUgQTNEX0FfQTIxVGFyZ2V0CQkweDE4MEVDCS8qIEF0bW9zcGhlcmljIHRhcmdldCAqLworI2RlZmluZSBBM0RfQV9CMDFDdXJyZW50CTB4MTgwRjAJLyogQXRtb3NwaGVyaWMgY3VycmVudCAqLworI2RlZmluZSBBM0RfQV9CMTBUYXJnZXQJCTB4MTgwRjQJLyogQXRtb3NwaGVyaWMgdGFyZ2V0ICovCisjZGVmaW5lIEEzRF9BX0IyQ3VycmVudAkJMHgxODBGOAkvKiBBdG1vc3BoZXJpYyBjdXJyZW50ICovCisjZGVmaW5lIEEzRF9BX0IyVGFyZ2V0CQkweDE4MEZDCS8qIEF0bW9zcGhlcmljIHRhcmdldCAqLworI2RlZmluZSBBM0RfQV9IcnRmVGFyZ2V0CTB4MTgxMDAJLyogNTYgVUxPTkcgKi8KKyNkZWZpbmUgQTNEX0FfSVREQ3VycmVudAkweDE4MUUwCisjZGVmaW5lIEEzRF9BX0lURFRhcmdldAkJMHgxODFFNAorI2RlZmluZSBBM0RfQV9IcnRmRGVsYXlMaW5lCTB4MTgxRTgJLyogNTYgVUxPTkcgKi8KKyNkZWZpbmUgQTNEX0FfSVRERGVsYXlMaW5lCTB4MTgyQzgJLyogNDAvNDUgVUxPTkcgKi8KKyNkZWZpbmUgQTNEX0FfSHJ0ZlRyYWNrVEMJMHgxODM3QwkvKiBUaW1lIENvbnN0YW50cyAqLworI2RlZmluZSBBM0RfQV9HYWluVHJhY2tUQwkweDE4MzgwCisjZGVmaW5lIEEzRF9BX0NvZWZmVHJhY2tUQwkweDE4Mzg0CisjZGVmaW5lIEEzRF9BX0lURFRyYWNrVEMJMHgxODM4OAorI2RlZmluZSBBM0RfQV94MQkJCTB4MTgzOEMKKyNkZWZpbmUgQTNEX0FfeDIJCQkweDE4MzkwCisjZGVmaW5lIEEzRF9BX3kxCQkJMHgxODM5NAorI2RlZmluZSBBM0RfQV95MgkJCTB4MTgzOTgKKyNkZWZpbmUgQTNEX0FfSHJ0Zk91dEwJCTB4MTgzOUMKKyNkZWZpbmUgQTNEX0FfSHJ0Zk91dFIJCTB4MTgzQTAKKyNkZWZpbmUgCUEzRF9BX1RBSUwJCTB4MTgzQTQKKworLyogU2Vjb25kIHJlZ2lzdGVyIGJhbmsgKi8KKyNkZWZpbmUgQTNEX0JfSHJ0ZkN1cnJlbnQJMHgxOTAwMAkvKiA1NiBVTE9ORyAqLworI2RlZmluZSBBM0RfQl9HYWluQ3VycmVudAkweDE5MEUwCisjZGVmaW5lIEEzRF9CX0dhaW5UYXJnZXQJMHgxOTBFNAorI2RlZmluZSBBM0RfQl9BMTJDdXJyZW50CTB4MTkwRTgKKyNkZWZpbmUgQTNEX0JfQTIxVGFyZ2V0CQkweDE5MEVDCisjZGVmaW5lIEEzRF9CX0IwMUN1cnJlbnQJMHgxOTBGMAorI2RlZmluZSBBM0RfQl9CMTBUYXJnZXQJCTB4MTkwRjQKKyNkZWZpbmUgQTNEX0JfQjJDdXJyZW50CQkweDE5MEY4CisjZGVmaW5lIEEzRF9CX0IyVGFyZ2V0CQkweDE5MEZDCisjZGVmaW5lIEEzRF9CX0hydGZUYXJnZXQJMHgxOTEwMAkvKiA1NiBVTE9ORyAqLworI2RlZmluZSBBM0RfQl9JVERDdXJyZW50CTB4MTkxRTAKKyNkZWZpbmUgQTNEX0JfSVREVGFyZ2V0CQkweDE5MUU0CisjZGVmaW5lIEEzRF9CX0hydGZEZWxheUxpbmUJMHgxOTFFOAkvKiA1NiBVTE9ORyAqLworI2RlZmluZSAJQTNEX0JfVEFJTAkJMHgxOTJDOAorCisvKiBUaGVyZSBhcmUgNCBzbGljZXMsIDQgYTNkIGVhY2ggPSAxNiBhM2Qgc291cmNlcy4gKi8KKyNkZWZpbmUgQTNEX1NMSUNFX0JBTktfQQkJMHgxODAwMAkvKiA0IHNvdXJjZXMgKi8KKyNkZWZpbmUgQTNEX1NMSUNFX0JBTktfQgkJMHgxOTAwMAkvKiA0IHNvdXJjZXMgKi8KKyNkZWZpbmUgQTNEX1NMSUNFX1ZEQkRlc3QJCTB4MTlDMDAJLyogOCBVTE9ORyAqLworI2RlZmluZSBBM0RfU0xJQ0VfVkRCU291cmNlCQkweDE5QzIwCS8qIDQgVUxPTkcgKi8KKyNkZWZpbmUgQTNEX1NMSUNFX0FCUmVnCQkJMHgxOUMzMAorI2RlZmluZSBBM0RfU0xJQ0VfQ1JlZwkJCTB4MTlDMzQKKyNkZWZpbmUgQTNEX1NMSUNFX0NvbnRyb2wJCTB4MTlDMzgKKyNkZWZpbmUgQTNEX1NMSUNFX0RlYnVnUmVzZXJ2ZWQJMHgxOUMzYwkvKiBEYW5nZXJvdXMhICovCisjZGVmaW5lIEEzRF9TTElDRV9Qb2ludGVycwkJMHgxOUM0MAorI2RlZmluZSAJQTNEX1NMSUNFX1RBSUwJCTB4MUEwMDAKKworLy8gU2xpY2Ugc2l6ZTogMHgyMDAwCisvLyBTb3VyY2Ugc2l6ZTogMHgzQTQsIDB4MkM4CisKKy8qIEFkZHJlc3MgZ2VuZXJhdG9yIG1hY3JvLiAqLworI2RlZmluZSBhM2RfYWRkckEoc2xpY2Usc291cmNlLHJlZykgKCgoc2xpY2UpPDwweGQpKygoc291cmNlKSoweDNBNCkrKHJlZykpCisjZGVmaW5lIGEzZF9hZGRyQihzbGljZSxzb3VyY2UscmVnKSAoKChzbGljZSk8PDB4ZCkrKChzb3VyY2UpKjB4MkM4KSsocmVnKSkKKyNkZWZpbmUgYTNkX2FkZHJTKHNsaWNlLHJlZykgKCgoc2xpY2UpPDwweGQpKyhyZWcpKQorLy8jZGVmaW5lIGEzZF9hZGRyKHNsaWNlLHNvdXJjZSxyZWcpICgoKHJlZyk+PTB4MTkwMDApID8gYTNkX2FkZHIyKChzbGljZSksKHNvdXJjZSksKHJlZykpIDogYTNkX2FkZHIxKChzbGljZSksKHNvdXJjZSksKHJlZykpKQorCisjZW5kaWYJCQkJLyogX0FVODhYMF9BM0RfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfYTNkZGF0YS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfYTNkZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYWI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9hM2RkYXRhLmMKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBhdTg4eDBfYTNkZGF0YS5jCisgKgorICogIFdlZCBOb3YgMTkgMjE6MTE6MzIgMjAwMworICogIENvcHlyaWdodCAgMjAwMyAgbWphbmRlcgorICogIG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2Uub3JnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIENvbnN0YW50IGluaXRpYWxpemVyIHZhbHVlcy4gKi8KKworc3RhdGljIGNvbnN0IGEzZF9IcnRmX3QgQTNkSHJpclplcm9zID0geworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwKKwkwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwKKwkwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgYTNkX0hydGZfdCBBM2RIcmlySW1wdWxzZSA9IHsKKwkweDdmZmYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwKKwkwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwKKwkwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgYTNkX0hydGZfdCBBM2RIcmlyT25lcyA9IHsKKwkweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwKKwkweDdmZmYsCisJMHg3ZmZmLAorCTB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLAorCTB4N2ZmZiwKKwkweDdmZmYsCisJMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsCisJMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsCisJMHg3ZmZmLAorCTB4N2ZmZiwKKwkweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwKKwkweDdmZmYsCisJMHg3ZmZmLAorCTB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmCit9OworCitzdGF0aWMgY29uc3QgYTNkX0hydGZfdCBBM2RIcmlyU2F0VGVzdCA9IHsKKwkweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwKKwkweDdmZmYsCisJMHg3ZmZmLAorCTB4ODAwMSwgMHg4MDAxLCAweDgwMDEsIDB4ODAwMSwgMHg4MDAxLCAweDgwMDEsIDB4ODAwMSwgMHg4MDAxLAorCTB4ODAwMSwKKwkweDgwMDEsCisJMHg3ZmZmLCAweDAwMDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgYTNkX0hydGZfdCBBM2RIcmlyREltcHVsc2UgPSB7CisJMCwgMHg3ZmZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsCisJMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsCisJMCwgMCwgMAorfTsKKworc3RhdGljIGNvbnN0IGEzZF9JdGREbGluZV90IEEzZEl0ZERsaW5lWmVyb3MgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgc2hvcnQgY29uc3QgR2FpblRDRGVmYXVsdCA9IDB4MzAwOworc3RhdGljIHNob3J0IGNvbnN0IEl0ZFRDRGVmYXVsdCA9IDB4MEM4Oworc3RhdGljIHNob3J0IGNvbnN0IEhydGZUQ0RlZmF1bHQgPSAweDE0NzsKK3N0YXRpYyBzaG9ydCBjb25zdCBDb2VmVENEZWZhdWx0ID0gMHgzMDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZGE0YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYwpAQCAtMCwwICsxLDI4MzcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICAgIFZvcnRleCBjb3JlIGxvdyBsZXZlbCBmdW5jdGlvbnMuCisJCisgQXV0aG9yOiBNYW51ZWwgSmFuZGVyIChtamFuZGVyQHVzZXJzLnNvdXJjZWZvcmdlLmNsKQorIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWFpbmx5IHRoZSByZXN1bHQgb2YgdHJhbnNsYXRpb25zIG1hZGUKKyBmcm9tIHRoZSBvcmlnaW5hbCBkaXNhc3NlbWJseSBvZiB0aGUgYXU4OHgwIGJpbmFyeSBkcml2ZXJzLAorIHdyaXR0ZW4gYnkgQXVyZWFsIGJlZm9yZSB0aGV5IHdlbnQgZG93bi4KKyBNYW55IHRoYW5rcyB0byB0aGUgSmVmZiBNdWl6ZWxhYXIsIEtlc3RlciBNYWRkb2NrLCBhbmQgd2hvZXZlcgorIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuVm9ydGV4IHByb2plY3QuCisgVGhlIGF1dGhvciBvZiB0aGlzIGZpbGUsIHB1dCB0aGUgZmV3IGF2YWlsYWJsZSBwaWVjZXMgdG9nZXRoZXIKKyBhbmQgdHJhbnNsYXRlZCB0aGUgcmVzdCBvZiB0aGUgcmlkZGxlIChNaXgsIFNyYyBhbmQgY29ubmVjdGlvbiBzdHVmZikuCisgU29tZSB0aGluZ3MgYXJlIHN0aWxsIHRvIGJlIGRpc2NvdmVyZWQsIGFuZCB0aGVpciBtZWFuaW5ncyBhcmUgdW5jbGVhci4KKworIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSByZWFsbHkgdXNlZCwgcmF0aGVyCisgdG8gaGVscCB0byB1bmRlcnN0YW5kIGhvdyBkb2VzIHRoZSBBVTg4WDAgY2hpcHMgd29yay4gS2VlcCB0aGVtIGluLCBiZWNhdXNlCisgdGhleSBjb3VsZCBiZSB1c2VkIHNvbWV3aGVyZSBpbiB0aGUgZnV0dXJlLgorCisgVGhpcyBjb2RlIGhhc24ndCBiZWVuIHRlc3RlZCBvciBwcm9vZiByZWFkIHRob3JvdWdobHkuIElmIHlvdSB3YW5uYSBoZWxwLAorIHRha2UgYSBsb29rIGF0IHRoZSBBVTg4WDAgYXNzZW1ibHkgYW5kIGNoZWNrIGlmIHRoaXMgbWF0Y2hlcy4KKyBGdW5jdGlvbnMgdGVzdGVkIG9rIHNvIGZhciBhcmUgKHRoZXkgc2hvdyB0aGUgZGVzaXJlZCBlZmZlY3QKKyBhdCBsZWFzdCk6CisgICB2b3J0ZXhfcm91dGVzKCk7ICgxIGJ1ZyBmaXhlZCkuCisgICB2b3J0ZXhfYWRiX2FkZHJvdXRlKCk7CisgICB2b3J0ZXhfYWRiX2FkZHJvdXRlcygpOworICAgdm9ydGV4X2Nvbm5lY3RfY29kZWNwbGF5KCk7CisgICB2b3J0ZXhfc3JjX2ZsdXNoYnVmZmVycygpOworICAgdm9ydGV4X2FkYmRtYV9zZXRtb2RlKCk7ICBub3RlOiBzdGlsbCBzb21lIHVua25vd24gYXJndW1lbnRzIQorICAgdm9ydGV4X2FkYmRtYV9zdGFydGZpZm8oKTsKKyAgIHZvcnRleF9hZGJkbWFfc3RvcGZpZm8oKTsKKyAgIHZvcnRleF9maWZvX3NldGFkYmN0cmwoKTsgbm90ZTogc3RpbGwgc29tZSB1bmtub3duIGFyZ3VtZW50cyEKKyAgIHZvcnRleF9taXhfc2V0aW5wdXR2b2x1bWVieXRlKCk7CisgICB2b3J0ZXhfbWl4X2VuYWJsZWlucHV0KCk7CisgICB2b3J0ZXhfbWl4ZXJfYWRkV1REKCk7IChmaXhlZCkKKyAgIHZvcnRleF9jb25uZWN0aW9uX2FkYmRtYV9zcmNfc3JjKCk7CisgICB2b3J0ZXhfY29ubmVjdGlvbl9hZGJkbWFfc3JjKCk7CisgICB2b3J0ZXhfc3JjX2NoYW5nZV9jb252cmF0aW8oKTsKKyAgIHZvcnRleF9zcmNfYWRkV1REKCk7IChmaXhlZCkKKworIEhpc3Rvcnk6CisKKyAwMS0wMy0yMDAzIEZpcnN0IHJldmlzaW9uLgorIDAxLTIxLTIwMDMgU29tZSBidWcgZml4ZXMuCisgMTctMDItMjAwMyBtYW55IGJ1Z2ZpeGVzIGFmdGVyIGEgYmlnIHZlcnNpb25pbmcgbWVzcy4KKyAxOC0wMi0yMDAzIEpBQUFBQUhISFVVVVVVVSEhISEgVGhlIG1peGVyIHdvcmtzICEhIEknbSBqdXN0IHNvIGhhcHB5ICEKKwkJCSAoMiBob3VycyBsYXRlci4uLikgSSBjYW50IGJlbGlldmUgaXQhIEltIHJlYWxseSBsdWNreSB0b2RheS4KKwkJCSBOb3cgdGhlIFNSQyBpcyB3b3JraW5nIHRvbyEgWWVhaCEgWE1NUyB3b3JrcyAhCisgMjAtMDItMjAwMyBGaXJzdCBzdGVwcyBpbnRvIHRoZSBBTFNBIHdvcmxkLgorIDI4LTAyLTIwMDMgQXMgbXkgYmlydGhkYXkgcHJlc2VudCwgaSBkaXNjb3ZlcmVkIGhvdyB0aGUgRE1BIGJ1ZmZlciBwYWdlcyByZWFsbHkKKyAgICAgICAgICAgIHdvcmsgOi0pLiBJdCB3YXMgYWxsIHdyb25nLgorIDEyLTAzLTIwMDMgQUxTQSBkcml2ZXIgc3RhcnRzIHdvcmtpbmcgKDIgY2hhbm5lbHMpLgorIDE2LTAzLTIwMDMgTW9yZSBzcmNibG9ja19zZXR1cGNoYW5uZWwgZGlzY292ZXJpZXMuCisgMTItMDQtMjAwMyBBVTg4MzAgcGxheWJhY2sgc3VwcG9ydC4gUmVjb3JkaW5nIGluIHRoZSB3b3Jrcy4KKyAxNy0wNC0yMDAzIHZvcnRleF9yb3V0ZSgpIGFuZCB2b3J0ZXhfcm91dGVzKCkgYnVnIGZpeGVzLiBBVTg4MzAgcmVjb3JkaW5nCisgCQkJd29ya3Mgbm93LCBidXQgY2hpcG4nIGRhbGUgZWZmZWN0IGlzIHN0aWxsIHRoZXJlLgorIDE2LTA1LTIwMDMgU3JjU2V0dXBDaGFubmVsIGNsZWFudXAuIE1vdmVkIHRoZSBTcmMgc2V0dXAgc3R1ZmYgZW50aXJlbHkKKyAgICAgICAgICAgIGludG8gYXU4OHgwX3BjbS5jIC4KKyAwNi0wNi0yMDAzIEJ1ZmZlciBzaGlmdGVyIGJ1Z2ZpeC4gTWl4ZXIgdm9sdW1lIGZpeC4KKyAwNy0xMi0yMDAzIEEzRCByb3V0aW5nIGZpbmFsbHkgZml4ZWQuIEJlbGlldmVkIHRvIGJlIE9LLgorIDI1LTAzLTIwMDQgTWFueSB0aGFua3MgdG8gQ2xhdWRpYSwgZm9yIHN1Y2ggdmFsdWFibGUgYnVnIHJlcG9ydHMuCisgCisqLworCisjaW5jbHVkZSAiYXU4OHgwLmgiCisjaW5jbHVkZSAiYXU4OHgwX2EzZC5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qICBNSVhFUiAoQ0FzcDRNaXgucyBhbmQgQ0FzcDRNaXhlci5zKSAqLworCisvLyBGSVhNRTogZ2V0IHJpZCBvZiB0aGlzLgorc3RhdGljIGludCBtY2hhbm5lbHNbTlJfTUlYSU5dOworc3RhdGljIGludCByYW1wY2hzW05SX01JWElOXTsKKworc3RhdGljIHZvaWQgdm9ydGV4X21peGVyX2VuX3NyKHZvcnRleF90ICogdm9ydGV4LCBpbnQgY2hhbm5lbCkKK3sKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWEVSX1NSLAorCQlod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfU1IpIHwgKDB4MSA8PCBjaGFubmVsKSk7Cit9CitzdGF0aWMgdm9pZCB2b3J0ZXhfbWl4ZXJfZGlzX3NyKHZvcnRleF90ICogdm9ydGV4LCBpbnQgY2hhbm5lbCkKK3sKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWEVSX1NSLAorCQlod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfU1IpICYgfigweDEgPDwgY2hhbm5lbCkpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3ZvcnRleF9taXhfbXV0ZWlucHV0Z2Fpbih2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciBtaXgsCisJCQkgdW5zaWduZWQgY2hhciBjaGFubmVsKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYX0lOVk9MX0EgKyAoKG1peCA8PCA1KSArIGNoYW5uZWwpLAorCQkweDgwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWF9JTlZPTF9CICsgKChtaXggPDwgNSkgKyBjaGFubmVsKSwKKwkJMHg4MCk7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X21peF9nZXR2b2x1bWUodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgbWl4KQoreworCWludCBhOworCWEgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYX1ZPTF9BICsgKG1peCA8PCAyKSkgJiAweGZmOworCS8vRlAyTGluZWFyRnJhYyhhKTsKKwlyZXR1cm4gKGEpOworfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfbWl4X2dldGlucHV0dm9sdW1lKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIG1peCwKKwkJCSAgaW50IGNoYW5uZWwsIGludCAqdm9sKQoreworCWludCBhOworCWlmICghKG1jaGFubmVsc1ttaXhdICYgKDEgPDwgY2hhbm5lbCkpKQorCQlyZXR1cm4gMDsKKwlhID0gaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJICAgVk9SVEVYX01JWF9JTlZPTF9BICsgKCgobWl4IDw8IDUpICsgY2hhbm5lbCkgPDwgMikpOworCS8qCisJICAgaWYgKHJhbXBjaHNbbWl4XSA9PSAwKQorCSAgIGEgPSBGUDJMaW5lYXJGcmFjKGEpOworCSAgIGVsc2UKKwkgICBhID0gRlAyTGluZWFyRnJhY1dUKGEpOworCSAqLworCSp2b2wgPSBhOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdm9ydGV4X21peF9ib29zdDZkYih1bnNpZ25lZCBjaGFyIHZvbCkKK3sKKwlyZXR1cm4gKHZvbCArIDgpOwkvKiBXT1chIHdoYXQgYSBjb21wbGV4IGZ1bmN0aW9uISAqLworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfbWl4X3JhbXB2b2x1bWUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBtaXgpCit7CisJaW50IGNoOworCWNoYXIgYTsKKwkvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciByYW1waW5nIGRvd24gb25seSAoc2VlIHZvcnRleF9kaXNhYmxlaW5wdXQoKSkuCisJZm9yIChjaCA9IDA7IGNoIDwgMHgyMDsgY2grKykgeworCQlpZiAoKCgxIDw8IGNoKSAmIHJhbXBjaHNbbWl4XSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlhID0gaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgIFZPUlRFWF9NSVhfSU5WT0xfQiArICgoKG1peCA8PCA1KSArIGNoKSA8PCAyKSk7CisJCWlmIChhID4gLTEyNikgeworCQkJYSAtPSAyOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQkJVk9SVEVYX01JWF9JTlZPTF9BICsKKwkJCQkoKChtaXggPDwgNSkgKyBjaCkgPDwgMiksIGEpOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQkJVk9SVEVYX01JWF9JTlZPTF9CICsKKwkJCQkoKChtaXggPDwgNSkgKyBjaCkgPDwgMiksIGEpOworCQl9IGVsc2UKKwkJCXZvcnRleF9taXhfa2lsbGlucHV0KHZvcnRleCwgbWl4LCBjaCk7CisJfQorfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfbWl4X2dldGVuYWJsZWJpdCh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciBtaXgsIGludCBtaXhpbikKK3sKKwlpbnQgYWRkciwgdGVtcDsKKwlpZiAobWl4aW4gPj0gMCkKKwkJYWRkciA9IG1peGluOworCWVsc2UKKwkJYWRkciA9IG1peGluICsgMzsKKwlhZGRyID0gKChtaXggPDwgMykgKyAoYWRkciA+PiAyKSkgPDwgMjsKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWF9FTklOICsgYWRkcik7CisJcmV0dXJuICgodGVtcCA+PiAobWl4aW4gJiAzKSkgJiAxKTsKK30KKyNlbmRpZgorc3RhdGljIHZvaWQKK3ZvcnRleF9taXhfc2V0dm9sdW1lYnl0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciBtaXgsCisJCQkgdW5zaWduZWQgY2hhciB2b2wpCit7CisJaW50IHRlbXA7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9NSVhfVk9MX0EgKyAobWl4IDw8IDIpLCB2b2wpOworCWlmICgxKSB7CQkvKmlmICh0aGlzXzEwKSAqLworCQl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWF9WT0xfQiArIChtaXggPDwgMikpOworCQlpZiAoKHRlbXAgIT0gMHg4MCkgfHwgKHZvbCA9PSAweDgwKSkKKwkJCXJldHVybjsKKwl9CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9NSVhfVk9MX0IgKyAobWl4IDw8IDIpLCB2b2wpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X21peF9zZXRpbnB1dHZvbHVtZWJ5dGUodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgbWl4LAorCQkJICAgICAgaW50IG1peGluLCB1bnNpZ25lZCBjaGFyIHZvbCkKK3sKKwlpbnQgdGVtcDsKKworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlWT1JURVhfTUlYX0lOVk9MX0EgKyAoKChtaXggPDwgNSkgKyBtaXhpbikgPDwgMiksIHZvbCk7CisJaWYgKDEpIHsJCS8qIHRoaXNfMTAsIGluaXRpYWxpemVkIHRvIDEuICovCisJCXRlbXAgPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgIFZPUlRFWF9NSVhfSU5WT0xfQiArICgoKG1peCA8PCA1KSArIG1peGluKSA8PCAyKSk7CisJCWlmICgodGVtcCAhPSAweDgwKSB8fCAodm9sID09IDB4ODApKQorCQkJcmV0dXJuOworCX0KKwlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJVk9SVEVYX01JWF9JTlZPTF9CICsgKCgobWl4IDw8IDUpICsgbWl4aW4pIDw8IDIpLCB2b2wpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X21peF9zZXRlbmFibGViaXQodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgbWl4LCBpbnQgbWl4aW4sIGludCBlbikKK3sKKwlpbnQgdGVtcCwgYWRkcjsKKworCWlmIChtaXhpbiA8IDApCisJCWFkZHIgPSAobWl4aW4gKyAzKTsKKwllbHNlCisJCWFkZHIgPSBtaXhpbjsKKwlhZGRyID0gKChtaXggPDwgMykgKyAoYWRkciA+PiAyKSkgPDwgMjsKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWF9FTklOICsgYWRkcik7CisJaWYgKGVuKQorCQl0ZW1wIHw9ICgxIDw8IChtaXhpbiAmIDMpKTsKKwllbHNlCisJCXRlbXAgJj0gfigxIDw8IChtaXhpbiAmIDMpKTsKKwkvKiBNdXRlIGlucHV0LiBBc3RhdGljIHZvaWQgY3JhY2tsaW5nPyAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlWT1JURVhfTUlYX0lOVk9MX0IgKyAoKChtaXggPDwgNSkgKyBtaXhpbikgPDwgMiksIDB4ODApOworCS8qIExvb2tzIGxpa2UgY2xlYXIgYnVmZmVyLiAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYX1NNUCArIChtaXhpbiA8PCAyKSwgMHgwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWF9TTVAgKyA0ICsgKG1peGluIDw8IDIpLCAweDApOworCS8qIFdyaXRlIGVuYWJsZSBiaXQuICovCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9NSVhfRU5JTiArIGFkZHIsIHRlbXApOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X21peF9raWxsaW5wdXQodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgbWl4LCBpbnQgbWl4aW4pCit7CisJcmFtcGNoc1ttaXhdICY9IH4oMSA8PCBtaXhpbik7CisJdm9ydGV4X21peF9zZXRpbnB1dHZvbHVtZWJ5dGUodm9ydGV4LCBtaXgsIG1peGluLCAweDgwKTsKKwltY2hhbm5lbHNbbWl4XSAmPSB+KDEgPDwgbWl4aW4pOworCXZvcnRleF9taXhfc2V0ZW5hYmxlYml0KHZvcnRleCwgbWl4LCBtaXhpbiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfbWl4X2VuYWJsZWlucHV0KHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIG1peCwgaW50IG1peGluKQoreworCXZvcnRleF9taXhfa2lsbGlucHV0KHZvcnRleCwgbWl4LCBtaXhpbik7CisJaWYgKChtY2hhbm5lbHNbbWl4XSAmICgxIDw8IG1peGluKSkgPT0gMCkgeworCQl2b3J0ZXhfbWl4X3NldGlucHV0dm9sdW1lYnl0ZSh2b3J0ZXgsIG1peCwgbWl4aW4sIDB4ODApOwkvKjB4ODAgOiBtdXRlICovCisJCW1jaGFubmVsc1ttaXhdIHw9ICgxIDw8IG1peGluKTsKKwl9CisJdm9ydGV4X21peF9zZXRlbmFibGViaXQodm9ydGV4LCBtaXgsIG1peGluLCAxKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9taXhfZGlzYWJsZWlucHV0KHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIG1peCwgaW50IGNoYW5uZWwsCisJCQlpbnQgcmFtcCkKK3sKKwlpZiAocmFtcCkgeworCQlyYW1wY2hzW21peF0gfD0gKDEgPDwgY2hhbm5lbCk7CisJCS8vIFJlZ2lzdGVyIGNhbGxiYWNrLgorCQkvL3ZvcnRleF9taXhfc3RhcnRyYW1wdm9sdW1lKHZvcnRleCk7CisJCXZvcnRleF9taXhfa2lsbGlucHV0KHZvcnRleCwgbWl4LCBjaGFubmVsKTsKKwl9IGVsc2UKKwkJdm9ydGV4X21peF9raWxsaW5wdXQodm9ydGV4LCBtaXgsIGNoYW5uZWwpOworfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfbWl4ZXJfYWRkV1REKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIG1peCwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlpbnQgdGVtcCwgbGlmZWJvYXQgPSAwLCBwcmV2OworCisJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9NSVhFUl9TUik7CisJaWYgKCh0ZW1wICYgKDEgPDwgY2gpKSA9PSAwKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfQ0hOQkFTRSArIChjaCA8PCAyKSwgbWl4KTsKKwkJdm9ydGV4X21peGVyX2VuX3NyKHZvcnRleCwgY2gpOworCQlyZXR1cm4gMTsKKwl9CisJcHJldiA9IFZPUlRFWF9NSVhFUl9DSE5CQVNFICsgKGNoIDw8IDIpOworCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBwcmV2KTsKKwl3aGlsZSAodGVtcCAmIDB4MTApIHsKKwkJcHJldiA9IFZPUlRFWF9NSVhFUl9SVEJBU0UgKyAoKHRlbXAgJiAweGYpIDw8IDIpOworCQl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgcHJldik7CisJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiBtaXhBZGRXVEQ6IHdoaWxlIGFkZHI9JXgsIHZhbD0leFxuIiwgcHJldiwgdGVtcCk7CisJCWlmICgoKytsaWZlYm9hdCkgPiAweGYpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJ2b3J0ZXhfbWl4ZXJfYWRkV1REOiBsaWZlYm9hdCBvdmVyZmxvd1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWEVSX1JUQkFTRSArICgodGVtcCAmIDB4ZikgPDwgMiksIG1peCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIHByZXYsICh0ZW1wICYgMHhmKSB8IDB4MTApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfbWl4ZXJfZGVsV1REKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIG1peCwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlpbnQgZXNwMTQgPSAtMSwgZXNwMTgsIGVheCwgZWJ4LCBlZHgsIGVicCwgZXNpID0gMDsKKwkvL2ludCBlc3AxZj1lZGkod2hpbGUpPXNyYywgZXNwMTA9Y2g7CisKKwllYXggPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfU1IpOworCWlmICgoKDEgPDwgY2gpICYgZWF4KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWl4IEFMQVJNICV4XG4iLCBlYXgpOworCQlyZXR1cm4gMDsKKwl9CisJZWJwID0gVk9SVEVYX01JWEVSX0NITkJBU0UgKyAoY2ggPDwgMik7CisJZXNwMTggPSBod3JlYWQodm9ydGV4LT5tbWlvLCBlYnApOworCWlmIChlc3AxOCAmIDB4MTApIHsKKwkJZWJ4ID0gKGVzcDE4ICYgMHhmKTsKKwkJaWYgKG1peCA9PSBlYngpIHsKKwkJCWVieCA9IFZPUlRFWF9NSVhFUl9SVEJBU0UgKyAobWl4IDw8IDIpOworCQkJZWR4ID0gaHdyZWFkKHZvcnRleC0+bW1pbywgZWJ4KTsKKwkJCS8vN2I2MAorCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGVicCwgZWR4KTsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYngsIDApOworCQl9IGVsc2UgeworCQkJLy83YWQzCisJCQllZHggPQorCQkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkJICAgVk9SVEVYX01JWEVSX1JUQkFTRSArIChlYnggPDwgMikpOworCQkJLy9wcmludGsoS0VSTl9JTkZPICJ2b3J0ZXg6IG1peGRlbFdURDogMSBhZGRyPSV4LCB2YWw9JXgsIHNyYz0leFxuIiwgZWJ4LCBlZHgsIHNyYyk7CisJCQl3aGlsZSAoKGVkeCAmIDB4ZikgIT0gbWl4KSB7CisJCQkJaWYgKChlc2kpID4gMHhmKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkgICAgICAgInZvcnRleDogbWl4ZGVsV1REOiBlcnJvciBsaWZlYm9hdCBvdmVyZmxvd1xuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQllc3AxNCA9IGVieDsKKwkJCQllYnggPSBlZHggJiAweGY7CisJCQkJZWJwID0gZWJ4IDw8IDI7CisJCQkJZWR4ID0KKwkJCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCQkJICAgVk9SVEVYX01JWEVSX1JUQkFTRSArIGVicCk7CisJCQkJLy9wcmludGsoS0VSTl9JTkZPICJ2b3J0ZXg6IG1peGRlbFdURDogd2hpbGUgYWRkcj0leCwgdmFsPSV4XG4iLCBlYnAsIGVkeCk7CisJCQkJZXNpKys7CisJCQl9CisJCQkvLzdiMzAKKwkJCWVicCA9IGVieCA8PCAyOworCQkJaWYgKGVkeCAmIDB4MTApIHsJLyogRGVsZXRlIGVudHJ5IGluIGJldHdlZW4gb3RoZXJzICovCisJCQkJZWJ4ID0gVk9SVEVYX01JWEVSX1JUQkFTRSArICgoZWR4ICYgMHhmKSA8PCAyKTsKKwkJCQllZHggPSBod3JlYWQodm9ydGV4LT5tbWlvLCBlYngpOworCQkJCS8vN2I2MAorCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJCQlWT1JURVhfTUlYRVJfUlRCQVNFICsgZWJwLCBlZHgpOworCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYngsIDApOworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4IG1peGRlbFdURCBiZXR3ZWVuIGFkZHI9IDB4JXgsIHZhbD0gMHgleFxuIiwgZWJwLCBlZHgpOworCQkJfSBlbHNlIHsJLyogRGVsZXRlIGxhc3QgZW50cnkgKi8KKwkJCQkvLzdiODMKKwkJCQlpZiAoZXNwMTQgPT0gLTEpCisJCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJCQkJVk9SVEVYX01JWEVSX0NITkJBU0UgKworCQkJCQkJKGNoIDw8IDIpLCBlc3AxOCAmIDB4ZWYpOworCQkJCWVsc2UgeworCQkJCQllYnggPSAoMHhmZmZmZmZlMCAmIGVkeCkgfCAoMHhmICYgZWJ4KTsKKwkJCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQkJCQlWT1JURVhfTUlYRVJfUlRCQVNFICsKKwkJCQkJCShlc3AxNCA8PCAyKSwgZWJ4KTsKKwkJCQkJLy9wcmludGsoS0VSTl9JTkZPICJ2b3J0ZXggbWl4ZGVsV1REIGxhc3QgYWRkcj0gMHgleCwgdmFsPSAweCV4XG4iLCBlc3AxNCwgZWJ4KTsKKwkJCQl9CisJCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQkJCVZPUlRFWF9NSVhFUl9SVEJBU0UgKyBlYnAsIDApOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLy9wcmludGsoS0VSTl9JTkZPICJyZW1vdmVkIGxhc3QgbWl4XG4iKTsKKwkJLy83YmUwCisJCXZvcnRleF9taXhlcl9kaXNfc3Iodm9ydGV4LCBjaCk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYnAsIDApOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X21peGVyX2luaXQodm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCB4OworCisJLy8gRklYTUU6IGdldCByaWQgb2YgdGhpcyBjcmFwLgorCW1lbXNldChtY2hhbm5lbHMsIDAsIE5SX01JWE9VVCAqIHNpemVvZihpbnQpKTsKKwltZW1zZXQocmFtcGNocywgMCwgTlJfTUlYT1VUICogc2l6ZW9mKGludCkpOworCisJYWRkciA9IFZPUlRFWF9NSVhfU01QICsgMHgxN2M7CisJZm9yICh4ID0gMHg1ZjsgeCA+PSAwOyB4LS0pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIDApOworCQlhZGRyIC09IDQ7CisJfQorCWFkZHIgPSBWT1JURVhfTUlYX0VOSU4gKyAweDFmYzsKKwlmb3IgKHggPSAweDdmOyB4ID49IDA7IHgtLSkgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgYWRkciwgMCk7CisJCWFkZHIgLT0gNDsKKwl9CisJYWRkciA9IFZPUlRFWF9NSVhfU01QICsgMHgxN2M7CisJZm9yICh4ID0gMHg1ZjsgeCA+PSAwOyB4LS0pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIDApOworCQlhZGRyIC09IDQ7CisJfQorCWFkZHIgPSBWT1JURVhfTUlYX0lOVk9MX0EgKyAweDdmYzsKKwlmb3IgKHggPSAweDFmZjsgeCA+PSAwOyB4LS0pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIDB4ODApOworCQlhZGRyIC09IDQ7CisJfQorCWFkZHIgPSBWT1JURVhfTUlYX1ZPTF9BICsgMHgzYzsKKwlmb3IgKHggPSAweGY7IHggPj0gMDsgeC0tKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCAweDgwKTsKKwkJYWRkciAtPSA0OworCX0KKwlhZGRyID0gVk9SVEVYX01JWF9JTlZPTF9CICsgMHg3ZmM7CisJZm9yICh4ID0gMHgxZmY7IHggPj0gMDsgeC0tKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCAweDgwKTsKKwkJYWRkciAtPSA0OworCX0KKwlhZGRyID0gVk9SVEVYX01JWF9WT0xfQiArIDB4M2M7CisJZm9yICh4ID0gMHhmOyB4ID49IDA7IHgtLSkgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgYWRkciwgMHg4MCk7CisJCWFkZHIgLT0gNDsKKwl9CisJYWRkciA9IFZPUlRFWF9NSVhFUl9SVEJBU0UgKyAoTUlYRVJfUlRCQVNFX1NJWkUgLSAxKSAqIDQ7CisJZm9yICh4ID0gKE1JWEVSX1JUQkFTRV9TSVpFIC0gMSk7IHggPj0gMDsgeC0tKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCAweDApOworCQlhZGRyIC09IDQ7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfU1IsIDApOworCisJLyogU2V0IGNsaXBwaW5nIGNlaWxpbmcgKHRoaXMgbWF5IGJlIGFsbCB3cm9uZykuICovCisJLyoKKwlmb3IgKHggPSAwOyB4ID4gMHg4MDsgeCsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfTUlYRVJfQ0xJUCArICh4IDw8IDIpLCAweDNmZmZmKTsKKwl9CisJKi8KKwkvKgorCSAgIGNhbGwgQ0FzcDRNaXhfX0luaXRpYWxpemVfQ0FzcDRId0lPX19fX0NBc3A0TWl4ZXJfX19fCisJICAgUmVnaXN0ZXIgSVNSIGNhbGxiYWNrIGZvciB2b2x1bWUgc21vb3RoIGZhZGUgb3V0LgorCSAgIE1heWJlIHRoaXMgYXZvaWRzIGNsaWNrcyB3aGVuIHByZXNzICJzdG9wIiA/CisJICovCit9CisKKy8qICBTUkMgKENBc3A0U3JjLnMgYW5kIENBc3A0U3JjQmxvY2spICovCisKK3N0YXRpYyB2b2lkIHZvcnRleF9zcmNfZW5fc3Iodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBjaGFubmVsKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDQkxPQ0tfU1IsCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNCTE9DS19TUikgfCAoMHgxIDw8IGNoYW5uZWwpKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X3NyY19kaXNfc3Iodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBjaGFubmVsKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDQkxPQ0tfU1IsCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNCTE9DS19TUikgJiB+KDB4MSA8PCBjaGFubmVsKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9zcmNfZmx1c2hidWZmZXJzKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIHNyYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDB4MWY7IGkgPj0gMDsgaS0tKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCVZPUlRFWF9TUkNfREFUQTAgKyAoc3JjIDw8IDcpICsgKGkgPDwgMiksIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0RBVEEgKyAoc3JjIDw8IDMpLCAwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19EQVRBICsgKHNyYyA8PCAzKSArIDQsIDApOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfc3JjX2NsZWFyZHJpZnQodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgc3JjKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0RSSUZUMCArIChzcmMgPDwgMiksIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0RSSUZUMSArIChzcmMgPDwgMiksIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0RSSUZUMiArIChzcmMgPDwgMiksIDEpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X3NyY19zZXRfdGhyb3R0bGVzb3VyY2Uodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgc3JjLCBpbnQgZW4pCit7CisJaW50IHRlbXA7CisKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19TT1VSQ0UpOworCWlmIChlbikKKwkJdGVtcCB8PSAxIDw8IHNyYzsKKwllbHNlCisJCXRlbXAgJj0gfigxIDw8IHNyYyk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfU09VUkNFLCB0ZW1wKTsKK30KKworc3RhdGljIGludAordm9ydGV4X3NyY19wZXJzaXN0X2NvbnZyYXRpbyh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciBzcmMsIGludCByYXRpbykKK3sKKwlpbnQgdGVtcCwgbGlmZWJvYXQgPSAwOworCisJZG8geworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19DT05WUkFUSU8gKyAoc3JjIDw8IDIpLCByYXRpbyk7CisJCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0NPTlZSQVRJTyArIChzcmMgPDwgMikpOworCQlpZiAoKCsrbGlmZWJvYXQpID4gMHg5KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZvcnRleDogU3JjIGN2ciBmYWlsXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXdoaWxlICh0ZW1wICE9IHJhdGlvKTsKKwlyZXR1cm4gdGVtcDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9zcmNfc2xvd2xvY2sodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgc3JjKQoreworCWludCB0ZW1wOworCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfRFJJRlQyICsgKHNyYyA8PCAyKSwgMSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfRFJJRlQwICsgKHNyYyA8PCAyKSwgMCk7CisJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfVTAgKyAoc3JjIDw8IDIpKTsKKwlpZiAodGVtcCAmIDB4MjAwKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19VMCArIChzcmMgPDwgMiksCisJCQl0ZW1wICYgfjB4MjAwTCk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfc3JjX2NoYW5nZV9jb252cmF0aW8odm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgc3JjLCBpbnQgcmF0aW8pCit7CisJaW50IHRlbXAsIGE7CisKKwlpZiAoKHJhdGlvICYgMHgxMDAwMCkgJiYgKHJhdGlvICE9IDB4MTAwMDApKSB7CisJCWlmIChyYXRpbyAmIDB4M2ZmZikKKwkJCWEgPSAoMHgxMSAtICgocmF0aW8gPj4gMHhlKSAmIDB4MykpIC0gMTsKKwkJZWxzZQorCQkJYSA9ICgweDExIC0gKChyYXRpbyA+PiAweGUpICYgMHgzKSkgLSAyOworCX0gZWxzZQorCQlhID0gMHhjOworCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX1UwICsgKHNyYyA8PCAyKSk7CisJaWYgKCgodGVtcCA+PiA0KSAmIDB4ZikgIT0gYSkKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfVTAgKyAoc3JjIDw8IDIpLAorCQkJKHRlbXAgJiAweGYpIHwgKChhICYgMHhmKSA8PCA0KSk7CisKKwl2b3J0ZXhfc3JjX3BlcnNpc3RfY29udnJhdGlvKHZvcnRleCwgc3JjLCByYXRpbyk7Cit9CisKK3N0YXRpYyBpbnQKK3ZvcnRleF9zcmNfY2hlY2tyYXRpbyh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciBzcmMsCisJCSAgICAgIHVuc2lnbmVkIGludCBkZXNpcmVkX3JhdGlvKQoreworCWludCBod19yYXRpbywgbGlmZWJvYXQgPSAwOworCisJaHdfcmF0aW8gPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDX0NPTlZSQVRJTyArIChzcmMgPDwgMikpOworCisJd2hpbGUgKGh3X3JhdGlvICE9IGRlc2lyZWRfcmF0aW8pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfQ09OVlJBVElPICsgKHNyYyA8PCAyKSwgZGVzaXJlZF9yYXRpbyk7CisKKwkJaWYgKChsaWZlYm9hdCsrKSA+IDE1KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZvcnRleDogY291bGQgbm90IHNldCBzcmMtJWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSAgICAgICBzcmMsIGh3X3JhdGlvLCBkZXNpcmVkX3JhdGlvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGh3X3JhdGlvOworfQorCisjZW5kaWYKKy8qCisgT2JqZWN0aXZlOiBTZXQgc2FtcGxlcmF0ZSBmb3IgZ2l2ZW4gU1JDIG1vZHVsZS4KKyBBcmd1bWVudHM6CisJY2FyZDoJcG9pbnRlciB0byB2b3J0ZXhfdCBzdHJjdXQuCisJc3JjOglJbnRlZ2VyIGluZGV4IG9mIHRoZSBTUkMgbW9kdWxlLgorCWNyOgkJQ3VycmVudCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIGZhY3Rvci4KKwliOgkJdW5rbm93biAxNiBiaXQgdmFsdWUuCisJc3dlZXA6CUVuYWJsZSBTYW1wbGVyYXRlIGZhZGUgZnJvbSBjciB0b3dhcmQgdHIgZmxhZy4KKwlkaXJwbGF5OiAxOiBwbGF5YmFjaywgMDogcmVjb3JkaW5nLgorCXNsOgkJU2xvdyBMb2NrIGZsYWcuCisJdHI6CQlUYXJnZXQgc2FtcGxlcmF0ZSBjb252ZXJzaW9uLgorCXRoc291cmNlOiBUaHJvdHRsZSBzb3VyY2UgZmxhZyAobm8gaWRlYSB3aGF0IHRoYXQgbWVhbnMpLgorKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9zcmNfc2V0dXBjaGFubmVsKHZvcnRleF90ICogY2FyZCwgdW5zaWduZWQgY2hhciBzcmMsCisJCQl1bnNpZ25lZCBpbnQgY3IsIHVuc2lnbmVkIGludCBiLCBpbnQgc3dlZXAsIGludCBkLAorCQkJaW50IGRpcnBsYXksIGludCBzbCwgdW5zaWduZWQgaW50IHRyLCBpbnQgdGhzb3VyY2UpCit7CisJLy8gbm9wbGF5YmFjazogZD0yLDQsNywweGEsMHhiIHdoZW4gdXNpbmcgZmlyc3QgMiBzcmMncy4KKwkvLyBjOiBlbmFibGVzIHBpdGNoIHN3ZWVwLgorCS8vIGxvb2tzIGxpa2UgZyBpcyBjIHJlbGF0ZWQuIE1heWJlIGcgaXMgYSBzd2VlcCBwYXJhbWV0ZXIgPworCS8vIGcgPSBjdnIKKwkvLyBkaXJwbGF5OiAwID0gcmVjb3JkaW5nLCAxID0gcGxheWJhY2sKKwkvLyBkID0gc3JjIGh3IGluZGV4LgorCisJaW50IGVzaSwgZWJwID0gMCwgZXNwMTA7CisKKwl2b3J0ZXhfc3JjX2ZsdXNoYnVmZmVycyhjYXJkLCBzcmMpOworCisJaWYgKHN3ZWVwKSB7CisJCWlmICgodHIgJiAweDEwMDAwKSAmJiAodHIgIT0gMHgxMDAwMCkpIHsKKwkJCXRyID0gMDsKKwkJCWVzaSA9IDB4NzsKKwkJfSBlbHNlIHsKKwkJCWlmICgoKChzaG9ydCl0cikgPCAwKSAmJiAodHIgIT0gMHg4MDAwKSkgeworCQkJCXRyID0gMDsKKwkJCQllc2kgPSAweDg7CisJCQl9IGVsc2UgeworCQkJCXRyID0gMTsKKwkJCQllc2kgPSAweGM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGNyICYgMHgxMDAwMCkgJiYgKGNyICE9IDB4MTAwMDApKSB7CisJCQl0ciA9IDA7CS8qZWJ4ID0gMCAqLworCQkJZXNpID0gMHgxMSAtICgoY3IgPj4gMHhlKSAmIDcpOworCQkJaWYgKGNyICYgMHgzZmZmKQorCQkJCWVzaSAtPSAxOworCQkJZWxzZQorCQkJCWVzaSAtPSAyOworCQl9IGVsc2UgeworCQkJdHIgPSAxOworCQkJZXNpID0gMHhjOworCQl9CisJfQorCXZvcnRleF9zcmNfY2xlYXJkcmlmdChjYXJkLCBzcmMpOworCXZvcnRleF9zcmNfc2V0X3Rocm90dGxlc291cmNlKGNhcmQsIHNyYywgdGhzb3VyY2UpOworCisJaWYgKChkaXJwbGF5ID09IDApICYmIChzd2VlcCA9PSAwKSkgeworCQlpZiAodHIpCisJCQllc3AxMCA9IDB4ZjsKKwkJZWxzZQorCQkJZXNwMTAgPSAweGM7CisJCWVicCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRyKQorCQkJZWJwID0gMHhmOworCQllbHNlCisJCQllYnAgPSAweGM7CisJCWVzcDEwID0gMDsKKwl9CisJaHd3cml0ZShjYXJkLT5tbWlvLCBWT1JURVhfU1JDX1UwICsgKHNyYyA8PCAyKSwKKwkJKHNsIDw8IDB4OSkgfCAoc3dlZXAgPDwgMHg4KSB8ICgoZXNpICYgMHhmKSA8PCA0KSB8IGQpOworCS8qIDB4YzAgICBlc2k9MHhjIGM9Zj0wIGQ9MCAqLworCXZvcnRleF9zcmNfcGVyc2lzdF9jb252cmF0aW8oY2FyZCwgc3JjLCBjcik7CisJaHd3cml0ZShjYXJkLT5tbWlvLCBWT1JURVhfU1JDX1UxICsgKHNyYyA8PCAyKSwgYiAmIDB4ZmZmZik7CisJLyogMCAgIGI9MCAqLworCWh3d3JpdGUoY2FyZC0+bW1pbywgVk9SVEVYX1NSQ19VMiArIChzcmMgPDwgMiksCisJCSh0ciA8PCAweDExKSB8IChkaXJwbGF5IDw8IDB4MTApIHwgKGVicCA8PCAweDgpIHwgZXNwMTApOworCS8qIDB4MzBmMDAgZT1nPTEgZXNwMTA9MCBlYnA9ZiAqLworCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiBTUkMgJWQsIGQ9MHgleCwgZXNpPTB4JXgsIGVzcDEwPTB4JXgsIGVicD0weCV4XG4iLCBzcmMsIGQsIGVzaSwgZXNwMTAsIGVicCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9zcmNibG9ja19pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgeDsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19TT1VSQ0VTSVpFLCAweDFmZik7CisJLyoKKwkgICBmb3IgKHg9MDsgeDwweDEwOyB4KyspIHsKKwkgICB2b3J0ZXhfc3JjX2luaXQoJnZvcnRleF9zcmNbeF0sIHgpOworCSAgIH0KKwkgKi8KKwkvL2FkZHIgPSAweGNjM2M7CisJLy9hZGRyID0gMHgyNmMzYzsKKwlhZGRyID0gVk9SVEVYX1NSQ19SVEJBU0UgKyAweDNjOworCWZvciAoeCA9IDB4ZjsgeCA+PSAwOyB4LS0pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIDApOworCQlhZGRyIC09IDQ7CisJfQorCS8vYWRkciA9IDB4Y2M5NDsKKwkvL2FkZHIgPSAweDI2Yzk0OworCWFkZHIgPSBWT1JURVhfU1JDX0NITkJBU0UgKyAweDU0OworCWZvciAoeCA9IDB4MTU7IHggPj0gMDsgeC0tKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCAwKTsKKwkJYWRkciAtPSA0OworCX0KK30KKworc3RhdGljIGludAordm9ydGV4X3NyY19hZGRXVEQodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgc3JjLCB1bnNpZ25lZCBjaGFyIGNoKQoreworCWludCB0ZW1wLCBsaWZlYm9hdCA9IDAsIHByZXY7CisJLy8gZXNwMTMgPSBzcmMKKworCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDQkxPQ0tfU1IpOworCWlmICgodGVtcCAmICgxIDw8IGNoKSkgPT0gMCkgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NSQ19DSE5CQVNFICsgKGNoIDw8IDIpLCBzcmMpOworCQl2b3J0ZXhfc3JjX2VuX3NyKHZvcnRleCwgY2gpOworCQlyZXR1cm4gMTsKKwl9CisJcHJldiA9IFZPUlRFWF9TUkNfQ0hOQkFTRSArIChjaCA8PCAyKTsJLyplYnAgKi8KKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgcHJldik7CisJLy93aGlsZSAodGVtcCAmIE5SX1NSQykgeworCXdoaWxlICh0ZW1wICYgMHgxMCkgeworCQlwcmV2ID0gVk9SVEVYX1NSQ19SVEJBU0UgKyAoKHRlbXAgJiAweGYpIDw8IDIpOwkvKmVzcDEyICovCisJCS8vcHJldiA9IFZPUlRFWF9TUkNfUlRCQVNFICsgKCh0ZW1wICYgKE5SX1NSQy0xKSkgPDwgMik7IC8qZXNwMTIqLworCQl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgcHJldik7CisJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiBzcmNBZGRXVEQ6IHdoaWxlIGFkZHI9JXgsIHZhbD0leFxuIiwgcHJldiwgdGVtcCk7CisJCWlmICgoKytsaWZlYm9hdCkgPiAweGYpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJ2b3J0ZXhfc3JjX2FkZFdURDogbGlmZWJvYXQgb3ZlcmZsb3dcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUkNfUlRCQVNFICsgKCh0ZW1wICYgMHhmKSA8PCAyKSwgc3JjKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCBwcmV2LCAodGVtcCAmIChOUl9TUkMtMSkpIHwgTlJfU1JDKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgcHJldiwgKHRlbXAgJiAweGYpIHwgMHgxMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3ZvcnRleF9zcmNfZGVsV1REKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIHNyYywgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlpbnQgZXNwMTQgPSAtMSwgZXNwMTgsIGVheCwgZWJ4LCBlZHgsIGVicCwgZXNpID0gMDsKKwkvL2ludCBlc3AxZj1lZGkod2hpbGUpPXNyYywgZXNwMTA9Y2g7CisKKwllYXggPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfU1JDQkxPQ0tfU1IpOworCWlmICgoKDEgPDwgY2gpICYgZWF4KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3JjIGFsYXJtXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWVicCA9IFZPUlRFWF9TUkNfQ0hOQkFTRSArIChjaCA8PCAyKTsKKwllc3AxOCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIGVicCk7CisJaWYgKGVzcDE4ICYgMHgxMCkgeworCQllYnggPSAoZXNwMTggJiAweGYpOworCQlpZiAoc3JjID09IGVieCkgeworCQkJZWJ4ID0gVk9SVEVYX1NSQ19SVEJBU0UgKyAoc3JjIDw8IDIpOworCQkJZWR4ID0gaHdyZWFkKHZvcnRleC0+bW1pbywgZWJ4KTsKKwkJCS8vN2I2MAorCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGVicCwgZWR4KTsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYngsIDApOworCQl9IGVsc2UgeworCQkJLy83YWQzCisJCQllZHggPQorCQkJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkJICAgVk9SVEVYX1NSQ19SVEJBU0UgKyAoZWJ4IDw8IDIpKTsKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiBzcmNkZWxXVEQ6IDEgYWRkcj0leCwgdmFsPSV4LCBzcmM9JXhcbiIsIGVieCwgZWR4LCBzcmMpOworCQkJd2hpbGUgKChlZHggJiAweGYpICE9IHNyYykgeworCQkJCWlmICgoZXNpKSA+IDB4ZikgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgidm9ydGV4OiBzcmNkZWxXVEQ6IGVycm9yLCBsaWZlYm9hdCBvdmVyZmxvd1xuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQllc3AxNCA9IGVieDsKKwkJCQllYnggPSBlZHggJiAweGY7CisJCQkJZWJwID0gZWJ4IDw8IDI7CisJCQkJZWR4ID0KKwkJCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCQkJICAgVk9SVEVYX1NSQ19SVEJBU0UgKyBlYnApOworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiBzcmNkZWxXVEQ6IHdoaWxlIGFkZHI9JXgsIHZhbD0leFxuIiwgZWJwLCBlZHgpOworCQkJCWVzaSsrOworCQkJfQorCQkJLy83YjMwCisJCQllYnAgPSBlYnggPDwgMjsKKwkJCWlmIChlZHggJiAweDEwKSB7CS8qIERlbGV0ZSBlbnRyeSBpbiBiZXR3ZWVuIG90aGVycyAqLworCQkJCWVieCA9IFZPUlRFWF9TUkNfUlRCQVNFICsgKChlZHggJiAweGYpIDw8IDIpOworCQkJCWVkeCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIGVieCk7CisJCQkJLy83YjYwCisJCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQkJCVZPUlRFWF9TUkNfUlRCQVNFICsgZWJwLCBlZHgpOworCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYngsIDApOworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4IHNyY2RlbFdURCBiZXR3ZWVuIGFkZHI9IDB4JXgsIHZhbD0gMHgleFxuIiwgZWJwLCBlZHgpOworCQkJfSBlbHNlIHsJLyogRGVsZXRlIGxhc3QgZW50cnkgKi8KKwkJCQkvLzdiODMKKwkJCQlpZiAoZXNwMTQgPT0gLTEpCisJCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJCQkJVk9SVEVYX1NSQ19DSE5CQVNFICsKKwkJCQkJCShjaCA8PCAyKSwgZXNwMTggJiAweGVmKTsKKwkJCQllbHNlIHsKKwkJCQkJZWJ4ID0gKDB4ZmZmZmZmZTAgJiBlZHgpIHwgKDB4ZiAmIGVieCk7CisJCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJCQkJVk9SVEVYX1NSQ19SVEJBU0UgKworCQkJCQkJKGVzcDE0IDw8IDIpLCBlYngpOworCQkJCQkvL3ByaW50ayhLRVJOX0lORk8idm9ydGV4IHNyY2RlbFdURCBsYXN0IGFkZHI9IDB4JXgsIHZhbD0gMHgleFxuIiwgZXNwMTQsIGVieCk7CisJCQkJfQorCQkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJCQlWT1JURVhfU1JDX1JUQkFTRSArIGVicCwgMCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvLzdiZTAKKwkJdm9ydGV4X3NyY19kaXNfc3Iodm9ydGV4LCBjaCk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYnAsIDApOworCX0KKwlyZXR1cm4gMTsKK30KKworIC8qRklGTyovIAorCitzdGF0aWMgdm9pZAordm9ydGV4X2ZpZm9fY2xlYXJhZGJkYXRhKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZmlmbywgaW50IHgpCit7CisJZm9yICh4LS07IHggPj0gMDsgeC0tKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCVZPUlRFWF9GSUZPX0FEQkRBVEEgKworCQkJKCgoZmlmbyA8PCBGSUZPX1NJWkVfQklUUykgKyB4KSA8PCAyKSwgMCk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB2b3J0ZXhfZmlmb19hZGJpbml0aWFsaXplKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZmlmbywgaW50IGopCit7CisJdm9ydGV4X2ZpZm9fY2xlYXJhZGJkYXRhKHZvcnRleCwgZmlmbywgRklGT19TSVpFKTsKKyNpZmRlZiBDSElQX0FVODgyMAorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19BREJDVFJMICsgKGZpZm8gPDwgMiksCisJCShGSUZPX1UxIHwgKChqICYgRklGT19NQVNLKSA8PCAweGIpKSk7CisjZWxzZQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19BREJDVFJMICsgKGZpZm8gPDwgMiksCisJCShGSUZPX1UxIHwgKChqICYgRklGT19NQVNLKSA8PCAweGMpKSk7CisjZW5kaWYKK30KKyNlbmRpZgorc3RhdGljIHZvaWQgdm9ydGV4X2ZpZm9fc2V0YWRidmFsaWQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBmaWZvLCBpbnQgZW4pCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX0FEQkNUUkwgKyAoZmlmbyA8PCAyKSwKKwkJKGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX0FEQkNUUkwgKyAoZmlmbyA8PCAyKSkgJgorCQkgMHhmZmZmZmZlZikgfCAoKDEgJiBlbikgPDwgNCkgfCBGSUZPX1UxKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9maWZvX3NldGFkYmN0cmwodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBmaWZvLCBpbnQgYiwgaW50IHByaW9yaXR5LAorCQkgICAgICAgaW50IGVtcHR5LCBpbnQgdmFsaWQsIGludCBmKQoreworCWludCB0ZW1wLCBsaWZlYm9hdCA9IDA7CisJLy9pbnQgdGhpc184W05SX0FEQl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07IC8qIHBvc2l0aW9uICovCisJaW50IHRoaXNfNCA9IDB4MjsKKwkvKiBmIHNlZW1zIHByaW9yaXR5IHJlbGF0ZWQuCisJICogQ0FzcDRBZGJEbWE6OlNldFByaW9yaXR5IGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgY2FsbHMgU2V0QWRiQ3RybCB3aXRoIGYgc2V0IHRvIDEKKwkgKiBldmVyeSB3aGVyZSBlbHNlIGl0IGlzIHNldCB0byAwLiBJdCBzZWVtcywgaG93ZXZlciwgdGhhdCBDQXNwNEFkYkRtYTo6U2V0UHJpb3JpdHkKKwkgKiBpcyBuZXZlciBjYWxsZWQsIHRodXMgdGhlIGYgcmVsYXRlZCBiaXRzIHJlbWFpbiBhIG15c3RlcnkgZm9yIG5vdy4KKwkgKi8KKwlkbyB7CisJCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19BREJDVFJMICsgKGZpZm8gPDwgMikpOworCQlpZiAobGlmZWJvYXQrKyA+IDB4YmI4KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiVm9ydGV4OiB2b3J0ZXhfZmlmb19zZXRhZGJjdHJsIGZhaWxcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJd2hpbGUgKHRlbXAgJiBGSUZPX1JET05MWSk7CisKKwkvLyBBVTg4MzAgc2VtZXMgdG8gdGFrZSBzb21lIHNwZWNpYWwgY2FyZSBhYm91dCBmaWZvIGNvbnRlbnQgKGRhdGEpLgorCS8vIEJ1dCBpJ20ganVzdCB0byBsYXp5IHRvIHRyYW5zbGF0ZSB0aGF0IDopCisJaWYgKHZhbGlkKSB7CisJCWlmICgodGVtcCAmIEZJRk9fVkFMSUQpID09IDApIHsKKwkJCS8vdGhpc184W2ZpZm9dID0gMDsKKwkJCXZvcnRleF9maWZvX2NsZWFyYWRiZGF0YSh2b3J0ZXgsIGZpZm8sIEZJRk9fU0laRSk7CS8vIHRoaXNfNAorI2lmZGVmIENISVBfQVU4ODIwCisJCQl0ZW1wID0gKHRoaXNfNCAmIDB4MWYpIDw8IDB4YjsKKyNlbHNlCisJCQl0ZW1wID0gKHRoaXNfNCAmIDB4M2YpIDw8IDB4YzsKKyNlbmRpZgorCQkJdGVtcCA9ICh0ZW1wICYgMHhmZmZmZmZmZCkgfCAoKGIgJiAxKSA8PCAxKTsKKwkJCXRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmZjMpIHwgKChwcmlvcml0eSAmIDMpIDw8IDIpOworCQkJdGVtcCA9ICh0ZW1wICYgMHhmZmZmZmZlZikgfCAoKHZhbGlkICYgMSkgPDwgNCk7CisJCQl0ZW1wIHw9IEZJRk9fVTE7CisJCQl0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmRmKSB8ICgoZW1wdHkgJiAxKSA8PCA1KTsKKyNpZmRlZiBDSElQX0FVODgyMAorCQkJdGVtcCA9ICh0ZW1wICYgMHhmZmZiZmZmZikgfCAoKGYgJiAxKSA8PCAweDEyKTsKKyNlbmRpZgorI2lmZGVmIENISVBfQVU4ODMwCisJCQl0ZW1wID0gKHRlbXAgJiAweGY3ZmZmZmZmKSB8ICgoZiAmIDEpIDw8IDB4MWIpOworCQkJdGVtcCA9ICh0ZW1wICYgMHhlZmZmZmZmZikgfCAoKGYgJiAxKSA8PCAweDFjKTsKKyNlbmRpZgorI2lmZGVmIENISVBfQVU4ODEwCisJCQl0ZW1wID0gKHRlbXAgJiAweGZlZmZmZmZmKSB8ICgoZiAmIDEpIDw8IDB4MTgpOworCQkJdGVtcCA9ICh0ZW1wICYgMHhmZGZmZmZmZikgfCAoKGYgJiAxKSA8PCAweDE5KTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRlbXAgJiBGSUZPX1ZBTElEKSB7CisjaWZkZWYgQ0hJUF9BVTg4MjAKKwkJCXRlbXAgPSAoKGYgJiAxKSA8PCAweDEyKSB8ICh0ZW1wICYgMHhmZmZiZmZlZik7CisjZW5kaWYKKyNpZmRlZiBDSElQX0FVODgzMAorCQkJdGVtcCA9CisJCQkgICAgKChmICYgMSkgPDwgMHgxYikgfCAodGVtcCAmIDB4ZTdmZmZmZWYpIHwgRklGT19CSVRTOworI2VuZGlmCisjaWZkZWYgQ0hJUF9BVTg4MTAKKwkJCXRlbXAgPQorCQkJICAgICgoZiAmIDEpIDw8IDB4MTgpIHwgKHRlbXAgJiAweGZjZmZmZmVmKSB8IEZJRk9fQklUUzsKKyNlbmRpZgorCQl9IGVsc2UKKwkJCS8qaWYgKHRoaXNfOFtmaWZvXSkgKi8KKwkJCXZvcnRleF9maWZvX2NsZWFyYWRiZGF0YSh2b3J0ZXgsIGZpZm8sIEZJRk9fU0laRSk7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19BREJDVFJMICsgKGZpZm8gPDwgMiksIHRlbXApOworCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX0FEQkNUUkwgKyAoZmlmbyA8PCAyKSk7Cit9CisKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKK3N0YXRpYyB2b2lkIHZvcnRleF9maWZvX2NsZWFyd3RkYXRhKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZmlmbywgaW50IHgpCit7CisJaWYgKHggPCAxKQorCQlyZXR1cm47CisJZm9yICh4LS07IHggPj0gMDsgeC0tKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCVZPUlRFWF9GSUZPX1dUREFUQSArCisJCQkoKChmaWZvIDw8IEZJRk9fU0laRV9CSVRTKSArIHgpIDw8IDIpLCAwKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2ZpZm9fd3Rpbml0aWFsaXplKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZmlmbywgaW50IGopCit7CisJdm9ydGV4X2ZpZm9fY2xlYXJ3dGRhdGEodm9ydGV4LCBmaWZvLCBGSUZPX1NJWkUpOworI2lmZGVmIENISVBfQVU4ODIwCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX1dUQ1RSTCArIChmaWZvIDw8IDIpLAorCQkoRklGT19VMSB8ICgoaiAmIEZJRk9fTUFTSykgPDwgMHhiKSkpOworI2Vsc2UKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMiksCisJCShGSUZPX1UxIHwgKChqICYgRklGT19NQVNLKSA8PCAweGMpKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2ZpZm9fc2V0d3R2YWxpZCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGZpZm8sIGludCBlbikKK3sKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMiksCisJCShod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19XVENUUkwgKyAoZmlmbyA8PCAyKSkgJgorCQkgMHhmZmZmZmZlZikgfCAoKGVuICYgMSkgPDwgNCkgfCBGSUZPX1UxKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9maWZvX3NldHd0Y3RybCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGZpZm8sIGludCBjdHJsLCBpbnQgcHJpb3JpdHksCisJCSAgICAgIGludCBlbXB0eSwgaW50IHZhbGlkLCBpbnQgZikKK3sKKwlpbnQgdGVtcCA9IDAsIGxpZmVib2F0ID0gMDsKKwlpbnQgdGhpc180ID0gMjsKKworCWRvIHsKKwkJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX1dUQ1RSTCArIChmaWZvIDw8IDIpKTsKKwkJaWYgKGxpZmVib2F0KysgPiAweGJiOCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWb3J0ZXg6IHZvcnRleF9maWZvX3NldHd0Y3RybCBmYWlsXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXdoaWxlICh0ZW1wICYgRklGT19SRE9OTFkpOworCisJaWYgKHZhbGlkKSB7CisJCWlmICgodGVtcCAmIEZJRk9fVkFMSUQpID09IDApIHsKKwkJCXZvcnRleF9maWZvX2NsZWFyd3RkYXRhKHZvcnRleCwgZmlmbywgRklGT19TSVpFKTsJLy8gdGhpc180CisjaWZkZWYgQ0hJUF9BVTg4MjAKKwkJCXRlbXAgPSAodGhpc180ICYgMHgxZikgPDwgMHhiOworI2Vsc2UKKwkJCXRlbXAgPSAodGhpc180ICYgMHgzZikgPDwgMHhjOworI2VuZGlmCisJCQl0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmZkKSB8ICgoY3RybCAmIDEpIDw8IDEpOworCQkJdGVtcCA9ICh0ZW1wICYgMHhmZmZmZmZmMykgfCAoKHByaW9yaXR5ICYgMykgPDwgMik7CisJCQl0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmVmKSB8ICgodmFsaWQgJiAxKSA8PCA0KTsKKwkJCXRlbXAgfD0gRklGT19VMTsKKwkJCXRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmZGYpIHwgKChlbXB0eSAmIDEpIDw8IDUpOworI2lmZGVmIENISVBfQVU4ODIwCisJCQl0ZW1wID0gKHRlbXAgJiAweGZmZmJmZmZmKSB8ICgoZiAmIDEpIDw8IDB4MTIpOworI2VuZGlmCisjaWZkZWYgQ0hJUF9BVTg4MzAKKwkJCXRlbXAgPSAodGVtcCAmIDB4ZjdmZmZmZmYpIHwgKChmICYgMSkgPDwgMHgxYik7CisJCQl0ZW1wID0gKHRlbXAgJiAweGVmZmZmZmZmKSB8ICgoZiAmIDEpIDw8IDB4MWMpOworI2VuZGlmCisjaWZkZWYgQ0hJUF9BVTg4MTAKKwkJCXRlbXAgPSAodGVtcCAmIDB4ZmVmZmZmZmYpIHwgKChmICYgMSkgPDwgMHgxOCk7CisJCQl0ZW1wID0gKHRlbXAgJiAweGZkZmZmZmZmKSB8ICgoZiAmIDEpIDw8IDB4MTkpOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQlpZiAodGVtcCAmIEZJRk9fVkFMSUQpIHsKKyNpZmRlZiBDSElQX0FVODgyMAorCQkJdGVtcCA9ICgoZiAmIDEpIDw8IDB4MTIpIHwgKHRlbXAgJiAweGZmZmJmZmVmKTsKKyNlbmRpZgorI2lmZGVmIENISVBfQVU4ODMwCisJCQl0ZW1wID0KKwkJCSAgICAoKGYgJiAxKSA8PCAweDFiKSB8ICh0ZW1wICYgMHhlN2ZmZmZlZikgfCBGSUZPX0JJVFM7CisjZW5kaWYKKyNpZmRlZiBDSElQX0FVODgxMAorCQkJdGVtcCA9CisJCQkgICAgKChmICYgMSkgPDwgMHgxOCkgfCAodGVtcCAmIDB4ZmNmZmZmZWYpIHwgRklGT19CSVRTOworI2VuZGlmCisJCX0gZWxzZQorCQkJLyppZiAodGhpc184W2ZpZm9dKSAqLworCQkJdm9ydGV4X2ZpZm9fY2xlYXJ3dGRhdGEodm9ydGV4LCBmaWZvLCBGSUZPX1NJWkUpOworCX0KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMiksIHRlbXApOworCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX1dUQ1RSTCArIChmaWZvIDw8IDIpKTsKKworLyoJCisgICAgZG8geworCQl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMikpOworCQlpZiAobGlmZWJvYXQrKyA+IDB4YmI4KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZvcnRleDogdm9ydGV4X2ZpZm9fc2V0d3RjdHJsIGZhaWwgKGhhbmdpbmcpXG4iKTsKKwkJCWJyZWFrOworCQl9CisgICAgfSB3aGlsZSAoKHRlbXAgJiBGSUZPX1JET05MWSkmJih0ZW1wICYgRklGT19WQUxJRCkmJih0ZW1wICE9IDB4RkZGRkZGRkYpKTsKKwkKKwkKKwlpZiAodmFsaWQpIHsKKwkJaWYgKHRlbXAgJiBGSUZPX1ZBTElEKSB7CisJCQl0ZW1wID0gMHg0MDAwMDsKKwkJCS8vdGVtcCB8PSAweDA4MDAwMDAwOworCQkJLy90ZW1wIHw9IDB4MTAwMDAwMDA7CisJCQkvL3RlbXAgfD0gMHgwNDAwMDAwMDsKKwkJCS8vdGVtcCB8PSAweDAwNDAwMDAwOworCQkJdGVtcCB8PSAweDFjNDAwMDAwOworCQkJdGVtcCAmPSAweEZGRkZGRkYzOworCQkJdGVtcCAmPSAweEZGRkZGRkVGOworCQkJdGVtcCB8PSAodmFsaWQgJiAxKSA8PCA0OworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX1dUQ1RSTCArIChmaWZvIDw8IDIpLCB0ZW1wKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXZvcnRleF9maWZvX2NsZWFyd3RkYXRhKHZvcnRleCwgZmlmbywgRklGT19TSVpFKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXRlbXAgJj0gMHhmZmZmZmZlZjsKKwkJdGVtcCB8PSAweDA4MDAwMDAwOworCQl0ZW1wIHw9IDB4MTAwMDAwMDA7CisJCXRlbXAgfD0gMHgwNDAwMDAwMDsKKwkJdGVtcCB8PSAweDAwNDAwMDAwOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMiksIHRlbXApOworCQl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0ZJRk9fV1RDVFJMICsgKGZpZm8gPDwgMikpOworCQkvLygodGVtcCA+PiA2KSAmIDB4M2YpIAorCQkKKwkJcHJpb3JpdHkgPSAwOworCQlpZiAoKCh0ZW1wICYgMHgwZmMwKSBeICgodGVtcCA+PiA2KSAmIDB4MGZjMCkpICYgMEZGRkZGRkMwKQorCQkJdm9ydGV4X2ZpZm9fY2xlYXJ3dGRhdGEodm9ydGV4LCBmaWZvLCBGSUZPX1NJWkUpOworCQl2YWxpZCA9IDB4ZmI7CisJCXRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmZmQpIHwgKChjdHJsICYgMSkgPDwgMSk7CisJCXRlbXAgPSAodGVtcCAmIDB4ZmZmZGZmZmYpIHwgKChmICYgMSkgPDwgMHgxMSk7CisJCXRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmZjMpIHwgKChwcmlvcml0eSAmIDMpIDw8IDIpOworCQl0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmVmKSB8ICgodmFsaWQgJiAxKSA8PCA0KTsKKwkJdGVtcCA9ICh0ZW1wICYgMHhmZmZmZmZkZikgfCAoKGVtcHR5ICYgMSkgPDwgNSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfRklGT19XVENUUkwgKyAoZmlmbyA8PCAyKSwgdGVtcCk7CisJfQorCQorCSovCisKKwkvKgorCSAgIHRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmZmQpIHwgKChjdHJsICYgMSkgPDwgMSk7CisJICAgdGVtcCA9ICh0ZW1wICYgMHhmZmZkZmZmZikgfCAoKGYgJiAxKSA8PCAweDExKTsKKwkgICB0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmYzKSB8ICgocHJpb3JpdHkgJiAzKSA8PCAyKTsKKwkgICB0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmVmKSB8ICgodmFsaWQgJiAxKSA8PCA0KTsKKwkgICB0ZW1wID0gKHRlbXAgJiAweGZmZmZmZmRmKSB8ICgoZW1wdHkgJiAxKSA8PCA1KTsKKwkgICAjaWZkZWYgRklGT19CSVRTCisJICAgdGVtcCA9IHRlbXAgfCBGSUZPX0JJVFMgfCA0MDAwMDsKKwkgICAjZW5kaWYKKwkgICAvLyAweDFjNDQwMDEwLCAweDFjNDAwMDAwCisJICAgaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9GSUZPX1dUQ1RSTCArIChmaWZvIDw8IDIpLCB0ZW1wKTsKKwkgKi8KK30KKworI2VuZGlmCitzdGF0aWMgdm9pZCB2b3J0ZXhfZmlmb19pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworCWludCB4OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCS8qIEFEQiBETUEgY2hhbm5lbHMgZmlmb3MuICovCisJYWRkciA9IFZPUlRFWF9GSUZPX0FEQkNUUkwgKyAoKE5SX0FEQiAtIDEpICogNCk7CisJZm9yICh4ID0gTlJfQURCIC0gMTsgeCA+PSAwOyB4LS0pIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIChGSUZPX1UwIHwgRklGT19VMSkpOworCQlpZiAoaHdyZWFkKHZvcnRleC0+bW1pbywgYWRkcikgIT0gKEZJRk9fVTAgfCBGSUZPX1UxKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiYmFkIGFkYiBmaWZvIHJlc2V0ISIpOworCQl2b3J0ZXhfZmlmb19jbGVhcmFkYmRhdGEodm9ydGV4LCB4LCBGSUZPX1NJWkUpOworCQlhZGRyIC09IDQ7CisJfQorCisjaWZuZGVmIENISVBfQVU4ODEwCisJLyogV1QgRE1BIGNoYW5uZWxzIGZpZm9zLiAqLworCWFkZHIgPSBWT1JURVhfRklGT19XVENUUkwgKyAoKE5SX1dUIC0gMSkgKiA0KTsKKwlmb3IgKHggPSBOUl9XVCAtIDE7IHggPj0gMDsgeC0tKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCBGSUZPX1UwKTsKKwkJaWYgKGh3cmVhZCh2b3J0ZXgtPm1taW8sIGFkZHIpICE9IEZJRk9fVTApCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiYmFkIHd0IGZpZm8gcmVzZXQgKDB4JTA4bHgsIDB4JTA4eCkhXG4iLAorCQkJICAgICAgIGFkZHIsIGh3cmVhZCh2b3J0ZXgtPm1taW8sIGFkZHIpKTsKKwkJdm9ydGV4X2ZpZm9fY2xlYXJ3dGRhdGEodm9ydGV4LCB4LCBGSUZPX1NJWkUpOworCQlhZGRyIC09IDQ7CisJfQorI2VuZGlmCisJLyogdHJpZ2dlci4uLiAqLworI2lmZGVmIENISVBfQVU4ODIwCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4ZjhjMCwgMHhkMDMpOwkvLzB4MDg0MyAweGQ2YgorI2Vsc2UKKyNpZmRlZiBDSElQX0FVODgzMAorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDE3MDAwLCAweDYxKTsJLyogd3QgYSAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDE3MDA0LCAweDYxKTsJLyogd3QgYiAqLworI2VuZGlmCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MTcwMDgsIDB4NjEpOwkvKiBhZGIgKi8KKyNlbmRpZgorfQorCisvKiBBREJETUEgKi8KKworc3RhdGljIHZvaWQgdm9ydGV4X2FkYmRtYV9pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiZG1hX3NldGZpcnN0YnVmZmVyKHZvcnRleF90ICogdm9ydGV4LCBpbnQgYWRiZG1hKQoreworCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfYWRiW2FkYmRtYV07CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9DVFJMICsgKGFkYmRtYSA8PCAyKSwKKwkJZG1hLT5kbWFfY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc2V0c3RhcnRidWZmZXIodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsIGludCBzYikKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX2FkYlthZGJkbWFdOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfU1RBUlQgKyAoYWRiZG1hIDw8IDIpLCBzYiA8PCAoKChOUl9BREItMSktKChhZGJkbWEmMHhmKSoyKSkpKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9TVEFSVCArIChhZGJkbWEgPDwgMiksCisJCXNiIDw8ICgoMHhmIC0gKGFkYmRtYSAmIDB4ZikpICogMikpOworCWRtYS0+cGVyaW9kX3JlYWwgPSBkbWEtPnBlcmlvZF92aXJ0ID0gc2I7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfYWRiZG1hX3NldGJ1ZmZlcnModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsCisJCQkgc25kX3BjbV9zZ2J1Zl90ICogc2didWYsIGludCBwc2l6ZSwgaW50IGNvdW50KQoreworCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfYWRiW2FkYmRtYV07CisKKwlpZiAoc2didWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJ2b3J0ZXg6IEZBVEFMOiBzZ2J1ZiBpcyBOVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisJLy9wcmludGsoS0VSTl9JTkZPICJ2b3J0ZXg6IHBhZ2UgY291bnQgPSAlZCwgdGJsY291bnQgPSAlZFxuIiwgY291bnQsIHNnYnVmLT50YmxzaXplKTsKKworCWRtYS0+cGVyaW9kX2J5dGVzID0gcHNpemU7CisJZG1hLT5ucl9wZXJpb2RzID0gY291bnQ7CisJZG1hLT5zZ2J1ZiA9IHNnYnVmOworCisJZG1hLT5jZmcwID0gMDsKKwlkbWEtPmNmZzEgPSAwOworCXN3aXRjaCAoY291bnQpIHsKKwkJLyogRm91ciBvciBtb3JlIHBhZ2VzICovCisJZGVmYXVsdDoKKwljYXNlIDQ6CisJCWRtYS0+Y2ZnMSB8PSAweDg4MDAwMDAwIHwgMHg0NDAwMDAwMCB8IDB4MzAwMDAwMDAgfCAocHNpemUgLSAxKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQlWT1JURVhfQURCRE1BX0JVRkJBU0UgKyAoYWRiZG1hIDw8IDQpICsgMHhjLAorCQkJc25kX3NnYnVmX2dldF9hZGRyKHNnYnVmLCBwc2l6ZSAqIDMpKTsKKwkJLyogMyBwYWdlcyAqLworCWNhc2UgMzoKKwkJZG1hLT5jZmcwIHw9IDB4MTIwMDAwMDA7CisJCWRtYS0+Y2ZnMSB8PSAweDgwMDAwMDAwIHwgMHg0MDAwMDAwMCB8ICgocHNpemUgLSAxKSA8PCAweGMpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCVZPUlRFWF9BREJETUFfQlVGQkFTRSArIChhZGJkbWEgPDwgNCkgKyAweDgsCisJCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplICogMikpOworCQkvKiAyIHBhZ2VzICovCisJY2FzZSAyOgorCQlkbWEtPmNmZzAgfD0gMHg4ODAwMDAwMCB8IDB4NDQwMDAwMDAgfCAweDEwMDAwMDAwIHwgKHBzaXplIC0gMSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQkJVk9SVEVYX0FEQkRNQV9CVUZCQVNFICsgKGFkYmRtYSA8PCA0KSArIDB4NCwKKwkJCXNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1ZiwgcHNpemUpKTsKKwkJLyogMSBwYWdlICovCisJY2FzZSAxOgorCQlkbWEtPmNmZzAgfD0gMHg4MDAwMDAwMCB8IDB4NDAwMDAwMDAgfCAoKHBzaXplIC0gMSkgPDwgMHhjKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQlWT1JURVhfQURCRE1BX0JVRkJBU0UgKyAoYWRiZG1hIDw8IDQpLAorCQkJc25kX3NnYnVmX2dldF9hZGRyKHNnYnVmLCAwKSk7CisJCWJyZWFrOworCX0KKwkvL3ByaW50aygidm9ydGV4OiBjZmcwID0gMHgleFxudm9ydGV4OiBjZmcxPTB4JXhcbiIsIGRtYS0+Y2ZnMCwgZG1hLT5jZmcxKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZDRkcwICsgKGFkYmRtYSA8PCAzKSwgZG1hLT5jZmcwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZDRkcxICsgKGFkYmRtYSA8PCAzKSwgZG1hLT5jZmcxKTsKKworCXZvcnRleF9hZGJkbWFfc2V0Zmlyc3RidWZmZXIodm9ydGV4LCBhZGJkbWEpOworCXZvcnRleF9hZGJkbWFfc2V0c3RhcnRidWZmZXIodm9ydGV4LCBhZGJkbWEsIDApOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2FkYmRtYV9zZXRtb2RlKHZvcnRleF90ICogdm9ydGV4LCBpbnQgYWRiZG1hLCBpbnQgaWUsIGludCBkaXIsCisJCSAgICAgIGludCBmbXQsIGludCBkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX2FkYlthZGJkbWFdOworCisJZG1hLT5kbWFfdW5rbm93biA9IGQ7CisJZG1hLT5kbWFfY3RybCA9CisJICAgICgob2Zmc2V0ICYgT0ZGU0VUX01BU0spIHwgKGRtYS0+ZG1hX2N0cmwgJiB+T0ZGU0VUX01BU0spKTsKKwkvKiBFbmFibGUgUENNT1VUIGludGVycnVwdHMuICovCisJZG1hLT5kbWFfY3RybCA9CisJICAgIChkbWEtPmRtYV9jdHJsICYgfklFX01BU0spIHwgKChpZSA8PCBJRV9TSElGVCkgJiBJRV9NQVNLKTsKKworCWRtYS0+ZG1hX2N0cmwgPQorCSAgICAoZG1hLT5kbWFfY3RybCAmIH5ESVJfTUFTSykgfCAoKGRpciA8PCBESVJfU0hJRlQpICYgRElSX01BU0spOworCWRtYS0+ZG1hX2N0cmwgPQorCSAgICAoZG1hLT5kbWFfY3RybCAmIH5GTVRfTUFTSykgfCAoKGZtdCA8PCBGTVRfU0hJRlQpICYgRk1UX01BU0spOworCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQ1RSTCArIChhZGJkbWEgPDwgMiksCisJCWRtYS0+ZG1hX2N0cmwpOworCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQ1RSTCArIChhZGJkbWEgPDwgMikpOworfQorCitzdGF0aWMgaW50IHZvcnRleF9hZGJkbWFfYnVmc2hpZnQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKKwlpbnQgcGFnZSwgcCwgcHAsIGRlbHRhLCBpOworCisJcGFnZSA9CisJICAgIChod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCRE1BX1NUQVQgKyAoYWRiZG1hIDw8IDIpKSAmCisJICAgICBBREJfU1VCQlVGX01BU0spID4+IEFEQl9TVUJCVUZfU0hJRlQ7CisJaWYgKGRtYS0+bnJfcGVyaW9kcyA+PSA0KQorCQlkZWx0YSA9IChwYWdlIC0gZG1hLT5wZXJpb2RfcmVhbCkgJiAzOworCWVsc2UgeworCQlkZWx0YSA9IChwYWdlIC0gZG1hLT5wZXJpb2RfcmVhbCk7CisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSArPSBkbWEtPm5yX3BlcmlvZHM7CisJfQorCWlmIChkZWx0YSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHJlZnJlc2ggaHcgcGFnZSB0YWJsZSAqLworCWlmIChkbWEtPm5yX3BlcmlvZHMgPiA0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CisJCQkvKiBwOiBhdWRpbyBidWZmZXIgcGFnZSBpbmRleCAqLworCQkJcCA9IGRtYS0+cGVyaW9kX3ZpcnQgKyBpICsgNDsKKwkJCWlmIChwID49IGRtYS0+bnJfcGVyaW9kcykKKwkJCQlwIC09IGRtYS0+bnJfcGVyaW9kczsKKwkJCS8qIHBwOiBoYXJkd2FyZSBETUEgcGFnZSBpbmRleC4gKi8KKwkJCXBwID0gZG1hLT5wZXJpb2RfcmVhbCArIGk7CisJCQlpZiAocHAgPj0gNCkKKwkJCQlwcCAtPSA0OworCQkJLy9od3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZCQVNFKygoKGFkYmRtYSA8PCAyKStwcCkgPDwgMiksIGRtYS0+dGFibGVbcF0uYWRkcik7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCQlWT1JURVhfQURCRE1BX0JVRkJBU0UgKyAoKChhZGJkbWEgPDwgMikgKyBwcCkgPDwgMiksCisJCQkJc25kX3NnYnVmX2dldF9hZGRyKGRtYS0+c2didWYsCisJCQkJZG1hLT5wZXJpb2RfYnl0ZXMgKiBwKSk7CisJCQkvKiBGb3JjZSB3cml0ZSB0aHJ1IGNhY2hlLiAqLworCQkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZCQVNFICsKKwkJCSAgICAgICAoKChhZGJkbWEgPDwgMikgKyBwcCkgPDwgMikpOworCQl9CisJfQorCWRtYS0+cGVyaW9kX3ZpcnQgKz0gZGVsdGE7CisJZG1hLT5wZXJpb2RfcmVhbCA9IHBhZ2U7CisJaWYgKGRtYS0+cGVyaW9kX3ZpcnQgPj0gZG1hLT5ucl9wZXJpb2RzKQorCQlkbWEtPnBlcmlvZF92aXJ0IC09IGRtYS0+bnJfcGVyaW9kczsKKwlpZiAoZGVsdGEgIT0gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiAlZCB2aXJ0PSVkLCByZWFsPSVkLCBkZWx0YT0lZFxuIiwKKwkJICAgICAgIGFkYmRtYSwgZG1hLT5wZXJpb2RfdmlydCwgZG1hLT5wZXJpb2RfcmVhbCwgZGVsdGEpOworCisJcmV0dXJuIGRlbHRhOworfQorCisKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfcmVzZXR1cCh2b3J0ZXhfdCAqdm9ydGV4LCBpbnQgYWRiZG1hKSB7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKKwlpbnQgcCwgcHAsIGk7CisKKwkvKiByZWZyZXNoIGh3IHBhZ2UgdGFibGUgKi8KKwlmb3IgKGk9MCA7IGkgPCA0ICYmIGkgPCBkbWEtPm5yX3BlcmlvZHM7IGkrKykgeworCQkvKiBwOiBhdWRpbyBidWZmZXIgcGFnZSBpbmRleCAqLworCQlwID0gZG1hLT5wZXJpb2RfdmlydCArIGk7CisJCWlmIChwID49IGRtYS0+bnJfcGVyaW9kcykKKwkJCXAgLT0gZG1hLT5ucl9wZXJpb2RzOworCQkvKiBwcDogaGFyZHdhcmUgRE1BIHBhZ2UgaW5kZXguICovCisJCXBwID0gZG1hLT5wZXJpb2RfcmVhbCArIGk7CisJCWlmIChkbWEtPm5yX3BlcmlvZHMgPCA0KSB7CisJCQlpZiAocHAgPj0gZG1hLT5ucl9wZXJpb2RzKQorCQkJCXBwIC09IGRtYS0+bnJfcGVyaW9kczsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChwcCA+PSA0KQorCQkJCXBwIC09IDQ7CisJCX0KKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQlVGQkFTRSsoKChhZGJkbWEgPDwgMikrcHApIDw8IDIpLCBzbmRfc2didWZfZ2V0X2FkZHIoZG1hLT5zZ2J1ZiwgZG1hLT5wZXJpb2RfYnl0ZXMgKiBwKSk7CisJCS8qIEZvcmNlIHdyaXRlIHRocnUgY2FjaGUuICovCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQlVGQkFTRSArICgoKGFkYmRtYSA8PCAyKStwcCkgPDwgMikpOworCX0KK30KKworc3RhdGljIGludCBpbmxpbmUgdm9ydGV4X2FkYmRtYV9nZXRsaW5lYXJwb3Modm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKKwlpbnQgdGVtcDsKKworCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCRE1BX1NUQVQgKyAoYWRiZG1hIDw8IDIpKTsKKwl0ZW1wID0gKGRtYS0+cGVyaW9kX3ZpcnQgKiBkbWEtPnBlcmlvZF9ieXRlcykgKyAodGVtcCAmIFBPU19NQVNLKTsKKwlyZXR1cm4gKHRlbXApOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiZG1hX3N0YXJ0Zmlmbyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSkKK3sKKwlpbnQgdGhpc184ID0gMCAvKmVtcHR5ICovICwgdGhpc180ID0gMCAvKnByaW9yaXR5ICovIDsKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX2FkYlthZGJkbWFdOworCisJc3dpdGNoIChkbWEtPmZpZm9fc3RhdHVzKSB7CisJY2FzZSBGSUZPX1NUQVJUOgorCQl2b3J0ZXhfZmlmb19zZXRhZGJ2YWxpZCh2b3J0ZXgsIGFkYmRtYSwKKwkJCQkJZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19TVE9QOgorCQl0aGlzXzggPSAxOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9DVFJMICsgKGFkYmRtYSA8PCAyKSwKKwkJCWRtYS0+ZG1hX2N0cmwpOworCQl2b3J0ZXhfZmlmb19zZXRhZGJjdHJsKHZvcnRleCwgYWRiZG1hLCBkbWEtPmRtYV91bmtub3duLAorCQkJCSAgICAgICB0aGlzXzQsIHRoaXNfOCwKKwkJCQkgICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19QQVVTRToKKwkJdm9ydGV4X2ZpZm9fc2V0YWRiY3RybCh2b3J0ZXgsIGFkYmRtYSwgZG1hLT5kbWFfdW5rbm93biwKKwkJCQkgICAgICAgdGhpc180LCB0aGlzXzgsCisJCQkJICAgICAgIGRtYS0+Zmlmb19lbmFibGVkID8gMSA6IDAsIDApOworCQlicmVhazsKKwl9CisJZG1hLT5maWZvX3N0YXR1cyA9IEZJRk9fU1RBUlQ7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfcmVzdW1lZmlmbyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX2FkYlthZGJkbWFdOworCisJaW50IHRoaXNfOCA9IDEsIHRoaXNfNCA9IDA7CisJc3dpdGNoIChkbWEtPmZpZm9fc3RhdHVzKSB7CisJY2FzZSBGSUZPX1NUT1A6CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCRE1BX0NUUkwgKyAoYWRiZG1hIDw8IDIpLAorCQkJZG1hLT5kbWFfY3RybCk7CisJCXZvcnRleF9maWZvX3NldGFkYmN0cmwodm9ydGV4LCBhZGJkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgIHRoaXNfNCwgdGhpc184LAorCQkJCSAgICAgICBkbWEtPmZpZm9fZW5hYmxlZCA/IDEgOiAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBGSUZPX1BBVVNFOgorCQl2b3J0ZXhfZmlmb19zZXRhZGJjdHJsKHZvcnRleCwgYWRiZG1hLCBkbWEtPmRtYV91bmtub3duLAorCQkJCSAgICAgICB0aGlzXzQsIHRoaXNfOCwKKwkJCQkgICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCX0KKwlkbWEtPmZpZm9fc3RhdHVzID0gRklGT19TVEFSVDsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2FkYmRtYV9wYXVzZWZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKKworCWludCB0aGlzXzggPSAwLCB0aGlzXzQgPSAwOworCXN3aXRjaCAoZG1hLT5maWZvX3N0YXR1cykgeworCWNhc2UgRklGT19TVEFSVDoKKwkJdm9ydGV4X2ZpZm9fc2V0YWRiY3RybCh2b3J0ZXgsIGFkYmRtYSwgZG1hLT5kbWFfdW5rbm93biwKKwkJCQkgICAgICAgdGhpc180LCB0aGlzXzgsIDAsIDApOworCQlicmVhazsKKwljYXNlIEZJRk9fU1RPUDoKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQ1RSTCArIChhZGJkbWEgPDwgMiksCisJCQlkbWEtPmRtYV9jdHJsKTsKKwkJdm9ydGV4X2ZpZm9fc2V0YWRiY3RybCh2b3J0ZXgsIGFkYmRtYSwgZG1hLT5kbWFfdW5rbm93biwKKwkJCQkgICAgICAgdGhpc180LCB0aGlzXzgsIDAsIDApOworCQlicmVhazsKKwl9CisJZG1hLT5maWZvX3N0YXR1cyA9IEZJRk9fUEFVU0U7Cit9CisKKyNpZiAwCQkJCS8vIFVzaW5nIHBhdXNlIGluc3RlYWQKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc3RvcGZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKKworCWludCB0aGlzXzQgPSAwLCB0aGlzXzggPSAwOworCWlmIChkbWEtPmZpZm9fc3RhdHVzID09IEZJRk9fU1RBUlQpCisJCXZvcnRleF9maWZvX3NldGFkYmN0cmwodm9ydGV4LCBhZGJkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgIHRoaXNfNCwgdGhpc184LCAwLCAwKTsKKwllbHNlIGlmIChkbWEtPmZpZm9fc3RhdHVzID09IEZJRk9fU1RPUCkKKwkJcmV0dXJuOworCWRtYS0+Zmlmb19zdGF0dXMgPSBGSUZPX1NUT1A7CisJZG1hLT5maWZvX2VuYWJsZWQgPSAwOworfQorCisjZW5kaWYKKy8qIFdURE1BICovCisKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zZXRmaXJzdGJ1ZmZlcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hKQoreworCS8vaW50IHRoaXNfN2M9ZG1hX2N0cmw7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV93dFt3dGRtYV07CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0NUUkwgKyAod3RkbWEgPDwgMiksIGRtYS0+ZG1hX2N0cmwpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfc2V0c3RhcnRidWZmZXIodm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSwgaW50IHNiKQoreworCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfd3Rbd3RkbWFdOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9XVERNQV9TVEFSVCArICh3dGRtYSA8PCAyKSwgc2IgPDwgKCgweDFmLSh3dGRtYSYweGYpKjIpKSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9XVERNQV9TVEFSVCArICh3dGRtYSA8PCAyKSwKKwkJc2IgPDwgKCgweGYgLSAod3RkbWEgJiAweGYpKSAqIDIpKTsKKwlkbWEtPnBlcmlvZF9yZWFsID0gZG1hLT5wZXJpb2RfdmlydCA9IHNiOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X3d0ZG1hX3NldGJ1ZmZlcnModm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSwKKwkJCXNuZF9wY21fc2didWZfdCAqIHNnYnVmLCBpbnQgcHNpemUsIGludCBjb3VudCkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX3d0W3d0ZG1hXTsKKworCWRtYS0+cGVyaW9kX2J5dGVzID0gcHNpemU7CisJZG1hLT5ucl9wZXJpb2RzID0gY291bnQ7CisJZG1hLT5zZ2J1ZiA9IHNnYnVmOworCisJZG1hLT5jZmcwID0gMDsKKwlkbWEtPmNmZzEgPSAwOworCXN3aXRjaCAoY291bnQpIHsKKwkJLyogRm91ciBvciBtb3JlIHBhZ2VzICovCisJZGVmYXVsdDoKKwljYXNlIDQ6CisJCWRtYS0+Y2ZnMSB8PSAweDg4MDAwMDAwIHwgMHg0NDAwMDAwMCB8IDB4MzAwMDAwMDAgfCAocHNpemUtMSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQkFTRSArICh3dGRtYSA8PCA0KSArIDB4YywKKwkJCXNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1ZiwgcHNpemUgKiAzKSk7CisJCS8qIDMgcGFnZXMgKi8KKwljYXNlIDM6CisJCWRtYS0+Y2ZnMCB8PSAweDEyMDAwMDAwOworCQlkbWEtPmNmZzEgfD0gMHg4MDAwMDAwMCB8IDB4NDAwMDAwMDAgfCAoKHBzaXplLTEpIDw8IDB4Yyk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQkFTRSArICh3dGRtYSA8PCA0KSAgKyAweDgsCisJCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplICogMikpOworCQkvKiAyIHBhZ2VzICovCisJY2FzZSAyOgorCQlkbWEtPmNmZzAgfD0gMHg4ODAwMDAwMCB8IDB4NDQwMDAwMDAgfCAweDEwMDAwMDAwIHwgKHBzaXplLTEpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkJBU0UgKyAod3RkbWEgPDwgNCkgKyAweDQsCisJCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplKSk7CisJCS8qIDEgcGFnZSAqLworCWNhc2UgMToKKwkJZG1hLT5jZmcwIHw9IDB4ODAwMDAwMDAgfCAweDQwMDAwMDAwIHwgKChwc2l6ZS0xKSA8PCAweGMpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkJBU0UgKyAod3RkbWEgPDwgNCksCisJCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkJYnJlYWs7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQ0ZHMCArICh3dGRtYSA8PCAzKSwgZG1hLT5jZmcwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkNGRzEgKyAod3RkbWEgPDwgMyksIGRtYS0+Y2ZnMSk7CisKKwl2b3J0ZXhfd3RkbWFfc2V0Zmlyc3RidWZmZXIodm9ydGV4LCB3dGRtYSk7CisJdm9ydGV4X3d0ZG1hX3NldHN0YXJ0YnVmZmVyKHZvcnRleCwgd3RkbWEsIDApOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X3d0ZG1hX3NldG1vZGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSwgaW50IGllLCBpbnQgZm10LCBpbnQgZCwKKwkJICAgICAvKmludCBlLCAqLyB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX3d0W3d0ZG1hXTsKKworCS8vZG1hLT50aGlzXzA4ID0gZTsKKwlkbWEtPmRtYV91bmtub3duID0gZDsKKwlkbWEtPmRtYV9jdHJsID0gMDsKKwlkbWEtPmRtYV9jdHJsID0KKwkgICAgKChvZmZzZXQgJiBPRkZTRVRfTUFTSykgfCAoZG1hLT5kbWFfY3RybCAmIH5PRkZTRVRfTUFTSykpOworCS8qIFBDTU9VVCBpbnRlcnJ1cHQgKi8KKwlkbWEtPmRtYV9jdHJsID0KKwkgICAgKGRtYS0+ZG1hX2N0cmwgJiB+SUVfTUFTSykgfCAoKGllIDw8IElFX1NISUZUKSAmIElFX01BU0spOworCS8qIEFsd2F5cyBwbGF5YmFjay4gKi8KKwlkbWEtPmRtYV9jdHJsIHw9ICgxIDw8IERJUl9TSElGVCk7CisJLyogQXVkaW8gRm9ybWF0ICovCisJZG1hLT5kbWFfY3RybCA9CisJICAgIChkbWEtPmRtYV9jdHJsICYgRk1UX01BU0spIHwgKChmbXQgPDwgRk1UX1NISUZUKSAmIEZNVF9NQVNLKTsKKwkvKiBXcml0ZSBpbnRvIGhhcmR3YXJlICovCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9XVERNQV9DVFJMICsgKHd0ZG1hIDw8IDIpLCBkbWEtPmRtYV9jdHJsKTsKK30KKworc3RhdGljIGludCB2b3J0ZXhfd3RkbWFfYnVmc2hpZnQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX3d0W3d0ZG1hXTsKKwlpbnQgcGFnZSwgcCwgcHAsIGRlbHRhLCBpOworCisJcGFnZSA9CisJICAgIChod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfU1RBVCArICh3dGRtYSA8PCAyKSkgJgorCSAgICAgV1RfU1VCQlVGX01BU0spCisJICAgID4+IFdUX1NVQkJVRl9TSElGVDsKKwlpZiAoZG1hLT5ucl9wZXJpb2RzID49IDQpCisJCWRlbHRhID0gKHBhZ2UgLSBkbWEtPnBlcmlvZF9yZWFsKSAmIDM7CisJZWxzZSB7CisJCWRlbHRhID0gKHBhZ2UgLSBkbWEtPnBlcmlvZF9yZWFsKTsKKwkJaWYgKGRlbHRhIDwgMCkKKwkJCWRlbHRhICs9IGRtYS0+bnJfcGVyaW9kczsKKwl9CisJaWYgKGRlbHRhID09IDApCisJCXJldHVybiAwOworCisJLyogcmVmcmVzaCBodyBwYWdlIHRhYmxlICovCisJaWYgKGRtYS0+bnJfcGVyaW9kcyA+IDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKKwkJCS8qIHA6IGF1ZGlvIGJ1ZmZlciBwYWdlIGluZGV4ICovCisJCQlwID0gZG1hLT5wZXJpb2RfdmlydCArIGkgKyA0OworCQkJaWYgKHAgPj0gZG1hLT5ucl9wZXJpb2RzKQorCQkJCXAgLT0gZG1hLT5ucl9wZXJpb2RzOworCQkJLyogcHA6IGhhcmR3YXJlIERNQSBwYWdlIGluZGV4LiAqLworCQkJcHAgPSBkbWEtPnBlcmlvZF9yZWFsICsgaTsKKwkJCWlmIChwcCA+PSA0KQorCQkJCXBwIC09IDQ7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCQlWT1JURVhfV1RETUFfQlVGQkFTRSArCisJCQkJKCgod3RkbWEgPDwgMikgKyBwcCkgPDwgMiksCisJCQkJc25kX3NnYnVmX2dldF9hZGRyKGRtYS0+c2didWYsIGRtYS0+cGVyaW9kX2J5dGVzICogcCkpOworCQkJLyogRm9yY2Ugd3JpdGUgdGhydSBjYWNoZS4gKi8KKwkJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9XVERNQV9CVUZCQVNFICsKKwkJCSAgICAgICAoKCh3dGRtYSA8PCAyKSArIHBwKSA8PCAyKSk7CisJCX0KKwl9CisJZG1hLT5wZXJpb2RfdmlydCArPSBkZWx0YTsKKwlpZiAoZG1hLT5wZXJpb2RfdmlydCA+PSBkbWEtPm5yX3BlcmlvZHMpCisJCWRtYS0+cGVyaW9kX3ZpcnQgLT0gZG1hLT5ucl9wZXJpb2RzOworCWRtYS0+cGVyaW9kX3JlYWwgPSBwYWdlOworCisJaWYgKGRlbHRhICE9IDEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZvcnRleDogd3QgdmlydCA9ICVkLCBkZWx0YSA9ICVkXG4iLAorCQkgICAgICAgZG1hLT5wZXJpb2RfdmlydCwgZGVsdGEpOworCisJcmV0dXJuIGRlbHRhOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3ZvcnRleF93dGRtYV9nZXRwb3NpdGlvbih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hLCBpbnQgKnN1YmJ1ZiwgaW50ICpwb3MpCit7CisJaW50IHRlbXA7CisJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9XVERNQV9TVEFUICsgKHd0ZG1hIDw8IDIpKTsKKwkqc3ViYnVmID0gKHRlbXAgPj4gV1RfU1VCQlVGX1NISUZUKSAmIFdUX1NVQkJVRl9NQVNLOworCSpwb3MgPSB0ZW1wICYgUE9TX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X3d0ZG1hX2dldGN1cnN1YnVmZmVyKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEpCit7CisJcmV0dXJuICgoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX1NUQVQgKyAod3RkbWEgPDwgMikpID4+CisJCSBQT1NfU0hJRlQpICYgUE9TX01BU0spOworfQorI2VuZGlmCitzdGF0aWMgaW50IGlubGluZSB2b3J0ZXhfd3RkbWFfZ2V0bGluZWFycG9zKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV93dFt3dGRtYV07CisJaW50IHRlbXA7CisKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX1NUQVQgKyAod3RkbWEgPDwgMikpOworCS8vdGVtcCA9ICh0ZW1wICYgUE9TX01BU0spICsgKCgodGVtcD4+V1RfU1VCQlVGX1NISUZUKSAmIFdUX1NVQkJVRl9NQVNLKSooZG1hLT5jZmcwJlBPU19NQVNLKSk7CisJdGVtcCA9ICh0ZW1wICYgUE9TX01BU0spICsgKChkbWEtPnBlcmlvZF92aXJ0KSAqIChkbWEtPnBlcmlvZF9ieXRlcykpOworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfc3RhcnRmaWZvKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEpCit7CisJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV93dFt3dGRtYV07CisJaW50IHRoaXNfOCA9IDAsIHRoaXNfNCA9IDA7CisKKwlzd2l0Y2ggKGRtYS0+Zmlmb19zdGF0dXMpIHsKKwljYXNlIEZJRk9fU1RBUlQ6CisJCXZvcnRleF9maWZvX3NldHd0dmFsaWQodm9ydGV4LCB3dGRtYSwKKwkJCQkgICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19TVE9QOgorCQl0aGlzXzggPSAxOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0NUUkwgKyAod3RkbWEgPDwgMiksCisJCQlkbWEtPmRtYV9jdHJsKTsKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsCisJCQkJICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19QQVVTRToKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsCisJCQkJICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCX0KKwlkbWEtPmZpZm9fc3RhdHVzID0gRklGT19TVEFSVDsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X3d0ZG1hX3Jlc3VtZWZpZm8odm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dGRtYSkKK3sKKwlzdHJlYW1fdCAqZG1hID0gJnZvcnRleC0+ZG1hX3d0W3d0ZG1hXTsKKworCWludCB0aGlzXzggPSAwLCB0aGlzXzQgPSAwOworCXN3aXRjaCAoZG1hLT5maWZvX3N0YXR1cykgeworCWNhc2UgRklGT19TVE9QOgorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0NUUkwgKyAod3RkbWEgPDwgMiksCisJCQlkbWEtPmRtYV9jdHJsKTsKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsCisJCQkJICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19QQVVTRToKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsCisJCQkJICAgICAgZG1hLT5maWZvX2VuYWJsZWQgPyAxIDogMCwgMCk7CisJCWJyZWFrOworCX0KKwlkbWEtPmZpZm9fc3RhdHVzID0gRklGT19TVEFSVDsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X3d0ZG1hX3BhdXNlZmlmbyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hKQoreworCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfd3Rbd3RkbWFdOworCisJaW50IHRoaXNfOCA9IDAsIHRoaXNfNCA9IDA7CisJc3dpdGNoIChkbWEtPmZpZm9fc3RhdHVzKSB7CisJY2FzZSBGSUZPX1NUQVJUOgorCQl2b3J0ZXhfZmlmb19zZXR3dGN0cmwodm9ydGV4LCB3dGRtYSwgZG1hLT5kbWFfdW5rbm93biwKKwkJCQkgICAgICB0aGlzXzQsIHRoaXNfOCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRklGT19TVE9QOgorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0NUUkwgKyAod3RkbWEgPDwgMiksCisJCQlkbWEtPmRtYV9jdHJsKTsKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsIDAsIDApOworCQlicmVhazsKKwl9CisJZG1hLT5maWZvX3N0YXR1cyA9IEZJRk9fUEFVU0U7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zdG9wZmlmbyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hKQoreworCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfd3Rbd3RkbWFdOworCisJaW50IHRoaXNfNCA9IDAsIHRoaXNfOCA9IDA7CisJaWYgKGRtYS0+Zmlmb19zdGF0dXMgPT0gRklGT19TVEFSVCkKKwkJdm9ydGV4X2ZpZm9fc2V0d3RjdHJsKHZvcnRleCwgd3RkbWEsIGRtYS0+ZG1hX3Vua25vd24sCisJCQkJICAgICAgdGhpc180LCB0aGlzXzgsIDAsIDApOworCWVsc2UgaWYgKGRtYS0+Zmlmb19zdGF0dXMgPT0gRklGT19TVE9QKQorCQlyZXR1cm47CisJZG1hLT5maWZvX3N0YXR1cyA9IEZJRk9fU1RPUDsKKwlkbWEtPmZpZm9fZW5hYmxlZCA9IDA7Cit9CisKKyNlbmRpZgorLyogQURCIFJvdXRlcyAqLworCit0eXBlZGVmIGludCBBREJSYW1MaW5rOworc3RhdGljIHZvaWQgdm9ydGV4X2FkYl9pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworCWludCBpOworCS8qIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIHdyaXRpbmcgbW9yZSB0aGFuIHdlIG5lZWQgdG8uLi4KKwkgKiBpZiB3ZSB3cml0ZSB3aGF0IHdlIGFyZSBzdXBwb3NlZCB0byBpdCBicmVha3MgdGhpbmdzLi4uICovCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfU1IsIDApOworCWZvciAoaSA9IDA7IGkgPCBWT1JURVhfQURCX1JUQkFTRV9DT1VOVDsgaSsrKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQl9SVEJBU0UgKyAoaSA8PCAyKSwKKwkJCWh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICAgICAgVk9SVEVYX0FEQl9SVEJBU0UgKyAoaSA8PCAyKSkgfCBST1VURV9NQVNLKTsKKwlmb3IgKGkgPSAwOyBpIDwgVk9SVEVYX0FEQl9DSE5CQVNFX0NPVU5UOyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfQ0hOQkFTRSArIChpIDw8IDIpLAorCQkJaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgICAgICBWT1JURVhfQURCX0NITkJBU0UgKyAoaSA8PCAyKSkgfCBST1VURV9NQVNLKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9hZGJfZW5fc3Iodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBjaGFubmVsKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCX1NSLAorCQlod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCX1NSKSB8ICgweDEgPDwgY2hhbm5lbCkpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiX2Rpc19zcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGNoYW5uZWwpCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfU1IsCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfU1IpICYgfigweDEgPDwgY2hhbm5lbCkpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2FkYl9hZGRyb3V0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKKwkJICAgICBBREJSYW1MaW5rICogcm91dGUsIGludCBybnVtKQoreworCWludCB0ZW1wLCBwcmV2LCBsaWZlYm9hdCA9IDA7CisKKwlpZiAoKHJudW0gPD0gMCkgfHwgKHJvdXRlID09IE5VTEwpKQorCQlyZXR1cm47CisJLyogV3JpdGUgbGFzdCByb3V0ZXMuICovCisJcm51bS0tOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLAorCQlWT1JURVhfQURCX1JUQkFTRSArICgocm91dGVbcm51bV0gJiBBREJfTUFTSykgPDwgMiksCisJCVJPVVRFX01BU0spOworCXdoaWxlIChybnVtID4gMCkgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywKKwkJCVZPUlRFWF9BREJfUlRCQVNFICsKKwkJCSgocm91dGVbcm51bSAtIDFdICYgQURCX01BU0spIDw8IDIpLCByb3V0ZVtybnVtXSk7CisJCXJudW0tLTsKKwl9CisJLyogV3JpdGUgZmlyc3Qgcm91dGUuICovCisJdGVtcCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIFZPUlRFWF9BREJfQ0hOQkFTRSArIChjaGFubmVsIDw8IDIpKSAmIEFEQl9NQVNLOworCWlmICh0ZW1wID09IEFEQl9NQVNLKSB7CisJCS8qIEZpcnN0IGVudHJ5IG9uIHRoaXMgY2hhbm5lbC4gKi8KKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfQ0hOQkFTRSArIChjaGFubmVsIDw8IDIpLAorCQkJcm91dGVbMF0pOworCQl2b3J0ZXhfYWRiX2VuX3NyKHZvcnRleCwgY2hhbm5lbCk7CisJCXJldHVybjsKKwl9CisJLyogTm90IGZpcnN0IGVudHJ5IG9uIHRoaXMgY2hhbm5lbC4gTmVlZCB0byBsaW5rLiAqLworCWRvIHsKKwkJcHJldiA9IHRlbXA7CisJCXRlbXAgPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgIFZPUlRFWF9BREJfUlRCQVNFICsgKHRlbXAgPDwgMikpICYgQURCX01BU0s7CisJCWlmICgobGlmZWJvYXQrKykgPiBBREJfTUFTSykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInZvcnRleF9hZGJfYWRkcm91dGVzOiB1bmVuZGluZyByb3V0ZSEgMHgleFxuIiwKKwkJCSAgICAgICAqcm91dGUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXdoaWxlICh0ZW1wICE9IEFEQl9NQVNLKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQl9SVEJBU0UgKyAocHJldiA8PCAyKSwgcm91dGVbMF0pOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2FkYl9kZWxyb3V0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKKwkJICAgICBBREJSYW1MaW5rIHJvdXRlMCwgQURCUmFtTGluayByb3V0ZTEpCit7CisJaW50IHRlbXAsIGxpZmVib2F0ID0gMCwgcHJldjsKKworCS8qIEZpbmQgcm91dGUuICovCisJdGVtcCA9CisJICAgIGh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCSAgIFZPUlRFWF9BREJfQ0hOQkFTRSArIChjaGFubmVsIDw8IDIpKSAmIEFEQl9NQVNLOworCWlmICh0ZW1wID09IChyb3V0ZTAgJiBBREJfTUFTSykpIHsKKwkJdGVtcCA9CisJCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLAorCQkJICAgVk9SVEVYX0FEQl9SVEJBU0UgKyAoKHJvdXRlMSAmIEFEQl9NQVNLKSA8PCAyKSk7CisJCWlmICgodGVtcCAmIEFEQl9NQVNLKSA9PSBBREJfTUFTSykKKwkJCXZvcnRleF9hZGJfZGlzX3NyKHZvcnRleCwgY2hhbm5lbCk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQURCX0NITkJBU0UgKyAoY2hhbm5lbCA8PCAyKSwKKwkJCXRlbXApOworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJcHJldiA9IHRlbXA7CisJCXRlbXAgPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywKKwkJCSAgIFZPUlRFWF9BREJfUlRCQVNFICsgKHByZXYgPDwgMikpICYgQURCX01BU0s7CisJCWlmICgoKGxpZmVib2F0KyspID4gQURCX01BU0spIHx8ICh0ZW1wID09IEFEQl9NQVNLKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInZvcnRleF9hZGJfZGVscm91dGVzOiByb3V0ZSBub3QgZm91bmQhIDB4JXhcbiIsCisJCQkgICAgICAgcm91dGUwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl3aGlsZSAodGVtcCAhPSAocm91dGUwICYgQURCX01BU0spKTsKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQl9SVEJBU0UgKyAodGVtcCA8PCAyKSk7CisJaWYgKCh0ZW1wICYgQURCX01BU0spID09IHJvdXRlMSkKKwkJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJfUlRCQVNFICsgKHRlbXAgPDwgMikpOworCS8qIE1ha2UgYnJpZGdlIG92ZXIgZGVsZXRlZCByb3V0ZS4gKi8KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQl9SVEJBU0UgKyAocHJldiA8PCAyKSwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfcm91dGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCSAgICAgdW5zaWduZWQgY2hhciBzb3VyY2UsIHVuc2lnbmVkIGNoYXIgZGVzdCkKK3sKKwlBREJSYW1MaW5rIHJvdXRlOworCisJcm91dGUgPSAoKHNvdXJjZSAmIEFEQl9NQVNLKSA8PCBBREJfU0hJRlQpIHwgKGRlc3QgJiBBREJfTUFTSyk7CisJaWYgKGVuKSB7CisJCXZvcnRleF9hZGJfYWRkcm91dGVzKHZvcnRleCwgY2hhbm5lbCwgJnJvdXRlLCAxKTsKKwkJaWYgKChzb3VyY2UgPCAoT0ZGU0VUX1NSQ09VVCArIE5SX1NSQykpCisJCSAgICAmJiAoc291cmNlID49IE9GRlNFVF9TUkNPVVQpKQorCQkJdm9ydGV4X3NyY19hZGRXVEQodm9ydGV4LCAoc291cmNlIC0gT0ZGU0VUX1NSQ09VVCksCisJCQkJCSAgY2hhbm5lbCk7CisJCWVsc2UgaWYgKChzb3VyY2UgPCAoT0ZGU0VUX01JWE9VVCArIE5SX01JWE9VVCkpCisJCQkgJiYgKHNvdXJjZSA+PSBPRkZTRVRfTUlYT1VUKSkKKwkJCXZvcnRleF9taXhlcl9hZGRXVEQodm9ydGV4LAorCQkJCQkgICAgKHNvdXJjZSAtIE9GRlNFVF9NSVhPVVQpLCBjaGFubmVsKTsKKwl9IGVsc2UgeworCQl2b3J0ZXhfYWRiX2RlbHJvdXRlcyh2b3J0ZXgsIGNoYW5uZWwsIHJvdXRlLCByb3V0ZSk7CisJCWlmICgoc291cmNlIDwgKE9GRlNFVF9TUkNPVVQgKyBOUl9TUkMpKQorCQkgICAgJiYgKHNvdXJjZSA+PSBPRkZTRVRfU1JDT1VUKSkKKwkJCXZvcnRleF9zcmNfZGVsV1REKHZvcnRleCwgKHNvdXJjZSAtIE9GRlNFVF9TUkNPVVQpLAorCQkJCQkgIGNoYW5uZWwpOworCQllbHNlIGlmICgoc291cmNlIDwgKE9GRlNFVF9NSVhPVVQgKyBOUl9NSVhPVVQpKQorCQkJICYmIChzb3VyY2UgPj0gT0ZGU0VUX01JWE9VVCkpCisJCQl2b3J0ZXhfbWl4ZXJfZGVsV1REKHZvcnRleCwKKwkJCQkJICAgIChzb3VyY2UgLSBPRkZTRVRfTUlYT1VUKSwgY2hhbm5lbCk7CisJfQorfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3ZvcnRleF9yb3V0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCSAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlLCB1bnNpZ25lZCBjaGFyIGRlc3QwLCB1bnNpZ25lZCBjaGFyIGRlc3QxKQoreworCUFEQlJhbUxpbmsgcm91dGVbMl07CisKKwlyb3V0ZVswXSA9ICgoc291cmNlICYgQURCX01BU0spIDw8IEFEQl9TSElGVCkgfCAoZGVzdDAgJiBBREJfTUFTSyk7CisJcm91dGVbMV0gPSAoKHNvdXJjZSAmIEFEQl9NQVNLKSA8PCBBREJfU0hJRlQpIHwgKGRlc3QxICYgQURCX01BU0spOworCisJaWYgKGVuKSB7CisJCXZvcnRleF9hZGJfYWRkcm91dGVzKHZvcnRleCwgY2hhbm5lbCwgcm91dGUsIDIpOworCQlpZiAoKHNvdXJjZSA8IChPRkZTRVRfU1JDT1VUICsgTlJfU1JDKSkKKwkJICAgICYmIChzb3VyY2UgPj0gKE9GRlNFVF9TUkNPVVQpKSkKKwkJCXZvcnRleF9zcmNfYWRkV1REKHZvcnRleCwgKHNvdXJjZSAtIE9GRlNFVF9TUkNPVVQpLAorCQkJCQkgIGNoYW5uZWwpOworCQllbHNlIGlmICgoc291cmNlIDwgKE9GRlNFVF9NSVhPVVQgKyBOUl9NSVhPVVQpKQorCQkJICYmIChzb3VyY2UgPj0gKE9GRlNFVF9NSVhPVVQpKSkKKwkJCXZvcnRleF9taXhlcl9hZGRXVEQodm9ydGV4LAorCQkJCQkgICAgKHNvdXJjZSAtIE9GRlNFVF9NSVhPVVQpLCBjaGFubmVsKTsKKwl9IGVsc2UgeworCQl2b3J0ZXhfYWRiX2RlbHJvdXRlcyh2b3J0ZXgsIGNoYW5uZWwsIHJvdXRlWzBdLCByb3V0ZVsxXSk7CisJCWlmICgoc291cmNlIDwgKE9GRlNFVF9TUkNPVVQgKyBOUl9TUkMpKQorCQkgICAgJiYgKHNvdXJjZSA+PSAoT0ZGU0VUX1NSQ09VVCkpKQorCQkJdm9ydGV4X3NyY19kZWxXVEQodm9ydGV4LCAoc291cmNlIC0gT0ZGU0VUX1NSQ09VVCksCisJCQkJCSAgY2hhbm5lbCk7CisJCWVsc2UgaWYgKChzb3VyY2UgPCAoT0ZGU0VUX01JWE9VVCArIE5SX01JWE9VVCkpCisJCQkgJiYgKHNvdXJjZSA+PSAoT0ZGU0VUX01JWE9VVCkpKQorCQkJdm9ydGV4X21peGVyX2RlbFdURCh2b3J0ZXgsCisJCQkJCSAgICAoc291cmNlIC0gT0ZGU0VUX01JWE9VVCksIGNoYW5uZWwpOworCX0KK30KKworI2VuZGlmCisvKiBSb3V0ZSB0d28gc291cmNlcyB0byBzYW1lIHRhcmdldC4gU291cmNlcyBtdXN0IGJlIG9mIHNhbWUgY2xhc3MgISEhICovCitzdGF0aWMgdm9pZAordm9ydGV4X3JvdXRlTFJUKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZW4sIHVuc2lnbmVkIGNoYXIgY2gsCisJCXVuc2lnbmVkIGNoYXIgc291cmNlMCwgdW5zaWduZWQgY2hhciBzb3VyY2UxLAorCQl1bnNpZ25lZCBjaGFyIGRlc3QpCit7CisJQURCUmFtTGluayByb3V0ZVsyXTsKKworCXJvdXRlWzBdID0gKChzb3VyY2UwICYgQURCX01BU0spIDw8IEFEQl9TSElGVCkgfCAoZGVzdCAmIEFEQl9NQVNLKTsKKwlyb3V0ZVsxXSA9ICgoc291cmNlMSAmIEFEQl9NQVNLKSA8PCBBREJfU0hJRlQpIHwgKGRlc3QgJiBBREJfTUFTSyk7CisKKwlpZiAoZGVzdCA8IDB4MTApCisJCXJvdXRlWzFdID0gKHJvdXRlWzFdICYgfkFEQl9NQVNLKSB8IChkZXN0ICsgMHgyMCk7CS8qIGZpZm8gQSAqLworCisJaWYgKGVuKSB7CisJCXZvcnRleF9hZGJfYWRkcm91dGVzKHZvcnRleCwgY2gsIHJvdXRlLCAyKTsKKwkJaWYgKChzb3VyY2UwIDwgKE9GRlNFVF9TUkNPVVQgKyBOUl9TUkMpKQorCQkgICAgJiYgKHNvdXJjZTAgPj0gT0ZGU0VUX1NSQ09VVCkpIHsKKwkJCXZvcnRleF9zcmNfYWRkV1REKHZvcnRleCwKKwkJCQkJICAoc291cmNlMCAtIE9GRlNFVF9TUkNPVVQpLCBjaCk7CisJCQl2b3J0ZXhfc3JjX2FkZFdURCh2b3J0ZXgsCisJCQkJCSAgKHNvdXJjZTEgLSBPRkZTRVRfU1JDT1VUKSwgY2gpOworCQl9IGVsc2UgaWYgKChzb3VyY2UwIDwgKE9GRlNFVF9NSVhPVVQgKyBOUl9NSVhPVVQpKQorCQkJICAgJiYgKHNvdXJjZTAgPj0gT0ZGU0VUX01JWE9VVCkpIHsKKwkJCXZvcnRleF9taXhlcl9hZGRXVEQodm9ydGV4LAorCQkJCQkgICAgKHNvdXJjZTAgLSBPRkZTRVRfTUlYT1VUKSwgY2gpOworCQkJdm9ydGV4X21peGVyX2FkZFdURCh2b3J0ZXgsCisJCQkJCSAgICAoc291cmNlMSAtIE9GRlNFVF9NSVhPVVQpLCBjaCk7CisJCX0KKwl9IGVsc2UgeworCQl2b3J0ZXhfYWRiX2RlbHJvdXRlcyh2b3J0ZXgsIGNoLCByb3V0ZVswXSwgcm91dGVbMV0pOworCQlpZiAoKHNvdXJjZTAgPCAoT0ZGU0VUX1NSQ09VVCArIE5SX1NSQykpCisJCSAgICAmJiAoc291cmNlMCA+PSBPRkZTRVRfU1JDT1VUKSkgeworCQkJdm9ydGV4X3NyY19kZWxXVEQodm9ydGV4LAorCQkJCQkgIChzb3VyY2UwIC0gT0ZGU0VUX1NSQ09VVCksIGNoKTsKKwkJCXZvcnRleF9zcmNfZGVsV1REKHZvcnRleCwKKwkJCQkJICAoc291cmNlMSAtIE9GRlNFVF9TUkNPVVQpLCBjaCk7CisJCX0gZWxzZSBpZiAoKHNvdXJjZTAgPCAoT0ZGU0VUX01JWE9VVCArIE5SX01JWE9VVCkpCisJCQkgICAmJiAoc291cmNlMCA+PSBPRkZTRVRfTUlYT1VUKSkgeworCQkJdm9ydGV4X21peGVyX2RlbFdURCh2b3J0ZXgsCisJCQkJCSAgICAoc291cmNlMCAtIE9GRlNFVF9NSVhPVVQpLCBjaCk7CisJCQl2b3J0ZXhfbWl4ZXJfZGVsV1REKHZvcnRleCwKKwkJCQkJICAgIChzb3VyY2UxIC0gT0ZGU0VUX01JWE9VVCksIGNoKTsKKwkJfQorCX0KK30KKworLyogQ29ubmVjdGlvbiBzdHVmZiAqLworCisvLyBDb25uZWN0IGFkYmRtYSB0byBzcmMoJ3MpLgorc3RhdGljIHZvaWQKK3ZvcnRleF9jb25uZWN0aW9uX2FkYmRtYV9zcmModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciBhZGJkbWEsIHVuc2lnbmVkIGNoYXIgc3JjKQoreworCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCBjaCwgQURCX0RNQShhZGJkbWEpLCBBREJfU1JDSU4oc3JjKSk7Cit9CisKKy8vIENvbm5lY3QgU1JDIHRvIG1peGluLgorc3RhdGljIHZvaWQKK3ZvcnRleF9jb25uZWN0aW9uX3NyY19taXhpbih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgY2hhciBzcmMsCisJCQkgICAgdW5zaWduZWQgY2hhciBtaXhpbikKK3sKKwl2b3J0ZXhfcm91dGUodm9ydGV4LCBlbiwgY2hhbm5lbCwgQURCX1NSQ09VVChzcmMpLCBBREJfTUlYSU4obWl4aW4pKTsKK30KKworLy8gQ29ubmVjdCBtaXhpbiB3aXRoIG1peCBvdXRwdXQuCitzdGF0aWMgdm9pZAordm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleF90ICogdm9ydGV4LCBpbnQgZW4sIHVuc2lnbmVkIGNoYXIgbWl4aW4sCisJCQkgICAgdW5zaWduZWQgY2hhciBtaXgsIGludCBhKQoreworCWlmIChlbikgeworCQl2b3J0ZXhfbWl4X2VuYWJsZWlucHV0KHZvcnRleCwgbWl4LCBtaXhpbik7CisJCXZvcnRleF9taXhfc2V0aW5wdXR2b2x1bWVieXRlKHZvcnRleCwgbWl4LCBtaXhpbiwgTUlYX0RFRklHQUlOKTsJLy8gYWRkZWQgdG8gb3JpZ2luYWwgY29kZS4KKwl9IGVsc2UKKwkJdm9ydGV4X21peF9kaXNhYmxlaW5wdXQodm9ydGV4LCBtaXgsIG1peGluLCBhKTsKK30KKworLy8gQ29ubmVjdCBhYnNvbHV0IGFkZHJlc3MgdG8gbWl4aW4uCitzdGF0aWMgdm9pZAordm9ydGV4X2Nvbm5lY3Rpb25fYWRiX21peGluKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZW4sCisJCQkgICAgdW5zaWduZWQgY2hhciBjaGFubmVsLCB1bnNpZ25lZCBjaGFyIHNvdXJjZSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIG1peGluKQoreworCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCBjaGFubmVsLCBzb3VyY2UsIEFEQl9NSVhJTihtaXhpbikpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2Nvbm5lY3Rpb25fc3JjX2FkYmRtYSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLCB1bnNpZ25lZCBjaGFyIGNoLAorCQkJICAgICB1bnNpZ25lZCBjaGFyIHNyYywgdW5zaWduZWQgY2hhciBhZGJkbWEpCit7CisJdm9ydGV4X3JvdXRlKHZvcnRleCwgZW4sIGNoLCBBREJfU1JDT1VUKHNyYyksIEFEQl9ETUEoYWRiZG1hKSk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfY29ubmVjdGlvbl9zcmNfc3JjX2FkYmRtYSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyIGNoLCB1bnNpZ25lZCBjaGFyIHNyYzAsCisJCQkJIHVuc2lnbmVkIGNoYXIgc3JjMSwgdW5zaWduZWQgY2hhciBhZGJkbWEpCit7CisKKwl2b3J0ZXhfcm91dGVMUlQodm9ydGV4LCBlbiwgY2gsIEFEQl9TUkNPVVQoc3JjMCksIEFEQl9TUkNPVVQoc3JjMSksCisJCQlBREJfRE1BKGFkYmRtYSkpOworfQorCisvLyBtaXggdG8gYWJzb2x1dCBhZGRyZXNzLgorc3RhdGljIHZvaWQKK3ZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBjaCwKKwkJCSAgdW5zaWduZWQgY2hhciBtaXgsIHVuc2lnbmVkIGNoYXIgZGVzdCkKK3sKKwl2b3J0ZXhfcm91dGUodm9ydGV4LCBlbiwgY2gsIEFEQl9NSVhPVVQobWl4KSwgZGVzdCk7CisJdm9ydGV4X21peF9zZXR2b2x1bWVieXRlKHZvcnRleCwgbWl4LCBNSVhfREVGT0dBSU4pOwkvLyBhZGRlZCB0byBvcmlnaW5hbCBjb2RlLgorfQorCisvLyBtaXhlciB0byBzcmMuCitzdGF0aWMgdm9pZAordm9ydGV4X2Nvbm5lY3Rpb25fbWl4X3NyYyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLCB1bnNpZ25lZCBjaGFyIGNoLAorCQkJICB1bnNpZ25lZCBjaGFyIG1peCwgdW5zaWduZWQgY2hhciBzcmMpCit7CisJdm9ydGV4X3JvdXRlKHZvcnRleCwgZW4sIGNoLCBBREJfTUlYT1VUKG1peCksIEFEQl9TUkNJTihzcmMpKTsKKwl2b3J0ZXhfbWl4X3NldHZvbHVtZWJ5dGUodm9ydGV4LCBtaXgsIE1JWF9ERUZPR0FJTik7CS8vIGFkZGVkIHRvIG9yaWdpbmFsIGNvZGUuCit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAordm9ydGV4X2Nvbm5lY3Rpb25fYWRiZG1hX3NyY19zcmModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwKKwkJCQkgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCQkJCSB1bnNpZ25lZCBjaGFyIGFkYmRtYSwgdW5zaWduZWQgY2hhciBzcmMwLAorCQkJCSB1bnNpZ25lZCBjaGFyIHNyYzEpCit7CisJdm9ydGV4X3JvdXRlcyh2b3J0ZXgsIGVuLCBjaGFubmVsLCBBREJfRE1BKGFkYmRtYSksCisJCSAgICAgIEFEQl9TUkNJTihzcmMwKSwgQURCX1NSQ0lOKHNyYzEpKTsKK30KKworLy8gQ29ubmVjdCB0d28gbWl4IHRvIEFkYkRtYS4KK3N0YXRpYyB2b2lkCit2b3J0ZXhfY29ubmVjdGlvbl9taXhfbWl4X2FkYmRtYSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyIGNoLCB1bnNpZ25lZCBjaGFyIG1peDAsCisJCQkJIHVuc2lnbmVkIGNoYXIgbWl4MSwgdW5zaWduZWQgY2hhciBhZGJkbWEpCit7CisKKwlBREJSYW1MaW5rIHJvdXRlc1syXTsKKwlyb3V0ZXNbMF0gPQorCSAgICAoKChtaXgwICsKKwkgICAgICAgT0ZGU0VUX01JWE9VVCkgJiBBREJfTUFTSykgPDwgQURCX1NISUZUKSB8IChhZGJkbWEgJiBBREJfTUFTSyk7CisJcm91dGVzWzFdID0KKwkgICAgKCgobWl4MSArIE9GRlNFVF9NSVhPVVQpICYgQURCX01BU0spIDw8IEFEQl9TSElGVCkgfCAoKGFkYmRtYSArCisJCQkJCQkJCSAgIDB4MjApICYKKwkJCQkJCQkJICBBREJfTUFTSyk7CisJaWYgKGVuKSB7CisJCXZvcnRleF9hZGJfYWRkcm91dGVzKHZvcnRleCwgY2gsIHJvdXRlcywgMHgyKTsKKwkJdm9ydGV4X21peGVyX2FkZFdURCh2b3J0ZXgsIG1peDAsIGNoKTsKKwkJdm9ydGV4X21peGVyX2FkZFdURCh2b3J0ZXgsIG1peDEsIGNoKTsKKwl9IGVsc2UgeworCQl2b3J0ZXhfYWRiX2RlbHJvdXRlcyh2b3J0ZXgsIGNoLCByb3V0ZXNbMF0sIHJvdXRlc1sxXSk7CisJCXZvcnRleF9taXhlcl9kZWxXVEQodm9ydGV4LCBtaXgwLCBjaCk7CisJCXZvcnRleF9taXhlcl9kZWxXVEQodm9ydGV4LCBtaXgxLCBjaCk7CisJfQorfQorI2VuZGlmCisKKy8qIENPREVDIGNvbm5lY3QuICovCisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfY29ubmVjdF9jb2RlY3BsYXkodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwgdW5zaWduZWQgY2hhciBtaXhlcnNbXSkKK3sKKyNpZmRlZiBDSElQX0FVODgyMAorCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzBdLCBBREJfQ09ERUNPVVQoMCkpOworCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzFdLCBBREJfQ09ERUNPVVQoMSkpOworI2Vsc2UKKyNpZiAxCisJLy8gQ29ubmVjdCBmcm9udCBjaGFubmVscyB0aHJvdWdoIEVRLgorCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzBdLCBBREJfRVFJTigwKSk7CisJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4X2FkYih2b3J0ZXgsIGVuLCAweDExLCBtaXhlcnNbMV0sIEFEQl9FUUlOKDEpKTsKKwkvKiBMb3dlciB2b2x1bWUsIHNpbmNlIEVRIGhhcyBzb21lIGdhaW4uICovCisJdm9ydGV4X21peF9zZXR2b2x1bWVieXRlKHZvcnRleCwgbWl4ZXJzWzBdLCAwKTsKKwl2b3J0ZXhfbWl4X3NldHZvbHVtZWJ5dGUodm9ydGV4LCBtaXhlcnNbMV0sIDApOworCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCAweDExLCBBREJfRVFPVVQoMCksIEFEQl9DT0RFQ09VVCgwKSk7CisJdm9ydGV4X3JvdXRlKHZvcnRleCwgZW4sIDB4MTEsIEFEQl9FUU9VVCgxKSwgQURCX0NPREVDT1VUKDEpKTsKKworCS8qIENoZWNrIGlmIHJlZyAweDI4IGhhcyBTREFDIGJpdCBzZXQuICovCisJaWYgKFZPUlRFWF9JU19RVUFEKHZvcnRleCkpIHsKKwkJLyogUmVhciBjaGFubmVsLiBOb3RlOiBBREJfQ09ERUNPVVQoMCsyKSBhbmQgKDErMikgaXMgZm9yIEFDOTcgbW9kZW0gKi8KKwkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4X2FkYih2b3J0ZXgsIGVuLCAweDExLCBtaXhlcnNbMl0sCisJCQkJCSAgQURCX0NPREVDT1VUKDAgKyA0KSk7CisJCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzNdLAorCQkJCQkgIEFEQl9DT0RFQ09VVCgxICsgNCkpOworCQkvL3ByaW50aygiU0RBQyBkZXRlY3RlZCAiKTsKKwl9CisjZWxzZQorCS8vIFVzZSBwbGFpbiBkaXJlY3Qgb3V0cHV0IHRvIGNvZGVjLgorCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzBdLCBBREJfQ09ERUNPVVQoMCkpOworCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxMSwgbWl4ZXJzWzFdLCBBREJfQ09ERUNPVVQoMSkpOworI2VuZGlmCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9jb25uZWN0X2NvZGVjcmVjKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZW4sIHVuc2lnbmVkIGNoYXIgbWl4aW4wLAorCQkJdW5zaWduZWQgY2hhciBtaXhpbjEpCit7CisJLyoKKwkgICBFbmFibGU6IDB4MSwgMHgxCisJICAgQ2hhbm5lbDogMHgxMSwgMHgxMQorCSAgIEFEQiBTb3VyY2UgYWRkcmVzczogMHg0OCwgMHg0OQorCSAgIERlc3RpbmF0aW9uIEFzcDRUb3BvbG9neV8weDljLDB4OTgKKwkgKi8KKwl2b3J0ZXhfY29ubmVjdGlvbl9hZGJfbWl4aW4odm9ydGV4LCBlbiwgMHgxMSwgQURCX0NPREVDSU4oMCksIG1peGluMCk7CisJdm9ydGV4X2Nvbm5lY3Rpb25fYWRiX21peGluKHZvcnRleCwgZW4sIDB4MTEsIEFEQl9DT0RFQ0lOKDEpLCBtaXhpbjEpOworfQorCisvLyBIaWdoZXIgbGV2ZWwgQURCIGF1ZGlvIHBhdGggKGRlKWFsbG9jYXRvci4KKworLyogUmVzb3VyY2UgbWFuYWdlciAqLworc3RhdGljIGludCByZXNudW1bVk9SVEVYX1JFU09VUkNFX0xBU1RdID0KKyAgICB7IE5SX0FEQiwgTlJfU1JDLCBOUl9NSVhJTiwgTlJfTUlYT1VULCBOUl9BM0QgfTsKKy8qCisgQ2hlY2tvdXQvQ2hlY2tpbiByZXNvdXJjZSBvZiBnaXZlbiB0eXBlLiAKKyByZXNtYXA6IHJlc291cmNlIG1hcCB0byBiZSB1c2VkLiBJZiBOVUxMIG1lYW5zIHRoYXQgd2Ugd2FudCB0byBhbGxvY2F0ZQorIGEgRE1BIHJlc291cmNlIChyb290IG9mIGFsbCBvdGhlciByZXNvdXJjZXMgb2YgYSBkbWEgY2hhbm5lbCkuCisgb3V0OiBNZWFuIGNoZWNrb3V0IGlmICE9IDAuIEVsc2UgbWVhbiBDaGVja2luIHJlc291cmNlLgorIHJlc3R5cGU6IEluZGljYXRlcyB0eXBlIG9mIHJlc291cmNlIHRvIGJlIGNoZWNrZWQgaW4gb3Igb3V0LgorKi8KK3N0YXRpYyBjaGFyCit2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCByZXNtYXBbXSwgaW50IG91dCwgaW50IHJlc3R5cGUpCit7CisJaW50IGksIHF0eSA9IHJlc251bVtyZXN0eXBlXSwgcmVzaW51c2UgPSAwOworCisJaWYgKG91dCkgeworCQkvKiBHYXRoZXIgdXNlZCByZXNvdXJjZXMgYnkgYWxsIHN0cmVhbXMuICovCisJCWZvciAoaSA9IDA7IGkgPCBOUl9BREI7IGkrKykgeworCQkJcmVzaW51c2UgfD0gdm9ydGV4LT5kbWFfYWRiW2ldLnJlc291cmNlc1tyZXN0eXBlXTsKKwkJfQorCQlyZXNpbnVzZSB8PSB2b3J0ZXgtPmZpeGVkX3Jlc1tyZXN0eXBlXTsKKwkJLyogRmluZCBhbmQgdGFrZSBmcmVlIHJlc291cmNlLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcXR5OyBpKyspIHsKKwkJCWlmICgocmVzaW51c2UgJiAoMSA8PCBpKSkgPT0gMCkgeworCQkJCWlmIChyZXNtYXAgIT0gTlVMTCkKKwkJCQkJcmVzbWFwW3Jlc3R5cGVdIHw9ICgxIDw8IGkpOworCQkJCWVsc2UKKwkJCQkJdm9ydGV4LT5kbWFfYWRiW2ldLnJlc291cmNlc1tyZXN0eXBlXSB8PSAoMSA8PCBpKTsKKwkJCQkvL3ByaW50aygidm9ydGV4OiBSZXNNYW5hZ2VyOiB0eXBlICVkIG91dCAlZFxuIiwgcmVzdHlwZSwgaSk7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVzbWFwID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogQ2hlY2tpbiBmaXJzdCByZXNvdXJjZSBvZiB0eXBlIHJlc3R5cGUuICovCisJCWZvciAoaSA9IDA7IGkgPCBxdHk7IGkrKykgeworCQkJaWYgKHJlc21hcFtyZXN0eXBlXSAmICgxIDw8IGkpKSB7CisJCQkJcmVzbWFwW3Jlc3R5cGVdICY9IH4oMSA8PCBpKTsKKwkJCQkvL3ByaW50aygidm9ydGV4OiBSZXNNYW5hZ2VyOiB0eXBlICVkIGluICVkXG4iLHJlc3R5cGUsIGkpOworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJfQorCXByaW50aygidm9ydGV4OiBGQVRBTDogUmVzTWFuYWdlcjogcmVzb3VyY2UgdHlwZSAlZCBleGhhdXN0ZWQuXG4iLCByZXN0eXBlKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogRGVmYXVsdCBDb25uZWN0aW9ucyAgKi8KK3N0YXRpYyBpbnQKK3ZvcnRleF9hZGJfYWxsb2Nyb3V0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGRtYSwgaW50IG5yX2NoLCBpbnQgZGlyLCBpbnQgdHlwZSk7CisKK3N0YXRpYyB2b2lkIHZvcnRleF9jb25uZWN0X2RlZmF1bHQodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbikKK3sKKwkvLyBDb25uZWN0IEFDOTcgY29kZWMuCisJdm9ydGV4LT5taXhwbGF5YlswXSA9IHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsIHZvcnRleC0+Zml4ZWRfcmVzLCBlbiwKKwkJCQkgIFZPUlRFWF9SRVNPVVJDRV9NSVhPVVQpOworCXZvcnRleC0+bWl4cGxheWJbMV0gPSB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LCB2b3J0ZXgtPmZpeGVkX3JlcywgZW4sCisJCQkJICBWT1JURVhfUkVTT1VSQ0VfTUlYT1VUKTsKKwlpZiAoVk9SVEVYX0lTX1FVQUQodm9ydGV4KSkgeworCQl2b3J0ZXgtPm1peHBsYXliWzJdID0gdm9ydGV4X2FkYl9jaGVja2lub3V0KHZvcnRleCwgdm9ydGV4LT5maXhlZF9yZXMsIGVuLAorCQkJCQkgIFZPUlRFWF9SRVNPVVJDRV9NSVhPVVQpOworCQl2b3J0ZXgtPm1peHBsYXliWzNdID0gdm9ydGV4X2FkYl9jaGVja2lub3V0KHZvcnRleCwgdm9ydGV4LT5maXhlZF9yZXMsIGVuLAorCQkJCQkgIFZPUlRFWF9SRVNPVVJDRV9NSVhPVVQpOworCX0KKwl2b3J0ZXhfY29ubmVjdF9jb2RlY3BsYXkodm9ydGV4LCBlbiwgdm9ydGV4LT5taXhwbGF5Yik7CisKKwl2b3J0ZXgtPm1peGNhcHRbMF0gPSB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LCB2b3J0ZXgtPmZpeGVkX3JlcywgZW4sCisJCQkJICBWT1JURVhfUkVTT1VSQ0VfTUlYSU4pOworCXZvcnRleC0+bWl4Y2FwdFsxXSA9IHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsIHZvcnRleC0+Zml4ZWRfcmVzLCBlbiwKKwkJCQkgIFZPUlRFWF9SRVNPVVJDRV9NSVhJTik7CisJdm9ydGV4X2Nvbm5lY3RfY29kZWNyZWModm9ydGV4LCBlbiwgTUlYX0NBUFQoMCksIE1JWF9DQVBUKDEpKTsKKworCS8vIENvbm5lY3QgU1BESUYKKyNpZm5kZWYgQ0hJUF9BVTg4MjAKKwl2b3J0ZXgtPm1peHNwZGlmWzBdID0gdm9ydGV4X2FkYl9jaGVja2lub3V0KHZvcnRleCwgdm9ydGV4LT5maXhlZF9yZXMsIGVuLAorCQkJCSAgVk9SVEVYX1JFU09VUkNFX01JWE9VVCk7CisJdm9ydGV4LT5taXhzcGRpZlsxXSA9IHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsIHZvcnRleC0+Zml4ZWRfcmVzLCBlbiwKKwkJCQkgIFZPUlRFWF9SRVNPVVJDRV9NSVhPVVQpOworCXZvcnRleF9jb25uZWN0aW9uX21peF9hZGIodm9ydGV4LCBlbiwgMHgxNCwgdm9ydGV4LT5taXhzcGRpZlswXSwKKwkJCQkgIEFEQl9TUERJRk9VVCgwKSk7CisJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4X2FkYih2b3J0ZXgsIGVuLCAweDE0LCB2b3J0ZXgtPm1peHNwZGlmWzFdLAorCQkJCSAgQURCX1NQRElGT1VUKDEpKTsKKyNlbmRpZgorCS8vIENvbm5lY3QgV1QKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKKwl2b3J0ZXhfd3RfY29ubmVjdCh2b3J0ZXgsIGVuKTsKKyNlbmRpZgorCS8vIEEzRCAoY3Jvc3N0YWxrIGNhbmNlbGVyIGFuZCBBM0Qgc2xpY2VzKS4gQVU4ODEwIGRpc2FibGVkIGZvciBub3cuCisjaWZuZGVmIENISVBfQVU4ODIwCisJdm9ydGV4X1ZvcnQzRF9jb25uZWN0KHZvcnRleCwgZW4pOworI2VuZGlmCisJLy8gQ29ubmVjdCBJMlMKKworCS8vIENvbm5lY3QgRFNQIGludGVyZmFjZSBmb3IgU1EzNTAwIHR1cmJvIChub3QgaGVyZSBpIHRoaW5rLi4uKQorCisJLy8gQ29ubmVjdCBBQzk4IG1vZGVtIGNvZGVjCisJCit9CisKKy8qCisgIEFsbG9jYXRlIG5yX2NoIHBjbSBhdWRpbyByb3V0ZXMgaWYgZG1hIDwgMC4gSWYgZG1hID49IDAsIGV4aXN0aW5nIHJvdXRlcworICBhcmUgZGVhbGxvY2F0ZWQuCisgIGRtYTogRE1BIGVuZ2luZSByb3V0ZXMgdG8gYmUgZGVhbGxvY2F0ZWQgd2hlbiBkbWEgPj0gMC4KKyAgbnJfY2g6IE51bWJlciBvZiBjaGFubmVscyB0byBiZSBkZS9hbGxvY2F0ZWQuCisgIGRpcjogZGlyZWN0aW9uIG9mIHN0cmVhbS4gVXNlcyBzYW1lIHZhbHVlcyBhcyBzdWJzdHJlYW0tPnN0cmVhbS4KKyAgdHlwZTogVHlwZSBvZiBhdWRpbyBvdXRwdXQvc291cmNlIChjb2RlYywgc3BkaWYsIGkycywgZHNwLCBldGMpCisgIFJldHVybjogUmV0dXJuIGFsbG9jYXRlZCBETUEgb3Igc2FtZSBETUEgcGFzc2VkIGFzICJkbWEiIHdoZW4gZG1hID49IDAuCisqLworc3RhdGljIGludAordm9ydGV4X2FkYl9hbGxvY3JvdXRlKHZvcnRleF90ICogdm9ydGV4LCBpbnQgZG1hLCBpbnQgbnJfY2gsIGludCBkaXIsIGludCB0eXBlKQoreworCXN0cmVhbV90ICpzdHJlYW07CisJaW50IGksIGVuOworCQorCWlmICgobnJfY2ggPT0gMykKKwkgICAgfHwgKChkaXIgPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSAmJiAobnJfY2ggPiAyKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoZG1hID49IDApIHsKKwkJZW4gPSAwOworCQl2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LAorCQkJCSAgICAgIHZvcnRleC0+ZG1hX2FkYltkbWFdLnJlc291cmNlcywgZW4sCisJCQkJICAgICAgVk9SVEVYX1JFU09VUkNFX0RNQSk7CisJfSBlbHNlIHsKKwkJZW4gPSAxOworCQlpZiAoKGRtYSA9CisJCSAgICAgdm9ydGV4X2FkYl9jaGVja2lub3V0KHZvcnRleCwgTlVMTCwgZW4sCisJCQkJCSAgIFZPUlRFWF9SRVNPVVJDRV9ETUEpKSA8IDApCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXN0cmVhbSA9ICZ2b3J0ZXgtPmRtYV9hZGJbZG1hXTsKKwlzdHJlYW0tPmRtYSA9IGRtYTsKKwlzdHJlYW0tPmRpciA9IGRpcjsKKwlzdHJlYW0tPnR5cGUgPSB0eXBlOworCisJLyogUExBWUJBQ0sgUk9VVEVTLiAqLworCWlmIChkaXIgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlpbnQgc3JjWzRdLCBtaXhbNF0sIGNoX3RvcDsKKyNpZm5kZWYgQ0hJUF9BVTg4MjAKKwkJaW50IGEzZCA9IDA7CisjZW5kaWYKKwkJLyogR2V0IFNSQyBhbmQgTUlYRVIgaGFyZHdhcmUgcmVzb3VyY2VzLiAqLworCQlpZiAoc3RyZWFtLT50eXBlICE9IFZPUlRFWF9QQ01fU1BESUYpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBucl9jaDsgaSsrKSB7CisJCQkJaWYgKChzcmNbaV0gPSB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LAorCQkJCQkJCSAgIHN0cmVhbS0+cmVzb3VyY2VzLCBlbiwKKwkJCQkJCQkgICBWT1JURVhfUkVTT1VSQ0VfU1JDKSkgPCAwKSB7CisJCQkJCW1lbXNldChzdHJlYW0tPnJlc291cmNlcywgMCwKKwkJCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqCisJCQkJCSAgICAgICBWT1JURVhfUkVTT1VSQ0VfTEFTVCk7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJCWlmIChzdHJlYW0tPnR5cGUgIT0gVk9SVEVYX1BDTV9BM0QpIHsKKwkJCQkJaWYgKChtaXhbaV0gPSB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LAorCQkJCQkJCQkgICBzdHJlYW0tPnJlc291cmNlcywKKwkJCQkJCQkJICAgZW4sCisJCQkJCQkJCSAgIFZPUlRFWF9SRVNPVVJDRV9NSVhJTikpIDwgMCkgeworCQkJCQkJbWVtc2V0KHN0cmVhbS0+cmVzb3VyY2VzLAorCQkJCQkJICAgICAgIDAsCisJCQkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogVk9SVEVYX1JFU09VUkNFX0xBU1QpOworCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorI2lmbmRlZiBDSElQX0FVODgyMAorCQlpZiAoc3RyZWFtLT50eXBlID09IFZPUlRFWF9QQ01fQTNEKSB7CisJCQlpZiAoKGEzZCA9CisJCQkgICAgIHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsCisJCQkJCQkgICBzdHJlYW0tPnJlc291cmNlcywgZW4sCisJCQkJCQkgICBWT1JURVhfUkVTT1VSQ0VfQTNEKSkgPCAwKSB7CisJCQkJbWVtc2V0KHN0cmVhbS0+cmVzb3VyY2VzLCAwLAorCQkJCSAgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikgKgorCQkJCSAgICAgICBWT1JURVhfUkVTT1VSQ0VfTEFTVCk7CisJCQkJcHJpbnRrKCJ2b3J0ZXg6IG91dCBvZiBBM0Qgc291cmNlcy4gU29ycnlcbiIpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQkvKiAoRGUpSW5pdGlhbGl6ZSBBM0QgaGFyZHdhcmUgc291cmNlLiAqLworCQkJdm9ydGV4X1ZvcnQzRF9Jbml0aWFsaXplU291cmNlKCYodm9ydGV4LT5hM2RbYTNkXSksIGVuKTsKKwkJfQorCQkvKiBNYWtlIFNQRElGIG91dCBleGNsdXNpdmUgdG8gInNwZGlmIiBkZXZpY2Ugd2hlbiBpbiB1c2UuICovCisJCWlmICgoc3RyZWFtLT50eXBlID09IFZPUlRFWF9QQ01fU1BESUYpICYmIChlbikpIHsKKwkJCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIDAsIDB4MTQsCisJCQkJICAgICBBREJfTUlYT1VUKHZvcnRleC0+bWl4c3BkaWZbMF0pLAorCQkJCSAgICAgQURCX1NQRElGT1VUKDApKTsKKwkJCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIDAsIDB4MTQsCisJCQkJICAgICBBREJfTUlYT1VUKHZvcnRleC0+bWl4c3BkaWZbMV0pLAorCQkJCSAgICAgQURCX1NQRElGT1VUKDEpKTsKKwkJfQorI2VuZGlmCisJCS8qIE1ha2UgcGxheWJhY2sgcm91dGVzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2g7IGkrKykgeworCQkJaWYgKHN0cmVhbS0+dHlwZSA9PSBWT1JURVhfUENNX0FEQikgeworCQkJCXZvcnRleF9jb25uZWN0aW9uX2FkYmRtYV9zcmModm9ydGV4LCBlbiwKKwkJCQkJCQkgICAgIHNyY1tucl9jaCAtIDFdLAorCQkJCQkJCSAgICAgZG1hLAorCQkJCQkJCSAgICAgc3JjW2ldKTsKKwkJCQl2b3J0ZXhfY29ubmVjdGlvbl9zcmNfbWl4aW4odm9ydGV4LCBlbiwKKwkJCQkJCQkgICAgMHgxMSwgc3JjW2ldLAorCQkJCQkJCSAgICBtaXhbaV0pOworCQkJCXZvcnRleF9jb25uZWN0aW9uX21peGluX21peCh2b3J0ZXgsIGVuLAorCQkJCQkJCSAgICBtaXhbaV0sCisJCQkJCQkJICAgIE1JWF9QTEFZQihpKSwgMCk7CisjaWZuZGVmIENISVBfQVU4ODIwCisJCQkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleCwgZW4sCisJCQkJCQkJICAgIG1peFtpXSwKKwkJCQkJCQkgICAgTUlYX1NQRElGKGkgJSAyKSwgMCk7CisJCQkJdm9ydGV4X21peF9zZXRpbnB1dHZvbHVtZWJ5dGUodm9ydGV4LAorCQkJCQkJCSAgICAgIE1JWF9TUERJRihpICUgMiksCisJCQkJCQkJICAgICAgbWl4W2ldLAorCQkJCQkJCSAgICAgIE1JWF9ERUZJR0FJTik7CisjZW5kaWYKKwkJCX0KKyNpZm5kZWYgQ0hJUF9BVTg4MjAKKwkJCWlmIChzdHJlYW0tPnR5cGUgPT0gVk9SVEVYX1BDTV9BM0QpIHsKKwkJCQl2b3J0ZXhfY29ubmVjdGlvbl9hZGJkbWFfc3JjKHZvcnRleCwgZW4sCisJCQkJCQkJICAgICBzcmNbbnJfY2ggLSAxXSwgCisJCQkJCQkJCSBkbWEsCisJCQkJCQkJICAgICBzcmNbaV0pOworCQkJCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCAweDExLCBBREJfU1JDT1VUKHNyY1tpXSksIEFEQl9BM0RJTihhM2QpKTsKKwkJCQkvKiBYVGFsayB0ZXN0LiAqLworCQkJCS8vdm9ydGV4X3JvdXRlKHZvcnRleCwgZW4sIDB4MTEsIGRtYSwgQURCX1hUQUxLSU4oaT85OjQpKTsKKwkJCQkvL3ZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCAweDExLCBBREJfU1JDT1VUKHNyY1tpXSksIEFEQl9YVEFMS0lOKGk/NDo5KSk7CisJCQl9CisJCQlpZiAoc3RyZWFtLT50eXBlID09IFZPUlRFWF9QQ01fU1BESUYpCisJCQkJdm9ydGV4X3JvdXRlKHZvcnRleCwgZW4sIDB4MTQsCisJCQkJCSAgICAgQURCX0RNQShzdHJlYW0tPmRtYSksCisJCQkJCSAgICAgQURCX1NQRElGT1VUKGkpKTsKKyNlbmRpZgorCQl9CisJCWlmIChzdHJlYW0tPnR5cGUgIT0gVk9SVEVYX1BDTV9TUERJRiAmJiBzdHJlYW0tPnR5cGUgIT0gVk9SVEVYX1BDTV9BM0QpIHsKKwkJCWNoX3RvcCA9IChWT1JURVhfSVNfUVVBRCh2b3J0ZXgpID8gNCA6IDIpOworCQkJZm9yIChpID0gbnJfY2g7IGkgPCBjaF90b3A7IGkrKykgeworCQkJCXZvcnRleF9jb25uZWN0aW9uX21peGluX21peCh2b3J0ZXgsIGVuLAorCQkJCQkJCSAgICBtaXhbaSAlIG5yX2NoXSwKKwkJCQkJCQkgICAgTUlYX1BMQVlCKGkpLCAwKTsKKyNpZm5kZWYgQ0hJUF9BVTg4MjAKKwkJCQl2b3J0ZXhfY29ubmVjdGlvbl9taXhpbl9taXgodm9ydGV4LCBlbiwKKwkJCQkJCQkgICAgbWl4W2kgJSBucl9jaF0sCisJCQkJCQkJICAgIE1JWF9TUERJRihpICUgMiksCisJCQkJCQkJCTApOworCQkJCXZvcnRleF9taXhfc2V0aW5wdXR2b2x1bWVieXRlKHZvcnRleCwKKwkJCQkJCQkgICAgICBNSVhfU1BESUYoaSAlIDIpLAorCQkJCQkJCSAgICAgIG1peFtpICUgbnJfY2hdLAorCQkJCQkJCSAgICAgIE1JWF9ERUZJR0FJTik7CisjZW5kaWYKKwkJCX0KKwkJfQorI2lmbmRlZiBDSElQX0FVODgyMAorCQllbHNlIHsKKwkJCWlmIChucl9jaCA9PSAxICYmIHN0cmVhbS0+dHlwZSA9PSBWT1JURVhfUENNX1NQRElGKQorCQkJCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCAweDE0LAorCQkJCQkgICAgIEFEQl9ETUEoc3RyZWFtLT5kbWEpLAorCQkJCQkgICAgIEFEQl9TUERJRk9VVCgxKSk7CisJCX0KKwkJLyogUmVjb25uZWN0IFNQRElGIG91dCB3aGVuICJzcGRpZiIgZGV2aWNlIGlzIGRvd24uICovCisJCWlmICgoc3RyZWFtLT50eXBlID09IFZPUlRFWF9QQ01fU1BESUYpICYmICghZW4pKSB7CisJCQl2b3J0ZXhfcm91dGUodm9ydGV4LCAxLCAweDE0LAorCQkJCSAgICAgQURCX01JWE9VVCh2b3J0ZXgtPm1peHNwZGlmWzBdKSwKKwkJCQkgICAgIEFEQl9TUERJRk9VVCgwKSk7CisJCQl2b3J0ZXhfcm91dGUodm9ydGV4LCAxLCAweDE0LAorCQkJCSAgICAgQURCX01JWE9VVCh2b3J0ZXgtPm1peHNwZGlmWzFdKSwKKwkJCQkgICAgIEFEQl9TUERJRk9VVCgxKSk7CisJCX0KKyNlbmRpZgorCS8qIENBUFRVUkUgUk9VVEVTLiAqLworCX0gZWxzZSB7CisJCWludCBzcmNbMl0sIG1peFsyXTsKKworCQkvKiBHZXQgU1JDIGFuZCBNSVhFUiBoYXJkd2FyZSByZXNvdXJjZXMuICovCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaDsgaSsrKSB7CisJCQlpZiAoKG1peFtpXSA9CisJCQkgICAgIHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsCisJCQkJCQkgICBzdHJlYW0tPnJlc291cmNlcywgZW4sCisJCQkJCQkgICBWT1JURVhfUkVTT1VSQ0VfTUlYT1VUKSkKKwkJCSAgICA8IDApIHsKKwkJCQltZW1zZXQoc3RyZWFtLT5yZXNvdXJjZXMsIDAsCisJCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqCisJCQkJICAgICAgIFZPUlRFWF9SRVNPVVJDRV9MQVNUKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKChzcmNbaV0gPQorCQkJICAgICB2b3J0ZXhfYWRiX2NoZWNraW5vdXQodm9ydGV4LAorCQkJCQkJICAgc3RyZWFtLT5yZXNvdXJjZXMsIGVuLAorCQkJCQkJICAgVk9SVEVYX1JFU09VUkNFX1NSQykpIDwgMCkgeworCQkJCW1lbXNldChzdHJlYW0tPnJlc291cmNlcywgMCwKKwkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICoKKwkJCQkgICAgICAgVk9SVEVYX1JFU09VUkNFX0xBU1QpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKworCQkvKiBNYWtlIGNhcHR1cmUgcm91dGVzLiAqLworCQl2b3J0ZXhfY29ubmVjdGlvbl9taXhpbl9taXgodm9ydGV4LCBlbiwgTUlYX0NBUFQoMCksIG1peFswXSwgMCk7CisJCXZvcnRleF9jb25uZWN0aW9uX21peF9zcmModm9ydGV4LCBlbiwgMHgxMSwgbWl4WzBdLCBzcmNbMF0pOworCQlpZiAobnJfY2ggPT0gMSkgeworCQkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleCwgZW4sCisJCQkJCQkgICAgTUlYX0NBUFQoMSksIG1peFswXSwgMCk7CisJCQl2b3J0ZXhfY29ubmVjdGlvbl9zcmNfYWRiZG1hKHZvcnRleCwgZW4sCisJCQkJCQkgICAgIHNyY1swXSwKKwkJCQkJCSAgICAgc3JjWzBdLCBkbWEpOworCQl9IGVsc2UgeworCQkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleCwgZW4sCisJCQkJCQkgICAgTUlYX0NBUFQoMSksIG1peFsxXSwgMCk7CisJCQl2b3J0ZXhfY29ubmVjdGlvbl9taXhfc3JjKHZvcnRleCwgZW4sIDB4MTEsIG1peFsxXSwKKwkJCQkJCSAgc3JjWzFdKTsKKwkJCXZvcnRleF9jb25uZWN0aW9uX3NyY19zcmNfYWRiZG1hKHZvcnRleCwgZW4sCisJCQkJCQkJIHNyY1sxXSwgc3JjWzBdLAorCQkJCQkJCSBzcmNbMV0sIGRtYSk7CisJCX0KKwl9CisJdm9ydGV4LT5kbWFfYWRiW2RtYV0ubnJfY2ggPSBucl9jaDsKKworI2lmIDAKKwkvKiBBQzk3IENvZGVjIGNoYW5uZWwgc2V0dXAuIEZJWE1FOiB0aGlzIGhhcyBubyBlZmZlY3Qgb24gc29tZSBjYXJkcyAhISAqLworCWlmIChucl9jaCA8IDQpIHsKKwkJLyogQ29weSBzdGVyZW8gdG8gcmVhciBjaGFubmVsIChzdXJyb3VuZCkgKi8KKwkJc25kX2FjOTdfd3JpdGVfY2FjaGUodm9ydGV4LT5jb2RlYywKKwkJCQkgICAgIEFDOTdfU0lHTUFURUxfREFDMklOVkVSVCwKKwkJCQkgICAgIHNuZF9hYzk3X3JlYWQodm9ydGV4LT5jb2RlYywKKwkJCQkJCSAgIEFDOTdfU0lHTUFURUxfREFDMklOVkVSVCkKKwkJCQkgICAgIHwgNCk7CisJfSBlbHNlIHsKKwkJLyogQWxsb3cgc2VwYXJhdGUgZnJvbnQgYW5kIHJlYXIgY2hhbm5lbHMuICovCisJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKHZvcnRleC0+Y29kZWMsCisJCQkJICAgICBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQsCisJCQkJICAgICBzbmRfYWM5N19yZWFkKHZvcnRleC0+Y29kZWMsCisJCQkJCQkgICBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQpCisJCQkJICAgICAmIH4oKHUzMikKKwkJCQkJIDQpKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZG1hOworfQorCisvKgorIFNldCB0aGUgU2FtcGxlUmF0ZSBvZiB0aGUgU1JDJ3MgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIERNQSBlbmdpbmUuCisgKi8KK3N0YXRpYyB2b2lkCit2b3J0ZXhfYWRiX3NldHNyYyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSwgdW5zaWduZWQgaW50IHJhdGUsIGludCBkaXIpCit7CisJc3RyZWFtX3QgKnN0cmVhbSA9ICYodm9ydGV4LT5kbWFfYWRiW2FkYmRtYV0pOworCWludCBpLCBjdnJ0OworCisJLyogZGlyPTE6cGxheSA7IGRpcj0wOnJlYyAqLworCWlmIChkaXIpCisJCWN2cnQgPSBTUkNfUkFUSU8ocmF0ZSwgNDgwMDApOworCWVsc2UKKwkJY3ZydCA9IFNSQ19SQVRJTyg0ODAwMCwgcmF0ZSk7CisKKwkvKiBTZXR1cCBTUkMncyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9TUkM7IGkrKykgeworCQlpZiAoc3RyZWFtLT5yZXNvdXJjZXNbVk9SVEVYX1JFU09VUkNFX1NSQ10gJiAoMSA8PCBpKSkKKwkJCXZvcnRleF9zcmNfc2V0dXBjaGFubmVsKHZvcnRleCwgaSwgY3ZydCwgMCwgMCwgaSwgZGlyLCAxLCBjdnJ0LCBkaXIpOworCX0KK30KKworLy8gVGltZXIgYW5kIElTUiBmdW5jdGlvbnMuCisKK3N0YXRpYyB2b2lkIHZvcnRleF9zZXR0aW1lcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHBlcmlvZCkKK3sKKwkvL3NldCB0aGUgdGltZXIgcGVyaW9kIHRvIDxwZXJpb2Q+IDQ4MDAwdGhzIG9mIGEgc2Vjb25kLgorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX1NUQVQsIHBlcmlvZCk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB2b3J0ZXhfZW5hYmxlX3RpbWVyX2ludCh2b3J0ZXhfdCAqIGNhcmQpCit7CisJaHd3cml0ZShjYXJkLT5tbWlvLCBWT1JURVhfSVJRX0NUUkwsCisJCWh3cmVhZChjYXJkLT5tbWlvLCBWT1JURVhfSVJRX0NUUkwpIHwgSVJRX1RJTUVSIHwgMHg2MCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9kaXNhYmxlX3RpbWVyX2ludCh2b3J0ZXhfdCAqIGNhcmQpCit7CisJaHd3cml0ZShjYXJkLT5tbWlvLCBWT1JURVhfSVJRX0NUUkwsCisJCWh3cmVhZChjYXJkLT5tbWlvLCBWT1JURVhfSVJRX0NUUkwpICYgfklSUV9USU1FUik7Cit9CisKKyNlbmRpZgorc3RhdGljIHZvaWQgdm9ydGV4X2VuYWJsZV9pbnQodm9ydGV4X3QgKiBjYXJkKQoreworCS8vIENBc3A0SVNSX19FbmFibGVWb3J0ZXhJbnRfdm9pZF8KKwlod3dyaXRlKGNhcmQtPm1taW8sIFZPUlRFWF9DVFJMLAorCQlod3JlYWQoY2FyZC0+bW1pbywgVk9SVEVYX0NUUkwpIHwgQ1RSTF9JUlFfRU5BQkxFKTsKKwlod3dyaXRlKGNhcmQtPm1taW8sIFZPUlRFWF9JUlFfQ1RSTCwKKwkJKGh3cmVhZChjYXJkLT5tbWlvLCBWT1JURVhfSVJRX0NUUkwpICYgMHhmZmZmZWZjMCkgfCAweDI0KTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2Rpc2FibGVfaW50KHZvcnRleF90ICogY2FyZCkKK3sKKwlod3dyaXRlKGNhcmQtPm1taW8sIFZPUlRFWF9DVFJMLAorCQlod3JlYWQoY2FyZC0+bW1pbywgVk9SVEVYX0NUUkwpICYgfkNUUkxfSVJRX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2b3J0ZXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IGRldl9pZDsKKwlpbnQgaSwgaGFuZGxlZDsKKwl1MzIgc291cmNlOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJydXB0IGlzIG91cnMuCisJaWYgKCEoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX1NUQVQpICYgMHgxKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLy8gVGhpcyBpcyB0aGUgSW50ZXJycnVwdCBFbmFibGUgZmxhZyB3ZSBzZXQgYmVmb3JlIChjb25zaXN0ZW5jeSBjaGVjaykuCisJaWYgKCEoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYgQ1RSTF9JUlFfRU5BQkxFKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc291cmNlID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9TT1VSQ0UpOworCS8vIFJlc2V0IElSUSBmbGFncy4KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9TT1VSQ0UsIHNvdXJjZSk7CisJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9TT1VSQ0UpOworCS8vIElzIGF0IGxlYXN0IG9uZSBJUlEgZmxhZyBzZXQ/CisJaWYgKHNvdXJjZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBtaXNzaW5nIGlycSBzb3VyY2VcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaGFuZGxlZCA9IDA7CisJLy8gQXR0ZW5kIGV2ZXJ5IGludGVycnVwdCBzb3VyY2UuCisJaWYgKHVubGlrZWx5KHNvdXJjZSAmIElSUV9FUlJfTUFTSykpIHsKKwkJaWYgKHNvdXJjZSAmIElSUV9GQVRBTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IElSUSBmYXRhbCBlcnJvclxuIik7CisJCX0KKwkJaWYgKHNvdXJjZSAmIElSUV9QQVJJVFkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBJUlEgcGFyaXR5IGVycm9yXG4iKTsKKwkJfQorCQlpZiAoc291cmNlICYgSVJRX1JFRykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IElSUSByZWcgZXJyb3JcbiIpOworCQl9CisJCWlmIChzb3VyY2UgJiBJUlFfRklGTykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IElSUSBmaWZvIGVycm9yXG4iKTsKKwkJfQorCQlpZiAoc291cmNlICYgSVJRX0RNQSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IElSUSBkbWEgZXJyb3JcbiIpOworCQl9CisJCWhhbmRsZWQgPSAxOworCX0KKwlpZiAoc291cmNlICYgSVJRX1BDTU9VVCkgeworCQkvKiBBTFNBIHBlcmlvZCBhY2tub3dsZWRnZS4gKi8KKwkJc3Bpbl9sb2NrKCZ2b3J0ZXgtPmxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQURCOyBpKyspIHsKKwkJCWlmICh2b3J0ZXgtPmRtYV9hZGJbaV0uZmlmb19zdGF0dXMgPT0gRklGT19TVEFSVCkgeworCQkJCWlmICh2b3J0ZXhfYWRiZG1hX2J1ZnNoaWZ0KHZvcnRleCwgaSkpIDsKKwkJCQlzcGluX3VubG9jaygmdm9ydGV4LT5sb2NrKTsKKwkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHZvcnRleC0+ZG1hX2FkYltpXS4KKwkJCQkJCSAgICAgICBzdWJzdHJlYW0pOworCQkJCXNwaW5fbG9jaygmdm9ydGV4LT5sb2NrKTsKKwkJCX0KKwkJfQorI2lmbmRlZiBDSElQX0FVODgxMAorCQlmb3IgKGkgPSAwOyBpIDwgTlJfV1Q7IGkrKykgeworCQkJaWYgKHZvcnRleC0+ZG1hX3d0W2ldLmZpZm9fc3RhdHVzID09IEZJRk9fU1RBUlQpIHsKKwkJCQlpZiAodm9ydGV4X3d0ZG1hX2J1ZnNoaWZ0KHZvcnRleCwgaSkpIDsKKwkJCQlzcGluX3VubG9jaygmdm9ydGV4LT5sb2NrKTsKKwkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHZvcnRleC0+ZG1hX3d0W2ldLgorCQkJCQkJICAgICAgIHN1YnN0cmVhbSk7CisJCQkJc3Bpbl9sb2NrKCZ2b3J0ZXgtPmxvY2spOworCQkJfQorCQl9CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJnZvcnRleC0+bG9jayk7CisJCWhhbmRsZWQgPSAxOworCX0KKwkvL0Fja25vd2xlZGdlIHRoZSBUaW1lciBpbnRlcnJ1cHQKKwlpZiAoc291cmNlICYgSVJRX1RJTUVSKSB7CisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9JUlFfU1RBVCk7CisJCWhhbmRsZWQgPSAxOworCX0KKwlpZiAoc291cmNlICYgSVJRX01JREkpIHsKKwkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdCh2b3J0ZXgtPmlycSwKKwkJCQkJICB2b3J0ZXgtPnJtaWRpLT5wcml2YXRlX2RhdGEsIHJlZ3MpOworCQloYW5kbGVkID0gMTsKKwl9CisKKwlpZiAoIWhhbmRsZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IHVua25vd24gaXJxIHNvdXJjZSAleFxuIiwgc291cmNlKTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIENvZGVjICovCisKKyNkZWZpbmUgUE9MTF9DT1VOVCAxMDAwCitzdGF0aWMgdm9pZCB2b3J0ZXhfY29kZWNfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCS8qIHRoZSB3aW5kb3dzIGRyaXZlciB3cml0ZXMgLWksIHNvIHdlIHdyaXRlIC1pICovCisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAoVk9SVEVYX0NPREVDX0NITiArIChpIDw8IDIpKSwgLWkpOworCQltc2xlZXAoMik7CisJfQorCWlmICgwKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ09ERUNfQ1RSTCwgMHg4MDY4KTsKKwkJbXNsZWVwKDEpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NPREVDX0NUUkwsIDB4MDBlOCk7CisJCW1zbGVlcCgxKTsKKwl9IGVsc2UgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NPREVDX0NUUkwsIDB4MDBhOCk7CisJCW1zbGVlcCgyKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DT0RFQ19DVFJMLCAweDgwYTgpOworCQltc2xlZXAoMik7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ09ERUNfQ1RSTCwgMHg4MGU4KTsKKwkJbXNsZWVwKDIpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NPREVDX0NUUkwsIDB4ODBhOCk7CisJCW1zbGVlcCgyKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DT0RFQ19DVFJMLCAweDAwYTgpOworCQltc2xlZXAoMik7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ09ERUNfQ1RSTCwgMHgwMGU4KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIChWT1JURVhfQ09ERUNfQ0hOICsgKGkgPDwgMikpLCAtaSk7CisJCW1zbGVlcCg1KTsKKwl9CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DT0RFQ19DVFJMLCAweGU4KTsKKwltc2xlZXAoMSk7CisJLyogRW5hYmxlIGNvZGVjIGNoYW5uZWxzIDAgYW5kIDEuICovCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DT0RFQ19FTiwKKwkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NPREVDX0VOKSB8IEVOX0NPREVDKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9jb2RlY193cml0ZShhYzk3X3QgKiBjb2RlYywgdW5zaWduZWQgc2hvcnQgYWRkciwgdW5zaWduZWQgc2hvcnQgZGF0YSkKK3sKKworCXZvcnRleF90ICpjYXJkID0gKHZvcnRleF90ICopIGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGxpZmVib2F0ID0gMDsKKworCS8qIHdhaXQgZm9yIHRyYW5zYWN0aW9ucyB0byBjbGVhciAqLworCXdoaWxlICghKGh3cmVhZChjYXJkLT5tbWlvLCBWT1JURVhfQ09ERUNfQ1RSTCkgJiAweDEwMCkpIHsKKwkJdWRlbGF5KDEwMCk7CisJCWlmIChsaWZlYm9hdCsrID4gUE9MTF9DT1VOVCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IGFjOTcgY29kZWMgc3R1Y2sgYnVzeVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogd3JpdGUgcmVnaXN0ZXIgKi8KKwlod3dyaXRlKGNhcmQtPm1taW8sIFZPUlRFWF9DT0RFQ19JTywKKwkJKChhZGRyIDw8IFZPUlRFWF9DT0RFQ19BRERTSElGVCkgJiBWT1JURVhfQ09ERUNfQURETUFTSykgfAorCQkoKGRhdGEgPDwgVk9SVEVYX0NPREVDX0RBVFNISUZUKSAmIFZPUlRFWF9DT0RFQ19EQVRNQVNLKSB8CisJCVZPUlRFWF9DT0RFQ19XUklURSk7CisKKwkvKiBGbHVzaCBDYWNoZXMuICovCisJaHdyZWFkKGNhcmQtPm1taW8sIFZPUlRFWF9DT0RFQ19JTyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB2b3J0ZXhfY29kZWNfcmVhZChhYzk3X3QgKiBjb2RlYywgdW5zaWduZWQgc2hvcnQgYWRkcikKK3sKKworCXZvcnRleF90ICpjYXJkID0gKHZvcnRleF90ICopIGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTMyIHJlYWRfYWRkciwgZGF0YTsKKwl1bnNpZ25lZCBsaWZlYm9hdCA9IDA7CisKKwkvKiB3YWl0IGZvciB0cmFuc2FjdGlvbnMgdG8gY2xlYXIgKi8KKwl3aGlsZSAoIShod3JlYWQoY2FyZC0+bW1pbywgVk9SVEVYX0NPREVDX0NUUkwpICYgMHgxMDApKSB7CisJCXVkZWxheSgxMDApOworCQlpZiAobGlmZWJvYXQrKyA+IFBPTExfQ09VTlQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBhYzk3IGNvZGVjIHN0dWNrIGJ1c3lcbiIpOworCQkJcmV0dXJuIDB4ZmZmZjsKKwkJfQorCX0KKwkvKiBzZXQgdXAgcmVhZCBhZGRyZXNzICovCisJcmVhZF9hZGRyID0gKChhZGRyIDw8IFZPUlRFWF9DT0RFQ19BRERTSElGVCkgJiBWT1JURVhfQ09ERUNfQURETUFTSyk7CisJaHd3cml0ZShjYXJkLT5tbWlvLCBWT1JURVhfQ09ERUNfSU8sIHJlYWRfYWRkcik7CisKKwkvKiB3YWl0IGZvciBhZGRyZXNzICovCisJZG8geworCQl1ZGVsYXkoMTAwKTsKKwkJZGF0YSA9IGh3cmVhZChjYXJkLT5tbWlvLCBWT1JURVhfQ09ERUNfSU8pOworCQlpZiAobGlmZWJvYXQrKyA+IFBPTExfQ09VTlQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBhYzk3IGFkZHJlc3MgbmV2ZXIgYXJyaXZlZFxuIik7CisJCQlyZXR1cm4gMHhmZmZmOworCQl9CisJfSB3aGlsZSAoKGRhdGEgJiBWT1JURVhfQ09ERUNfQURETUFTSykgIT0KKwkJIChhZGRyIDw8IFZPUlRFWF9DT0RFQ19BRERTSElGVCkpOworCisJLyogcmV0dXJuIGRhdGEuICovCisJcmV0dXJuICh1MTYpIChkYXRhICYgVk9SVEVYX0NPREVDX0RBVE1BU0spOworfQorCisvKiBTUERJRiBzdXBwb3J0ICAqLworCitzdGF0aWMgdm9pZCB2b3J0ZXhfc3BkaWZfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHNwZGlmX3NyLCBpbnQgc3BkaWZfbW9kZSkKK3sKKwlpbnQgaSwgdGhpc18zOCA9IDAsIHRoaXNfMDQgPSAwLCB0aGlzXzA4ID0gMCwgdGhpc18wYyA9IDA7CisKKwkvKiBDQXNwNFNwZGlmOjpJbml0aWFsaXplU3BkaWZIYXJkd2FyZSh2b2lkKSAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1BESUZfRkxBR1MsCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9TUERJRl9GTEFHUykgJiAweGZmZjNmZmZkKTsKKwkvL2ZvciAoaT0weDI5MUQ0OyBpPDB4MjkyMDA7IGkrPTQpCisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1BESUZfQ0ZHMSArIChpIDw8IDIpLCAwKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI5MTkwLCBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI5MTkwKSB8IDB4YzAwMDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ09ERUNfRU4sCisJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DT0RFQ19FTikgfCBFTl9TUERJRik7CisKKwkvKiBDQXNwNFNwZGlmOjpQcm9ncmFtU1JDSW5IYXJkd2FyZShlbnVtICBTUERJRl9TUixlbnVtICBTUERJRk1PREUpICovCisJaWYgKHRoaXNfMDQgJiYgdGhpc18wOCkgeworCQlpbnQgZWRpOworCisJCWkgPSAoKCgweDVEQzAwMDAwIC8gc3BkaWZfc3IpICsgMSkgPj4gMSk7CisJCWlmIChpID4gMHg4MDApIHsKKwkJCWlmIChpIDwgMHgxZmZmZikKKwkJCQllZGkgPSAoaSA+PiAxKTsKKwkJCWVsc2UKKwkJCQllZGkgPSAweDFmZmZmOworCQl9IGVsc2UgeworCQkJaSA9IGVkaSA9IDB4ODAwOworCQl9CisJCS8qIHRoaXNfMDQgYW5kIHRoaXNfMDggYXJlIHRoZSBDQVNwNFNyYydzIChzYW1wbGVyYXRlIGNvbnZlcnRlcnMpICovCisJCXZvcnRleF9zcmNfc2V0dXBjaGFubmVsKHZvcnRleCwgdGhpc18wNCwgZWRpLCAwLCAxLAorCQkJCQl0aGlzXzBjLCAxLCAwLCBlZGksIDEpOworCQl2b3J0ZXhfc3JjX3NldHVwY2hhbm5lbCh2b3J0ZXgsIHRoaXNfMDgsIGVkaSwgMCwgMSwKKwkJCQkJdGhpc18wYywgMSwgMCwgZWRpLCAxKTsKKwl9CisKKwlpID0gc3BkaWZfc3I7CisJc3BkaWZfc3IgfD0gMHg4YzsKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDMyMDAwOgorCQl0aGlzXzM4ICY9IDB4RkZGRkZGRkU7CisJCXRoaXNfMzggJj0gMHhGRkZGRkZGRDsKKwkJdGhpc18zOCAmPSAweEYzRkZGRkZGOworCQl0aGlzXzM4IHw9IDB4MDMwMDAwMDA7CS8qIHNldCAzMmtoeiBzYW1wbGVyYXRlICovCisJCXRoaXNfMzggJj0gMHhGRkZGRkYzRjsKKwkJc3BkaWZfc3IgJj0gMHhGRkZGRkZGRDsKKwkJc3BkaWZfc3IgfD0gMTsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJdGhpc18zOCAmPSAweEZGRkZGRkZFOworCQl0aGlzXzM4ICY9IDB4RkZGRkZGRkQ7CisJCXRoaXNfMzggJj0gMHhGMEZGRkZGRjsKKwkJdGhpc18zOCB8PSAweDAzMDAwMDAwOworCQl0aGlzXzM4ICY9IDB4RkZGRkZGM0Y7CisJCXNwZGlmX3NyICY9IDB4RkZGRkZGRkM7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWlmIChzcGRpZl9tb2RlID09IDEpIHsKKwkJCXRoaXNfMzggJj0gMHhGRkZGRkZGRTsKKwkJCXRoaXNfMzggJj0gMHhGRkZGRkZGRDsKKwkJCXRoaXNfMzggJj0gMHhGMkZGRkZGRjsKKwkJCXRoaXNfMzggfD0gMHgwMjAwMDAwMDsJLyogc2V0IDQ4a2h6IHNhbXBsZXJhdGUgKi8KKwkJCXRoaXNfMzggJj0gMHhGRkZGRkYzRjsKKwkJfSBlbHNlIHsKKwkJCS8qIEouIEdvcmRvbiBXb2xmZTogSSB0aGluayB0aGlzIHN0dWZmIGlzIGZvciBBQzMgKi8KKwkJCXRoaXNfMzggfD0gMHgwMDAwMDAwMzsKKwkJCXRoaXNfMzggJj0gMHhGRkZGRkZCRjsKKwkJCXRoaXNfMzggfD0gMHg4MDsKKwkJfQorCQlzcGRpZl9zciB8PSAyOworCQlzcGRpZl9zciAmPSAweEZGRkZGRkZFOworCQlicmVhazsKKworCX0KKwkvKiBsb29rcyBsaWtlIHRoZSBuZXh0IDIgbGluZXMgdHJhbnNmZXIgYSAxNi1iaXQgdmFsdWUgaW50byAyIDgtYml0IAorCSAgIHJlZ2lzdGVycy4gc2VlbXMgdG8gYmUgZm9yIHRoZSBzdGFuZGFyZCBJRUMvU1BESUYgaW5pdGlhbGl6YXRpb24gCisJICAgc3R1ZmYgKi8KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NQRElGX0NGRzAsIHRoaXNfMzggJiAweGZmZmYpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfU1BESUZfQ0ZHMSwgdGhpc18zOCA+PiAweDEwKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1NQRElGX1NNUFJBVEUsIHNwZGlmX3NyKTsKK30KKworLyogSW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIGludCB2b3J0ZXhfY29yZV9pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworCisJcHJpbnRrKEtFUk5fSU5GTyAiVm9ydGV4OiBpbml0Li4uLiAiKTsKKwkvKiBIYXJkd2FyZSBJbml0LiAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCwgMHhmZmZmZmZmZik7CisJbXNsZWVwKDUpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCwKKwkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYgMHhmZmRmZmZmZik7CisJbXNsZWVwKDUpOworCS8qIFJlc2V0IElSUSBmbGFncyAqLworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX1NPVVJDRSwgMHhmZmZmZmZmZik7CisJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9TVEFUKTsKKworCXZvcnRleF9jb2RlY19pbml0KHZvcnRleCk7CisKKyNpZmRlZiBDSElQX0FVODgzMAorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCwKKwkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpIHwgMHgxMDAwMDAwKTsKKyNlbmRpZgorCisJLyogSW5pdCBhdWRpbyBlbmdpbmUuICovCisJdm9ydGV4X2FkYmRtYV9pbml0KHZvcnRleCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9FTkdJTkVfQ1RSTCwgMHgwKTsJLy8sIDB4YzgzYzdlNTgsIDB4YzVmOTNlNTgKKwl2b3J0ZXhfYWRiX2luaXQodm9ydGV4KTsKKwkvKiBJbml0IHByb2Nlc3NpbmcgYmxvY2tzLiAqLworCXZvcnRleF9maWZvX2luaXQodm9ydGV4KTsKKwl2b3J0ZXhfbWl4ZXJfaW5pdCh2b3J0ZXgpOworCXZvcnRleF9zcmNibG9ja19pbml0KHZvcnRleCk7CisjaWZuZGVmIENISVBfQVU4ODIwCisJdm9ydGV4X2VxX2luaXQodm9ydGV4KTsKKwl2b3J0ZXhfc3BkaWZfaW5pdCh2b3J0ZXgsIDQ4MDAwLCAxKTsKKwl2b3J0ZXhfVm9ydDNEKHZvcnRleCwgMSk7CisjZW5kaWYKKyNpZm5kZWYgQ0hJUF9BVTg4MTAKKwl2b3J0ZXhfd3RfaW5pdCh2b3J0ZXgpOworI2VuZGlmCisJLy8gTW92ZWQgdG8gYXU4OHgwLmMKKwkvL3ZvcnRleF9jb25uZWN0X2RlZmF1bHQodm9ydGV4LCAxKTsKKworCXZvcnRleF9zZXR0aW1lcih2b3J0ZXgsIDB4OTApOworCS8vIEVuYWJsZSBJbnRlcnJ1cHRzLgorCS8vIHZvcnRleF9lbmFibGVfaW50KCkgbXVzdCBiZSBmaXJzdCAhIQorCS8vICBod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9DVFJMLCAwKTsKKwkvLyB2b3J0ZXhfZW5hYmxlX2ludCh2b3J0ZXgpOworCS8vdm9ydGV4X2VuYWJsZV90aW1lcl9pbnQodm9ydGV4KTsKKwkvL3ZvcnRleF9kaXNhYmxlX3RpbWVyX2ludCh2b3J0ZXgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZG9uZS5cbiIpOworCXNwaW5fbG9ja19pbml0KCZ2b3J0ZXgtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X2NvcmVfc2h1dGRvd24odm9ydGV4X3QgKiB2b3J0ZXgpCit7CisKKwlwcmludGsoS0VSTl9JTkZPICJWb3J0ZXg6IHNodXRkb3duLi4uIik7CisjaWZuZGVmIENISVBfQVU4ODIwCisJdm9ydGV4X2VxX2ZyZWUodm9ydGV4KTsKKwl2b3J0ZXhfVm9ydDNEKHZvcnRleCwgMCk7CisjZW5kaWYKKwkvL3ZvcnRleF9kaXNhYmxlX3RpbWVyX2ludCh2b3J0ZXgpOworCXZvcnRleF9kaXNhYmxlX2ludCh2b3J0ZXgpOworCXZvcnRleF9jb25uZWN0X2RlZmF1bHQodm9ydGV4LCAwKTsKKwkvKiBSZXNldCBhbGwgRE1BIGZpZm9zLiAqLworCXZvcnRleF9maWZvX2luaXQodm9ydGV4KTsKKwkvKiBFcmFzZSBhbGwgYXVkaW8gcm91dGVzLiAqLworCXZvcnRleF9hZGJfaW5pdCh2b3J0ZXgpOworCisJLyogRGlzYWJsZSBNUFU0MDEgKi8KKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX0NUUkwsIGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9JUlFfQ1RSTCkgJiB+SVJRX01JREkpOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLCBod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCkgJiB+Q1RSTF9NSURJX0VOKTsKKworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX0NUUkwsIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCwgMCk7CisJbXNsZWVwKDUpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX1NPVVJDRSwgMHhmZmZmKTsKKworCXByaW50ayhLRVJOX0lORk8gImRvbmUuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogQWxzYSBzdXBwb3J0LiAqLworCitzdGF0aWMgaW50IHZvcnRleF9hbHNhZm10X2FzcGZtdChpbnQgYWxzYWZtdCkKK3sKKwlpbnQgZm10OworCisJc3dpdGNoIChhbHNhZm10KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1U4OgorCQlmbXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9NVV9MQVc6CisJCWZtdCA9IDB4MjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX0FfTEFXOgorCQlmbXQgPSAweDM7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TUEVDSUFMOgorCQlmbXQgPSAweDQ7CS8qIGd1ZXNzLiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0xFOgorCQlmbXQgPSAweDU7CS8qIGd1ZXNzLiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlmbXQgPSAweDg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfQkU6CisJCWZtdCA9IDB4OTsJLyogY2hlY2sgdGhpcy4uLiAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbXQgPSAweDg7CisJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBmb3JtYXQgdW5zdXBwb3J0ZWQgJWRcbiIsIGFsc2FmbXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZtdDsKK30KKworLyogU29tZSBub3QgeWV0IHVzZWZ1bCB0cmFuc2xhdGlvbnMuICovCisjaWYgMAordHlwZWRlZiBlbnVtIHsKKwlBU1BGTVRMSU5FQVIxNiA9IDAsCS8qIDB4OCAqLworCUFTUEZNVExJTkVBUjgsCQkvKiAweDEgKi8KKwlBU1BGTVRVTEFXLAkJLyogMHgyICovCisJQVNQRk1UQUxBVywJCS8qIDB4MyAqLworCUFTUEZNVFNQT1JULAkJLyogPyAqLworCUFTUEZNVFNQRElGLAkJLyogPyAqLworfSBBU1BFTkNPRElORzsKKworc3RhdGljIGludAordm9ydGV4X3RyYW5zbGF0ZWZvcm1hdCh2b3J0ZXhfdCAqIHZvcnRleCwgY2hhciBiaXRzLCBjaGFyIG5jaCwgaW50IGVuY29kKQoreworCWludCBhLCB0aGlzXzE5NDsKKworCWlmICgoYml0cyAhPSA4KSB8fCAoYml0cyAhPSAxNikpCisJCXJldHVybiAtMTsKKworCXN3aXRjaCAoZW5jb2QpIHsKKwljYXNlIDA6CisJCWlmIChiaXRzID09IDB4MTApCisJCQlhID0gODsJLy8gMTYgYml0CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKGJpdHMgPT0gOCkKKwkJCWEgPSAxOwkvLyA4IGJpdAorCQlicmVhazsKKwljYXNlIDI6CisJCWEgPSAyOwkJLy8gVV9MQVcKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhID0gMzsJCS8vIEFfTEFXCisJCWJyZWFrOworCX0KKwlzd2l0Y2ggKG5jaCkgeworCWNhc2UgMToKKwkJdGhpc18xOTQgPSAwOworCQlicmVhazsKKwljYXNlIDI6CisJCXRoaXNfMTk0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0aGlzXzE5NCA9IDE7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdGhpc18xOTQgPSAxOworCQlicmVhazsKKwl9CisJcmV0dXJuIChhKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2NkbWFjb3JlX3NldGZvcm1hdCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGJpdHMsIGludCBuY2gpCit7CisJc2hvcnQgaW50IGQsIHRoaXNfMTQ4OworCisJZCA9ICgoYml0cyA+PiAzKSAqIG5jaCk7CisJdGhpc18xNDggPSAweGJiODAgLyBkOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9lcS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I0N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZXEuYwpAQCAtMCwwICsxLDkzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBhdTg4eDBfZXEuYworICogIEF1cmVhbCBWb3J0ZXggSGFyZHdhcmUgRVEgY29udHJvbC9hY2Nlc3MuCisgKgorICogIFN1biBKdW4gIDggMTg6MTk6MTkgMjAwMworICogIDIwMDMgIE1hbnVlbCBKYW5kZXIgKG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0KQorICogIAorICogIDAyIEp1bHkgMjAwMzogRmlyc3QgdGltZSBzb21ldGhpbmcgd29ya3MgOikKKyAqICBOb3ZlbWJlciAyMDAzOiBBM0QgQnlwYXNzIGNvZGUgY29tcGxldGVkIGJ1dCB1bnRlc3RlZC4KKyAqCisgKiAgVE9ETzoKKyAqICAgICAtIERlYnVnICh0ZXN0aW5nKQorICogICAgIC0gVGVzdCBwZWFrIHZpc3VhbGl6YXRpb24gc3VwcG9ydC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qCisgVGhlIEF1cmVhbCBIYXJkd2FyZSBFUSBpcyBmb3VuZCBvbiBBVTg4MTAgYW5kIEFVODgzMCBjaGlwcyBvbmx5LgorIGl0IGhhcyA0IGlucHV0cyAoMiBmb3IgZ2VuZXJhbCBtaXgsIDIgZm9yIEEzRCkgYW5kIDIgb3V0cHV0cyAoc3VwcG9zZWQgCisgdG8gYmUgcm91dGVkIHRvIHRoZSBjb2RlYykuCisqLworCisjaW5jbHVkZSAiYXU4OHgwLmgiCisjaW5jbHVkZSAiYXU4OHgwX2VxLmgiCisjaW5jbHVkZSAiYXU4OHgwX2VxZGF0YS5jIgorCisjZGVmaW5lIFZPUlRFWF9FUV9CQVNFCSAweDJiMDAwCisjZGVmaW5lIFZPUlRFWF9FUV9ERVNUICAgKFZPUlRFWF9FUV9CQVNFICsgMHg0MTApCisjZGVmaW5lIFZPUlRFWF9FUV9TT1VSQ0UgKFZPUlRFWF9FUV9CQVNFICsgMHg0MzApCisjZGVmaW5lIFZPUlRFWF9FUV9DVFJMICAgKFZPUlRFWF9FUV9CQVNFICsgMHg0NDApCisKKyNkZWZpbmUgVk9SVEVYX0JBTkRfQ09FRkZfU0laRSAweDMwCisKKy8qIENFcUh3LnMgKi8KK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X1NldFRpbWVDb25zdHModm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBnYWluLCB1MTYgbGV2ZWwpCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzYzQsIGdhaW4pOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2M4LCBsZXZlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNpZ25faW52ZXJ0KHUxNiBhKQoreworCS8qIC0oLTMyNzY4KSAtPiAtMzI3Njggc28gd2UgZG8gLSgtMzI3NjgpIC0+IDMyNzY3IHRvIG1ha2UgdGhlIHJlc3VsdCBwb3NpdGl2ZSAqLworCWlmIChhID09ICh1MTYpLTMyNzY4KQorCQlyZXR1cm4gMzI3Njc7CisJZWxzZQorCQlyZXR1cm4gLWE7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X1NldExlZnRDb2Vmcyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGNvZWZzW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGkgPSAwLCBuIC8qZXNwMmMgKi87CisKKwlmb3IgKG4gPSAwOyBuIDwgZXFody0+dGhpczA0OyBuKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMDAgKyBuICogMHgzMCwgY29lZnNbaSArIDBdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMDQgKyBuICogMHgzMCwgY29lZnNbaSArIDFdKTsKKworCQlpZiAoZXFody0+dGhpczA4ID09IDApIHsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMDA4ICsgbiAqIDB4MzAsIGNvZWZzW2kgKyAyXSk7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjAwYyArIG4gKiAweDMwLCBjb2Vmc1tpICsgM10pOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMTAgKyBuICogMHgzMCwgY29lZnNbaSArIDRdKTsKKwkJfSBlbHNlIHsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMDA4ICsgbiAqIDB4MzAsIHNpZ25faW52ZXJ0KGNvZWZzWzIgKyBpXSkpOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMGMgKyBuICogMHgzMCwgc2lnbl9pbnZlcnQoY29lZnNbMyArIGldKSk7CisJCSAgICAgICAgaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMTAgKyBuICogMHgzMCwgc2lnbl9pbnZlcnQoY29lZnNbNCArIGldKSk7CisJCX0KKwkJaSArPSA1OworCX0KK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0UmlnaHRDb2Vmcyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGNvZWZzW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGkgPSAwLCBuIC8qZXNwMmMgKi87CisKKwlmb3IgKG4gPSAwOyBuIDwgZXFody0+dGhpczA0OyBuKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZTAgKyBuICogMHgzMCwgY29lZnNbMCArIGldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZTQgKyBuICogMHgzMCwgY29lZnNbMSArIGldKTsKKworCQlpZiAoZXFody0+dGhpczA4ID09IDApIHsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMWU4ICsgbiAqIDB4MzAsIGNvZWZzWzIgKyBpXSk7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjFlYyArIG4gKiAweDMwLCBjb2Vmc1szICsgaV0pOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZjAgKyBuICogMHgzMCwgY29lZnNbNCArIGldKTsKKwkJfSBlbHNlIHsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMWU4ICsgbiAqIDB4MzAsIHNpZ25faW52ZXJ0KGNvZWZzWzIgKyBpXSkpOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZWMgKyBuICogMHgzMCwgc2lnbl9pbnZlcnQoY29lZnNbMyArIGldKSk7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjFmMCArIG4gKiAweDMwLCBzaWduX2ludmVydChjb2Vmc1s0ICsgaV0pKTsKKwkJfQorCQlpICs9IDU7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X1NldExlZnRTdGF0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10sIHUxNiBiW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGkgPSAwLCBlYng7CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjNmYywgYVswXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmI0MDAsIGFbMV0pOworCisJZm9yIChlYnggPSAwOyBlYnggPCBlcWh3LT50aGlzMDQ7IGVieCsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMDE0ICsgKGkgKiAweGMpLCBiW2ldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMTggKyAoaSAqIDB4YyksIGJbMSArIGldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMWMgKyAoaSAqIDB4YyksIGJbMiArIGldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMjAgKyAoaSAqIDB4YyksIGJbMyArIGldKTsKKwkJaSArPSA0OworCX0KK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0UmlnaHRTdGF0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10sIHUxNiBiW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGkgPSAwLCBlYng7CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjQwNCwgYVswXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmI0MDgsIGFbMV0pOworCisJZm9yIChlYnggPSAwOyBlYnggPCBlcWh3LT50aGlzMDQ7IGVieCsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMWY0ICsgKGkgKiAweGMpLCBiW2ldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZjggKyAoaSAqIDB4YyksIGJbMSArIGldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIxZmMgKyAoaSAqIDB4YyksIGJbMiArIGldKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIyMDAgKyAoaSAqIDB4YyksIGJbMyArIGldKTsKKwkJaSArPSA0OworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0dldFRpbWVDb25zdHModm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiAqIGEsIHUxNiAqIGIpCit7CisJKmEgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiM2M0KTsKKwkqYiA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MmIzYzgpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19HZXRMZWZ0Q29lZnModm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10pCit7CisKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfR2V0UmlnaHRDb2Vmcyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGFbXSkKK3sKKworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19HZXRMZWZ0U3RhdGVzKHZvcnRleF90ICogdm9ydGV4LCB1MTYgKiBhLCB1MTYgYltdKQoreworCit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0dldFJpZ2h0U3RhdGVzKHZvcnRleF90ICogdm9ydGV4LCB1MTYgKiBhLCB1MTYgYltdKQoreworCit9CisKKyNlbmRpZgorLyogTWl4IEdhaW5zICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19TZXRCeXBhc3NHYWluKHZvcnRleF90ICogdm9ydGV4LCB1MTYgYSwgdTE2IGIpCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaWYgKGVxaHctPnRoaXMwOCA9PSAwKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2Q0LCBhKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzZWMsIGIpOworCX0gZWxzZSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2Q0LCBzaWduX2ludmVydChhKSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2VjLCBzaWduX2ludmVydChiKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19TZXRBM0RCeXBhc3NHYWluKHZvcnRleF90ICogdm9ydGV4LCB1MTYgYSwgdTE2IGIpCit7CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjNlMCwgYSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzZjgsIGIpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0Q3VyckJ5cGFzc0dhaW4odm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhLCB1MTYgYikKK3sKKworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2QwLCBhKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjNlOCwgYik7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X1NldEN1cnJBM0RCeXBhc3NHYWluKHZvcnRleF90ICogdm9ydGV4LCB1MTYgYSwgdTE2IGIpCit7CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjNkYywgYSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzZjQsIGIpOworfQorCisjZW5kaWYKK3N0YXRpYyB2b2lkCit2b3J0ZXhfRXFId19TZXRMZWZ0R2FpbnNTaW5nbGVUYXJnZXQodm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBpbmRleCwgdTE2IGIpCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIwMmMgKyAoaW5kZXggKiAweDMwKSwgYik7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zU2luZ2xlVGFyZ2V0KHZvcnRleF90ICogdm9ydGV4LCB1MTYgaW5kZXgsIHUxNiBiKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMjBjICsgKGluZGV4ICogMHgzMCksIGIpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19TZXRMZWZ0R2FpbnNUYXJnZXQodm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGVieDsKKworCWZvciAoZWJ4ID0gMDsgZWJ4IDwgZXFody0+dGhpczA0OyBlYngrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjAyYyArIGVieCAqIDB4MzAsIGFbZWJ4XSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zVGFyZ2V0KHZvcnRleF90ICogdm9ydGV4LCB1MTYgYVtdKQoreworCWVxaHdfdCAqZXFodyA9ICYodm9ydGV4LT5lcS50aGlzMDQpOworCWludCBlYng7CisKKwlmb3IgKGVieCA9IDA7IGVieCA8IGVxaHctPnRoaXMwNDsgZWJ4KyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIyMGMgKyBlYnggKiAweDMwLCBhW2VieF0pOworCX0KK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0TGVmdEdhaW5zQ3VycmVudCh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGFbXSkKK3sKKwllcWh3X3QgKmVxaHcgPSAmKHZvcnRleC0+ZXEudGhpczA0KTsKKwlpbnQgZWJ4OworCisJZm9yIChlYnggPSAwOyBlYnggPCBlcWh3LT50aGlzMDQ7IGVieCsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMDI4ICsgZWJ4ICogMHgzMCwgYVtlYnhdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X1NldFJpZ2h0R2FpbnNDdXJyZW50KHZvcnRleF90ICogdm9ydGV4LCB1MTYgYVtdKQoreworCWVxaHdfdCAqZXFodyA9ICYodm9ydGV4LT5lcS50aGlzMDQpOworCWludCBlYng7CisKKwlmb3IgKGVieCA9IDA7IGVieCA8IGVxaHctPnRoaXMwNDsgZWJ4KyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIyMDggKyBlYnggKiAweDMwLCBhW2VieF0pOworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0dldExlZnRHYWluc1RhcmdldCh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGFbXSkKK3sKKwllcWh3X3QgKmVxaHcgPSAmKHZvcnRleC0+ZXEudGhpczA0KTsKKwlpbnQgZWJ4ID0gMDsKKworCWlmIChlcWh3LT50aGlzMDQgPCAwKQorCQlyZXR1cm47CisKKwlkbyB7CisJCWFbZWJ4XSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MmIwMmMgKyBlYnggKiAweDMwKTsKKwkJZWJ4Kys7CisJfQorCXdoaWxlIChlYnggPCBlcWh3LT50aGlzMDQpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19HZXRSaWdodEdhaW5zVGFyZ2V0KHZvcnRleF90ICogdm9ydGV4LCB1MTYgYVtdKQoreworCWVxaHdfdCAqZXFodyA9ICYodm9ydGV4LT5lcS50aGlzMDQpOworCWludCBlYnggPSAwOworCisJaWYgKGVxaHctPnRoaXMwNCA8IDApCisJCXJldHVybjsKKworCWRvIHsKKwkJYVtlYnhdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyYjIwYyArIGVieCAqIDB4MzApOworCQllYngrKzsKKwl9CisJd2hpbGUgKGVieCA8IGVxaHctPnRoaXMwNCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0dldExlZnRHYWluc0N1cnJlbnQodm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGVieCA9IDA7CisKKwlpZiAoZXFody0+dGhpczA0IDwgMCkKKwkJcmV0dXJuOworCisJZG8geworCQlhW2VieF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiMDI4ICsgZWJ4ICogMHgzMCk7CisJCWVieCsrOworCX0KKwl3aGlsZSAoZWJ4IDwgZXFody0+dGhpczA0KTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfR2V0UmlnaHRHYWluc0N1cnJlbnQodm9ydGV4X3QgKiB2b3J0ZXgsIHUxNiBhW10pCit7CisJZXFod190ICplcWh3ID0gJih2b3J0ZXgtPmVxLnRoaXMwNCk7CisJaW50IGVieCA9IDA7CisKKwlpZiAoZXFody0+dGhpczA0IDwgMCkKKwkJcmV0dXJuOworCisJZG8geworCQlhW2VieF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiMjA4ICsgZWJ4ICogMHgzMCk7CisJCWVieCsrOworCX0KKwl3aGlsZSAoZWJ4IDwgZXFody0+dGhpczA0KTsKK30KKworI2VuZGlmCisvKiBFUSBiYW5kIGxldmVscyBzZXR0aW5ncyAqLworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0TGV2ZWxzKHZvcnRleF90ICogdm9ydGV4LCB1MTYgcGVha3NbXSkKK3sKKwllcWh3X3QgKmVxaHcgPSAmKHZvcnRleC0+ZXEudGhpczA0KTsKKwlpbnQgaTsKKworCS8qIHNldCBsZWZ0IHBlYWtzICovCisJZm9yIChpID0gMDsgaSA8IGVxaHctPnRoaXMwNDsgaSsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiMDI0ICsgaSAqIFZPUlRFWF9CQU5EX0NPRUZGX1NJWkUsIHBlYWtzW2ldKTsKKwl9CisKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjNjYywgcGVha3NbZXFody0+dGhpczA0XSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzZDgsIHBlYWtzW2VxaHctPnRoaXMwNCArIDFdKTsKKworCS8qIHNldCByaWdodCBwZWFrcyAqLworCWZvciAoaSA9IDA7IGkgPCBlcWh3LT50aGlzMDQ7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjIwNCArIGkgKiBWT1JURVhfQkFORF9DT0VGRl9TSVpFLAorCQkJcGVha3NbaSArIChlcWh3LT50aGlzMDQgKyAyKV0pOworCX0KKworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2U0LCBwZWFrc1syICsgKGVxaHctPnRoaXMwNCAqIDIpXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MmIzZjAsIHBlYWtzWzMgKyAoZXFody0+dGhpczA0ICogMildKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0dldExldmVscyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGFbXSkKK3sKKwllcWh3X3QgKmVxaHcgPSAmKHZvcnRleC0+ZXEudGhpczA0KTsKKwlpbnQgZWJ4OworCisJaWYgKGVxaHctPnRoaXMwNCA8IDApCisJCXJldHVybjsKKworCWVieCA9IDA7CisJZG8geworCQlhW2VieF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiMDI0ICsgZWJ4ICogMHgzMCk7CisJCWVieCsrOworCX0KKwl3aGlsZSAoZWJ4IDwgZXFody0+dGhpczA0KTsKKworCWFbZXFody0+dGhpczA0XSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MmIzY2MpOworCWFbZXFody0+dGhpczA0ICsgMV0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiM2Q4KTsKKworCWVieCA9IDA7CisJZG8geworCQlhW2VieCArIChlcWh3LT50aGlzMDQgKyAyKV0gPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyYjIwNCArIGVieCAqIDB4MzApOworCQllYngrKzsKKwl9CisJd2hpbGUgKGVieCA8IGVxaHctPnRoaXMwNCk7CisKKwlhWzIgKyAoZXFody0+dGhpczA0ICogMildID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyYjNlNCk7CisJYVszICsgKGVxaHctPnRoaXMwNCAqIDIpXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MmIzZjApOworfQorCisjZW5kaWYKKy8qIEdsb2JhbCBDb250cm9sICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19TZXRDb250cm9sUmVnKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyYjQ0MCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfU2V0U2FtcGxlUmF0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHNyKQoreworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiNDQwLCAoKHNyICYgMHgxZikgPDwgMykgfCAweGI4MDApOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfR2V0Q29udHJvbFJlZyh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgbG9uZyAqcmVnKQoreworCSpyZWcgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJiNDQwKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfR2V0U2FtcGxlUmF0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50ICpzcikKK3sKKwkqc3IgPSAoaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyYjQ0MCkgPj4gMykgJiAweDFmOworfQorCisjZW5kaWYKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0VuYWJsZSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0VRX0NUUkwsIDB4ZjAwMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcUh3X0Rpc2FibGUodm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9FUV9DVFJMLCAweGYwMDApOworfQorCisvKiBSZXNldCAoemVybykgYnVmZmVycyAqLworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfWmVyb0lPKHZvcnRleF90ICogdm9ydGV4KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAweDg7IGkrKykKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9FUV9ERVNUICsgKGkgPDwgMiksIDB4MCk7CisJZm9yIChpID0gMDsgaSA8IDB4NDsgaSsrKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0VRX1NPVVJDRSArIChpIDw8IDIpLCAweDApOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19aZXJvQTNESU8odm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDB4NDsgaSsrKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0VRX0RFU1QgKyAoaSA8PCAyKSwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxSHdfWmVyb1N0YXRlKHZvcnRleF90ICogdm9ydGV4KQoreworCisJdm9ydGV4X0VxSHdfU2V0Q29udHJvbFJlZyh2b3J0ZXgsIDApOworCXZvcnRleF9FcUh3X1plcm9JTyh2b3J0ZXgpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDJiM2MwLCAwKTsKKworCXZvcnRleF9FcUh3X1NldFRpbWVDb25zdHModm9ydGV4LCAwLCAwKTsKKworCXZvcnRleF9FcUh3X1NldExlZnRDb2Vmcyh2b3J0ZXgsIGFzRXFDb2Vmc1plcm9zKTsKKwl2b3J0ZXhfRXFId19TZXRSaWdodENvZWZzKHZvcnRleCwgYXNFcUNvZWZzWmVyb3MpOworCisJdm9ydGV4X0VxSHdfU2V0TGVmdEdhaW5zQ3VycmVudCh2b3J0ZXgsIGVxX2dhaW5zX3plcm8pOworCXZvcnRleF9FcUh3X1NldFJpZ2h0R2FpbnNDdXJyZW50KHZvcnRleCwgZXFfZ2FpbnNfemVybyk7CisJdm9ydGV4X0VxSHdfU2V0TGVmdEdhaW5zVGFyZ2V0KHZvcnRleCwgZXFfZ2FpbnNfemVybyk7CisJdm9ydGV4X0VxSHdfU2V0UmlnaHRHYWluc1RhcmdldCh2b3J0ZXgsIGVxX2dhaW5zX3plcm8pOworCisJdm9ydGV4X0VxSHdfU2V0QnlwYXNzR2Fpbih2b3J0ZXgsIDAsIDApOworCS8vdm9ydGV4X0VxSHdfU2V0Q3VyckJ5cGFzc0dhaW4odm9ydGV4LCAwLCAwKTsKKwl2b3J0ZXhfRXFId19TZXRBM0RCeXBhc3NHYWluKHZvcnRleCwgMCwgMCk7CisJLy92b3J0ZXhfRXFId19TZXRDdXJyQTNEQnlwYXNzR2Fpbih2b3J0ZXgsIDAsIDApOworCXZvcnRleF9FcUh3X1NldExlZnRTdGF0ZXModm9ydGV4LCBlcV9zdGF0ZXNfemVybywgYXNFcU91dFN0YXRlWmVyb3MpOworCXZvcnRleF9FcUh3X1NldFJpZ2h0U3RhdGVzKHZvcnRleCwgZXFfc3RhdGVzX3plcm8sIGFzRXFPdXRTdGF0ZVplcm9zKTsKKwl2b3J0ZXhfRXFId19TZXRMZXZlbHModm9ydGV4LCAodTE2ICopIGVxX2xldmVscyk7Cit9CisKKy8qIFByb2dyYW0gY29lZmljaWVudHMgYXMgcGFzcyB0aHJvdWdoICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19Qcm9ncmFtUGlwZSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwl2b3J0ZXhfRXFId19TZXRUaW1lQ29uc3RzKHZvcnRleCwgMCwgMCk7CisKKwl2b3J0ZXhfRXFId19TZXRMZWZ0Q29lZnModm9ydGV4LCBhc0VxQ29lZnNQaXBlcyk7CisJdm9ydGV4X0VxSHdfU2V0UmlnaHRDb2Vmcyh2b3J0ZXgsIGFzRXFDb2Vmc1BpcGVzKTsKKworCXZvcnRleF9FcUh3X1NldExlZnRHYWluc0N1cnJlbnQodm9ydGV4LCBlcV9nYWluc19jdXJyZW50KTsKKwl2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zQ3VycmVudCh2b3J0ZXgsIGVxX2dhaW5zX2N1cnJlbnQpOworCXZvcnRleF9FcUh3X1NldExlZnRHYWluc1RhcmdldCh2b3J0ZXgsIGVxX2dhaW5zX2N1cnJlbnQpOworCXZvcnRleF9FcUh3X1NldFJpZ2h0R2FpbnNUYXJnZXQodm9ydGV4LCBlcV9nYWluc19jdXJyZW50KTsKK30KKworLyogUHJvZ3JhbSBFUSBibG9jayBhcyAxMCBiYW5kIEVxdWFsaXplciAqLworc3RhdGljIHZvaWQKK3ZvcnRleF9FcUh3X1Byb2dyYW0xMEJhbmQodm9ydGV4X3QgKiB2b3J0ZXgsIGF1eHhFcUNvZWZmU2V0X3QgKiBjb2Vmc2V0KQoreworCisJdm9ydGV4X0VxSHdfU2V0VGltZUNvbnN0cyh2b3J0ZXgsIDB4YywgMHg3ZmUwKTsKKworCXZvcnRleF9FcUh3X1NldExlZnRDb2Vmcyh2b3J0ZXgsIGNvZWZzZXQtPkxlZnRDb2Vmcyk7CisJdm9ydGV4X0VxSHdfU2V0UmlnaHRDb2Vmcyh2b3J0ZXgsIGNvZWZzZXQtPlJpZ2h0Q29lZnMpOworCisJdm9ydGV4X0VxSHdfU2V0TGVmdEdhaW5zQ3VycmVudCh2b3J0ZXgsIGNvZWZzZXQtPkxlZnRHYWlucyk7CisKKwl2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zVGFyZ2V0KHZvcnRleCwgY29lZnNldC0+UmlnaHRHYWlucyk7CisJdm9ydGV4X0VxSHdfU2V0TGVmdEdhaW5zVGFyZ2V0KHZvcnRleCwgY29lZnNldC0+TGVmdEdhaW5zKTsKKworCXZvcnRleF9FcUh3X1NldFJpZ2h0R2FpbnNDdXJyZW50KHZvcnRleCwgY29lZnNldC0+UmlnaHRHYWlucyk7Cit9CisKKy8qIFJlYWQgYWxsIEVRIHBlYWtzLiAodGhpbmsgVlUgbWV0ZXIpICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFId19HZXRUZW5CYW5kTGV2ZWxzKHZvcnRleF90ICogdm9ydGV4LCB1MTYgcGVha3NbXSkKK3sKKwllcWh3X3QgKmVxaHcgPSAmKHZvcnRleC0+ZXEudGhpczA0KTsKKwlpbnQgaTsKKworCWlmIChlcWh3LT50aGlzMDQgPD0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGVxaHctPnRoaXMwNDsgaSsrKQorCQlwZWFrc1tpXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MkIwMjQgKyBpICogMHgzMCk7CisJZm9yIChpID0gMDsgaSA8IGVxaHctPnRoaXMwNDsgaSsrKQorCQlwZWFrc1tpICsgZXFody0+dGhpczA0XSA9CisJCSAgICBod3JlYWQodm9ydGV4LT5tbWlvLCAweDJCMjA0ICsgaSAqIDB4MzApOworfQorCisvKiBDRXFsenIucyAqLworCitzdGF0aWMgaW50IHZvcnRleF9FcWx6cl9HZXRMZWZ0R2Fpbih2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGluZGV4LCB1MTYgKiBnYWluKQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKworCWlmIChlcS0+dGhpczI4KSB7CisJCSpnYWluID0gZXEtPnRoaXMxMzBbaW5kZXhdOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcWx6cl9TZXRMZWZ0R2Fpbih2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGluZGV4LCB1MTYgZ2FpbikKK3sKKwllcWx6cl90ICplcSA9ICYodm9ydGV4LT5lcSk7CisKKwlpZiAoZXEtPnRoaXMyOCA9PSAwKQorCQlyZXR1cm47CisKKwllcS0+dGhpczEzMFtpbmRleF0gPSBnYWluOworCWlmIChlcS0+dGhpczU0KQorCQlyZXR1cm47CisKKwl2b3J0ZXhfRXFId19TZXRMZWZ0R2FpbnNTaW5nbGVUYXJnZXQodm9ydGV4LCBpbmRleCwgZ2Fpbik7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X0VxbHpyX0dldFJpZ2h0R2Fpbih2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGluZGV4LCB1MTYgKiBnYWluKQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKworCWlmIChlcS0+dGhpczI4KSB7CisJCSpnYWluID0gZXEtPnRoaXMxMzBbaW5kZXggKyBlcS0+dGhpczEwXTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFsenJfU2V0UmlnaHRHYWluKHZvcnRleF90ICogdm9ydGV4LCB1MTYgaW5kZXgsIHUxNiBnYWluKQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKworCWlmIChlcS0+dGhpczI4ID09IDApCisJCXJldHVybjsKKworCWVxLT50aGlzMTMwW2luZGV4ICsgZXEtPnRoaXMxMF0gPSBnYWluOworCWlmIChlcS0+dGhpczU0KQorCQlyZXR1cm47CisKKwl2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zU2luZ2xlVGFyZ2V0KHZvcnRleCwgaW5kZXgsIGdhaW4pOworfQorCisjaWYgMAorc3RhdGljIGludAordm9ydGV4X0VxbHpyX0dldEFsbEJhbmRzKHZvcnRleF90ICogdm9ydGV4LCB1MTYgKiBnYWlucywgdW5zaWduZWQgbG9uZyAqY250KQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKwlpbnQgc2kgPSAwOworCisJaWYgKGVxLT50aGlzMTAgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwl7CisJCWlmICh2b3J0ZXhfRXFsenJfR2V0TGVmdEdhaW4odm9ydGV4LCBzaSwgJmdhaW5zW3NpXSkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHZvcnRleF9FcWx6cl9HZXRSaWdodEdhaW4KKwkJICAgICh2b3J0ZXgsIHNpLCAmZ2FpbnNbc2kgKyBlcS0+dGhpczEwXSkpCisJCQlyZXR1cm4gMTsKKwkJc2krKzsKKwl9CisJd2hpbGUgKGVxLT50aGlzMTAgPiBzaSkgOworCSpjbnQgPSBzaSAqIDI7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK3N0YXRpYyBpbnQgdm9ydGV4X0VxbHpyX1NldEFsbEJhbmRzRnJvbUFjdGl2ZUNvZWZmU2V0KHZvcnRleF90ICogdm9ydGV4KQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKworCXZvcnRleF9FcUh3X1NldExlZnRHYWluc1RhcmdldCh2b3J0ZXgsIGVxLT50aGlzMTMwKTsKKwl2b3J0ZXhfRXFId19TZXRSaWdodEdhaW5zVGFyZ2V0KHZvcnRleCwgJihlcS0+dGhpczEzMFtlcS0+dGhpczEwXSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZvcnRleF9FcWx6cl9TZXRBbGxCYW5kcyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2IGdhaW5zW10sIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJZXFsenJfdCAqZXEgPSAmKHZvcnRleC0+ZXEpOworCWludCBpOworCisJaWYgKCgoZXEtPnRoaXMxMCkgKiAyICE9IGNvdW50KSB8fCAoZXEtPnRoaXMyOCA9PSAwKSkKKwkJcmV0dXJuIDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllcS0+dGhpczEzMFtpXSA9IGdhaW5zW2ldOworCX0KKwkKKwlpZiAoZXEtPnRoaXM1NCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHZvcnRleF9FcWx6cl9TZXRBbGxCYW5kc0Zyb21BY3RpdmVDb2VmZlNldCh2b3J0ZXgpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X0VxbHpyX1NldEEzZEJ5cGFzc0dhaW4odm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGxvbmcgYSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYikKK3sKKwllcWx6cl90ICplcSA9ICYodm9ydGV4LT5lcSk7CisJaW50IGVheCwgZWJ4OworCisJZXEtPnRoaXM1OCA9IGE7CisJZXEtPnRoaXM1YyA9IGI7CisJaWYgKGVxLT50aGlzNTQpCisJCWVheCA9IGVxLT50aGlzMGU7CisJZWxzZQorCQllYXggPSBlcS0+dGhpczBhOworCWVieCA9IChlYXggKiBlcS0+dGhpczU4KSA+PiAweDEwOworCWVheCA9IChlYXggKiBlcS0+dGhpczVjKSA+PiAweDEwOworCXZvcnRleF9FcUh3X1NldEEzREJ5cGFzc0dhaW4odm9ydGV4LCBlYngsIGVheCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcWx6cl9Qcm9ncmFtQTNkQnlwYXNzR2Fpbih2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwllcWx6cl90ICplcSA9ICYodm9ydGV4LT5lcSk7CisJaW50IGVheCwgZWJ4OworCisJaWYgKGVxLT50aGlzNTQpCisJCWVheCA9IGVxLT50aGlzMGU7CisJZWxzZQorCQllYXggPSBlcS0+dGhpczBhOworCWVieCA9IChlYXggKiBlcS0+dGhpczU4KSA+PiAweDEwOworCWVheCA9IChlYXggKiBlcS0+dGhpczVjKSA+PiAweDEwOworCXZvcnRleF9FcUh3X1NldEEzREJ5cGFzc0dhaW4odm9ydGV4LCBlYngsIGVheCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcWx6cl9TaHV0RG93bkEzZCh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlpZiAodm9ydGV4ICE9IE5VTEwpCisJCXZvcnRleF9FcUh3X1plcm9BM0RJTyh2b3J0ZXgpOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfRXFsenJfU2V0QnlwYXNzKHZvcnRleF90ICogdm9ydGV4LCBsb25nIGJwKQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKwkKKwlpZiAoKGVxLT50aGlzMjgpICYmIChicCA9PSAwKSkgeworCQkvKiBFUSBlbmFibGVkICovCisJCXZvcnRleF9FcWx6cl9TZXRBbGxCYW5kc0Zyb21BY3RpdmVDb2VmZlNldCh2b3J0ZXgpOworCQl2b3J0ZXhfRXFId19TZXRCeXBhc3NHYWluKHZvcnRleCwgZXEtPnRoaXMwOCwgZXEtPnRoaXMwOCk7CisJfSBlbHNlIHsKKwkJLyogRVEgZGlzYWJsZWQuICovCisJCXZvcnRleF9FcUh3X1NldExlZnRHYWluc1RhcmdldCh2b3J0ZXgsICh1MTYgKikgKGVxLT50aGlzMTQpKTsKKwkJdm9ydGV4X0VxSHdfU2V0UmlnaHRHYWluc1RhcmdldCh2b3J0ZXgsICh1MTYgKikgKGVxLT50aGlzMTQpKTsKKwkJdm9ydGV4X0VxSHdfU2V0QnlwYXNzR2Fpbih2b3J0ZXgsIGVxLT50aGlzMGMsIGVxLT50aGlzMGMpOworCX0KKwl2b3J0ZXhfRXFsenJfUHJvZ3JhbUEzZEJ5cGFzc0dhaW4odm9ydGV4KTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X0VxbHpyX1JlYWRBbmRTZXRBY3RpdmVDb2VmU2V0KHZvcnRleF90ICogdm9ydGV4KQoreworCWVxbHpyX3QgKmVxID0gJih2b3J0ZXgtPmVxKTsKKworCS8qIFNldCBFUSBCaVF1YWQgZmlsdGVyIGNvZWZpY2llbnRzICovCisJbWVtY3B5KCYoZXEtPmNvZWZzZXQpLCAmYXNFcUNvZWZzTm9ybWFsLCBzaXplb2YoYXV4eEVxQ29lZmZTZXRfdCkpOworCS8qIFNldCBFUSBCYW5kIGdhaW4gbGV2ZWxzIGFuZCBkdW1wIGludG8gaGFyZHdhcmUgcmVnaXN0ZXJzLiAqLworCXZvcnRleF9FcWx6cl9TZXRBbGxCYW5kcyh2b3J0ZXgsIGVxX2dhaW5zX25vcm1hbCwgZXEtPnRoaXMxMCAqIDIpOworfQorCitzdGF0aWMgaW50IHZvcnRleF9FcWx6cl9HZXRBbGxQZWFrcyh2b3J0ZXhfdCAqIHZvcnRleCwgdTE2ICogcGVha3MsIGludCAqY291bnQpCit7CisJZXFsenJfdCAqZXEgPSAmKHZvcnRleC0+ZXEpOworCisJaWYgKGVxLT50aGlzMTAgPT0gMCkKKwkJcmV0dXJuIDE7CisJKmNvdW50ID0gZXEtPnRoaXMxMCAqIDI7CisJdm9ydGV4X0VxSHdfR2V0VGVuQmFuZExldmVscyh2b3J0ZXgsIHBlYWtzKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyBhdXh4RXFDb2VmZlNldF90ICp2b3J0ZXhfRXFsenJfR2V0QWN0aXZlQ29lZlNldCh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwllcWx6cl90ICplcSA9ICYodm9ydGV4LT5lcSk7CisKKwlyZXR1cm4gKCYoZXEtPmNvZWZzZXQpKTsKK30KKyNlbmRpZgorc3RhdGljIHZvaWQgdm9ydGV4X0VxbHpyX2luaXQodm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJZXFsenJfdCAqZXEgPSAmKHZvcnRleC0+ZXEpOworCisJLyogT2JqZWN0IGNvbnN0cnVjdG9yICovCisJLy9lcS0+dGhpczA0ID0gMDsKKwllcS0+dGhpczA4ID0gMDsJCS8qIEJ5cGFzcyBnYWluIHdpdGggRVEgaW4gdXNlLiAqLworCWVxLT50aGlzMGEgPSAweDU5OTk7CisJZXEtPnRoaXMwYyA9IDB4NTk5OTsJLyogQnlwYXNzIGdhaW4gd2l0aCBFUSBkaXNhYmxlZC4gKi8KKwllcS0+dGhpczBlID0gMHg1OTk5OworCisJZXEtPnRoaXMxMCA9IDB4YTsJLyogMTAgZXEgZnJlcXVlbmN5IGJhbmRzLiAqLworCWVxLT50aGlzMDQudGhpczA0ID0gZXEtPnRoaXMxMDsKKwllcS0+dGhpczI4ID0gMHgxOwkvKiBpZiAxID0+IEFsbG93IHJlYWQgYWNjZXNzIHRvIHRoaXMxMzAgKGdhaW5zKSAqLworCWVxLT50aGlzNTQgPSAweDA7CS8qIGlmIDEgPT4gRG9udCBBbGxvdyBhY2Nlc3MgdG8gaGFyZHdhcmUgKGdhaW5zKSAqLworCWVxLT50aGlzNTggPSAweGZmZmY7CisJZXEtPnRoaXM1YyA9IDB4ZmZmZjsKKworCS8qIFNldCBnYWlucy4gKi8KKwltZW1zZXQoZXEtPnRoaXMxNCwgMCwgMiAqIDEwKTsKKworCS8qIEFjdHVhbCBpbml0LiAqLworCXZvcnRleF9FcUh3X1plcm9TdGF0ZSh2b3J0ZXgpOworCXZvcnRleF9FcUh3X1NldFNhbXBsZVJhdGUodm9ydGV4LCAweDExKTsKKwl2b3J0ZXhfRXFsenJfUmVhZEFuZFNldEFjdGl2ZUNvZWZTZXQodm9ydGV4KTsKKworCXZvcnRleF9FcUh3X1Byb2dyYW0xMEJhbmQodm9ydGV4LCAmKGVxLT5jb2Vmc2V0KSk7CisJdm9ydGV4X0VxbHpyX1NldEJ5cGFzcyh2b3J0ZXgsIGVxLT50aGlzNTQpOworCXZvcnRleF9FcWx6cl9TZXRBM2RCeXBhc3NHYWluKHZvcnRleCwgMCwgMCk7CisJdm9ydGV4X0VxSHdfRW5hYmxlKHZvcnRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9FcWx6cl9zaHV0ZG93bih2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwl2b3J0ZXhfRXFsenJfU2h1dERvd25BM2Qodm9ydGV4KTsKKwl2b3J0ZXhfRXFId19Qcm9ncmFtUGlwZSh2b3J0ZXgpOworCXZvcnRleF9FcUh3X0Rpc2FibGUodm9ydGV4KTsKK30KKworLyogQUxTQSBpbnRlcmZhY2UgKi8KKworLyogQ29udHJvbCBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfZXF0b2dnbGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfZXF0b2dnbGVfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXZvcnRleF90ICp2b3J0ZXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZXFsenJfdCAqZXEgPSAmKHZvcnRleC0+ZXEpOworCS8vaW50IGkgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZXEtPnRoaXM1NCA/IDAgOiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfZXF0b2dnbGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXZvcnRleF90ICp2b3J0ZXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZXFsenJfdCAqZXEgPSAmKHZvcnRleC0+ZXEpOworCS8vaW50IGkgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWVxLT50aGlzNTQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDAgOiAxOworCXZvcnRleF9FcWx6cl9TZXRCeXBhc3Modm9ydGV4LCBlcS0+dGhpczU0KTsKKworCXJldHVybiAxOwkJLyogQWxsd2F5cyBjaGFuZ2VzICovCit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgdm9ydGV4X2VxdG9nZ2xlX2tjb250cm9sIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiRVEgRW5hYmxlIiwKKwkuaW5kZXggPSAwLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5wcml2YXRlX3ZhbHVlID0gMCwKKwkuaW5mbyA9IHNuZF92b3J0ZXhfZXF0b2dnbGVfaW5mbywKKwkuZ2V0ID0gc25kX3ZvcnRleF9lcXRvZ2dsZV9nZXQsCisJLnB1dCA9IHNuZF92b3J0ZXhfZXF0b2dnbGVfcHV0Cit9OworCitzdGF0aWMgaW50CitzbmRfdm9ydGV4X2VxX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMHgwMDAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4N2ZmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3ZvcnRleF9lcV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl2b3J0ZXhfdCAqdm9ydGV4ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdTE2IGdhaW5MLCBnYWluUjsKKworCXZvcnRleF9FcWx6cl9HZXRMZWZ0R2Fpbih2b3J0ZXgsIGksICZnYWluTCk7CisJdm9ydGV4X0VxbHpyX0dldFJpZ2h0R2Fpbih2b3J0ZXgsIGksICZnYWluUik7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBnYWluTDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGdhaW5SOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfdm9ydGV4X2VxX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXZvcnRleF90ICp2b3J0ZXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZWQgPSAwLCBpID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdTE2IGdhaW5MLCBnYWluUjsKKworCXZvcnRleF9FcWx6cl9HZXRMZWZ0R2Fpbih2b3J0ZXgsIGksICZnYWluTCk7CisJdm9ydGV4X0VxbHpyX0dldFJpZ2h0R2Fpbih2b3J0ZXgsIGksICZnYWluUik7CisKKwlpZiAoZ2FpbkwgIT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJdm9ydGV4X0VxbHpyX1NldExlZnRHYWluKHZvcnRleCwgaSwKKwkJCQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJY2hhbmdlZCA9IDE7CisJfQorCWlmIChnYWluUiAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgeworCQl2b3J0ZXhfRXFsenJfU2V0UmlnaHRHYWluKHZvcnRleCwgaSwKKwkJCQkJICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCWNoYW5nZWQgPSAxOworCX0KKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCB2b3J0ZXhfZXFfa2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAuIiwKKwkuaW5kZXggPSAwLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5wcml2YXRlX3ZhbHVlID0gMCwKKwkuaW5mbyA9IHNuZF92b3J0ZXhfZXFfaW5mbywKKwkuZ2V0ID0gc25kX3ZvcnRleF9lcV9nZXQsCisJLnB1dCA9IHNuZF92b3J0ZXhfZXFfcHV0Cit9OworCitzdGF0aWMgaW50CitzbmRfdm9ydGV4X3BlYWtzX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDIwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDB4MDAwMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDdmZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF92b3J0ZXhfcGVha3NfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSwgY291bnQ7CisJdTE2IHBlYWtzWzIwXTsKKworCXZvcnRleF9FcWx6cl9HZXRBbGxQZWFrcyh2b3J0ZXgsIHBlYWtzLCAmY291bnQpOworCWlmIChjb3VudCAhPSAyMCkgeworCQlwcmludGsoInZvcnRleDogcGVhayBjb3VudCBlcnJvciAyMCAhPSAlZCBcbiIsIGNvdW50KTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSBwZWFrc1tpXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHZvcnRleF9sZXZlbHNfa2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJFUSBQZWFrcyIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAorCS5pbmZvID0gc25kX3ZvcnRleF9wZWFrc19pbmZvLAorCS5nZXQgPSBzbmRfdm9ydGV4X3BlYWtzX2dldCwKK307CisKKy8qIEVRIGJhbmQgZ2FpbiBsYWJlbHMuICovCitzdGF0aWMgY2hhciAqRXFCYW5kTGFiZWxzWzEwXSBfX2RldmluaXRkYXRhID0geworCSJFUTAgMzFIelwwIiwKKwkiRVExIDYzSHpcMCIsCisJIkVRMiAxMjVIelwwIiwKKwkiRVEzIDI1MEh6XDAiLAorCSJFUTQgNTAwSHpcMCIsCisJIkVRNSAxS0h6XDAiLAorCSJFUTYgMktIelwwIiwKKwkiRVE3IDRLSHpcMCIsCisJIkVROCA4S0h6XDAiLAorCSJFUTkgMTZLSHpcMCIsCit9OworCisvKiBBTFNBIGRyaXZlciBlbnRyeSBwb2ludHMuIEluaXQgYW5kIGV4aXQuICovCitzdGF0aWMgaW50IHZvcnRleF9lcV9pbml0KHZvcnRleF90ICogdm9ydGV4KQoreworCXNuZF9rY29udHJvbF90ICprY29udHJvbDsKKwlpbnQgZXJyLCBpOworCisJdm9ydGV4X0VxbHpyX2luaXQodm9ydGV4KTsKKworCWlmICgoa2NvbnRyb2wgPQorCSAgICAgc25kX2N0bF9uZXcxKCZ2b3J0ZXhfZXF0b2dnbGVfa2NvbnRyb2wsIHZvcnRleCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gMDsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKHZvcnRleC0+Y2FyZCwga2NvbnRyb2wpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBFUSBnYWluIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJaWYgKChrY29udHJvbCA9CisJCSAgICAgc25kX2N0bF9uZXcxKCZ2b3J0ZXhfZXFfa2NvbnRyb2wsIHZvcnRleCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3RyY3B5KGtjb250cm9sLT5pZC5uYW1lLCBFcUJhbmRMYWJlbHNbaV0pOworCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IGk7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQodm9ydGV4LT5jYXJkLCBrY29udHJvbCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCS8vdm9ydGV4LT5lcWN0cmxbaV0gPSBrY29udHJvbDsKKwl9CisJLyogRVEgYmFuZCBsZXZlbHMgKi8KKwlpZiAoKGtjb250cm9sID0gc25kX2N0bF9uZXcxKCZ2b3J0ZXhfbGV2ZWxzX2tjb250cm9sLCB2b3J0ZXgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKHZvcnRleC0+Y2FyZCwga2NvbnRyb2wpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3J0ZXhfZXFfZnJlZSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwkvKgorCSAgIC8vRklYTUU6IHNlZ2ZhdWx0IGJlY2F1c2Ugdm9ydGV4LT5lcWN0cmxbaV0gPT0gNAorCSAgIGludCBpOworCSAgIGZvciAoaT0wOyBpPDEwOyBpKyspIHsKKwkgICBpZiAodm9ydGV4LT5lcWN0cmxbaV0pCisJICAgc25kX2N0bF9yZW1vdmUodm9ydGV4LT5jYXJkLCB2b3J0ZXgtPmVxY3RybFtpXSk7CisJICAgfQorCSAqLworCXZvcnRleF9FcWx6cl9zaHV0ZG93bih2b3J0ZXgpOworCXJldHVybiAwOworfQorCisvKiBFbmQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2VxLmggYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9lcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWJjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9lcS5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgQVU4OFgwX0VRX0gKKyNkZWZpbmUgQVU4OFgwX0VRX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBhdTg4eDBfZXEuaAorICoKKyAqICBEZWZpbml0aW9ucyBhbmQgY29uc3RhbnQgZGF0YSBmb3IgdGhlIEF1cmVhbCBIYXJkd2FyZSBFUS4KKyAqCisgKiAgU3VuIEp1biAgOCAxODoyMzozOCAyMDAzCisgKiAgQXV0aG9yOiBNYW51ZWwgSmFuZGVyIChtamFuZGVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IExlZnRDb2Vmc1s1MF07CS8vMHg0CisJdTE2IFJpZ2h0Q29lZnNbNTBdOwkvLyAweDY4CisJdTE2IExlZnRHYWluc1syMF07CS8vMHhkMAorCXUxNiBSaWdodEdhaW5zWzIwXTsJLy8weGU0Cit9IGF1eHhFcUNvZWZmU2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgKnRoaXMwMDsJLypDQXNwNEh3SU8gKi8KKwlsb25nIHRoaXMwNDsJCS8qIEhvdyBtYW55IGZpbHRlcnMgZm9yIGVhY2ggc2lkZSAoZGVmYXVsdCA9IDEwKSAqLworCWxvbmcgdGhpczA4OwkJLyogaW5pdGVkIHRvIGNlcm8uIFN0ZXJlbyBmbGFnPyAqLworfSBlcWh3X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgKnRoaXMwMDsJLypDQXNwNENvcmUgKi8KKwllcWh3X3QgdGhpczA0OwkJLyogQ0h3RXEgKi8KKwlzaG9ydCB0aGlzMDg7CQkvKiBCYWQgY29kZWMgZmxhZyA/IFNldEJ5cGFzc0dhaW46IGJ5cGFzcyBnYWluICovCisJc2hvcnQgdGhpczBhOworCXNob3J0IHRoaXMwYzsJCS8qIFNldEJ5cGFzc0dhaW46IGJ5cGFzcyBnYWluIHdoZW4gdGhpczI4IGlzIG5vdCBzZXQuICovCisJc2hvcnQgdGhpczBlOworCisJbG9uZyB0aGlzMTA7CQkvKiBIb3cgbWFueSBnYWlucyBhcmUgdXNlZCBmb3IgZWFjaCBzaWRlIChyaWdodCBvciBsZWZ0KS4gKi8KKwl1MTYgdGhpczE0WzMyXTsJCS8qIFNldExlZnRHYWluc1RhcmdldDogTGVmdCAoYW5kIHJpZ2h0PykgRVEgZ2FpbnMgICovCisJbG9uZyB0aGlzMjQ7CisJbG9uZyB0aGlzMjg7CQkvKiBmbGFnIHJlbGF0ZWQgdG8gRVEgZW5hYmxlZCBvciBub3QuIEdhbmcgZmxhZyA/ICovCisJbG9uZyB0aGlzNTQ7CQkvKiBTZXRCeXBhc3MgKi8KKwlsb25nIHRoaXM1ODsKKwlsb25nIHRoaXM1YzsKKwkvKjB4NjAgKi8gYXV4eEVxQ29lZmZTZXRfdCBjb2Vmc2V0OworCS8qIDUwIHUxNiB3b3JkIGVhY2ggY2hhbm5lbC4gKi8KKwl1MTYgdGhpczEzMFsyMF07CS8qIExlZnQgYW5kIFJpZ2h0IGdhaW5zICovCit9IGVxbHpyX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZXFkYXRhLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9lcWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY4ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZXFkYXRhLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIERhdGEgc3RydWN0cyAqLworCitzdGF0aWMgdTE2IGFzRXFDb2Vmc1plcm9zWzUwXSA9IHsKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKK307CisKK3N0YXRpYyB1MTYgYXNFcUNvZWZzUGlwZXNbNjRdID0geworCTB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwNjY2LCAweDAwMDAsIDB4MDAwMCwgMHgwNjY2LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwNjY2LCAweDAwMDAsIDB4MDAwMCwgMHgwNjY2LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwNjY2LCAweDAwMDAsIDB4MDAwMCwgMHgwNjY2LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwNjY2LCAweDAwMDAsIDB4MDAwMCwgMHgwNjY2LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwNjY2LCAweDAwMDAsIDB4MDAwMCwgMHgwNjZhLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAKK307CisKKy8qIE1vcmUgY29lZiBzZXRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgd2luMmsgImluZiIgZmlsZS4gKi8KK3N0YXRpYyBhdXh4RXFDb2VmZlNldF90IGFzRXFDb2Vmc05vcm1hbCA9IHsKKwkuTGVmdENvZWZzID0geworCQkgICAgICAweDdlNjAsIDB4YzE5ZSwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMSwKKwkJICAgICAgMHg3ZmEwLCAweGMwNWYsIDB4MDA0ZiwgMHgwMDAwLCAweGZmYjEsCisJCSAgICAgIDB4N2YzZiwgMHhjMGJjLCAweDAwYzIsIDB4MDAwMCwgMHhmZjNlLAorCQkgICAgICAweDdlNzgsIDB4YzE3NywgMHgwMTFmLCAweDAwMDAsIDB4ZmVlMSwKKwkJICAgICAgMHg3Y2Q2LCAweGMyZTUsIDB4MDI1YywgMHgwMDAwLCAweGZkYTQsCisJCSAgICAgIDB4Nzk0OSwgMHhjNWFhLCAweDA0NjcsIDB4MDAwMCwgMHhmYjk5LAorCQkgICAgICAweDcxMjAsIDB4Y2FkZiwgMHgwODY0LCAweDAwMDAsIDB4Zjc5YywKKwkJICAgICAgMHg1ZDMzLCAweGQ0MzAsIDB4MGY3ZSwgMHgwMDAwLCAweGYwODIsCisJCSAgICAgIDB4MmJlYiwgMHhlM2NhLCAweDFiZDMsIDB4MDAwMCwgMHhlNDJkLAorCQkgICAgICAweGQ3NDAsIDB4ZjAxZCwgMHgyYWM1LCAweDAwMDAsIDB4ZDUzYn0sCisKKwkuUmlnaHRDb2VmcyA9IHsKKwkJICAgICAgIDB4N2U2MCwgMHhjMTllLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAxLAorCQkgICAgICAgMHg3ZmEwLCAweGMwNWYsIDB4MDA0ZiwgMHgwMDAwLCAweGZmYjEsCisJCSAgICAgICAweDdmM2YsIDB4YzBiYywgMHgwMGMyLCAweDAwMDAsIDB4ZmYzZSwKKwkJICAgICAgIDB4N2U3OCwgMHhjMTc3LCAweDAxMWYsIDB4MDAwMCwgMHhmZWUxLAorCQkgICAgICAgMHg3Y2Q2LCAweGMyZTUsIDB4MDI1YywgMHgwMDAwLCAweGZkYTQsCisJCSAgICAgICAweDc5NDksIDB4YzVhYSwgMHgwNDY3LCAweDAwMDAsIDB4ZmI5OSwKKwkJICAgICAgIDB4NzEyMCwgMHhjYWRmLCAweDA4NjQsIDB4MDAwMCwgMHhmNzljLAorCQkgICAgICAgMHg1ZDMzLCAweGQ0MzAsIDB4MGY3ZSwgMHgwMDAwLCAweGYwODIsCisJCSAgICAgICAweDJiZWIsIDB4ZTNjYSwgMHgxYmQzLCAweDAwMDAsIDB4ZTQyZCwKKwkJICAgICAgIDB4ZDc0MCwgMHhmMDFkLCAweDJhYzUsIDB4MDAwMCwgMHhkNTNifSwKKworCS5MZWZ0R2FpbnMgPSB7CisJCSAgICAgIDB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LAorCQkgICAgICAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5Nn0sCisJLlJpZ2h0R2FpbnMgPSB7CisJCSAgICAgICAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwKKwkJICAgICAgIDB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2fQorfTsKKworc3RhdGljIHUxNiBlcV9nYWluc19ub3JtYWxbMjBdID0geworCTB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LAorCTB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LAorCTB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2LAorCTB4M2U5NiwgMHgzZTk2LCAweDNlOTYsIDB4M2U5NiwgMHgzZTk2Cit9OworCisvKiBfcm9kYXRhYjYwICovCitzdGF0aWMgdTE2IGVxX2dhaW5zX3plcm9bMTBdID0geworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCit9OworCisvKiBfcm9kYXRhYjdjOiAgUHJvZ3JhbVBpcGUgKi8KK3N0YXRpYyB1MTYgZXFfZ2FpbnNfY3VycmVudFsxMl0gPSB7CisJMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYsCisJMHg3ZmZmLAorCTB4N2ZmZiwgMHg3ZmZmLCAweDdmZmYKK307CisKKy8qIF9yb2RhdGFiNzggKi8KK3N0YXRpYyB1MTYgZXFfc3RhdGVzX3plcm9bMl0gPSB7IDB4MDAwMCwgMHgwMDAwIH07CisKK3N0YXRpYyB1MTYgYXNFcU91dFN0YXRlWmVyb3NbNDhdID0geworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCit9OworCisvKl9yb2RhdGFiYTA6Ki8KK3N0YXRpYyBsb25nIGVxX2xldmVsc1szMl0gPSB7CisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZDFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2dhbWUuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqICRJZDogYXU4OHgwX2dhbWUuYyx2IDEuOSAyMDAzLzA5LzIyIDAzOjUxOjI4IG1qYW5kZXIgRXhwICQKKyAqCisgKiAgTWFudWVsIEphbmRlci4KKyAqCisgKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6CisgKiAgVm9qdGVjaCBQYXZsaWsKKyAqICBSYXltb25kIEluZ2xlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5CisgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEBzdXNlLmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBVY2l0ZWxza2EgMTU3NiwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICoKKyAqIEJhc2VkIDkwJSBvbiBWb2p0ZWNoIFBhdmxpayBwY2lnYW1lIGRyaXZlci4KKyAqIE1lcmdlZCBhbmQgbW9kaWZpZWQgYnkgTWFudWVsIEphbmRlciwgZm9yIHRoZSBPcGVuVm9ydGV4CisgKiBkcml2ZXIuIChlbWFpbDogbWphbmRlckBlbWJlZGRlZC5jbCkuCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiYXU4OHgwLmgiCisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisKKyNkZWZpbmUgVk9SVEVYX0dBTUVfRFdBSVQJMjAJLyogMjAgbXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdm9ydGV4X2dhbWVfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCXZvcnRleF90ICp2b3J0ZXggPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKKwlyZXR1cm4gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0dBTUVfTEVHQUNZKTsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2dhbWVfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCXZvcnRleF90ICp2b3J0ZXggPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0dBTUVfTEVHQUNZLCAweGZmKTsKK30KKworc3RhdGljIGludAordm9ydGV4X2dhbWVfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOworCWludCBpOworCisJKmJ1dHRvbnMgPSAofmh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9HQU1FX0xFR0FDWSkgPj4gNCkgJiAweGY7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWF4ZXNbaV0gPQorCQkgICAgaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0dBTUVfQVhJUyArIChpICogQVhJU19TSVpFKSk7CisJCWlmIChheGVzW2ldID09IEFYSVNfUkFOR0UpCisJCQlheGVzW2ldID0gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZvcnRleF9nYW1lX29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMMiwKKwkJCWh3cmVhZCh2b3J0ZXgtPm1taW8sCisJCQkgICAgICAgVk9SVEVYX0NUUkwyKSB8IENUUkwyX0dBTUVfQURDTU9ERSk7CisJCW1zbGVlcChWT1JURVhfR0FNRV9EV0FJVCk7CisJCXJldHVybiAwOworCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTDIsCisJCQlod3JlYWQodm9ydGV4LT5tbWlvLAorCQkJICAgICAgIFZPUlRFWF9DVFJMMikgJiB+Q1RSTDJfR0FNRV9BRENNT0RFKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2b3J0ZXhfZ2FtZXBvcnRfcmVnaXN0ZXIodm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKworCXZvcnRleC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidm9ydGV4OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX07CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkFVODh4MCBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUodm9ydGV4LT5wY2lfZGV2KSk7CisJZ2FtZXBvcnRfc2V0X2Rldl9wYXJlbnQoZ3AsICZ2b3J0ZXgtPnBjaV9kZXYtPmRldik7CisKKwlncC0+cmVhZCA9IHZvcnRleF9nYW1lX3JlYWQ7CisJZ3AtPnRyaWdnZXIgPSB2b3J0ZXhfZ2FtZV90cmlnZ2VyOworCWdwLT5jb29rZWRfcmVhZCA9IHZvcnRleF9nYW1lX2Nvb2tlZF9yZWFkOworCWdwLT5vcGVuID0gdm9ydGV4X2dhbWVfb3BlbjsKKworCWdhbWVwb3J0X3NldF9wb3J0X2RhdGEoZ3AsIHZvcnRleCk7CisJZ3AtPmZ1enogPSA2NDsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9nYW1lcG9ydF91bnJlZ2lzdGVyKHZvcnRleF90ICogdm9ydGV4KQoreworCWlmICh2b3J0ZXgtPmdhbWVwb3J0KSB7CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydCh2b3J0ZXgtPmdhbWVwb3J0KTsKKwkJdm9ydGV4LT5nYW1lcG9ydCA9IE5VTEw7CisJfQorfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgdm9ydGV4X2dhbWVwb3J0X3JlZ2lzdGVyKHZvcnRleF90ICogdm9ydGV4KSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdm9ydGV4X2dhbWVwb3J0X3VucmVnaXN0ZXIodm9ydGV4X3QgKiB2b3J0ZXgpIHsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9taXhlci5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfbWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmUyN2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21peGVyLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFZvcnRleCBNaXhlciBzdXBwb3J0LgorICoKKyAqIFRoZXJlIGlzIG11Y2ggbW9yZSB0aGFuIGp1c3QgdGhlIEFDOTcgbWl4ZXIuLi4KKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImF1ODh4MC5oIgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdm9ydGV4X21peGVyKHZvcnRleF90ICogdm9ydGV4KQoreworCWFjOTdfYnVzX3QgKnBidXM7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGVycjsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSB2b3J0ZXhfY29kZWNfd3JpdGUsCisJCS5yZWFkID0gdm9ydGV4X2NvZGVjX3JlYWQsCisJfTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKHZvcnRleC0+Y2FyZCwgMCwgJm9wcywgTlVMTCwgJnBidXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCS8vIEludGlhbGl6ZSBBQzk3IGNvZGVjIHN0dWZmLgorCWFjOTcucHJpdmF0ZV9kYXRhID0gdm9ydGV4OworCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfTk9fU1BESUY7CisJZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZ2b3J0ZXgtPmNvZGVjKTsKKwl2b3J0ZXgtPmlzcXVhZCA9ICgodm9ydGV4LT5jb2RlYyA9PSBOVUxMKSA/ICAwIDogKHZvcnRleC0+Y29kZWMtPmV4dF9pZCYweDgwKSk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21wdTQwMS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfbXB1NDAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjMjM0NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21wdTQwMS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIE1QVS00MDEgaW4gVUFSVCBtb2RlCisgKgorICogICBNb2RpZmllZCBmb3IgdGhlIEF1cmVhbCBWb3J0ZXggYmFzZWQgU291bmRjYXJkcworICogICBieSBNYW51ZWwgSmFuZGVyIChtamFuZGVAZW1iZWRkZWQuY2wpLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgorI2luY2x1ZGUgImF1ODh4MC5oIgorCisvKiBDaGVjayBmb3IgbXB1NDAxIG1taW8gc3VwcG9ydC4gKi8KKy8qIE1QVTQwMSBsZWdhY3kgc3VwcG9ydCBpcyBvbmx5IHByb3ZpZGVkIGFzIGEgZW1lcmdlbmN5IGZhbGxiYWNrICoKKyAqIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBTFNBLiBJdHMgdXNhZ2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuICovCisjaWZuZGVmIE1QVTQwMV9IV19BVVJFQUwKKyNkZWZpbmUgVk9SVEVYX01QVTQwMV9MRUdBQ1kKKyNlbmRpZgorCisvKiBWb3J0ZXggTVBVNDAxIGRlZmluZXMuICovCisjZGVmaW5lIE1JRElfQ0xPQ0tfRElWICAgICAgMHg2MQorLyogU3RhbmRhcnQgTVBVNDAxIGRlZmluZXMuICovCisjZGVmaW5lIE1QVTQwMV9SRVNFVAkJMHhmZgorI2RlZmluZSBNUFU0MDFfRU5URVJfVUFSVAkweDNmCisjZGVmaW5lIE1QVTQwMV9BQ0sJCSAgICAweGZlCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92b3J0ZXhfbWlkaSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlzbmRfcmF3bWlkaV90ICpybWlkaTsKKwlpbnQgdGVtcCwgbW9kZTsKKwltcHU0MDFfdCAqbXB1OworCWludCBwb3J0OworCisjaWZkZWYgVk9SVEVYX01QVTQwMV9MRUdBQ1kKKwkvKiBFbmFibGVIYXJkQ29kZWRNUFU0MDFQb3J0KCkgKi8KKwkvKiBFbmFibGUgTGVnYWN5IE1JREkgSW50ZXJmYWNlIHBvcnQuICovCisJcG9ydCA9ICgweDAzIDw8IDUpOwkvKiBGSVhNRTogc3RhdGljIGFkZHJlc3MuIDB4MzMwICovCisJdGVtcCA9CisJICAgIChod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfQ1RSTCkgJiB+Q1RSTF9NSURJX1BPUlQpIHwKKwkgICAgQ1RSTF9NSURJX0VOIHwgcG9ydDsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwsIHRlbXApOworI2Vsc2UKKwkvKiBEaXNhYmxlIExlZ2FjeSBNSURJIEludGVyZmFjZSBwb3J0LiAqLworCXRlbXAgPQorCSAgICAoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYgfkNUUkxfTUlESV9QT1JUKSAmCisJICAgIH5DVFJMX01JRElfRU47CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLCB0ZW1wKTsKKyNlbmRpZgorCS8qIE1wdTQwMVVhcnRJbml0KCkgKi8KKwltb2RlID0gMTsKKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwyKSAmIDB4ZmZmZjAwY2Y7CisJdGVtcCB8PSAoTUlESV9DTE9DS19ESVYgPDwgOCkgfCAoKG1vZGUgPj4gMjQpICYgMHhmZikgPDwgNDsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwyLCB0ZW1wKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfQ01ELCBNUFU0MDFfUkVTRVQpOworCS8qIFNldCBzb21lIGtpbmQgb2YgbW9kZSAqLworCWlmIChtb2RlKQorCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfQ01ELCBNUFU0MDFfRU5URVJfVUFSVCk7CisKKwkvKiBDaGVjayBpZiBhbnl0aGluZyBpcyBPSy4gKi8KKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfREFUQSk7CisJaWYgKHRlbXAgIT0gTVBVNDAxX0FDSyAvKjB4ZmUgKi8gKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWlkaSBwb3J0IGRvZXNuJ3QgYWNrbm93bGVkZ2UhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIEVuYWJsZSBNUFU0MDEgaW50ZXJydXB0cy4gKi8KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0lSUV9DVFJMLAorCQlod3JlYWQodm9ydGV4LT5tbWlvLCBWT1JURVhfSVJRX0NUUkwpIHwgSVJRX01JREkpOworCisJLyogQ3JlYXRlIE1QVTQwMSBpbnN0YW5jZS4gKi8KKyNpZmRlZiBWT1JURVhfTVBVNDAxX0xFR0FDWQorCWlmICgodGVtcCA9CisJICAgICBzbmRfbXB1NDAxX3VhcnRfbmV3KHZvcnRleC0+Y2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwgMHgzMzAsCisJCQkJIDAsIDAsIDAsICZybWlkaSkpICE9IDApIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLAorCQkJKGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMKSAmCisJCQkgfkNUUkxfTUlESV9QT1JUKSAmIH5DVFJMX01JRElfRU4pOworCQlyZXR1cm4gdGVtcDsKKwl9CisjZWxzZQorCXBvcnQgPSAodW5zaWduZWQgbG9uZykodm9ydGV4LT5tbWlvICsgKFZPUlRFWF9NSURJX0RBVEEgPj4gMikpOworCWlmICgodGVtcCA9CisJICAgICBzbmRfbXB1NDAxX3VhcnRfbmV3KHZvcnRleC0+Y2FyZCwgMCwgTVBVNDAxX0hXX0FVUkVBTCwgcG9ydCwKKwkJCQkgMSwgMCwgMCwgJnJtaWRpKSkgIT0gMCkgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwsCisJCQkoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYKKwkJCSB+Q1RSTF9NSURJX1BPUlQpICYgfkNUUkxfTUlESV9FTik7CisJCXJldHVybiB0ZW1wOworCX0KKwltcHUgPSBybWlkaS0+cHJpdmF0ZV9kYXRhOworCW1wdS0+Y3BvcnQgPSAodW5zaWduZWQgbG9uZykodm9ydGV4LT5tbWlvICsgKFZPUlRFWF9NSURJX0NNRCA+PiAyKSk7CisjZW5kaWYKKwl2b3J0ZXgtPnJtaWRpID0gcm1pZGk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9wY20uYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3BjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZGNlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9wY20uYwpAQCAtMCwwICsxLDU0OCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisgCisvKgorICogVm9ydGV4IFBDTSBBTFNBIGRyaXZlci4KKyAqCisgKiBTdXBwb3J0cyBBREIgYW5kIFdUIERNQS4gVW5mb3J0dW5hdGVseSwgV1QgY2hhbm5lbHMgZG8gbm90IHJ1biB5ZXQuCisgKiBJdCByZW1haW5zIHN0dWNrLGFuZCBETUEgdHJhbnNmZXJzIGRvIG5vdCBoYXBwZW4uIAorICovCisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlICJhdTg4eDAuaCIKKworI2RlZmluZSBWT1JURVhfUENNX1RZUEUoeCkgKHgtPm5hbWVbNDBdKQorCisvKiBoYXJkd2FyZSBkZWZpbml0aW9uICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF92b3J0ZXhfcGxheWJhY2tfaHdfYWRiID0geworCS5pbmZvID0KKwkgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCSAgICAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CisJICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CisJICAgIFNORFJWX1BDTV9GTVRCSVRfTVVfTEFXIHwgU05EUlZfUENNX0ZNVEJJVF9BX0xBVywKKwkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCS5yYXRlX21pbiA9IDUwMDAsCisJLnJhdGVfbWF4ID0gNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9IDEsCisjaWZkZWYgQ0hJUF9BVTg4MzAKKwkuY2hhbm5lbHNfbWF4ID0gNCwKKyNlbHNlCisJLmNoYW5uZWxzX21heCA9IDIsCisjZW5kaWYKKwkuYnVmZmVyX2J5dGVzX21heCA9IDB4MTAwMDAsCisJLnBlcmlvZF9ieXRlc19taW4gPSAweDEsCisJLnBlcmlvZF9ieXRlc19tYXggPSAweDEwMDAsCisJLnBlcmlvZHNfbWluID0gMiwKKwkucGVyaW9kc19tYXggPSAzMiwKK307CisKKyNpZm5kZWYgQ0hJUF9BVTg4MjAKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3ZvcnRleF9wbGF5YmFja19od19hM2QgPSB7CisJLmluZm8gPQorCSAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJICAgICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0KKwkgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1U4IHwKKwkgICAgU05EUlZfUENNX0ZNVEJJVF9NVV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0FfTEFXLAorCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMsCisJLnJhdGVfbWluID0gNTAwMCwKKwkucmF0ZV9tYXggPSA0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0gMSwKKwkuY2hhbm5lbHNfbWF4ID0gMSwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDB4MTAwMDAsCisJLnBlcmlvZF9ieXRlc19taW4gPSAweDEwMCwKKwkucGVyaW9kX2J5dGVzX21heCA9IDB4MTAwMCwKKwkucGVyaW9kc19taW4gPSAyLAorCS5wZXJpb2RzX21heCA9IDY0LAorfTsKKyNlbmRpZgorc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X3NwZGlmID0geworCS5pbmZvID0KKwkgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCSAgICAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CisJICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CisJICAgIFNORFJWX1BDTV9GTVRCSVRfSUVDOTU4X1NVQkZSQU1FX0xFIHwgU05EUlZfUENNX0ZNVEJJVF9NVV9MQVcgfAorCSAgICBTTkRSVl9QQ01fRk1UQklUX0FfTEFXLAorCS5yYXRlcyA9CisJICAgIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPSAzMjAwMCwKKwkucmF0ZV9tYXggPSA0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0gMSwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDB4MTAwMDAsCisJLnBlcmlvZF9ieXRlc19taW4gPSAweDEwMCwKKwkucGVyaW9kX2J5dGVzX21heCA9IDB4MTAwMCwKKwkucGVyaW9kc19taW4gPSAyLAorCS5wZXJpb2RzX21heCA9IDY0LAorfTsKKworI2lmbmRlZiBDSElQX0FVODgxMAorc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X3d0ID0geworCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfCBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAkvLyBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPSA4MDAwLAorCS5yYXRlX21heCA9IDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAxLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gMHgxMDAwMCwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDB4MDQwMCwKKwkucGVyaW9kX2J5dGVzX21heCA9IDB4MTAwMCwKKwkucGVyaW9kc19taW4gPSAyLAorCS5wZXJpb2RzX21heCA9IDY0LAorfTsKKyNlbmRpZgorLyogb3BlbiBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfdm9ydGV4X3BjbV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCQorCS8qIEZvcmNlIGVxdWFsIHNpemUgcGVyaW9kcyAqLworCWlmICgoZXJyID0KKwkgICAgIHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCisJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIEF2b2lkIFBBR0VfU0laRSBib3VuZGFyeSB0byBmYWxsIGluc2lkZSBvZiBhIHBlcmlvZC4gKi8KKwlpZiAoKGVyciA9CisJICAgICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcG93MihydW50aW1lLCAwLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkgeworI2lmbmRlZiBDSElQX0FVODgyMAorCQlpZiAoVk9SVEVYX1BDTV9UWVBFKHN1YnN0cmVhbS0+cGNtKSA9PSBWT1JURVhfUENNX0EzRCkgeworCQkJcnVudGltZS0+aHcgPSBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X2EzZDsKKwkJfQorI2VuZGlmCisJCWlmIChWT1JURVhfUENNX1RZUEUoc3Vic3RyZWFtLT5wY20pID09IFZPUlRFWF9QQ01fU1BESUYpIHsKKwkJCXJ1bnRpbWUtPmh3ID0gc25kX3ZvcnRleF9wbGF5YmFja19od19zcGRpZjsKKwkJCXN3aXRjaCAodm9ydGV4LT5zcGRpZl9zcikgeworCQkJY2FzZSAzMjAwMDoKKwkJCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0NDEwMDoKKwkJCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0ODAwMDoKKwkJCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChWT1JURVhfUENNX1RZUEUoc3Vic3RyZWFtLT5wY20pID09IFZPUlRFWF9QQ01fQURCCisJCSAgICB8fCBWT1JURVhfUENNX1RZUEUoc3Vic3RyZWFtLT5wY20pID09IFZPUlRFWF9QQ01fSTJTKQorCQkJcnVudGltZS0+aHcgPSBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X2FkYjsKKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCX0KKyNpZm5kZWYgQ0hJUF9BVTg4MTAKKwllbHNlIHsKKwkJcnVudGltZS0+aHcgPSBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X3d0OworCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIGNsb3NlIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF92b3J0ZXhfcGNtX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJLy92b3J0ZXhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJlYW1fdCAqc3RyZWFtID0gKHN0cmVhbV90ICopIHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJLy8gdGhlIGhhcmR3YXJlLXNwZWNpZmljIGNvZGVzIHdpbGwgYmUgaGVyZQorCWlmIChzdHJlYW0gIT0gTlVMTCkgeworCQlzdHJlYW0tPnN1YnN0cmVhbSA9IE5VTEw7CisJCXN0cmVhbS0+bnJfY2ggPSAwOworCX0KKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qIGh3X3BhcmFtcyBjYWxsYmFjayAqLworc3RhdGljIGludAorc25kX3ZvcnRleF9wY21faHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwl2b3J0ZXhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJlYW1fdCAqc3RyZWFtID0gKHN0cmVhbV90ICopIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSk7CisJc25kX3BjbV9zZ2J1Zl90ICpzZ2J1ZjsKKwlpbnQgZXJyOworCisJLy8gQWxsb2MgYnVmZmVyIG1lbW9yeS4KKwllcnIgPQorCSAgICBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVm9ydGV4OiBwY20gcGFnZSBhbGxvYyBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy9zZ2J1ZiA9IChzbmRfcGNtX3NnYnVmX3QgKikgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfcHJpdmF0ZTsKKwlzZ2J1ZiA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7CisJLyoKKwkgICBwcmludGsoS0VSTl9JTkZPICJWb3J0ZXg6IHBlcmlvZHMgJWQsIHBlcmlvZF9ieXRlcyAlZCwgY2hhbm5lbHMgPSAlZFxuIiwgcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKSwKKwkgICBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyksIHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpKTsKKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5sb2NrKTsKKwkvLyBNYWtlIGF1ZGlvIHJvdXRlcyBhbmQgY29uZmlnIGJ1ZmZlciBETUEuCisJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkgeworCQlpbnQgZG1hLCB0eXBlID0gVk9SVEVYX1BDTV9UWVBFKHN1YnN0cmVhbS0+cGNtKTsKKwkJLyogRGVhbGxvYyBhbnkgcm91dGVzLiAqLworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQl2b3J0ZXhfYWRiX2FsbG9jcm91dGUoY2hpcCwgc3RyZWFtLT5kbWEsCisJCQkJCSAgICAgIHN0cmVhbS0+bnJfY2gsIHN0cmVhbS0+ZGlyLAorCQkJCQkgICAgICBzdHJlYW0tPnR5cGUpOworCQkvKiBBbGxvYyByb3V0ZXMuICovCisJCWRtYSA9CisJCSAgICB2b3J0ZXhfYWRiX2FsbG9jcm91dGUoY2hpcCwgLTEsCisJCQkJCSAgcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcyksCisJCQkJCSAgc3Vic3RyZWFtLT5zdHJlYW0sIHR5cGUpOworCQlpZiAoZG1hIDwgMCkKKwkJCXJldHVybiBkbWE7CisJCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJmNoaXAtPmRtYV9hZGJbZG1hXTsKKwkJc3RyZWFtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJCS8qIFNldHVwIEJ1ZmZlcnMuICovCisJCXZvcnRleF9hZGJkbWFfc2V0YnVmZmVycyhjaGlwLCBkbWEsIHNnYnVmLAorCQkJCQkgcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpLAorCQkJCQkgcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKSk7CisJfQorI2lmbmRlZiBDSElQX0FVODgxMAorCWVsc2UgeworCQkvKiBpZiAoc3RyZWFtICE9IE5VTEwpCisJCSAgIHZvcnRleF93dF9hbGxvY3JvdXRlKGNoaXAsIHN1YnN0cmVhbS0+bnVtYmVyLCAwKTsgKi8KKwkJdm9ydGV4X3d0X2FsbG9jcm91dGUoY2hpcCwgc3Vic3RyZWFtLT5udW1iZXIsCisJCQkJICAgICBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSk7CisJCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0KKwkJICAgICZjaGlwLT5kbWFfd3Rbc3Vic3RyZWFtLT5udW1iZXJdOworCQlzdHJlYW0tPmRtYSA9IHN1YnN0cmVhbS0+bnVtYmVyOworCQlzdHJlYW0tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJdm9ydGV4X3d0ZG1hX3NldGJ1ZmZlcnMoY2hpcCwgc3Vic3RyZWFtLT5udW1iZXIsIHNnYnVmLAorCQkJCQlwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyksCisJCQkJCXBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcykpOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGh3X2ZyZWUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX3ZvcnRleF9wY21faHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXZvcnRleF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cmVhbV90ICpzdHJlYW0gPSAoc3RyZWFtX3QgKikgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPmxvY2spOworCS8vIERlbGV0ZSBhdWRpbyByb3V0ZXMuCisJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkgeworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQl2b3J0ZXhfYWRiX2FsbG9jcm91dGUoY2hpcCwgc3RyZWFtLT5kbWEsCisJCQkJCSAgICAgIHN0cmVhbS0+bnJfY2gsIHN0cmVhbS0+ZGlyLAorCQkJCQkgICAgICBzdHJlYW0tPnR5cGUpOworCX0KKyNpZm5kZWYgQ0hJUF9BVTg4MTAKKwllbHNlIHsKKwkJaWYgKHN0cmVhbSAhPSBOVUxMKQorCQkJdm9ydGV4X3d0X2FsbG9jcm91dGUoY2hpcCwgc3RyZWFtLT5kbWEsIDApOworCX0KKyNlbmRpZgorCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPmxvY2spOworCisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKK30KKworLyogcHJlcGFyZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfdm9ydGV4X3BjbV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdm9ydGV4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RyZWFtX3QgKnN0cmVhbSA9IChzdHJlYW1fdCAqKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZG1hID0gc3RyZWFtLT5kbWEsIGZtdCwgZGlyOworCisJLy8gc2V0IHVwIHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWRpciA9IDE7CisJZWxzZQorCQlkaXIgPSAwOworCWZtdCA9IHZvcnRleF9hbHNhZm10X2FzcGZtdChydW50aW1lLT5mb3JtYXQpOworCXNwaW5fbG9ja19pcnEoJmNoaXAtPmxvY2spOworCWlmIChWT1JURVhfUENNX1RZUEUoc3Vic3RyZWFtLT5wY20pICE9IFZPUlRFWF9QQ01fV1QpIHsKKwkJdm9ydGV4X2FkYmRtYV9zZXRtb2RlKGNoaXAsIGRtYSwgMSwgZGlyLCBmbXQsIDAgLyo/ICovICwKKwkJCQkgICAgICAwKTsKKwkJdm9ydGV4X2FkYmRtYV9zZXRzdGFydGJ1ZmZlcihjaGlwLCBkbWEsIDApOworCQlpZiAoVk9SVEVYX1BDTV9UWVBFKHN1YnN0cmVhbS0+cGNtKSAhPSBWT1JURVhfUENNX1NQRElGKQorCQkJdm9ydGV4X2FkYl9zZXRzcmMoY2hpcCwgZG1hLCBydW50aW1lLT5yYXRlLCBkaXIpOworCX0KKyNpZm5kZWYgQ0hJUF9BVTg4MTAKKwllbHNlIHsKKwkJdm9ydGV4X3d0ZG1hX3NldG1vZGUoY2hpcCwgZG1hLCAxLCBmbXQsIDAsIDApOworCQkvLyBGSVhNRTogU2V0IHJhdGUgKGkgZ3Vlc3MgdXNpbmcgdm9ydGV4X3d0X3dyaXRlcmVnKCkgc29tZWhvdykuCisJCXZvcnRleF93dGRtYV9zZXRzdGFydGJ1ZmZlcihjaGlwLCBkbWEsIDApOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRyaWdnZXIgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX3ZvcnRleF9wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXZvcnRleF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cmVhbV90ICpzdHJlYW0gPSAoc3RyZWFtX3QgKikgc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGRtYSA9IHN0cmVhbS0+ZG1hOworCisJc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCS8vIGRvIHNvbWV0aGluZyB0byBzdGFydCB0aGUgUENNIGVuZ2luZQorCQkvL3ByaW50ayhLRVJOX0lORk8gInZvcnRleDogc3RhcnQgJWRcbiIsIGRtYSk7CisJCXN0cmVhbS0+Zmlmb19lbmFibGVkID0gMTsKKwkJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkgeworCQkJdm9ydGV4X2FkYmRtYV9yZXNldHVwKGNoaXAsIGRtYSk7CisJCQl2b3J0ZXhfYWRiZG1hX3N0YXJ0ZmlmbyhjaGlwLCBkbWEpOworCQl9CisjaWZuZGVmIENISVBfQVU4ODEwCisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAidm9ydGV4OiB3dCBzdGFydCAlZFxuIiwgZG1hKTsKKwkJCXZvcnRleF93dGRtYV9zdGFydGZpZm8oY2hpcCwgZG1hKTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJLy8gZG8gc29tZXRoaW5nIHRvIHN0b3AgdGhlIFBDTSBlbmdpbmUKKwkJLy9wcmludGsoS0VSTl9JTkZPICJ2b3J0ZXg6IHN0b3AgJWRcbiIsIGRtYSk7CisJCXN0cmVhbS0+Zmlmb19lbmFibGVkID0gMDsKKwkJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkKKwkJCXZvcnRleF9hZGJkbWFfcGF1c2VmaWZvKGNoaXAsIGRtYSk7CisJCS8vdm9ydGV4X2FkYmRtYV9zdG9wZmlmbyhjaGlwLCBkbWEpOworI2lmbmRlZiBDSElQX0FVODgxMAorCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInZvcnRleDogd3Qgc3RvcCAlZFxuIiwgZG1hKTsKKwkJCXZvcnRleF93dGRtYV9zdG9wZmlmbyhjaGlwLCBkbWEpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQkvL3ByaW50ayhLRVJOX0lORk8gInZvcnRleDogcGF1c2UgJWRcbiIsIGRtYSk7CisJCWlmIChWT1JURVhfUENNX1RZUEUoc3Vic3RyZWFtLT5wY20pICE9IFZPUlRFWF9QQ01fV1QpCisJCQl2b3J0ZXhfYWRiZG1hX3BhdXNlZmlmbyhjaGlwLCBkbWEpOworI2lmbmRlZiBDSElQX0FVODgxMAorCQllbHNlCisJCQl2b3J0ZXhfd3RkbWFfcGF1c2VmaWZvKGNoaXAsIGRtYSk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQkvL3ByaW50ayhLRVJOX0lORk8gInZvcnRleDogcmVzdW1lICVkXG4iLCBkbWEpOworCQlpZiAoVk9SVEVYX1BDTV9UWVBFKHN1YnN0cmVhbS0+cGNtKSAhPSBWT1JURVhfUENNX1dUKQorCQkJdm9ydGV4X2FkYmRtYV9yZXN1bWVmaWZvKGNoaXAsIGRtYSk7CisjaWZuZGVmIENISVBfQVU4ODEwCisJCWVsc2UKKwkJCXZvcnRleF93dGRtYV9yZXN1bWVmaWZvKGNoaXAsIGRtYSk7CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiAwOworfQorCisvKiBwb2ludGVyIGNhbGxiYWNrICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3ZvcnRleF9wY21fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXZvcnRleF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cmVhbV90ICpzdHJlYW0gPSAoc3RyZWFtX3QgKikgc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGRtYSA9IHN0cmVhbS0+ZG1hOworCXNuZF9wY21fdWZyYW1lc190IGN1cnJlbnRfcHRyID0gMDsKKworCXNwaW5fbG9jaygmY2hpcC0+bG9jayk7CisJaWYgKFZPUlRFWF9QQ01fVFlQRShzdWJzdHJlYW0tPnBjbSkgIT0gVk9SVEVYX1BDTV9XVCkKKwkJY3VycmVudF9wdHIgPSB2b3J0ZXhfYWRiZG1hX2dldGxpbmVhcnBvcyhjaGlwLCBkbWEpOworI2lmbmRlZiBDSElQX0FVODgxMAorCWVsc2UKKwkJY3VycmVudF9wdHIgPSB2b3J0ZXhfd3RkbWFfZ2V0bGluZWFycG9zKGNoaXAsIGRtYSk7CisjZW5kaWYKKwkvL3ByaW50ayhLRVJOX0lORk8gInZvcnRleDogcG9pbnRlciA9IDB4JXhcbiIsIGN1cnJlbnRfcHRyKTsKKwlzcGluX3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIChieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJyZW50X3B0cikpOworfQorCisvKiBQYWdlIGNhbGxiYWNrLiAqLworLyoKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSB7CisJCisJCit9CisqLworLyogb3BlcmF0b3JzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdm9ydGV4X3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9IHNuZF92b3J0ZXhfcGNtX29wZW4sCisJLmNsb3NlID0gc25kX3ZvcnRleF9wY21fY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IHNuZF92b3J0ZXhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF92b3J0ZXhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfdm9ydGV4X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX3ZvcnRleF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF92b3J0ZXhfcGNtX3BvaW50ZXIsCisJLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworLyoKKyogIGRlZmluaXRpb25zIG9mIGNhcHR1cmUgYXJlIG9taXR0ZWQgaGVyZS4uLgorKi8KKworc3RhdGljIGNoYXIgKnZvcnRleF9wY21fcHJldHR5bmFtZVtWT1JURVhfUENNX0xBU1RdID0geworCSJBVTg4eDAgQURCIiwKKwkiQVU4OHgwIFNQRElGIiwKKwkiQVU4OHgwIEEzRCIsCisJIkFVODh4MCBXVCIsCisJIkFVODh4MCBJMlMiLAorfTsKK3N0YXRpYyBjaGFyICp2b3J0ZXhfcGNtX25hbWVbVk9SVEVYX1BDTV9MQVNUXSA9IHsKKwkiYWRiIiwKKwkic3BkaWYiLAorCSJhM2QiLAorCSJ3dCIsCisJImkycyIsCit9OworCisvKiBTUERJRiBrY29udHJvbCAqLworCitzdGF0aWMgaW50IHNuZF92b3J0ZXhfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ZvcnRleF9zcGRpZl9tYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gSUVDOTU4X0FFUzNfQ09OX0ZTOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92b3J0ZXhfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdm9ydGV4X3QgKnZvcnRleCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IDB4MDA7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSBJRUM5NThfQUVTMV9DT05fT1JJR0lOQUx8SUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUQ7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweDAwOworCXN3aXRjaCAodm9ydGV4LT5zcGRpZl9zcikgeworCWNhc2UgMzIwMDA6IHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gSUVDOTU4X0FFUzNfQ09OX0ZTXzMyMDAwOyBicmVhazsKKwljYXNlIDQ0MTAwOiB1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IElFQzk1OF9BRVMzX0NPTl9GU180NDEwMDsgYnJlYWs7CisJY2FzZSA0ODAwMDogdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSBJRUM5NThfQUVTM19DT05fRlNfNDgwMDA7IGJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdm9ydGV4X3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXZvcnRleF90ICp2b3J0ZXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNwZGlmX3NyID0gNDgwMDA7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSAmIElFQzk1OF9BRVMzX0NPTl9GUykgeworCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzMyMDAwOiBzcGRpZl9zciA9IDMyMDAwOyBicmVhazsKKwljYXNlIElFQzk1OF9BRVMzX0NPTl9GU180NDEwMDogc3BkaWZfc3IgPSA0NDEwMDsgYnJlYWs7CisJY2FzZSBJRUM5NThfQUVTM19DT05fRlNfNDgwMDA6IHNwZGlmX3NyID0gNDgwMDA7IGJyZWFrOworCX0KKwlpZiAoc3BkaWZfc3IgPT0gdm9ydGV4LT5zcGRpZl9zcikKKwkJcmV0dXJuIDA7CisJdm9ydGV4LT5zcGRpZl9zciA9IHNwZGlmX3NyOworCXZvcnRleF9zcGRpZl9pbml0KHZvcnRleCwgdm9ydGV4LT5zcGRpZl9zciwgMSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIHNwZGlmIGNvbnRyb2xzICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF92b3J0ZXhfbWl4ZXJfc3BkaWZbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJCS5pbmZvID0JCXNuZF92b3J0ZXhfc3BkaWZfaW5mbywKKwkJLmdldCA9CQlzbmRfdm9ydGV4X3NwZGlmX2dldCwKKwkJLnB1dCA9CQlzbmRfdm9ydGV4X3NwZGlmX3B1dCwKKwl9LAorCXsKKwkJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxDT05fTUFTSyksCisJCS5pbmZvID0JCXNuZF92b3J0ZXhfc3BkaWZfaW5mbywKKwkJLmdldCA9CQlzbmRfdm9ydGV4X3NwZGlmX21hc2tfZ2V0CisJfSwKK307CisKKy8qIGNyZWF0ZSBhIHBjbSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92b3J0ZXhfbmV3X3BjbSh2b3J0ZXhfdCAqIGNoaXAsIGludCBpZHgsIGludCBucikKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwlpbnQgaTsKKwlpbnQgZXJyLCBucl9jYXB0OworCisJaWYgKChjaGlwID09IDApIHx8IChpZHggPCAwKSB8fCAoaWR4ID4gVk9SVEVYX1BDTV9MQVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBpZHggaW5kaWNhdGVzIHdoaWNoIGtpbmQgb2YgUENNIGRldmljZS4gQURCLCBTUERJRiwgSTJTIGFuZCBBM0Qgc2hhcmUgdGhlIAorCSAqIHNhbWUgZG1hIGVuZ2luZS4gV1QgdXNlcyBpdCBvd24gc2VwYXJhdGUgZG1hIGVuZ2luZSB3aGNpaCBjYW50IGNhcHR1cmUuICovCisJaWYgKGlkeCA9PSBWT1JURVhfUENNX0FEQikKKwkJbnJfY2FwdCA9IG5yOworCWVsc2UKKwkJbnJfY2FwdCA9IDA7CisJaWYgKChlcnIgPQorCSAgICAgc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgdm9ydGV4X3BjbV9wcmV0dHluYW1lW2lkeF0sIGlkeCwgbnIsCisJCQkgbnJfY2FwdCwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzdHJjcHkocGNtLT5uYW1lLCB2b3J0ZXhfcGNtX25hbWVbaWR4XSk7CisJY2hpcC0+cGNtW2lkeF0gPSBwY207CisJLy8gVGhpcyBpcyBhbiBldmlsIGhhY2ssIGJ1dCBpdCBzYXZlcyBhIGxvdCBvZiBkdXBsaWNhdGVkIGNvZGUuCisJVk9SVEVYX1BDTV9UWVBFKHBjbSkgPSBpZHg7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCS8qIHNldCBvcGVyYXRvcnMgKi8KKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJJnNuZF92b3J0ZXhfcGxheWJhY2tfb3BzKTsKKwlpZiAoaWR4ID09IFZPUlRFWF9QQ01fQURCKQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkJJnNuZF92b3J0ZXhfcGxheWJhY2tfb3BzKTsKKwkKKwkvKiBwcmUtYWxsb2NhdGlvbiBvZiBTY2F0dGVyLUdhdGhlciBidWZmZXJzICovCisJCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2lfZGV2KSwKKwkJCQkJICAgICAgMHgxMDAwMCwgMHgxMDAwMCk7CisKKwlpZiAoVk9SVEVYX1BDTV9UWVBFKHBjbSkgPT0gVk9SVEVYX1BDTV9TUERJRikgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfdm9ydGV4X21peGVyX3NwZGlmKTsgaSsrKSB7CisJCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdm9ydGV4X21peGVyX3NwZGlmW2ldLCBjaGlwKTsKKwkJCWlmICgha2N0bCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwga2N0bCkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfc2IuaCBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ZDhmYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3NiLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBhdTg4eDBfc2IuaAorICoKKyAqICBXZWQgT2N0IDI5IDIyOjEwOjQyIDIwMDMKKyAqICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ0hJUF9BVTg4MjAKKy8qIEFVODgyMCBzdGFydGluZyBAIDY0S2lCIG9mZnNldCAqLworI2RlZmluZSBTQkVNVV9CQVNFIDB4MTAwMDAKKyNlbHNlCisvKiBBVTg4MTA/IGFuZCBBVTg4MzAgc3RhcnRpbmcgQCAxNjRLaUIgb2Zmc2V0ICovCisjZGVmaW5lIFNCRU1VX0JBU0UgMHgyOTAwMAorI2VuZGlmCisKKyNkZWZpbmUgRk1fQV9TVEFUVVMJCQkoU0JFTVVfQkFTRSArIDB4MDApCS8qIHJlYWQgKi8KKyNkZWZpbmUgRk1fQV9BRERSRVNTCQkoU0JFTVVfQkFTRSArIDB4MDApCS8qIHdyaXRlICovCisjZGVmaW5lIEZNX0FfREFUQQkJCShTQkVNVV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgRk1fQl9TVEFUVVMJCQkoU0JFTVVfQkFTRSArIDB4MDgpCisjZGVmaW5lIEZNX0JfQUREUkVTUwkJKFNCRU1VX0JBU0UgKyAweDA4KQorI2RlZmluZSBGTV9CX0RBVEEJCQkoU0JFTVVfQkFTRSArIDB4MEMpCisjZGVmaW5lIFNCX01JWEVSX0FERFIJCShTQkVNVV9CQVNFICsgMHgxMCkKKyNkZWZpbmUgU0JfTUlYRVJfREFUQQkJKFNCRU1VX0JBU0UgKyAweDE0KQorI2RlZmluZSBTQl9SRVNFVAkJCShTQkVNVV9CQVNFICsgMHgxOCkKKyNkZWZpbmUgU0JfUkVTRVRfQUxJQVMJCShTQkVNVV9CQVNFICsgMHgxQykKKyNkZWZpbmUgRk1fU1RBVFVTMgkJCShTQkVNVV9CQVNFICsgMHgyMCkKKyNkZWZpbmUgRk1fQUREUjIJCQkoU0JFTVVfQkFTRSArIDB4MjApCisjZGVmaW5lIEZNX0RBVEEyCQkJKFNCRU1VX0JBU0UgKyAweDI0KQorI2RlZmluZSBTQl9EU1BfUkVBRAkJCShTQkVNVV9CQVNFICsgMHgyOCkKKyNkZWZpbmUgU0JfRFNQX1dSSVRFCQkoU0JFTVVfQkFTRSArIDB4MzApCisjZGVmaW5lIFNCX0RTUF9XUklURV9TVEFUVVMJKFNCRU1VX0JBU0UgKyAweDMwKQkvKiBiaXQgNyAqLworI2RlZmluZSBTQl9EU1BfUkVBRF9TVEFUVVMJKFNCRU1VX0JBU0UgKyAweDM4KQkvKiBiaXQgNyAqLworI2RlZmluZSBTQl9MQUNSCQkJCShTQkVNVV9CQVNFICsgMHg0MCkJLyogPyAqLworI2RlZmluZSBTQl9MQURDUgkJCShTQkVNVV9CQVNFICsgMHg0NCkJLyogPyAqLworI2RlZmluZSBTQl9MQU1SCQkJCShTQkVNVV9CQVNFICsgMHg0OCkJLyogPyAqLworI2RlZmluZSBTQl9MQVJSCQkJCShTQkVNVV9CQVNFICsgMHg0QykJLyogPyAqLworI2RlZmluZSBTQl9WRVJTSU9OCQkJKFNCRU1VX0JBU0UgKyAweDUwKQorI2RlZmluZSBTQl9DVFJMU1RBVAkJCShTQkVNVV9CQVNFICsgMHg1NCkKKyNkZWZpbmUgU0JfVElNRVJTVEFUCQkoU0JFTVVfQkFTRSArIDB4NTgpCisjZGVmaW5lIEZNX1JBTQkJCQkoU0JFTVVfQkFTRSArIDB4MTAwKQkvKiAweDQwIFVMT05HICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9zeW50aC5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfc3ludGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA0MTdkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfc3ludGguYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qCisgKiBTb21lZGF5IGl0cyBzdXBwb3NlZCB0byBtYWtlIHVzZSBvZiB0aGUgV1QgRE1BIGVuZ2luZQorICogZm9yIGEgV2F2ZXRhYmxlIHN5bnRoZXNpemVyLgorICovCisKKyNpbmNsdWRlICJhdTg4eDAuaCIKKyNpbmNsdWRlICJhdTg4eDBfd3QuaCIKKworc3RhdGljIHZvaWQgdm9ydGV4X2ZpZm9fc2V0d3R2YWxpZCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGZpZm8sIGludCBlbik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfY29ubmVjdGlvbl9hZGJfbWl4aW4odm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwKKwkJCQkJdW5zaWduZWQgY2hhciBjaGFubmVsLAorCQkJCQl1bnNpZ25lZCBjaGFyIHNvdXJjZSwKKwkJCQkJdW5zaWduZWQgY2hhciBtaXhpbik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfY29ubmVjdGlvbl9taXhpbl9taXgodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBlbiwKKwkJCQkJdW5zaWduZWQgY2hhciBtaXhpbiwKKwkJCQkJdW5zaWduZWQgY2hhciBtaXgsIGludCBhKTsKK3N0YXRpYyB2b2lkIHZvcnRleF9maWZvX3d0aW5pdGlhbGl6ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGZpZm8sIGludCBqKTsKK3N0YXRpYyBpbnQgdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgY2hhciByZWcsIGludCB3dCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCk7CisKKy8qIFdUICovCisKKy8qIFB1dCAyIFdUIGNoYW5uZWxzIHRvZ2V0aGVyIGZvciBvbmUgc3RlcmVvIGludGVybGFjZWQgY2hhbm5lbC4gKi8KK3N0YXRpYyB2b2lkIHZvcnRleF93dF9zZXRzdGVyZW8odm9ydGV4X3QgKiB2b3J0ZXgsIHUzMiB3dCwgdTMyIHN0ZXJlbykKK3sKKwlpbnQgdGVtcDsKKworCS8vdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4ODAgKyAoKHd0ID4+IDB4NSk8PCAweGYpICsgKCgod3QgJiAweDFmKSA+PiAxKSA8PCAyKSk7CisJdGVtcCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIFdUX1NURVJFTyh3dCkpOworCXRlbXAgPSAodGVtcCAmIDB4ZmUpIHwgKHN0ZXJlbyAmIDEpOworCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4ODAgKyAoKHd0ID4+IDB4NSk8PCAweGYpICsgKCgod3QgJiAweDFmKSA+PiAxKSA8PCAyKSwgdGVtcCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1NURVJFTyh3dCksIHRlbXApOworfQorCisvKiBKb2luIHRvIG1peGRvd24gcm91dGUuICovCitzdGF0aWMgdm9pZCB2b3J0ZXhfd3Rfc2V0ZHNvdXQodm9ydGV4X3QgKiB2b3J0ZXgsIHUzMiB3dCwgaW50IGVuKQoreworCWludCB0ZW1wOworCisJLyogVGhlcmUgaXMgb25lIERTUkVHIHJlZ2lzdGVyIGZvciBlYWNoIGJhbmsgKDMyIHZvaWNlcyBlYWNoKS4gKi8KKwl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgV1RfRFNSRUcoKHd0ID49IDB4MjApID8gMSA6IDApKTsKKwlpZiAoZW4pCisJCXRlbXAgfD0gKDEgPDwgKHd0ICYgMHgxZikpOworCWVsc2UKKwkJdGVtcCAmPSAoMSA8PCB+KHd0ICYgMHgxZikpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9EU1JFRygod3QgPj0gMHgyMCkgPyAxIDogMCksIHRlbXApOworfQorCisvKiBTZXR1cCBXVCByb3V0ZS4gKi8KK3N0YXRpYyBpbnQgdm9ydGV4X3d0X2FsbG9jcm91dGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dCwgaW50IG5yX2NoKQoreworCXd0X3ZvaWNlX3QgKnZvaWNlID0gJih2b3J0ZXgtPnd0X3ZvaWNlW3d0XSk7CisJaW50IHRlbXA7CisKKwkvL0ZJWE1FOiBXVCBhdWRpbyByb3V0aW5nLgorCWlmIChucl9jaCkgeworCQl2b3J0ZXhfZmlmb193dGluaXRpYWxpemUodm9ydGV4LCB3dCwgMSk7CisJCXZvcnRleF9maWZvX3NldHd0dmFsaWQodm9ydGV4LCB3dCwgMSk7CisJCXZvcnRleF93dF9zZXRzdGVyZW8odm9ydGV4LCB3dCwgbnJfY2ggLSAxKTsKKwl9IGVsc2UKKwkJdm9ydGV4X2ZpZm9fc2V0d3R2YWxpZCh2b3J0ZXgsIHd0LCAwKTsKKwkKKwkvKiBTZXQgbWl4ZG93biBtb2RlLiAqLworCXZvcnRleF93dF9zZXRkc291dCh2b3J0ZXgsIHd0LCAxKTsKKwkvKiBTZXQgb3RoZXIgcGFyYW1ldGVyIHJlZ2lzdGVycy4gKi8KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfU1JBTVAoMCksIDB4ODgwMDAwKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9HTU9ERSgwKSwgMHhmZmZmZmZmZik7CisjaWZkZWYgQ0hJUF9BVTg4MzAKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfU1JBTVAoMSksIDB4ODgwMDAwKTsKKwkvL2h3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9HTU9ERSgxKSwgMHhmZmZmZmZmZik7CisjZW5kaWYKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfUEFSTSh3dCwgMCksIDApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAxKSwgMCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1BBUk0od3QsIDIpLCAwKTsKKworCXRlbXAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAzKSk7CisJcHJpbnRrKCJ2b3J0ZXg6IFdUIFBBUk0zOiAleFxuIiwgdGVtcCk7CisJLy9od3dyaXRlKHZvcnRleC0+bW1pbywgV1RfUEFSTSh3dCwgMyksIHRlbXApOworCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAwKSwgMCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAxKSwgMCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAyKSwgMCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAzKSwgMCk7CisKKwlwcmludGsoInZvcnRleDogV1QgR01PREU6ICV4XG4iLCBod3JlYWQodm9ydGV4LT5tbWlvLCBXVF9HTU9ERSh3dCkpKTsKKworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAyKSwgMHhmZmZmZmZmZik7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1BBUk0od3QsIDMpLCAweGNmZjFjODEwKTsKKworCXZvaWNlLT5wYXJtMCA9IHZvaWNlLT5wYXJtMSA9IDB4Y2ZiMjNlMmY7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1BBUk0od3QsIDApLCB2b2ljZS0+cGFybTApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAxKSwgdm9pY2UtPnBhcm0xKTsKKwlwcmludGsoInZvcnRleDogV1QgR01PREUgMiA6ICV4XG4iLCBod3JlYWQodm9ydGV4LT5tbWlvLCBXVF9HTU9ERSh3dCkpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RfY29ubmVjdCh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGVuKQoreworCWludCBpLCBpaSwgbWl4OworCisjZGVmaW5lIE5SX1dUUk9VVEVTIDYKKyNpZmRlZiBDSElQX0FVODgzMAorI2RlZmluZSBOUl9XVEJMT0NLUyAyCisjZWxzZQorI2RlZmluZSBOUl9XVEJMT0NLUyAxCisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBOUl9XVEJMT0NLUzsgaSsrKSB7CisJCWZvciAoaWkgPSAwOyBpaSA8IE5SX1dUUk9VVEVTOyBpaSsrKSB7CisJCQltaXggPQorCQkJICAgIHZvcnRleF9hZGJfY2hlY2tpbm91dCh2b3J0ZXgsCisJCQkJCQkgIHZvcnRleC0+Zml4ZWRfcmVzLCBlbiwKKwkJCQkJCSAgVk9SVEVYX1JFU09VUkNFX01JWElOKTsKKwkJCXZvcnRleC0+bWl4d3RbKGkgKiBOUl9XVFJPVVRFUykgKyBpaV0gPSBtaXg7CisKKwkJCXZvcnRleF9yb3V0ZSh2b3J0ZXgsIGVuLCAweDExLAorCQkJCSAgICAgQURCX1dUT1VUKGksIGlpICsgMHgyMCksIEFEQl9NSVhJTihtaXgpKTsKKworCQkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleCwgZW4sIG1peCwKKwkJCQkJCSAgICB2b3J0ZXgtPm1peHBsYXliW2lpICUgMl0sIDApOworCQkJaWYgKFZPUlRFWF9JU19RVUFEKHZvcnRleCkpCisJCQkJdm9ydGV4X2Nvbm5lY3Rpb25fbWl4aW5fbWl4KHZvcnRleCwgZW4sCisJCQkJCQkJICAgIG1peCwKKwkJCQkJCQkgICAgdm9ydGV4LT5taXhwbGF5YlsyICsKKwkJCQkJCQkJICAgICAoaWkgJSAyKV0sIDApOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBOUl9XVDsgaSsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9SVU4oaSksIDEpOworCX0KK30KKworLyogUmVhZCBXVCBSZWdpc3RlciAqLworI2lmIDAKK3N0YXRpYyBpbnQgdm9ydGV4X3d0X0dldFJlZyh2b3J0ZXhfdCAqIHZvcnRleCwgY2hhciByZWcsIGludCB3dCkKK3sKKwkvL2ludCBlYXgsIGVzaTsKKworCWlmIChyZWcgPT0gNCkgeworCQlyZXR1cm4gaHdyZWFkKHZvcnRleC0+bW1pbywgV1RfUEFSTSh3dCwgMykpOworCX0KKwlpZiAocmVnID09IDcpIHsKKwkJcmV0dXJuIGh3cmVhZCh2b3J0ZXgtPm1taW8sIFdUX0dNT0RFKHd0KSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdUIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyIGdlbmVyaWMgcmVnaXN0ZXIgaW50ZXJmYWNlLiAqLworc3RhdGljIGludAordm9ydGV4X3d0X1NldFJlZzIodm9ydGV4X3QgKiB2b3J0ZXgsIHVuc2lnbmVkIGNoYXIgcmVnLCBpbnQgd3QsCisJCSAgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCS8qCisJICAgaW50IGVheCwgZWR4OworCisJICAgaWYgKHd0ID49IE5SX1dUKSAgLy8gMHg0MCAtPiBOUl9XVAorCSAgIHJldHVybiAwOworCisJICAgaWYgKChyZWcgLSAweDIwKSA+IDApIHsKKwkgICBpZiAoKHJlZyAtIDB4MjEpICE9IDApIAorCSAgIHJldHVybiAwOworCSAgIGVheCA9ICgoKChiICYgMHhmZikgPDwgMHhiKSArIChlZHggJiAweGZmKSkgPDwgNCkgKyAweDIwODsgLy8gcGFyYW0gMgorCSAgIH0gZWxzZSB7CisJICAgZWF4ID0gKCgoKGIgJiAweGZmKSA8PCAweGIpICsgKGVkeCAmIDB4ZmYpKSA8PCA0KSArIDB4MjBhOyAvLyBwYXJhbSAzCisJICAgfQorCSAgIGh3d3JpdGUodm9ydGV4LT5tbWlvLCBlYXgsIGMpOworCSAqLworCXJldHVybiAxOworfQorCisvKnB1YmxpYzogc3RhdGljIHZvaWQgX190aGlzY2FsbCBDV1RIYWw6OlNldFJlZyh1bnNpZ25lZCBjaGFyLGludCx1bnNpZ25lZCBsb25nKSAqLworI2VuZGlmCitzdGF0aWMgaW50Cit2b3J0ZXhfd3RfU2V0UmVnKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBjaGFyIHJlZywgaW50IHd0LAorCQkgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaW50IGVjeDsKKworCWlmICgocmVnID09IDUpIHx8ICgocmVnID49IDcpICYmIChyZWcgPD0gMTApKSB8fCAocmVnID09IDB4YykpIHsKKwkJaWYgKHd0ID49IChOUl9XVCAvIE5SX1dUX1BCKSkgeworCQkJcHJpbnRrCisJCQkgICAgKCJ2b3J0ZXg6IFdUIFNldFJlZzogYmFuayBvdXQgb2YgcmFuZ2UuIHJlZz0weCV4LCB3dD0lZFxuIiwKKwkJCSAgICAgcmVnLCB3dCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh3dCA+PSBOUl9XVCkgeworCQkJcHJpbnRrKCJ2b3J0ZXg6IFdUIFNldFJlZzogdm9pY2Ugb3V0IG9mIHJhbmdlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChyZWcgPiAweGMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChyZWcpIHsKKwkJLyogVm9pY2Ugc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCWNhc2UgMDoJCS8qIHJ1bm5pbmcgKi8KKwkJLy9wcmludGsoInZvcnRleDogV1QgU2V0UmVnKDB4JXgpID0gMHglMDh4XG4iLCBXVF9SVU4od3QpLCAoaW50KXZhbCk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9SVU4od3QpLCB2YWwpOworCQlyZXR1cm4gMHhjOworCQlicmVhazsKKwljYXNlIDE6CQkvKiBwYXJhbSAwICovCisJCS8vcHJpbnRrKCJ2b3J0ZXg6IFdUIFNldFJlZygweCV4KSA9IDB4JTA4eFxuIiwgV1RfUEFSTSh3dCwwKSwgKGludCl2YWwpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfUEFSTSh3dCwgMCksIHZhbCk7CisJCXJldHVybiAweGM7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIHBhcmFtIDEgKi8KKwkJLy9wcmludGsoInZvcnRleDogV1QgU2V0UmVnKDB4JXgpID0gMHglMDh4XG4iLCBXVF9QQVJNKHd0LDEpLCAoaW50KXZhbCk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAxKSwgdmFsKTsKKwkJcmV0dXJuIDB4YzsKKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogcGFyYW0gMiAqLworCQkvL3ByaW50aygidm9ydGV4OiBXVCBTZXRSZWcoMHgleCkgPSAweCUwOHhcbiIsIFdUX1BBUk0od3QsMiksIChpbnQpdmFsKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1BBUk0od3QsIDIpLCB2YWwpOworCQlyZXR1cm4gMHhjOworCQlicmVhazsKKwljYXNlIDQ6CQkvKiBwYXJhbSAzICovCisJCS8vcHJpbnRrKCJ2b3J0ZXg6IFdUIFNldFJlZygweCV4KSA9IDB4JTA4eFxuIiwgV1RfUEFSTSh3dCwzKSwgKGludCl2YWwpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfUEFSTSh3dCwgMyksIHZhbCk7CisJCXJldHVybiAweGM7CisJCWJyZWFrOworCWNhc2UgNjoJCS8qIG11dGUgKi8KKwkJLy9wcmludGsoInZvcnRleDogV1QgU2V0UmVnKDB4JXgpID0gMHglMDh4XG4iLCBXVF9NVVRFKHd0KSwgKGludCl2YWwpOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfTVVURSh3dCksIHZhbCk7CisJCXJldHVybiAweGM7CisJCWJyZWFrOworCWNhc2UgMHhiOgorCQl7CQkvKiBkZWxheSAqLworCQkJLy9wcmludGsoInZvcnRleDogV1QgU2V0UmVnKDB4JXgpID0gMHglMDh4XG4iLCBXVF9ERUxBWSh3dCwwKSwgKGludCl2YWwpOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAzKSwgdmFsKTsKKwkJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9ERUxBWSh3dCwgMiksIHZhbCk7CisJCQlod3dyaXRlKHZvcnRleC0+bW1pbywgV1RfREVMQVkod3QsIDEpLCB2YWwpOworCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX0RFTEFZKHd0LCAwKSwgdmFsKTsKKwkJCXJldHVybiAweGM7CisJCX0KKwkJYnJlYWs7CisJCS8qIEdsb2JhbCBXVCBibG9jayBwYXJhbWV0ZXJzICovCisJY2FzZSA1OgkJLyogc3JhbXAgKi8KKwkJZWN4ID0gV1RfU1JBTVAod3QpOworCQlicmVhazsKKwljYXNlIDg6CQkvKiBhcmFtcCAqLworCQllY3ggPSBXVF9BUkFNUCh3dCk7CisJCWJyZWFrOworCWNhc2UgOToJCS8qIG1yYW1wICovCisJCWVjeCA9IFdUX01SQU1QKHd0KTsKKwkJYnJlYWs7CisJY2FzZSAweGE6CQkvKiBjdHJsICovCisJCWVjeCA9IFdUX0NUUkwod3QpOworCQlicmVhazsKKwljYXNlIDB4YzoJCS8qIGRzX3JlZyAqLworCQllY3ggPSBXVF9EU1JFRyh3dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCQlicmVhazsKKwl9CisJLy9wcmludGsoInZvcnRleDogV1QgU2V0UmVnKDB4JXgpID0gMHglMDh4XG4iLCBlY3gsIChpbnQpdmFsKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgZWN4LCB2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfd3RfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlpbnQgdmFyNCwgdmFyOCwgdmFyYywgdmFyMTAgPSAwLCBlZGk7CisKKwl2YXIxMCAmPSAweEZGRkZGRkUzOworCXZhcjEwIHw9IDB4MjI7CisJdmFyMTAgJj0gMHhGRkZGRkVCRjsKKwl2YXIxMCB8PSAweDgwOworCXZhcjEwIHw9IDB4MjAwOworCXZhcjEwICY9IDB4ZmZmZmZmZmU7CisJdmFyMTAgJj0gMHhmZmZmZmJmZjsKKwl2YXIxMCB8PSAweDE4MDA7CisJLy8gdmFyMTAgPSAweDFBQTIKKwl2YXI0ID0gMHgxMDAwMDAwMDsKKwl2YXJjID0gMHgwMDgzMDAwMDsKKwl2YXI4ID0gMHgwMDgzMDAwMDsKKworCS8qIEluaXQgQmFuayByZWdpc3RlcnMuICovCisJZm9yIChlZGkgPSAwOyBlZGkgPCAoTlJfV1QgLyBOUl9XVF9QQik7IGVkaSsrKSB7CisJCXZvcnRleF93dF9TZXRSZWcodm9ydGV4LCAweGMsIGVkaSwgMCk7CS8qIGRzX3JlZyAqLworCQl2b3J0ZXhfd3RfU2V0UmVnKHZvcnRleCwgMHhhLCBlZGksIHZhcjEwKTsJLyogY3RybCAgKi8KKwkJdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXgsIDB4OSwgZWRpLCB2YXI0KTsJLyogbXJhbXAgKi8KKwkJdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXgsIDB4OCwgZWRpLCB2YXJjKTsJLyogYXJhbXAgKi8KKwkJdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXgsIDB4NSwgZWRpLCB2YXI4KTsJLyogc3JhbXAgKi8KKwl9CisJLyogSW5pdCBWb2ljZSByZWdpc3RlcnMuICovCisJZm9yIChlZGkgPSAwOyBlZGkgPCBOUl9XVDsgZWRpKyspIHsKKwkJdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXgsIDB4NCwgZWRpLCAwKTsJLyogcGFyYW0gMyAweDIwYyAqLworCQl2b3J0ZXhfd3RfU2V0UmVnKHZvcnRleCwgMHgzLCBlZGksIDApOwkvKiBwYXJhbSAyIDB4MjA4ICovCisJCXZvcnRleF93dF9TZXRSZWcodm9ydGV4LCAweDIsIGVkaSwgMCk7CS8qIHBhcmFtIDEgMHgyMDQgKi8KKwkJdm9ydGV4X3d0X1NldFJlZyh2b3J0ZXgsIDB4MSwgZWRpLCAwKTsJLyogcGFyYW0gMCAweDIwMCAqLworCQl2b3J0ZXhfd3RfU2V0UmVnKHZvcnRleCwgMHhiLCBlZGksIDApOwkvKiBkZWxheSAweDQwMCAtIDB4NDBjICovCisJfQorCXZhcjEwIHw9IDE7CisJZm9yIChlZGkgPSAwOyBlZGkgPCAoTlJfV1QgLyBOUl9XVF9QQik7IGVkaSsrKQorCQl2b3J0ZXhfd3RfU2V0UmVnKHZvcnRleCwgMHhhLCBlZGksIHZhcjEwKTsJLyogY3RybCAqLworfQorCisvKiBFeHRyYWN0IG9mIENBZGJUb3BvbG9neTo6U2V0Vm9sdW1lKHN0cnVjdCBfQVNQVk9MVU1FICopICovCisjaWYgMAorc3RhdGljIHZvaWQgdm9ydGV4X3d0X1NldFZvbHVtZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0LCBpbnQgdm9sW10pCit7CisJd3Rfdm9pY2VfdCAqdm9pY2UgPSAmKHZvcnRleC0+d3Rfdm9pY2Vbd3RdKTsKKwlpbnQgZWN4ID0gdm9sWzFdLCBlYXggPSB2b2xbMF07CisKKwkvKiBUaGlzIGlzIHB1cmUgZ3Vlc3MgKi8KKwl2b2ljZS0+cGFybTAgJj0gMHhmZjAwZmZmZjsKKwl2b2ljZS0+cGFybTAgfD0gKHZvbFswXSAmIDB4ZmYpIDw8IDB4MTA7CisJdm9pY2UtPnBhcm0xICY9IDB4ZmYwMGZmZmY7CisJdm9pY2UtPnBhcm0xIHw9ICh2b2xbMV0gJiAweGZmKSA8PCAweDEwOworCisJLyogVGhpcyBpcyByZWFsICovCisJaHd3cml0ZSh2b3J0ZXgsIFdUX1BBUk0od3QsIDApLCB2b2ljZS0+cGFybTApOworCWh3d3JpdGUodm9ydGV4LCBXVF9QQVJNKHd0LCAxKSwgdm9pY2UtPnBhcm0wKTsKKworCWlmICh2b2ljZS0+dGhpc18xRDAgJiA0KSB7CisJCWVheCA+Pj0gODsKKwkJZWN4ID0gZWF4OworCQlpZiAoZWN4IDwgMHg4MCkKKwkJCWVjeCA9IDB4N2Y7CisJCXZvaWNlLT5wYXJtMyAmPSAweEZGRkZDMDdGOworCQl2b2ljZS0+cGFybTMgfD0gKGVjeCAmIDB4N2YpIDw8IDc7CisJCXZvaWNlLT5wYXJtMyAmPSAweEZGRkZGRjgwOworCQl2b2ljZS0+cGFybTMgfD0gKGVheCAmIDB4N2YpOworCX0gZWxzZSB7CisJCXZvaWNlLT5wYXJtMyAmPSAweEZGRTAzRkZGOworCQl2b2ljZS0+cGFybTMgfD0gKGVheCAmIDB4RkUwMCkgPDwgNTsKKwl9CisKKwlod3dyaXRlKHZvcnRleCwgV1RfUEFSTSh3dCwgMyksIHZvaWNlLT5wYXJtMyk7Cit9CisKKy8qIEV4dHJhY3Qgb2YgQ0FkYlRvcG9sb2d5OjpTZXRGcmVxdWVuY3kodW5zaWduZWQgbG9uZyBhcmdfMCkgKi8KK3N0YXRpYyB2b2lkIHZvcnRleF93dF9TZXRGcmVxdWVuY3kodm9ydGV4X3QgKiB2b3J0ZXgsIGludCB3dCwgdW5zaWduZWQgaW50IHNyKQoreworCXd0X3ZvaWNlX3QgKnZvaWNlID0gJih2b3J0ZXgtPnd0X3ZvaWNlW3d0XSk7CisJbG9uZyBpbnQgZWF4LCBlZHg7CisKKwkvL0ZJWE1FOiA2NCBiaXQgb3BlcmF0aW9uLgorCWVheCA9ICgoc3IgPDwgMHhmKSAqIDB4NTc2MTlGMSkgJiAweGZmZmZmZmZmOworCWVkeCA9ICgoKHNyIDw8IDB4ZikgKiAweDU3NjE5RjEpKSA+PiAweDIwOworCisJZWR4ID4+PSAweGE7CisJZWR4IDw8PSAxOworCWlmIChlZHgpIHsKKwkJaWYgKGVkeCAmIDB4MEZGRjgwMDAwKQorCQkJZWF4ID0gMHg3ZmZmOworCQllbHNlIHsKKwkJCWVkeCA8PD0gMHhkOworCQkJZWF4ID0gNzsKKwkJCXdoaWxlICgoZWR4ICYgMHg4MDAwMDAwMCkgPT0gMCkgeworCQkJCWVkeCA8PD0gMTsKKwkJCQllYXgtLTsKKwkJCQlpZiAoZWF4ID09IDApIDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlYXgpCisJCQkJZWR4IDw8PSAxOworCQkJZWF4IDw8PSAweGM7CisJCQllZHggPj49IDB4MTQ7CisJCQllYXggfD0gZWR4OworCQl9CisJfSBlbHNlCisJCWVheCA9IDA7CisJdm9pY2UtPnBhcm0wICY9IDB4ZmZmZjAwMDE7CisJdm9pY2UtPnBhcm0wIHw9IChlYXggJiAweDdmZmYpIDw8IDE7CisJdm9pY2UtPnBhcm0xID0gdm9pY2UtPnBhcm0wIHwgMTsKKwkvLyBXdDogdGhpc18xRDQKKwkvL0F1V3Q6OldyaXRlUmVnKCh1bG9uZykodGhpc18xREM8PDQpKzB4MjAwLCAodWxvbmcpdGhpc18xRTQpOworCS8vQXVXdDo6V3JpdGVSZWcoKHVsb25nKSh0aGlzXzFEQzw8NCkrMHgyMDQsICh1bG9uZyl0aGlzXzFFOCk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFdUX1BBUk0od3QsIDApLCB2b2ljZS0+cGFybTApOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBXVF9QQVJNKHd0LCAxKSwgdm9pY2UtPnBhcm0xKTsKK30KKyNlbmRpZgorCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfd3QuaCBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3d0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNmM4OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3d0LmgKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdUIHJlZ2lzdGVyIG9mZnNldHMuCisgKgorICogIFdlZCBPY3QgMjIgMTM6NTA6MjAgMjAwMworICogIENvcHlyaWdodCAgMjAwMyAgbWphbmRlcgorICogIG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2Uub3JnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0FVODhYMF9XVF9ICisjZGVmaW5lIF9BVTg4WDBfV1RfSAorCisvKiBXVCBjaGFubmVscyBhcmUgZ3JvdXBlZCBpbiBiYW5rcy4gRWFjaCBiYW5rIGhhcyAweDIwIGNoYW5uZWxzLiAqLworLyogQmFuayByZWdpc3RlciBhZGRyZXNzIGJvdW5kYXJ5IGlzIDB4ODAwMCAqLworCisjZGVmaW5lIE5SX1dUX1BCIDB4MjAKKworLyogV1QgYmFuayBiYXNlIHJlZ2lzdGVyIChhcyBkd29yZCBhZGRyZXNzKS4gKi8KKyNkZWZpbmUgV1RfQkFSKHgpICgoKHgpJjB4ZmZlMCk8PDB4OCkKKyNkZWZpbmUgV1RfQkFOSyh4KSAoeD4+NSkKKy8qIFdUIEJhbmsgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdUX0NUUkwoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDApPDwyKQkvKiAweDAwMDAgKi8KKyNkZWZpbmUgV1RfU1JBTVAoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDEpPDwyKQkvKiAweDAwMDQgKi8KKyNkZWZpbmUgV1RfRFNSRUcoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDIpPDwyKQkvKiAweDAwMDggKi8KKyNkZWZpbmUgV1RfTVJBTVAoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDMpPDwyKQkvKiAweDAwMGMgKi8KKyNkZWZpbmUgV1RfR01PREUoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDQpPDwyKQkvKiAweDAwMTAgKi8KKyNkZWZpbmUgV1RfQVJBTVAoYmFuaykJKCgoKChiYW5rKSYxKTw8MHhkKSArIDB4MDUpPDwyKQkvKiAweDAwMTQgKi8KKy8qIFdUIFZvaWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBXVF9TVEVSRU8odm9pY2UpCSgoV1RfQkFSKHZvaWNlKSsgMHgyMCArKCgodm9pY2UpJjB4MWYpPj4xKSk8PDIpCS8qIDB4MDA4MCAqLworI2RlZmluZSBXVF9NVVRFKHZvaWNlKQkJKChXVF9CQVIodm9pY2UpKyAweDQwICsoKHZvaWNlKSYweDFmKSk8PDIpCS8qIDB4MDEwMCAqLworI2RlZmluZSBXVF9SVU4odm9pY2UpCQkoKFdUX0JBUih2b2ljZSkrIDB4NjAgKygodm9pY2UpJjB4MWYpKTw8MikJLyogMHgwMTgwICovCisvKiBTb21lIGtpbmQgb2YgcGFyYW1ldGVycy4gKi8KKy8qIFBBUk0wLCBQQVJNMSA6IEZpbHRlciAoMHhGRjAwMDAwMCksIFNhbXBsZVJhdGUgKDB4MDAwMEZGRkYpICovCisvKiBQQVJNMiwgUEFSTTMgOiBTdGlsbCB1bmtub3duICovCisjZGVmaW5lIFdUX1BBUk0oeCx5KQkoKChXVF9CQVIoeCkpKyAweDgwICsoKCh4KSYweDFmKTw8MikrKHkpKTw8MikJLyogMHgwMjAwICovCisjZGVmaW5lIFdUX0RFTEFZKHgseSkJKCgoV1RfQkFSKHgpKSsgMHgxMDAgKygoKHgpJjB4MWYpPDwyKSsoeSkpPDwyKQkvKiAweDA0MDAgKi8KKworLyogTnVtZXJpYyBpbmRleGVzIHVzZWQgYnkgU2V0UmVnKCkgYW5kIEdldFJlZygpICovCisjaWYgMAorZW51bSB7CisJcnVuID0gMCwJCS8qIDAgIFcgMTpydW4gMDpzdG9wICovCisJcGFybTAsCQkJLyogMSAgVyBmaWx0ZXIsIHNhbXBsZXJhdGUgKi8KKwlwYXJtMSwJCQkvKiAyICBXIGZpbHRlciwgc2FtcGxlcmF0ZSAqLworCXBhcm0yLAkJCS8qIDMgIFcgICovCisJcGFybTMsCQkJLyogNCAgUlcgdm9sdW1lLiBUaGlzIHZhbHVlIGlzIGNhbGN1bGF0ZWQgdXNpbmcgZmxvYXRpbmcgcG9pbnQgb3BzLiAqLworCXNyYW1wLAkJCS8qIDUgIFcgKi8KKwltdXRlLAkJCS8qIDYgIFcgMTptdXRlLCAwOnVubXV0ZSAqLworCWdtb2RlLAkJCS8qIDcgIFJPIExvb2tzIGxpa2Ugb25seSBiaXQwIGlzIHVzZWQuICovCisJYXJhbXAsCQkJLyogOCAgVyAqLworCW1yYW1wLAkJCS8qIDkgIFcgKi8KKwljdHJsLAkJCS8qIGEgIFcgKi8KKwlkZWxheSwJCQkvKiBiICBXIEFsbCA0IHZhbHVlcyBhcmUgd3JpdHRlbiBhdCBvbmNlIHdpdGggc2FtZSB2YWx1ZS4gKi8KKwlkc3JlZywJCQkvKiBjICAoUilXICovCit9IHd0X3JlZzsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBhcm0wOwkvKiB0aGlzXzFFNCAqLworCXVuc2lnbmVkIGludCBwYXJtMTsJLyogdGhpc18xRTggKi8KKwl1bnNpZ25lZCBpbnQgcGFybTI7CS8qIHRoaXNfMUVDICovCisJdW5zaWduZWQgaW50IHBhcm0zOwkvKiB0aGlzXzFGMCAqLworCXVuc2lnbmVkIGludCB0aGlzXzFEMDsKK30gd3Rfdm9pY2VfdDsKKworI2VuZGlmCQkJCS8qIF9BVTg4WDBfV1RfSCAqLworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfeHRhbGsuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3h0YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MTVmYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3h0YWxrLmMKQEAgLTAsMCArMSw3ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgYXU4OHgwX2N4dGFsay5jCisgKgorICogIFdlZCBOb3YgMTkgMTY6Mjk6NDcgMjAwMworICogIENvcHlyaWdodCAgMjAwMyAgbWphbmRlcgorICogIG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2Uub3JnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJhdTg4eDBfeHRhbGsuaCIKKworLyogRGF0YSAoYSB3aG9sZSBsb3Qgb2YgZGF0YS4uLi4gKSAqLworCitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrV2lkZUtMZWZ0RXEgPSAweDI2OUM7CitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrV2lkZUtSaWdodEVxID0gMHgyNjlDOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa1dpZGVLTGVmdFh0ID0gMHhGMjVFOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa1dpZGVLUmlnaHRYdCA9IDB4RjI1RTsKK3N0YXRpYyBzaG9ydCBjb25zdCBzWHRhbGtXaWRlU2hpZnRMZWZ0RXEgPSAxOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa1dpZGVTaGlmdFJpZ2h0RXEgPSAxOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa1dpZGVTaGlmdExlZnRYdCA9IDA7CitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrV2lkZVNoaWZ0UmlnaHRYdCA9IDA7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29uc3Qgd1h0YWxrV2lkZUxlZnREZWxheSA9IDB4ZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdCB3WHRhbGtXaWRlUmlnaHREZWxheSA9IDB4ZDsKK3N0YXRpYyBzaG9ydCBjb25zdCBzWHRhbGtOYXJyb3dLTGVmdEVxID0gMHg0NjhEOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa05hcnJvd0tSaWdodEVxID0gMHg0NjhEOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa05hcnJvd0tMZWZ0WHQgPSAweEY4MkU7CitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrTmFycm93S1JpZ2h0WHQgPSAweEY4MkU7CitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrTmFycm93U2hpZnRMZWZ0RXEgPSAweDM7CitzdGF0aWMgc2hvcnQgY29uc3Qgc1h0YWxrTmFycm93U2hpZnRSaWdodEVxID0gMHgzOworc3RhdGljIHNob3J0IGNvbnN0IHNYdGFsa05hcnJvd1NoaWZ0TGVmdFh0ID0gMDsKK3N0YXRpYyBzaG9ydCBjb25zdCBzWHRhbGtOYXJyb3dTaGlmdFJpZ2h0WHQgPSAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0IHdYdGFsa05hcnJvd0xlZnREZWxheSA9IDB4NzsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb25zdCB3WHRhbGtOYXJyb3dSaWdodERlbGF5ID0gMHg3OworCitzdGF0aWMgeHRhbGtfZ2FpbnNfdCBjb25zdCBhc1h0YWxrR2FpbnNEZWZhdWx0ID0geworCTB4NDAwMCwgMHg0MDAwLCA0MDAwLCAweDQwMDAsIDQwMDAsIDB4NDAwMCwgNDAwMCwgMHg0MDAwLCA0MDAwLAorCTB4NDAwMAorfTsKKworc3RhdGljIHh0YWxrX2dhaW5zX3QgY29uc3QgYXNYdGFsa0dhaW5zVGVzdCA9IHsKKwkweDgwMDAsIDB4N0ZGRiwgMCwgMHhGRkZGLCAweDAwMDEsIDB4QzAwMCwgMHg0MDAwLCAweEZGRkUsIDB4MDAwMiwKKwkwCit9Oworc3RhdGljIHh0YWxrX2dhaW5zX3QgY29uc3QgYXNYdGFsa0dhaW5zMUNoYW4gPSB7CisJMHg3RkZGLCAwLCAwLCAwLCAweDdGRkYsIDAsIDAsIDAsIDAsIDAKK307CisKKy8vIElucHV0IGdhaW4gZm9yIDQgQTNEIHNsaWNlcy4gT25lIHBvc3NpYmxlIGlucHV0IHBhaXIgaXMgbGVmdCB6ZXJvLgorc3RhdGljIHh0YWxrX2dhaW5zX3QgY29uc3QgYXNYdGFsa0dhaW5zQWxsQ2hhbiA9IHsKKwkweDdGRkYsIDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYsIDAsIDB4N0ZGRiwgMHg3RkZGLCAweDdGRkYsIDB4N0ZGRiwKKwkwCisJICAgIC8vMHg3RkZGLDB4N0ZGRiwweDdGRkYsMHg3RkZGLDB4N2ZmZiwweDdGRkYsMHg3RkZGLDB4N0ZGRiwweDdGRkYsMHg3ZmZmCit9Oworc3RhdGljIHh0YWxrX2dhaW5zX3QgY29uc3QgYXNYdGFsa0dhaW5zWmVyb3MgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIHh0YWxrX2RsaW5lX3QgY29uc3QgYWxYdGFsa0RsaW5lWmVyb3MgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAKK307CitzdGF0aWMgeHRhbGtfZGxpbmVfdCBjb25zdCBhbFh0YWxrRGxpbmVUZXN0ID0geworCTB4RkMxOCwgMHgwM0U4RkZGRiwgMHgxODZBMCwgMHg3OTYwRkZGRSwgMSwgMHhGRkZGRkZGRiwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAKK307CisKK3N0YXRpYyB4dGFsa19pbnN0YXRlX3QgY29uc3QgYXNYdGFsa0luU3RhdGVaZXJvcyA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIHh0YWxrX2luc3RhdGVfdCBjb25zdCBhc1h0YWxrSW5TdGF0ZVRlc3QgPQorICAgIHsgMHhGRjgwLCAweDAwODAsIDB4RkZGRiwgMHgwMDAxIH07CitzdGF0aWMgeHRhbGtfc3RhdGVfdCBjb25zdCBhc1h0YWxrT3V0U3RhdGVaZXJvcyA9IHsKKwl7MCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDB9Cit9Oworc3RhdGljIHNob3J0IGNvbnN0IHNEaWFtb25kS0xlZnRFcSA9IDB4NDAxZDsKK3N0YXRpYyBzaG9ydCBjb25zdCBzRGlhbW9uZEtSaWdodEVxID0gMHg0MDFkOworc3RhdGljIHNob3J0IGNvbnN0IHNEaWFtb25kS0xlZnRYdCA9IDB4RjkwRTsKK3N0YXRpYyBzaG9ydCBjb25zdCBzRGlhbW9uZEtSaWdodFh0ID0gMHhGOTBFOworc3RhdGljIHNob3J0IGNvbnN0IHNEaWFtb25kU2hpZnRMZWZ0RXEgPSAxOwkvKiAweEY5MEUgSXMgdGhpcyBhIGJ1ZyA/Pz8gKi8KK3N0YXRpYyBzaG9ydCBjb25zdCBzRGlhbW9uZFNoaWZ0UmlnaHRFcSA9IDE7CitzdGF0aWMgc2hvcnQgY29uc3Qgc0RpYW1vbmRTaGlmdExlZnRYdCA9IDA7CitzdGF0aWMgc2hvcnQgY29uc3Qgc0RpYW1vbmRTaGlmdFJpZ2h0WHQgPSAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0IHdEaWFtb25kTGVmdERlbGF5ID0gMHhiOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnN0IHdEaWFtb25kUmlnaHREZWxheSA9IDB4YjsKKworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa1dpZGVDb2Vmc0xlZnRFcSA9IHsKKwl7MHhFQzRDLCAweERDRTksIDB4RkRDMiwgMHhGRUVDLCAwfSwKKwl7MHg1RjYwLCAweENCQ0IsIDB4RkMyNiwgMHgwMzA1LCAwfSwKKwl7MHgzNDBCLCAweGY1MDQsIDB4NkNFOCwgMHgwRDIzLCAweDAwRTR9LAorCXsweEQ1MDAsIDB4OEQ3NiwgMHhBQ0M3LCAweDVCMDUsIDB4MDBGQX0sCisJezB4N0YwNCwgMHhDMEZBLCAweDAyNjMsIDB4RkRBMiwgMH0KK307CitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrV2lkZUNvZWZzUmlnaHRFcSA9IHsKKwl7MHhFQzRDLCAweERDRTksIDB4RkRDMiwgMHhGRUVDLCAwfSwKKwl7MHg1RjYwLCAweENCQ0IsIDB4RkMyNiwgMHgwMzA1LCAwfSwKKwl7MHgzNDBCLCAweEY1MDQsIDB4NkNFOCwgMHgwRDIzLCAweDAwRTR9LAorCXsweEQ1MDAsIDB4OEQ3NiwgMHhBQ0M3LCAweDVCMDUsIDB4MDBGQX0sCisJezB4N0YwNCwgMHhDMEZBLCAweDAyNjMsIDB4RkRBMiwgMH0KK307CitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrV2lkZUNvZWZzTGVmdFh0ID0geworCXsweDg2QzMsIDB4N0I1NSwgMHg4OUMzLCAweDAwNUIsIDB4MDA0N30sCisJezB4NjAwMCwgMHgyMDZBLCAweEM2Q0EsIDB4NDBGRiwgMH0sCisJezB4MTEwMCwgMHgxMTY0LCAweEExRDcsIDB4OTBGQywgMHgwMDAxfSwKKwl7MHhEQzAwLCAweDlFNzcsIDB4QjhDNywgMHgwQUZGLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0KK307CitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrV2lkZUNvZWZzUmlnaHRYdCA9IHsKKwl7MHg4NkMzLCAweDdCNTUsIDB4ODlDMywgMHgwMDVCLCAweDAwNDd9LAorCXsweDYwMDAsIDB4MjA2QSwgMHhDNkNBLCAweDQwRkYsIDB9LAorCXsweDExMDAsIDB4MTE2NCwgMHhBMUQ3LCAweDkwRkMsIDB4MDAwMX0sCisJezB4REMwMCwgMHg5RTc3LCAweEI4QzcsIDB4MEFGRiwgMH0sCisJezAsIDAsIDAsIDAsIDB9Cit9Oworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa05hcnJvd0NvZWZzTGVmdEVxID0geworCXsweDUwQjUsIDB4RDA3QywgMHgwMjZELCAweEZEMjEsIDB9LAorCXsweDQ2MEYsIDB4RTQ0RiwgMHhGNzVFLCAweEVGQTYsIDB9LAorCXsweDU1NkQsIDB4RENBQiwgMHgyMDk4LCAweEYwRjIsIDB9LAorCXsweDdFMDMsIDB4QzFGMCwgMHgwMDdELCAweEZGODksIDB9LAorCXsweDM4M0UsIDB4RkQ5RCwgMHhCMjc4LCAweDQ1NDcsIDB9Cit9OworCitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrTmFycm93Q29lZnNSaWdodEVxID0geworCXsweDUwQjUsIDB4RDA3QywgMHgwMjZELCAweEZEMjEsIDB9LAorCXsweDQ2MEYsIDB4RTQ0RiwgMHhGNzVFLCAweEVGQTYsIDB9LAorCXsweDU1NkQsIDB4RENBQiwgMHgyMDk4LCAweEYwRjIsIDB9LAorCXsweDdFMDMsIDB4QzFGMCwgMHgwMDdELCAweEZGODksIDB9LAorCXsweDM4M0UsIDB4RkQ5RCwgMHhCMjc4LCAweDQ1NDcsIDB9Cit9OworCitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrTmFycm93Q29lZnNMZWZ0WHQgPSB7CisJezB4M0NCMiwgMHhERjQ5LCAweEY2RUEsIDB4MDk1QiwgMH0sCisJezB4Njc3NywgMHhDOTE1LCAweEZFQUYsIDB4MDBCMSwgMH0sCisJezB4Nzc2MiwgMHhDN0Q5LCAweDAyNUIsIDB4RkRBNiwgMH0sCisJezB4NkI3QSwgMHhEMkFBLCAweEYyRkIsIDB4MEI2NCwgMH0sCisJezAsIDAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrTmFycm93Q29lZnNSaWdodFh0ID0geworCXsweDNDQjIsIDB4REY0OSwgMHhGNkVBLCAweDA5NUIsIDB9LAorCXsweDY3NzcsIDB4QzkxNSwgMHhGRUFGLCAweDAwQjEsIDB9LAorCXsweDc3NjIsIDB4QzdEOSwgMHgwMjVCLCAweEZEQTYsIDB9LAorCXsweDZCN0EsIDB4RDJBQSwgMHhGMkZCLCAweDBCNjQsIDB9LAorCXswLCAwLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa0NvZWZzWmVyb3MgPSB7CisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfQorfTsKK3N0YXRpYyB4dGFsa19jb2Vmc190IGNvbnN0IGFzWHRhbGtDb2Vmc1BpcGUgPSB7CisJezAsIDAsIDB4MEZBMCwgMCwgMH0sCisJezAsIDAsIDB4MEZBMCwgMCwgMH0sCisJezAsIDAsIDB4MEZBMCwgMCwgMH0sCisJezAsIDAsIDB4MEZBMCwgMCwgMH0sCisJezAsIDAsIDB4MTE4MCwgMCwgMH0sCit9Oworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa0NvZWZzTmVnUGlwZSA9IHsKKwl7MCwgMCwgMHhGMzgwLCAwLCAwfSwKKwl7MCwgMCwgMHhGMzgwLCAwLCAwfSwKKwl7MCwgMCwgMHhGMzgwLCAwLCAwfSwKKwl7MCwgMCwgMHhGMzgwLCAwLCAwfSwKKwl7MCwgMCwgMHhGMjAwLCAwLCAwfQorfTsKKworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa0NvZWZzTnVtVGVzdCA9IHsKKwl7MCwgMCwgMHhGMzgwLCAweDgwMDAsIDB4NkQ2MH0sCisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc1h0YWxrQ29lZnNEZW5UZXN0ID0geworCXsweEMwMDAsIDB4MjAwMCwgMHg0MDAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyB4dGFsa19zdGF0ZV90IGNvbnN0IGFzWHRhbGtPdXRTdGF0ZVRlc3QgPSB7CisJezB4N0ZGRiwgMHgwMDA0LCAweEZGRkMsIDB9LAorCXsweEZFMDAsIDB4MDAwOCwgMHhGRkY4LCAweDQwMDB9LAorCXsweDIwMCwgMHgwMDEwLCAweEZGRjAsIDB4QzAwMH0sCisJezB4ODAwMCwgMHgwMDIwLCAweEZGRTAsIDB9LAorCXswLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNEaWFtb25kQ29lZnNMZWZ0RXEgPSB7CisJezB4MEYxRSwgMHgyRDA1LCAweEY4RTMsIDB4MDdDOCwgMH0sCisJezB4NDVFMiwgMHhDQTUxLCAweDA0NDgsIDB4RkNFNywgMH0sCisJezB4QTkzRSwgMHhEQkQ1LCAweDAyMkMsIDB4MDI4QSwgMH0sCisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfQorfTsKKworc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNEaWFtb25kQ29lZnNSaWdodEVxID0geworCXsweDBGMUUsIDB4MkQwNSwgMHhGOEUzLCAweDA3QzgsIDB9LAorCXsweDQ1RTIsIDB4Q0E1MSwgMHgwNDQ4LCAweEZDRTcsIDB9LAorCXsweEE5M0UsIDB4REJENSwgMHgwMjJDLCAweDAyOEEsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyB4dGFsa19jb2Vmc190IGNvbnN0IGFzRGlhbW9uZENvZWZzTGVmdFh0ID0geworCXsweDNCNTAsIDB4RkUwOCwgMHhGOTU5LCAweDAwNjAsIDB9LAorCXsweDlGQ0IsIDB4RDhGMSwgMHgwMEEyLCAweDAwM0EsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgeHRhbGtfY29lZnNfdCBjb25zdCBhc0RpYW1vbmRDb2Vmc1JpZ2h0WHQgPSB7CisJezB4M0I1MCwgMHhGRTA4LCAweEY5NTksIDB4MDA2MCwgMH0sCisJezB4OUZDQiwgMHhEOEYxLCAweDAwQTIsIDB4MDAzQSwgMH0sCisJezAsIDAsIDAsIDAsIDB9LAorCXswLCAwLCAwLCAwLCAwfSwKKwl7MCwgMCwgMCwgMCwgMH0KK307CisKKyAvKiovCisvKiBYVGFsayBFUSBhbmQgWFQgKi8KK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19TZXRMZWZ0RVEodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0IGFyZ18wLCBzaG9ydCBhcmdfNCwKKwkJCSB4dGFsa19jb2Vmc190IGNvbnN0IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDIwMCArIGkgKiAweDI0LCBjb2Vmc1tpXVswXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MjA0ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzFdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQyMDggKyBpICogMHgyNCwgY29lZnNbaV1bMl0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDIwYyArIGkgKiAweDI0LCBjb2Vmc1tpXVszXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MjEwICsgaSAqIDB4MjQsIGNvZWZzW2ldWzRdKTsKKwl9CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1MzgsIGFyZ18wICYgMHhmZmZmKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUzQywgYXJnXzQgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRFUSh2b3J0ZXhfdCAqIHZvcnRleCwgc2hvcnQgYXJnXzAsIHNob3J0IGFyZ180LAorCQkJICB4dGFsa19jb2Vmc190IGNvbnN0IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDJiNCArIGkgKiAweDI0LCBjb2Vmc1tpXVswXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MmI4ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzFdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQyYmMgKyBpICogMHgyNCwgY29lZnNbaV1bMl0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDJjMCArIGkgKiAweDI0LCBjb2Vmc1tpXVszXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MmM0ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzRdKTsKKwl9CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1NDAsIGFyZ18wICYgMHhmZmZmKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDU0NCwgYXJnXzQgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X1h0YWxrSHdfU2V0TGVmdFhUKHZvcnRleF90ICogdm9ydGV4LCBzaG9ydCBhcmdfMCwgc2hvcnQgYXJnXzQsCisJCQkgeHRhbGtfY29lZnNfdCBjb25zdCBjb2VmcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQzNjggKyBpICogMHgyNCwgY29lZnNbaV1bMF0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDM2YyArIGkgKiAweDI0LCBjb2Vmc1tpXVsxXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MzcwICsgaSAqIDB4MjQsIGNvZWZzW2ldWzJdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQzNzQgKyBpICogMHgyNCwgY29lZnNbaV1bM10pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDM3OCArIGkgKiAweDI0LCBjb2Vmc1tpXVs0XSk7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTQ4LCBhcmdfMCAmIDB4ZmZmZik7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1NEMsIGFyZ180ICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X1NldFJpZ2h0WFQodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0IGFyZ18wLCBzaG9ydCBhcmdfNCwKKwkJCSAgeHRhbGtfY29lZnNfdCBjb25zdCBjb2VmcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ0MUMgKyBpICogMHgyNCwgY29lZnNbaV1bMF0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDQyMCArIGkgKiAweDI0LCBjb2Vmc1tpXVsxXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NDI0ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzJdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ0MjggKyBpICogMHgyNCwgY29lZnNbaV1bM10pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDQyQyArIGkgKiAweDI0LCBjb2Vmc1tpXVs0XSk7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTUwLCBhcmdfMCAmIDB4ZmZmZik7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1NTQsIGFyZ180ICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X1NldExlZnRFUVN0YXRlcyh2b3J0ZXhfdCAqIHZvcnRleCwKKwkJCSAgICAgICB4dGFsa19pbnN0YXRlX3QgY29uc3QgYXJnXzAsCisJCQkgICAgICAgeHRhbGtfc3RhdGVfdCBjb25zdCBjb2VmcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQyMTQgKyBpICogMHgyNCwgY29lZnNbaV1bMF0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDIxOCArIGkgKiAweDI0LCBjb2Vmc1tpXVsxXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MjFDICsgaSAqIDB4MjQsIGNvZWZzW2ldWzJdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQyMjAgKyBpICogMHgyNCwgY29lZnNbaV1bM10pOworCX0KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDRGOCArIGkgKiAweDI0LCBhcmdfMFswXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ0RkMgKyBpICogMHgyNCwgYXJnXzBbMV0pOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTAwICsgaSAqIDB4MjQsIGFyZ18wWzJdKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUwNCArIGkgKiAweDI0LCBhcmdfMFszXSk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19TZXRSaWdodEVRU3RhdGVzKHZvcnRleF90ICogdm9ydGV4LAorCQkJCXh0YWxrX2luc3RhdGVfdCBjb25zdCBhcmdfMCwKKwkJCQl4dGFsa19zdGF0ZV90IGNvbnN0IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDJDOCArIGkgKiAweDI0LCBjb2Vmc1tpXVswXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MkNDICsgaSAqIDB4MjQsIGNvZWZzW2ldWzFdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQyRDAgKyBpICogMHgyNCwgY29lZnNbaV1bMl0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDRENCArIGkgKiAweDI0LCBjb2Vmc1tpXVszXSk7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTA4ICsgaSAqIDB4MjQsIGFyZ18wWzBdKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUwQyArIGkgKiAweDI0LCBhcmdfMFsxXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1MTAgKyBpICogMHgyNCwgYXJnXzBbMl0pOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTE0ICsgaSAqIDB4MjQsIGFyZ18wWzNdKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X1NldExlZnRYVFN0YXRlcyh2b3J0ZXhfdCAqIHZvcnRleCwKKwkJCSAgICAgICB4dGFsa19pbnN0YXRlX3QgY29uc3QgYXJnXzAsCisJCQkgICAgICAgeHRhbGtfc3RhdGVfdCBjb25zdCBjb2VmcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQzN0MgKyBpICogMHgyNCwgY29lZnNbaV1bMF0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDM4MCArIGkgKiAweDI0LCBjb2Vmc1tpXVsxXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0Mzg0ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzJdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQzODggKyBpICogMHgyNCwgY29lZnNbaV1bM10pOworCX0KKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUxOCArIGkgKiAweDI0LCBhcmdfMFswXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1MUMgKyBpICogMHgyNCwgYXJnXzBbMV0pOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTIwICsgaSAqIDB4MjQsIGFyZ18wWzJdKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUyNCArIGkgKiAweDI0LCBhcmdfMFszXSk7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19TZXRSaWdodFhUU3RhdGVzKHZvcnRleF90ICogdm9ydGV4LAorCQkJCXh0YWxrX2luc3RhdGVfdCBjb25zdCBhcmdfMCwKKwkJCQl4dGFsa19zdGF0ZV90IGNvbnN0IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDQzMCArIGkgKiAweDI0LCBjb2Vmc1tpXVswXSk7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NDM0ICsgaSAqIDB4MjQsIGNvZWZzW2ldWzFdKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ0MzggKyBpICogMHgyNCwgY29lZnNbaV1bMl0pOworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDQzQyArIGkgKiAweDI0LCBjb2Vmc1tpXVszXSk7CisJfQorCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTI4ICsgaSAqIDB4MjQsIGFyZ18wWzBdKTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDUyQyArIGkgKiAweDI0LCBhcmdfMFsxXSk7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ1MzAgKyBpICogMHgyNCwgYXJnXzBbMl0pOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NTM0ICsgaSAqIDB4MjQsIGFyZ18wWzNdKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19HZXRMZWZ0RVEodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0ICphcmdfMCwgc2hvcnQgKmFyZ180LAorCQkJIHh0YWxrX2NvZWZzX3QgY29lZnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWNvZWZzW2ldWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDIwMCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMV0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MjA0ICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyMDggKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDIwYyArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bNF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MjEwICsgaSAqIDB4MjQpOworCX0KKwkqYXJnXzAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTM4KSAmIDB4ZmZmZjsKKwkqYXJnXzQgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTNjKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X0dldFJpZ2h0RVEodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0ICphcmdfMCwgc2hvcnQgKmFyZ180LAorCQkJICB4dGFsa19jb2Vmc190IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQljb2Vmc1tpXVswXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyYjQgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDJiOCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MmJjICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVszXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyYzAgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzRdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDJjNCArIGkgKiAweDI0KTsKKwl9CisJKmFyZ18wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDU0MCkgJiAweGZmZmY7CisJKmFyZ180ID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDU0NCkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19HZXRMZWZ0WFQodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0ICphcmdfMCwgc2hvcnQgKmFyZ180LAorCQkJIHh0YWxrX2NvZWZzX3QgY29lZnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWNvZWZzW2ldWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDM2OCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMV0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MzZDICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQzNzAgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDM3NCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bNF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0Mzc4ICsgaSAqIDB4MjQpOworCX0KKwkqYXJnXzAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTQ4KSAmIDB4ZmZmZjsKKwkqYXJnXzQgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTRDKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X0dldFJpZ2h0WFQodm9ydGV4X3QgKiB2b3J0ZXgsIHNob3J0ICphcmdfMCwgc2hvcnQgKmFyZ180LAorCQkJICB4dGFsa19jb2Vmc190IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQljb2Vmc1tpXVswXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ0MUMgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDQyMCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NDI0ICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVszXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ0MjggKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzRdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDQyQyArIGkgKiAweDI0KTsKKwl9CisJKmFyZ18wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDU1MCkgJiAweGZmZmY7CisJKmFyZ180ID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDU1NCkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19HZXRMZWZ0RVFTdGF0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHh0YWxrX2luc3RhdGVfdCBhcmdfMCwKKwkJCSAgICAgICB4dGFsa19zdGF0ZV90IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQljb2Vmc1tpXVswXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyMTQgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDIxOCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MjFDICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVszXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyMjAgKyBpICogMHgyNCk7CisJfQorCWFyZ18wWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDRGOCArIGkgKiAweDI0KTsKKwlhcmdfMFsxXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ0RkMgKyBpICogMHgyNCk7CisJYXJnXzBbMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTAwICsgaSAqIDB4MjQpOworCWFyZ18wWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDUwNCArIGkgKiAweDI0KTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X0dldFJpZ2h0RVFTdGF0ZXModm9ydGV4X3QgKiB2b3J0ZXgsIHh0YWxrX2luc3RhdGVfdCBhcmdfMCwKKwkJCQl4dGFsa19zdGF0ZV90IGNvZWZzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQljb2Vmc1tpXVswXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyQzggKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDJDQyArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MkQwICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVszXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQyRDQgKyBpICogMHgyNCk7CisJfQorCWFyZ18wWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDUwOCArIGkgKiAweDI0KTsKKwlhcmdfMFsxXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ1MEMgKyBpICogMHgyNCk7CisJYXJnXzBbMl0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTEwICsgaSAqIDB4MjQpOworCWFyZ18wWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDUxNCArIGkgKiAweDI0KTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X0dldExlZnRYVFN0YXRlcyh2b3J0ZXhfdCAqIHZvcnRleCwgeHRhbGtfaW5zdGF0ZV90IGFyZ18wLAorCQkJICAgICAgIHh0YWxrX3N0YXRlX3QgY29lZnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWNvZWZzW2ldWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDM3QyArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMV0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0MzgwICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQzODQgKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDM4OCArIGkgKiAweDI0KTsKKwl9CisJYXJnXzBbMF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTE4ICsgaSAqIDB4MjQpOworCWFyZ18wWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDUxQyArIGkgKiAweDI0KTsKKwlhcmdfMFsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ1MjAgKyBpICogMHgyNCk7CisJYXJnXzBbM10gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTI0ICsgaSAqIDB4MjQpOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X1h0YWxrSHdfR2V0UmlnaHRYVFN0YXRlcyh2b3J0ZXhfdCAqIHZvcnRleCwgeHRhbGtfaW5zdGF0ZV90IGFyZ18wLAorCQkJCXh0YWxrX3N0YXRlX3QgY29lZnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWNvZWZzW2ldWzBdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDQzMCArIGkgKiAweDI0KTsKKwkJY29lZnNbaV1bMV0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NDM0ICsgaSAqIDB4MjQpOworCQljb2Vmc1tpXVsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ0MzggKyBpICogMHgyNCk7CisJCWNvZWZzW2ldWzNdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDQzQyArIGkgKiAweDI0KTsKKwl9CisJYXJnXzBbMF0gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTI4ICsgaSAqIDB4MjQpOworCWFyZ18wWzFdID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDUyQyArIGkgKiAweDI0KTsKKwlhcmdfMFsyXSA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ1MzAgKyBpICogMHgyNCk7CisJYXJnXzBbM10gPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NTM0ICsgaSAqIDB4MjQpOworfQorCisjZW5kaWYKKy8qIEdhaW5zICovCisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19TZXRHYWlucyh2b3J0ZXhfdCAqIHZvcnRleCwgeHRhbGtfZ2FpbnNfdCBjb25zdCBnYWlucykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYVEdBSU5TX1NaOyBpKyspIHsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ0RDAgKyAoaSAqIDQpLCBnYWluc1tpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAordm9ydGV4X1h0YWxrSHdfU2V0R2FpbnNBbGxDaGFuKHZvcnRleF90ICogdm9ydGV4KQoreworCXZvcnRleF9YdGFsa0h3X1NldEdhaW5zKHZvcnRleCwgYXNYdGFsa0dhaW5zQWxsQ2hhbik7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19HZXRHYWlucyh2b3J0ZXhfdCAqIHZvcnRleCwgeHRhbGtfZ2FpbnNfdCBnYWlucykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYVEdBSU5TX1NaOyBpKyspCisJCWdhaW5zW2ldID0gaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDREMCArIGkgKiA0KTsKK30KKworI2VuZGlmCisvKiBEZWxheSBwYXJhbWV0ZXJzICovCisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfWHRhbGtId19TZXREZWxheSh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgc2hvcnQgcmlnaHQsCisJCQl1bnNpZ25lZCBzaG9ydCBsZWZ0KQoreworCWludCBlc3AwID0gMDsKKworCWVzcDAgJj0gMHgxRkZGRkZGRjsKKwllc3AwIHw9IDB4QTAwMDAwMDA7CisJZXNwMCA9IChlc3AwICYgMHhmZmZmRTBmZikgfCAoKHJpZ2h0ICYgMHgxRikgPDwgOCk7CisJZXNwMCA9IChlc3AwICYgMHhmZmZjMWZmZikgfCAoKGxlZnQgJiAweDFGKSA8PCAweGQpOworCisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ2NjAsIGVzcDApOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X1h0YWxrSHdfU2V0TGVmdERsaW5lKHZvcnRleF90ICogdm9ydGV4LCB4dGFsa19kbGluZV90IGNvbnN0IGRsaW5lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykgeworCQlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDAwMCArIChpIDw8IDIpLCBkbGluZVtpXSAmIDB4ZmZmZik7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MDgwICsgKGkgPDwgMiksIGRsaW5lW2ldID4+IDB4MTApOworCX0KK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X1NldFJpZ2h0RGxpbmUodm9ydGV4X3QgKiB2b3J0ZXgsIHh0YWxrX2RsaW5lX3QgY29uc3QgZGxpbmUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKSB7CisJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0MTAwICsgKGkgPDwgMiksIGRsaW5lW2ldICYgMHhmZmZmKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQxODAgKyAoaSA8PCAyKSwgZGxpbmVbaV0gPj4gMHgxMCk7CisJfQorfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3ZvcnRleF9YdGFsa0h3X0dldERlbGF5KHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBzaG9ydCAqcmlnaHQsCisJCQl1bnNpZ25lZCBzaG9ydCAqbGVmdCkKK3sKKwlpbnQgZXNwMDsKKworCWVzcDAgPSBod3JlYWQodm9ydGV4LT5tbWlvLCAweDI0NjYwKTsKKwkqcmlnaHQgPSAoZXNwMCA+PiA4KSAmIDB4MWY7CisJKmxlZnQgPSAoZXNwMCA+PiAweGQpICYgMHgxZjsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfR2V0TGVmdERsaW5lKHZvcnRleF90ICogdm9ydGV4LCB4dGFsa19kbGluZV90IGRsaW5lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykgeworCQlkbGluZVtpXSA9CisJCSAgICAoaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDAwMCArIChpIDw8IDIpKSAmIDB4ZmZmZikgfAorCQkgICAgKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQwODAgKyAoaSA8PCAyKSkgPDwgMHgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19HZXRSaWdodERsaW5lKHZvcnRleF90ICogdm9ydGV4LCB4dGFsa19kbGluZV90IGRsaW5lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykgeworCQlkbGluZVtpXSA9CisJCSAgICAoaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDEwMCArIChpIDw8IDIpKSAmIDB4ZmZmZikgfAorCQkgICAgKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQxODAgKyAoaSA8PCAyKSkgPDwgMHgxMCk7CisJfQorfQorCisjZW5kaWYKKy8qIENvbnRyb2wvR2xvYmFsIHN0dWZmICovCisKKyNpZiAwCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19TZXRDb250cm9sUmVnKHZvcnRleF90ICogdm9ydGV4LCB1bnNpZ25lZCBsb25nIGN0cmwpCit7CisJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ2NjAsIGN0cmwpOworfQorc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfR2V0Q29udHJvbFJlZyh2b3J0ZXhfdCAqIHZvcnRleCwgdW5zaWduZWQgbG9uZyAqY3RybCkKK3sKKwkqY3RybCA9IGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ2NjApOworfQorI2VuZGlmCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19TZXRTYW1wbGVSYXRlKHZvcnRleF90ICogdm9ydGV4LCBpbnQgc3IpCit7CisJaW50IHRlbXA7CisKKwl0ZW1wID0gKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ2NjApICYgMHgxRkZGRkZGRikgfCAweEMwMDAwMDAwOworCXRlbXAgPSAodGVtcCAmIDB4ZmZmZmZmMDcpIHwgKChzciAmIDB4MWYpIDw8IDMpOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NjYwLCB0ZW1wKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X0dldFNhbXBsZVJhdGUodm9ydGV4X3QgKiB2b3J0ZXgsIGludCAqc3IpCit7CisJKnNyID0gKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ2NjApID4+IDMpICYgMHgxZjsKK30KKworI2VuZGlmCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19FbmFibGUodm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJaW50IHRlbXA7CisKKwl0ZW1wID0gKGh3cmVhZCh2b3J0ZXgtPm1taW8sIDB4MjQ2NjApICYgMHgxRkZGRkZGRikgfCAweEMwMDAwMDAwOworCXRlbXAgfD0gMTsKKwlod3dyaXRlKHZvcnRleC0+bW1pbywgMHgyNDY2MCwgdGVtcCk7CisKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfRGlzYWJsZSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwlpbnQgdGVtcDsKKworCXRlbXAgPSAoaHdyZWFkKHZvcnRleC0+bW1pbywgMHgyNDY2MCkgJiAweDFGRkZGRkZGKSB8IDB4QzAwMDAwMDA7CisJdGVtcCAmPSAweGZmZmZmZmZlOworCWh3d3JpdGUodm9ydGV4LT5tbWlvLCAweDI0NjYwLCB0ZW1wKTsKKworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19aZXJvSU8odm9ydGV4X3QgKiB2b3J0ZXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ2MDAgKyAoaSA8PCAyKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIDB4MjQ2NTAgKyAoaSA8PCAyKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1plcm9TdGF0ZSh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwl2b3J0ZXhfWHRhbGtId19aZXJvSU8odm9ydGV4KTsJLy8gaW5saW5lZAorCisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdEVRKHZvcnRleCwgMCwgMCwgYXNYdGFsa0NvZWZzWmVyb3MpOworCXZvcnRleF9YdGFsa0h3X1NldFJpZ2h0RVEodm9ydGV4LCAwLCAwLCBhc1h0YWxrQ29lZnNaZXJvcyk7CisKKwl2b3J0ZXhfWHRhbGtId19TZXRMZWZ0WFQodm9ydGV4LCAwLCAwLCBhc1h0YWxrQ29lZnNaZXJvcyk7CisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRYVCh2b3J0ZXgsIDAsIDAsIGFzWHRhbGtDb2Vmc1plcm9zKTsKKworCXZvcnRleF9YdGFsa0h3X1NldEdhaW5zKHZvcnRleCwgYXNYdGFsa0dhaW5zWmVyb3MpOwkvLyBpbmxpbmVkCisKKwl2b3J0ZXhfWHRhbGtId19TZXREZWxheSh2b3J0ZXgsIDAsIDApOwkvLyBpbmxpbmVkCisKKwl2b3J0ZXhfWHRhbGtId19TZXRMZWZ0RGxpbmUodm9ydGV4LCBhbFh0YWxrRGxpbmVaZXJvcyk7CS8vIGlubGluZWQKKwl2b3J0ZXhfWHRhbGtId19TZXRSaWdodERsaW5lKHZvcnRleCwgYWxYdGFsa0RsaW5lWmVyb3MpOwkvLyBpbmxpbmVkCisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdERsaW5lKHZvcnRleCwgYWxYdGFsa0RsaW5lWmVyb3MpOwkvLyBpbmxpbmVkCisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHREbGluZSh2b3J0ZXgsIGFsWHRhbGtEbGluZVplcm9zKTsJLy8gaW5saW5lZAorCisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdEVRU3RhdGVzKHZvcnRleCwgYXNYdGFsa0luU3RhdGVaZXJvcywKKwkJCQkgICAgICAgYXNYdGFsa091dFN0YXRlWmVyb3MpOworCXZvcnRleF9YdGFsa0h3X1NldFJpZ2h0RVFTdGF0ZXModm9ydGV4LCBhc1h0YWxrSW5TdGF0ZVplcm9zLAorCQkJCQlhc1h0YWxrT3V0U3RhdGVaZXJvcyk7CisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdFhUU3RhdGVzKHZvcnRleCwgYXNYdGFsa0luU3RhdGVaZXJvcywKKwkJCQkgICAgICAgYXNYdGFsa091dFN0YXRlWmVyb3MpOworCXZvcnRleF9YdGFsa0h3X1NldFJpZ2h0WFRTdGF0ZXModm9ydGV4LCBhc1h0YWxrSW5TdGF0ZVplcm9zLAorCQkJCQlhc1h0YWxrT3V0U3RhdGVaZXJvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1Byb2dyYW1QaXBlKHZvcnRleF90ICogdm9ydGV4KQoreworCisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdEVRKHZvcnRleCwgMCwgMSwgYXNYdGFsa0NvZWZzUGlwZSk7CisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRFUSh2b3J0ZXgsIDAsIDEsIGFzWHRhbGtDb2Vmc1BpcGUpOworCXZvcnRleF9YdGFsa0h3X1NldExlZnRYVCh2b3J0ZXgsIDAsIDAsIGFzWHRhbGtDb2Vmc1plcm9zKTsKKwl2b3J0ZXhfWHRhbGtId19TZXRSaWdodFhUKHZvcnRleCwgMCwgMCwgYXNYdGFsa0NvZWZzWmVyb3MpOworCisJdm9ydGV4X1h0YWxrSHdfU2V0RGVsYXkodm9ydGV4LCAwLCAwKTsJLy8gaW5saW5lZAorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19Qcm9ncmFtWHRhbGtXaWRlKHZvcnRleF90ICogdm9ydGV4KQoreworCisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdEVRKHZvcnRleCwgc1h0YWxrV2lkZUtMZWZ0RXEsCisJCQkJIHNYdGFsa1dpZGVTaGlmdExlZnRFcSwgYXNYdGFsa1dpZGVDb2Vmc0xlZnRFcSk7CisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRFUSh2b3J0ZXgsIHNYdGFsa1dpZGVLUmlnaHRFcSwKKwkJCQkgIHNYdGFsa1dpZGVTaGlmdFJpZ2h0RXEsCisJCQkJICBhc1h0YWxrV2lkZUNvZWZzUmlnaHRFcSk7CisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdFhUKHZvcnRleCwgc1h0YWxrV2lkZUtMZWZ0WHQsCisJCQkJIHNYdGFsa1dpZGVTaGlmdExlZnRYdCwgYXNYdGFsa1dpZGVDb2Vmc0xlZnRYdCk7CisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRYVCh2b3J0ZXgsIHNYdGFsa1dpZGVLTGVmdFh0LAorCQkJCSAgc1h0YWxrV2lkZVNoaWZ0TGVmdFh0LAorCQkJCSAgYXNYdGFsa1dpZGVDb2Vmc0xlZnRYdCk7CisKKwl2b3J0ZXhfWHRhbGtId19TZXREZWxheSh2b3J0ZXgsIHdYdGFsa1dpZGVSaWdodERlbGF5LCB3WHRhbGtXaWRlTGVmdERlbGF5KTsJLy8gaW5saW5lZAorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19Qcm9ncmFtWHRhbGtOYXJyb3codm9ydGV4X3QgKiB2b3J0ZXgpCit7CisKKwl2b3J0ZXhfWHRhbGtId19TZXRMZWZ0RVEodm9ydGV4LCBzWHRhbGtOYXJyb3dLTGVmdEVxLAorCQkJCSBzWHRhbGtOYXJyb3dTaGlmdExlZnRFcSwKKwkJCQkgYXNYdGFsa05hcnJvd0NvZWZzTGVmdEVxKTsKKwl2b3J0ZXhfWHRhbGtId19TZXRSaWdodEVRKHZvcnRleCwgc1h0YWxrTmFycm93S1JpZ2h0RXEsCisJCQkJICBzWHRhbGtOYXJyb3dTaGlmdFJpZ2h0RXEsCisJCQkJICBhc1h0YWxrTmFycm93Q29lZnNSaWdodEVxKTsKKwl2b3J0ZXhfWHRhbGtId19TZXRMZWZ0WFQodm9ydGV4LCBzWHRhbGtOYXJyb3dLTGVmdFh0LAorCQkJCSBzWHRhbGtOYXJyb3dTaGlmdExlZnRYdCwKKwkJCQkgYXNYdGFsa05hcnJvd0NvZWZzTGVmdFh0KTsKKwl2b3J0ZXhfWHRhbGtId19TZXRSaWdodFhUKHZvcnRleCwgc1h0YWxrTmFycm93S0xlZnRYdCwKKwkJCQkgIHNYdGFsa05hcnJvd1NoaWZ0TGVmdFh0LAorCQkJCSAgYXNYdGFsa05hcnJvd0NvZWZzTGVmdFh0KTsKKworCXZvcnRleF9YdGFsa0h3X1NldERlbGF5KHZvcnRleCwgd1h0YWxrTmFycm93UmlnaHREZWxheSwgd1h0YWxrTmFycm93TGVmdERlbGF5KTsJLy8gaW5saW5lZAorfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19Qcm9ncmFtRGlhbW9uZFh0YWxrKHZvcnRleF90ICogdm9ydGV4KQoreworCisJLy9zRGlhbW9uZEtMZWZ0RXEsc0RpYW1vbmRLUmlnaHRYdCxhc0RpYW1vbmRDb2Vmc0xlZnRFcQorCXZvcnRleF9YdGFsa0h3X1NldExlZnRFUSh2b3J0ZXgsIHNEaWFtb25kS0xlZnRFcSwKKwkJCQkgc0RpYW1vbmRTaGlmdExlZnRFcSwgYXNEaWFtb25kQ29lZnNMZWZ0RXEpOworCXZvcnRleF9YdGFsa0h3X1NldFJpZ2h0RVEodm9ydGV4LCBzRGlhbW9uZEtSaWdodEVxLAorCQkJCSAgc0RpYW1vbmRTaGlmdFJpZ2h0RXEsIGFzRGlhbW9uZENvZWZzUmlnaHRFcSk7CisJdm9ydGV4X1h0YWxrSHdfU2V0TGVmdFhUKHZvcnRleCwgc0RpYW1vbmRLTGVmdFh0LAorCQkJCSBzRGlhbW9uZFNoaWZ0TGVmdFh0LCBhc0RpYW1vbmRDb2Vmc0xlZnRYdCk7CisJdm9ydGV4X1h0YWxrSHdfU2V0UmlnaHRYVCh2b3J0ZXgsIHNEaWFtb25kS0xlZnRYdCwKKwkJCQkgIHNEaWFtb25kU2hpZnRMZWZ0WHQsIGFzRGlhbW9uZENvZWZzTGVmdFh0KTsKKworCXZvcnRleF9YdGFsa0h3X1NldERlbGF5KHZvcnRleCwgd0RpYW1vbmRSaWdodERlbGF5LCB3RGlhbW9uZExlZnREZWxheSk7CS8vIGlubGluZWQKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCkKK3sKKwl2b3J0ZXhfWHRhbGtId19aZXJvU3RhdGUodm9ydGV4KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3h0YWxrLmggYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF94dGFsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGQ3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF94dGFsay5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgYXU4OHgwX2N4dGFsay5oCisgKgorICogIFdlZCBOb3YgMTkgMTk6MDc6MTcgMjAwMworICogIENvcHlyaWdodCAgMjAwMyAgbWphbmRlcgorICogIG1qYW5kZXJAdXNlcnMuc291cmNlZm9yZ2Uub3JnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIFRoZSBjcm9zc3RhbGsgY2FuY2VsZXIgc3VwcG9ydHMgNSBzdGVyZW8gaW5wdXQgY2hhbm5lbHMuIFRoZSByZXN1bHQgaXMgCisgICBhdmFpbGFibGUgYXQgb25lIHNpbmdsZSBvdXRwdXQgcm91dGUgcGFpciAoc3RlcmVvKS4gKi8KKworI2lmbmRlZiBfQVU4OFgwX0NYVEFMS19ICisjZGVmaW5lIF9BVTg4WDBfQ1hUQUxLX0gKKworI2luY2x1ZGUgImF1ODh4MC5oIgorCisjZGVmaW5lIFhURExJTkVfU1ogMzIKKyNkZWZpbmUgWFRHQUlOU19TWiAxMAorI2RlZmluZSBYVElOU1RfU1ogNAorCisjZGVmaW5lIFhUX0hFQURQSE9ORQkxCisjZGVmaW5lIFhUX1NQRUFLRVIwCQkyCisjZGVmaW5lIFhUX1NQRUFLRVIxCQkzCisjZGVmaW5lIFhUX0RJQU1PTkQJCTQKKwordHlwZWRlZiBsb25nIHh0YWxrX2RsaW5lX3RbWFRETElORV9TWl07Cit0eXBlZGVmIHNob3J0IHh0YWxrX2dhaW5zX3RbWFRHQUlOU19TWl07Cit0eXBlZGVmIHNob3J0IHh0YWxrX2luc3RhdGVfdFtYVElOU1RfU1pdOwordHlwZWRlZiBzaG9ydCB4dGFsa19jb2Vmc190WzVdWzVdOwordHlwZWRlZiBzaG9ydCB4dGFsa19zdGF0ZV90WzVdWzRdOworCitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19TZXRHYWlucyh2b3J0ZXhfdCAqIHZvcnRleCwKKwkJCQkgICAgeHRhbGtfZ2FpbnNfdCBjb25zdCBnYWlucyk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfWHRhbGtId19TZXRHYWluc0FsbENoYW4odm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfU2V0U2FtcGxlUmF0ZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHNyKTsKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1Byb2dyYW1QaXBlKHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1Byb2dyYW1QaXBlKHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1Byb2dyYW1YdGFsa1dpZGUodm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfUHJvZ3JhbVh0YWxrTmFycm93KHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X1Byb2dyYW1EaWFtb25kWHRhbGsodm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfRW5hYmxlKHZvcnRleF90ICogdm9ydGV4KTsKK3N0YXRpYyB2b2lkIHZvcnRleF9YdGFsa0h3X0Rpc2FibGUodm9ydGV4X3QgKiB2b3J0ZXgpOworc3RhdGljIHZvaWQgdm9ydGV4X1h0YWxrSHdfaW5pdCh2b3J0ZXhfdCAqIHZvcnRleCk7CisKKyNlbmRpZgkJCQkvKiBfQVU4OFgwX0NYVEFMS19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFlNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2F6dDMzMjguYwpAQCAtMCwwICsxLDE1MzYgQEAKKy8qCisgKiAgYXp0MzMyOC5jIC0gZHJpdmVyIGZvciBBenRlY2ggQVpGMzMyOCBiYXNlZCBzb3VuZGNhcmRzIChlLmcuIFBDSTE2OCkuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEFuZHJlYXMgTW9ociA8aHc3b3NoeXV2MzAwMUBzbmVha2VtYWlsLmNvbT4KKyAqCisgKiAgRnJhbWV3b3JrIGJvcnJvd2VkIGZyb20gQmFydCBIYXJ0Z2VycydzIGFsczQwMDAuYy4KKyAqICBEcml2ZXIgZGV2ZWxvcGVkIG9uIFBDSTE2OCBBUChXKSB2ZXJzaW9uIChQQ0kgcmV2LiAxMCwgc3Vic3lzdGVtIElEIDE4MDEpLAorICogIGZvdW5kIGluIGEgRnVqaXRzdS1TaWVtZW5zIFBDICgiQ29yZGFudCIsIGFsdW1pbnVtIGNhc2UpLgorICogIE90aGVyIHZlcnNpb25zIGFyZToKKyAqICBQQ0kxNjggQShXKSwgc3ViIElEIDE4MDAKKyAqICBQQ0kxNjggQS9BUCwgc3ViIElEIDgwMDAKKyAqICBQbGVhc2UgZ2l2ZSBtZSBmZWVkYmFjayBpbiBjYXNlIHlvdSB0cnkgbXkgZHJpdmVyIHdpdGggb25lIG9mIHRoZXNlISEKKyAqCisgKiBHUEwgTElDRU5TRQorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogTk9URVMKKyAqICBTaW5jZSBBenRlY2ggZG9lcyBub3QgcHJvdmlkZSBhbnkgY2hpcHNldCBkb2N1bWVudGF0aW9uLAorICogIGV2ZW4gb24gcmVwZWF0ZWQgcmVxdWVzdCB0byB2YXJpb3VzIGFkZHJlc3NlcywKKyAqICBhbmQgdGhlIGFuc3dlciB0aGF0IHdhcyBmaW5hbGx5IGdpdmVuIHdhcyBuZWdhdGl2ZQorICogIChhbmQgSSB3YXMgc3R1cGlkIGVub3VnaCB0byBtYW5hZ2UgdG8gZ2V0IGhvbGQgb2YgYSBQQ0kxNjggc291bmRjYXJkCisgKiAgaW4gdGhlIGZpcnN0IHBsYWNlID46LVB9KSwKKyAqICBJIHdhcyBmb3JjZWQgdG8gYmFzZSB0aGlzIGRyaXZlciBvbiByZXZlcnNlIGVuZ2luZWVyaW5nCisgKiAgKDMgd2Vla3MnIHdvcnRoIG9mIGV2ZW5pbmdzIGZpbGxlZCB3aXRoIGRyaXZlciB3b3JrKS4KKyAqICAoYW5kIG5vLCBJIGRpZCBOT1QgZ28gdGhlIGVhc3kgd2F5OiB0byBwaWNrIHVwIGEgUENJMTI4IGZvciA5IEV1cm9zKQorICoKKyAqICBUaGUgQVpGMzMyOCBjaGlwIChub3RlOiBBWkYzMzI4LCAqbm90KiBBWlQzMzI4LCB0aGF0J3MganVzdCB0aGUgZHJpdmVyIG5hbWUKKyAqICBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zKSBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqCisgKiAgLSBidWlsdGluIEFDOTcgY29uZm9ybWFudCBjb2RlYyAoU05SIG92ZXIgODBkQikKKyAqICAgIChyZWFsbHkgQUM5NyBjb21wbGlhbnQ/PyBJIHJlYWxseSBkb3VidCBpdCB3aGVuIGxvb2tpbmcKKyAqICAgIGF0IHRoZSBtaXhlciByZWdpc3RlciBsYXlvdXQpCisgKiAgLSBidWlsdGluIGdlbnVpbmUgT1BMMworICogIC0gZnVsbCBkdXBsZXggMTZiaXQgcGxheWJhY2svcmVjb3JkIGF0IGluZGVwZW5kZW50IHNhbXBsaW5nIHJhdGUKKyAqICAtIE1QVTQwMSAoKyBsZWdhY3kgYWRkcmVzcyBzdXBwb3J0KSBGSVhNRTogaG93IHRvIGVuYWJsZSBsZWdhY3kgYWRkcj8/CisgKiAgLSBnYW1lIHBvcnQgKGxlZ2FjeSBhZGRyZXNzIHN1cHBvcnQpCisgKiAgLSBidWlsdC1pbiBHZW5lcmFsIERpcmVjdFggdGltZXIgaGF2aW5nIGEgMjAgYml0cyBjb3VudGVyCisgKiAgICB3aXRoIDF1cyByZXNvbHV0aW9uIChGSVhNRTogd2hlcmUgaXMgaXQ/KQorICogIC0gSTJTIHNlcmlhbCBwb3J0IGZvciBleHRlcm5hbCBEQUMKKyAqICAtIHN1cHBvcnRzIDMzTUh6IFBDSSBzcGVjIDIuMSwgUENJIHBvd2VyIG1hbmFnZW1lbnQgMS4wLCBjb21wbGlhbnQgd2l0aCBBQ1BJCisgKiAgLSBzdXBwb3J0cyBoYXJkd2FyZSB2b2x1bWUgY29udHJvbAorICogIC0gc2luZ2xlIGNoaXAgbG93IGNvc3Qgc29sdXRpb24gKDEyOCBwaW4gUUZQKQorICogIC0gc3VwcG9ydHMgcHJvZ3JhbW1hYmxlIFN1Yi12ZW5kb3IgYW5kIFN1Yi1zeXN0ZW0gSUQKKyAqICAgIHJlcXVpcmVkIGZvciBNaWNyb3NvZnQncyBsb2dvIGNvbXBsaWFuY2UgKEZJWE1FOiB3aGVyZT8pCisgKiAgLSBQQ0kxNjggQVAoVykgY2FyZDogcG93ZXIgYW1wbGlmaWVyIHdpdGggNCBXYXR0cy9jaGFubmVsIGF0IDQgT2htcworICoKKyAqICBDZXJ0YWluIFBDSSB2ZXJzaW9ucyBvZiB0aGlzIGNhcmQgYXJlIHN1c2NlcHRpYmxlIHRvIERNQSB0cmFmZmljIHVuZGVycnVucworICogIGluIHNvbWUgc3lzdGVtcyAocmVzdWx0aW5nIGluIHNvdW5kIGNyYWNrbGluZy9jbGlja2luZy9wb3BwaW5nKSwKKyAqICBwcm9iYWJseSBiZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSBhIERNQSBGSUZPIGJ1ZmZlciBvciBzby4KKyAqICBPdmVydmlldyAoUENJIElEL1BDSSBzdWJJRC9QQ0kgcmV2Lik6CisgKiAgLSBubyBETUEgY3JhY2tsaW5nIG9uIFNpUzczNTogMHg1MERDLzB4MTgwMS8xNgorICogIC0gdW5rbm93biBwZXJmb3JtYW5jZTogMHg1MERDLzB4MTgwMS8xMAorICogIAorICogIENyYWNrbGluZyBoYXBwZW5zIHdpdGggVklBIGNoaXBzZXRzIG9yLCBpbiBteSBjYXNlLCBhbiBTaVM3MzUsIHdoaWNoIGlzCisgKiAgc3VwcG9zZWQgdG8gYmUgdmVyeSBmYXN0IGFuZCBzdXBwb3NlZCB0byBnZXQgcmlkIG9mIGNyYWNrbGluZyBtdWNoCisgKiAgYmV0dGVyIHRoYW4gYSBWSUEsIHlldCBpcm9uaWNhbGx5IEkgc3RpbGwgZ2V0IGNyYWNrbGluZywgbGlrZSBtYW55IG90aGVyCisgKiAgcGVvcGxlIHdpdGggdGhlIHNhbWUgY2hpcHNldC4KKyAqICBQb3NzaWJsZSByZW1lZGllczoKKyAqICAtIHBsdWcgY2FyZCBpbnRvIGEgZGlmZmVyZW50IFBDSSBzbG90LCBwcmVmZXJyYWJseSBvbmUgdGhhdCBpc24ndCBzaGFyZWQKKyAqICAgIHRvbyBtdWNoICh0aGlzIGhlbHBzIGEgbG90LCBidXQgbm90IGNvbXBsZXRlbHkhKQorICogIC0gZ2V0IHJpZCBvZiBQQ0kgVkdBIGNhcmQsIHVzZSBBR1AgaW5zdGVhZAorICogIC0gdXBncmFkZSBvciBkb3duZ3JhZGUgQklPUworICogIC0gZmlkZGxlIHdpdGggUENJIGxhdGVuY3kgc2V0dGluZ3MgKHNldHBjaSAtdiAtcyBCVVNJRCBsYXRlbmN5X3RpbWVyPVhYKQorICogICAgTm90IHRvbyBoZWxwZnVsLgorICogIC0gRGlzYWJsZSBBQ1BJL3Bvd2VyIG1hbmFnZW1lbnQvIkF1dG8gRGV0ZWN0IFJBTS9QQ0kgQ2xrIiBpbiBCSU9TCisgKiAKKyAqIEJVR1MKKyAqICAtIHdoZW4gQ3RybC1DJ2luZyBtcGczMjEsIHRoZSBwbGF5YmFjayBsb29wcyBhIGJpdAorICogICAgKHByZW1hdHVyZSBETUEgcGxheWJhY2sgcmVzZXQ/KQorICogIC0gZnVsbC1kdXBsZXggc29tZXRpbWVzIGJyZWFrcyAoSVJRIG1hbmFnZW1lbnQgaXNzdWVzPykuCisgKiAgICBPbmNlIGV2ZW4gYSBzcG9udGFuZW91cyBSRUJPT1QgaGFwcGVuZWQhISEKKyAqIAorICogVE9ETworICogIC0gdGVzdCBNUFU0MDEgTUlESSBwbGF5YmFjayBldGMuCisgKiAgLSBwb3dlciBtYW5hZ2VtZW50IChDT05GSUdfUE0pLiBTZWUgZS5nLiBpbnRlbDh4MCBvciBjczQyODEuCisgKiAgICBUaGlzIHdvdWxkIGJlIG5pY2Ugc2luY2UgdGhlIGNoaXAgcnVucyBhIGJpdCBob3QsIGFuZCBpdCdzICpyZXF1aXJlZCoKKyAqICAgIGFueXdheSBmb3IgcHJvcGVyIEFDUEkgcG93ZXIgbWFuYWdlbWVudC4gSW4gb3RoZXIgd29yZHM6IHJlc3QKKyAqICAgIGFzc3VyZWQgdGhhdCBJICp3aWxsKiBpbXBsZW1lbnQgdGhpcyB2ZXJ5IHNvb247IGFzIHNvb24gYXMgTGludXggMi41LngKKyAqICAgIGhhcyBwb3dlciBtYW5hZ2VtZW50IHRoYXQncyBidWdmcmVlIGVub3VnaCB0byB3b3JrIHByb3Blcmx5IG9uIG15IGRlc2t0b3AuCisgKiAgLSBmaWd1cmUgb3V0IHdoYXQgYWxsIHVua25vd24gcG9ydCBiaXRzIGFyZSByZXNwb25zaWJsZSBmb3IKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KKyNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImF6dDMzMjguaCIKKworTU9EVUxFX0FVVEhPUigiQW5kcmVhcyBNb2hyIDxodzdvc2h5dXYzMDAxQHNuZWFrZW1haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBenRlY2ggQVpGMzMyOCAoUENJMTY4KSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7QXp0ZWNoLEFaRjMzMjh9fSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKworI2RlZmluZSBERUJVR19NSVNDCTAKKyNkZWZpbmUgREVCVUdfQ0FMTFMJMAorI2RlZmluZSBERUJVR19NSVhFUgkwCisjZGVmaW5lIERFQlVHX1BMQVlfUkVDCTAKKyNkZWZpbmUgREVCVUdfSU8JMAorI2RlZmluZSBNSVhFUl9URVNUSU5HCTAKKworI2lmIERFQlVHX01JU0MKKyNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWlzYyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmb3JtYXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21pc2MoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCQkKKworI2lmIERFQlVHX0NBTExTCisjZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxzKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQorI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKSBwcmludGsoS0VSTl9FUlIgImVudGVyaW5nICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpIHByaW50ayhLRVJOX0VSUiAibGVhdmluZyAlc1xuIiwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY2FsbHMoZm9ybWF0LCBhcmdzLi4uKQorI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKQorI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKQorI2VuZGlmCQkKKworI2lmIERFQlVHX01JWEVSCisjZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21peGVyKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWl4ZXIoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCQkKKworI2lmIERFQlVHX1BMQVlfUkVDCisjZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3BsYXkoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0LCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdwbGF5KGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgkJCisKKyNpZiBERUJVR19JTworI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdpbyhjaGlwLCB3aGVyZSkgXAorCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJRFhfSU9fUExBWV9GTEFHUyAlMDR4LCBJRFhfSU9fUExBWV9JUlFNQVNLICUwNHgsIElEWF9JT19JUlFTVEFUVVMgJTA0eFxuIiwgd2hlcmUsIGludyhjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19QTEFZX0ZMQUdTKSwgaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfSVJRTUFTSyksIGludyhjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19JUlFTVEFUVVMpKQorI2Vsc2UKKyNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnaW8oY2hpcCwgd2hlcmUpCisjZW5kaWYKKwkgICAgCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBWkYzMzI4IHNvdW5kY2FyZC4iKTsKKworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIEFaRjMzMjggc291bmRjYXJkLiIpOworCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgQVpGMzMyOCBzb3VuZGNhcmQuIik7CisKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCitzdGF0aWMgaW50IGpveXN0aWNrW1NORFJWX0NBUkRTXTsKK21vZHVsZV9wYXJhbV9hcnJheShqb3lzdGljaywgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrLCAiRW5hYmxlIGpveXN0aWNrIGZvciBBWkYzMzI4IHNvdW5kY2FyZC4iKTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfc25kX2F6ZjMzMjggYXpmMzMyOF90OworCitzdHJ1Y3QgX3NuZF9hemYzMzI4IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBjb2RlY19wb3J0OworCXVuc2lnbmVkIGxvbmcgaW8yX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBtcHVfcG9ydDsKKwl1bnNpZ25lZCBsb25nIHN5bnRoX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBtaXhlcl9wb3J0OworCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisjZW5kaWYKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKworCXNuZF9wY21fdCAqcGNtOworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX3N1YnN0cmVhbTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpjYXB0dXJlX3N1YnN0cmVhbTsKKwl1bnNpZ25lZCBpbnQgaXNfcGxheWluZzsKKwl1bnNpZ25lZCBpbnQgaXNfcmVjb3JkaW5nOworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYXpmMzMyOF9pZHNbXSA9IHsKKwl7IDB4MTIyRCwgMHg1MERDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sICAgLyogUENJMTY4LzMzMjggKi8KKwl7IDB4MTIyRCwgMHg4MERBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sICAgLyogMzMyOCAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9hemYzMzI4X2lkcyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXpmMzMyOF9pbzJfd3JpdGUoYXpmMzMyOF90ICpjaGlwLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCW91dGIodmFsdWUsIGNoaXAtPmlvMl9wb3J0ICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHNuZF9hemYzMzI4X2lvMl9yZWFkKGF6ZjMzMjhfdCAqY2hpcCwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5iKGNoaXAtPmlvMl9wb3J0ICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc25kX2F6ZjMzMjhfbWl4ZXJfd3JpdGUoYXpmMzMyOF90ICpjaGlwLCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgV09SRF9WQUxVRToKKwkJb3V0dyh2YWx1ZSwgY2hpcC0+bWl4ZXJfcG9ydCArIHJlZyk7CisJCWJyZWFrOworCWNhc2UgRFdPUkRfVkFMVUU6CisJCW91dGwodmFsdWUsIGNoaXAtPm1peGVyX3BvcnQgKyByZWcpOworCQlicmVhazsKKwljYXNlIEJZVEVfVkFMVUU6CisJCW91dGIodmFsdWUsIGNoaXAtPm1peGVyX3BvcnQgKyByZWcpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKGF6ZjMzMjhfdCAqY2hpcCwgaW50IHJlZywgaW50IGRvX211dGUpCit7CisJdW5zaWduZWQgY2hhciBvbGR2YWw7CisKKwkvKiB0aGUgbXV0ZSBiaXQgaXMgb24gdGhlICpzZWNvbmQqIChpLmUuIHJpZ2h0KSByZWdpc3RlciBvZiBhCisJICogbGVmdC9yaWdodCBjaGFubmVsIHNldHRpbmcgKi8KKwlvbGR2YWwgPSBpbmIoY2hpcC0+bWl4ZXJfcG9ydCArIHJlZyArIDEpOworCWlmIChkb19tdXRlKQorCQlvbGR2YWwgfD0gMHg4MDsKKwllbHNlCisJCW9sZHZhbCAmPSB+MHg4MDsKKwlvdXRiKG9sZHZhbCwgY2hpcC0+bWl4ZXJfcG9ydCArIHJlZyArIDEpOworfQorCitzdGF0aWMgdm9pZCBzbmRfYXpmMzMyOF9taXhlcl93cml0ZV92b2x1bWVfZ3JhZHVhbGx5KGF6ZjMzMjhfdCAqY2hpcCwgaW50IHJlZywgdW5zaWduZWQgY2hhciBkc3Rfdm9sX2xlZnQsIHVuc2lnbmVkIGNoYXIgZHN0X3ZvbF9yaWdodCwgaW50IGNoYW5fc2VsLCBpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgY2hhciBjdXJyX3ZvbF9sZWZ0ID0gMCwgY3Vycl92b2xfcmlnaHQgPSAwOworCWludCBsZWZ0X2RvbmUgPSAwLCByaWdodF9kb25lID0gMDsKKwkKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwlpZiAoY2hhbl9zZWwgJiBTRVRfQ0hBTl9MRUZUKQorCQljdXJyX3ZvbF9sZWZ0ICA9IGluYihjaGlwLT5taXhlcl9wb3J0ICsgcmVnICsgMSk7CisJZWxzZQorCQlsZWZ0X2RvbmUgPSAxOworCWlmIChjaGFuX3NlbCAmIFNFVF9DSEFOX1JJR0hUKQorCQljdXJyX3ZvbF9yaWdodCA9IGluYihjaGlwLT5taXhlcl9wb3J0ICsgcmVnICsgMCk7CisJZWxzZQorCQlyaWdodF9kb25lID0gMTsKKwkKKwkvKiB0YWtlIGNhcmUgb2YgbXV0aW5nIGZsYWcgKDB4ODApIGNvbnRhaW5lZCBpbiBsZWZ0IGNoYW5uZWwgKi8KKwlpZiAoY3Vycl92b2xfbGVmdCAmIDB4ODApCisJCWRzdF92b2xfbGVmdCB8PSAweDgwOworCWVsc2UKKwkJZHN0X3ZvbF9sZWZ0ICY9IH4weDgwOworCisJZG8KKwl7CisJCWlmICghbGVmdF9kb25lKQorCQl7CisJCQlpZiAoY3Vycl92b2xfbGVmdCA+IGRzdF92b2xfbGVmdCkKKwkJCQljdXJyX3ZvbF9sZWZ0LS07CisJCQllbHNlCisJCQlpZiAoY3Vycl92b2xfbGVmdCA8IGRzdF92b2xfbGVmdCkKKwkJCQljdXJyX3ZvbF9sZWZ0Kys7CisJCQllbHNlCisJCQkgICAgbGVmdF9kb25lID0gMTsKKwkJCW91dGIoY3Vycl92b2xfbGVmdCwgY2hpcC0+bWl4ZXJfcG9ydCArIHJlZyArIDEpOworCQl9CisJCWlmICghcmlnaHRfZG9uZSkKKwkJeworCQkJaWYgKGN1cnJfdm9sX3JpZ2h0ID4gZHN0X3ZvbF9yaWdodCkKKwkJCQljdXJyX3ZvbF9yaWdodC0tOworCQkJZWxzZQorCQkJaWYgKGN1cnJfdm9sX3JpZ2h0IDwgZHN0X3ZvbF9yaWdodCkKKwkJCQljdXJyX3ZvbF9yaWdodCsrOworCQkJZWxzZQorCQkJICAgIHJpZ2h0X2RvbmUgPSAxOworCQkJLyogZHVyaW5nIHZvbHVtZSBjaGFuZ2UsIHRoZSByaWdodCBjaGFubmVsIGlzIGNyYWNrbGluZworCQkJICogc29tZXdoYXQgbW9yZSB0aGFuIHRoZSBsZWZ0IGNoYW5uZWwsIHVuZm9ydHVuYXRlbHkuCisJCQkgKiBUaGlzIHNlZW1zIHRvIGJlIGEgaGFyZHdhcmUgaXNzdWUuICovCisJCQlvdXRiKGN1cnJfdm9sX3JpZ2h0LCBjaGlwLT5taXhlcl9wb3J0ICsgcmVnICsgMCk7CisJCX0KKwkJaWYgKGRlbGF5KQorCQkJbWRlbGF5KGRlbGF5KTsKKwl9CisJd2hpbGUgKCghbGVmdF9kb25lKSB8fCAoIXJpZ2h0X2RvbmUpKTsKKwlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKK30KKworLyoKKyAqIGdlbmVyYWwgbWl4ZXIgZWxlbWVudAorICovCit0eXBlZGVmIHN0cnVjdCBhemYzMzI4X21peGVyX3JlZyB7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgbGNoYW5fc2hpZnQsIHJjaGFuX3NoaWZ0OworCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGludCBpbnZlcnQ6IDE7CisJdW5zaWduZWQgaW50IHN0ZXJlbzogMTsKKwl1bnNpZ25lZCBpbnQgZW51bV9jOiA0OworfSBhemYzMzI4X21peGVyX3JlZ190OworCisjZGVmaW5lIENPTVBPU0VfTUlYRVJfUkVHKHJlZyxsY2hhbl9zaGlmdCxyY2hhbl9zaGlmdCxtYXNrLGludmVydCxzdGVyZW8sZW51bV9jKSBcCisgKChyZWcpIHwgKGxjaGFuX3NoaWZ0IDw8IDgpIHwgKHJjaGFuX3NoaWZ0IDw8IDEyKSB8IChtYXNrIDw8IDE2KSB8IChpbnZlcnQgPDwgMjQpIHwgKHN0ZXJlbyA8PCAyNSkgfCAoZW51bV9jIDw8IDI2KSkKKworc3RhdGljIHZvaWQgc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZShhemYzMzI4X21peGVyX3JlZ190ICpyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlyLT5yZWcgPSB2YWwgJiAweGZmOworCXItPmxjaGFuX3NoaWZ0ID0gKHZhbCA+PiA4KSAmIDB4MGY7CisJci0+cmNoYW5fc2hpZnQgPSAodmFsID4+IDEyKSAmIDB4MGY7CisJci0+bWFzayA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKwlyLT5pbnZlcnQgPSAodmFsID4+IDI0KSAmIDE7CisJci0+c3RlcmVvID0gKHZhbCA+PiAyNSkgJiAxOworCXItPmVudW1fYyA9ICh2YWwgPj4gMjYpICYgMHgwZjsKK30KKworLyoKKyAqIG1peGVyIHN3aXRjaGVzL3ZvbHVtZXMKKyAqLworCisjZGVmaW5lIEFaRjMzMjhfTUlYRVJfU1dJVENIKHhuYW1lLCByZWcsIHNoaWZ0LCBpbnZlcnQpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZm8gPSBzbmRfYXpmMzMyOF9pbmZvX21peGVyLCBcCisgIC5nZXQgPSBzbmRfYXpmMzMyOF9nZXRfbWl4ZXIsIC5wdXQgPSBzbmRfYXpmMzMyOF9wdXRfbWl4ZXIsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBDT01QT1NFX01JWEVSX1JFRyhyZWcsIHNoaWZ0LCAwLCAweDEsIGludmVydCwgMCwgMCksIFwKK30KKworI2RlZmluZSBBWkYzMzI4X01JWEVSX1ZPTF9TVEVSRU8oeG5hbWUsIHJlZywgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2F6ZjMzMjhfaW5mb19taXhlciwgXAorICAuZ2V0ID0gc25kX2F6ZjMzMjhfZ2V0X21peGVyLCAucHV0ID0gc25kX2F6ZjMzMjhfcHV0X21peGVyLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9NSVhFUl9SRUcocmVnLCA4LCAwLCBtYXNrLCBpbnZlcnQsIDEsIDApLCBcCit9CisKKyNkZWZpbmUgQVpGMzMyOF9NSVhFUl9WT0xfTU9OTyh4bmFtZSwgcmVnLCBtYXNrLCBpc19yaWdodF9jaGFuKSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2F6ZjMzMjhfaW5mb19taXhlciwgXAorICAuZ2V0ID0gc25kX2F6ZjMzMjhfZ2V0X21peGVyLCAucHV0ID0gc25kX2F6ZjMzMjhfcHV0X21peGVyLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9NSVhFUl9SRUcocmVnLCBpc19yaWdodF9jaGFuID8gMCA6IDgsIDAsIG1hc2ssIDEsIDAsIDApLCBcCit9CisKKyNkZWZpbmUgQVpGMzMyOF9NSVhFUl9WT0xfU1BFQ0lBTCh4bmFtZSwgcmVnLCBtYXNrLCBzaGlmdCwgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2F6ZjMzMjhfaW5mb19taXhlciwgXAorICAuZ2V0ID0gc25kX2F6ZjMzMjhfZ2V0X21peGVyLCAucHV0ID0gc25kX2F6ZjMzMjhfcHV0X21peGVyLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9NSVhFUl9SRUcocmVnLCBzaGlmdCwgMCwgbWFzaywgaW52ZXJ0LCAwLCAwKSwgXAorfQorCisjZGVmaW5lIEFaRjMzMjhfTUlYRVJfRU5VTSh4bmFtZSwgcmVnLCBlbnVtX2MsIHNoaWZ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2F6ZjMzMjhfaW5mb19taXhlcl9lbnVtLCBcCisgIC5nZXQgPSBzbmRfYXpmMzMyOF9nZXRfbWl4ZXJfZW51bSwgLnB1dCA9IHNuZF9hemYzMzI4X3B1dF9taXhlcl9lbnVtLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9NSVhFUl9SRUcocmVnLCBzaGlmdCwgMCwgMCwgMCwgMCwgZW51bV9jKSwgXAorfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2luZm9fbWl4ZXIoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlhemYzMzI4X21peGVyX3JlZ190IHJlZzsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOworCXNuZF9hemYzMzI4X21peGVyX3JlZ19kZWNvZGUoJnJlZywga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCXVpbmZvLT50eXBlID0gcmVnLm1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSByZWcuc3RlcmVvICsgMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHJlZy5tYXNrOworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2dldF9taXhlcihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlhemYzMzI4X21peGVyX3JlZ190IHJlZzsKKwl1bnNpZ25lZCBpbnQgb3JlZywgdmFsOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKKwlvcmVnID0gaW53KGNoaXAtPm1peGVyX3BvcnQgKyByZWcucmVnKTsKKwl2YWwgPSAob3JlZyA+PiByZWcubGNoYW5fc2hpZnQpICYgcmVnLm1hc2s7CisJaWYgKHJlZy5pbnZlcnQpCisJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsOworCWlmIChyZWcuc3RlcmVvKSB7CisJCXZhbCA9IChvcmVnID4+IHJlZy5yY2hhbl9zaGlmdCkgJiByZWcubWFzazsKKwkJaWYgKHJlZy5pbnZlcnQpCisJCQl2YWwgPSByZWcubWFzayAtIHZhbDsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSB2YWw7CisJfQorCXNuZF9hemYzMzI4X2RiZ21peGVyKCJnZXQ6ICUwMnggaXMgJTA0eCAtPiB2b2wgJTAybHh8JTAybHggKHNoaWZ0ICUwMmR8JTAyZCwgbWFzayAlMDJ4LCBpbnYuICVkLCBzdGVyZW8gJWQpXG4iLCByZWcucmVnLCBvcmVnLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sIHJlZy5sY2hhbl9zaGlmdCwgcmVnLnJjaGFuX3NoaWZ0LCByZWcubWFzaywgcmVnLmludmVydCwgcmVnLnN0ZXJlbyk7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F6ZjMzMjhfcHV0X21peGVyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYXpmMzMyOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWF6ZjMzMjhfbWl4ZXJfcmVnX3QgcmVnOworCXVuc2lnbmVkIGludCBvcmVnLCBucmVnLCB2YWw7CisKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlvcmVnID0gaW53KGNoaXAtPm1peGVyX3BvcnQgKyByZWcucmVnKTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIHJlZy5tYXNrOworCWlmIChyZWcuaW52ZXJ0KQorCQl2YWwgPSByZWcubWFzayAtIHZhbDsKKwlucmVnID0gb3JlZyAmIH4ocmVnLm1hc2sgPDwgcmVnLmxjaGFuX3NoaWZ0KTsKKwlucmVnIHw9ICh2YWwgPDwgcmVnLmxjaGFuX3NoaWZ0KTsKKwlpZiAocmVnLnN0ZXJlbykgeworCQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIHJlZy5tYXNrOworCQlpZiAocmVnLmludmVydCkKKwkJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOworCQlucmVnICY9IH4ocmVnLm1hc2sgPDwgcmVnLnJjaGFuX3NoaWZ0KTsKKwkJbnJlZyB8PSAodmFsIDw8IHJlZy5yY2hhbl9zaGlmdCk7CisJfQorCWlmIChyZWcubWFzayA+PSAweDA3KSAvKiBpdCdzIGEgdm9sdW1lIGNvbnRyb2wsIHNvIGJldHRlciB0YWtlIGNhcmUgKi8KKwkJc25kX2F6ZjMzMjhfbWl4ZXJfd3JpdGVfdm9sdW1lX2dyYWR1YWxseShjaGlwLCByZWcucmVnLCBucmVnID4+IDgsIG5yZWcgJiAweGZmLCBTRVRfQ0hBTl9MRUZUfFNFVF9DSEFOX1JJR0hULCAwKTsgLyoganVzdCBzZXQgYm90aCBjaGFubmVscywgZG9lc24ndCBtYXR0ZXIgKi8KKwllbHNlCisgICAgICAgIAlvdXR3KG5yZWcsIGNoaXAtPm1peGVyX3BvcnQgKyByZWcucmVnKTsKKworCXNuZF9hemYzMzI4X2RiZ21peGVyKCJwdXQ6ICUwMnggdG8gJTAybHh8JTAybHgsIG9yZWcgJTA0eDsgc2hpZnQgJTAyZHwlMDJkIC0+IG5yZWcgJTA0eDsgYWZ0ZXI6ICUwNHhcbiIsIHJlZy5yZWcsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwgb3JlZywgcmVnLmxjaGFuX3NoaWZ0LCByZWcucmNoYW5fc2hpZnQsIG5yZWcsIGludyhjaGlwLT5taXhlcl9wb3J0ICsgcmVnLnJlZykpOworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAobnJlZyAhPSBvcmVnKTsKK30KKworc3RhdGljIGludCBzbmRfYXpmMzMyOF9pbmZvX21peGVyX2VudW0oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJYXpmMzMyOF9taXhlcl9yZWdfdCByZWc7CisJc3RhdGljIGNoYXIgKnRleHRzMVsyXSA9IHsgIk1vZGVtT3V0MSIsICJNb2RlbU91dDIiIH07CisJc3RhdGljIGNoYXIgKnRleHRzMlsyXSA9IHsgIk1vbm9TZWxlY3RTb3VyY2UxIiwgIk1vbm9TZWxlY3RTb3VyY2UyIiB9OworICAgICAgICBzdGF0aWMgY2hhciAqdGV4dHMzWzhdID0geworICAgICAgICAgICAgICAgICJNaWMiLCAiQ0QiLCAiVmlkZW8iLCAiQXV4IiwgIkxpbmUiLAorICAgICAgICAgICAgICAgICJNaXgiLCAiTWl4IE1vbm8iLCAiUGhvbmUiCisgICAgICAgIH07CisKKwlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisgICAgICAgIHVpbmZvLT5jb3VudCA9IChyZWcucmVnID09IElEWF9NSVhFUl9SRUNfU0VMRUNUKSA/IDIgOiAxOworICAgICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IHJlZy5lbnVtX2M7CisgICAgICAgIGlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gcmVnLmVudW1fYyAtIDFVKQorICAgICAgICAgICAgICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSByZWcuZW51bV9jIC0gMVU7CisJaWYgKHJlZy5yZWcgPT0gSURYX01JWEVSX0FEVkNUTDIpCisJeworCQlpZiAocmVnLmxjaGFuX3NoaWZ0ID09IDgpIC8qIG1vZGVtIG91dCBzZWwgKi8KKwkJCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0czFbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCQllbHNlIC8qIG1vbm8gc2VsIHNvdXJjZSAqLworCQkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzMlt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJfQorCWVsc2UKKyAgICAgICAgCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0czNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0KKyk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2dldF9taXhlcl9lbnVtKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJYXpmMzMyOF9taXhlcl9yZWdfdCByZWc7CisgICAgICAgIGF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsOworICAgICAgICAKKwlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl2YWwgPSBpbncoY2hpcC0+bWl4ZXJfcG9ydCArIHJlZy5yZWcpOworCWlmIChyZWcucmVnID09IElEWF9NSVhFUl9SRUNfU0VMRUNUKQorCXsKKyAgICAgICAgCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IDgpICYgKHJlZy5lbnVtX2MgLSAxKTsKKyAgICAgICAgCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSAodmFsID4+IDApICYgKHJlZy5lbnVtX2MgLSAxKTsKKwl9CisJZWxzZQorICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gcmVnLmxjaGFuX3NoaWZ0KSAmIChyZWcuZW51bV9jIC0gMSk7CisJc25kX2F6ZjMzMjhfZGJnbWl4ZXIoImdldF9lbnVtOiAlMDJ4IGlzICUwNHggLT4gJWR8JWQgKHNoaWZ0ICUwMmQsIGVudW1fYyAlZClcbiIsIHJlZy5yZWcsIHZhbCwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSwgcmVnLmxjaGFuX3NoaWZ0LCByZWcuZW51bV9jKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F6ZjMzMjhfcHV0X21peGVyX2VudW0oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlhemYzMzI4X21peGVyX3JlZ190IHJlZzsKKyAgICAgICAgYXpmMzMyOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBvcmVnLCBucmVnLCB2YWw7CisgICAgICAgIAorCXNuZF9hemYzMzI4X21peGVyX3JlZ19kZWNvZGUoJnJlZywga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCW9yZWcgPSBpbncoY2hpcC0+bWl4ZXJfcG9ydCArIHJlZy5yZWcpOworCXZhbCA9IG9yZWc7CisJaWYgKHJlZy5yZWcgPT0gSURYX01JWEVSX1JFQ19TRUxFQ1QpCisJeworICAgICAgICAJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiByZWcuZW51bV9jIC0gMVUgfHwKKyAgICAgICAgICAgIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gcmVnLmVudW1fYyAtIDFVKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IDgpIHwKKyAgICAgICAgCSAgICAgICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IDApOworCX0KKwllbHNlCisJeworICAgICAgICAJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiByZWcuZW51bV9jIC0gMVUpCisgICAgICAgICAgICAgICAgCXJldHVybiAtRUlOVkFMOworCQl2YWwgJj0gfigocmVnLmVudW1fYyAtIDEpIDw8IHJlZy5sY2hhbl9zaGlmdCk7CisgICAgICAgIAl2YWwgfD0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPDwgcmVnLmxjaGFuX3NoaWZ0KTsKKwl9CisJb3V0dyh2YWwsIGNoaXAtPm1peGVyX3BvcnQgKyByZWcucmVnKTsKKwlucmVnID0gdmFsOworCisJc25kX2F6ZjMzMjhfZGJnbWl4ZXIoInB1dF9lbnVtOiAlMDJ4IHRvICUwNHgsIG9yZWcgJTA0eFxuIiwgcmVnLnJlZywgdmFsLCBvcmVnKTsKKwlyZXR1cm4gKG5yZWcgIT0gb3JlZyk7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2F6ZjMzMjhfbWl4ZXJfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgSURYX01JWEVSX1BMQVlfTUFTVEVSLCAxNSwgMSksCisJQVpGMzMyOF9NSVhFUl9WT0xfU1RFUkVPKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgSURYX01JWEVSX1BMQVlfTUFTVEVSLCAweDFmLCAxKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiV2F2ZSBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfV0FWRU9VVCwgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NURVJFTygiV2F2ZSBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfV0FWRU9VVCwgMHgxZiwgMSksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIldhdmUgUGxheWJhY2sgM0QgQnlwYXNzIiwgSURYX01JWEVSX0FEVkNUTDIsIDcsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJGTSBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfRk1TWU5USCwgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NURVJFTygiRk0gUGxheWJhY2sgVm9sdW1lIiwgSURYX01JWEVSX0ZNU1lOVEgsIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJDRCBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfQ0RBVURJTywgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NURVJFTygiQ0QgUGxheWJhY2sgVm9sdW1lIiwgSURYX01JWEVSX0NEQVVESU8sIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJDYXB0dXJlIFN3aXRjaCIsIElEWF9NSVhFUl9SRUNfVk9MVU1FLCAxNSwgMSksCisJQVpGMzMyOF9NSVhFUl9WT0xfU1RFUkVPKCJDYXB0dXJlIFZvbHVtZSIsIElEWF9NSVhFUl9SRUNfVk9MVU1FLCAweDBmLCAwKSwKKwlBWkYzMzI4X01JWEVSX0VOVU0oIkNhcHR1cmUgU291cmNlIiwgSURYX01JWEVSX1JFQ19TRUxFQ1QsIDgsIDApLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgSURYX01JWEVSX01JQywgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX01PTk8oIk1pYyBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfTUlDLCAweDFmLCAxKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiTWljIEJvb3N0ICgrMjBkQikiLCBJRFhfTUlYRVJfTUlDLCA2LCAwKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfTElORUlOLCAxNSwgMSksCisJQVpGMzMyOF9NSVhFUl9WT0xfU1RFUkVPKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIElEWF9NSVhFUl9MSU5FSU4sIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJQQ0JlZXAgUGxheWJhY2sgU3dpdGNoIiwgSURYX01JWEVSX1BDQkVFUCwgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NQRUNJQUwoIlBDQmVlcCBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfUENCRUVQLCAweDBmLCAxLCAxKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiVmlkZW8gUGxheWJhY2sgU3dpdGNoIiwgSURYX01JWEVSX1ZJREVPLCAxNSwgMSksCisJQVpGMzMyOF9NSVhFUl9WT0xfU1RFUkVPKCJWaWRlbyBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfVklERU8sIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgSURYX01JWEVSX0FVWCwgMTUsIDEpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NURVJFTygiQXV4IFBsYXliYWNrIFZvbHVtZSIsIElEWF9NSVhFUl9BVVgsIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJNb2RlbSBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfTU9ERU1PVVQsIDE1LCAxKSwKKwlBWkYzMzI4X01JWEVSX1ZPTF9NT05PKCJNb2RlbSBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfTU9ERU1PVVQsIDB4MWYsIDEpLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJNb2RlbSBDYXB0dXJlIFN3aXRjaCIsIElEWF9NSVhFUl9NT0RFTUlOLCAxNSwgMSksCisJQVpGMzMyOF9NSVhFUl9WT0xfTU9OTygiTW9kZW0gQ2FwdHVyZSBWb2x1bWUiLCBJRFhfTUlYRVJfTU9ERU1JTiwgMHgxZiwgMSksCisJQVpGMzMyOF9NSVhFUl9FTlVNKCJNb2RlbSBPdXQgU2VsZWN0IiwgSURYX01JWEVSX0FEVkNUTDIsIDIsIDgpLAorCUFaRjMzMjhfTUlYRVJfRU5VTSgiTW9ubyBTZWxlY3QgU291cmNlIiwgSURYX01JWEVSX0FEVkNUTDIsIDIsIDkpLAorCUFaRjMzMjhfTUlYRVJfVk9MX1NQRUNJQUwoIlRvbmUgQ29udHJvbCAtIFRyZWJsZSIsIElEWF9NSVhFUl9CQVNTVFJFQkxFLCAweDA3LCAxLCAwKSwKKwlBWkYzMzI4X01JWEVSX1ZPTF9TUEVDSUFMKCJUb25lIENvbnRyb2wgLSBCYXNzIiwgSURYX01JWEVSX0JBU1NUUkVCTEUsIDB4MDcsIDksIDApLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIzRCBDb250cm9sIC0gVG9nZ2xlIiwgSURYX01JWEVSX0FEVkNUTDIsIDEzLCAwKSwKKwlBWkYzMzI4X01JWEVSX1ZPTF9TUEVDSUFMKCIzRCBDb250cm9sIC0gVm9sdW1lIiwgSURYX01JWEVSX0FEVkNUTDEsIDB4MDcsIDEsIDApLCAvKiAiM0QgV2lkdGgiICovCisJQVpGMzMyOF9NSVhFUl9WT0xfU1BFQ0lBTCgiM0QgQ29udHJvbCAtIFNwYWNlIiwgSURYX01JWEVSX0FEVkNUTDEsIDB4MDMsIDgsIDApLCAvKiAiSGlmaSAzRCIgKi8KKyNpZiBNSVhFUl9URVNUSU5HCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjAiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMCwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjEiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMSwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjIiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMiwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjMiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMywgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjQiLCBJRFhfTUlYRVJfQURWQ1RMMiwgNCwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjUiLCBJRFhfTUlYRVJfQURWQ1RMMiwgNSwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjYiLCBJRFhfTUlYRVJfQURWQ1RMMiwgNiwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjciLCBJRFhfTUlYRVJfQURWQ1RMMiwgNywgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjgiLCBJRFhfTUlYRVJfQURWQ1RMMiwgOCwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjkiLCBJRFhfTUlYRVJfQURWQ1RMMiwgOSwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjEwIiwgSURYX01JWEVSX0FEVkNUTDIsIDEwLCAwKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiMTEiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMTEsIDApLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIxMiIsIElEWF9NSVhFUl9BRFZDVEwyLCAxMiwgMCksCisJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIjEzIiwgSURYX01JWEVSX0FEVkNUTDIsIDEzLCAwKSwKKwlBWkYzMzI4X01JWEVSX1NXSVRDSCgiMTQiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMTQsIDApLAorCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIxNSIsIElEWF9NSVhFUl9BRFZDVEwyLCAxNSwgMCksCisjZW5kaWYKK307CisKKyNkZWZpbmUgQVpGMzMyOF9JTklUX1ZBTFVFUyAoc2l6ZW9mKHNuZF9hemYzMzI4X2luaXRfdmFsdWVzKS9zaXplb2YodW5zaWduZWQgaW50KS8yKQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9hemYzMzI4X2luaXRfdmFsdWVzW11bMl0gPSB7CisgICAgICAgIHsgSURYX01JWEVSX1BMQVlfTUFTVEVSLAlNSVhFUl9NVVRFX01BU0t8MHgxZjFmIH0sCisgICAgICAgIHsgSURYX01JWEVSX01PREVNT1VULAkJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAorCXsgSURYX01JWEVSX0JBU1NUUkVCTEUsCQkweDAwMDAgfSwKKwl7IElEWF9NSVhFUl9QQ0JFRVAsCQlNSVhFUl9NVVRFX01BU0t8MHgxZjFmIH0sCisJeyBJRFhfTUlYRVJfTU9ERU1JTiwJCU1JWEVSX01VVEVfTUFTS3wweDFmMWYgfSwKKwl7IElEWF9NSVhFUl9NSUMsCQlNSVhFUl9NVVRFX01BU0t8MHgwMDFmIH0sCisJeyBJRFhfTUlYRVJfTElORUlOLAkJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAorCXsgSURYX01JWEVSX0NEQVVESU8sCQlNSVhFUl9NVVRFX01BU0t8MHgxZjFmIH0sCisJeyBJRFhfTUlYRVJfVklERU8sCQlNSVhFUl9NVVRFX01BU0t8MHgxZjFmIH0sCisJeyBJRFhfTUlYRVJfQVVYLAkJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAorICAgICAgICB7IElEWF9NSVhFUl9XQVZFT1VULAkJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAorICAgICAgICB7IElEWF9NSVhFUl9GTVNZTlRILAkJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAorICAgICAgICB7IElEWF9NSVhFUl9SRUNfVk9MVU1FLAkJTUlYRVJfTVVURV9NQVNLfDB4MDcwNyB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F6ZjMzMjhfbWl4ZXJfbmV3KGF6ZjMzMjhfdCAqY2hpcCkKK3sKKwlzbmRfY2FyZF90ICpjYXJkOworCXNuZF9rY29udHJvbF9uZXdfdCAqc3c7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJc25kX2Fzc2VydChjaGlwICE9IE5VTEwgJiYgY2hpcC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwljYXJkID0gY2hpcC0+Y2FyZDsKKworCS8qIG1peGVyIHJlc2V0ICovCisJc25kX2F6ZjMzMjhfbWl4ZXJfd3JpdGUoY2hpcCwgSURYX01JWEVSX1JFU0VULCAweDAsIFdPUkRfVkFMVUUpOworCisJLyogbXV0ZSBhbmQgemVybyB2b2x1bWUgY2hhbm5lbHMgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFaRjMzMjhfSU5JVF9WQUxVRVM7IGlkeCsrKSB7CisJCXNuZF9hemYzMzI4X21peGVyX3dyaXRlKGNoaXAsIHNuZF9hemYzMzI4X2luaXRfdmFsdWVzW2lkeF1bMF0sIHNuZF9hemYzMzI4X2luaXRfdmFsdWVzW2lkeF1bMV0sIFdPUkRfVkFMVUUpOworCX0KKwkKKwkvKiBhZGQgbWl4ZXIgY29udHJvbHMgKi8KKwlzdyA9IHNuZF9hemYzMzI4X21peGVyX2NvbnRyb2xzOworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfYXpmMzMyOF9taXhlcl9jb250cm9scyk7IGlkeCsrLCBzdysrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKHN3LCBjaGlwKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXNuZF9jb21wb25lbnRfYWRkKGNhcmQsICJBWkYzMzI4IG1peGVyIik7CisJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIkFaRjMzMjggbWl4ZXIiKTsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCWludCByZXM7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJcmVzID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hemYzMzI4X3NldGZtdChhemYzMzI4X3QgKmNoaXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYml0cmF0ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0X3dpZHRoLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscworKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAweGZmMDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOworCXN3aXRjaCAoYml0cmF0ZSkgeworCWNhc2UgIDU1MTI6IHZhbCB8PSAweDBkOyBicmVhazsgLyogdGhlIEFaRjMzMjggbmFtZXMgaXQgIjU1MTAiIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uICovCisJY2FzZSAgNjYyMDogdmFsIHw9IDB4MGI7IGJyZWFrOworCWNhc2UgIDgwMDA6IHZhbCB8PSAweDAwOyBicmVhazsKKwljYXNlICA5NjAwOiB2YWwgfD0gMHgwODsgYnJlYWs7CisJY2FzZSAxMTAyNTogdmFsIHw9IDB4MDE7IGJyZWFrOworCWNhc2UgMTYwMDA6IHZhbCB8PSAweDAyOyBicmVhazsKKwljYXNlIDIyMDUwOiB2YWwgfD0gMHgwMzsgYnJlYWs7CisJY2FzZSAzMjAwMDogdmFsIHw9IDB4MDQ7IGJyZWFrOworCWNhc2UgNDQxMDA6IHZhbCB8PSAweDA1OyBicmVhazsKKwljYXNlIDQ4MDAwOiB2YWwgfD0gMHgwNjsgYnJlYWs7CisJY2FzZSA2NDAwMDogdmFsIHw9IDB4MDc7IGJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9wcmludGsoInVua25vd24gYml0cmF0ZSAlZCwgYXNzdW1pbmcgNDQuMWtIeiFcbiIsIGJpdHJhdGUpOworCQl2YWwgfD0gMHgwNTsgLyogNDQxMDAgKi8KKwkJYnJlYWs7CisJfQorCS8qIHZhbCA9IDB4ZmYwNzsgM20yNy45OTNzICg2NTMwMUh6OyAtPiA2NDAwMEh6Pz8/KSAqLworCS8qIHZhbCA9IDB4ZmYwOTsgMTdtMTUuMDk4cyAoMTMxMjMsNDc4SHo7IC0+IDEyMDAwSHo/Pz8pICovCisJLyogdmFsID0gMHhmZjBhOyA0N20zMC41OTlzICg0NzY0LDg5MUh6OyAtPiA0ODAwSHo/Pz8pICovCisJLyogdmFsID0gMHhmZjBjOyA1N20wLjUxMHMgKDQwMTAsMjYzSHo7IC0+IDQwMDBIej8/PykgKi8KKwkvKiB2YWwgPSAweGZmMDU7IDVtMTEuNTU2cyAoLi4uIC0+IDQ0MTAwSHopICovCisJLyogdmFsID0gMHhmZjAzOyAxMG0yMS41MjlzICgyMTg3Miw0NjNIejsgLT4gMjIwNTBIej8/PykgKi8KKwkvKiB2YWwgPSAweGZmMGY7IDIwbTQxLjg4M3MgKDEwOTM3LDk5M0h6OyAtPiAxMTAyNUh6Pz8/KSAqLworCS8qIHZhbCA9IDB4ZmYwZDsgNDFtMjMuMTM1cyAoNTUyMyw2MDBIejsgLT4gNTUxMkh6Pz8/KSAqLworCS8qIHZhbCA9IDB4ZmYwZTsgMjhtMzAuNzc3cyAoODAxN0h6OyAtPiA4MDAwSHo/Pz8pICovCisJaWYgKGNoYW5uZWxzID09IDIpCisJCXZhbCB8PSBTT1VOREZPUk1BVF9GTEFHXzJDSEFOTkVMUzsKKworCWlmIChmb3JtYXRfd2lkdGggPT0gMTYpCisJCXZhbCB8PSBTT1VOREZPUk1BVF9GTEFHXzE2QklUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCisJLyogc2V0IGJpdHJhdGUvZm9ybWF0ICovCisJb3V0dyh2YWwsIGNoaXAtPmNvZGVjX3BvcnQrcmVnKTsKKwkKKwkvKiBjaGFuZ2luZyB0aGUgYml0cmF0ZS9mb3JtYXQgc2V0dGluZ3Mgc3dpdGNoZXMgb2ZmIHRoZQorCSAqIGF1ZGlvIG91dHB1dCB3aXRoIGFuIGFubm95aW5nIGNsaWNrIGluIGNhc2Ugb2YgOC8xNmJpdCBmb3JtYXQgY2hhbmdlCisJICogKG1heWJlIHNodXR0aW5nIGRvd24gREFDL0FEQz8pLCB0aHVzIGltbWVkaWF0ZWx5CisJICogZG8gc29tZSB0d2Vha2luZyB0byByZWVuYWJsZSBpdCBhbmQgZ2V0IHJpZCBvZiB0aGUgY2xpY2tpbmcKKwkgKiAoRklYTUU6IHllcywgaXQgd29ya3MsIGJ1dCB3aGF0IGV4YWN0bHkgYW0gSSBkb2luZyBoZXJlPz8gOikKKwkgKiBGSVhNRTogZG9lcyB0aGlzIGhhdmUgc29tZSBzaWRlIGVmZmVjdHMgZm9yIGZ1bGwtZHVwbGV4CisJICogb3Igb3RoZXIgZHJhbWF0aWMgc2lkZSBlZmZlY3RzPyAqLworCWlmIChyZWcgPT0gSURYX0lPX1BMQVlfU09VTkRGT1JNQVQpIC8qIG9ubHkgZG8gaXQgZm9yIHBsYXliYWNrICovCisJCW91dHcoaW53KGNoaXAtPmNvZGVjX3BvcnQgKyBJRFhfSU9fUExBWV9GTEFHUyl8RE1BX1BMQVlfU09NRVRISU5HMXxETUFfUExBWV9TT01FVEhJTkcyfFNPTUVUSElOR19BTE1PU1RfQUxXQVlTX1NFVHxETUFfRVBJTE9HVUVfU09NRVRISU5HfERNQV9TT01FVEhJTkdfRUxTRSwgY2hpcC0+Y29kZWNfcG9ydCArIElEWF9JT19QTEFZX0ZMQUdTKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9hemYzMzI4X3NldGRtYWEoYXpmMzMyOF90ICpjaGlwLAorCQkJCWxvbmcgdW5zaWduZWQgaW50IGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJaW50IGRvX3JlY29yZGluZykKK3sKKwlsb25nIHVuc2lnbmVkIGludCBhZGRyMTsKKwlsb25nIHVuc2lnbmVkIGludCBhZGRyMjsKKwl1bnNpZ25lZCBpbnQgY291bnQxOworCXVuc2lnbmVkIGludCBjb3VudDI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVnX29mZnMgPSBkb19yZWNvcmRpbmcgPyAweDIwIDogMHgwMDsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOworCS8qIEFaRjMzMjggdXNlcyBhIHR3byBidWZmZXIgcG9pbnRlciBETUEgcGxheWJhY2sgYXBwcm9hY2ggKi8KKwlpZiAoIWNoaXAtPmlzX3BsYXlpbmcpCisJeworCQlhZGRyMSA9IGFkZHI7CisJCWFkZHIyID0gYWRkcisoc2l6ZS8yKTsKKwkJY291bnQxID0gKHNpemUvMiktMTsKKwkJY291bnQyID0gKHNpemUvMiktMTsKKyNpZiBERUJVR19QTEFZX1JFQworCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJzZXR0aW5nIGRtYTogYnVmMSAlMDhseFslZF0sIGJ1ZjIgJTA4bHhbJWRdXG4iLCBhZGRyMSwgY291bnQxLCBhZGRyMiwgY291bnQyKTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJb3V0bChhZGRyMSwgY2hpcC0+Y29kZWNfcG9ydCtyZWdfb2ZmcytJRFhfSU9fUExBWV9ETUFfU1RBUlRfMSk7CisJCW91dGwoYWRkcjIsIGNoaXAtPmNvZGVjX3BvcnQrcmVnX29mZnMrSURYX0lPX1BMQVlfRE1BX1NUQVJUXzIpOworCQlvdXR3KGNvdW50MSwgY2hpcC0+Y29kZWNfcG9ydCtyZWdfb2ZmcytJRFhfSU9fUExBWV9ETUFfTEVOXzEpOworCQlvdXR3KGNvdW50MiwgY2hpcC0+Y29kZWNfcG9ydCtyZWdfb2ZmcytJRFhfSU9fUExBWV9ETUFfTEVOXzIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCX0KKwlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKK30KKworc3RhdGljIGludCBzbmRfYXpmMzMyOF9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyNpZiAwCisJYXpmMzMyOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworI2VuZGlmCisKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKyNpZiAwCisJc25kX2F6ZjMzMjhfc2V0Zm10KGNoaXAsIElEWF9JT19QTEFZX1NPVU5ERk9STUFULCBydW50aW1lLT5yYXRlLCBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpLCBydW50aW1lLT5jaGFubmVscyk7CisJc25kX2F6ZjMzMjhfc2V0ZG1hYShjaGlwLCBydW50aW1lLT5kbWFfYWRkciwgY291bnQsIHNpemUsIDApOworI2VuZGlmCisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F6ZjMzMjhfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisjaWYgMAorCWF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKyNlbmRpZgorCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisjaWYgMAorCXNuZF9hemYzMzI4X3NldGZtdChjaGlwLCBJRFhfSU9fUkVDX1NPVU5ERk9STUFULCBydW50aW1lLT5yYXRlLCBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpLCBydW50aW1lLT5jaGFubmVscyk7CisJc25kX2F6ZjMzMjhfc2V0ZG1hYShjaGlwLCBydW50aW1lLT5kbWFfYWRkciwgY291bnQsIHNpemUsIDEpOworI2VuZGlmCisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F6ZjMzMjhfcGxheWJhY2tfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzMTsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxzKCJzbmRfYXpmMzMyOF9wbGF5YmFja190cmlnZ2VyIGNtZCAlZFxuIiwgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisKKwkJc25kX2F6ZjMzMjhfZGJnaW8oY2hpcCwgInRyaWdnZXIxIik7CisKKwkJLyogbXV0ZSBXYXZlT3V0ICovCisJCXNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKGNoaXAsIElEWF9NSVhFUl9XQVZFT1VULCAxKTsKKworCQlzbmRfYXpmMzMyOF9zZXRmbXQoY2hpcCwgSURYX0lPX1BMQVlfU09VTkRGT1JNQVQsIHJ1bnRpbWUtPnJhdGUsIHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCksIHJ1bnRpbWUtPmNoYW5uZWxzKTsKKworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJLyogc3RvcCBwbGF5YmFjayAqLworCQlzdGF0dXMxID0gaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpOworCQlzdGF0dXMxICY9IH5ETUFfUkVTVU1FOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpOworCSAgICAKKwkJLyogRklYTUU6IGNsZWFyIGludGVycnVwdHMgb3Igd2hhdD8/PyAqLworCQlvdXR3KDB4ZmZmZiwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9JUlFNQVNLKTsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCQlzbmRfYXpmMzMyOF9zZXRkbWFhKGNoaXAsIHJ1bnRpbWUtPmRtYV9hZGRyLCBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSwgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSksIDApOworCisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworI2lmZGVmIFdJTjlYCisJCS8qIEZJWE1FOiBlbmFibGUgcGxheWJhY2svcmVjb3JkaW5nPz8/ICovCisJCXN0YXR1czEgfD0gRE1BX1BMQVlfU09NRVRISU5HMSB8IERNQV9QTEFZX1NPTUVUSElORzI7CisJCW91dHcoc3RhdHVzMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisKKwkJLyogc3RhcnQgcGxheWJhY2sgYWdhaW4gKi8KKwkJLyogRklYTUU6IHdoYXQgaXMgdGhpcyB2YWx1ZSAoMHgwMDEwKT8/PyAqLworCQlzdGF0dXMxIHw9IERNQV9SRVNVTUUgfCBETUFfRVBJTE9HVUVfU09NRVRISU5HOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpOworI2Vsc2UgLyogTlQ0ICovCisJCW91dHcoMHgwMCwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisJCW91dHcoRE1BX1BMQVlfU09NRVRISU5HMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisJCW91dHcoRE1BX1BMQVlfU09NRVRISU5HMXxETUFfUExBWV9TT01FVEhJTkcyLCBjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19QTEFZX0ZMQUdTKTsKKwkJb3V0dyhETUFfUkVTVU1FfFNPTUVUSElOR19BTE1PU1RfQUxXQVlTX1NFVHxETUFfRVBJTE9HVUVfU09NRVRISU5HfERNQV9TT01FVEhJTkdfRUxTRSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCQkvKiBub3cgdW5tdXRlIFdhdmVPdXQgKi8KKwkJc25kX2F6ZjMzMjhfbWl4ZXJfc2V0X211dGUoY2hpcCwgSURYX01JWEVSX1dBVkVPVVQsIDApOworCisJCXNuZF9hemYzMzI4X2RiZ2lvKGNoaXAsICJ0cmlnZ2VyMiIpOworCQljaGlwLT5pc19wbGF5aW5nID0gMTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJLyogbXV0ZSBXYXZlT3V0ICovCisJCXNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKGNoaXAsIElEWF9NSVhFUl9XQVZFT1VULCAxKTsKKworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJLyogc3RvcCBwbGF5YmFjayAqLworCQlzdGF0dXMxID0gaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpOworCisJCXN0YXR1czEgJj0gfkRNQV9SRVNVTUU7CisJCW91dHcoc3RhdHVzMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisKKwkJc3RhdHVzMSB8PSBETUFfUExBWV9TT01FVEhJTkcxOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpOworCisJCXN0YXR1czEgJj0gfkRNQV9QTEFZX1NPTUVUSElORzE7CisJCW91dHcoc3RhdHVzMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9GTEFHUyk7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJICAgIAorCQkvKiBub3cgdW5tdXRlIFdhdmVPdXQgKi8KKwkJc25kX2F6ZjMzMjhfbWl4ZXJfc2V0X211dGUoY2hpcCwgSURYX01JWEVSX1dBVkVPVVQsIDApOworCQljaGlwLT5pc19wbGF5aW5nID0gMDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc25kX3ByaW50aygiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggTklZIVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc25kX3ByaW50aygiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0UgTklZIVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHRoaXMgaXMganVzdCBhbmFsb2dvdXMgdG8gcGxheWJhY2s7IEknbSBub3QgcXVpdGUgc3VyZSB3aGV0aGVyIHJlY29yZGluZworICogc2hvdWxkIGFjdHVhbGx5IGJlIHRyaWdnZXJlZCBsaWtlIHRoYXQgKi8KK3N0YXRpYyBpbnQgc25kX2F6ZjMzMjhfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sIGludCBjbWQpCit7CisJYXpmMzMyOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBzdGF0dXMxOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbHMoInNuZF9hemYzMzI4X2NhcHR1cmVfdHJpZ2dlciBjbWQgJWRcbiIsIGNtZCk7CisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisKKwkJc25kX2F6ZjMzMjhfZGJnaW8oY2hpcCwgInRyaWdnZXIxIik7CisKKwkJc25kX2F6ZjMzMjhfc2V0Zm10KGNoaXAsIElEWF9JT19SRUNfU09VTkRGT1JNQVQsIHJ1bnRpbWUtPnJhdGUsIHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCksIHJ1bnRpbWUtPmNoYW5uZWxzKTsKKworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJLyogc3RvcCByZWNvcmRpbmcgKi8KKwkJc3RhdHVzMSA9IGludyhjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfRkxBR1MpOworCQlzdGF0dXMxICY9IH5ETUFfUkVTVU1FOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisJICAgIAorCQkvKiBGSVhNRTogY2xlYXIgaW50ZXJydXB0cyBvciB3aGF0Pz8/ICovCisJCW91dHcoMHhmZmZmLCBjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfSVJRTUFTSyk7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwkJc25kX2F6ZjMzMjhfc2V0ZG1hYShjaGlwLCBydW50aW1lLT5kbWFfYWRkciwgc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSksIHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pLCAxKTsKKworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKyNpZmRlZiBXSU45WAorCQkvKiBGSVhNRTogZW5hYmxlIHBsYXliYWNrL3JlY29yZGluZz8/PyAqLworCQlzdGF0dXMxIHw9IERNQV9QTEFZX1NPTUVUSElORzEgfCBETUFfUExBWV9TT01FVEhJTkcyOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisKKwkJLyogc3RhcnQgcGxheWJhY2sgYWdhaW4gKi8KKwkJLyogRklYTUU6IHdoYXQgaXMgdGhpcyB2YWx1ZSAoMHgwMDEwKT8/PyAqLworCQlzdGF0dXMxIHw9IERNQV9SRVNVTUUgfCBETUFfRVBJTE9HVUVfU09NRVRISU5HOworCQlvdXR3KHN0YXR1czEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisjZWxzZQorCQlvdXR3KDB4MDAsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisJCW91dHcoRE1BX1BMQVlfU09NRVRISU5HMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUkVDX0ZMQUdTKTsKKwkJb3V0dyhETUFfUExBWV9TT01FVEhJTkcxfERNQV9QTEFZX1NPTUVUSElORzIsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisJCW91dHcoRE1BX1JFU1VNRXxTT01FVEhJTkdfQUxNT1NUX0FMV0FZU19TRVR8RE1BX0VQSUxPR1VFX1NPTUVUSElOR3xETUFfU09NRVRISU5HX0VMU0UsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCQlzbmRfYXpmMzMyOF9kYmdpbyhjaGlwLCAidHJpZ2dlcjIiKTsKKwkJY2hpcC0+aXNfcGxheWluZyA9IDE7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkvKiBzdG9wIHJlY29yZGluZyAqLworCQlzdGF0dXMxID0gaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19GTEFHUyk7CisKKwkJc3RhdHVzMSAmPSB+RE1BX1JFU1VNRTsKKwkJb3V0dyhzdGF0dXMxLCBjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfRkxBR1MpOworCisJCXN0YXR1czEgfD0gRE1BX1BMQVlfU09NRVRISU5HMTsKKwkJb3V0dyhzdGF0dXMxLCBjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfRkxBR1MpOworCisJCXN0YXR1czEgJj0gfkRNQV9QTEFZX1NPTUVUSElORzE7CisJCW91dHcoc3RhdHVzMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUkVDX0ZMQUdTKTsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkgICAgCisJCWNoaXAtPmlzX3BsYXlpbmcgPSAwOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzbmRfcHJpbnRrKCJGSVhNRTogU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCBOSVkhXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlzbmRfcHJpbnRrKCJGSVhNRTogU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRSBOSVkhXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hemYzMzI4X3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhemYzMzI4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgbG9uZyBidWZwdHIsIHBsYXlwdHI7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJc25kX3BjbV91ZnJhbWVzX3QgZnJtcmVzOworCisjaWZkZWYgUVVFUllfSEFSRFdBUkUKKwlidWZwdHIgPSBpbmwoY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9ETUFfU1RBUlRfMSk7CisjZWxzZQorCWJ1ZnB0ciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisjZW5kaWYKKwlwbGF5cHRyID0gaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRE1BX0NVUlJQT1MpOworCisJcmVzdWx0ID0gcGxheXB0ciAtIGJ1ZnB0cjsKKwlmcm1yZXMgPSBieXRlc190b19mcmFtZXMoIHN1YnN0cmVhbS0+cnVudGltZSwgcmVzdWx0ICk7CisJc25kX2F6ZjMzMjhfZGJncGxheSgicmVzdWx0ICVseCwgcGxheXB0ciAlbHggKGJhc2UgJXgpLCBmcmFtZXMgJWxkXG4iLCByZXN1bHQsIHBsYXlwdHIsIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIsIGZybXJlcyk7CisJcmV0dXJuIGZybXJlczsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hemYzMzI4X2NhcHR1cmVfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBsb25nIGJ1ZnB0ciwgcmVjcHRyOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXNuZF9wY21fdWZyYW1lc190IGZybXJlczsKKworI2lmZGVmIFFVRVJZX0hBUkRXQVJFCisJYnVmcHRyID0gaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19ETUFfU1RBUlRfMSk7CisjZWxzZQorCWJ1ZnB0ciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisjZW5kaWYKKwlyZWNwdHIgPSBpbmwoY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUkVDX0RNQV9DVVJSUE9TKTsKKworCXJlc3VsdCA9IHJlY3B0ciAtIGJ1ZnB0cjsKKwlmcm1yZXMgPSBieXRlc190b19mcmFtZXMoIHN1YnN0cmVhbS0+cnVudGltZSwgcmVzdWx0ICk7CisJc25kX2F6ZjMzMjhfZGJncGxheSgicmVzdWx0ICVseCwgcmVjIHB0ciAlbHggKGJhc2UgJXgpLCBmcmFtZXMgJWxkXG4iLCByZXN1bHQsIHJlY3B0ciwgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkciwgZnJtcmVzKTsKKwlyZXR1cm4gZnJtcmVzOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2F6ZjMzMjhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYXpmMzMyOF90ICpjaGlwID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIHdoaWNoOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50OworCisJc3RhdHVzICA9IGludyhjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19JUlFTVEFUVVMpOworCisgICAgICAgIC8qIGZhc3QgcGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KKwlpZiAoIShzdGF0dXMgJiAoSVJRX1BMQVlCQUNLfElSUV9SRUNPUkRJTkd8SVJRX01QVTQwMXxJUlFfU09NRUlSUSkpKQorCQlyZXR1cm4gSVJRX05PTkU7IC8qIG11c3QgYmUgaW50ZXJydXB0IGZvciBhbm90aGVyIGRldmljZSAqLworCisJc25kX2F6ZjMzMjhfZGJncGxheSgiSW50ZXJydXB0ICVsZCFcbklEWF9JT19QTEFZX0ZMQUdTICUwNHgsIElEWF9JT19QTEFZX0lSUU1BU0sgJTA0eCwgSURYX0lPX0lSUVNUQVRVUyAlMDR4XG4iLCBjb3VudCwgaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRkxBR1MpLCBpbncoY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9JUlFNQVNLKSwgaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX0lSUVNUQVRVUykpOworCQkKKwlpZiAoc3RhdHVzICYgSVJRX1BMQVlCQUNLKQorCXsKKwkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXdoaWNoID0gaW53KGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfSVJRTUFTSyk7CisJCWlmICh3aGljaCAmIElSUV9GSU5JU0hFRF9QTEFZQlVGXzEpCisJCQkvKiBhY2sgSVJRICovCisJCQlvdXR3KHdoaWNoIHwgSVJRX0ZJTklTSEVEX1BMQVlCVUZfMSwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9JUlFNQVNLKTsKKwkJaWYgKHdoaWNoICYgSVJRX0ZJTklTSEVEX1BMQVlCVUZfMikKKwkJCS8qIGFjayBJUlEgKi8KKwkJCW91dHcod2hpY2ggfCBJUlFfRklOSVNIRURfUExBWUJVRl8yLCBjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19QTEFZX0lSUU1BU0spOworCQlpZiAod2hpY2ggJiBJUlFfUExBWV9TT01FVEhJTkcpCisJCXsKKwkJCXNuZF9hemYzMzI4X2RiZ3BsYXkoImF6dDMzMjg6IHVua25vd24gcGxheSBJUlEgdHlwZSBvY2N1cnJlZCwgcGxlYXNlIHJlcG9ydCFcbiIpOworCQl9CisJCWlmIChjaGlwLT5wY20gJiYgY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKQorCQl7CisJCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJ3aGljaCAleCwgcGxheXB0ciAlbHhcbiIsIHdoaWNoLCBpbmwoY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUExBWV9ETUFfQ1VSUlBPUykpOworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pOworCQkJc25kX2F6ZjMzMjhfZGJncGxheSgicGVyaW9kIGRvbmUsIHBsYXlwdHIgJWx4LlxuIiwgaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRE1BX0NVUlJQT1MpKTsKKwkJfQorCQllbHNlCisJCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJhenQzMzI4OiBvdWNoLCBpcnEgaGFuZGxlciBwcm9ibGVtIVxuIik7CisgICAgICAgICAgICAgICAJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9SRUNPUkRJTkcpCisJeworICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQl3aGljaCA9IGludyhjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfSVJRTUFTSyk7CisJCWlmICh3aGljaCAmIElSUV9GSU5JU0hFRF9SRUNCVUZfMSkKKwkJCS8qIGFjayBpbnRlcnJ1cHQgKi8KKwkJCW91dHcod2hpY2ggfCBJUlFfRklOSVNIRURfUkVDQlVGXzEsIGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19JUlFNQVNLKTsKKwkJaWYgKHdoaWNoICYgSVJRX0ZJTklTSEVEX1JFQ0JVRl8yKQorCQkJLyogYWNrIGludGVycnVwdCAqLworCQkJb3V0dyh3aGljaCB8IElSUV9GSU5JU0hFRF9SRUNCVUZfMiwgY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUkVDX0lSUU1BU0spOworCQlpZiAod2hpY2ggJiBJUlFfUkVDX1NPTUVUSElORykKKwkJeworCQkJc25kX2F6ZjMzMjhfZGJncGxheSgiYXp0MzMyODogdW5rbm93biByZWMgSVJRIHR5cGUgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iKTsKKwkJfQorCQlpZiAoY2hpcC0+cGNtICYmIGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKQorCQl7CisJCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJ3aGljaCAleCwgcmVjcHRyICVseFxuIiwgd2hpY2gsIGlubChjaGlwLT5jb2RlY19wb3J0K0lEWF9JT19SRUNfRE1BX0NVUlJQT1MpKTsKKwkJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwkJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJc25kX2F6ZjMzMjhfZGJncGxheSgicGVyaW9kIGRvbmUsIHJlY3B0ciAlbHguXG4iLCBpbmwoY2hpcC0+Y29kZWNfcG9ydCtJRFhfSU9fUkVDX0RNQV9DVVJSUE9TKSk7CisJCX0KKyAgICAgICAgICAgICAgIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX01QVTQwMSkKKwkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIGNoaXAtPnJtaWRpLT5wcml2YXRlX2RhdGEsIHJlZ3MpOworCWlmIChzdGF0dXMgJiBJUlFfU09NRUlSUSkKKwkJc25kX2F6ZjMzMjhfZGJncGxheSgiYXp0MzMyODogdW5rbm93biBJUlEgdHlwZSBvY2N1cnJlZCwgcGxlYXNlIHJlcG9ydCFcbiIpOworCWNvdW50Kys7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2F6ZjMzMjhfcGxheWJhY2sgPQoreworCS8qIEZJWE1FISEgQ29ycmVjdD8gKi8KKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1U4IHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfNjQwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULAorCS5yYXRlX21pbiA9CQk1NTEyLAorCS5yYXRlX21heCA9CQk2NDAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JNjU1MzYsCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CTY1NTM2LAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS8qIEZJWE1FOiBtYXliZSB0aGF0IGNhcmQgYWN0dWFsbHkgaGFzIGEgRklGTz8KKwkgKiBIbW0sIGl0IHNlZW1zIG5ld2VyIHJldmlzaW9ucyBkbyBoYXZlIG9uZSwgYnV0IHdlIHN0aWxsIGRvbid0IGtub3cKKwkgKiBpdHMgc2l6ZS4uLiAqLworCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2F6ZjMzMjhfY2FwdHVyZSA9Cit7CisJLyogRklYTUUgKi8KKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1U4IHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfNjQwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULAorCS5yYXRlX21pbiA9CQk1NTEyLAorCS5yYXRlX21heCA9CQk2NDAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JNjU1MzYsCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CTY1NTM2LAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYXpmMzMyOF9maXhlZF9yYXRlc1tdID0geworCTU1MTIsIDY2MjAsIDgwMDAsIDk2MDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwCit9Oworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3Qgc25kX2F6ZjMzMjhfaHdfY29uc3RyYWludHNfcmF0ZXMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShzbmRfYXpmMzMyOF9maXhlZF9yYXRlcyksIAorCS5saXN0ID0gc25kX2F6ZjMzMjhfZml4ZWRfcmF0ZXMsCisJLm1hc2sgPSAwLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhemYzMzI4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfYXpmMzMyOF9wbGF5YmFjazsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgICAmc25kX2F6ZjMzMjhfaHdfY29uc3RyYWludHNfcmF0ZXMpOworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWF6ZjMzMjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOworCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2F6ZjMzMjhfY2FwdHVyZTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgICAmc25kX2F6ZjMzMjhfaHdfY29uc3RyYWludHNfcmF0ZXMpOworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJYXpmMzMyOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisKKwljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlhemYzMzI4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9hemYzMzI4X3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfYXpmMzMyOF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfYXpmMzMyOF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfYXpmMzMyOF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9hemYzMzI4X3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfYXpmMzMyOF9wbGF5YmFja19wb2ludGVyCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfYXpmMzMyOF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfYXpmMzMyOF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2F6ZjMzMjhfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2F6ZjMzMjhfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2F6ZjMzMjhfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9hemYzMzI4X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9hemYzMzI4X2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9hemYzMzI4X2NhcHR1cmVfcG9pbnRlcgorfTsKKworc3RhdGljIHZvaWQgc25kX2F6ZjMzMjhfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJYXpmMzMyOF90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F6ZjMzMjhfcGNtKGF6ZjMzMjhfdCAqY2hpcCwgaW50IGRldmljZSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQVpGMzMyOCBEU1AiLCBkZXZpY2UsIDEsIDEsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9hemYzMzI4X3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2F6ZjMzMjhfY2FwdHVyZV9vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2F6ZjMzMjhfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUpOworCWNoaXAtPnBjbSA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgNjQqMTAyNCk7CisKKwlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hemYzMzI4X2NvbmZpZ19qb3lzdGljayhhemYzMzI4X3QgKmNoaXAsIGludCBkZXYpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwlpZiAoIWpveXN0aWNrW2Rldl0pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCEociA9IHJlcXVlc3RfcmVnaW9uKDB4MjAwLCA4LCAiQVpGMzMyOCBnYW1lcG9ydCIpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhenQzMzI4OiBjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3Jlc291cmNlKHIpOworCQlrZnJlZV9ub2NoZWNrKHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkFaRjMzMjggR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmY2hpcC0+cGNpLT5kZXYpOworCWdwLT5pbyA9IDB4MjAwOworCWdhbWVwb3J0X3NldF9wb3J0X2RhdGEoZ3AsIHIpOworCisJc25kX2F6ZjMzMjhfaW8yX3dyaXRlKGNoaXAsIElEWF9JTzJfTEVHQUNZX0FERFIsCisJCQkgICAgICBzbmRfYXpmMzMyOF9pbzJfcmVhZChjaGlwLCBJRFhfSU8yX0xFR0FDWV9BRERSKSB8IExFR0FDWV9KT1kpOworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChjaGlwLT5nYW1lcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2F6ZjMzMjhfZnJlZV9qb3lzdGljayhhemYzMzI4X3QgKmNoaXApCit7CisJaWYgKGNoaXAtPmdhbWVwb3J0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoY2hpcC0+Z2FtZXBvcnQpOworCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjaGlwLT5nYW1lcG9ydCk7CisJCWNoaXAtPmdhbWVwb3J0ID0gTlVMTDsKKwkJLyogZGlzYWJsZSBnYW1lcG9ydCAqLworCQlzbmRfYXpmMzMyOF9pbzJfd3JpdGUoY2hpcCwgSURYX0lPMl9MRUdBQ1lfQUREUiwKKwkJCQkgICAgICBzbmRfYXpmMzMyOF9pbzJfcmVhZChjaGlwLCBJRFhfSU8yX0xFR0FDWV9BRERSKSAmIH5MRUdBQ1lfSk9ZKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX2F6ZjMzMjhfY29uZmlnX2pveXN0aWNrKGF6ZjMzMjhfdCAqY2hpcCwgaW50IGRldikgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9hemYzMzI4X2ZyZWVfam95c3RpY2soYXpmMzMyOF90ICpjaGlwKSB7IH0KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHNuZF9hemYzMzI4X2ZyZWUoYXpmMzMyOF90ICpjaGlwKQoreworICAgICAgICBpZiAoY2hpcC0+aXJxIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIF9fZW5kX2h3OworCisJLyogcmVzZXQgKGNsb3NlKSBtaXhlciAqLworCXNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKGNoaXAsIElEWF9NSVhFUl9QTEFZX01BU1RFUiwgMSk7IC8qIGZpcnN0IG11dGUgbWFzdGVyIHZvbHVtZSAqLworCXNuZF9hemYzMzI4X21peGVyX3dyaXRlKGNoaXAsIElEWF9NSVhFUl9SRVNFVCwgMHgwLCBXT1JEX1ZBTFVFKTsKKworICAgICAgICAvKiBpbnRlcnJ1cHQgc2V0dXAgLSBtYXNrIGV2ZXJ5dGhpbmcgKi8KKwkvKiBGSVhNRSAqLworCisgICAgICAgIHN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworICAgICAgX19lbmRfaHc6CisJc25kX2F6ZjMzMjhfZnJlZV9qb3lzdGljayhjaGlwKTsKKyAgICAgICAgaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCisgICAgICAgIGtmcmVlKGNoaXApOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXpmMzMyOF9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwlhemYzMzI4X3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfYXpmMzMyOF9mcmVlKGNoaXApOworfQorCisjaWYgMAorLyogY2hlY2sgd2hldGhlciBhIGJpdCBjYW4gYmUgbW9kaWZpZWQgKi8KK3N0YXRpYyB2b2lkIHNuZF9hemYzMzI4X3Rlc3RfYml0KHVuc2lnbmVkIGludCByZWcsIGludCBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWwsIHZhbG9mZiwgdmFsb247CisKKwl2YWwgPSBpbmIocmVnKTsKKworCW91dGIodmFsICYgfigxIDw8IGJpdCksIHJlZyk7CisJdmFsb2ZmID0gaW5iKHJlZyk7CisKKwlvdXRiKHZhbHwoMSA8PCBiaXQpLCByZWcpOworCXZhbG9uID0gaW5iKHJlZyk7CisJCisJb3V0Yih2YWwsIHJlZyk7CisKKwlwcmludGsoS0VSTl9FUlIgInJlZyAlMDR4IGJpdCAlZDogJTAyeCAlMDJ4ICUwMnhcbiIsIHJlZywgYml0LCB2YWwsIHZhbG9mZiwgdmFsb24pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hemYzMzI4X2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkZXZpY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXpmMzMyOF90ICoqIHJjaGlwKQoreworCWF6ZjMzMjhfdCAqY2hpcDsKKwlpbnQgZXJyOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0gICAgIHNuZF9hemYzMzI4X2Rldl9mcmVlLAorCX07CisJdTE2IHRtcDsKKworCSpyY2hpcCA9IE5VTEw7CisKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCS8qIGNoZWNrIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCAweDAwZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgMHgwMGZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkF6dGVjaCBBWkYzMzI4IikpIDwgMCkgeworCQlrZnJlZShjaGlwKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiBlcnI7CisJfQorCisJY2hpcC0+Y29kZWNfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWNoaXAtPmlvMl9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CisJY2hpcC0+bXB1X3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKKwljaGlwLT5zeW50aF9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMyk7CisJY2hpcC0+bWl4ZXJfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDQpOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXpmMzMyOF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgY2FyZC0+c2hvcnRuYW1lLCAodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfYXpmMzMyOF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJc25kX2F6ZjMzMjhfZGJnbWlzYygiY29kZWNfcG9ydCAweCVseCwgaW8yX3BvcnQgMHglbHgsIG1wdV9wb3J0IDB4JWx4LCBzeW50aF9wb3J0IDB4JWx4LCBtaXhlcl9wb3J0IDB4JWx4LCBpcnEgJWRcbiIsIGNoaXAtPmNvZGVjX3BvcnQsIGNoaXAtPmlvMl9wb3J0LCBjaGlwLT5tcHVfcG9ydCwgY2hpcC0+c3ludGhfcG9ydCwgY2hpcC0+bWl4ZXJfcG9ydCwgY2hpcC0+aXJxKTsKKworCXNuZF9hemYzMzI4X2RiZ21pc2MoImlvMiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgc25kX2F6ZjMzMjhfaW8yX3JlYWQoY2hpcCwgMCksIHNuZF9hemYzMzI4X2lvMl9yZWFkKGNoaXAsIDEpLCBzbmRfYXpmMzMyOF9pbzJfcmVhZChjaGlwLCAyKSwgc25kX2F6ZjMzMjhfaW8yX3JlYWQoY2hpcCwgMyksIHNuZF9hemYzMzI4X2lvMl9yZWFkKGNoaXAsIDQpLCBzbmRfYXpmMzMyOF9pbzJfcmVhZChjaGlwLCA1KSk7CisKKwlmb3IgKHRtcD0wOyB0bXAgPD0gMHgwMTsgdG1wICs9IDEpCisJCXNuZF9hemYzMzI4X2RiZ21pc2MoIjB4JTAyeDogb3BsIDB4JTA0eCwgbXB1MzAwIDB4JTA0eCwgbXB1MzEwIDB4JTA0eCwgbXB1MzIwIDB4JTA0eCwgbXB1MzMwIDB4JTA0eFxuIiwgdG1wLCBpbmIoMHgzODggKyB0bXApLCBpbmIoMHgzMDAgKyB0bXApLCBpbmIoMHgzMTAgKyB0bXApLCBpbmIoMHgzMjAgKyB0bXApLCBpbmIoMHgzMzAgKyB0bXApKTsKKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9hemYzMzI4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogY3JlYXRlIG1peGVyIGludGVyZmFjZSAmIHN3aXRjaGVzICovCisJaWYgKChlcnIgPSBzbmRfYXpmMzMyOF9taXhlcl9uZXcoY2hpcCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworI2lmIDAKKwkvKiBzZXQgdmVyeSBsb3cgYml0cmF0ZSB0byByZWR1Y2Ugbm9pc2UgYW5kIHBvd2VyIGNvbnN1bXB0aW9uPyAqLworCXNuZF9hemYzMzI4X3NldGZtdChjaGlwLCBJRFhfSU9fUExBWV9TT1VOREZPUk1BVCwgNTUxMiwgOCwgMSk7CisjZW5kaWYKKworCS8qIHN0YW5kYXJkIGNoaXAgaW5pdCBzdHVmZiAqLworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlvdXRiKERNQV9QTEFZX1NPTUVUSElORzJ8RE1BX0VQSUxPR1VFX1NPTUVUSElOR3xETUFfU09NRVRISU5HX0VMU0UsIGNoaXAtPmNvZGVjX3BvcnQgKyBJRFhfSU9fUExBWV9GTEFHUyk7CisJb3V0YihETUFfUExBWV9TT01FVEhJTkcyfERNQV9FUElMT0dVRV9TT01FVEhJTkd8RE1BX1NPTUVUSElOR19FTFNFLCBjaGlwLT5jb2RlY19wb3J0ICsgSURYX0lPX1NPTUVUSElOR19GTEFHUyk7CisJb3V0YihETUFfUExBWV9TT01FVEhJTkcyfERNQV9FUElMT0dVRV9TT01FVEhJTkd8RE1BX1NPTUVUSElOR19FTFNFLCBjaGlwLT5jb2RlY19wb3J0ICsgSURYX0lPX1JFQ19GTEFHUyk7CisJb3V0YigweDAsIGNoaXAtPmNvZGVjX3BvcnQgKyBJRFhfSU9fSVJRNjNIKTsKKworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJKnJjaGlwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F6ZjMzMjhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJYXpmMzMyOF90ICpjaGlwOworCW9wbDNfdCAqb3BsMzsKKwlpbnQgZXJyOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkFaRjMzMjgiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQXp0ZWNoIEFaRjMzMjggKFBDSTE2OCkiKTsKKworICAgICAgICBpZiAoKGVyciA9IHNuZF9hemYzMzI4X2NyZWF0ZShjYXJkLCBwY2ksIHBjaV9pZC0+ZHJpdmVyX2RhdGEsICZjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KCBjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAorCQkJCSAgICAgICAgY2hpcC0+bXB1X3BvcnQsIDEsIHBjaS0+aXJxLCAwLAorCQkJCSAgICAgICAgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCXNuZF9wcmludGsoImF6ZjMzMjg6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwgY2hpcC0+bXB1X3BvcnQpOworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2F6ZjMzMjhfcGNtKGNoaXAsIDApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGNoaXAtPnN5bnRoX3BvcnQsIGNoaXAtPnN5bnRoX3BvcnQrMiwKKwkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKKwkJc25kX3ByaW50aygiYXpmMzMyODogbm8gT1BMMyBkZXZpY2UgYXQgMHglbHgtMHglbHg/XG4iLAorCQkJICAgY2hpcC0+c3ludGhfcG9ydCwgY2hpcC0+c3ludGhfcG9ydCsyICk7CisJfSBlbHNlIHsKKwkJaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMSwgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlzbmRfYXpmMzMyOF9kYmdpbyhjaGlwLCAiY3JlYXRlIik7CisKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+Y29kZWNfcG9ydCwgY2hpcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworI2lmZGVmIE1PRFVMRQorCXByaW50aygKKyJhenQzMzI4OiBFeHBlcmltZW50YWwgZHJpdmVyIGZvciBBenRlY2ggQVpGMzMyOC1iYXNlZCBzb3VuZGNhcmRzIHN1Y2ggYXMgUENJMTY4LlxuIgorImF6dDMzMjg6IFpFUk8gc3VwcG9ydCBmcm9tIEF6dGVjaDogeW91IG1pZ2h0IHRoaW5rIGhhcmQgYWJvdXQgZnV0dXJlIHB1cmNoYXNlLlxuIgorImF6dDMzMjg6IEZlZWwgZnJlZSB0byBjb250YWN0IGh3N29zaHl1djMwMDFAc25lYWtlbWFpbC5jb20gZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iKTsKKyNlbmRpZgorCisJaWYgKHNuZF9hemYzMzI4X2NvbmZpZ19qb3lzdGljayhjaGlwLCBkZXYpIDwgMCkKKwkJc25kX2F6ZjMzMjhfaW8yX3dyaXRlKGNoaXAsIElEWF9JTzJfTEVHQUNZX0FERFIsCisJCQkgICAgICBzbmRfYXpmMzMyOF9pbzJfcmVhZChjaGlwLCBJRFhfSU8yX0xFR0FDWV9BRERSKSAmIH5MRUdBQ1lfSk9ZKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfYXpmMzMyOF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKKwlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJBWkYzMzI4IiwKKwkuaWRfdGFibGUgPSBzbmRfYXpmMzMyOF9pZHMsCisJLnByb2JlID0gc25kX2F6ZjMzMjhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hemYzMzI4X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfYXpmMzMyOF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwllcnIgPSBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9hemYzMzI4X2V4aXQodm9pZCkKK3sKKwlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9hemYzMzI4X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfYXpmMzMyOF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguaCBiL3NvdW5kL3BjaS9henQzMzI4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwZTc5MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmgKQEAgLTAsMCArMSwxNjUgQEAKKyNpZm5kZWYgX19TT1VORF9BWkYzMzI4X0gKKyNkZWZpbmUgX19TT1VORF9BWkYzMzI4X0gKKworLyogdHlwZSBhcmd1bWVudCB0byB1c2UgZm9yIHRoZSBJL08gZnVuY3Rpb25zICovCisjZGVmaW5lIFdPUkRfVkFMVUUgICAgICAweDEwMDAKKyNkZWZpbmUgRFdPUkRfVkFMVUUgICAgIDB4MjAwMAorI2RlZmluZSBCWVRFX1ZBTFVFICAgICAgMHg0MDAwCisKKy8qKiogbWFpbiBJL08gYXJlYSBwb3J0IGluZGljZXMgKioqLworLyogKG9ubHkgMHg3MCBvZiAweDgwIGJ5dGVzIHNhdmVkL3Jlc3RvcmVkIGJ5IFdpbmRvd3MgZHJpdmVyKSAqLworLyogdGhlIGRyaXZlciBpbml0aWFsaXNhdGlvbiBzdWdnZXN0cyBhIGxheW91dCBvZiAzIG1haW4gYXJlYXM6CisgKiBmcm9tIDB4MDAgKHBsYXliYWNrKSwgZnJvbSAweDIwIChyZWNvcmRpbmcpIGFuZCBmcm9tIDB4NDAgKG1heWJlIERpcmVjdFgKKyAqIHRpbWVyID8/PykuIGFuZCBwcm9iYWJseSBhbm90aGVyIGFyZWEgZnJvbSAweDYwIHRvIDB4NmYKKyAqIChJUlEgbWFuYWdlbWVudCwgcG93ZXIgbWFuYWdlbWVudCBldGMuID8/PykuICovCisvKiBwbGF5YmFjayBhcmVhICovCisjZGVmaW5lIElEWF9JT19QTEFZX0ZMQUdTICAgICAgIDB4MDAKKyAgICAgLyogYWJsZSB0byByZWFjdGl2YXRlIG91dHB1dCBhZnRlciBvdXRwdXQgbXV0aW5nIGR1ZSB0byA4LzE2Yml0CisgICAgICAqIG91dHB1dCBjaGFuZ2UsIGp1c3QgbGlrZSAweDAwMDIuCisgICAgICAqIDB4MDAwMSBpcyB0aGUgb25seSBiaXQgdGhhdCdzIGFibGUgdG8gc3RhcnQgdGhlIERNQSBjb3VudGVyICovCisgICNkZWZpbmUgRE1BX1JFU1VNRQkJCTB4MDAwMSAvKiBwYXVzZWQgaWYgY2xlYXJlZCA/ICovCisgICAgIC8qIDB4MDAwMiAqdGVtcG9yYXJpbHkqIHNldCBkdXJpbmcgRE1BIHN0b3BwaW5nLiBobW0KKyAgICAgICogYm90aCAweDAwMDIgYW5kIDB4MDAwNCBzZXQgaW4gcGxheWJhY2sgc2V0dXAuICovCisgICAgIC8qIGFibGUgdG8gcmVhY3RpdmF0ZSBvdXRwdXQgYWZ0ZXIgb3V0cHV0IG11dGluZyBkdWUgdG8gOC8xNmJpdAorICAgICAgKiBvdXRwdXQgY2hhbmdlLCBqdXN0IGxpa2UgMHgwMDAxLiAqLworICAjZGVmaW5lIERNQV9QTEFZX1NPTUVUSElORzEJCTB4MDAwMiAvKiBcIGFsdGVybmF0ZWQgKHRvZ2dsZWQpICovCisgICAgIC8qIDB4MDAwNDogTk9UIGFibGUgdG8gcmVhY3RpdmF0ZSBvdXRwdXQgKi8KKyAgI2RlZmluZSBETUFfUExBWV9TT01FVEhJTkcyCQkweDAwMDQgLyogLyBiaXRzICovCisgICNkZWZpbmUgU09NRVRISU5HX0FMTU9TVF9BTFdBWVNfU0VUCTB4MDAwOCAvKiA/Pz87IGNhbiBiZSBtb2RpZmllZCAqLworICAjZGVmaW5lIERNQV9FUElMT0dVRV9TT01FVEhJTkcJMHgwMDEwCisgICNkZWZpbmUgRE1BX1NPTUVUSElOR19FTFNFCQkweDAwMjAgLyogPz8/ICovCisgICNkZWZpbmUgU09NRVRISU5HX1VOTU9ESUZJQUJMRQkweGZmYzAgLyogdW51c2VkID8gbm90IG1vZGlmaWFibGUgKi8KKyNkZWZpbmUgSURYX0lPX1BMQVlfSVJRTUFTSyAgICAgMHgwMgorICAvKiB3cml0ZSBiYWNrIHRvIGZsYWdzIGluIGNhc2UgZmxhZ3MgYXJlIHNldCwgaW4gb3JkZXIgdG8gQUNLIElSUSBpbiBoYW5kbGVyCisgICAqIChiaXQgMSBvZiBwb3J0IDB4NjQgaW5kaWNhdGVzIGludGVycnVwdCBmb3Igb25lIG9mIHRoZXNlIHRocmVlIHR5cGVzKQorICAgKiBzb21ldGltZXMgaW4gdGhpcyBjYXNlIGl0IGp1c3Qgd3JpdGVzIDB4ZmZmZiB0byBnbG9iYWxseSBBQ0sgYWxsIElSUXMKKyAgICogc2V0dGluZ3Mgd3JpdHRlbiBhcmUgbm90IHJlZmxlY3RlZCB3aGVuIHJlYWRpbmcgYmFjaywgdGhvdWdoLgorICAgKiBzZWVtcyB0byBiZSBJUlEsIHRvbyAoZnJlcXVlbnRseSB1c2VkOiBwb3J0IHw9IDB4MDcgISksIGJ1dCB3aG8ga25vd3MgPyAqLworICAjZGVmaW5lIElSUV9QTEFZX1NPTUVUSElORwkJMHgwMDAxIC8qIHNvbWV0aGluZyAmIEFDSyAqLworICAjZGVmaW5lIElSUV9GSU5JU0hFRF9QTEFZQlVGXzEJMHgwMDAyIC8qIDFzdCBkbWFidWYgZmluaXNoZWQgJiBBQ0sgKi8KKyAgI2RlZmluZSBJUlFfRklOSVNIRURfUExBWUJVRl8yCTB4MDAwNCAvKiAybmQgZG1hYnVmIGZpbmlzaGVkICYgQUNLICovCisgICNkZWZpbmUgSVJRTUFTS19TT01FX1NUQVRVU18xCQkweDAwMDggLyogXCByZWxhdGVkIGJpdHMgKi8KKyAgI2RlZmluZSBJUlFNQVNLX1NPTUVfU1RBVFVTXzIJCTB4MDAxMCAvKiAvIChjaGVja2VkIHRvZ2V0aGVyIGluIGxvb3ApICovCisgICNkZWZpbmUgSVJRTUFTS19VTk1PRElGSUFCTEUJCTB4ZmZlMCAvKiB1bnVzZWQgPyBub3QgbW9kaWZpYWJsZSAqLworI2RlZmluZSBJRFhfSU9fUExBWV9ETUFfU1RBUlRfMSAweDA0IC8qIHN0YXJ0IGFkZHJlc3Mgb2YgMXN0IERNQSBwbGF5IGFyZWEgKi8KKyNkZWZpbmUgSURYX0lPX1BMQVlfRE1BX1NUQVJUXzIgMHgwOCAvKiBzdGFydCBhZGRyZXNzIG9mIDJuZCBETUEgcGxheSBhcmVhICovCisjZGVmaW5lIElEWF9JT19QTEFZX0RNQV9MRU5fMSAgIDB4MGMgLyogbGVuZ3RoIG9mIDFzdCBETUEgcGxheSBhcmVhICovCisjZGVmaW5lIElEWF9JT19QTEFZX0RNQV9MRU5fMiAgIDB4MGUgLyogbGVuZ3RoIG9mIDJuZCBETUEgcGxheSBhcmVhICovCisjZGVmaW5lIElEWF9JT19QTEFZX0RNQV9DVVJSUE9TIDB4MTAgLyogY3VycmVudCBETUEgcG9zaXRpb24gICovCisjZGVmaW5lIElEWF9JT19QTEFZX0RNQV9DVVJST0ZTCTB4MTQgLyogb2Zmc2V0IHdpdGhpbiBjdXJyZW50IERNQSBwbGF5IGFyZWEgKi8KKyNkZWZpbmUgSURYX0lPX1BMQVlfU09VTkRGT1JNQVQgMHgxNgorICAvKiBhbGwgdW5zcGVjaWZpZWQgYml0cyBjYW4ndCBiZSBtb2RpZmllZCAqLworICAjZGVmaW5lIFNPVU5ERk9STUFUX0ZSRVFVRU5DWV9NQVNLCTB4MDAwZgorICAgIC8qIGFsbCBfU1VTUEVDVEVEXyB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IFdpbmRvd3MgZHJpdmVycywgc28gd2UgZG9uJ3QKKyAgICAgKiBoYXZlIGFueSBoYXJkIGZhY3RzLCBvbmx5IHJvdWdoIG1lYXN1cmVtZW50cyAqLworICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfNDAwMAkweDBjCisgICAgI2RlZmluZSBTT1VOREZPUk1BVF9GUkVRX1NVU1BFQ1RFRF80ODAwCTB4MGEKKyAgICAjZGVmaW5lIFNPVU5ERk9STUFUX0ZSRVFfNTUxMAkJMHgwZAorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV82NjIwCQkweDBiCisgICAgI2RlZmluZSBTT1VOREZPUk1BVF9GUkVRXzgwMDAJCTB4MDAgLyogYWxzbyAweDBlID8gKi8KKyAgICAjZGVmaW5lIFNPVU5ERk9STUFUX0ZSRVFfOTYwMAkJMHgwOAorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfMTIwMDAJMHgwOQorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV8xMTAyNQkJMHgwMSAvKiBhbHNvIDB4MGYgPyAqLworICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV8xNjAwMAkJMHgwMgorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV8yMjA1MAkJMHgwMworICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV8zMjAwMAkJMHgwNAorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV80NDEwMAkJMHgwNQorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV80ODAwMAkJMHgwNgorICAgICNkZWZpbmUgU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfNjQwMDAJMHgwNworICAjZGVmaW5lIFNPVU5ERk9STUFUX0ZMQUdfMTZCSVQJMHgwMDEwCisgICNkZWZpbmUgU09VTkRGT1JNQVRfRkxBR18yQ0hBTk5FTFMJMHgwMDIwCisvKiByZWNvcmRpbmcgYXJlYSAoc2VlIGFsc286IHBsYXliYWNrIGJpdCBmbGFnIGRlZmluaXRpb25zKSAqLworI2RlZmluZSBJRFhfSU9fUkVDX0ZMQUdTCTB4MjAgLyogPz8gKi8KKyNkZWZpbmUgSURYX0lPX1JFQ19JUlFNQVNLCTB4MjIgLyogPz8gKi8KKyAgI2RlZmluZSBJUlFfUkVDX1NPTUVUSElORwkJMHgwMDAxIC8qIHNvbWV0aGluZyAmIEFDSyAqLworICAjZGVmaW5lIElSUV9GSU5JU0hFRF9SRUNCVUZfMQkJMHgwMDAyIC8qIDFzdCBkbWFidWYgZmluaXNoZWQgJiBBQ0sgKi8KKyAgI2RlZmluZSBJUlFfRklOSVNIRURfUkVDQlVGXzIJCTB4MDAwNCAvKiAybmQgZG1hYnVmIGZpbmlzaGVkICYgQUNLICovCisgIC8qIGhtbSwgbWF5YmUgdGhlc2UgYXJlIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmcgKnJlY29yZGluZyogZmxhZ3MgPworICAgKiBidXQgT1RPSCB0aGV5IGFyZSBtb3N0IGxpa2VseSBhdCBwb3J0IDB4MjIgaW5zdGVhZCAqLworICAjZGVmaW5lIElSUU1BU0tfU09NRV9TVEFUVVNfMQkJMHgwMDA4IC8qIFwgcmVsYXRlZCBiaXRzICovCisgICNkZWZpbmUgSVJRTUFTS19TT01FX1NUQVRVU18yCQkweDAwMTAgLyogLyAoY2hlY2tlZCB0b2dldGhlciBpbiBsb29wKSAqLworI2RlZmluZSBJRFhfSU9fUkVDX0RNQV9TVEFSVF8xICAweDI0CisjZGVmaW5lIElEWF9JT19SRUNfRE1BX1NUQVJUXzIgIDB4MjgKKyNkZWZpbmUgSURYX0lPX1JFQ19ETUFfTEVOXzEgICAgMHgyYworI2RlZmluZSBJRFhfSU9fUkVDX0RNQV9MRU5fMiAgICAweDJlCisjZGVmaW5lIElEWF9JT19SRUNfRE1BX0NVUlJQT1MgIDB4MzAKKyNkZWZpbmUgSURYX0lPX1JFQ19ETUFfQ1VSUk9GUyAgMHgzNAorI2RlZmluZSBJRFhfSU9fUkVDX1NPVU5ERk9STUFUICAweDM2CisvKiBzb21lIHRoaXJkIGFyZWEgPyAoYWZ0ZXIgcGxheWJhY2sgYW5kIHJlY29yZGluZykgKi8KKyNkZWZpbmUgSURYX0lPX1NPTUVUSElOR19GTEFHUwkweDQwIC8qIGdldHMgc2V0IHRvIDB4MzQganVzdCBsaWtlIHBvcnQgMHgwIGFuZCAweDIwIG9uIGNhcmQgaW5pdCAqLworLyogZ2VuZXJhbCAqLworI2RlZmluZSBJRFhfSU9fNjBICQkweDYwIC8qIHdyaXRpbmcgMHhmZmZmIHJldHVybnMgMHhmZmZmICovCisjZGVmaW5lIElEWF9JT182MkgJCTB4NjIgLyogd3JpdGluZyB0byBXT1JEIDB4MDA2MiBjYW4gaGFuZyB0aGUgYm94ICEgLS0+IHJlc3BvbnNpYmxlIGZvciBJUlEgbWFuYWdlbWVudCBhcyBhIHdob2xlID8/ICovCisjZGVmaW5lIElEWF9JT19JUlE2M0gJCTB4NjMgLyogRklYTUUgISEgKi8KKyAgI2RlZmluZSBJT19JUlE2M0hfU09NRVRISU5HCQkweDA0IC8qIGJlaW5nIHNldCBpbiBJUlEgaGFuZGxlciBpbiBjYXNlIHBvcnQgMHgwMCBoYWQgMHgwMDIwIHNldCB1cG9uIElSUSBoYW5kbGVyICovCisjZGVmaW5lIElEWF9JT19JUlFTVEFUVVMgICAgICAgIDB4NjQKKyAgI2RlZmluZSBJUlFfUExBWUJBQ0sJCQkweDAwMDEKKyAgI2RlZmluZSBJUlFfUkVDT1JESU5HCQkJMHgwMDAyCisgICNkZWZpbmUgSVJRX01QVTQwMQkJCTB4MDAxMAorICAjZGVmaW5lIElSUV9TT01FSVJRCQkJMHgwMDIwIC8qID8/Pz8gKi8KKyAgI2RlZmluZSBJUlFfV0hPX0tOT1dTX1VOVVNFRAkJMHgwMGUwIC8qIHByb2JhYmx5IHVudXNlZCAqLworI2RlZmluZSBJRFhfSU9fNjZICQkweDY2ICAgIC8qIHdyaXRpbmcgMHhmZmZmIHJldHVybnMgMHgwMDAwICovCisjZGVmaW5lIElEWF9JT19TT01FX1ZBTFVFCTB4NjgJLyogdGhpcyBpcyBhbHdheXMgc2V0IHRvIDB4M2ZmLCBhbmQgd3JpdGFibGU7IG1heWJlIHNvbWUgYnVmZmVyIGxpbWl0LCBidXQgSSBjb3VsZG4ndCBmaW5kIG91dCBtb3JlICovCisjZGVmaW5lIElEWF9JT182QUgJCTB4NkEJLyogdGhpcyBXT1JEIGNhbiBiZSBzZXQgdG8gaGF2ZSBiaXRzIDB4MDAyOCBhY3RpdmF0ZWQ7IGFjdHVhbGx5IGluaGliaXRzIFBDTSBwbGF5YmFjayAhISEgbWF5YmUgcG93ZXIgbWFuYWdlbWVudCA/PyAqLworI2RlZmluZSBJRFhfSU9fNkNICQkweDZDCS8qIHRoaXMgV09SRCBjYW4gaGF2ZSBhbGwgaXRzIGJpdHMgYWN0aXZhdGVkID8gKi8KKyNkZWZpbmUgSURYX0lPXzZFSAkJMHg2RQkvKiB3cml0aW5nIDB4ZmZmZiByZXR1cm5zIDB4ODNmZSAqLworLyogZnVydGhlciBJL08gaW5kaWNlcyBub3Qgc2F2ZWQvcmVzdG9yZWQsIHNvIHByb2JhYmx5IG5vdCB1c2VkICovCisKKy8qKiogSS9PIDIgYXJlYSBwb3J0IGluZGljZXMgKioqLworLyogKG9ubHkgMHgwNiBvZiAweDA4IGJ5dGVzIHNhdmVkL3Jlc3RvcmVkIGJ5IFdpbmRvd3MgZHJpdmVyKSAqLyAKKyNkZWZpbmUgSURYX0lPMl9MRUdBQ1lfQUREUgkweDA0CisgICNkZWZpbmUgTEVHQUNZX1NPTUVUSElORwkJMHgwMSAvKiBPUEwzID8/ICovCisgICNkZWZpbmUgTEVHQUNZX0pPWQkJCTB4MDgKKworLyoqKiBtaXhlciBJL08gYXJlYSBwb3J0IGluZGljZXMgKioqLworLyogKG9ubHkgMHgyMiBvZiAweDQwIGJ5dGVzIHNhdmVkL3Jlc3RvcmVkIGJ5IFdpbmRvd3MgZHJpdmVyKQorICogZ2VuZXJhbGx5IHNwb2tlbjogQUM5NyByZWdpc3RlciBpbmRleCA9IEFaRjMzMjggbWl4ZXIgcmVnIGluZGV4ICsgMgorICogKGluIG90aGVyIHdvcmRzOiBBWkYzMzI4IE5PVCBmdWxseSBBQzk3IGNvbXBsaWFudCkgKi8KKyAgI2RlZmluZSBNSVhFUl9WT0xVTUVfUklHSFRfTUFTSwkweDAwMWYKKyAgI2RlZmluZSBNSVhFUl9WT0xVTUVfTEVGVF9NQVNLCTB4MWYwMAorICAjZGVmaW5lIE1JWEVSX01VVEVfTUFTSwkJMHg4MDAwCisjZGVmaW5lIElEWF9NSVhFUl9SRVNFVAkJMHgwMCAvKiBkb2VzIE5PVCBzZWVtIHRvIGhhdmUgQUM5NyBJRCBiaXRzICovCisjZGVmaW5lIElEWF9NSVhFUl9QTEFZX01BU1RFUiAgIDB4MDIKKyNkZWZpbmUgSURYX01JWEVSX01PREVNT1VUICAgICAgMHgwNAorI2RlZmluZSBJRFhfTUlYRVJfQkFTU1RSRUJMRSAgICAweDA2CisgICNkZWZpbmUgTUlYRVJfQkFTU1RSRUJMRV9UUkVCTEVfVk9MVU1FX01BU0sJMHgwMDBlCisgICNkZWZpbmUgTUlYRVJfQkFTU1RSRUJMRV9CQVNTX1ZPTFVNRV9NQVNLCTB4MGUwMAorI2RlZmluZSBJRFhfTUlYRVJfUENCRUVQICAgICAgICAweDA4CisjZGVmaW5lIElEWF9NSVhFUl9NT0RFTUlOICAgICAgIDB4MGEKKyNkZWZpbmUgSURYX01JWEVSX01JQyAgICAgICAgICAgMHgwYworICAjZGVmaW5lIE1JWEVSX01JQ19NSUNHQUlOXzIwREJfRU5IQU5DRU1FTlRfTUFTSwkweDAwNDAKKyNkZWZpbmUgSURYX01JWEVSX0xJTkVJTiAgICAgICAgMHgwZQorI2RlZmluZSBJRFhfTUlYRVJfQ0RBVURJTyAgICAgICAweDEwCisjZGVmaW5lIElEWF9NSVhFUl9WSURFTyAgICAgICAgIDB4MTIKKyNkZWZpbmUgSURYX01JWEVSX0FVWCAgICAgICAgICAgMHgxNAorI2RlZmluZSBJRFhfTUlYRVJfV0FWRU9VVCAgICAgICAweDE2CisjZGVmaW5lIElEWF9NSVhFUl9GTVNZTlRIICAgICAgIDB4MTgKKyNkZWZpbmUgSURYX01JWEVSX1JFQ19TRUxFQ1QgICAgMHgxYQorICAjZGVmaW5lIE1JWEVSX1JFQ19TRUxFQ1RfTUlDCQkweDAwCisgICNkZWZpbmUgTUlYRVJfUkVDX1NFTEVDVF9DRAkJMHgwMQorICAjZGVmaW5lIE1JWEVSX1JFQ19TRUxFQ1RfVklERU8JMHgwMgorICAjZGVmaW5lIE1JWEVSX1JFQ19TRUxFQ1RfQVVYCQkweDAzCisgICNkZWZpbmUgTUlYRVJfUkVDX1NFTEVDVF9MSU5FSU4JMHgwNAorICAjZGVmaW5lIE1JWEVSX1JFQ19TRUxFQ1RfTUlYU1RFUkVPCTB4MDUKKyAgI2RlZmluZSBNSVhFUl9SRUNfU0VMRUNUX01JWE1PTk8JMHgwNgorICAjZGVmaW5lIE1JWEVSX1JFQ19TRUxFQ1RfTU9OT0lOCTB4MDcKKyNkZWZpbmUgSURYX01JWEVSX1JFQ19WT0xVTUUgICAgMHgxYworI2RlZmluZSBJRFhfTUlYRVJfQURWQ1RMMSAgICAgICAweDFlCisgIC8qIHVubGlzdGVkIGJpdHMgYXJlIHVubW9kaWZpYWJsZSAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDFfM0RXSURUSF9NQVNLCTB4MDAwZQorICAjZGVmaW5lIE1JWEVSX0FEVkNUTDFfSElGSTNEX01BU0sJMHgwMzAwCisjZGVmaW5lIElEWF9NSVhFUl9BRFZDVEwyICAgICAgIDB4MjAgLyogcmVzZW1ibGVzIEFDOTdfR0VORVJBTF9QVVJQT1NFIHJlZyAhICovCisgIC8qIHVubGlzdGVkIGJpdHMgYXJlIHVubW9kaWZpYWJsZSAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfQklUNwkJMHgwMDgwIC8qIFdhdmVPdXQgM0QgQnlwYXNzID8gbXV0ZXMgV2F2ZU91dCBhdCBMaW5lT3V0ICovCisgICNkZWZpbmUgTUlYRVJfQURWQ1RMMl9CSVQ4CQkweDAxMDAgLyogaXMgdGhpcyBNb2RlbSBPdXQgU2VsZWN0ID8gKi8KKyAgI2RlZmluZSBNSVhFUl9BRFZDVEwyX0JJVDkJCTB4MDIwMCAvKiBNb25vIFNlbGVjdCBTb3VyY2UgPyAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfQklUMTMJCTB4MjAwMCAvKiAzRCBlbmFibGUgPyAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfQklUMTUJCTB4ODAwMCAvKiB1bmtub3duICovCisgIAorI2RlZmluZSBJRFhfTUlYRVJfU09NRVRISU5HMzBICTB4MzAgLyogdXNlZCwgYnV0IHVua25vd24gPz8/ICovCisKKy8qIGRyaXZlciBpbnRlcm5hbCBmbGFncyAqLworI2RlZmluZSBTRVRfQ0hBTl9MRUZUCTEKKyNkZWZpbmUgU0VUX0NIQU5fUklHSFQJMgorCisjZW5kaWYgLyogX19TT1VORF9BWkYzMzI4X0ggICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTdmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvYnQ4N3guYwpAQCAtMCwwICsxLDkzMCBAQAorLyoKKyAqIGJ0ODd4LmMgLSBCcm9va3RyZWUgQnQ4NzgvQnQ4NzkgZHJpdmVyIGZvciBBTFNBCisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBiYXNlZCBvbiBidGF1ZGlvLmMgYnkgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorICoKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb29rdHJlZSBCdDg3eCBhdWRpbyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0Jyb29rdHJlZSxCdDg3OH0sIgorCQkie0Jyb29rdHJlZSxCdDg3OX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAtMn07IC8qIEV4Y2x1ZGUgdGhlIGZpcnN0IGNhcmQgKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGRpZ2l0YWxfcmF0ZVtTTkRSVl9DQVJEU10gPSB7IFswIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gMCB9OyAvKiBkaWdpdGFsIGlucHV0IHJhdGUgKi8KK3N0YXRpYyBpbnQgbG9hZF9hbGw7CS8qIGFsbG93IHRvIGxvYWQgdGhlIG5vbi13aGl0ZWxpc3RlZCBjYXJkcyAqLworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEJ0ODd4IHNvdW5kY2FyZCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBCdDg3eCBzb3VuZGNhcmQiKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgQnQ4N3ggc291bmRjYXJkIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZGlnaXRhbF9yYXRlLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaWdpdGFsX3JhdGUsICJEaWdpdGFsIGlucHV0IHJhdGUgZm9yIEJ0ODd4IHNvdW5kY2FyZCIpOworbW9kdWxlX3BhcmFtKGxvYWRfYWxsLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9hZF9hbGwsICJBbGxvdyB0byBsb2FkIHRoZSBub24td2hpdGVsaXN0ZWQgY2FyZHMiKTsKKworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFIDB4MTA5ZQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzggMHgwODc4CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OSAweDA4NzkKKyNlbmRpZgorCisvKiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFJFR19JTlRfU1RBVAkJMHgxMDAJLyogaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSRUdfSU5UX01BU0sJCTB4MTA0CS8qIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIFJFR19HUElPX0RNQV9DVEwJMHgxMGMJLyogYXVkaW8gY29udHJvbCAqLworI2RlZmluZSBSRUdfUEFDS0VUX0xFTgkJMHgxMTAJLyogYXVkaW8gcGFja2V0IGxlbmd0aHMgKi8KKyNkZWZpbmUgUkVHX1JJU0NfU1RSVF9BREQJMHgxMTQJLyogUklTQyBwcm9ncmFtIHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX1JJU0NfQ09VTlQJCTB4MTIwCS8qIFJJU0MgcHJvZ3JhbSBjb3VudGVyICovCisKKy8qIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIElOVF9PRkxPVwkoMSA8PCAgMykJLyogYXVkaW8gQS9EIG92ZXJmbG93ICovCisjZGVmaW5lIElOVF9SSVNDSQkoMSA8PCAxMSkJLyogUklTQyBpbnN0cnVjdGlvbiBJUlEgYml0IHNldCAqLworI2RlZmluZSBJTlRfRkJVUwkoMSA8PCAxMikJLyogRklGTyBvdmVycnVuIGR1ZSB0byBidXMgYWNjZXNzIGxhdGVuY3kgKi8KKyNkZWZpbmUgSU5UX0ZUUkdUCSgxIDw8IDEzKQkvKiBGSUZPIG92ZXJydW4gZHVlIHRvIHRhcmdldCBsYXRlbmN5ICovCisjZGVmaW5lIElOVF9GRFNSCSgxIDw8IDE0KQkvKiBGSUZPIGRhdGEgc3RyZWFtIHJlc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIElOVF9QUEVSUgkoMSA8PCAxNSkJLyogUENJIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBJTlRfUklQRVJSCSgxIDw8IDE2KQkvKiBSSVNDIGluc3RydWN0aW9uIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBJTlRfUEFCT1JUCSgxIDw8IDE3KQkvKiBQQ0kgbWFzdGVyIG9yIHRhcmdldCBhYm9ydCAqLworI2RlZmluZSBJTlRfT0NFUlIJKDEgPDwgMTgpCS8qIGludmFsaWQgb3Bjb2RlICovCisjZGVmaW5lIElOVF9TQ0VSUgkoMSA8PCAxOSkJLyogc3luYyBjb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIElOVF9SSVNDX0VOCSgxIDw8IDI3KQkvKiBETUEgY29udHJvbGxlciBydW5uaW5nICovCisjZGVmaW5lIElOVF9SSVNDU19TSElGVAkgICAgICAyOAkvKiBSSVNDIHN0YXR1cyBiaXRzICovCisKKy8qIGF1ZGlvIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBDVExfRklGT19FTkFCTEUJCSgxIDw8ICAwKQkvKiBlbmFibGUgYXVkaW8gZGF0YSBGSUZPICovCisjZGVmaW5lIENUTF9SSVNDX0VOQUJMRQkJKDEgPDwgIDEpCS8qIGVuYWJsZSBhdWRpbyBETUEgY29udHJvbGxlciAqLworI2RlZmluZSBDVExfUEtUUF80CQkoMCA8PCAgMikJLyogcGFja2V0IG1vZGUgRklGTyB0cmlnZ2VyIHBvaW50IC0gNCBEV09SRHMgKi8KKyNkZWZpbmUgQ1RMX1BLVFBfOAkJKDEgPDwgIDIpCS8qIDggRFdPUkRzICovCisjZGVmaW5lIENUTF9QS1RQXzE2CQkoMiA8PCAgMikJLyogMTYgRFdPUkRzICovCisjZGVmaW5lIENUTF9BQ0FQX0VOCQkoMSA8PCAgNCkJLyogZW5hYmxlIGF1ZGlvIGNhcHR1cmUgKi8KKyNkZWZpbmUgQ1RMX0RBX0FQUAkJKDEgPDwgIDUpCS8qIEdQSU8gaW5wdXQgKi8KKyNkZWZpbmUgQ1RMX0RBX0lPTV9BRkUJCSgwIDw8ICA2KQkvKiBhdWRpbyBBL0QgaW5wdXQgKi8KKyNkZWZpbmUgQ1RMX0RBX0lPTV9EQQkJKDEgPDwgIDYpCS8qIGRpZ2l0YWwgYXVkaW8gaW5wdXQgKi8KKyNkZWZpbmUgQ1RMX0RBX1NEUl9TSElGVAkgICAgICAgOAkvKiBEREYgZmlyc3Qgc3RhZ2UgZGVjaW1hdGlvbiByYXRlICovCisjZGVmaW5lIENUTF9EQV9TRFJfTUFTSwkJKDB4Zjw8IDgpCisjZGVmaW5lIENUTF9EQV9MTVQJCSgxIDw8IDEyKQkvKiBsaW1pdCBhdWRpbyBkYXRhIHZhbHVlcyAqLworI2RlZmluZSBDVExfREFfRVMyCQkoMSA8PCAxMykJLyogZW5hYmxlIERERiBzdGFnZSAyICovCisjZGVmaW5lIENUTF9EQV9TQlIJCSgxIDw8IDE0KQkvKiBzYW1wbGVzIHJvdW5kZWQgdG8gOCBiaXRzICovCisjZGVmaW5lIENUTF9EQV9EUE0JCSgxIDw8IDE1KQkvKiBkYXRhIHBhY2tldCBtb2RlICovCisjZGVmaW5lIENUTF9EQV9MUkRfU0hJRlQJICAgICAgMTYJLyogQUxSQ0sgZGVsYXkgKi8KKyNkZWZpbmUgQ1RMX0RBX01MQgkJKDEgPDwgMjEpCS8qIE1TQi9MU0IgZm9ybWF0ICovCisjZGVmaW5lIENUTF9EQV9MUkkJCSgxIDw8IDIyKQkvKiBsZWZ0L3JpZ2h0IGluZGljYXRpb24gKi8KKyNkZWZpbmUgQ1RMX0RBX1NDRQkJKDEgPDwgMjMpCS8qIHNhbXBsZSBjbG9jayBlZGdlICovCisjZGVmaW5lIENUTF9BX1NFTF9TVFYJCSgwIDw8IDI0KQkvKiBUViB0dW5lciBhdWRpbyBpbnB1dCAqLworI2RlZmluZSBDVExfQV9TRUxfU0ZNCQkoMSA8PCAyNCkJLyogRk0gYXVkaW8gaW5wdXQgKi8KKyNkZWZpbmUgQ1RMX0FfU0VMX1NNTAkJKDIgPDwgMjQpCS8qIG1pYy9saW5lIGF1ZGlvIGlucHV0ICovCisjZGVmaW5lIENUTF9BX1NFTF9TTVhDCQkoMyA8PCAyNCkJLyogTVVYIGJ5cGFzcyAqLworI2RlZmluZSBDVExfQV9TRUxfU0hJRlQJCSAgICAgIDI0CisjZGVmaW5lIENUTF9BX1NFTF9NQVNLCQkoMyA8PCAyNCkKKyNkZWZpbmUgQ1RMX0FfUFdSRE4JCSgxIDw8IDI2KQkvKiBhbmFsb2cgYXVkaW8gcG93ZXItZG93biAqLworI2RlZmluZSBDVExfQV9HMlgJCSgxIDw8IDI3KQkvKiBhdWRpbyBnYWluIGJvb3N0ICovCisjZGVmaW5lIENUTF9BX0dBSU5fU0hJRlQJICAgICAgMjgJLyogYXVkaW8gaW5wdXQgZ2FpbiAqLworI2RlZmluZSBDVExfQV9HQUlOX01BU0sJCSgweGY8PDI4KQorCisvKiBSSVNDIGluc3RydWN0aW9uIG9wY29kZXMgKi8KKyNkZWZpbmUgUklTQ19XUklURQkoMHgxIDw8IDI4KQkvKiB3cml0ZSBGSUZPIGRhdGEgdG8gbWVtb3J5IGF0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUklTQ19XUklURUMJKDB4NSA8PCAyOCkJLyogd3JpdGUgRklGTyBkYXRhIHRvIG1lbW9yeSBhdCBjdXJyZW50IGFkZHJlc3MgKi8KKyNkZWZpbmUgUklTQ19TS0lQCSgweDIgPDwgMjgpCS8qIHNraXAgRklGTyBkYXRhICovCisjZGVmaW5lIFJJU0NfSlVNUAkoMHg3IDw8IDI4KQkvKiBqdW1wIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUgUklTQ19TWU5DCSgweDggPDwgMjgpCS8qIHN5bmNocm9uaXplIHdpdGggRklGTyAqLworCisvKiBSSVNDIGluc3RydWN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgUklTQ19CWVRFU19FTkFCTEUJKDB4ZiA8PCAxMikJLyogYnl0ZSBlbmFibGUgYml0cyAqLworI2RlZmluZSBSSVNDX1JFU1lOQwkJKCAgMSA8PCAxNSkJLyogZGlzYWJsZSBGRFNSIGVycm9ycyAqLworI2RlZmluZSBSSVNDX1NFVF9TVEFUVVNfU0hJRlQJICAgICAgICAxNgkvKiBzZXQgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgUklTQ19SRVNFVF9TVEFUVVNfU0hJRlQJICAgICAgICAyMAkvKiBjbGVhciBzdGF0dXMgYml0cyAqLworI2RlZmluZSBSSVNDX0lSUQkJKCAgMSA8PCAyNCkJLyogaW50ZXJydXB0ICovCisjZGVmaW5lIFJJU0NfRU9MCQkoICAxIDw8IDI2KQkvKiBlbmQgb2YgbGluZSAqLworI2RlZmluZSBSSVNDX1NPTAkJKCAgMSA8PCAyNykJLyogc3RhcnQgb2YgbGluZSAqLworCisvKiBTWU5DIHN0YXR1cyBiaXRzIHZhbHVlcyAqLworI2RlZmluZSBSSVNDX1NZTkNfRk0xCTB4NgorI2RlZmluZSBSSVNDX1NZTkNfVlJPCTB4YworCisjZGVmaW5lIEFOQUxPR19DTE9DSyAxNzkyMDAwCisjaWZkZWYgQ09ORklHX1NORF9CVDg3WF9PVkVSQ0xPQ0sKKyNkZWZpbmUgQ0xPQ0tfRElWX01JTiAxCisjZWxzZQorI2RlZmluZSBDTE9DS19ESVZfTUlOIDQKKyNlbmRpZgorI2RlZmluZSBDTE9DS19ESVZfTUFYIDE1CisKKyNkZWZpbmUgRVJST1JfSU5URVJSVVBUUyAoSU5UX0ZCVVMgfCBJTlRfRlRSR1QgfCBJTlRfUFBFUlIgfCBcCisJCQkgIElOVF9SSVBFUlIgfCBJTlRfUEFCT1JUIHwgSU5UX09DRVJSKQorI2RlZmluZSBNWV9JTlRFUlJVUFRTIChJTlRfUklTQ0kgfCBFUlJPUl9JTlRFUlJVUFRTKQorCisvKiBTWU5DLCBvbmUgV1JJVEUgcGVyIGxpbmUsIG9uZSBleHRyYSBXUklURSBwZXIgcGFnZSBib3VuZGFyeSwgU1lOQywgSlVNUCAqLworI2RlZmluZSBNQVhfUklTQ19TSVpFICgoMSArIDI1NSArIChQQUdFX0FMSUdOKDI1NSAqIDQwOTIpIC8gUEFHRV9TSVpFIC0gMSkgKyAxICsgMSkgKiA4KQorCit0eXBlZGVmIHN0cnVjdCBzbmRfYnQ4N3ggYnQ4N3hfdDsKK3N0cnVjdCBzbmRfYnQ4N3ggeworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKworCXZvaWQgX19pb21lbSAqbW1pbzsKKwlpbnQgaXJxOworCisJaW50IGRpZ19yYXRlOworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlsb25nIG9wZW5lZDsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX3Jpc2M7CisJdW5zaWduZWQgaW50IGxpbmVfYnl0ZXM7CisJdW5zaWduZWQgaW50IGxpbmVzOworCisJdTMyIHJlZ19jb250cm9sOworCXUzMiBpbnRlcnJ1cHRfbWFzazsKKworCWludCBjdXJyZW50X2xpbmU7CisKKwlpbnQgcGNpX3Bhcml0eV9lcnJvcnM7Cit9OworCitlbnVtIHsgREVWSUNFX0RJR0lUQUwsIERFVklDRV9BTkFMT0cgfTsKKworc3RhdGljIGlubGluZSB1MzIgc25kX2J0ODd4X3JlYWRsKGJ0ODd4X3QgKmNoaXAsIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKGNoaXAtPm1taW8gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2J0ODd4X3dyaXRlbChidDg3eF90ICpjaGlwLCB1MzIgcmVnLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBjaGlwLT5tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGludCBzbmRfYnQ4N3hfY3JlYXRlX3Jpc2MoYnQ4N3hfdCAqY2hpcCwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICAgIAkgdW5zaWduZWQgaW50IHBlcmlvZHMsIHVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMpCit7CisJc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgaSwgb2Zmc2V0OworCXUzMiAqcmlzYzsKKworCWlmIChjaGlwLT5kbWFfcmlzYy5hcmVhID09IE5VTEwpIHsKKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCVBBR0VfQUxJR04oTUFYX1JJU0NfU0laRSksICZjaGlwLT5kbWFfcmlzYykgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJpc2MgPSAodTMyICopY2hpcC0+ZG1hX3Jpc2MuYXJlYTsKKwlvZmZzZXQgPSAwOworCSpyaXNjKysgPSBjcHVfdG9fbGUzMihSSVNDX1NZTkMgfCBSSVNDX1NZTkNfRk0xKTsKKwkqcmlzYysrID0gY3B1X3RvX2xlMzIoMCk7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7ICsraSkgeworCQl1MzIgcmVzdDsKKworCQlyZXN0ID0gcGVyaW9kX2J5dGVzOworCQlkbyB7CisJCQl1MzIgY21kLCBsZW47CisKKwkJCWxlbiA9IFBBR0VfU0laRSAtIChvZmZzZXQgJSBQQUdFX1NJWkUpOworCQkJaWYgKGxlbiA+IHJlc3QpCisJCQkJbGVuID0gcmVzdDsKKwkJCWNtZCA9IFJJU0NfV1JJVEUgfCBsZW47CisJCQlpZiAocmVzdCA9PSBwZXJpb2RfYnl0ZXMpIHsKKwkJCQl1MzIgYmxvY2sgPSBpICogMTYgLyBwZXJpb2RzOworCQkJCWNtZCB8PSBSSVNDX1NPTDsKKwkJCQljbWQgfD0gYmxvY2sgPDwgUklTQ19TRVRfU1RBVFVTX1NISUZUOworCQkJCWNtZCB8PSAofmJsb2NrICYgMHhmKSA8PCBSSVNDX1JFU0VUX1NUQVRVU19TSElGVDsKKwkJCX0KKwkJCWlmIChsZW4gPT0gcmVzdCkKKwkJCQljbWQgfD0gUklTQ19FT0wgfCBSSVNDX0lSUTsKKwkJCSpyaXNjKysgPSBjcHVfdG9fbGUzMihjbWQpOworCQkJKnJpc2MrKyA9IGNwdV90b19sZTMyKCh1MzIpc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzZ2J1Ziwgb2Zmc2V0KSk7CisJCQlvZmZzZXQgKz0gbGVuOworCQkJcmVzdCAtPSBsZW47CisJCX0gd2hpbGUgKHJlc3QgPiAwKTsKKwl9CisJKnJpc2MrKyA9IGNwdV90b19sZTMyKFJJU0NfU1lOQyB8IFJJU0NfU1lOQ19WUk8pOworCSpyaXNjKysgPSBjcHVfdG9fbGUzMigwKTsKKwkqcmlzYysrID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QKTsKKwkqcmlzYysrID0gY3B1X3RvX2xlMzIoY2hpcC0+ZG1hX3Jpc2MuYWRkcik7CisJY2hpcC0+bGluZV9ieXRlcyA9IHBlcmlvZF9ieXRlczsKKwljaGlwLT5saW5lcyA9IHBlcmlvZHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9idDg3eF9mcmVlX3Jpc2MoYnQ4N3hfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+ZG1hX3Jpc2MuYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmRtYV9yaXNjKTsKKwkJY2hpcC0+ZG1hX3Jpc2MuYXJlYSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfYnQ4N3hfcGNpX2Vycm9yKGJ0ODd4X3QgKmNoaXAsIHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisJdTE2IHBjaV9zdGF0dXM7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChjaGlwLT5wY2ksIFBDSV9TVEFUVVMsICZwY2lfc3RhdHVzKTsKKwlwY2lfc3RhdHVzICY9IFBDSV9TVEFUVVNfUEFSSVRZIHwgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIHwKKwkJUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIHwgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwKKwkJUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgUENJX1NUQVRVUywgcGNpX3N0YXR1cyk7CisJaWYgKHBjaV9zdGF0dXMgIT0gUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkpCisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFpZWVlIC0gUENJIGVycm9yISBzdGF0dXMgJSMwOHgsIFBDSSBzdGF0dXMgJSMwNHhcbiIsCisJCQkgICBzdGF0dXMgJiBFUlJPUl9JTlRFUlJVUFRTLCBwY2lfc3RhdHVzKTsKKwllbHNlIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiQWllZWUgLSBQQ0kgcGFyaXR5IGVycm9yIGRldGVjdGVkIVxuIik7CisJCS8qIGVycm9yICdoYW5kbGluZycgc2ltaWxhciB0byBhaWM3eHh4X3BjaS5jOiAqLworCQljaGlwLT5wY2lfcGFyaXR5X2Vycm9ycysrOworCQlpZiAoY2hpcC0+cGNpX3Bhcml0eV9lcnJvcnMgPiAyMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgUENJIHBhcml0eSBlcnJvcnMgb2JzZXJ2ZWQuXG4iKTsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlNvbWUgZGV2aWNlIG9uIHRoaXMgYnVzIGlzIGdlbmVyYXRpbmcgYmFkIHBhcml0eS5cbiIpOworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVGhpcyBpcyBhbiBlcnJvciAqb2JzZXJ2ZWQgYnkqLCBub3QgKmdlbmVyYXRlZCBieSosIHRoaXMgY2FyZC5cbiIpOworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiUENJIHBhcml0eSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOworCQkJY2hpcC0+aW50ZXJydXB0X21hc2sgJj0gfihJTlRfUFBFUlIgfCBJTlRfUklQRVJSKTsKKwkJCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0lOVF9NQVNLLCBjaGlwLT5pbnRlcnJ1cHRfbWFzayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfYnQ4N3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYnQ4N3hfdCAqY2hpcCA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBpcnFfc3RhdHVzOworCisJc3RhdHVzID0gc25kX2J0ODd4X3JlYWRsKGNoaXAsIFJFR19JTlRfU1RBVCk7CisJaXJxX3N0YXR1cyA9IHN0YXR1cyAmIGNoaXAtPmludGVycnVwdF9tYXNrOworCWlmICghaXJxX3N0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0lOVF9TVEFULCBpcnFfc3RhdHVzKTsKKworCWlmIChpcnFfc3RhdHVzICYgRVJST1JfSU5URVJSVVBUUykgeworCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfRkJVUyB8IElOVF9GVFJHVCkpCisJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiRklGTyBvdmVycnVuLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CisJCWlmIChpcnFfc3RhdHVzICYgSU5UX09DRVJSKQorCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZXJuYWwgUklTQyBlcnJvciwgc3RhdHVzICUjMDh4XG4iLCBzdGF0dXMpOworCQlpZiAoaXJxX3N0YXR1cyAmIChJTlRfUFBFUlIgfCBJTlRfUklQRVJSIHwgSU5UX1BBQk9SVCkpCisJCQlzbmRfYnQ4N3hfcGNpX2Vycm9yKGNoaXAsIGlycV9zdGF0dXMpOworCX0KKwlpZiAoKGlycV9zdGF0dXMgJiBJTlRfUklTQ0kpICYmIChjaGlwLT5yZWdfY29udHJvbCAmIENUTF9BQ0FQX0VOKSkgeworCQlpbnQgY3VycmVudF9ibG9jaywgaXJxX2Jsb2NrOworCisJCS8qIGFzc3VtZSB0aGF0IGV4YWN0bHkgb25lIGxpbmUgaGFzIGJlZW4gcmVjb3JkZWQgKi8KKwkJY2hpcC0+Y3VycmVudF9saW5lID0gKGNoaXAtPmN1cnJlbnRfbGluZSArIDEpICUgY2hpcC0+bGluZXM7CisJCS8qIGJ1dCBjaGVjayBpZiBzb21lIGludGVycnVwdHMgaGF2ZSBiZWVuIHNraXBwZWQgKi8KKwkJY3VycmVudF9ibG9jayA9IGNoaXAtPmN1cnJlbnRfbGluZSAqIDE2IC8gY2hpcC0+bGluZXM7CisJCWlycV9ibG9jayA9IHN0YXR1cyA+PiBJTlRfUklTQ1NfU0hJRlQ7CisJCWlmIChjdXJyZW50X2Jsb2NrICE9IGlycV9ibG9jaykKKwkJCWNoaXAtPmN1cnJlbnRfbGluZSA9IChpcnFfYmxvY2sgKiBjaGlwLT5saW5lcyArIDE1KSAvIDE2OworCisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+c3Vic3RyZWFtKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9idDg3eF9kaWdpdGFsX2h3ID0geworCS5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAorCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0gMCwgLyogc2V0IGF0IHJ1bnRpbWUgKi8KKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDI1NSAqIDQwOTIsCisJLnBlcmlvZF9ieXRlc19taW4gPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heCA9IDQwOTIsCisJLnBlcmlvZHNfbWluID0gMiwKKwkucGVyaW9kc19tYXggPSAyNTUsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9idDg3eF9hbmFsb2dfaHcgPSB7CisJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzgsCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkucmF0ZV9taW4gPSBBTkFMT0dfQ0xPQ0sgLyBDTE9DS19ESVZfTUFYLAorCS5yYXRlX21heCA9IEFOQUxPR19DTE9DSyAvIENMT0NLX0RJVl9NSU4sCisJLmNoYW5uZWxzX21pbiA9IDEsCisJLmNoYW5uZWxzX21heCA9IDEsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSAyNTUgKiA0MDkyLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gMzIsCisJLnBlcmlvZF9ieXRlc19tYXggPSA0MDkyLAorCS5wZXJpb2RzX21pbiA9IDIsCisJLnBlcmlvZHNfbWF4ID0gMjU1LAorfTsKKworc3RhdGljIGludCBzbmRfYnQ4N3hfc2V0X2RpZ2l0YWxfaHcoYnQ4N3hfdCAqY2hpcCwgc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWludCByYXRlOworCQl1bnNpZ25lZCBpbnQgYml0OworCX0gcmF0ZWJpdHNbXSA9IHsKKwkJezgwMDAsIFNORFJWX1BDTV9SQVRFXzgwMDB9LAorCQl7MTEwMjUsIFNORFJWX1BDTV9SQVRFXzExMDI1fSwKKwkJezE2MDAwLCBTTkRSVl9QQ01fUkFURV8xNjAwMH0sCisJCXsyMjA1MCwgU05EUlZfUENNX1JBVEVfMjIwNTB9LAorCQl7MzIwMDAsIFNORFJWX1BDTV9SQVRFXzMyMDAwfSwKKwkJezQ0MTAwLCBTTkRSVl9QQ01fUkFURV80NDEwMH0sCisJCXs0ODAwMCwgU05EUlZfUENNX1JBVEVfNDgwMDB9CisJfTsKKwlpbnQgaTsKKworCWNoaXAtPnJlZ19jb250cm9sIHw9IENUTF9EQV9JT01fREE7CisJcnVudGltZS0+aHcgPSBzbmRfYnQ4N3hfZGlnaXRhbF9odzsKKwlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1Q7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmF0ZWJpdHMpOyArK2kpCisJCWlmIChjaGlwLT5kaWdfcmF0ZSA9PSByYXRlYml0c1tpXS5yYXRlKSB7CisJCQlydW50aW1lLT5ody5yYXRlcyA9IHJhdGViaXRzW2ldLmJpdDsKKwkJCWJyZWFrOworCQl9CisJcnVudGltZS0+aHcucmF0ZV9taW4gPSBjaGlwLT5kaWdfcmF0ZTsKKwlydW50aW1lLT5ody5yYXRlX21heCA9IGNoaXAtPmRpZ19yYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9zZXRfYW5hbG9nX2h3KGJ0ODd4X3QgKmNoaXAsIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCXN0YXRpYyByYXRudW1fdCBhbmFsb2dfY2xvY2sgPSB7CisJCS5udW0gPSBBTkFMT0dfQ0xPQ0ssCisJCS5kZW5fbWluID0gQ0xPQ0tfRElWX01JTiwKKwkJLmRlbl9tYXggPSBDTE9DS19ESVZfTUFYLAorCQkuZGVuX3N0ZXAgPSAxCisJfTsKKwlzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X3JhdG51bXNfdCBjb25zdHJhaW50X3JhdGVzID0geworCQkubnJhdHMgPSAxLAorCQkucmF0cyA9ICZhbmFsb2dfY2xvY2sKKwl9OworCisJY2hpcC0+cmVnX2NvbnRyb2wgJj0gfkNUTF9EQV9JT01fREE7CisJcnVudGltZS0+aHcgPSBzbmRfYnQ4N3hfYW5hbG9nX2h3OworCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtcyhydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkJICAgICAmY29uc3RyYWludF9yYXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X3BjbV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmY2hpcC0+b3BlbmVkKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlID09IERFVklDRV9ESUdJVEFMKQorCQllcnIgPSBzbmRfYnQ4N3hfc2V0X2RpZ2l0YWxfaHcoY2hpcCwgcnVudGltZSk7CisJZWxzZQorCQllcnIgPSBzbmRfYnQ4N3hfc2V0X2FuYWxvZ19odyhjaGlwLCBydW50aW1lKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX2Vycm9yOworCisJY2hpcC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJldHVybiAwOworCitfZXJyb3I6CisJY2xlYXJfYml0KDAsICZjaGlwLT5vcGVuZWQpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbmRfYnQ4N3hfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWJ0ODd4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5zdWJzdHJlYW0gPSBOVUxMOworCWNsZWFyX2JpdCgwLCAmY2hpcC0+b3BlbmVkKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKmh3X3BhcmFtcykKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCQkJCSAgICAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBzbmRfYnQ4N3hfY3JlYXRlX3Jpc2MoY2hpcCwgc3Vic3RyZWFtLAorCQkJCSAgICAgcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKSwKKwkJCQkgICAgIHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWJ0ODd4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfYnQ4N3hfZnJlZV9yaXNjKGNoaXApOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYnQ4N3hfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJYnQ4N3hfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZGVjaW1hdGlvbjsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwljaGlwLT5yZWdfY29udHJvbCAmPSB+KENUTF9EQV9TRFJfTUFTSyB8IENUTF9EQV9TQlIpOworCWRlY2ltYXRpb24gPSAoQU5BTE9HX0NMT0NLICsgcnVudGltZS0+cmF0ZSAvIDQpIC8gcnVudGltZS0+cmF0ZTsKKwljaGlwLT5yZWdfY29udHJvbCB8PSBkZWNpbWF0aW9uIDw8IENUTF9EQV9TRFJfU0hJRlQ7CisJaWYgKHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1M4KQorCQljaGlwLT5yZWdfY29udHJvbCB8PSBDVExfREFfU0JSOworCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0dQSU9fRE1BX0NUTCwgY2hpcC0+cmVnX2NvbnRyb2wpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9zdGFydChidDg3eF90ICpjaGlwKQoreworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPmN1cnJlbnRfbGluZSA9IDA7CisJY2hpcC0+cmVnX2NvbnRyb2wgfD0gQ1RMX0ZJRk9fRU5BQkxFIHwgQ1RMX1JJU0NfRU5BQkxFIHwgQ1RMX0FDQVBfRU47CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfUklTQ19TVFJUX0FERCwgY2hpcC0+ZG1hX3Jpc2MuYWRkcik7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfUEFDS0VUX0xFTiwKKwkJCSBjaGlwLT5saW5lX2J5dGVzIHwgKGNoaXAtPmxpbmVzIDw8IDE2KSk7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfSU5UX01BU0ssIGNoaXAtPmludGVycnVwdF9tYXNrKTsKKwlzbmRfYnQ4N3hfd3JpdGVsKGNoaXAsIFJFR19HUElPX0RNQV9DVEwsIGNoaXAtPnJlZ19jb250cm9sKTsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9zdG9wKGJ0ODd4X3QgKmNoaXApCit7CisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+cmVnX2NvbnRyb2wgJj0gfihDVExfRklGT19FTkFCTEUgfCBDVExfUklTQ19FTkFCTEUgfCBDVExfQUNBUF9FTik7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfR1BJT19ETUFfQ1RMLCBjaGlwLT5yZWdfY29udHJvbCk7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfSU5UX01BU0ssIDApOworCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0lOVF9TVEFULCBNWV9JTlRFUlJVUFRTKTsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlyZXR1cm4gc25kX2J0ODd4X3N0YXJ0KGNoaXApOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcmV0dXJuIHNuZF9idDg3eF9zdG9wKGNoaXApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9idDg3eF9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcmV0dXJuIChzbmRfcGNtX3VmcmFtZXNfdClieXRlc190b19mcmFtZXMocnVudGltZSwgY2hpcC0+Y3VycmVudF9saW5lICogY2hpcC0+bGluZV9ieXRlcyk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9idDg3eF9wY21fb3BzID0geworCS5vcGVuID0gc25kX2J0ODd4X3BjbV9vcGVuLAorCS5jbG9zZSA9IHNuZF9idDg3eF9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2J0ODd4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9idDg3eF9od19mcmVlLAorCS5wcmVwYXJlID0gc25kX2J0ODd4X3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfYnQ4N3hfdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9idDg3eF9wb2ludGVyLAorCS5wYWdlID0gc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKK307CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvKQoreworCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJaW5mby0+Y291bnQgPSAxOworCWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9jYXB0dXJlX3ZvbHVtZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWUpCit7CisJYnQ4N3hfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGNoaXAtPnJlZ19jb250cm9sICYgQ1RMX0FfR0FJTl9NQVNLKSA+PiBDVExfQV9HQUlOX1NISUZUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9idDg3eF9jYXB0dXJlX3ZvbHVtZV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWUpCit7CisJYnQ4N3hfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1MzIgb2xkX2NvbnRyb2w7CisJaW50IGNoYW5nZWQ7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJb2xkX2NvbnRyb2wgPSBjaGlwLT5yZWdfY29udHJvbDsKKwljaGlwLT5yZWdfY29udHJvbCA9IChjaGlwLT5yZWdfY29udHJvbCAmIH5DVExfQV9HQUlOX01BU0spCisJCXwgKHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDw8IENUTF9BX0dBSU5fU0hJRlQpOworCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0dQSU9fRE1BX0NUTCwgY2hpcC0+cmVnX2NvbnRyb2wpOworCWNoYW5nZWQgPSBvbGRfY29udHJvbCAhPSBjaGlwLT5yZWdfY29udHJvbDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYnQ4N3hfY2FwdHVyZV92b2x1bWUgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiQ2FwdHVyZSBWb2x1bWUiLAorCS5pbmZvID0gc25kX2J0ODd4X2NhcHR1cmVfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF9idDg3eF9jYXB0dXJlX3ZvbHVtZV9nZXQsCisJLnB1dCA9IHNuZF9idDg3eF9jYXB0dXJlX3ZvbHVtZV9wdXQsCit9OworCitzdGF0aWMgaW50IHNuZF9idDg3eF9jYXB0dXJlX2Jvb3N0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvKQoreworCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJaW5mby0+Y291bnQgPSAxOworCWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfYm9vc3RfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbHVlKQoreworCWJ0ODd4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEhIChjaGlwLT5yZWdfY29udHJvbCAmIENUTF9BX0cyWCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfYm9vc3RfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbHVlKQoreworCWJ0ODd4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTMyIG9sZF9jb250cm9sOworCWludCBjaGFuZ2VkOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCW9sZF9jb250cm9sID0gY2hpcC0+cmVnX2NvbnRyb2w7CisJY2hpcC0+cmVnX2NvbnRyb2wgPSAoY2hpcC0+cmVnX2NvbnRyb2wgJiB+Q1RMX0FfRzJYKQorCQl8ICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IENUTF9BX0cyWCA6IDApOworCXNuZF9idDg3eF93cml0ZWwoY2hpcCwgUkVHX0dQSU9fRE1BX0NUTCwgY2hpcC0+cmVnX2NvbnRyb2wpOworCWNoYW5nZWQgPSBjaGlwLT5yZWdfY29udHJvbCAhPSBvbGRfY29udHJvbDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYnQ4N3hfY2FwdHVyZV9ib29zdCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIEJvb3N0IiwKKwkuaW5mbyA9IHNuZF9idDg3eF9jYXB0dXJlX2Jvb3N0X2luZm8sCisJLmdldCA9IHNuZF9idDg3eF9jYXB0dXJlX2Jvb3N0X2dldCwKKwkucHV0ID0gc25kX2J0ODd4X2NhcHR1cmVfYm9vc3RfcHV0LAorfTsKKworc3RhdGljIGludCBzbmRfYnQ4N3hfY2FwdHVyZV9zb3VyY2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzNdID0geyJUViBUdW5lciIsICJGTSIsICJNaWMvTGluZSJ9OworCisJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwlpbmZvLT5jb3VudCA9IDE7CisJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJaWYgKGluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDI7CisJc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSkKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IChjaGlwLT5yZWdfY29udHJvbCAmIENUTF9BX1NFTF9NQVNLKSA+PiBDVExfQV9TRUxfU0hJRlQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSkKK3sKKwlidDg3eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUzMiBvbGRfY29udHJvbDsKKwlpbnQgY2hhbmdlZDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlvbGRfY29udHJvbCA9IGNoaXAtPnJlZ19jb250cm9sOworCWNoaXAtPnJlZ19jb250cm9sID0gKGNoaXAtPnJlZ19jb250cm9sICYgfkNUTF9BX1NFTF9NQVNLKQorCQl8ICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IENUTF9BX1NFTF9TSElGVCk7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfR1BJT19ETUFfQ1RMLCBjaGlwLT5yZWdfY29udHJvbCk7CisJY2hhbmdlZCA9IGNoaXAtPnJlZ19jb250cm9sICE9IG9sZF9jb250cm9sOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9idDg3eF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJLmluZm8gPSBzbmRfYnQ4N3hfY2FwdHVyZV9zb3VyY2VfaW5mbywKKwkuZ2V0ID0gc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX2dldCwKKwkucHV0ID0gc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX3B1dCwKK307CisKK3N0YXRpYyBpbnQgc25kX2J0ODd4X2ZyZWUoYnQ4N3hfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+bW1pbykgeworCQlzbmRfYnQ4N3hfc3RvcChjaGlwKTsKKwkJaWYgKGNoaXAtPmlycSA+PSAwKQorCQkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisKKwkJaW91bm1hcChjaGlwLT5tbWlvKTsKKwl9CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYnQ4N3hfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJYnQ4N3hfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF9idDg3eF9mcmVlKGNoaXApOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYnQ4N3hfcGNtKGJ0ODd4X3QgKmNoaXAsIGludCBkZXZpY2UsIGNoYXIgKm5hbWUpCit7CisJaW50IGVycjsKKwlzbmRfcGNtX3QgKnBjbTsKKworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIGRldmljZSwgMCwgMSwgJnBjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXN0cmNweShwY20tPm5hbWUsIG5hbWUpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9idDg3eF9wY21fb3BzKTsKKwlyZXR1cm4gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQkJCQkgICAgIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKKwkJCQkJCSAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCQkJCTEyOCAqIDEwMjQsCisJCQkJCQkJKDI1NSAqIDQwOTIgKyAxMDIzKSAmIH4xMDIzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2J0ODd4X2NyZWF0ZShzbmRfY2FyZF90ICpjYXJkLAorCQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgYnQ4N3hfdCAqKnJjaGlwKQoreworCWJ0ODd4X3QgKmNoaXA7CisJaW50IGVycjsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9IHNuZF9idDg3eF9kZXZfZnJlZQorCX07CisKKwkqcmNoaXAgPSBOVUxMOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkJ0ODd4IGF1ZGlvIikpIDwgMCkgeworCQlrZnJlZShjaGlwKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiBlcnI7CisJfQorCWNoaXAtPm1taW8gPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCksCisJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkpOworCWlmICghY2hpcC0+bW1pbykgeworCQlzbmRfYnQ4N3hfZnJlZShjaGlwKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlbWFwIGlvIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoaXAtPnJlZ19jb250cm9sID0gQ1RMX0RBX0VTMiB8IENUTF9QS1RQXzE2IHwgKDE1IDw8IENUTF9EQV9TRFJfU0hJRlQpOworCWNoaXAtPmludGVycnVwdF9tYXNrID0gTVlfSU5URVJSVVBUUzsKKwlzbmRfYnQ4N3hfd3JpdGVsKGNoaXAsIFJFR19HUElPX0RNQV9DVEwsIGNoaXAtPnJlZ19jb250cm9sKTsKKwlzbmRfYnQ4N3hfd3JpdGVsKGNoaXAsIFJFR19JTlRfTUFTSywgMCk7CisJc25kX2J0ODd4X3dyaXRlbChjaGlwLCBSRUdfSU5UX1NUQVQsIE1ZX0lOVEVSUlVQVFMpOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYnQ4N3hfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkJCSJCdDg3eCBhdWRpbyIsIGNoaXApKSB7CisJCXNuZF9idDg3eF9mcmVlKGNoaXApOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfYnQ4N3hfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCSpyY2hpcCA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQlRfREVWSUNFKGNoaXAsIHN1YnZlbmQsIHN1YmRldiwgcmF0ZSkgXAorCXsgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBcCisJICAuZGV2aWNlID0gUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfIyNjaGlwLCBcCisJICAuc3VidmVuZG9yID0gc3VidmVuZCwgLnN1YmRldmljZSA9IHN1YmRldiwgXAorCSAgLmRyaXZlcl9kYXRhID0gcmF0ZSB9CisKKy8qIGRyaXZlcl9kYXRhIGlzIHRoZSBkZWZhdWx0IGRpZ2l0YWxfcmF0ZSB2YWx1ZSBmb3IgdGhhdCBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYnQ4N3hfaWRzW10gPSB7CisJQlRfREVWSUNFKDg3OCwgMHgwMDcwLCAweDEzZWIsIDMyMDAwKSwgLyogSGF1cHBhdWdlIFdpblRWIHNlcmllcyAqLworCUJUX0RFVklDRSg4NzksIDB4MDA3MCwgMHgxM2ViLCAzMjAwMCksIC8qIEhhdXBwYXVnZSBXaW5UViBzZXJpZXMgKi8KKwlCVF9ERVZJQ0UoODc4LCAweDAwNzAsIDB4ZmYwMSwgNDQxMDApLCAvKiBWaWV3Y2FzdCBPc3ByZXkgMjAwICovCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9idDg3eF9pZHMpOworCisvKiBjYXJkcyBrbm93biBub3QgdG8gaGF2ZSBhdWRpbworICogKERWQiBjYXJkcyB1c2UgdGhlIGF1ZGlvIGZ1bmN0aW9uIHRvIHRyYW5zZmVyIE1QRUcgZGF0YSkgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHN1YnZlbmRvciwgc3ViZGV2aWNlOworfSBibGFja2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCXsweDAwNzEsIDB4MDEwMX0sIC8qIE5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYgKi8KKwl7MHgxMWJkLCAweDAwMjZ9LCAvKiBQaW5uYWNsZSBQQ1RWIFNBVCBDSSAqLworCXsweDE0NjEsIDB4MDc2MX0sIC8qIEFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgKi8KKwl7MHgxNDYxLCAweDA3NzF9LCAvKiBBVmVybWVkaWEgRFZCLVQgNzcxICovCisJezB4MTgyMiwgMHgwMDAxfSwgLyogVHdpbmhhbiBWaXNpb25QbHVzIERWQi1UICovCisJezB4MThhYywgMHhkYjEwfSwgLyogRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlICovCisJezB4MjcwZiwgMHhmYzAwfSwgLyogQ2hhaW50ZWNoIERpZ2l0b3AgRFNULTEwMDAgRFZCLVMgKi8KK307CisKKy8qIHJldHVybiB0aGUgcmF0ZSBvZiB0aGUgY2FyZCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBpdCdzIGJsYWNrbGlzdGVkICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYnQ4N3hfZGV0ZWN0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqc3VwcG9ydGVkOworCisJc3VwcG9ydGVkID0gcGNpX21hdGNoX2RldmljZShzbmRfYnQ4N3hfaWRzLCBwY2kpOworCWlmIChzdXBwb3J0ZWQpCisJCXJldHVybiBzdXBwb3J0ZWQtPmRyaXZlcl9kYXRhOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxhY2tsaXN0KTsgKytpKQorCQlpZiAoYmxhY2tsaXN0W2ldLnN1YnZlbmRvciA9PSBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYKKwkJICAgIGJsYWNrbGlzdFtpXS5zdWJkZXZpY2UgPT0gcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhcmQgJSMwNHg6JSMwNHggaGFzIG5vIGF1ZGlvXG4iLAorCQkJCSAgICBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidW5rbm93biBjYXJkICUjMDR4OiUjMDR4LCB1c2luZyBkZWZhdWx0IHJhdGUgMzIwMDBcbiIsCisJCSAgIHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKKwlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInBsZWFzZSBtYWlsIGlkLCBib2FyZCBuYW1lLCBhbmQsICIKKwkJICAgImlmIGl0IHdvcmtzLCB0aGUgY29ycmVjdCBkaWdpdGFsX3JhdGUgb3B0aW9uIHRvICIKKwkJICAgIjxhbHNhLWRldmVsQGxpc3RzLnNmLm5ldD5cbiIpOworCXJldHVybiAzMjAwMDsgLyogZGVmYXVsdCByYXRlICovCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9idDg3eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWJ0ODd4X3QgKmNoaXA7CisJaW50IGVyciwgcmF0ZTsKKworCXJhdGUgPSBwY2lfaWQtPmRyaXZlcl9kYXRhOworCWlmICghIHJhdGUpCisJCWlmICgocmF0ZSA9IHNuZF9idDg3eF9kZXRlY3RfY2FyZChwY2kpKSA8PSAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCSsrZGV2OworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoIWNhcmQpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gc25kX2J0ODd4X2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwlpZiAoZGlnaXRhbF9yYXRlW2Rldl0gPiAwKQorCQljaGlwLT5kaWdfcmF0ZSA9IGRpZ2l0YWxfcmF0ZVtkZXZdOworCWVsc2UKKwkJY2hpcC0+ZGlnX3JhdGUgPSByYXRlOworCisJZXJyID0gc25kX2J0ODd4X3BjbShjaGlwLCBERVZJQ0VfRElHSVRBTCwgIkJ0ODd4IERpZ2l0YWwiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisJZXJyID0gc25kX2J0ODd4X3BjbShjaGlwLCBERVZJQ0VfQU5BTE9HLCAiQnQ4N3ggQW5hbG9nIik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX2Vycm9yOworCisJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfYnQ4N3hfY2FwdHVyZV92b2x1bWUsIGNoaXApKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfYnQ4N3hfY2FwdHVyZV9ib29zdCwgY2hpcCkpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIF9lcnJvcjsKKwllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9idDg3eF9jYXB0dXJlX3NvdXJjZSwgY2hpcCkpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIF9lcnJvcjsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJCdDg3eCIpOworCXNwcmludGYoY2FyZC0+c2hvcnRuYW1lLCAiQnJvb2t0cmVlIEJ0JXgiLCBwY2ktPmRldmljZSk7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0ICUjbHgsIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCksIGNoaXAtPmlycSk7CisJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIkJ0ODd4Iik7CisKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwkrK2RldjsKKwlyZXR1cm4gMDsKKworX2Vycm9yOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9idDg3eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworLyogZGVmYXVsdCBlbnRyaWVzIGZvciBhbGwgQnQ4N3ggY2FyZHMgLSBpdCdzIG5vdCBleHBvcnRlZCAqLworLyogZHJpdmVyX2RhdGEgaXMgc2V0IHRvIDAgdG8gY2FsbCBkZXRlY3Rpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYnQ4N3hfZGVmYXVsdF9pZHNbXSA9IHsKKwlCVF9ERVZJQ0UoODc4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwKSwKKwlCVF9ERVZJQ0UoODc5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwKSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiQnQ4N3giLAorCS5pZF90YWJsZSA9IHNuZF9idDg3eF9pZHMsCisJLnByb2JlID0gc25kX2J0ODd4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYnQ4N3hfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9idDg3eF9pbml0KHZvaWQpCit7CisJaWYgKGxvYWRfYWxsKQorCQlkcml2ZXIuaWRfdGFibGUgPSBzbmRfYnQ4N3hfZGVmYXVsdF9pZHM7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9idDg3eF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfYnQ4N3hfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9idDg3eF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9NYWtlZmlsZSBiL3NvdW5kL3BjaS9jYTAxMDYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljNmNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitzbmQtY2EwMTA2LW9ianMgOj0gY2EwMTA2X21haW4ubyBjYTAxMDZfcHJvYy5vIGNhMDEwNl9taXhlci5vCisKK29iai0kKENPTkZJR19TTkRfQ0EwMTA2KSArPSBzbmQtY2EwMTA2Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2LmggYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjAyODgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNi5oCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwNCBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrPgorICogIERyaXZlciBDQTAxMDYgY2hpcHMuIGUuZy4gU291bmQgQmxhc3RlciBBdWRpZ3kgTFMgYW5kIExpdmUgMjRiaXQKKyAqICBWZXJzaW9uOiAwLjAuMjAKKyAqCisgKiAgRkVBVFVSRVMgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAqICAgIFNlZSBjYTAxMDZfbWFpbi5jIGZvciBmZWF0dXJlcy4KKyAqIAorICogIENoYW5nZWxvZzoKKyAqICAgIFN1cHBvcnQgaW50ZXJydXB0cyBwZXIgcGVyaW9kLgorICogICAgUmVtb3ZlZCBub2lzZSBmcm9tIENlbnRlci9MRkUgY2hhbm5lbCB3aGVuIGluIEFuYWxvZyBtb2RlLgorICogICAgUmVuYW1lIGFuZCByZW1vdmUgbWl4ZXIgY29udHJvbHMuCisgKiAgMC4wLjYKKyAqICAgIFVzZSBzZXBhcmF0ZSBjYXJkIGJhc2VkIERNQSBidWZmZXIgZm9yIHBlcmlvZHMgdGFibGUgbGlzdC4KKyAqICAwLjAuNworICogICAgQ2hhbmdlIHJlbW92ZSBhbmQgcmVuYW1lIGN0cmxzIGludG8gbGlzdHMuCisgKiAgMC4wLjgKKyAqICAgIFRyeSB0byBmaXggY2FwdHVyZSBzb3VyY2VzLgorICogIDAuMC45CisgKiAgICBGaXggQUMzIG91dHB1dC4KKyAqICAgIEVuYWJsZSBTMzJfTEUgZm9ybWF0IHN1cHBvcnQuCisgKiAgMC4wLjEwCisgKiAgICBFbmFibGUgcGxheWJhY2sgNDgwMDAgYW5kIDk2MDAwIHJhdGVzLiAoUmF0ZXMgb3RoZXIgdGhhdCB0aGVzZSBkbyBub3Qgd29yaywgZXZlbiB3aXRoICJwbHVnOmZyb250Ii4pCisgKiAgMC4wLjExCisgKiAgICBBZGQgTW9kZWwgbmFtZSByZWNvZ25pdGlvbi4KKyAqICAwLjAuMTIKKyAqICAgIENvcnJlY3QgaW50ZXJydXB0IHRpbWluZy4gaW50ZXJydXB0IGF0IGVuZCBvZiBwZXJpb2QsIGluc3RlYWQgb2YgaW4gdGhlIG1pZGRsZSBvZiBhIHBsYXliYWNrIHBlcmlvZC4KKyAqICAgIFJlbW92ZSByZWR1bmRlbnQgInZvaWNlIiBoYW5kbGluZy4KKyAqICAwLjAuMTMKKyAqICAgIFNpbmdsZSB0cmlnZ2VyIGNhbGwgZm9yIG11bHRpIGNoYW5uZWxzLgorICogIDAuMC4xNAorICogICAgU2V0IGxpbWl0cyBiYXNlZCBvbiB3aGF0IHRoZSBzb3VuZCBjYXJkIGhhcmR3YXJlIGNhbiBkby4KKyAqICAgIHBsYXliYWNrIHBlcmlvZHNfbWluPTIsIHBlcmlvZHNfbWF4PTgKKyAqICAgIGNhcHR1cmUgaHcgY29uc3RyYWludHMgcmVxdWlyZSBwZXJpb2Rfc2l6ZSA9IG4gKiA2NCBieXRlcy4KKyAqICAgIHBsYXliYWNrIGh3IGNvbnN0cmFpbnRzIHJlcXVpcmUgcGVyaW9kX3NpemUgPSBuICogNjQgYnl0ZXMuCisgKiAgMC4wLjE1CisgKiAgICBTZXBhcmF0ZWQgY2EwMTA2LmMgaW50byBzZXBhcmF0ZSBmdW5jdGlvbmFsIC5jIGZpbGVzLgorICogIDAuMC4xNgorICogICAgSW1wbGVtZW50IDE5MjAwMCBzYW1wbGUgcmF0ZS4KKyAqICAwLjAuMTcKKyAqICAgIEFkZCBzdXBwb3J0IGZvciBTQjA0MTAgYW5kIFNCMDQxMy4KKyAqICAwLjAuMTgKKyAqICAgIE1vZGlmaWVkIENvcHlyaWdodCBtZXNzYWdlLgorICogIDAuMC4xOQorICogICAgQWRkZWQgSTJDIGFuZCBTUEkgcmVnaXN0ZXJzLiBGaWxsZWQgaW4gaW50ZXJydXB0IGVuYWJsZS4KKyAqICAwLjAuMjAKKyAqICAgIEFkZGVkIEdQSU8gaW5mbyBmb3IgU0IgTGl2ZSAyNGJpdC4KKyAqCisgKgorICogIFRoaXMgY29kZSB3YXMgaW5pdGFsbHkgYmFzZWQgb24gY29kZSBmcm9tIEFMU0EncyBlbXUxMGsxeC5jIHdoaWNoIGlzOgorICogIENvcHlyaWdodCAoYykgYnkgRnJhbmNpc2NvIE1vcmFlcyA8Zm1vcmFlc0BuYy5yci5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIGZ1bmN0aW9uIDAgcmVnaXN0ZXJzLCBhZGRyZXNzID0gPHZhbD4gKyBQQ0lCQVNFMAkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBUUgkJCTB4MDAJCS8qIEluZGV4ZWQgcmVnaXN0ZXIgc2V0IHBvaW50ZXIgcmVnaXN0ZXIJKi8KKwkJCQkJCS8qIE5PVEU6IFRoZSBDSEFOTkVMTlVNIGFuZCBBRERSRVNTIHdvcmRzIGNhbgkqLworCQkJCQkJLyogYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBvZiBlYWNoIG90aGVyLgkqLworCQkJCQkJLyogQ05MWzE6MF0sIEFERFJbMjc6MTZdICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBEQVRBCQkJMHgwNAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlcgkJKi8KKwkJCQkJCS8qIERBVEFbMzE6MF0JCQkJCSovCisKKyNkZWZpbmUgSVBSCQkJMHgwOAkJLyogR2xvYmFsIGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyCQkqLworCQkJCQkJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzIGJ5IHdyaXRpbmcgYSAxIHRvCSovCisJCQkJCQkvKiB0aGUgcmVsZXZhbnQgYml0cyBhbmQgemVybyB0byB0aGUgb3RoZXIgYml0cwkqLworI2RlZmluZSBJUFJfTUlESV9SWF9CCQkweDAwMDIwMDAwCS8qIE1JREkgVUFSVC1CIFJlY2VpdmUgYnVmZmVyIG5vbi1lbXB0eQkJKi8KKyNkZWZpbmUgSVBSX01JRElfVFhfQgkJMHgwMDAxMDAwMAkvKiBNSURJIFVBUlQtQiBUcmFuc21pdCBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIElQUl9TUERJRl9JTl9VU0VSCTB4MDAwMDQwMDAgICAgICAvKiBTUERJRiBpbnB1dCB1c2VyIGRhdGEgaGFzIDE2IG1vcmUgYml0cwkqLworI2RlZmluZSBJUFJfU1BESUZfT1VUX1VTRVIJMHgwMDAwMjAwMCAgICAgIC8qIFNQRElGIG91dHB1dCB1c2VyIGRhdGEgbmVlZHMgMTYgbW9yZSBiaXRzCSovCisjZGVmaW5lIElQUl9TUERJRl9PVVRfRlJBTUUJMHgwMDAwMTAwMCAgICAgIC8qIFNQRElGIGZyYW1lIGFib3V0IHRvIHN0YXJ0CQkJKi8KKyNkZWZpbmUgSVBSX1NQSQkJCTB4MDAwMDA4MDAgICAgICAvKiBTUEkgdHJhbnNhY3Rpb24gY29tcGxldGVkCQkJKi8KKyNkZWZpbmUgSVBSX0kyQ19FRVBST00JCTB4MDAwMDA0MDAgICAgICAvKiBJMkMgRUVQUk9NIHRyYW5zYWN0aW9uIGNvbXBsZXRlZAkJKi8KKyNkZWZpbmUgSVBSX0kyQ19EQUMJCTB4MDAwMDAyMDAgICAgICAvKiBJMkMgREFDIHRyYW5zYWN0aW9uIGNvbXBsZXRlZAkJKi8KKyNkZWZpbmUgSVBSX0FJCQkJMHgwMDAwMDEwMCAgICAgIC8qIEF1ZGlvIHBlbmRpbmcgcmVnaXN0ZXIgY2hhbmdlZC4gU2VlIFBUUiByZWcgMHg3NgkqLworI2RlZmluZSBJUFJfR1BJCQkJMHgwMDAwMDA4MCAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBpbnB1dCBjaGFuZ2VkCQkqLworI2RlZmluZSBJUFJfU1JDX0xPQ0tFRCAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogU1JDIGxvY2sgc3RhdHVzIGNoYW5nZWQJCQkqLworI2RlZmluZSBJUFJfU1BESUZfU1RBVFVTICAgICAgICAweDAwMDAwMDIwICAgICAgLyogU1BESUYgc3RhdHVzIGNoYW5nZWQJCQkJKi8KKyNkZWZpbmUgSVBSX1RJTUVSMiAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIDE5MjAwMEh6IFRpbWVyCQkJCSovCisjZGVmaW5lIElQUl9USU1FUjEgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgICAvKiA0NDEwMEh6IFRpbWVyCQkJCSovCisjZGVmaW5lIElQUl9NSURJX1JYX0EJCTB4MDAwMDAwMDQJLyogTUlESSBVQVJULUEgUmVjZWl2ZSBidWZmZXIgbm9uLWVtcHR5CQkqLworI2RlZmluZSBJUFJfTUlESV9UWF9BCQkweDAwMDAwMDAyCS8qIE1JREkgVUFSVC1BIFRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KKyNkZWZpbmUgSVBSX1BDSQkJCTB4MDAwMDAwMDEJLyogUENJIEJ1cyBlcnJvcgkJCQkqLworCisjZGVmaW5lIElOVEUJCQkweDBjCQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCQkJKi8KKworI2RlZmluZSBJTlRFX01JRElfUlhfQgkJMHgwMDAyMDAwMAkvKiBNSURJIFVBUlQtQiBSZWNlaXZlIGJ1ZmZlciBub24tZW1wdHkJCSovCisjZGVmaW5lIElOVEVfTUlESV9UWF9CCQkweDAwMDEwMDAwCS8qIE1JREkgVUFSVC1CIFRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KKyNkZWZpbmUgSU5URV9TUERJRl9JTl9VU0VSCTB4MDAwMDQwMDAgICAgICAvKiBTUERJRiBpbnB1dCB1c2VyIGRhdGEgaGFzIDE2IG1vcmUgYml0cwkqLworI2RlZmluZSBJTlRFX1NQRElGX09VVF9VU0VSCTB4MDAwMDIwMDAgICAgICAvKiBTUERJRiBvdXRwdXQgdXNlciBkYXRhIG5lZWRzIDE2IG1vcmUgYml0cwkqLworI2RlZmluZSBJTlRFX1NQRElGX09VVF9GUkFNRQkweDAwMDAxMDAwICAgICAgLyogU1BESUYgZnJhbWUgYWJvdXQgdG8gc3RhcnQJCQkqLworI2RlZmluZSBJTlRFX1NQSQkJMHgwMDAwMDgwMCAgICAgIC8qIFNQSSB0cmFuc2FjdGlvbiBjb21wbGV0ZWQJCQkqLworI2RlZmluZSBJTlRFX0kyQ19FRVBST00JCTB4MDAwMDA0MDAgICAgICAvKiBJMkMgRUVQUk9NIHRyYW5zYWN0aW9uIGNvbXBsZXRlZAkJKi8KKyNkZWZpbmUgSU5URV9JMkNfREFDCQkweDAwMDAwMjAwICAgICAgLyogSTJDIERBQyB0cmFuc2FjdGlvbiBjb21wbGV0ZWQJCSovCisjZGVmaW5lIElOVEVfQUkJCQkweDAwMDAwMTAwICAgICAgLyogQXVkaW8gcGVuZGluZyByZWdpc3RlciBjaGFuZ2VkLiBTZWUgUFRSIHJlZyAweDc1ICovCisjZGVmaW5lIElOVEVfR1BJCQkweDAwMDAwMDgwICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIGlucHV0IGNoYW5nZWQJCSovCisjZGVmaW5lIElOVEVfU1JDX0xPQ0tFRCAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvKiBTUkMgbG9jayBzdGF0dXMgY2hhbmdlZAkJCSovCisjZGVmaW5lIElOVEVfU1BESUZfU1RBVFVTICAgICAgIDB4MDAwMDAwMjAgICAgICAvKiBTUERJRiBzdGF0dXMgY2hhbmdlZAkJCQkqLworI2RlZmluZSBJTlRFX1RJTUVSMiAgICAgICAgICAgICAweDAwMDAwMDEwICAgICAgLyogMTkyMDAwSHogVGltZXIJCQkJKi8KKyNkZWZpbmUgSU5URV9USU1FUjEgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIDQ0MTAwSHogVGltZXIJCQkJKi8KKyNkZWZpbmUgSU5URV9NSURJX1JYX0EJCTB4MDAwMDAwMDQJLyogTUlESSBVQVJULUEgUmVjZWl2ZSBidWZmZXIgbm9uLWVtcHR5CQkqLworI2RlZmluZSBJTlRFX01JRElfVFhfQQkJMHgwMDAwMDAwMgkvKiBNSURJIFVBUlQtQSBUcmFuc21pdCBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIElOVEVfUENJCQkweDAwMDAwMDAxCS8qIFBDSSBCdXMgZXJyb3IJCQkJKi8KKworI2RlZmluZSBVTktOT1dOMTAJCTB4MTAJCS8qIFVua25vd24gPz8uIERlZmF1bHRzIHRvIDAgKi8KKyNkZWZpbmUgSENGRwkJCTB4MTQJCS8qIEhhcmR3YXJlIGNvbmZpZyByZWdpc3RlcgkJCSovCisJCQkJCQkvKiAweDEwMDAgY2F1c2VzIEFDMyB0byBmYWlscy4gSXQgYWRkcyBhIGRpdGhlciBiaXQuICovCisKKyNkZWZpbmUgSENGR19TVEFDCQkweDEwMDAwMDAwCS8qIFNwZWNpYWwgbW9kZSBmb3IgU1RBQzk0NjAgQ29kZWMuICovCisjZGVmaW5lIEhDRkdfQ0FQVFVSRV9JMlNfQllQQVNTCTB4MDgwMDAwMDAJLyogMSA9IGJ5cGFzcyBJMlMgaW5wdXQgYXN5bmMgU1JDLiAqLworI2RlZmluZSBIQ0ZHX0NBUFRVUkVfU1BESUZfQllQQVNTIDB4MDQwMDAwMDAJLyogMSA9IGJ5cGFzcyBTUERJRiBpbnB1dCBhc3luYyBTUkMuICovCisjZGVmaW5lIEhDRkdfUExBWUJBQ0tfSTJTX0JZUEFTUyAweDAyMDAwMDAwCS8qIDAgPSBJMlMgSU4gbWl4ZXIgb3V0cHV0LCAxID0gSTJTIElOMS4gKi8KKyNkZWZpbmUgSENGR19GT1JDRV9MT0NLCQkweDAxMDAwMDAwCS8qIEZvciB0ZXN0IG9ubHkuIEZvcmNlIGlucHV0IFNSQyB0cmFja2VyIHRvIGxvY2suICovCisjZGVmaW5lIEhDRkdfUExBWUJBQ0tfQVRURU5VQVRJT04gMHgwMDAwNjAwMAkvKiBQbGF5YmFjayBhdHRlbnVhdGlvbiBtYXNrLiAwID0gMGRCLCAxID0gNmRCLCAyID0gMTJkQiwgMyA9IE11dGUuICovCisjZGVmaW5lIEhDRkdfUExBWUJBQ0tfRElUSEVSCTB4MDAwMDEwMDAJLyogMSA9IEFkZCBkaXRoZXIgYml0IHRvIGFsbCBwbGF5YmFjayBjaGFubmVscy4gKi8KKyNkZWZpbmUgSENGR19QTEFZQkFDS19TMzJfTEUJMHgwMDAwMDgwMAkvKiAxID0gUzMyX0xFLCAwID0gUzE2X0xFICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0ZHX0NBUFRVUkVfUzMyX0xFCTB4MDAwMDA0MDAJLyogMSA9IFMzMl9MRSwgMCA9IFMxNl9MRSAoUzMyX0xFIGN1cnJlbnQgbm90IHdvcmtpbmcpCSovCisjZGVmaW5lIEhDRkdfOF9DSEFOTkVMX1BMQVkJMHgwMDAwMDIwMAkvKiAxID0gOCBjaGFubmVscywgMCA9IDIgY2hhbm5lbHMgcGVyIHN1YnN0cmVhbS4qLworI2RlZmluZSBIQ0ZHXzhfQ0hBTk5FTF9DQVBUVVJFCTB4MDAwMDAxMDAJLyogMSA9IDggY2hhbm5lbHMsIDAgPSAyIGNoYW5uZWxzIHBlciBzdWJzdHJlYW0uKi8KKyNkZWZpbmUgSENGR19NT05PCQkweDAwMDAwMDgwCS8qIDEgPSBJMlMgSW5wdXQgbW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDRkdfSTJTX09VVFBVVAkJMHgwMDAwMDAxMAkvKiAxID0gSTJTIE91dHB1dCBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0ZHX0FDOTcJCTB4MDAwMDAwMDgJLyogMCA9IEFDOTcgMS4wLCAxID0gQUM5NyAyLjAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSENGR19MT0NLX1BMQVlCQUNLX0NBQ0hFIDB4MDAwMDAwMDQJLyogMSA9IENhbmNlbCBidXN0bWFzdGVyIGFjY2Vzc2VzIHRvIHNvdW5kY2FjaGUgKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCisjZGVmaW5lIEhDRkdfTE9DS19DQVBUVVJFX0NBQ0hFCTB4MDAwMDAwMDIJLyogMSA9IENhbmNlbCBidXN0bWFzdGVyIGFjY2Vzc2VzIHRvIHNvdW5kY2FjaGUgKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCisjZGVmaW5lIEhDRkdfQVVESU9FTkFCTEUJMHgwMDAwMDAwMQkvKiAwID0gQ09ERUNzIHRyYW5zbWl0IHplcm8tdmFsdWVkIHNhbXBsZXMJKi8KKwkJCQkJCS8qIFNob3VsZCBiZSBzZXQgdG8gMSB3aGVuIHRoZSBFTVUxMEsxIGlzCSovCisJCQkJCQkvKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgkJCSovCisjZGVmaW5lIEdQSU8JCQkweDE4CQkvKiBEZWZhdWx0czogMDA1ZjAzYTMtQW5hbG9nLCAwMDVmMDJhMi1TUERJRi4gICAqLworCQkJCQkJLyogSGVyZSBwaW5zIDAsMSwyLDMsNCwsNiBhcmUgb3V0cHV0LiA1LDcgYXJlIGlucHV0ICovCisJCQkJCQkvKiBGb3IgdGhlIEF1ZGlneSBMUywgcGluIDAgKG9yIGJpdCA4KSBjb250cm9scyB0aGUgU1BESUYvQW5hbG9nIGphY2suICovCisJCQkJCQkvKiBTQiBMaXZlIDI0Yml0OgorCQkJCQkJICogYml0IDggMCA9IFNQRElGIGluIGFuZCBvdXQgLyAxID0gQW5hbG9nIChNaWMgb3IgTGluZSktaW4uCisJCQkJCQkgKiBiaXQgOSAwID0gTXV0ZSAvIDEgPSBBbmFsb2cgb3V0LgorCQkJCQkJICogYml0IDEwIDAgPSBMaW5lLWluIC8gMSA9IE1pYy1pbi4KKwkJCQkJCSAqIGJpdCAxMSAwID0gPyAvIDEgPSA/CisJCQkJCQkgKiBiaXQgMTIgMCA9ID8gLyAxID0gPworCQkJCQkJICogYml0IDEzIDAgPSA/IC8gMSA9ID8KKwkJCQkJCSAqIGJpdCAxNCAwID0gTXV0ZSAvIDEgPSBBbmFsb2cgb3V0CisJCQkJCQkgKiBiaXQgMTUgMCA9ID8gLyAxID0gPworCQkJCQkJICogQm90aCBiaXQgOSBhbmQgYml0IDE0IGhhdmUgdG8gYmUgc2V0IGZvciBhbmFsb2cgc291bmQgdG8gd29yayBvbiB0aGUgU0IgTGl2ZSAyNGJpdC4KKwkJCQkJCSAqLworCQkJCQkJLyogOCBnZW5lcmFsIHB1cnBvc2UgcHJvZ3JhbW1hYmxlIEluL091dCBwaW5zLgorCQkJCQkJICogR1BJIFs4OjBdIFJlYWQgb25seS4gRGVmYXVsdCAwLgorCQkJCQkJICogR1BPIFsxNTo4XSBEZWZhdWx0IDB4OS4gKERlZmF1bHQgdG8gU1BESUYgamFjayBlbmFibGVkIGZvciBTUERJRikKKwkJCQkJCSAqIEdQTyBFbmFibGUgWzIzOjE2XSBEZWZhdWx0IDB4MGYuIFNldHRpbmcgYSBiaXQgdG8gMSwgY2F1c2VzIHRoZSBwaW4gdG8gYmUgYW4gb3V0cHV0IHBpbi4KKwkJCQkJCSAqLworI2RlZmluZSBBQzk3REFUQQkJMHgxYwkJLyogQUM5NyByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlciAoMTYgYml0KQkqLworCisjZGVmaW5lIEFDOTdBRERSRVNTCQkweDFlCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBhZGRyZXNzIHJlZ2lzdGVyICg4IGJpdCkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ0EwMTA2IHBvaW50ZXItb2Zmc2V0IHJlZ2lzdGVyIHNldCwgYWNjZXNzZWQgdGhyb3VnaCB0aGUgUFRSIGFuZCBEQVRBIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEluaXRhbGx5IGFsbCByZWdpc3RlcnMgZnJvbSAweDAwIHRvIDB4M2YgaGF2ZSB6ZXJvIGNvbnRlbnRzLiAqLworI2RlZmluZSBQTEFZQkFDS19MSVNUX0FERFIJMHgwMAkJLyogQmFzZSBETUEgYWRkcmVzcyBvZiBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gZWFjaCBwZXJpb2Qvc2l6ZSAqLworCQkJCQkJLyogT25lIGxpc3QgZW50cnk6IDQgYnl0ZXMgZm9yIERNQSBhZGRyZXNzLCAKKwkJCQkJCSAqIDQgYnl0ZXMgZm9yIHBlcmlvZF9zaXplIDw8IDE2LgorCQkJCQkJICogT25lIGxpc3QgZW50cnkgaXMgOCBieXRlcyBsb25nLgorCQkJCQkJICogT25lIGxpc3QgZW50cnkgZm9yIGVhY2ggcGVyaW9kIGluIHRoZSBidWZmZXIuCisJCQkJCQkgKi8KKwkJCQkJCS8qIEFERFJbMzE6MF0sIERlZmF1bHQ6IDB4MCAqLworI2RlZmluZSBQTEFZQkFDS19MSVNUX1NJWkUJMHgwMQkJLyogU2l6ZSBvZiBsaXN0IGluIGJ5dGVzIDw8IDE2LiBFLmcuIDggcGVyaW9kcyAtPiAweDAwMzgwMDAwICAqLworCQkJCQkJLyogU0laRVsyMToxNl0sIERlZmF1bHQ6IDB4OCAqLworI2RlZmluZSBQTEFZQkFDS19MSVNUX1BUUgkweDAyCQkvKiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBlcmlvZCBiZWluZyBwbGF5ZWQgKi8KKwkJCQkJCS8qIFBUUls1OjBdLCBEZWZhdWx0OiAweDAgKi8KKyNkZWZpbmUgUExBWUJBQ0tfVU5LTk9XTjMJMHgwMwkJLyogTm90IHVzZWQgPz8gKi8KKyNkZWZpbmUgUExBWUJBQ0tfRE1BX0FERFIJMHgwNAkJLyogUGxheWJhY2sgRE1BIGFkZHJlc3NzICovCisJCQkJCQkvKiBETUFbMzE6MF0sIERlZmF1bHQ6IDB4MCAqLworI2RlZmluZSBQTEFZQkFDS19QRVJJT0RfU0laRQkweDA1CQkvKiBQbGF5YmFjayBwZXJpb2Qgc2l6ZS4gd2luMjAwMCB1c2VzIDB4MDQwMDAwMDAgKi8KKwkJCQkJCS8qIFNJWkVbMzE6MTZdLCBEZWZhdWx0OiAweDAgKi8KKyNkZWZpbmUgUExBWUJBQ0tfUE9JTlRFUgkweDA2CQkvKiBQbGF5YmFjayBwZXJpb2QgcG9pbnRlci4gVXNlZCB3aXRoIFBMQVlCQUNLX0xJU1RfUFRSIHRvIGRldGVybWluZSBidWZmZXIgcG9zaXRpb24gY3VycmVudGx5IGluIERBQyAqLworCQkJCQkJLyogUE9JTlRFUlsxNTowXSwgRGVmYXVsdDogMHgwICovCisjZGVmaW5lIFBMQVlCQUNLX1BFUklPRF9FTkRfQUREUiAweDA3CQkvKiBQbGF5YmFjayBmaWZvIGVuZCBhZGRyZXNzICovCisJCQkJCQkvKiBFTkRfQUREUlsxNTowXSwgRkxBR1sxNl0gMCA9IGRvbid0IHN0b3AsIDEgPSBzdG9wICovCisjZGVmaW5lIFBMQVlCQUNLX0ZJRk9fT0ZGU0VUX0FERFJFU1MJMHgwOAkvKiBDdXJyZW50IGZpZm8gb2Zmc2V0IGFkZHJlc3MgWzIxOjE2XSAqLworCQkJCQkJLyogQ2FjaGUgc2l6ZSB2YWxpZCBbNTowXSAqLworI2RlZmluZSBQTEFZQkFDS19VTktOT1dOOQkweDA5CQkvKiAweDkgdG8gMHhmIFVudXNlZCAqLworI2RlZmluZSBDQVBUVVJFX0RNQV9BRERSCTB4MTAJCS8qIENhcHR1cmUgRE1BIGFkZHJlc3MgKi8KKwkJCQkJCS8qIERNQVszMTowXSwgRGVmYXVsdDogMHgwICovCisjZGVmaW5lIENBUFRVUkVfQlVGRkVSX1NJWkUJMHgxMQkJLyogQ2FwdHVyZSBidWZmZXIgc2l6ZSAqLworCQkJCQkJLyogU0laRVszMToxNl0sIERlZmF1bHQ6IDB4MCAqLworI2RlZmluZSBDQVBUVVJFX1BPSU5URVIJCTB4MTIJCS8qIENhcHR1cmUgYnVmZmVyIHBvaW50ZXIuIFNhbXBsZSBjdXJyZW50bHkgaW4gQURDICovCisJCQkJCQkvKiBQT0lOVEVSWzE1OjBdLCBEZWZhdWx0OiAweDAgKi8KKyNkZWZpbmUgQ0FQVFVSRV9GSUZPX09GRlNFVF9BRERSRVNTCTB4MTMJLyogQ3VycmVudCBmaWZvIG9mZnNldCBhZGRyZXNzIFsyMToxNl0gKi8KKwkJCQkJCS8qIENhY2hlIHNpemUgdmFsaWQgWzU6MF0gKi8KKyNkZWZpbmUgUExBWUJBQ0tfTEFTVF9TQU1QTEUgICAgMHgyMAkJLyogVGhlIHNhbXBsZSBjdXJyZW50bHkgYmVpbmcgcGxheWVkICovCisvKiAweDIxIC0gMHgzZiB1bnVzZWQgKi8KKyNkZWZpbmUgQkFTSUNfSU5URVJSVVBUICAgICAgICAgMHg0MAkJLyogVXNlZCBieSBib3RoIHBsYXliYWNrIGFuZCBjYXB0dXJlIGludGVycnVwdCBoYW5kbGVyICovCisJCQkJCQkvKiBQbGF5YmFjayAoMHgxPDxjaGFubmVsX2lkKSAqLworCQkJCQkJLyogQ2FwdHVyZSAgKDB4MTAwPDxjaGFubmVsX2lkKSAqLworCQkJCQkJLyogUGxheWJhY2sgc2FtcGxlIHJhdGUgOTYwMDAgPSAweDIwMDAwICovCisJCQkJCQkvKiBTdGFydCBQbGF5YmFjayBbMzowXSAob25lIGJpdCBwZXIgY2hhbm5lbCkKKwkJCQkJCSAqIFN0YXJ0IENhcHR1cmUgWzExOjhdIChvbmUgYml0IHBlciBjaGFubmVsKQorCQkJCQkJICogUGxheWJhY2sgcmF0ZSBbMjM6MTZdICgyIGJpdHMgcGVyIGNoYW5uZWwpICgwPTQ4a0h6LCAxPTQ0LjFrSHosIDI9OTZrSHosIDM9MTkyS2h6KQorCQkJCQkJICogUGxheWJhY2sgbWl4ZXIgaW4gZW5hYmxlIFsyNzoyNF0gKG9uZSBiaXQgcGVyIGNoYW5uZWwpCisJCQkJCQkgKiBQbGF5YmFjayBtaXhlciBvdXQgZW5hYmxlIFszMToyOF0gKG9uZSBiaXQgcGVyIGNoYW5uZWwpCisJCQkJCQkgKi8KKy8qIFRoZSBEaWdpdGFsIG91dCBqYWNrIGlzIHNoYXJlZCB3aXRoIHRoZSBDZW50ZXIvTEZFIEFuYWxvZ3VlIG91dHB1dC4gCisgKiBUaGUgamFjayBoYXMgNCBwb2xlcy4gSSB3aWxsIGNhbGwgMSAtIFRpcCwgMiAtIE5leHQgdG8gMSwgMyAtIE5leHQgdG8gMiwgNCAtIE5leHQgdG8gMworICogRm9yIEFuYWxvZ3VlOiAxIC0+IENlbnRlciBTcGVha2VyLCAyIC0+IFN1YiBXb29mZXIsIDMgLT4gR3JvdW5kLCA0IC0+IEdyb3VuZAorICogRm9yIERpZ2l0YWw6IDEgLT4gRnJvbnQgU1BESUYsIDIgLT4gUmVhciBTUERJRiwgMyAtPiBDZW50ZXIvU3Vid29vZmVyIFNQRElGLCA0IC0+IEdyb3VuZC4KKyAqIFN0YW5kYXJkIDQgcG9sZSBWaWRlbyBBL1YgY2FibGUgd2l0aCBSQ0Egb3V0cHV0czogMSAtPiBXaGl0ZSwgMiAtPiBZZWxsb3csIDMgLT4gU2hlaWxkIG9uIGFsbCB0aHJlZSwgNCAtPiBSZWQuCisgKiBTbywgZnJvbSB0aGlzIHlvdSBjYW4gc2VlIHRoYXQgeW91IGNhbm5vdCB1c2UgYSBTdGFuZGFyZCA0IHBvbGUgVmlkZW8gQS9WIGNhYmxlIHdpdGggdGhlIFNCIEF1ZGlneSBMUyBjYXJkLgorICovCisvKiBUaGUgRnJvbnQgU1BESUYgUENNIGdldHMgbWl4ZWQgd2l0aCBzYW1wbGVzIGZyb20gdGhlIEFDOTcgY29kZWMsIHNvIGNhbiBvbmx5IHdvcmsgZm9yIFN0ZXJlbyBQQ00gYW5kIG5vdCBBQzMvRFRTCisgKiBUaGUgUmVhciBTUERJRiBjYW4gYmUgdXNlZCBmb3IgU3RlcmVvIFBDTSBhbmQgYWxzbyBBQzMvRFRTCisgKiBUaGUgQ2VudGVyL0xGRSBTUERJRiBjYW5ub3QgYmUgdXNlZCBmb3IgQUMzL0RUUywgYnV0IGNhbiBiZSB1c2VkIGZvciBTdGVyZW8gUENNLgorICogU3VtbWFyeTogRm9yIEFMU0Egd2UgdXNlIHRoZSBSZWFyIGNoYW5uZWwgZm9yIFNQRElGIERpZ2l0YWwgQUMzL0RUUyBvdXRwdXQKKyAqLworLyogQSBzdGFuZGFyZCAyIHBvbGUgbW9ubyBtaW5pLWphY2sgdG8gUkNBIHBsdWcgY2FuIGJlIHVzZWQgZm9yIFNQRElGIFN0ZXJlbyBQQ00gb3V0cHV0IGZyb20gdGhlIEZyb250IGNoYW5uZWwuCisgKiBBIHN0YW5kYXJkIDMgcG9sZSBzdGVyZW8gbWluaS1qYWNrIHRvIDIgUkNBIHBsdWdzIGNhbiBiZSB1c2VkIGZvciBTUERJRiBBQzMvRFRTIGFuZCBTdGVyZW8gUENNIG91dHB1dCB1dGlsaXNpbmcgdGhlIFJlYXIgY2hhbm5lbCBhbmQganVzdCBvbmUgb2YgdGhlIFJDQSBwbHVncy4gCisgKi8KKyNkZWZpbmUgU1BDUzAJCQkweDQxCQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMCByZWdpc3Rlci4gRm9yIFJlYXIuIGRlZmF1bHQ9MHgwMjEwODAwNCwgbm9uLWF1ZGlvPTB4MDIxMDgwMDYJKi8KKyNkZWZpbmUgU1BDUzEJCQkweDQyCQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMSByZWdpc3Rlci4gRm9yIEZyb250ICovCisjZGVmaW5lIFNQQ1MyCQkJMHg0MwkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDIgcmVnaXN0ZXIuIEZvciBDZW50ZXIvTEZFICovCisjZGVmaW5lIFNQQ1MzCQkJMHg0NAkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDMgcmVnaXN0ZXIuIFVua25vd24gKi8KKwkJCQkJCS8qIFdoZW4gQ2hhbm5lbCBzZXQgdG8gMDogKi8KKyNkZWZpbmUgU1BDU19DTEtBQ0NZTUFTSwkweDMwMDAwMDAwCS8qIENsb2NrIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNCTB4MDAwMDAwMDAJLyogMTAwMCBwYXJ0cyBwZXIgbWlsbGlvbgkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV81MFBQTQkweDEwMDAwMDAwCS8qIDUwIHBhcnRzIHBlciBtaWxsaW9uCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV9WQVJJQUJMRQkweDIwMDAwMDAwCS8qIFZhcmlhYmxlIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfU0FNUExFUkFURU1BU0sJMHgwZjAwMDAwMAkvKiBTYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDAJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDgJMHgwMjAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfMzIJMHgwMzAwMDAwMAkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX0NIQU5ORUxOVU1NQVNLCTB4MDBmMDAwMDAJLyogQ2hhbm5lbCBudW1iZXIJCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX0xFRlQJMHgwMDEwMDAwMAkvKiBMZWZ0IGNoYW5uZWwJCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9SSUdIVAkweDAwMjAwMDAwCS8qIFJpZ2h0IGNoYW5uZWwJCQkJKi8KKyNkZWZpbmUgU1BDU19TT1VSQ0VOVU1NQVNLCTB4MDAwZjAwMDAJLyogU291cmNlIG51bWJlcgkJCQkqLworI2RlZmluZSBTUENTX1NPVVJDRU5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBzb3VyY2UgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19HRU5FUkFUSU9OU1RBVFVTCTB4MDAwMDgwMDAJLyogT3JpZ2luYWxpdHkgZmxhZyAoc2VlIElFQy05NTggc3BlYykJCSovCisjZGVmaW5lIFNQQ1NfQ0FURUdPUllDT0RFTUFTSwkweDAwMDA3ZjAwCS8qIENhdGVnb3J5IGNvZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLworI2RlZmluZSBTUENTX01PREVNQVNLCQkweDAwMDAwMGMwCS8qIE1vZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU01BU0sJMHgwMDAwMDAzOAkvKiBFbXBoYXNpcwkJCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU19OT05FCTB4MDAwMDAwMDAJLyogTm8gZW1waGFzaXMJCQkJCSovCisjZGVmaW5lIFNQQ1NfRU1QSEFTSVNfNTBfMTUJMHgwMDAwMDAwOAkvKiA1MC8xNSB1c2VjIDIgY2hhbm5lbAkJCQkqLworI2RlZmluZSBTUENTX0NPUFlSSUdIVAkJMHgwMDAwMDAwNAkvKiBDb3B5cmlnaHQgYXNzZXJ0ZWQgZmxhZyAtLSBkbyBub3QgbW9kaWZ5CSovCisjZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCisjZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLworCisJCQkJCQkvKiBXaGVuIENoYW5uZWwgc2V0IHRvIDE6ICovCisjZGVmaW5lIFNQQ1NfV09SRF9MRU5HVEhfTUFTSwkweDAwMDAwMDBmCS8qIFdvcmQgTGVuZ3RoIE1hc2sJCQkJKi8KKyNkZWZpbmUgU1BDU19XT1JEX0xFTkdUSF8xNgkweDAwMDAwMDA4CS8qIFdvcmQgTGVuZ3RoIDE2IGJpdAkJCQkqLworI2RlZmluZSBTUENTX1dPUkRfTEVOR1RIXzE3CTB4MDAwMDAwMDYJLyogV29yZCBMZW5ndGggMTcgYml0CQkJCSovCisjZGVmaW5lIFNQQ1NfV09SRF9MRU5HVEhfMTgJMHgwMDAwMDAwNAkvKiBXb3JkIExlbmd0aCAxOCBiaXQJCQkJKi8KKyNkZWZpbmUgU1BDU19XT1JEX0xFTkdUSF8xOQkweDAwMDAwMDAyCS8qIFdvcmQgTGVuZ3RoIDE5IGJpdAkJCQkqLworI2RlZmluZSBTUENTX1dPUkRfTEVOR1RIXzIwQQkweDAwMDAwMDBhCS8qIFdvcmQgTGVuZ3RoIDIwIGJpdAkJCQkqLworI2RlZmluZSBTUENTX1dPUkRfTEVOR1RIXzIwCTB4MDAwMDAwMDkJLyogV29yZCBMZW5ndGggMjAgYml0IChib3RoIDB4YSBhbmQgMHg5IGFyZSAyMCBiaXQpICovCisjZGVmaW5lIFNQQ1NfV09SRF9MRU5HVEhfMjEJMHgwMDAwMDAwNwkvKiBXb3JkIExlbmd0aCAyMSBiaXQJCQkJKi8KKyNkZWZpbmUgU1BDU19XT1JEX0xFTkdUSF8yMQkweDAwMDAwMDA3CS8qIFdvcmQgTGVuZ3RoIDIxIGJpdAkJCQkqLworI2RlZmluZSBTUENTX1dPUkRfTEVOR1RIXzIyCTB4MDAwMDAwMDUJLyogV29yZCBMZW5ndGggMjIgYml0CQkJCSovCisjZGVmaW5lIFNQQ1NfV09SRF9MRU5HVEhfMjMJMHgwMDAwMDAwMwkvKiBXb3JkIExlbmd0aCAyMyBiaXQJCQkJKi8KKyNkZWZpbmUgU1BDU19XT1JEX0xFTkdUSF8yNAkweDAwMDAwMDBiCS8qIFdvcmQgTGVuZ3RoIDI0IGJpdAkJCQkqLworI2RlZmluZSBTUENTX09SSUdJTkFMX1NBTVBMRV9SQVRFX01BU0sJMHgwMDAwMDBmMCAvKiBPcmlnaW5hbCBTYW1wbGUgcmF0ZQkJCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfTk9ORQkweDAwMDAwMDAwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlIG5vdCBpbmRpY2F0ZWQJKi8KKyNkZWZpbmUgU1BDU19PUklHSU5BTF9TQU1QTEVfUkFURV8xNjAwMAkweDAwMDAwMDEwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfUkVTMQkweDAwMDAwMDIwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfMzIwMDAJMHgwMDAwMDAzMCAvKiBPcmlnaW5hbCBTYW1wbGUgcmF0ZQkqLworI2RlZmluZSBTUENTX09SSUdJTkFMX1NBTVBMRV9SQVRFXzEyMDAwCTB4MDAwMDAwNDAgLyogT3JpZ2luYWwgU2FtcGxlIHJhdGUJKi8KKyNkZWZpbmUgU1BDU19PUklHSU5BTF9TQU1QTEVfUkFURV8xMTAyNQkweDAwMDAwMDUwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfODAwMAkweDAwMDAwMDYwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfUkVTMgkweDAwMDAwMDcwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfMTkyMDAwIDB4MDAwMDAwODAgLyogT3JpZ2luYWwgU2FtcGxlIHJhdGUJKi8KKyNkZWZpbmUgU1BDU19PUklHSU5BTF9TQU1QTEVfUkFURV8yNDAwMAkweDAwMDAwMDkwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfOTYwMDAJMHgwMDAwMDBhMCAvKiBPcmlnaW5hbCBTYW1wbGUgcmF0ZQkqLworI2RlZmluZSBTUENTX09SSUdJTkFMX1NBTVBMRV9SQVRFXzQ4MDAwCTB4MDAwMDAwYjAgLyogT3JpZ2luYWwgU2FtcGxlIHJhdGUJKi8KKyNkZWZpbmUgU1BDU19PUklHSU5BTF9TQU1QTEVfUkFURV8xNzY0MDAgMHgwMDAwMDBjMCAvKiBPcmlnaW5hbCBTYW1wbGUgcmF0ZQkqLworI2RlZmluZSBTUENTX09SSUdJTkFMX1NBTVBMRV9SQVRFXzIyMDUwCTB4MDAwMDAwZDAgLyogT3JpZ2luYWwgU2FtcGxlIHJhdGUJKi8KKyNkZWZpbmUgU1BDU19PUklHSU5BTF9TQU1QTEVfUkFURV84ODIwMAkweDAwMDAwMGUwIC8qIE9yaWdpbmFsIFNhbXBsZSByYXRlCSovCisjZGVmaW5lIFNQQ1NfT1JJR0lOQUxfU0FNUExFX1JBVEVfNDQxMDAJMHgwMDAwMDBmMCAvKiBPcmlnaW5hbCBTYW1wbGUgcmF0ZQkqLworCisjZGVmaW5lIFNQRElGX1NFTEVDVDEJCTB4NDUJCS8qIEVuYWJsZXMgU1BESUYgb3IgQW5hbG9ndWUgb3V0cHV0cyAwLVNQRElGLCAweGYwMC1BbmFsb2d1ZSAqLworCQkJCQkJLyogMHgxMDAgLSBGcm9udCwgMHg4MDAgLSBSZWFyLCAweDIwMCAtIENlbnRlci9MRkUuCisJCQkJCQkgKiBCdXQgYXMgdGhlIGphY2sgaXMgc2hhcmVkLCB1c2UgMHhmMDAuCisJCQkJCQkgKiBUaGUgV2luZG93czIwMDAgZHJpdmVyIHVzZXMgMHgwMDAwMDAwZiBmb3IgYm90aCBkaWdpdGFsIGFuZCBhbmFsb2cuCisJCQkJCQkgKiAweGYwMCBpbnRyb2R1Y2VzIGludGVyZXN0aW5nIG5vaXNlcyBvbnRvIHRoZSBDZW50ZXIvTEZFLgorCQkJCQkJICogSWYgeW91IHR1cm4gdGhlIHZvbHVtZSB1cCwgeW91IGhlYXIgY29tcHV0ZXIgbm9pc2UsCisJCQkJCQkgKiBlLmcuIG1vdXNlIG1vdmluZywgY2hhbmdpbmcgYmV0d2VlbiBhcHAgd2luZG93cyBldGMuCisJCQkJCQkgKiBTbywgSSBhbSBnb2luZyB0byBzZXQgdGhpcyB0byAweDAwMDAwMDBmIGFsbCB0aGUgdGltZSBub3csCisJCQkJCQkgKiBzYW1lIGFzIHRoZSB3aW5kb3dzIGRyaXZlciBkb2VzLgorCQkJCQkJICogVXNlIHJlZ2lzdGVyIFNQRElGX1NFTEVDVDIoMHg3MikgdG8gc3dpdGNoIGJldHdlZW4gU1BESUYgYW5kIEFuYWxvZy4KKwkJCQkJCSAqLworCQkJCQkJLyogV2hlbiBDaGFubmVsID0gMDoKKwkJCQkJCSAqIFdpZGUgU1BESUYgZm9ybWF0IFszOjBdIChvbmUgYml0IGZvciBlYWNoIGNoYW5uZWwpICgwPTIwYml0LCAxPTI0Yml0KQorCQkJCQkJICogVHJpc3RhdGUgU1BESUYgT3V0cHV0IFsxMTo4XSAob25lIGJpdCBmb3IgZWFjaCBjaGFubmVsKSAoMD1Ob3QgdHJpc3RhdGUsIDE9VHJpc3RhdGUpCisJCQkJCQkgKiBTUERJRiBCeXBhc3MgZW5hYmxlIFsxOToxNl0gKG9uZSBiaXQgZm9yIGVhY2ggY2hhbm5lbCkgKDA9Tm90IGJ5cGFzcywgMT1CeXBhc3MpCisJCQkJCQkgKi8KKwkJCQkJCS8qIFdoZW4gQ2hhbm5lbCA9IDE6CisJCQkJCQkgKiBTUERJRiAwIFVzZXIgZGF0YSBbNzowXQorCQkJCQkJICogU1BESUYgMSBVc2VyIGRhdGEgWzE1OjhdCisJCQkJCQkgKiBTUERJRiAwIFVzZXIgZGF0YSBbMjM6MTZdCisJCQkJCQkgKiBTUERJRiAwIFVzZXIgZGF0YSBbMzE6MjRdCisJCQkJCQkgKiBVc2VyIGRhdGEgY2FuIGJlIHNlbnQgYnkgdXNpbmcgdGhlIFNQRElGIG91dHB1dCBmcmFtZSBwZW5kaW5nIGFuZCBTUERJRiBvdXRwdXQgdXNlciBiaXQgaW50ZXJydXB0cy4KKwkJCQkJCSAqLworI2RlZmluZSBXQVRFUk1BUksJCTB4NDYJCS8qIFRlc3QgYml0IHRvIGluZGljYXRlIGNhY2hlIHVzYWdlIGxldmVsICovCisjZGVmaW5lIFNQRElGX0lOUFVUX1NUQVRVUwkweDQ5CQkvKiBTUERJRiBJbnB1dCBzdGF0dXMgcmVnaXN0ZXIuIEJpdHMgdGhlIHNhbWUgYXMgU1BDUy4KKwkJCQkJCSAqIFdoZW4gQ2hhbm5lbCA9IDA6IEJpdHMgdGhlIHNhbWUgYXMgU1BDUyBjaGFubmVsIDAuCisJCQkJCQkgKiBXaGVuIENoYW5uZWwgPSAxOiBCaXRzIHRoZSBzYW1lIGFzIFNQQ1MgY2hhbm5lbCAxLgorCQkJCQkJICogV2hlbiBDaGFubmVsID0gMjoKKwkJCQkJCSAqIFNQRElGIElucHV0IFVzZXIgZGF0YSBbMTY6MF0KKwkJCQkJCSAqIFNQRElGIElucHV0IEZyYW1lIGNvdW50IFsyMToxNl0KKwkJCQkJCSAqLworI2RlZmluZSBDQVBUVVJFX0NBQ0hFX0RBVEEJMHg1MAkJLyogMHg1MC0weDVmIFJlY29yZGVkIHNhbXBsZXMuICovCisjZGVmaW5lIENBUFRVUkVfU09VUkNFICAgICAgICAgIDB4NjAgICAgICAgICAgICAvKiBDYXB0dXJlIFNvdXJjZSAwID0gTUlDICovCisjZGVmaW5lIENBUFRVUkVfU09VUkNFX0NIQU5ORUwwIDB4ZjAwMDAwMDAJLyogTWFzayBmb3Igc2VsZWN0aW5nIHRoZSBDYXB0dXJlIHNvdXJjZXMgKi8KKyNkZWZpbmUgQ0FQVFVSRV9TT1VSQ0VfQ0hBTk5FTDEgMHgwZjAwMDAwMAkvKiAwIC0gU1BESUYgbWl4ZXIgb3V0cHV0LiAqLworI2RlZmluZSBDQVBUVVJFX1NPVVJDRV9DSEFOTkVMMiAweDAwZjAwMDAwICAgICAgLyogMSAtIFdoYXQgeW91IGhlYXIgb3IgLiAyIC0gPz8gKi8KKyNkZWZpbmUgQ0FQVFVSRV9TT1VSQ0VfQ0hBTk5FTDMgMHgwMDBmMDAwMAkvKiAzIC0gTWljIGluLCBMaW5lIGluLCBUQUQgaW4sIEF1eCBpbi4gKi8KKyNkZWZpbmUgQ0FQVFVSRV9TT1VSQ0VfUkVDT1JEX01BUCAweDAwMDBmZmZmCS8qIERlZmF1bHQgMHgwMGU0ICovCisJCQkJCQkvKiBSZWNvcmQgTWFwIFs3OjBdICgyIGJpdHMgcGVyIGNoYW5uZWwpIDA9bWFwcGVkIHRvIGNoYW5uZWwgMCwgMT1tYXBwZWQgdG8gY2hhbm5lbCAxLCAyPW1hcHBlZCB0byBjaGFubmVsMiwgMz1tYXBwZWQgdG8gY2hhbm5lbDMgCisJCQkJCQkgKiBSZWNvcmQgc291cmNlIHNlbGVjdCBmb3IgY2hhbm5lbCAwIFsxODoxNl0KKwkJCQkJCSAqIFJlY29yZCBzb3VyY2Ugc2VsZWN0IGZvciBjaGFubmVsIDEgWzIyOjIwXQorCQkJCQkJICogUmVjb3JkIHNvdXJjZSBzZWxlY3QgZm9yIGNoYW5uZWwgMiBbMjY6MjRdCisJCQkJCQkgKiBSZWNvcmQgc291cmNlIHNlbGVjdCBmb3IgY2hhbm5lbCAzIFszMDoyOF0KKwkJCQkJCSAqIDAgLSBTUERJRiBtaXhlciBvdXRwdXQuCisJCQkJCQkgKiAxIC0gaTJzIG1peGVyIG91dHB1dC4KKwkJCQkJCSAqIDIgLSBTUERJRiBpbnB1dC4KKwkJCQkJCSAqIDMgLSBpMnMgaW5wdXQuCisJCQkJCQkgKiA0IC0gQUM5NyBjYXB0dXJlLgorCQkJCQkJICogNSAtIFNSQyBvdXRwdXQuCisJCQkJCQkgKi8KKyNkZWZpbmUgQ0FQVFVSRV9WT0xVTUUxICAgICAgICAgMHg2MSAgICAgICAgICAgIC8qIENhcHR1cmUgIHZvbHVtZSBwZXIgY2hhbm5lbCAwLTMgKi8KKyNkZWZpbmUgQ0FQVFVSRV9WT0xVTUUyICAgICAgICAgMHg2MiAgICAgICAgICAgIC8qIENhcHR1cmUgIHZvbHVtZSBwZXIgY2hhbm5lbCA0LTcgKi8KKworI2RlZmluZSBQTEFZQkFDS19ST1VUSU5HMSAgICAgICAweDYzICAgICAgICAgICAgLyogUGxheWJhY2sgcm91dGluZyBvZiBjaGFubmVscyAwLTcuIEVmZmVjdHMgQUMzIG91dHB1dC4gRGVmYXVsdCAweDMyNzY1NDEwICovCisjZGVmaW5lIFJPVVRJTkcxX1JFQVIgICAgICAgICAgIDB4NzcwMDAwMDAgICAgICAvKiBDaGFubmVsX2lkIDAgc2VuZHMgdG8gMTAsIENoYW5uZWxfaWQgMSBzZW5kcyB0byAzMiAqLworI2RlZmluZSBST1VUSU5HMV9OVUxMICAgICAgICAgICAweDAwNzcwMDAwICAgICAgLyogQ2hhbm5lbF9pZCAyIHNlbmRzIHRvIDU0LCBDaGFubmVsX2lkIDMgc2VuZHMgdG8gNzYgKi8KKyNkZWZpbmUgUk9VVElORzFfQ0VOVEVSX0xGRSAgICAgMHgwMDAwNzcwMCAgICAgIC8qIDB4MzI3NjU0MTAgbWVhbnMsIHNlbmQgQ2hhbm5lbF9pZCAwIHRvIEZST05ULCBDaGFubmVsX2lkIDEgdG8gUkVBUiAqLworI2RlZmluZSBST1VUSU5HMV9GUk9OVCAgICAgICAgICAweDAwMDAwMDc3CS8qIENoYW5uZWxfaWQgMiB0byBDRU5URVJfTEZFLCBDaGFubmVsX2lkIDMgdG8gTlVMTC4gKi8KKwkJCQkJCS8qIENoYW5uZWxfaWQncyBoYW5kbGUgc3RlcmVvIGNoYW5uZWxzLiBDaGFubmVsIFggaXMgYSBzaW5nbGUgbW9ubyBjaGFubmVsICovCisJCQkJCQkvKiBIb3N0IGlzIGlucHV0IGZyb20gdGhlIFBDSSBidXMuICovCisJCQkJCQkvKiBIb3N0IGNoYW5uZWwgMCBbMjowXSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBIb3N0IGNoYW5uZWwgMSBbNjo0XSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBIb3N0IGNoYW5uZWwgMiBbMTA6OF0gLT4gU1BESUYgTWl4ZXIvUm91dGVyIGNoYW5uZWwgMC03LgorCQkJCQkJICogSG9zdCBjaGFubmVsIDMgWzE0OjEyXSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBIb3N0IGNoYW5uZWwgNCBbMTg6MTZdIC0+IFNQRElGIE1peGVyL1JvdXRlciBjaGFubmVsIDAtNy4KKwkJCQkJCSAqIEhvc3QgY2hhbm5lbCA1IFsyMjoyMF0gLT4gU1BESUYgTWl4ZXIvUm91dGVyIGNoYW5uZWwgMC03LgorCQkJCQkJICogSG9zdCBjaGFubmVsIDYgWzI2OjI0XSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBIb3N0IGNoYW5uZWwgNyBbMzA6MjhdIC0+IFNQRElGIE1peGVyL1JvdXRlciBjaGFubmVsIDAtNy4KKwkJCQkJCSAqLworCisjZGVmaW5lIFBMQVlCQUNLX1JPVVRJTkcyICAgICAgIDB4NjQgICAgICAgICAgICAvKiBQbGF5YmFjayBSb3V0aW5nIC4gRmVlZGluZyBDYXB0dXJlIGNoYW5uZWxzIGJhY2sgaW50byBQbGF5YmFjay4gRWZmZWN0cyBBQzMgb3V0cHV0LiBEZWZhdWx0IDB4NzY3Njc2NzYgKi8KKwkJCQkJCS8qIFNSQyBpcyBpbnB1dCBmcm9tIHRoZSBjYXB0dXJlIGlucHV0cy4gKi8KKwkJCQkJCS8qIFNSQyBjaGFubmVsIDAgWzI6MF0gLT4gU1BESUYgTWl4ZXIvUm91dGVyIGNoYW5uZWwgMC03LgorCQkJCQkJICogU1JDIGNoYW5uZWwgMSBbNjo0XSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBTUkMgY2hhbm5lbCAyIFsxMDo4XSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBTUkMgY2hhbm5lbCAzIFsxNDoxMl0gLT4gU1BESUYgTWl4ZXIvUm91dGVyIGNoYW5uZWwgMC03LgorCQkJCQkJICogU1JDIGNoYW5uZWwgNCBbMTg6MTZdIC0+IFNQRElGIE1peGVyL1JvdXRlciBjaGFubmVsIDAtNy4KKwkJCQkJCSAqIFNSQyBjaGFubmVsIDUgWzIyOjIwXSAtPiBTUERJRiBNaXhlci9Sb3V0ZXIgY2hhbm5lbCAwLTcuCisJCQkJCQkgKiBTUkMgY2hhbm5lbCA2IFsyNjoyNF0gLT4gU1BESUYgTWl4ZXIvUm91dGVyIGNoYW5uZWwgMC03LgorCQkJCQkJICogU1JDIGNoYW5uZWwgNyBbMzA6MjhdIC0+IFNQRElGIE1peGVyL1JvdXRlciBjaGFubmVsIDAtNy4KKwkJCQkJCSAqLworCisjZGVmaW5lIFBMQVlCQUNLX01VVEUgICAgICAgICAgIDB4NjUgICAgICAgICAgICAvKiBVbmtub3duLiBXaGlsZSBwbGF5aW5nIDB4MCwgd2hpbGUgc2lsZW50IDB4MDBmYzAwMDAgKi8KKwkJCQkJCS8qIFNQRElGIE1peGVyIGlucHV0IGNvbnRyb2w6CisJCQkJCQkgKiBJbnZlcnQgU1JDIHRvIFNQRElGIE1peGVyIFs3LTBdIChPbmUgYml0IHBlciBjaGFubmVsKQorCQkJCQkJICogSW52ZXJ0IEhvc3QgdG8gU1BESUYgTWl4ZXIgWzE1OjhdIChPbmUgYml0IHBlciBjaGFubmVsKQorCQkJCQkJICogU1JDIHRvIFNQRElGIE1peGVyIGRpc2FibGUgWzIzOjE2XSAoT25lIGJpdCBwZXIgY2hhbm5lbCkKKwkJCQkJCSAqIEhvc3QgdG8gU1BESUYgTWl4ZXIgZGlzYWJsZSBbMzE6MjRdIChPbmUgYml0IHBlciBjaGFubmVsKQorCQkJCQkJICovCisjZGVmaW5lIFBMQVlCQUNLX1ZPTFVNRTEgICAgICAgIDB4NjYgICAgICAgICAgICAvKiBQbGF5YmFjayBTUERJRiB2b2x1bWUgcGVyIGNoYW5uZWwuIFNldCB0byB0aGUgc2FtZSBQTEFZQkFDS19WT0xVTUUoMHg2YSkgKi8KKwkJCQkJCS8qIFBMQVlCQUNLX1ZPTFVNRTEgbXVzdCBiZSBzZXQgdG8gMzAzMDMwMzAgZm9yIFNQRElGIEFDMyBQbGF5YmFjayAqLworCQkJCQkJLyogU1BESUYgbWl4ZXIgaW5wdXQgdm9sdW1lLiAwPTEyZEIsIDB4MzA9MGRCLCAweEZFPS01MS41ZEIsIDB4ZmY9TXV0ZSAqLworCQkJCQkJLyogT25lIHJlZ2lzdGVyIGZvciBlYWNoIG9mIHRoZSA0IHN0ZXJlbyBzdHJlYW1zLiAqLworCQkJCQkJLyogU1JDIFJpZ2h0IHZvbHVtZSBbNzowXQorCQkJCQkJICogU1JDIExlZnQgIHZvbHVtZSBbMTU6OF0KKwkJCQkJCSAqIEhvc3QgUmlnaHQgdm9sdW1lIFsyMzoxNl0KKwkJCQkJCSAqIEhvc3QgTGVmdCAgdm9sdW1lIFszMToyNF0KKwkJCQkJCSAqLworI2RlZmluZSBDQVBUVVJFX1JPVVRJTkcxICAgICAgICAweDY3ICAgICAgICAgICAgLyogQ2FwdHVyZSBSb3V0aW5nLiBEZWZhdWx0IDB4MzI3NjU0MTAgKi8KKwkJCQkJCS8qIFNpbWlsYXIgdG8gcmVnaXN0ZXIgMHg2MywgZXhjZXB0IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBJMlMgbWl4ZXIgaW5zdGVhZCBvZiB0aGUgU1BESUYgbWl4ZXIuIEkuRS4gT3V0cHV0cyB0byB0aGUgQW5hbG9nIG91dHB1dHMgaW5zdGVhZCBvZiBTUERJRi4gKi8KKyNkZWZpbmUgQ0FQVFVSRV9ST1VUSU5HMiAgICAgICAgMHg2OCAgICAgICAgICAgIC8qIFVua25vd24gUm91dGluZy4gRGVmYXVsdCAweDc2NzY3Njc2ICovCisJCQkJCQkvKiBTaW1pbGFyIHRvIHJlZ2lzdGVyIDB4NjQsIGV4Y2VwdCB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgSTJTIG1peGVyIGluc3RlYWQgb2YgdGhlIFNQRElGIG1peGVyLiBJLkUuIE91dHB1dHMgdG8gdGhlIEFuYWxvZyBvdXRwdXRzIGluc3RlYWQgb2YgU1BESUYuICovCisjZGVmaW5lIENBUFRVUkVfTVVURSAgICAgICAgICAgIDB4NjkgICAgICAgICAgICAvKiBVbmtub3duLiBXaGlsZSBjYXB0dXJpbmcgMHgwLCB3aGlsZSBzaWxlbnQgMHgwMGZjMDAwMCAqLworCQkJCQkJLyogU2ltaWxhciB0byByZWdpc3RlciAweDY1LCBleGNlcHQgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgdGhlIEkyUyBtaXhlciBpbnN0ZWFkIG9mIHRoZSBTUERJRiBtaXhlci4gSS5FLiBPdXRwdXRzIHRvIHRoZSBBbmFsb2cgb3V0cHV0cyBpbnN0ZWFkIG9mIFNQRElGLiAqLworI2RlZmluZSBQTEFZQkFDS19WT0xVTUUyICAgICAgICAweDZhICAgICAgICAgICAgLyogUGxheWJhY2sgQW5hbG9nIHZvbHVtZSBwZXIgY2hhbm5lbC4gRG9lcyBub3QgZWZmZWN0IEFDMyBvdXRwdXQgKi8KKwkJCQkJCS8qIFNpbWlsYXIgdG8gcmVnaXN0ZXIgMHg2NiwgZXhjZXB0IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBJMlMgbWl4ZXIgaW5zdGVhZCBvZiB0aGUgU1BESUYgbWl4ZXIuIEkuRS4gT3V0cHV0cyB0byB0aGUgQW5hbG9nIG91dHB1dHMgaW5zdGVhZCBvZiBTUERJRi4gKi8KKyNkZWZpbmUgVU5LTk9XTjZiICAgICAgICAgICAgICAgMHg2YiAgICAgICAgICAgIC8qIFVua25vd24uIFJlYWRvbmx5LiBEZWZhdWx0IDAwNDAwMDAwIDAwNDAwMDAwIDAwNDAwMDAwIDAwNDAwMDAwICovCisjZGVmaW5lIFVBUlRfQV9EQVRBCQkweDZjICAgICAgICAgICAgLyogVWFydCwgdXNlZCBpbiBzZXR0aW5nIHNhbXBsZSByYXRlcywgYml0cyBwZXIgc2FtcGxlIGV0Yy4gKi8KKyNkZWZpbmUgVUFSVF9BX0NNRAkJMHg2ZCAgICAgICAgICAgIC8qIFVhcnQsIHVzZWQgaW4gc2V0dGluZyBzYW1wbGUgcmF0ZXMsIGJpdHMgcGVyIHNhbXBsZSBldGMuICovCisjZGVmaW5lIFVBUlRfQl9EQVRBCQkweDZlICAgICAgICAgICAgLyogVWFydCwgVW5rbm93bi4gKi8KKyNkZWZpbmUgVUFSVF9CX0NNRAkJMHg2ZiAgICAgICAgICAgIC8qIFVhcnQsIFVua25vd24uICovCisjZGVmaW5lIFNBTVBMRV9SQVRFX1RSQUNLRVJfU1RBVFVTIDB4NzAgICAgICAgICAvKiBSZWFkb25seS4gRGVmYXVsdCAwMDEwODAwMCAwMDEwODAwMCAwMDUwMDAwMCAwMDUwMDAwMCAqLworCQkJCQkJLyogRXN0aW1hdGVkIHNhbXBsZSByYXRlIFsxOTowXSBSZWxhdGl2ZSB0byA0OGtIei4gMHg4MDAwID0gIDEuMAorCQkJCQkJICogUmF0ZSBMb2NrZWQgWzIwXQorCQkJCQkJICogU1BESUYgTG9ja2VkIFsyMV0gRm9yIFNQRElGIGNoYW5uZWwgb25seS4KKwkJCQkJCSAqIFZhbGlkIEF1ZGlvIFsyMl0gRm9yIFNQRElGIGNoYW5uZWwgb25seS4KKwkJCQkJCSAqLworI2RlZmluZSBDQVBUVVJFX0NPTlRST0wgICAgICAgICAweDcxICAgICAgICAgICAgLyogU29tZSBzb3J0IG9mIHJvdXRpbmcuIGRlZmF1bHQgPSA0MGM4MTAwMCAzMDMwMzAzMCAzMDMwMDAwMCAwMDcwMDAwMCAqLworCQkJCQkJLyogQ2hhbm5lbF9pZCAwOiAweDQwYzgxMDAwIG11c3QgYmUgY2hhbmdlZCB0byAweDQwYzgwMDAwIGZvciBTUERJRiBBQzMgaW5wdXQgb3Igb3V0cHV0LiAqLworCQkJCQkJLyogQ2hhbm5lbF9pZCAxOiAweGZmZmZmZmZmKG11dGUpIDB4MzAzMDMwMzAobWF4KSBjb250cm9scyBDQVBUVVJFIGZlZWRiYWNrIGludG8gUExBWUJBQ0suICovCisJCQkJCQkvKiBTYW1wbGUgcmF0ZSBvdXRwdXQgY29udHJvbCByZWdpc3RlciBDaGFubmVsPTAKKwkJCQkJCSAqIFNhbXBsZSBvdXRwdXQgcmF0ZSBbMTowXSAoMD00OGtIeiwgMT00NC4xa0h6LCAyPTk2a0h6LCAzPTE5MktoeikKKwkJCQkJCSAqIFNhbXBsZSBpbnB1dCByYXRlIFszOjJdICgwPTQ4a0h6LCAxPU5vdCBhdmFpbGFibGUsIDI9OTZrSHosIDM9MTkyS2h6KQorCQkJCQkJICogU1JDIGlucHV0IHNvdXJjZSBzZWxlY3QgWzRdIDA9QXVkaW8gZnJvbSBkaWdpdGFsIG1peGVyLCAxPUF1ZGlvIGZyb20gYW5hbG9nIHNvdXJjZS4KKwkJCQkJCSAqIFJlY29yZCByYXRlIFs5OjhdICgwPTQ4a0h6LCAxPU5vdCBhdmFpbGFibGUsIDI9OTZrSHosIDM9MTkyS2h6KQorCQkJCQkJICogUmVjb3JkIG1peGVyIG91dHB1dCBlbmFibGUgWzEyOjEwXSAKKwkJCQkJCSAqIEkyUyBpbnB1dCByYXRlIG1hc3RlciBtb2RlIFsxNToxNF0gKDA9NDhrSHosIDE9NDQuMWtIeiwgMj05NmtIeiwgMz0xOTJLaHopCisJCQkJCQkgKiBJMlMgb3V0cHV0IHJhdGUgWzE3OjE2XSAoMD00OGtIeiwgMT00NC4xa0h6LCAyPTk2a0h6LCAzPTE5MktoeikKKwkJCQkJCSAqIEkyUyBvdXRwdXQgc291cmNlIHNlbGVjdCBbMThdICgwPUF1ZGlvIGZyb20gaG9zdCwgMT1BdWRpbyBmcm9tIFNSQykKKwkJCQkJCSAqIFJlY29yZCBtaXhlciBJMlMgZW5hYmxlIFsyMDoxOV0gKGVuYWJsZS9kaXNhYmxlIGkyc2luMSBhbmQgaTJzaW4wKQorCQkJCQkJICogSTJTIG91dHB1dCBtYXN0ZXIgY2xvY2sgc2VsZWN0IFsyMV0gKDA9MjU2KkkyUyBvdXRwdXQgcmF0ZSwgMT01MTIqSTJTIG91dHB1dCByYXRlLikKKwkJCQkJCSAqIEkyUyBpbnB1dCBtYXN0ZXIgY2xvY2sgc2VsZWN0IFsyMl0gKDA9MjU2KkkyUyBpbnB1dCByYXRlLCAxPTUxMipJMlMgaW5wdXQgcmF0ZS4pCisJCQkJCQkgKiBJMlMgaW5wdXQgbW9kZSBbMjNdICgwPVNsYXZlLCAxPU1hc3RlcikKKwkJCQkJCSAqIFNQRElGIG91dHB1dCByYXRlIFsyNToyNF0gKDA9NDhrSHosIDE9NDQuMWtIeiwgMj05NmtIeiwgMz0xOTJLaHopCisJCQkJCQkgKiBTUERJRiBvdXRwdXQgc291cmNlIHNlbGVjdCBbMjZdICgwPWhvc3QsIDE9U1JDKQorCQkJCQkJICogTm90IHVzZWQgWzI3XQorCQkJCQkJICogUmVjb3JkIFNvdXJjZSAwIGlucHV0IFsyOToyOF0gKDA9U1BESUYgaW4sIDE9STJTIGluLCAyPUFDOTcgTWljLCAzPUFDOTcgUENNKQorCQkJCQkJICogUmVjb3JkIFNvdXJjZSAxIGlucHV0IFszMTozMF0gKDA9U1BESUYgaW4sIDE9STJTIGluLCAyPUFDOTcgTWljLCAzPUFDOTcgUENNKQorCQkJCQkJICovIAorCQkJCQkJLyogU2FtcGxlIHJhdGUgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgQ2hhbm5lbD0xCisJCQkJCQkgKiBJMlMgSW5wdXQgMCB2b2x1bWUgUmlnaHQgWzc6MF0KKwkJCQkJCSAqIEkyUyBJbnB1dCAwIHZvbHVtZSBMZWZ0IFsxNTo4XQorCQkJCQkJICogSTJTIElucHV0IDEgdm9sdW1lIFJpZ2h0IFsyMzoxNl0KKwkJCQkJCSAqIEkyUyBJbnB1dCAxIHZvbHVtZSBMZWZ0IFszMToyNF0KKwkJCQkJCSAqLworCQkJCQkJLyogU2FtcGxlIHJhdGUgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgQ2hhbm5lbD0yCisJCQkJCQkgKiBTUERJRiBJbnB1dCB2b2x1bWUgUmlnaHQgWzIzOjE2XQorCQkJCQkJICogU1BESUYgSW5wdXQgdm9sdW1lIExlZnQgWzMxOjI0XQorCQkJCQkJICovCisJCQkJCQkvKiBTYW1wbGUgcmF0ZSBvdXRwdXQgY29udHJvbCByZWdpc3RlciBDaGFubmVsPTMKKwkJCQkJCSAqIE5vIHVzZWQKKwkJCQkJCSAqLworI2RlZmluZSBTUERJRl9TRUxFQ1QyICAgICAgICAgICAweDcyICAgICAgICAgICAgLyogU29tZSBzb3J0IG9mIHJvdXRpbmcuIENoYW5uZWxfaWQgMCBvbmx5LiBkZWZhdWx0ID0gMHgwZjBmMDAzZi4gQW5hbG9nIDB4MDAwYjAwMDAsIERpZ2l0YWwgMHgwYjAwMDAwMCAqLworI2RlZmluZSBST1VUSU5HMl9GUk9OVF9NQVNLICAgICAweDAwMDEwMDAwICAgICAgLyogRW5hYmxlIGZvciBGcm9udCBzcGVha2Vycy4gKi8KKyNkZWZpbmUgUk9VVElORzJfQ0VOVEVSX0xGRV9NQVNLIDB4MDAwMjAwMDAgICAgIC8qIEVuYWJsZSBmb3IgQ2VudGVyL0xGRSBzcGVha2Vycy4gKi8KKyNkZWZpbmUgUk9VVElORzJfUkVBUl9NQVNLICAgICAgMHgwMDA4MDAwMCAgICAgIC8qIEVuYWJsZSBmb3IgUmVhciBzcGVha2Vycy4gKi8KKwkJCQkJCS8qIEF1ZGlvIG91dHB1dCBjb250cm9sCisJCQkJCQkgKiBBQzk3IG91dHB1dCBlbmFibGUgWzU6MF0KKwkJCQkJCSAqIEkyUyBvdXRwdXQgZW5hYmxlIFsxOToxNl0KKwkJCQkJCSAqIFNQRElGIG91dHB1dCBlbmFibGUgWzI3OjI0XQorCQkJCQkJICovIAorI2RlZmluZSBVTktOT1dONzMgICAgICAgICAgICAgICAweDczICAgICAgICAgICAgLyogVW5rbm93bi4gUmVhZG9ubHkuIERlZmF1bHQgMHgwICovCisjZGVmaW5lIENISVBfVkVSU0lPTiAgICAgICAgICAgIDB4NzQgICAgICAgICAgICAvKiBQMTcgQ2hpcCB2ZXJzaW9uLiBDaGFubmVsX2lkIDAgb25seS4gRGVmYXVsdCAwMDAwMDA3MSAqLworI2RlZmluZSBFWFRFTkRFRF9JTlRfTUFTSyAgICAgICAweDc1ICAgICAgICAgICAgLyogVXNlZCBieSBib3RoIHBsYXliYWNrIGFuZCBjYXB0dXJlIGludGVycnVwdCBoYW5kbGVyICovCisJCQkJCQkvKiBTZXRzIHdoaWNoIEludGVycnVwdHMgYXJlIGVuYWJsZWQuICovCisJCQkJCQkvKiAweDAwMDAwMDAxID0gSGFsZiBwZXJpb2QuIFBsYXliYWNrLgorCQkJCQkJICogMHgwMDAwMDAxMCA9IEZ1bGwgcGVyaW9kLiBQbGF5YmFjay4KKwkJCQkJCSAqIDB4MDAwMDAxMDAgPSBIYWxmIGJ1ZmZlci4gUGxheWJhY2suCisJCQkJCQkgKiAweDAwMDAxMDAwID0gRnVsbCBidWZmZXIuIFBsYXliYWNrLgorCQkJCQkJICogMHgwMDAxMDAwMCA9IEhhbGYgYnVmZmVyLiBDYXB0dXJlLgorCQkJCQkJICogMHgwMDEwMDAwMCA9IEZ1bGwgYnVmZmVyLiBDYXB0dXJlLgorCQkJCQkJICogQ2FwdHVyZSBjYW4gb25seSBkbyAyIHBlcmlvZHMuCisJCQkJCQkgKiAweDAxMDAwMDAwID0gRW5kIGF1ZGlvLiBQbGF5YmFjay4KKwkJCQkJCSAqIDB4NDAwMDAwMDAgPSBIYWxmIGJ1ZmZlciBQbGF5YmFjayxDYXB1dHJlIHhydW4uCisJCQkJCQkgKiAweDgwMDAwMDAwID0gRnVsbCBidWZmZXIgUGxheWJhY2ssQ2FwdXRyZSB4cnVuLgorCQkJCQkJICovCisjZGVmaW5lIEVYVEVOREVEX0lOVCAgICAgICAgICAgIDB4NzYgICAgICAgICAgICAvKiBVc2VkIGJ5IGJvdGggcGxheWJhY2sgYW5kIGNhcHR1cmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJCQkJCS8qIFNob3dzIHdoaWNoIGludGVycnVwdHMgYXJlIGFjdGl2ZSBhdCB0aGUgbW9tZW50LiAqLworCQkJCQkJLyogU2FtZSBiaXQgbGF5b3V0IGFzIEVYVEVOREVEX0lOVF9NQVNLICovCisjZGVmaW5lIENPVU5URVI3NyAgICAgICAgICAgICAgIDB4NzcJCS8qIENvdW50ZXIgcmFuZ2UgMCB0byAweDNmZmZmZiwgMTkyMDAwIGNvdW50cyBwZXIgc2Vjb25kLiAqLworI2RlZmluZSBDT1VOVEVSNzggICAgICAgICAgICAgICAweDc4CQkvKiBDb3VudGVyIHJhbmdlIDAgdG8gMHgzZmZmZmYsIDQ0MTAwIGNvdW50cyBwZXIgc2Vjb25kLiAqLworI2RlZmluZSBFWFRFTkRFRF9JTlRfVElNRVIgICAgICAweDc5ICAgICAgICAgICAgLyogQ2hhbm5lbF9pZCAwIG9ubHkuIFVzZWQgYnkgYm90aCBwbGF5YmFjayBhbmQgY2FwdHVyZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJCQkJLyogQ2F1c2VzIGludGVycnVwdHMgYmFzZWQgb24gdGltZXIgaW50ZXJ2YWxzLiAqLworI2RlZmluZSBTUEkJCQkweDdhCQkvKiBTUEk6IFNlcmlhbCBJbnRlcmZhY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSTJDX0EJCQkweDdiCQkvKiBJMkMgQWRkcmVzcy4gMzIgYml0ICovCisjZGVmaW5lIEkyQ18wCQkJMHg3YwkJLyogSTJDIERhdGEgUG9ydCAwLiAzMiBiaXQgKi8KKyNkZWZpbmUgSTJDXzEJCQkweDdkCQkvKiBJMkMgRGF0YSBQb3J0IDEuIDMyIGJpdCAqLworCisKKyNkZWZpbmUgU0VUX0NIQU5ORUwgMCAgLyogVGVzdGluZyBjaGFubmVsIG91dHB1dHMgMD1Gcm9udCwgMT1DZW50ZXIvTEZFLCAyPVVua25vd24sIDM9UmVhciAqLworI2RlZmluZSBQQ01fRlJPTlRfQ0hBTk5FTCAwCisjZGVmaW5lIFBDTV9SRUFSX0NIQU5ORUwgMQorI2RlZmluZSBQQ01fQ0VOVEVSX0xGRV9DSEFOTkVMIDIKKyNkZWZpbmUgUENNX1VOS05PV05fQ0hBTk5FTCAzCisjZGVmaW5lIENPTlRST0xfRlJPTlRfQ0hBTk5FTCAwCisjZGVmaW5lIENPTlRST0xfUkVBUl9DSEFOTkVMIDMKKyNkZWZpbmUgQ09OVFJPTF9DRU5URVJfTEZFX0NIQU5ORUwgMQorI2RlZmluZSBDT05UUk9MX1VOS05PV05fQ0hBTk5FTCAyCisKK3R5cGVkZWYgc3RydWN0IHNuZF9jYTAxMDZfY2hhbm5lbCBjYTAxMDZfY2hhbm5lbF90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX2NhMDEwNiBjYTAxMDZfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9jYTAxMDZfcGNtIGNhMDEwNl9wY21fdDsKKworc3RydWN0IHNuZF9jYTAxMDZfY2hhbm5lbCB7CisJY2EwMTA2X3QgKmVtdTsKKwlpbnQgbnVtYmVyOworCWludCB1c2U7CisJdm9pZCAoKmludGVycnVwdCkoY2EwMTA2X3QgKmVtdSwgY2EwMTA2X2NoYW5uZWxfdCAqY2hhbm5lbCk7CisJY2EwMTA2X3BjbV90ICplcGNtOworfTsKKworc3RydWN0IHNuZF9jYTAxMDZfcGNtIHsKKwljYTAxMDZfdCAqZW11OworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKyAgICAgICAgaW50IGNoYW5uZWxfaWQ7CisJdW5zaWduZWQgc2hvcnQgcnVubmluZzsKK307CisKKy8vIGRlZmluaXRpb24gb2YgdGhlIGNoaXAtc3BlY2lmaWMgcmVjb3JkCitzdHJ1Y3Qgc25kX2NhMDEwNiB7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCisJdW5zaWduZWQgbG9uZyBwb3J0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzX3BvcnQ7CisJaW50IGlycTsKKworCXVuc2lnbmVkIGludCByZXZpc2lvbjsJCS8qIGNoaXAgcmV2aXNpb24gKi8KKwl1bnNpZ25lZCBpbnQgc2VyaWFsOyAgICAgICAgICAgIC8qIHNlcmlhbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlbDsJCS8qIHN1YnN5c3RlbSBpZCAqLworCisJc3BpbmxvY2tfdCBlbXVfbG9jazsKKworCWFjOTdfdCAqYWM5NzsKKwlzbmRfcGNtX3QgKnBjbTsKKworCWNhMDEwNl9jaGFubmVsX3QgcGxheWJhY2tfY2hhbm5lbHNbNF07CisJY2EwMTA2X2NoYW5uZWxfdCBjYXB0dXJlX2NoYW5uZWxzWzRdOworCXUzMiBzcGRpZl9iaXRzWzRdOyAgICAgICAgICAgICAvKiBzL3BkaWYgb3V0IHNldHVwICovCisJaW50IHNwZGlmX2VuYWJsZTsKKwlpbnQgY2FwdHVyZV9zb3VyY2U7CisKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgYnVmZmVyOworfTsKKworaW50IF9fZGV2aW5pdCBzbmRfY2EwMTA2X21peGVyKGNhMDEwNl90ICplbXUpOworaW50IF9fZGV2aW5pdCBzbmRfY2EwMTA2X3Byb2NfaW5pdChjYTAxMDZfdCAqIGVtdSk7CisKK3Vuc2lnbmVkIGludCBzbmRfY2EwMTA2X3B0cl9yZWFkKGNhMDEwNl90ICogZW11LCAKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVnLCAKKwkJCQkJICB1bnNpZ25lZCBpbnQgY2huKTsKKwordm9pZCBzbmRfY2EwMTA2X3B0cl93cml0ZShjYTAxMDZfdCAqZW11LCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgcmVnLCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgY2huLCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YSk7CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCkBAIC0wLDAgKzEsMTI4MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICBEcml2ZXIgQ0EwMTA2IGNoaXBzLiBlLmcuIFNvdW5kIEJsYXN0ZXIgQXVkaWd5IExTIGFuZCBMaXZlIDI0Yml0CisgKiAgVmVyc2lvbjogMC4wLjIyCisgKgorICogIEZFQVRVUkVTIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgKiAgICBGcm9udCwgUmVhciBhbmQgQ2VudGVyL0xGRS4KKyAqICAgIFN1cnJvdW5kNDAgYW5kIFN1cnJvdW5kNTEuCisgKiAgICBDYXB0dXJlIGZyb20gTUlDIGFuIExJTkUgSU4gaW5wdXQuCisgKiAgICBTUERJRiBkaWdpdGFsIHBsYXliYWNrIG9mIFBDTSBzdGVyZW8gYW5kIEFDMy9EVFMgd29ya3MuCisgKiAgICAoT25lIGNhbiB1c2UgYSBzdGFuZGFyZCBtb25vIG1pbmktamFjayB0byBvbmUgUkNBIHBsdWdzIGNhYmxlLgorICogICAgIG9yIG9uZSBjYW4gdXNlIGEgc3RhbmRhcmQgc3RlcmVvIG1pbmktamFjayB0byB0d28gUkNBIHBsdWdzIGNhYmxlLgorICogICAgIFBsdWcgb25lIG9mIHRoZSBSQ0EgcGx1Z3MgaW50byB0aGUgQ29heCBpbnB1dCBvZiB0aGUgZXh0ZXJuYWwgZGVjb2Rlci9yZWNlaXZlci4pCisgKiAgICAoIEluIHRoZW9yeSBvbmUgY291bGQgb3V0cHV0IDMgZGlmZmVyZW50IEFDMyBzdHJlYW1zIGF0IG9uY2UsIHRvIDMgZGlmZmVyZW50IFNQRElGIG91dHB1dHMuICkKKyAqICAgIE5vdGVzIG9uIGhvdyB0byBjYXB0dXJlIHNvdW5kOgorICogICAgICBUaGUgQUM5NyBpcyB1c2VkIGluIHRoZSBQTEFZQkFDSyBkaXJlY3Rpb24uCisgKiAgICAgIFRoZSBvdXRwdXQgZnJvbSB0aGUgQUM5NyBjaGlwLCBpbnN0ZWFkIG9mIHJlYWNoaW5nIHRoZSBzcGVha2VycywgaXMgZmVkIGludG8gdGhlIFBoaWxpcHMgMTM2MVQgQURDLgorICogICAgICBTbywgdG8gcmVjb3JkIGZyb20gdGhlIE1JQywgc2V0IHRoZSBNSUMgUGxheWJhY2sgdm9sdW1lIHRvIG1heCwKKyAqICAgICAgdW5tdXRlIHRoZSBNSUMgYW5kIHR1cm4gdXAgdGhlIE1BU1RFUiBQbGF5YmFjayB2b2x1bWUuCisgKiAgICAgIFNvLCB0byBwcmV2ZW50IGZlZWRiYWNrIHdoZW4gY2FwdHVyaW5nLCBtaW5pbWlzZSB0aGUgIkNhcHR1cmUgZmVlZGJhY2sgaW50byBQbGF5YmFjayIgdm9sdW1lLgorICogICAKKyAqICAgIFRoZSBvbmx5IHBsYXliYWNrIGNvbnRyb2xzIHRoYXQgY3VycmVudGx5IGRvIGFueXRoaW5nIGFyZTogLQorICogICAgQW5hbG9nIEZyb250CisgKiAgICBBbmFsb2cgUmVhcgorICogICAgQW5hbG9nIENlbnRlci9MRkUKKyAqICAgIFNQRElGIEZyb250CisgKiAgICBTUERJRiBSZWFyCisgKiAgICBTUERJRiBDZW50ZXIvTEZFCisgKiAgIAorICogICAgRm9yIGNhcHR1cmUgZnJvbSBNaWMgaW4gb3IgTGluZSBpbi4KKyAqICAgIERpZ2l0YWwvQW5hbG9nICggc3dpdGNoIG11c3QgYmUgaW4gQW5hbG9nIG1vZGUgZm9yIENBUFRVUkUuICkKKyAqIAorICogICAgQ0FQVFVSRSBmZWVkYmFjayBpbnRvIFBMQVlCQUNLCisgKiAKKyAqICBDaGFuZ2Vsb2c6CisgKiAgICBTdXBwb3J0IGludGVycnVwdHMgcGVyIHBlcmlvZC4KKyAqICAgIFJlbW92ZWQgbm9pc2UgZnJvbSBDZW50ZXIvTEZFIGNoYW5uZWwgd2hlbiBpbiBBbmFsb2cgbW9kZS4KKyAqICAgIFJlbmFtZSBhbmQgcmVtb3ZlIG1peGVyIGNvbnRyb2xzLgorICogIDAuMC42CisgKiAgICBVc2Ugc2VwYXJhdGUgY2FyZCBiYXNlZCBETUEgYnVmZmVyIGZvciBwZXJpb2RzIHRhYmxlIGxpc3QuCisgKiAgMC4wLjcKKyAqICAgIENoYW5nZSByZW1vdmUgYW5kIHJlbmFtZSBjdHJscyBpbnRvIGxpc3RzLgorICogIDAuMC44CisgKiAgICBUcnkgdG8gZml4IGNhcHR1cmUgc291cmNlcy4KKyAqICAwLjAuOQorICogICAgRml4IEFDMyBvdXRwdXQuCisgKiAgICBFbmFibGUgUzMyX0xFIGZvcm1hdCBzdXBwb3J0LgorICogIDAuMC4xMAorICogICAgRW5hYmxlIHBsYXliYWNrIDQ4MDAwIGFuZCA5NjAwMCByYXRlcy4gKFJhdGVzIG90aGVyIHRoYXQgdGhlc2UgZG8gbm90IHdvcmssIGV2ZW4gd2l0aCAicGx1Zzpmcm9udCIuKQorICogIDAuMC4xMQorICogICAgQWRkIE1vZGVsIG5hbWUgcmVjb2duaXRpb24uCisgKiAgMC4wLjEyCisgKiAgICBDb3JyZWN0IGludGVycnVwdCB0aW1pbmcuIGludGVycnVwdCBhdCBlbmQgb2YgcGVyaW9kLCBpbnN0ZWFkIG9mIGluIHRoZSBtaWRkbGUgb2YgYSBwbGF5YmFjayBwZXJpb2QuCisgKiAgICBSZW1vdmUgcmVkdW5kZW50ICJ2b2ljZSIgaGFuZGxpbmcuCisgKiAgMC4wLjEzCisgKiAgICBTaW5nbGUgdHJpZ2dlciBjYWxsIGZvciBtdWx0aSBjaGFubmVscy4KKyAqICAwLjAuMTQKKyAqICAgIFNldCBsaW1pdHMgYmFzZWQgb24gd2hhdCB0aGUgc291bmQgY2FyZCBoYXJkd2FyZSBjYW4gZG8uCisgKiAgICBwbGF5YmFjayBwZXJpb2RzX21pbj0yLCBwZXJpb2RzX21heD04CisgKiAgICBjYXB0dXJlIGh3IGNvbnN0cmFpbnRzIHJlcXVpcmUgcGVyaW9kX3NpemUgPSBuICogNjQgYnl0ZXMuCisgKiAgICBwbGF5YmFjayBodyBjb25zdHJhaW50cyByZXF1aXJlIHBlcmlvZF9zaXplID0gbiAqIDY0IGJ5dGVzLgorICogIDAuMC4xNQorICogICAgTWlub3IgdXBkYXRlcy4KKyAqICAwLjAuMTYKKyAqICAgIEltcGxlbWVudCAxOTIwMDAgc2FtcGxlIHJhdGUuCisgKiAgMC4wLjE3CisgKiAgICBBZGQgc3VwcG9ydCBmb3IgU0IwNDEwIGFuZCBTQjA0MTMuCisgKiAgMC4wLjE4CisgKiAgICBNb2RpZmllZCBDb3B5cmlnaHQgbWVzc2FnZS4KKyAqICAwLjAuMTkKKyAqICAgIEZpbmFsbHkgZml4IHN1cHBvcnQgZm9yIFNCIExpdmUgMjQgYml0LiBTQjA0MTAgYW5kIFNCMDQxMy4KKyAqICAgIFRoZSBvdXRwdXQgY29kZWMgbmVlZHMgcmVzZXR0aW5nLCBvdGhlcndpc2UgYWxsIG91dHB1dCBpcyBtdXRlZC4KKyAqICAwLjAuMjAKKyAqICAgIE1lcmdlICJwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsiIGZpeGVzLgorICogIDAuMC4yMQorICogICAgQWRkIDQgY2FwdHVyZSBjaGFubmVscy4gKFNQRElGIG9ubHkgY29tZXMgaW4gb24gY2hhbm5lbCAwLiApCisgKiAgICBBZGQgU1BESUYgY2FwdHVyZSB1c2luZyBvcHRpb25hbCBkaWdpdGFsIEkvTyBtb2R1bGUgZm9yIFNCIExpdmUgMjRiaXQuIChBbmFsb2cgY2FwdHVyZSBkb2VzIG5vdCB5ZXQgd29yay4pCisgKiAgMC4wLjIyCisgKiAgICBBZGQgc3VwcG9ydCBmb3IgTVNJIEs4TiBEaWFtb25kIE1vdGhlcmJvYXJkIHdpdGggb25ib2FyZCBTQiBMaXZlIDI0Yml0IHdpdGhvdXQgQUM5Ny4gRnJvbSBraWtzZW4sIGJ1ZyAjOTAxCisgKgorICogIEJVR1M6CisgKiAgICBTb21lIHN0YWJpbGl0eSBwcm9ibGVtcyB3aGVuIHVubG9hZGluZyB0aGUgc25kLWNhMDEwNiBrZXJuZWwgbW9kdWxlLgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIDQgQ2FwdHVyZSBjaGFubmVscywgb25seSBvbmUgaW1wbGVtZW50ZWQgc28gZmFyLgorICogICAgT3RoZXIgY2FwdHVyZSByYXRlcyBhcGFydCBmcm9tIDQ4a2h6IG5vdCBpbXBsZW1lbnRlZC4KKyAqICAgIE1JREkKKyAqICAgIC0tCisgKiAgR0VORVJBTCBJTkZPOgorICogICAgTW9kZWw6IFNCMDMxMAorICogICAgUDE3IENoaXA6IENBMDEwNi1EQVQKKyAqICAgIEFDOTcgQ29kZWM6IFNUQUMgOTcyMQorICogICAgQURDOiBQaGlsaXBzIDEzNjFUIChTdGVyZW8gMjRiaXQpCisgKiAgICBEQUM6IFdNODc0NkVEUyAoNi1jaGFubmVsLCAyNGJpdCwgMTkyS2h6KQorICoKKyAqICBHRU5FUkFMIElORk86CisgKiAgICBNb2RlbDogU0IwNDEwCisgKiAgICBQMTcgQ2hpcDogQ0EwMTA2LURBVAorICogICAgQUM5NyBDb2RlYzogTm9uZQorICogICAgQURDOiBXTTg3NzVFRFMgKDQgQ2hhbm5lbCkKKyAqICAgIERBQzogQ1M0MzgyICgxMTQgZEIsIDI0LUJpdCwgMTkyIGtIeiwgOC1DaGFubmVsIEQvQSBDb252ZXJ0ZXIgd2l0aCBEU0QgU3VwcG9ydCkKKyAqICAgIFNQRElGIE91dCBjb250cm9sIHN3aXRjaGVzIGJldHdlZW4gTWljIGluIGFuZCBTUERJRiBvdXQuCisgKiAgICBObyBzb3VuZCBvdXQgb3IgbWljIGlucHV0IHdvcmtpbmcgeWV0LgorICogCisgKiAgR0VORVJBTCBJTkZPOgorICogICAgTW9kZWw6IFNCMDQxMworICogICAgUDE3IENoaXA6IENBMDEwNi1EQVQKKyAqICAgIEFDOTcgQ29kZWM6IE5vbmUuCisgKiAgICBBREM6IFVua25vd24KKyAqICAgIERBQzogVW5rbm93bgorICogICAgVHJ5aW5nIHRvIGhhbmRsZSBpdCBsaWtlIHRoZSBTQjA0MTAuCisgKgorICogIFRoaXMgY29kZSB3YXMgaW5pdGFsbHkgYmFzZWQgb24gY29kZSBmcm9tIEFMU0EncyBlbXUxMGsxeC5jIHdoaWNoIGlzOgorICogIENvcHlyaWdodCAoYykgYnkgRnJhbmNpc2NvIE1vcmFlcyA8Zm1vcmFlc0BuYy5yci5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ0EwMTA2Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDcmVhdGl2ZSxTQiBDQTAxMDYgY2hpcH19Iik7CisKKy8vIG1vZHVsZSBwYXJhbWV0ZXJzIChzZWUgIk1vZHVsZSBQYXJhbWV0ZXJzIikKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgdGhlIENBMDEwNiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIHRoZSBDQTAxMDYgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSB0aGUgQ0EwMTA2IHNvdW5kY2FyZC4iKTsKKworI2luY2x1ZGUgImNhMDEwNi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHNlcmlhbDsKKwljaGFyICogbmFtZTsKK30gY2EwMTA2X25hbWVzX3Q7CisKK3N0YXRpYyBjYTAxMDZfbmFtZXNfdCBjYTAxMDZfY2hpcF9uYW1lc1tdID0geworCSB7IDB4MTAwMjExMDIsICJBdWRpZ3lMUyBbU0IwMzEwXSJ9ICwgCisJIHsgMHgxMDA1MTEwMiwgIkF1ZGlneUxTIFtTQjAzMTBiXSJ9ICwgLyogVW5rbm93biBBdWRpZ3lMUyB0aGF0IGFsc28gc2F5cyBTQjAzMTAgb24gaXQgKi8KKwkgeyAweDEwMDYxMTAyLCAiTGl2ZSEgNy4xIDI0Yml0IFtTQjA0MTBdIn0gLCAvKiBOZXcgU291bmQgQmxhc3RlciBMaXZlISA3LjEgMjRiaXQuIFRoaXMgZG9lcyBub3QgaGF2ZSBhbiBBQzk3LiA1M1NCMDQxMDAwMDAxICovCisJIHsgMHgxMDA3MTEwMiwgIkxpdmUhIDcuMSAyNGJpdCBbU0IwNDEzXSJ9ICwgLyogTmV3IERlbGwgU291bmQgQmxhc3RlciBMaXZlISA3LjEgMjRiaXQuIFRoaXMgZG9lcyBub3QgaGF2ZSBhbiBBQzk3LiAgKi8KKwkgeyAweDEwMDkxNDYyLCAiTVNJIEs4TiBEaWFtb25kIE1CIFtTQjA0MzhdIn0sIC8qIE1TSSBLOE4gRGlhbW9uZCBNb3RoZXJib2FyZCB3aXRoIG9uYm9hcmQgU0IgTGl2ZSAyNGJpdCB3aXRob3V0IEFDOTcgKi8KKwkgeyAwLCAiQXVkaWd5TFMgW1Vua25vd25dIiB9Cit9OworCisvKiBoYXJkd2FyZSBkZWZpbml0aW9uICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jYTAxMDZfcGxheWJhY2tfaHcgPSB7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgCisJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKKwkucmF0ZV9tYXggPQkJMTkyMDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwgIC8vMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsICAvLzYsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoKDY1NTM2IC0gNjQpICogOCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg2NTUzNiAtIDY0KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJOCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jYTAxMDZfY2FwdHVyZV9odyA9IHsKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCAKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoKDY1NTM2IC0gNjQpICogOCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg2NTUzNiAtIDY0KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAsCit9OworCit1bnNpZ25lZCBpbnQgc25kX2NhMDEwNl9wdHJfcmVhZChjYTAxMDZfdCAqIGVtdSwgCisJCQkJCSAgdW5zaWduZWQgaW50IHJlZywgCisJCQkJCSAgdW5zaWduZWQgaW50IGNobikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZWdwdHIsIHZhbDsKKyAgCisJcmVncHRyID0gKHJlZyA8PCAxNikgfCBjaG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBQVFIpOworCXZhbCA9IGlubChlbXUtPnBvcnQgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBzbmRfY2EwMTA2X3B0cl93cml0ZShjYTAxMDZfdCAqZW11LCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgcmVnLCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgY2huLCAKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVncHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWdwdHIgPSAocmVnIDw8IDE2KSB8IGNobjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJb3V0bChyZWdwdHIsIGVtdS0+cG9ydCArIFBUUik7CisJb3V0bChkYXRhLCBlbXUtPnBvcnQgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jYTAxMDZfaW50cl9lbmFibGUoY2EwMTA2X3QgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOworICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCWVuYWJsZSA9IGlubChlbXUtPnBvcnQgKyBJTlRFKSB8IGludHJlbmI7CisJb3V0bChlbmFibGUsIGVtdS0+cG9ydCArIElOVEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2NhMDEwNl9wY21fZnJlZV9zdWJzdHJlYW0oc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUpCit7CisJY2EwMTA2X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworICAKKwlpZiAoZXBjbSkgeworCQlrZnJlZShlcGNtKTsKKwl9Cit9CisKKy8qIG9wZW5fcGxheWJhY2sgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja19jaGFubmVsKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNoYW5uZWxfaWQpCit7CisJY2EwMTA2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisgICAgICAgIGNhMDEwNl9jaGFubmVsX3QgKmNoYW5uZWwgPSAmKGNoaXAtPnBsYXliYWNrX2NoYW5uZWxzW2NoYW5uZWxfaWRdKTsKKwljYTAxMDZfcGNtX3QgKmVwY207CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWVwY20gPSBrY2FsbG9jKDEsIHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOworCisJaWYgKGVwY20gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXBjbS0+ZW11ID0gY2hpcDsKKwllcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisgICAgICAgIGVwY20tPmNoYW5uZWxfaWQ9Y2hhbm5lbF9pZDsKKyAgCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2EwMTA2X3BjbV9mcmVlX3N1YnN0cmVhbTsKKyAgCisJcnVudGltZS0+aHcgPSBzbmRfY2EwMTA2X3BsYXliYWNrX2h3OworCisgICAgICAgIGNoYW5uZWwtPmVtdSA9IGNoaXA7CisgICAgICAgIGNoYW5uZWwtPm51bWJlciA9IGNoYW5uZWxfaWQ7CisKKyAgICAgICAgY2hhbm5lbC0+dXNlPTE7CisgICAgICAgIC8vcHJpbnRrKCJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CisgICAgICAgIC8vY2hhbm5lbC0+aW50ZXJydXB0ID0gc25kX2NhMDEwNl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7CisgICAgICAgIGNoYW5uZWwtPmVwY209ZXBjbTsKKwlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCA2NCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKiBjbG9zZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjayhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY2EwMTA2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisgICAgICAgIGNhMDEwNl9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKyAgICAgICAgY2hpcC0+cGxheWJhY2tfY2hhbm5lbHNbZXBjbS0+Y2hhbm5lbF9pZF0udXNlPTA7CisvKiBGSVhNRTogbWF5YmUgemVybyBvdGhlcnMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250KHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja19jaGFubmVsKHN1YnN0cmVhbSwgUENNX0ZST05UX0NIQU5ORUwpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2VudGVyX2xmZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2hhbm5lbChzdWJzdHJlYW0sIFBDTV9DRU5URVJfTEZFX0NIQU5ORUwpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfdW5rbm93bihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2hhbm5lbChzdWJzdHJlYW0sIFBDTV9VTktOT1dOX0NIQU5ORUwpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfcmVhcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2hhbm5lbChzdWJzdHJlYW0sIFBDTV9SRUFSX0NIQU5ORUwpOworfQorCisvKiBvcGVuX2NhcHR1cmUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21fb3Blbl9jYXB0dXJlX2NoYW5uZWwoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY2hhbm5lbF9pZCkKK3sKKwljYTAxMDZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKyAgICAgICAgY2EwMTA2X2NoYW5uZWxfdCAqY2hhbm5lbCA9ICYoY2hpcC0+Y2FwdHVyZV9jaGFubmVsc1tjaGFubmVsX2lkXSk7CisJY2EwMTA2X3BjbV90ICplcGNtOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwllcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXBjbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc25kX3ByaW50aygib3Blbl9jYXB0dXJlX2NoYW5uZWw6IGZhaWxlZCBlcGNtIGFsbG9jXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKwllcGNtLT5lbXUgPSBjaGlwOworCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKyAgICAgICAgZXBjbS0+Y2hhbm5lbF9pZD1jaGFubmVsX2lkOworICAKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOworCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF9jYTAxMDZfcGNtX2ZyZWVfc3Vic3RyZWFtOworICAKKwlydW50aW1lLT5odyA9IHNuZF9jYTAxMDZfY2FwdHVyZV9odzsKKworICAgICAgICBjaGFubmVsLT5lbXUgPSBjaGlwOworICAgICAgICBjaGFubmVsLT5udW1iZXIgPSBjaGFubmVsX2lkOworCisgICAgICAgIGNoYW5uZWwtPnVzZT0xOworICAgICAgICAvL3ByaW50aygib3BlbjpjaGFubmVsX2lkPSVkLCBjaGlwPSVwLCBjaGFubmVsPSVwXG4iLGNoYW5uZWxfaWQsIGNoaXAsIGNoYW5uZWwpOworICAgICAgICAvL2NoYW5uZWwtPmludGVycnVwdCA9IHNuZF9jYTAxMDZfcGNtX2NoYW5uZWxfaW50ZXJydXB0OworICAgICAgICBjaGFubmVsLT5lcGNtPWVwY207CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCS8vc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLCAmaHdfY29uc3RyYWludHNfY2FwdHVyZV9wZXJpb2Rfc2l6ZXMpOworCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgNjQpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworLyogY2xvc2UgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21fY2xvc2VfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY2EwMTA2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisgICAgICAgIGNhMDEwNl9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKyAgICAgICAgY2hpcC0+Y2FwdHVyZV9jaGFubmVsc1tlcGNtLT5jaGFubmVsX2lkXS51c2U9MDsKKy8qIEZJWE1FOiBtYXliZSB6ZXJvIG90aGVycyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX29wZW5fMF9jYXB0dXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX2NhMDEwNl9wY21fb3Blbl9jYXB0dXJlX2NoYW5uZWwoc3Vic3RyZWFtLCAwKTsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV9vcGVuXzFfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9jYTAxMDZfcGNtX29wZW5fY2FwdHVyZV9jaGFubmVsKHN1YnN0cmVhbSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21fb3Blbl8yX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfY2EwMTA2X3BjbV9vcGVuX2NhcHR1cmVfY2hhbm5lbChzdWJzdHJlYW0sIDIpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX29wZW5fM19jYXB0dXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX2NhMDEwNl9wY21fb3Blbl9jYXB0dXJlX2NoYW5uZWwoc3Vic3RyZWFtLCAzKTsKK30KKworLyogaHdfcGFyYW1zIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX2h3X3BhcmFtc19wbGF5YmFjayhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgICAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworLyogaHdfZnJlZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV9od19mcmVlX3BsYXliYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCisvKiBod19wYXJhbXMgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKKy8qIGh3X2ZyZWUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9wY21faHdfZnJlZV9jYXB0dXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCisvKiBwcmVwYXJlIHBsYXliYWNrIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfcGxheWJhY2soc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWNhMDEwNl90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJY2EwMTA2X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBjaGFubmVsID0gZXBjbS0+Y2hhbm5lbF9pZDsKKwl1MzIgKnRhYmxlX2Jhc2UgPSAodTMyICopKGVtdS0+YnVmZmVyLmFyZWErKDgqMTYqY2hhbm5lbCkpOworCXUzMiBwZXJpb2Rfc2l6ZV9ieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJdTMyIGhjZmdfbWFzayA9IEhDRkdfUExBWUJBQ0tfUzMyX0xFOworCXUzMiBoY2ZnX3NldCA9IDB4MDAwMDAwMDA7CisJdTMyIGhjZmc7CisJdTMyIHJlZzQwX21hc2sgPSAweDMwMDAwIDw8IChjaGFubmVsPDwxKTsKKwl1MzIgcmVnNDBfc2V0ID0gMDsKKwl1MzIgcmVnNDA7CisJLyogRklYTUU6IERlcGVuZGluZyBvbiBtaXhlciBzZWxlY3Rpb24gb2YgU1BESUYgb3V0IG9yIG5vdCwgc2VsZWN0IHRoZSBzcGRpZiByYXRlIG9yIHRoZSBEQUMgcmF0ZS4gKi8KKwl1MzIgcmVnNzFfbWFzayA9IDB4MDMwMzAwMDAgOyAvKiBHbG9iYWwuIFNldCBTUERJRiByYXRlLiBXZSBvbmx5IHN1cHBvcnQgNDQxMDAgdG8gc3BkaWYsIG5vdCB0byBEQUMuICovCisJdTMyIHJlZzcxX3NldCA9IDA7CisJdTMyIHJlZzcxOworCWludCBpOworCQorICAgICAgICAvL3NuZF9wcmludGsoInByZXBhcmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsIGZvcm1hdD0weCV4LCBjaGFubmVscz0lZCwgYnVmZmVyX3NpemU9JWxkLCBwZXJpb2Rfc2l6ZT0lbGQsIHBlcmlvZHM9JXUsIGZyYW1lc190b19ieXRlcz0lZFxuIixjaGFubmVsLCBydW50aW1lLT5yYXRlLCBydW50aW1lLT5mb3JtYXQsIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5idWZmZXJfc2l6ZSwgcnVudGltZS0+cGVyaW9kX3NpemUsIHJ1bnRpbWUtPnBlcmlvZHMsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCAxKSk7CisgICAgICAgIC8vc25kX3ByaW50aygiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLHJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYXJlYSwgdGFibGVfYmFzZSk7CisJLy9zbmRfcHJpbnRrKCJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIixlbXUtPmJ1ZmZlci5hZGRyLCBlbXUtPmJ1ZmZlci5hcmVhLCBlbXUtPmJ1ZmZlci5ieXRlcyk7CisJLyogUmF0ZSBjYW4gYmUgc2V0IHBlciBjaGFubmVsLiAqLworCS8qIHJlZzQwIGNvbnRyb2wgaG9zdCB0byBmaWZvICovCisJLyogcmVnNzEgY29udHJvbHMgREFDIHJhdGUuICovCisJc3dpdGNoIChydW50aW1lLT5yYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJcmVnNDBfc2V0ID0gMHgxMDAwMCA8PCAoY2hhbm5lbDw8MSk7CisJCXJlZzcxX3NldCA9IDB4MDEwMTAwMDA7IAorCQlicmVhazsKKyAgICAgICAgY2FzZSA0ODAwMDoKKwkJcmVnNDBfc2V0ID0gMDsKKwkJcmVnNzFfc2V0ID0gMDsgCisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXJlZzQwX3NldCA9IDB4MjAwMDAgPDwgKGNoYW5uZWw8PDEpOworCQlyZWc3MV9zZXQgPSAweDAyMDIwMDAwOyAKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJCXJlZzQwX3NldCA9IDB4MzAwMDAgPDwgKGNoYW5uZWw8PDEpOworCQlyZWc3MV9zZXQgPSAweDAzMDMwMDAwOyAKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVnNDBfc2V0ID0gMDsKKwkJcmVnNzFfc2V0ID0gMDsgCisJCWJyZWFrOworCX0KKwkvKiBGb3JtYXQgaXMgYSBnbG9iYWwgc2V0dGluZyAqLworCS8qIEZJWE1FOiBPbmx5IGxldCB0aGUgZmlyc3QgY2hhbm5lbCBhY2Nlc3NlZCBzZXQgdGhpcy4gKi8KKwlzd2l0Y2ggKHJ1bnRpbWUtPmZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWhjZmdfc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJaGNmZ19zZXQgPSBIQ0ZHX1BMQVlCQUNLX1MzMl9MRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGNmZ19zZXQgPSAwOworCQlicmVhazsKKwl9CisJaGNmZyA9IGlubChlbXUtPnBvcnQgKyBIQ0ZHKSA7CisJaGNmZyA9IChoY2ZnICYgfmhjZmdfbWFzaykgfCBoY2ZnX3NldDsKKwlvdXRsKGhjZmcsIGVtdS0+cG9ydCArIEhDRkcpOworCXJlZzQwID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIDB4NDAsIDApOworCXJlZzQwID0gKHJlZzQwICYgfnJlZzQwX21hc2spIHwgcmVnNDBfc2V0OworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgMHg0MCwgMCwgcmVnNDApOworCXJlZzcxID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIDB4NzEsIDApOworCXJlZzcxID0gKHJlZzcxICYgfnJlZzcxX21hc2spIHwgcmVnNzFfc2V0OworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgMHg3MSwgMCwgcmVnNzEpOworCisJLyogRklYTUU6IENoZWNrIGVtdS0+YnVmZmVyLnNpemUgYmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdG8gaXQuICovCisgICAgICAgIGZvcihpPTA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKKwkJdGFibGVfYmFzZVtpKjJdPXJ1bnRpbWUtPmRtYV9hZGRyKyhpKnBlcmlvZF9zaXplX2J5dGVzKTsKKwkJdGFibGVfYmFzZVsoaSoyKSsxXT1wZXJpb2Rfc2l6ZV9ieXRlczw8MTY7CisJfQorIAorCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfTElTVF9BRERSLCBjaGFubmVsLCBlbXUtPmJ1ZmZlci5hZGRyKyg4KjE2KmNoYW5uZWwpKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX0xJU1RfU0laRSwgY2hhbm5lbCwgKHJ1bnRpbWUtPnBlcmlvZHMgLSAxKSA8PCAxOSk7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBQTEFZQkFDS19MSVNUX1BUUiwgY2hhbm5lbCwgMCk7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBQTEFZQkFDS19ETUFfQUREUiwgY2hhbm5lbCwgcnVudGltZS0+ZG1hX2FkZHIpOworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfUEVSSU9EX1NJWkUsIGNoYW5uZWwsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk8PDE2KTsgLy8gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKwkvKiBGSVhNRSAgdGVzdCB3aGF0IDAgYnl0ZXMgZG9lcy4gKi8KKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX1BFUklPRF9TSVpFLCBjaGFubmVsLCAwKTsgLy8gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX1BPSU5URVIsIGNoYW5uZWwsIDApOworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgMHgwNywgY2hhbm5lbCwgMHgwKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIDB4MDgsIGNoYW5uZWwsIDApOworICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX01VVEUsIDB4MCwgMHgwKTsgLyogVW5tdXRlIG91dHB1dCAqLworI2lmIDAKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIFNQQ1MwLCAwLAorCQkJICAgICAgIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCSAgICAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8CisJCQkgICAgICAgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8CisJCQkgICAgICAgMHgwMDAwMDAwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUICk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyogcHJlcGFyZSBjYXB0dXJlIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY2EwMTA2X3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljYTAxMDZfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGNoYW5uZWwgPSBlcGNtLT5jaGFubmVsX2lkOworICAgICAgICAvL3ByaW50aygicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgZm9ybWF0PTB4JXgsIGNoYW5uZWxzPSVkLCBidWZmZXJfc2l6ZT0lbGQsIHBlcmlvZF9zaXplPSVsZCwgZnJhbWVzX3RvX2J5dGVzPSVkXG4iLGNoYW5uZWwsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSwgIGZyYW1lc190b19ieXRlcyhydW50aW1lLCAxKSk7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCAweDEzLCBjaGFubmVsLCAwKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIENBUFRVUkVfRE1BX0FERFIsIGNoYW5uZWwsIHJ1bnRpbWUtPmRtYV9hZGRyKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIENBUFRVUkVfQlVGRkVSX1NJWkUsIGNoYW5uZWwsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5idWZmZXJfc2l6ZSk8PDE2KTsgLy8gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIENBUFRVUkVfUE9JTlRFUiwgY2hhbm5lbCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJpZ2dlcl9wbGF5YmFjayBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX3BsYXliYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICAgaW50IGNtZCkKK3sKKwljYTAxMDZfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lOworCWNhMDEwNl9wY21fdCAqZXBjbTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnM7CisJdTMyIGJhc2ljID0gMDsKKwl1MzIgZXh0ZW5kZWQgPSAwOworCWludCBydW5uaW5nPTA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXJ1bm5pbmc9MTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWRlZmF1bHQ6CisJCXJ1bm5pbmc9MDsKKwkJYnJlYWs7CisJfQorICAgICAgICBzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CisgICAgICAgICAgICAgICAgcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCXJ1bnRpbWUgPSBzLT5ydW50aW1lOworCQllcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCQljaGFubmVsID0gZXBjbS0+Y2hhbm5lbF9pZDsKKwkJLy9zbmRfcHJpbnRrKCJjaGFubmVsPSVkXG4iLGNoYW5uZWwpOworCQllcGNtLT5ydW5uaW5nID0gcnVubmluZzsKKwkJYmFzaWMgfD0gKDB4MTw8Y2hhbm5lbCk7CisJCWV4dGVuZGVkIHw9ICgweDEwPDxjaGFubmVsKTsKKyAgICAgICAgICAgICAgICBzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOworICAgICAgICB9CisJLy9zbmRfcHJpbnRrKCJiYXNpYz0weCV4LCBleHRlbmRlZD0weCV4XG4iLGJhc2ljLCBleHRlbmRlZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgRVhURU5ERURfSU5UX01BU0ssIDAsIHNuZF9jYTAxMDZfcHRyX3JlYWQoZW11LCBFWFRFTkRFRF9JTlRfTUFTSywgMCkgfCAoZXh0ZW5kZWQpKTsKKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBCQVNJQ19JTlRFUlJVUFQsIDAsIHNuZF9jYTAxMDZfcHRyX3JlYWQoZW11LCBCQVNJQ19JTlRFUlJVUFQsIDApfChiYXNpYykpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgQkFTSUNfSU5URVJSVVBULCAwLCBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgQkFTSUNfSU5URVJSVVBULCAwKSAmIH4oYmFzaWMpKTsKKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBFWFRFTkRFRF9JTlRfTUFTSywgMCwgc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEVYVEVOREVEX0lOVF9NQVNLLCAwKSAmIH4oZXh0ZW5kZWQpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHRyaWdnZXJfY2FwdHVyZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICBpbnQgY21kKQoreworCWNhMDEwNl90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJY2EwMTA2X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBjaGFubmVsID0gZXBjbS0+Y2hhbm5lbF9pZDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBFWFRFTkRFRF9JTlRfTUFTSywgMCwgc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEVYVEVOREVEX0lOVF9NQVNLLCAwKSB8ICgweDExMDAwMDw8Y2hhbm5lbCkpOworCQlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIEJBU0lDX0lOVEVSUlVQVCwgMCwgc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEJBU0lDX0lOVEVSUlVQVCwgMCl8KDB4MTAwPDxjaGFubmVsKSk7CisJCWVwY20tPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgQkFTSUNfSU5URVJSVVBULCAwLCBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgQkFTSUNfSU5URVJSVVBULCAwKSAmIH4oMHgxMDA8PGNoYW5uZWwpKTsKKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBFWFRFTkRFRF9JTlRfTUFTSywgMCwgc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEVYVEVOREVEX0lOVF9NQVNLLCAwKSAmIH4oMHgxMTAwMDA8PGNoYW5uZWwpKTsKKwkJZXBjbS0+cnVubmluZyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBwb2ludGVyX3BsYXliYWNrIGNhbGxiYWNrICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9jYTAxMDZfcGNtX3BvaW50ZXJfcGxheWJhY2soc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWNhMDEwNl90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJY2EwMTA2X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9wY21fdWZyYW1lc190IHB0ciwgcHRyMSwgcHRyMixwdHIzLHB0cjQgPSAwOworCWludCBjaGFubmVsID0gZXBjbS0+Y2hhbm5lbF9pZDsKKworCWlmICghZXBjbS0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlwdHIzID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIFBMQVlCQUNLX0xJU1RfUFRSLCBjaGFubmVsKTsKKwlwdHIxID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIFBMQVlCQUNLX1BPSU5URVIsIGNoYW5uZWwpOworCXB0cjQgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgUExBWUJBQ0tfTElTVF9QVFIsIGNoYW5uZWwpOworCWlmIChwdHIzICE9IHB0cjQpIHB0cjEgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgUExBWUJBQ0tfUE9JTlRFUiwgY2hhbm5lbCk7CisJcHRyMiA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwdHIxKTsKKwlwdHIyKz0gKHB0cjQgPj4gMykgKiBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwlwdHI9cHRyMjsKKyAgICAgICAgaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCS8vcHJpbnRrKCJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXgsIGJpdHM9JWQsIHJhdGU9JWRcbiIsIHB0cjEsIHB0cjIsIHB0ciwgKGludClydW50aW1lLT5idWZmZXJfc2l6ZSwgKGludClydW50aW1lLT5wZXJpb2Rfc2l6ZSwgKGludClydW50aW1lLT5mcmFtZV9iaXRzLCAoaW50KXJ1bnRpbWUtPnJhdGUpOworCisJcmV0dXJuIHB0cjsKK30KKworLyogcG9pbnRlcl9jYXB0dXJlIGNhbGxiYWNrICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9jYTAxMDZfcGNtX3BvaW50ZXJfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY2EwMTA2X3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljYTAxMDZfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3BjbV91ZnJhbWVzX3QgcHRyLCBwdHIxLCBwdHIyID0gMDsKKwlpbnQgY2hhbm5lbCA9IGNoYW5uZWw9ZXBjbS0+Y2hhbm5lbF9pZDsKKworCWlmICghZXBjbS0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlwdHIxID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIENBUFRVUkVfUE9JTlRFUiwgY2hhbm5lbCk7CisJcHRyMiA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwdHIxKTsKKwlwdHI9cHRyMjsKKyAgICAgICAgaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCS8vcHJpbnRrKCJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXgsIGJpdHM9JWQsIHJhdGU9JWRcbiIsIHB0cjEsIHB0cjIsIHB0ciwgKGludClydW50aW1lLT5idWZmZXJfc2l6ZSwgKGludClydW50aW1lLT5wZXJpb2Rfc2l6ZSwgKGludClydW50aW1lLT5mcmFtZV9iaXRzLCAoaW50KXJ1bnRpbWUtPnJhdGUpOworCisJcmV0dXJuIHB0cjsKK30KKworLyogb3BlcmF0b3JzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY2EwMTA2X3BsYXliYWNrX2Zyb250X29wcyA9IHsKKwkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250LAorCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAorCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSAgIHNuZF9jYTAxMDZfcGNtX2h3X3BhcmFtc19wbGF5YmFjaywKKwkuaHdfZnJlZSA9ICAgICBzbmRfY2EwMTA2X3BjbV9od19mcmVlX3BsYXliYWNrLAorCS5wcmVwYXJlID0gICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfcGxheWJhY2ssCisJLnRyaWdnZXIgPSAgICAgc25kX2NhMDEwNl9wY21fdHJpZ2dlcl9wbGF5YmFjaywKKwkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX3BsYXliYWNrLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NhMDEwNl9jYXB0dXJlXzBfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMF9jYXB0dXJlLAorCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCisJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9ICAgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX2NhcHR1cmUsCisJLmh3X2ZyZWUgPSAgICAgc25kX2NhMDEwNl9wY21faHdfZnJlZV9jYXB0dXJlLAorCS5wcmVwYXJlID0gICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfY2FwdHVyZSwKKwkudHJpZ2dlciA9ICAgICBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX2NhcHR1cmUsCisJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NhMDEwNl9jYXB0dXJlXzFfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMV9jYXB0dXJlLAorCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCisJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9ICAgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX2NhcHR1cmUsCisJLmh3X2ZyZWUgPSAgICAgc25kX2NhMDEwNl9wY21faHdfZnJlZV9jYXB0dXJlLAorCS5wcmVwYXJlID0gICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfY2FwdHVyZSwKKwkudHJpZ2dlciA9ICAgICBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX2NhcHR1cmUsCisJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NhMDEwNl9jYXB0dXJlXzJfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMl9jYXB0dXJlLAorCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCisJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9ICAgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX2NhcHR1cmUsCisJLmh3X2ZyZWUgPSAgICAgc25kX2NhMDEwNl9wY21faHdfZnJlZV9jYXB0dXJlLAorCS5wcmVwYXJlID0gICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfY2FwdHVyZSwKKwkudHJpZ2dlciA9ICAgICBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX2NhcHR1cmUsCisJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NhMDEwNl9jYXB0dXJlXzNfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fM19jYXB0dXJlLAorCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCisJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9ICAgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX2NhcHR1cmUsCisJLmh3X2ZyZWUgPSAgICAgc25kX2NhMDEwNl9wY21faHdfZnJlZV9jYXB0dXJlLAorCS5wcmVwYXJlID0gICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfY2FwdHVyZSwKKwkudHJpZ2dlciA9ICAgICBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX2NhcHR1cmUsCisJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NhMDEwNl9wbGF5YmFja19jZW50ZXJfbGZlX29wcyA9IHsKKyAgICAgICAgLm9wZW4gPSAgICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2VudGVyX2xmZSwKKyAgICAgICAgLmNsb3NlID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAorICAgICAgICAuaW9jdGwgPSAgICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisgICAgICAgIC5od19wYXJhbXMgPSAgICBzbmRfY2EwMTA2X3BjbV9od19wYXJhbXNfcGxheWJhY2ssCisgICAgICAgIC5od19mcmVlID0gICAgICBzbmRfY2EwMTA2X3BjbV9od19mcmVlX3BsYXliYWNrLAorICAgICAgICAucHJlcGFyZSA9ICAgICAgc25kX2NhMDEwNl9wY21fcHJlcGFyZV9wbGF5YmFjaywgICAgIAorICAgICAgICAudHJpZ2dlciA9ICAgICAgc25kX2NhMDEwNl9wY21fdHJpZ2dlcl9wbGF5YmFjaywgIAorICAgICAgICAucG9pbnRlciA9ICAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9wbGF5YmFjaywgCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY2EwMTA2X3BsYXliYWNrX3Vua25vd25fb3BzID0geworICAgICAgICAub3BlbiA9ICAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja191bmtub3duLAorICAgICAgICAuY2xvc2UgPSAgICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfcGxheWJhY2ssCisgICAgICAgIC5pb2N0bCA9ICAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKKyAgICAgICAgLmh3X3BhcmFtcyA9ICAgIHNuZF9jYTAxMDZfcGNtX2h3X3BhcmFtc19wbGF5YmFjaywKKyAgICAgICAgLmh3X2ZyZWUgPSAgICAgIHNuZF9jYTAxMDZfcGNtX2h3X2ZyZWVfcGxheWJhY2ssCisgICAgICAgIC5wcmVwYXJlID0gICAgICBzbmRfY2EwMTA2X3BjbV9wcmVwYXJlX3BsYXliYWNrLCAgICAgCisgICAgICAgIC50cmlnZ2VyID0gICAgICBzbmRfY2EwMTA2X3BjbV90cmlnZ2VyX3BsYXliYWNrLCAgCisgICAgICAgIC5wb2ludGVyID0gICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX3BsYXliYWNrLCAKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jYTAxMDZfcGxheWJhY2tfcmVhcl9vcHMgPSB7CisgICAgICAgIC5vcGVuID0gICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX3JlYXIsCisgICAgICAgIC5jbG9zZSA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjaywKKyAgICAgICAgLmlvY3RsID0gICAgICAgIHNuZF9wY21fbGliX2lvY3RsLAorICAgICAgICAuaHdfcGFyYW1zID0gICAgc25kX2NhMDEwNl9wY21faHdfcGFyYW1zX3BsYXliYWNrLAorCQkuaHdfZnJlZSA9ICAgICAgc25kX2NhMDEwNl9wY21faHdfZnJlZV9wbGF5YmFjaywKKyAgICAgICAgLnByZXBhcmUgPSAgICAgIHNuZF9jYTAxMDZfcGNtX3ByZXBhcmVfcGxheWJhY2ssICAgICAKKyAgICAgICAgLnRyaWdnZXIgPSAgICAgIHNuZF9jYTAxMDZfcGNtX3RyaWdnZXJfcGxheWJhY2ssICAKKyAgICAgICAgLnBvaW50ZXIgPSAgICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfcGxheWJhY2ssIAorfTsKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2NhMDEwNl9hYzk3X3JlYWQoYWM5N190ICphYzk3LAorCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwljYTAxMDZfdCAqZW11ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgZW11LT5wb3J0ICsgQUM5N0FERFJFU1MpOworCXZhbCA9IGludyhlbXUtPnBvcnQgKyBBQzk3REFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jYTAxMDZfYWM5N193cml0ZShhYzk3X3QgKmFjOTcsCisJCQkJICAgIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWNhMDEwNl90ICplbXUgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgZW11LT5wb3J0ICsgQUM5N0FERFJFU1MpOworCW91dHcodmFsLCBlbXUtPnBvcnQgKyBBQzk3REFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfYWM5NyhjYTAxMDZfdCAqY2hpcCkKK3sKKwlhYzk3X2J1c190ICpwYnVzOworCWFjOTdfdGVtcGxhdGVfdCBhYzk3OworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX2NhMDEwNl9hYzk3X3dyaXRlLAorCQkucmVhZCA9IHNuZF9jYTAxMDZfYWM5N19yZWFkLAorCX07CisgIAorCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIE5VTEwsICZwYnVzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXBidXMtPm5vX3ZyYSA9IDE7IC8qIHdlIGRvbid0IG5lZWQgVlJBICovCisKKwltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOworCXJldHVybiBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTcpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfZnJlZShjYTAxMDZfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+cmVzX3BvcnQgIT0gTlVMTCkgeyAgICAvKiBhdm9pZCBhY2Nlc3MgdG8gYWxyZWFkeSB1c2VkIGhhcmR3YXJlICovCisJCS8vIGRpc2FibGUgaW50ZXJydXB0cworCQlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBCQVNJQ19JTlRFUlJVUFQsIDAsIDApOworCQlvdXRsKDAsIGNoaXAtPnBvcnQgKyBJTlRFKTsKKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgRVhURU5ERURfSU5UX01BU0ssIDAsIDApOworCQl1ZGVsYXkoMTAwMCk7CisJCS8vIGRpc2FibGUgYXVkaW8KKwkJLy9vdXRsKEhDRkdfTE9DS1NPVU5EQ0FDSEUsIGNoaXAtPnBvcnQgKyBIQ0ZHKTsKKwkJb3V0bCgwLCBjaGlwLT5wb3J0ICsgSENGRyk7CisJCS8qIEZJWE1FOiBXZSBuZWVkIHRvIHN0b3AgYW5kIERNQSB0cmFuc2ZlcnMgaGVyZS4KKwkJICogICAgICAgIEJ1dCBhcyBJIGFtIG5vdCBzdXJlIGhvdyB5ZXQsIHdlIGNhbm5vdCBmcm9tIHRoZSBkbWEgcGFnZXMuCisJCSAqIFNvIHdlIGNhbiBmaXg6IHNuZC1tYWxsb2M6IE1lbW9yeSBsZWFrPyAgcGFnZXMgbm90IGZyZWVkID0gOAorCQkgKi8KKwl9CisJLy8gcmVsZWFzZSB0aGUgZGF0YQorI2lmIDEKKwlpZiAoY2hpcC0+YnVmZmVyLmFyZWEpCisJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YnVmZmVyKTsKKyNlbmRpZgorCisJLy8gcmVsZWFzZSB0aGUgaS9vIHBvcnQKKwlpZiAoY2hpcC0+cmVzX3BvcnQpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShjaGlwLT5yZXNfcG9ydCk7CisJCWtmcmVlX25vY2hlY2soY2hpcC0+cmVzX3BvcnQpOworCX0KKwkvLyByZWxlYXNlIHRoZSBpcnEKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQgKiljaGlwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWNhMDEwNl90ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX2NhMDEwNl9mcmVlKGNoaXApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2NhMDEwNl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwljYTAxMDZfdCAqY2hpcCA9IGRldl9pZDsKKwlpbnQgaTsKKwlpbnQgbWFzazsKKyAgICAgICAgdW5zaWduZWQgaW50IHN0YXQ3NjsKKwljYTAxMDZfY2hhbm5lbF90ICpwY2hhbm5lbDsKKworCXNwaW5fbG9jaygmY2hpcC0+ZW11X2xvY2spOworCisJc3RhdHVzID0gaW5sKGNoaXAtPnBvcnQgKyBJUFIpOworCisJLy8gY2FsbCB1cGRhdGVyLCB1bmxvY2sgYmVmb3JlIGl0CisJc3Bpbl91bmxvY2soJmNoaXAtPmVtdV9sb2NrKTsKKyAgCisJaWYgKCEgc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKyAgICAgICAgc3RhdDc2ID0gc25kX2NhMDEwNl9wdHJfcmVhZChjaGlwLCBFWFRFTkRFRF9JTlQsIDApOworCS8vc25kX3ByaW50aygiaW50ZXJydXB0IHN0YXR1cyA9IDB4JTA4eCwgc3RhdDc2PTB4JTA4eFxuIiwgc3RhdHVzLCBzdGF0NzYpOworCS8vc25kX3ByaW50aygicHRyPTB4JTA4eFxuIixzbmRfY2EwMTA2X3B0cl9yZWFkKGNoaXAsIFBMQVlCQUNLX1BPSU5URVIsIDApKTsKKyAgICAgICAgbWFzayA9IDB4MTE7IC8qIDB4MSBmb3Igb25lIGhhbGYsIDB4MTAgZm9yIHRoZSBvdGhlciBoYWxmIHBlcmlvZC4gKi8KKwlmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcGNoYW5uZWwgPSAmKGNoaXAtPnBsYXliYWNrX2NoYW5uZWxzW2ldKTsKKwkJaWYoc3RhdDc2ICYgbWFzaykgeworLyogRklYTUU6IFNlbGVjdCB0aGUgY29ycmVjdCBzdWJzdHJlYW0gZm9yIHBlcmlvZCBlbGFwc2VkICovCisJCQlpZihwY2hhbm5lbC0+dXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7CisJICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7CisJICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQltYXNrIDw8PSAxOworCX0KKyAgICAgICAgbWFzayA9IDB4MTEwMDAwOyAvKiAweDEgZm9yIG9uZSBoYWxmLCAweDEwIGZvciB0aGUgb3RoZXIgaGFsZiBwZXJpb2QuICovCisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXBjaGFubmVsID0gJihjaGlwLT5jYXB0dXJlX2NoYW5uZWxzW2ldKTsKKwkJaWYoc3RhdDc2ICYgbWFzaykgeworLyogRklYTUU6IFNlbGVjdCB0aGUgY29ycmVjdCBzdWJzdHJlYW0gZm9yIHBlcmlvZCBlbGFwc2VkICovCisJCQlpZihwY2hhbm5lbC0+dXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNoYW5uZWwtPmVwY20tPnN1YnN0cmVhbSk7CisJICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiY2hhbm5lbD0lcFxuIixwY2hhbm5lbCk7CisJICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQltYXNrIDw8PSAxOworCX0KKworICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBFWFRFTkRFRF9JTlQsIDAsIHN0YXQ3Nik7CisJc3Bpbl9sb2NrKCZjaGlwLT5lbXVfbG9jayk7CisJLy8gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBpZiBuZWNlc3NhcnkKKwlvdXRsKHN0YXR1cywgY2hpcC0+cG9ydCtJUFIpOworCisJc3Bpbl91bmxvY2soJmNoaXAtPmVtdV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgc25kX2NhMDEwNl9wY21fZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwljYTAxMDZfdCAqZW11ID0gcGNtLT5wcml2YXRlX2RhdGE7CisJZW11LT5wY20gPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2EwMTA2X3BjbShjYTAxMDZfdCAqZW11LCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKipycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwlpbnQgZXJyOworICAKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoZW11LT5jYXJkLCAiY2EwMTA2IiwgZGV2aWNlLCAxLCAxLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworICAKKwlwY20tPnByaXZhdGVfZGF0YSA9IGVtdTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9jYTAxMDZfcGNtX2ZyZWU7CisKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgMDoKKwkgIHNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfY2EwMTA2X3BsYXliYWNrX2Zyb250X29wcyk7CisJICBzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY2EwMTA2X2NhcHR1cmVfMF9vcHMpOworICAgICAgICAgIGJyZWFrOworCWNhc2UgMToKKwkgIHNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfY2EwMTA2X3BsYXliYWNrX3JlYXJfb3BzKTsKKwkgIHNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9jYTAxMDZfY2FwdHVyZV8xX29wcyk7CisgICAgICAgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9jYTAxMDZfcGxheWJhY2tfY2VudGVyX2xmZV9vcHMpOworCSAgc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2NhMDEwNl9jYXB0dXJlXzJfb3BzKTsKKyAgICAgICAgICBicmVhazsKKwljYXNlIDM6CisJICBzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2NhMDEwNl9wbGF5YmFja191bmtub3duX29wcyk7CisJICBzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY2EwMTA2X2NhcHR1cmVfM19vcHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+ZGV2X3N1YmNsYXNzID0gU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYOworCXN0cmNweShwY20tPm5hbWUsICJDQTAxMDYiKTsKKwllbXUtPnBjbSA9IHBjbTsKKworCWZvcihzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOyAKKwkgICAgc3Vic3RyZWFtOyAKKwkgICAgc3Vic3RyZWFtID0gc3Vic3RyZWFtLT5uZXh0KSB7CisJCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMoc3Vic3RyZWFtLCAKKwkJCQkJCQkgU05EUlZfRE1BX1RZUEVfREVWLCAKKwkJCQkJCQkgc25kX2RtYV9wY2lfZGF0YShlbXUtPnBjaSksIAorCQkJCQkJCSA2NCoxMDI0LCA2NCoxMDI0KSkgPCAwKSAvKiBGSVhNRTogMzIqMTAyNCBmb3Igc291bmQgYnVmZmVyLCBiZXR3ZWVuIDMyYW5kNjQgZm9yIFBlcmlvZHMgdGFibGUuICovCisJCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOyAKKwkgICAgICBzdWJzdHJlYW07IAorCSAgICAgIHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkgeworIAkJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlcyhzdWJzdHJlYW0sIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9ETUFfVFlQRV9ERVYsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfZG1hX3BjaV9kYXRhKGVtdS0+cGNpKSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KjEwMjQsIDY0KjEwMjQpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKyAgCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NhMDEwNl9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSBjYTAxMDZfdCAqKnJjaGlwKQoreworCWNhMDEwNl90ICpjaGlwOworCWludCBlcnI7CisJaW50IGNoOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0gc25kX2NhMDEwNl9kZXZfZnJlZSwKKwl9OworICAKKwkqcmNoaXAgPSBOVUxMOworICAKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIDB4ZmZmZmZmZmZVTCkgPCAwIHx8CisJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIDB4ZmZmZmZmZmZVTCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorICAKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisgIAorCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5lbXVfbG9jayk7CisgIAorCWNoaXAtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwlpZiAoKGNoaXAtPnJlc19wb3J0ID0gcmVxdWVzdF9yZWdpb24oY2hpcC0+cG9ydCwgMHgyMCwKKwkJCQkJICAgICAic25kX2NhMDEwNiIpKSA9PSBOVUxMKSB7IAorCQlzbmRfY2EwMTA2X2ZyZWUoY2hpcCk7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHRoZSBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jYTAxMDZfaW50ZXJydXB0LAorCQkJU0FfSU5URVJSVVBUfFNBX1NISVJRLCAic25kX2NhMDEwNiIsCisJCQkodm9pZCAqKWNoaXApKSB7CisJCXNuZF9jYTAxMDZfZnJlZShjaGlwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKyAgCisgCS8qIFRoaXMgc3RvcmVzIHRoZSBwZXJpb2RzIHRhYmxlLiAqLyAKKwlpZihzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLCAxMDI0LCAmY2hpcC0+YnVmZmVyKSA8IDApIHsKKwkJc25kX2NhMDEwNl9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCS8qIHJlYWQgcmV2aXNpb24gJiBzZXJpYWwgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgKGNoYXIgKikmY2hpcC0+cmV2aXNpb24pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmY2hpcC0+c2VyaWFsKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZjaGlwLT5tb2RlbCk7CisjaWYgMQorCXByaW50ayhLRVJOX0lORk8gIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAorCSAgICAgICBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+c2VyaWFsKTsKKyNlbmRpZgorCisJb3V0bCgwLCBjaGlwLT5wb3J0ICsgSU5URSk7CisKKwkvKgorCSAqICBJbml0IHRvIDB4MDIxMDkyMDQgOgorCSAqICBDbG9jayBhY2N1cmFjeSAgICA9IDAgICAgICgxMDAwcHBtKQorCSAqICBTYW1wbGUgUmF0ZSAgICAgICA9IDIgICAgICg0OGtIeikKKwkgKiAgQXVkaW8gQ2hhbm5lbCAgICAgPSAxICAgICAoTGVmdCBvZiAyKQorCSAqICBTb3VyY2UgTnVtYmVyICAgICA9IDAgICAgIChVbnNwZWNpZmllZCkKKwkgKiAgR2VuZXJhdGlvbiBTdGF0dXMgPSAxICAgICAoT3JpZ2luYWwgZm9yIENhdCBDb2RlIDEyKQorCSAqICBDYXQgQ29kZSAgICAgICAgICA9IDEyICAgIChEaWdpdGFsIFNpZ25hbCBNaXhlcikKKwkgKiAgTW9kZSAgICAgICAgICAgICAgPSAwICAgICAoTW9kZSAwKQorCSAqICBFbXBoYXNpcyAgICAgICAgICA9IDAgICAgIChOb25lKQorCSAqICBDUCAgICAgICAgICAgICAgICA9IDEgICAgIChDb3B5cmlnaHQgdW5hc3NlcnRlZCkKKwkgKiAgQU4gICAgICAgICAgICAgICAgPSAwICAgICAoQXVkaW8gZGF0YSkKKwkgKiAgUCAgICAgICAgICAgICAgICAgPSAwICAgICAoQ29uc3VtZXIpCisJICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BDUzAsIDAsCisJCQkJY2hpcC0+c3BkaWZfYml0c1swXSA9CisJCQkJU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAorCQkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwKKwkJCQlTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwKKwkJCQkweDAwMDAwMDAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpOworCS8qIE9ubHkgU1BDUzEgaGFzIGJlZW4gdGVzdGVkICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BDUzEsIDAsCisJCQkJY2hpcC0+c3BkaWZfYml0c1sxXSA9CisJCQkJU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAorCQkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwKKwkJCQlTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwKKwkJCQkweDAwMDAwMDAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpOworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFNQQ1MyLCAwLAorCQkJCWNoaXAtPnNwZGlmX2JpdHNbMl0gPQorCQkJCVNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCQlTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8CisJCQkJU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8CisJCQkJMHgwMDAwMDAwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBTUENTMywgMCwKKwkJCQljaGlwLT5zcGRpZl9iaXRzWzNdID0KKwkJCQlTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IFNQQ1NfU0FNUExFUkFURV80OCB8CisJCQkJU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfAorCQkJCVNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfAorCQkJCTB4MDAwMDAwMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCk7CisKKyAgICAgICAgc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgUExBWUJBQ0tfTVVURSwgMCwgMHgwMGZjMDAwMCk7CisgICAgICAgIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfTVVURSwgMCwgMHgwMGZjMDAwMCk7CisKKyAgICAgICAgLyogV3JpdGUgMHg4MDAwIHRvIEFDOTdfUkVDX0dBSU4gdG8gbXV0ZSBpdC4gKi8KKyAgICAgICAgb3V0YihBQzk3X1JFQ19HQUlOLCBjaGlwLT5wb3J0ICsgQUM5N0FERFJFU1MpOworICAgICAgICBvdXR3KDB4ODAwMCwgY2hpcC0+cG9ydCArIEFDOTdEQVRBKTsKKyNpZiAwCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BDUzAsIDAsIDB4MjEwODAwNik7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgMHg0MiwgMCwgMHgyMTA4MDA2KTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCAweDQzLCAwLCAweDIxMDgwMDYpOworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIDB4NDQsIDAsIDB4MjEwODAwNik7CisjZW5kaWYKKworCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BESUZfU0VMRUNUMiwgMCwgMHhmMGYwMDNmKTsgLyogT1NTIGRyaXZlcnMgc2V0IHRoaXMuICovCisJLyogQW5hbG9nIG9yIERpZ2l0YWwgb3V0cHV0ICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BESUZfU0VMRUNUMSwgMCwgMHhmKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBTUERJRl9TRUxFQ1QyLCAwLCAweDAwMGIwMDAwKTsgLyogMHgwYjAwMDAwMCBmb3IgZGlnaXRhbCwgMHgwMDBiMDAwMCBmb3IgYW5hbG9nLCBmcm9tIHdpbjIwMDAgZHJpdmVycyAqLworCWNoaXAtPnNwZGlmX2VuYWJsZSA9IDA7IC8qIFNldCBkaWdpdGFsIFNQRElGIG91dHB1dCBvZmYgKi8KKwljaGlwLT5jYXB0dXJlX3NvdXJjZSA9IDM7IC8qIFNldCBDQVBUVVJFX1NPVVJDRSAqLworCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgMHg0NSwgMCwgMCk7IC8qIEFuYWxvZ3VlIG91dCAqLworCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgMHg0NSwgMCwgMHhmMDApOyAvKiBEaWdpdGFsIG91dCAqLworCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9DT05UUk9MLCAwLCAweDQwYzgxMDAwKTsgLyogZ29lcyB0byAweDQwYzgwMDAwIHdoZW4gZG9pbmcgU1BESUYgSU4vT1VUICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9DT05UUk9MLCAxLCAweGZmZmZmZmZmKTsgLyogKE11dGUpIENBUFRVUkUgZmVlZGJhY2sgaW50byBQTEFZQkFDSyB2b2x1bWUuIE9ubHkgbG93ZXIgMTYgYml0cyBtYXR0ZXIuICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9DT05UUk9MLCAyLCAweDMwMzAwMDAwKTsgLyogU1BESUYgSU4gVm9sdW1lICovCisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9DT05UUk9MLCAzLCAweDAwNzAwMDAwKTsgLyogU1BESUYgSU4gVm9sdW1lLCAweDcwID0gKHZvbCAmIDB4M2YpIHwgMHg0MCAqLworCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFBMQVlCQUNLX1JPVVRJTkcxLCAwLCAweDMyNzY1NDEwKTsKKwlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBQTEFZQkFDS19ST1VUSU5HMiwgMCwgMHg3Njc2NzY3Nik7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9ST1VUSU5HMSwgMCwgMHgzMjc2NTQxMCk7CisJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9ST1VUSU5HMiwgMCwgMHg3Njc2NzY3Nik7CisJZm9yKGNoID0gMDsgY2ggPCA0OyBjaCsrKSB7CisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfVk9MVU1FMSwgY2gsIDB4MzAzMDMwMzApOyAvKiBPbmx5IGhpZ2ggMTYgYml0cyBtYXR0ZXIgKi8KKwkJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9WT0xVTUUyLCBjaCwgMHgzMDMwMzAzMCk7CisJCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgUExBWUJBQ0tfVk9MVU1FMSwgY2gsIDB4NDA0MDQwNDApOyAvKiBNdXRlICovCisJCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgUExBWUJBQ0tfVk9MVU1FMiwgY2gsIDB4NDA0MDQwNDApOyAvKiBNdXRlICovCisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFBMQVlCQUNLX1ZPTFVNRTEsIGNoLCAweGZmZmZmZmZmKTsgLyogTXV0ZSAqLworCQlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBQTEFZQkFDS19WT0xVTUUyLCBjaCwgMHhmZmZmZmZmZik7IC8qIE11dGUgKi8KKwl9CisgICAgICAgIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfU09VUkNFLCAweDAsIDB4MzMzMzAwZTQpOyAvKiBTZWxlY3QgTUlDLCBMaW5lIGluLCBUQUQgaW4sIEFVWCBpbiAqLworCWNoaXAtPmNhcHR1cmVfc291cmNlID0gMzsgLyogU2V0IENBUFRVUkVfU09VUkNFICovCisKKyAgICAgICAgaWYgKChjaGlwLT5zZXJpYWwgPT0gMHgxMDA2MTEwMikgfHwgCisJICAgIChjaGlwLT5zZXJpYWwgPT0gMHgxMDA3MTEwMikgfHwKKwkgICAgKGNoaXAtPnNlcmlhbCA9PSAweDEwMDkxNDYyKSkgeyAvKiBUaGUgU0IwNDEwIGFuZCBTQjA0MTMgdXNlIEdQSU8gZGlmZmVyZW50bHkuICovCisJCS8qIEZJWE1FOiBTdGlsbCBuZWVkIHRvIGZpbmQgb3V0IHdoYXQgdGhlIG90aGVyIEdQSU8gYml0cyBkby4gRS5nLiBGb3IgZGlnaXRhbCBzcGRpZiBvdXQuICovCisJCW91dGwoMHgwLCBjaGlwLT5wb3J0K0dQSU8pOworCQkvL291dGwoMHgwMGYwZTAwMCwgY2hpcC0+cG9ydCtHUElPKTsgLyogQW5hbG9nICovCisJCW91dGwoMHgwMDVmNDMwMCwgY2hpcC0+cG9ydCtHUElPKTsgLyogQW5hbG9nICovCisJfSBlbHNlIHsKKwkJb3V0bCgweDAsIGNoaXAtPnBvcnQrR1BJTyk7CisJCW91dGwoMHgwMDVmMDNhMywgY2hpcC0+cG9ydCtHUElPKTsgLyogQW5hbG9nICovCisJCS8vb3V0bCgweDAwNWYwMmEyLCBjaGlwLT5wb3J0K0dQSU8pOyAgIC8qIFNQRElGICovCisJfQorCXNuZF9jYTAxMDZfaW50cl9lbmFibGUoY2hpcCwgMHgxMDUpOyAvKiBXaW4yMDAwIHVzZXMgMHgxZTAgKi8KKworCS8vb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFfEhDRkdfQVVESU9FTkFCTEUsIGNoaXAtPnBvcnQrSENGRyk7CisJLy9vdXRsKDB4MDAwMDE0MDksIGNoaXAtPnBvcnQrSENGRyk7IC8qIDB4MTAwMCBjYXVzZXMgQUMzIHRvIGZhaWxzLiBNYXliZSBpdCBlZmZlY3RzIDI0IGJpdCBvdXRwdXQuICovCisJLy9vdXRsKDB4MDAwMDAwMDksIGNoaXAtPnBvcnQrSENGRyk7CisJb3V0bChIQ0ZHX0FDOTcgfCBIQ0ZHX0FVRElPRU5BQkxFLCBjaGlwLT5wb3J0K0hDRkcpOyAvKiBBQzk3IDIuMCwgRW5hYmxlIG91dHB1dHMuICovCisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwKKwkJCQkgIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2NhMDEwNl9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKwkqcmNoaXAgPSBjaGlwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2EwMTA2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwljYTAxMDZfdCAqY2hpcDsKKwljYTAxMDZfbmFtZXNfdCAqYzsKKwlpbnQgZXJyOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGVyciA9IHNuZF9jYTAxMDZfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9jYTAxMDZfcGNtKGNoaXAsIDAsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfY2EwMTA2X3BjbShjaGlwLCAxLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX2NhMDEwNl9wY20oY2hpcCwgMiwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9jYTAxMDZfcGNtKGNoaXAsIDMsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisgICAgICAgIGlmICgoY2hpcC0+c2VyaWFsICE9IDB4MTAwNjExMDIpICYmIAorCSAgICAoY2hpcC0+c2VyaWFsICE9IDB4MTAwNzExMDIpICYmIAorCSAgICAoY2hpcC0+c2VyaWFsICE9IDB4MTAwOTE0NjIpICkgeyAvKiBUaGUgU0IwNDEwIGFuZCBTQjA0MTMgZG8gbm90IGhhdmUgYW4gYWM5NyBjaGlwLiAqLworCQlpZiAoKGVyciA9IHNuZF9jYTAxMDZfYWM5NyhjaGlwKSkgPCAwKSB7CisJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlpZiAoKGVyciA9IHNuZF9jYTAxMDZfbWl4ZXIoY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYTAxMDZfcHJvY19pbml0KGNoaXApOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkNBMDEwNiIpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJDQTAxMDYiKTsKKworCWZvciAoYz1jYTAxMDZfY2hpcF9uYW1lczsgYy0+c2VyaWFsOyBjKyspIHsKKwkJaWYgKGMtPnNlcmlhbCA9PSBjaGlwLT5zZXJpYWwpIGJyZWFrOworCX0KKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVpIiwKKwkJYy0+bmFtZSwgY2hpcC0+cG9ydCwgY2hpcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2NhMDEwNl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworLy8gUENJIElEcworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9jYTAxMDZfaWRzW10gPSB7CisJeyAweDExMDIsIDB4MDAwNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAkvKiBBdWRpZ3kgTFMgb3IgTGl2ZSAyNGJpdCAqLworCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfY2EwMTA2X2lkcyk7CisKKy8vIHBjaV9kcml2ZXIgZGVmaW5pdGlvbgorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJDQTAxMDYiLAorCS5pZF90YWJsZSA9IHNuZF9jYTAxMDZfaWRzLAorCS5wcm9iZSA9IHNuZF9jYTAxMDZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYTAxMDZfcmVtb3ZlKSwKK307CisKKy8vIGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb2R1bGUKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9jYTAxMDZfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKSkgPiAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8vIGNsZWFuIHVwIHRoZSBtb2R1bGUKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfY2EwMTA2X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9jYTAxMDZfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9jYTAxMDZfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YmVkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwNCBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrPgorICogIERyaXZlciBDQTAxMDYgY2hpcHMuIGUuZy4gU291bmQgQmxhc3RlciBBdWRpZ3kgTFMgYW5kIExpdmUgMjRiaXQKKyAqICBWZXJzaW9uOiAwLjAuMTYKKyAqCisgKiAgRkVBVFVSRVMgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAqICAgIFNlZSBjYTAxMDZfbWFpbi5jIGZvciBmZWF0dXJlcy4KKyAqIAorICogIENoYW5nZWxvZzoKKyAqICAgIFN1cHBvcnQgaW50ZXJydXB0cyBwZXIgcGVyaW9kLgorICogICAgUmVtb3ZlZCBub2lzZSBmcm9tIENlbnRlci9MRkUgY2hhbm5lbCB3aGVuIGluIEFuYWxvZyBtb2RlLgorICogICAgUmVuYW1lIGFuZCByZW1vdmUgbWl4ZXIgY29udHJvbHMuCisgKiAgMC4wLjYKKyAqICAgIFVzZSBzZXBhcmF0ZSBjYXJkIGJhc2VkIERNQSBidWZmZXIgZm9yIHBlcmlvZHMgdGFibGUgbGlzdC4KKyAqICAwLjAuNworICogICAgQ2hhbmdlIHJlbW92ZSBhbmQgcmVuYW1lIGN0cmxzIGludG8gbGlzdHMuCisgKiAgMC4wLjgKKyAqICAgIFRyeSB0byBmaXggY2FwdHVyZSBzb3VyY2VzLgorICogIDAuMC45CisgKiAgICBGaXggQUMzIG91dHB1dC4KKyAqICAgIEVuYWJsZSBTMzJfTEUgZm9ybWF0IHN1cHBvcnQuCisgKiAgMC4wLjEwCisgKiAgICBFbmFibGUgcGxheWJhY2sgNDgwMDAgYW5kIDk2MDAwIHJhdGVzLiAoUmF0ZXMgb3RoZXIgdGhhdCB0aGVzZSBkbyBub3Qgd29yaywgZXZlbiB3aXRoICJwbHVnOmZyb250Ii4pCisgKiAgMC4wLjExCisgKiAgICBBZGQgTW9kZWwgbmFtZSByZWNvZ25pdGlvbi4KKyAqICAwLjAuMTIKKyAqICAgIENvcnJlY3QgaW50ZXJydXB0IHRpbWluZy4gaW50ZXJydXB0IGF0IGVuZCBvZiBwZXJpb2QsIGluc3RlYWQgb2YgaW4gdGhlIG1pZGRsZSBvZiBhIHBsYXliYWNrIHBlcmlvZC4KKyAqICAgIFJlbW92ZSByZWR1bmRlbnQgInZvaWNlIiBoYW5kbGluZy4KKyAqICAwLjAuMTMKKyAqICAgIFNpbmdsZSB0cmlnZ2VyIGNhbGwgZm9yIG11bHRpIGNoYW5uZWxzLgorICogIDAuMC4xNAorICogICAgU2V0IGxpbWl0cyBiYXNlZCBvbiB3aGF0IHRoZSBzb3VuZCBjYXJkIGhhcmR3YXJlIGNhbiBkby4KKyAqICAgIHBsYXliYWNrIHBlcmlvZHNfbWluPTIsIHBlcmlvZHNfbWF4PTgKKyAqICAgIGNhcHR1cmUgaHcgY29uc3RyYWludHMgcmVxdWlyZSBwZXJpb2Rfc2l6ZSA9IG4gKiA2NCBieXRlcy4KKyAqICAgIHBsYXliYWNrIGh3IGNvbnN0cmFpbnRzIHJlcXVpcmUgcGVyaW9kX3NpemUgPSBuICogNjQgYnl0ZXMuCisgKiAgMC4wLjE1CisgKiAgICBTZXBhcmF0ZWQgY2EwMTA2LmMgaW50byBzZXBhcmF0ZSBmdW5jdGlvbmFsIC5jIGZpbGVzLgorICogIDAuMC4xNgorICogICAgTW9kaWZpZWQgQ29weXJpZ2h0IG1lc3NhZ2UuCisgKgorICogIFRoaXMgY29kZSB3YXMgaW5pdGFsbHkgYmFzZWQgb24gY29kZSBmcm9tIEFMU0EncyBlbXUxMGsxeC5jIHdoaWNoIGlzOgorICogIENvcHlyaWdodCAoYykgYnkgRnJhbmNpc2NvIE1vcmFlcyA8Zm1vcmFlc0BuYy5yci5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKworI2luY2x1ZGUgImNhMDEwNi5oIgorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfc2hhcmVkX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9zaGFyZWRfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY2EwMTA2X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBlbXUtPnNwZGlmX2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3NoYXJlZF9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljYTAxMDZfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZSA9IDA7CisJdTMyIG1hc2s7CisKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDsKKwljaGFuZ2UgPSAoZW11LT5zcGRpZl9lbmFibGUgIT0gdmFsKTsKKwlpZiAoY2hhbmdlKSB7CisJCWVtdS0+c3BkaWZfZW5hYmxlID0gdmFsOworCQlpZiAodmFsID09IDEpIHsKKwkJCS8qIERpZ2l0YWwgKi8KKwkJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgU1BESUZfU0VMRUNUMSwgMCwgMHhmKTsKKwkJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgU1BESUZfU0VMRUNUMiwgMCwgMHgwYjAwMDAwMCk7CisJCQlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIENBUFRVUkVfQ09OVFJPTCwgMCwKKwkJCQlzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgQ0FQVFVSRV9DT05UUk9MLCAwKSAmIH4weDEwMDApOworCQkJbWFzayA9IGlubChlbXUtPnBvcnQgKyBHUElPKSAmIH4weDEwMTsKKwkJCW91dGwobWFzaywgZW11LT5wb3J0ICsgR1BJTyk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIEFuYWxvZyAqLworCQkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBTUERJRl9TRUxFQ1QxLCAwLCAweGYpOworCQkJc25kX2NhMDEwNl9wdHJfd3JpdGUoZW11LCBTUERJRl9TRUxFQ1QyLCAwLCAweDAwMGIwMDAwKTsKKwkJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgQ0FQVFVSRV9DT05UUk9MLCAwLAorCQkJCXNuZF9jYTAxMDZfcHRyX3JlYWQoZW11LCBDQVBUVVJFX0NPTlRST0wsIDApIHwgMHgxMDAwKTsKKwkJCW1hc2sgPSBpbmwoZW11LT5wb3J0ICsgR1BJTykgfCAweDEwMTsKKwkJCW91dGwobWFzaywgZW11LT5wb3J0ICsgR1BJTyk7CisJCX0KKwl9CisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl9zaGFyZWRfc3BkaWYgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJIlNQRElGIE91dCIsCisJLmluZm8gPQkJc25kX2NhMDEwNl9zaGFyZWRfc3BkaWZfaW5mbywKKwkuZ2V0ID0JCXNuZF9jYTAxMDZfc2hhcmVkX3NwZGlmX2dldCwKKwkucHV0ID0JCXNuZF9jYTAxMDZfc2hhcmVkX3NwZGlmX3B1dAorfTsKKworc3RhdGljIGludCBzbmRfY2EwMTA2X2NhcHR1cmVfc291cmNlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzZdID0geyAiU1BESUYgb3V0IiwgImkycyBtaXhlciBvdXQiLCAiU1BESUYgaW4iLCAiaTJzIGluIiwgIkFDOTcgaW4iLCAiU1JDIG91dCIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA2OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gNSkKKyAgICAgICAgICAgICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gNTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY2EwMTA2X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBlbXUtPmNhcHR1cmVfc291cmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY2EwMTA2X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2UgPSAwOworCXUzMiBtYXNrOworCXUzMiBzb3VyY2U7CisKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDsKKwljaGFuZ2UgPSAoZW11LT5jYXB0dXJlX3NvdXJjZSAhPSB2YWwpOworCWlmIChjaGFuZ2UpIHsKKwkJZW11LT5jYXB0dXJlX3NvdXJjZSA9IHZhbDsKKwkJc291cmNlID0gKHZhbCA8PCAyOCkgfCAodmFsIDw8IDI0KSB8ICh2YWwgPDwgMjApIHwgKHZhbCA8PCAxNik7CisJCW1hc2sgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgQ0FQVFVSRV9TT1VSQ0UsIDApICYgMHhmZmZmOworCQlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIENBUFRVUkVfU09VUkNFLCAwLCBzb3VyY2UgfCBtYXNrKTsKKwl9CisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZSBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9CQkiQ2FwdHVyZSBTb3VyY2UiLAorCS5pbmZvID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfaW5mbywKKwkuZ2V0ID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfZ2V0LAorCS5wdXQgPQkJc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZV9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljYTAxMDZfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gKGVtdS0+c3BkaWZfYml0c1tpZHhdID4+IDApICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChlbXUtPnNwZGlmX2JpdHNbaWR4XSA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAoZW11LT5zcGRpZl9iaXRzW2lkeF0gPj4gMTYpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IChlbXUtPnNwZGlmX2JpdHNbaWR4XSA+PiAyNCkgJiAweGZmOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3NwZGlmX2dldF9tYXNrKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IDB4ZmY7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfc3BkaWZfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNhMDEwNl90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA8PCAwKSB8CisJICAgICAgKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdIDw8IDgpIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPDwgMTYpIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPDwgMjQpOworCWNoYW5nZSA9IHZhbCAhPSBlbXUtPnNwZGlmX2JpdHNbaWR4XTsKKwlpZiAoY2hhbmdlKSB7CisJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgU1BDUzAgKyBpZHgsIDAsIHZhbCk7CisJCWVtdS0+c3BkaWZfYml0c1tpZHhdID0gdmFsOworCX0KKyAgICAgICAgcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY2EwMTA2X3NwZGlmX21hc2tfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgICAgIC5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTUFTSyksCisJLmNvdW50ID0JNCwKKyAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfZ2V0X21hc2sKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl9zcGRpZl9jb250cm9sID0KK3sKKyAgICAgICAgLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgICAgIC5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJLmNvdW50ID0JNCwKKyAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfZ2V0LAorICAgICAgICAucHV0ID0gICAgICAgICAgc25kX2NhMDEwNl9zcGRpZl9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisgICAgICAgIHVpbmZvLT5jb3VudCA9IDI7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sLCBpbnQgcmVnLCBpbnQgY2hhbm5lbF9pZCkKK3sKKyAgICAgICAgY2EwMTA2X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhbHVlOworCisgICAgICAgIHZhbHVlID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIHJlZywgY2hhbm5lbF9pZCk7CisgICAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMHhmZiAtICgodmFsdWUgPj4gMjQpICYgMHhmZik7IC8qIExlZnQgKi8KKyAgICAgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAweGZmIC0gKCh2YWx1ZSA+PiAxNikgJiAweGZmKTsgLyogUmlnaHQgKi8KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfZ2V0X3NwZGlmX2Zyb250KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9GUk9OVF9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUxOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3ZvbHVtZV9nZXRfc3BkaWZfY2VudGVyX2xmZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IENPTlRST0xfQ0VOVEVSX0xGRV9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUxOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfZ2V0X3NwZGlmX3Vua25vd24oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGNoYW5uZWxfaWQgPSBDT05UUk9MX1VOS05PV05fQ0hBTk5FTDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FMTsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CitzdGF0aWMgaW50IHNuZF9jYTAxMDZfdm9sdW1lX2dldF9zcGRpZl9yZWFyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9SRUFSX0NIQU5ORUw7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRTE7CisgICAgICAgIHJldHVybiBzbmRfY2EwMTA2X3ZvbHVtZV9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGNoYW5uZWxfaWQpOworfQorc3RhdGljIGludCBzbmRfY2EwMTA2X3ZvbHVtZV9nZXRfYW5hbG9nX2Zyb250KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9GUk9OVF9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUyOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KKworc3RhdGljIGludCBzbmRfY2EwMTA2X3ZvbHVtZV9nZXRfYW5hbG9nX2NlbnRlcl9sZmUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGNoYW5uZWxfaWQgPSBDT05UUk9MX0NFTlRFUl9MRkVfQ0hBTk5FTDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FMjsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CitzdGF0aWMgaW50IHNuZF9jYTAxMDZfdm9sdW1lX2dldF9hbmFsb2dfdW5rbm93bihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IENPTlRST0xfVU5LTk9XTl9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUyOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfZ2V0X2FuYWxvZ19yZWFyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9SRUFSX0NIQU5ORUw7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRTI7CisgICAgICAgIHJldHVybiBzbmRfY2EwMTA2X3ZvbHVtZV9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGNoYW5uZWxfaWQpOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfdm9sdW1lX2dldF9mZWVkYmFjayhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IDE7CisJaW50IHJlZyA9IENBUFRVUkVfQ09OVFJPTDsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sLCBpbnQgcmVnLCBpbnQgY2hhbm5lbF9pZCkKK3sKKyAgICAgICAgY2EwMTA2X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhbHVlOworICAgICAgICAvL3ZhbHVlID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIHJlZywgY2hhbm5lbF9pZCk7CisgICAgICAgIC8vdmFsdWUgPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgdmFsdWUgPSAoKDB4ZmYgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgPDwgMjQpIHwgKCgweGZmIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIDw8IDE2KTsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSB8ICgoMHhmZiAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSA8PCA4KSB8ICgoMHhmZiAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKSApOworICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIHJlZywgY2hhbm5lbF9pZCwgdmFsdWUpOworICAgICAgICByZXR1cm4gMTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0X3NwZGlmX2Zyb250KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9GUk9OVF9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUxOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0X3NwZGlmX2NlbnRlcl9sZmUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGNoYW5uZWxfaWQgPSBDT05UUk9MX0NFTlRFUl9MRkVfQ0hBTk5FTDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FMTsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CitzdGF0aWMgaW50IHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9zcGRpZl91bmtub3duKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9VTktOT1dOX0NIQU5ORUw7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRTE7CisgICAgICAgIHJldHVybiBzbmRfY2EwMTA2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGNoYW5uZWxfaWQpOworfQorc3RhdGljIGludCBzbmRfY2EwMTA2X3ZvbHVtZV9wdXRfc3BkaWZfcmVhcihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IENPTlRST0xfUkVBUl9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUxOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0X2FuYWxvZ19mcm9udChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IENPTlRST0xfRlJPTlRfQ0hBTk5FTDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FMjsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CitzdGF0aWMgaW50IHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9hbmFsb2dfY2VudGVyX2xmZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgY2hhbm5lbF9pZCA9IENPTlRST0xfQ0VOVEVSX0xGRV9DSEFOTkVMOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUUyOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0X2FuYWxvZ191bmtub3duKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gQ09OVFJPTF9VTktOT1dOX0NIQU5ORUw7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRTI7CisgICAgICAgIHJldHVybiBzbmRfY2EwMTA2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGNoYW5uZWxfaWQpOworfQorc3RhdGljIGludCBzbmRfY2EwMTA2X3ZvbHVtZV9wdXRfYW5hbG9nX3JlYXIoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGNoYW5uZWxfaWQgPSBDT05UUk9MX1JFQVJfQ0hBTk5FTDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FMjsKKyAgICAgICAgcmV0dXJuIHNuZF9jYTAxMDZfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgY2hhbm5lbF9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl92b2x1bWVfcHV0X2ZlZWRiYWNrKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBjaGFubmVsX2lkID0gMTsKKwlpbnQgcmVnID0gQ0FQVFVSRV9DT05UUk9MOworICAgICAgICByZXR1cm4gc25kX2NhMDEwNl92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBjaGFubmVsX2lkKTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ19mcm9udCA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJBbmFsb2cgRnJvbnQgVm9sdW1lIiwKKyAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2luZm8sCisgICAgICAgIC5nZXQgPSAgICAgICAgICBzbmRfY2EwMTA2X3ZvbHVtZV9nZXRfYW5hbG9nX2Zyb250LAorICAgICAgICAucHV0ID0gICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfcHV0X2FuYWxvZ19mcm9udAorfTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9hbmFsb2dfY2VudGVyX2xmZSA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJBbmFsb2cgQ2VudGVyL0xGRSBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldF9hbmFsb2dfY2VudGVyX2xmZSwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9hbmFsb2dfY2VudGVyX2xmZQorfTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9hbmFsb2dfdW5rbm93biA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJBbmFsb2cgVW5rbm93biBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldF9hbmFsb2dfdW5rbm93biwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9hbmFsb2dfdW5rbm93bgorfTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9hbmFsb2dfcmVhciA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJBbmFsb2cgUmVhciBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldF9hbmFsb2dfcmVhciwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9hbmFsb2dfcmVhcgorfTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9zcGRpZl9mcm9udCA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJTUERJRiBGcm9udCBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldF9zcGRpZl9mcm9udCwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9zcGRpZl9mcm9udAorfTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9zcGRpZl9jZW50ZXJfbGZlID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIlNQRElGIENlbnRlci9MRkUgVm9sdW1lIiwKKyAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2luZm8sCisgICAgICAgIC5nZXQgPSAgICAgICAgICBzbmRfY2EwMTA2X3ZvbHVtZV9nZXRfc3BkaWZfY2VudGVyX2xmZSwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dF9zcGRpZl9jZW50ZXJfbGZlCit9Oworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX3NwZGlmX3Vua25vd24gPQoreworICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgICAgIC5uYW1lID0gICAgICAgICAiU1BESUYgVW5rbm93biBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldF9zcGRpZl91bmtub3duLAorICAgICAgICAucHV0ID0gICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfcHV0X3NwZGlmX3Vua25vd24KK307CitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jYTAxMDZfdm9sdW1lX2NvbnRyb2xfc3BkaWZfcmVhciA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJTUERJRiBSZWFyIFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfY2EwMTA2X3ZvbHVtZV9pbmZvLAorICAgICAgICAuZ2V0ID0gICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfZ2V0X3NwZGlmX3JlYXIsCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfY2EwMTA2X3ZvbHVtZV9wdXRfc3BkaWZfcmVhcgorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX2ZlZWRiYWNrID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkNBUFRVUkUgZmVlZGJhY2sgaW50byBQTEFZQkFDSyIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfY2EwMTA2X3ZvbHVtZV9pbmZvLAorICAgICAgICAuZ2V0ID0gICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfZ2V0X2ZlZWRiYWNrLAorICAgICAgICAucHV0ID0gICAgICAgICAgc25kX2NhMDEwNl92b2x1bWVfcHV0X2ZlZWRiYWNrCit9OworCisKK3N0YXRpYyBpbnQgcmVtb3ZlX2N0bChzbmRfY2FyZF90ICpjYXJkLCBjb25zdCBjaGFyICpuYW1lKQoreworCXNuZF9jdGxfZWxlbV9pZF90IGlkOworCW1lbXNldCgmaWQsIDAsIHNpemVvZihpZCkpOworCXN0cmNweShpZC5uYW1lLCBuYW1lKTsKKwlpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXJldHVybiBzbmRfY3RsX3JlbW92ZV9pZChjYXJkLCAmaWQpOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX3QgKmN0bF9maW5kKHNuZF9jYXJkX3QgKmNhcmQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc25kX2N0bF9lbGVtX2lkX3Qgc2lkOworCW1lbXNldCgmc2lkLCAwLCBzaXplb2Yoc2lkKSk7CisJLyogRklYTUU6IHN0cmNweSBpcyBiYWQuICovCisJc3RyY3B5KHNpZC5uYW1lLCBuYW1lKTsKKwlzaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlyZXR1cm4gc25kX2N0bF9maW5kX2lkKGNhcmQsICZzaWQpOworfQorCitzdGF0aWMgaW50IHJlbmFtZV9jdGwoc25kX2NhcmRfdCAqY2FyZCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCit7CisJc25kX2tjb250cm9sX3QgKmtjdGwgPSBjdGxfZmluZChjYXJkLCBzcmMpOworCWlmIChrY3RsKSB7CisJCXN0cmNweShrY3RsLT5pZC5uYW1lLCBkc3QpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK2ludCBfX2RldmluaXQgc25kX2NhMDEwNl9taXhlcihjYTAxMDZfdCAqZW11KQoreworICAgICAgICBpbnQgZXJyOworICAgICAgICBzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKyAgICAgICAgc25kX2NhcmRfdCAqY2FyZCA9IGVtdS0+Y2FyZDsKKwljaGFyICoqYzsKKwlzdGF0aWMgY2hhciAqY2EwMTA2X3JlbW92ZV9jdGxzW10gPSB7CisJCSJNYXN0ZXIgTW9ubyBQbGF5YmFjayBTd2l0Y2giLAorCQkiTWFzdGVyIE1vbm8gUGxheWJhY2sgVm9sdW1lIiwKKwkJIjNEIENvbnRyb2wgLSBTd2l0Y2giLAorCQkiM0QgQ29udHJvbCBTaWdtYXRlbCAtIERlcHRoIiwKKwkJIlBDTSBQbGF5YmFjayBTd2l0Y2giLAorCQkiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJCSJDRCBQbGF5YmFjayBTd2l0Y2giLAorCQkiQ0QgUGxheWJhY2sgVm9sdW1lIiwKKwkJIlBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCSJQaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkiVmlkZW8gUGxheWJhY2sgU3dpdGNoIiwKKwkJIlZpZGVvIFBsYXliYWNrIFZvbHVtZSIsCisJCSJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsCisJCSJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsCisJCSJNb25vIE91dHB1dCBTZWxlY3QiLAorCQkiQ2FwdHVyZSBTb3VyY2UiLAorCQkiQ2FwdHVyZSBTd2l0Y2giLAorCQkiQ2FwdHVyZSBWb2x1bWUiLAorCQkiRXh0ZXJuYWwgQW1wbGlmaWVyIiwKKwkJIlNpZ21hdGVsIDQtU3BlYWtlciBTdGVyZW8gUGxheWJhY2sgU3dpdGNoIiwKKwkJIlNpZ21hdGVsIFN1cnJvdW5kIFBoYXNlIEludmVyc2lvbiBQbGF5YmFjayAiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY2hhciAqY2EwMTA2X3JlbmFtZV9jdGxzW10gPSB7CisJCSJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgIkNhcHR1cmUgU3dpdGNoIiwKKwkJIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAiQ2FwdHVyZSBWb2x1bWUiLAorCQkiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAiQUM5NyBMaW5lIENhcHR1cmUgU3dpdGNoIiwKKwkJIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgIkFDOTcgTGluZSBDYXB0dXJlIFZvbHVtZSIsCisJCSJBdXggUGxheWJhY2sgU3dpdGNoIiwgIkFDOTcgQXV4IENhcHR1cmUgU3dpdGNoIiwKKwkJIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAiQUM5NyBBdXggQ2FwdHVyZSBWb2x1bWUiLAorCQkiTWljIFBsYXliYWNrIFN3aXRjaCIsICJBQzk3IE1pYyBDYXB0dXJlIFN3aXRjaCIsCisJCSJNaWMgUGxheWJhY2sgVm9sdW1lIiwgIkFDOTcgTWljIENhcHR1cmUgVm9sdW1lIiwKKwkJIk1pYyBTZWxlY3QiLCAiQUM5NyBNaWMgU2VsZWN0IiwKKwkJIk1pYyBCb29zdCAoKzIwZEIpIiwgIkFDOTcgTWljIEJvb3N0ICgrMjBkQikiLAorCQlOVUxMCisJfTsKKyNpZiAxCisJZm9yIChjPWNhMDEwNl9yZW1vdmVfY3RsczsgKmM7IGMrKykKKwkJcmVtb3ZlX2N0bChjYXJkLCAqYyk7CisJZm9yIChjPWNhMDEwNl9yZW5hbWVfY3RsczsgKmM7IGMgKz0gMikKKwkJcmVuYW1lX2N0bChjYXJkLCBjWzBdLCBjWzFdKTsKKyNlbmRpZgorCisgICAgICAgIGlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9hbmFsb2dfZnJvbnQsIGVtdSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9hbmFsb2dfcmVhciwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ19jZW50ZXJfbGZlLCBlbXUpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9jYTAxMDZfdm9sdW1lX2NvbnRyb2xfYW5hbG9nX3Vua25vd24sIGVtdSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9zcGRpZl9mcm9udCwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX3NwZGlmX3JlYXIsIGVtdSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl92b2x1bWVfY29udHJvbF9zcGRpZl9jZW50ZXJfbGZlLCBlbXUpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9jYTAxMDZfdm9sdW1lX2NvbnRyb2xfc3BkaWZfdW5rbm93biwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X3ZvbHVtZV9jb250cm9sX2ZlZWRiYWNrLCBlbXUpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl9zcGRpZl9tYXNrX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl9zaGFyZWRfc3BkaWYsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZSwgZW11KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCXJldHVybiBlcnI7CisJaWYgKChrY3RsID0gY3RsX2ZpbmQoY2FyZCwgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpKSkgIT0gTlVMTCkgeworCQkvKiBhbHJlYWR5IGRlZmluZWQgYnkgYWM5NywgcmVtb3ZlIGl0ICovCisJCS8qIEZJWE1FOiBvciBkbyB3ZSBuZWVkIGJvdGggY29udHJvbHM/ICovCisJCXJlbW92ZV9jdGwoY2FyZCwgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpKTsKKwl9CisJaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X3NwZGlmX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfcHJvYy5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjcxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9wcm9jLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0IEphbWVzIENvdXJ0aWVyLUR1dHRvbiA8SmFtZXNAc3VwZXJidWcuZGVtb24uY28udWs+CisgKiAgRHJpdmVyIENBMDEwNiBjaGlwcy4gZS5nLiBTb3VuZCBCbGFzdGVyIEF1ZGlneSBMUyBhbmQgTGl2ZSAyNGJpdAorICogIFZlcnNpb246IDAuMC4xNworICoKKyAqICBGRUFUVVJFUyBjdXJyZW50bHkgc3VwcG9ydGVkOgorICogICAgU2VlIGNhMDEwNl9tYWluLmMgZm9yIGZlYXR1cmVzLgorICogCisgKiAgQ2hhbmdlbG9nOgorICogICAgU3VwcG9ydCBpbnRlcnJ1cHRzIHBlciBwZXJpb2QuCisgKiAgICBSZW1vdmVkIG5vaXNlIGZyb20gQ2VudGVyL0xGRSBjaGFubmVsIHdoZW4gaW4gQW5hbG9nIG1vZGUuCisgKiAgICBSZW5hbWUgYW5kIHJlbW92ZSBtaXhlciBjb250cm9scy4KKyAqICAwLjAuNgorICogICAgVXNlIHNlcGFyYXRlIGNhcmQgYmFzZWQgRE1BIGJ1ZmZlciBmb3IgcGVyaW9kcyB0YWJsZSBsaXN0LgorICogIDAuMC43CisgKiAgICBDaGFuZ2UgcmVtb3ZlIGFuZCByZW5hbWUgY3RybHMgaW50byBsaXN0cy4KKyAqICAwLjAuOAorICogICAgVHJ5IHRvIGZpeCBjYXB0dXJlIHNvdXJjZXMuCisgKiAgMC4wLjkKKyAqICAgIEZpeCBBQzMgb3V0cHV0LgorICogICAgRW5hYmxlIFMzMl9MRSBmb3JtYXQgc3VwcG9ydC4KKyAqICAwLjAuMTAKKyAqICAgIEVuYWJsZSBwbGF5YmFjayA0ODAwMCBhbmQgOTYwMDAgcmF0ZXMuIChSYXRlcyBvdGhlciB0aGF0IHRoZXNlIGRvIG5vdCB3b3JrLCBldmVuIHdpdGggInBsdWc6ZnJvbnQiLikKKyAqICAwLjAuMTEKKyAqICAgIEFkZCBNb2RlbCBuYW1lIHJlY29nbml0aW9uLgorICogIDAuMC4xMgorICogICAgQ29ycmVjdCBpbnRlcnJ1cHQgdGltaW5nLiBpbnRlcnJ1cHQgYXQgZW5kIG9mIHBlcmlvZCwgaW5zdGVhZCBvZiBpbiB0aGUgbWlkZGxlIG9mIGEgcGxheWJhY2sgcGVyaW9kLgorICogICAgUmVtb3ZlIHJlZHVuZGVudCAidm9pY2UiIGhhbmRsaW5nLgorICogIDAuMC4xMworICogICAgU2luZ2xlIHRyaWdnZXIgY2FsbCBmb3IgbXVsdGkgY2hhbm5lbHMuCisgKiAgMC4wLjE0CisgKiAgICBTZXQgbGltaXRzIGJhc2VkIG9uIHdoYXQgdGhlIHNvdW5kIGNhcmQgaGFyZHdhcmUgY2FuIGRvLgorICogICAgcGxheWJhY2sgcGVyaW9kc19taW49MiwgcGVyaW9kc19tYXg9OAorICogICAgY2FwdHVyZSBodyBjb25zdHJhaW50cyByZXF1aXJlIHBlcmlvZF9zaXplID0gbiAqIDY0IGJ5dGVzLgorICogICAgcGxheWJhY2sgaHcgY29uc3RyYWludHMgcmVxdWlyZSBwZXJpb2Rfc2l6ZSA9IG4gKiA2NCBieXRlcy4KKyAqICAwLjAuMTUKKyAqICAgIFNlcGFyYXRlIGNhMDEwNi5jIGludG8gc2VwYXJhdGUgZnVuY3Rpb25hbCAuYyBmaWxlcy4KKyAqICAwLjAuMTYKKyAqICAgIE1vZGlmaWVkIENvcHlyaWdodCBtZXNzYWdlLgorICogIDAuMC4xNworICogICAgQWRkIGllYzk1OCBmaWxlIGluIHByb2MgZmlsZSBzeXN0ZW0gdG8gc2hvdyBzdGF0dXMgb2YgU1BESUYgaW4uCisgKiAgICAKKyAqICBUaGlzIGNvZGUgd2FzIGluaXRhbGx5IGJhc2VkIG9uIGNvZGUgZnJvbSBBTFNBJ3MgZW11MTBrMXguYyB3aGljaCBpczoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEZyYW5jaXNjbyBNb3JhZXMgPGZtb3JhZXNAbmMucnIuY29tPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KKworI2luY2x1ZGUgImNhMDEwNi5oIgorCisKK3N0cnVjdCBzbmRfY2EwMTA2X2NhdGVnb3J5X3N0ciB7CisJaW50IHZhbDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfY2EwMTA2X2NhdGVnb3J5X3N0ciBzbmRfY2EwMTA2X2Nvbl9jYXRlZ29yeVtdID0geworCXsgSUVDOTU4X0FFUzFfQ09OX0RBVCwgIkRBVCIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9WQ1IsICJWQ1IiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fTUlDUk9QSE9ORSwgIm1pY3JvcGhvbmUiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fU1lOVEhFU0laRVIsICJzeW50aGVzaXplciIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9SQVRFX0NPTlZFUlRFUiwgInJhdGUgY29udmVydGVyIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX01JWEVSLCAibWl4ZXIiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fU0FNUExFUiwgInNhbXBsZXIiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fUENNX0NPREVSLCAiUENNIGNvZGVyIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX0lFQzkwOF9DRCwgIkNEIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX05PTl9JRUM5MDhfQ0QsICJub24tSUVDOTA4IENEIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX0dFTkVSQUwsICJnZW5lcmFsIiB9LAorfTsKKworCit2b2lkIHNuZF9jYTAxMDZfcHJvY19kdW1wX2llYzk1OCggc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlciwgdTMyIHZhbHVlKQoreworCWludCBpOworCXUzMiBzdGF0dXNbNF07CisJc3RhdHVzWzBdID0gdmFsdWUgJiAweGZmOworCXN0YXR1c1sxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisJc3RhdHVzWzJdID0gKHZhbHVlID4+IDE2KSAgJiAweGZmOworCXN0YXR1c1szXSA9ICh2YWx1ZSA+PiAyNCkgICYgMHhmZjsKKwkKKwlpZiAoISAoc3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSkgeworCQkvKiBjb25zdW1lciAqLworCQlzbmRfaXByaW50ZihidWZmZXIsICJNb2RlOiBjb25zdW1lclxuIik7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkRhdGE6ICIpOworCQlpZiAoIShzdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9OT05BVURJTykpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgImF1ZGlvXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm5vbi1hdWRpb1xuIik7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUmF0ZTogIik7CisJCXN3aXRjaCAoc3RhdHVzWzNdICYgSUVDOTU4X0FFUzNfQ09OX0ZTKSB7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ0MTAwOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiNDQxMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiNDgwMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzMyMDAwOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiMzIwMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJ1bmtub3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNvcHlyaWdodDogIik7CisJCWlmIChzdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9DT05fTk9UX0NPUFlSSUdIVCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAicGVybWl0dGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInByb3RlY3RlZFxuIik7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiRW1waGFzaXM6ICIpOworCQlpZiAoKHN0YXR1c1swXSAmIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUykgIT0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm5vbmVcbiIpOworCQl9IGVsc2UgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiNTAvMTV1c1xuIik7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQ2F0ZWdvcnk6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfY2EwMTA2X2Nvbl9jYXRlZ29yeSk7IGkrKykgeworCQkJaWYgKChzdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9DT05fQ0FURUdPUlkpID09IHNuZF9jYTAxMDZfY29uX2NhdGVnb3J5W2ldLnZhbCkgeworCQkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBzbmRfY2EwMTA2X2Nvbl9jYXRlZ29yeVtpXS5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA+PSBBUlJBWV9TSVpFKHNuZF9jYTAxMDZfY29uX2NhdGVnb3J5KSkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAidW5rbm93biAweCV4XG4iLCBzdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9DT05fQ0FURUdPUlkpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk9yaWdpbmFsOiAiKTsKKwkJaWYgKHN0YXR1c1sxXSAmIElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAib3JpZ2luYWxcbiIpOworCQl9IGVsc2UgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiMXN0IGdlbmVyYXRpb25cbiIpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNsb2NrOiAiKTsKKwkJc3dpdGNoIChzdGF0dXNbM10gJiBJRUM5NThfQUVTM19DT05fQ0xPQ0spIHsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfMTAwMFBQTToKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjEwMDAgcHBtXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9DTE9DS181MFBQTToKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjUwIHBwbVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfVkFSSUFCTEU6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJ2YXJpYWJsZSBwaXRjaFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInVua25vd25cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJNb2RlOiBwcm9mZXNzaW9uYWxcbiIpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJEYXRhOiAiKTsKKwkJaWYgKCEoc3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJhdWRpb1xuIik7CisJCX0gZWxzZSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJub24tYXVkaW9cbiIpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJhdGU6ICIpOworCQlzd2l0Y2ggKHN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST19GUykgeworCQljYXNlIElFQzk1OF9BRVMwX1BST19GU180NDEwMDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjQ0MTAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMwX1BST19GU180ODAwMDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjQ4MDAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMwX1BST19GU18zMjAwMDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjMyMDAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAidW5rbm93blxuIik7CisJCQlicmVhazsKKwkJfQorCQlzbmRfaXByaW50ZihidWZmZXIsICJSYXRlIExvY2tlZDogIik7CisJCWlmIChzdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9fRlJFUV9VTkxPQ0tFRCkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm5vXG4iKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAieWVzXG4iKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiRW1waGFzaXM6ICIpOworCQlzd2l0Y2ggKHN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST19FTVBIQVNJUykgeworCQljYXNlIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19DQ0lUVDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNDSVRUIEouMTdcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTX05PTkU6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJub25lXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiNTAvMTV1c1xuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfTk9USUQ6CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJ1bmtub3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN0ZXJlb3Bob25pYzogIik7CisJCWlmICgoc3RhdHVzWzFdICYgSUVDOTU4X0FFUzFfUFJPX01PREUpID09IElFQzk1OF9BRVMxX1BST19NT0RFX1NURVJFT1BIT05JQykgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAic3RlcmVvXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm5vdCBpbmRpY2F0ZWRcbiIpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlVzZXJiaXRzOiAiKTsKKwkJc3dpdGNoIChzdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFMpIHsKKwkJY2FzZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfMTkyOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiMTkyYml0XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMxX1BST19VU0VSQklUU19VREVGOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAidXNlci1kZWZpbmVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAidW5rb3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNhbXBsZSBCaXRzOiAiKTsKKwkJc3dpdGNoIChzdGF0dXNbMl0gJiBJRUM5NThfQUVTMl9QUk9fU0JJVFMpIHsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfMjA6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIyMCBiaXRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzJfUFJPX1NCSVRTXzI0OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiMjQgYml0XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMyX1BST19TQklUU19VREVGOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAidXNlciBkZWZpbmVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAidW5rbm93blxuIik7CisJCQlicmVhazsKKwkJfQorCQlzbmRfaXByaW50ZihidWZmZXIsICJXb3JkIExlbmd0aDogIik7CisJCXN3aXRjaCAoc3RhdHVzWzJdICYgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU4pIHsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMl8xODoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjIyIGJpdCBvciAxOCBiaXRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fMjNfMTk6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIyMyBiaXQgb3IgMTkgYml0XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMyX1BST19XT1JETEVOXzI0XzIwOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiMjQgYml0IG9yIDIwIGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMF8xNjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjIwIGJpdCBvciAxNiBiaXRcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJ1bmtub3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfY2EwMTA2X3Byb2NfaWVjOTU4KHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY2EwMTA2X3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdTMyIHZhbHVlOworCisgICAgICAgIHZhbHVlID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIFNBTVBMRV9SQVRFX1RSQUNLRVJfU1RBVFVTLCAwKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTdGF0dXM6ICVzLCAlcywgJXNcbiIsCisJCSAgKHZhbHVlICYgMHgxMDAwMDApID8gIlJhdGUgTG9ja2VkIiA6ICJOb3QgUmF0ZSBMb2NrZWQiLAorCQkgICh2YWx1ZSAmIDB4MjAwMDAwKSA/ICJTUERJRiBMb2NrZWQiIDogIk5vIFNQRElGIExvY2siLAorCQkgICh2YWx1ZSAmIDB4NDAwMDAwKSA/ICJBdWRpbyBWYWxpZCIgOiAiTm8gdmFsaWQgYXVkaW8iICk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRXN0aW1hdGVkIHNhbXBsZSByYXRlOiAldVxuIiwgCisJCSAgKCh2YWx1ZSAmIDB4ZmZmZmYpICogNDgwMDApIC8gMHg4MDAwICk7CisJaWYgKHZhbHVlICYgMHgyMDAwMDApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4L1NQRElGIGlucHV0IHN0YXR1czpcbiIpOworICAgICAgICAJdmFsdWUgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgU1BESUZfSU5QVVRfU1RBVFVTLCAwKTsKKwkJc25kX2NhMDEwNl9wcm9jX2R1bXBfaWVjOTU4KGJ1ZmZlciwgdmFsdWUpOworCX0KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jYTAxMDZfcHJvY19yZWdfd3JpdGUzMihzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICAgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNhMDEwNl90ICplbXUgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGNoYXIgbGluZVs2NF07CisgICAgICAgIHUzMiByZWcsIHZhbDsKKyAgICAgICAgd2hpbGUgKCFzbmRfaW5mb19nZXRfbGluZShidWZmZXIsIGxpbmUsIHNpemVvZihsaW5lKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKGxpbmUsICIleCAleCIsICZyZWcsICZ2YWwpICE9IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlZyA8IDB4NDApICYmIChyZWcgPj0wKSAmJiAodmFsIDw9IDB4ZmZmZmZmZmYpICkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJCW91dGwodmFsLCBlbXUtPnBvcnQgKyAocmVnICYgMHhmZmZmZmZmYykpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQl9CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkMzIoc25kX2luZm9fZW50cnlfdCAqZW50cnksIAorCQkJCSAgICAgICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwljYTAxMDZfdCAqZW11ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiUmVnaXN0ZXJzOlxuXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCAweDIwOyBpKz00KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXZhbHVlID0gaW5sKGVtdS0+cG9ydCArIGkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJlZ2lzdGVyICUwMlg6ICUwOGxYXG4iLCBpLCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQxNihzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICAgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNhMDEwNl90ICplbXUgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJSZWdpc3RlcnM6XG5cbiIpOworCWZvcihpID0gMDsgaSA8IDB4MjA7IGkrPTIpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJdmFsdWUgPSBpbncoZW11LT5wb3J0ICsgaSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUmVnaXN0ZXIgJTAyWDogJTA0WFxuIiwgaSwgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkOChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICAgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNhMDEwNl90ICplbXUgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJlZ2lzdGVyczpcblxuIik7CisJZm9yKGkgPSAwOyBpIDwgMHgyMDsgaSs9MSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQl2YWx1ZSA9IGluYihlbXUtPnBvcnQgKyBpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJSZWdpc3RlciAlMDJYOiAlMDJYXG4iLCBpLCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQxKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY2EwMTA2X3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgaSxqOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiUmVnaXN0ZXJzXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCAweDQwOyBpKyspIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyWDogIixpKTsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgaSwgaik7CisJCSAgc25kX2lwcmludGYoYnVmZmVyLCAiJTA4bFggIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQyKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY2EwMTA2X3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgaSxqOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiUmVnaXN0ZXJzXG4iKTsKKwlmb3IoaSA9IDB4NDA7IGkgPCAweDgwOyBpKyspIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyWDogIixpKTsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGVtdSwgaSwgaik7CisJCSAgc25kX2lwcmludGYoYnVmZmVyLCAiJTA4bFggIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfY2EwMTA2X3Byb2NfcmVnX3dyaXRlKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY2EwMTA2X3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisgICAgICAgIGNoYXIgbGluZVs2NF07CisgICAgICAgIHVuc2lnbmVkIGludCByZWcsIGNoYW5uZWxfaWQgLCB2YWw7CisgICAgICAgIHdoaWxlICghc25kX2luZm9fZ2V0X2xpbmUoYnVmZmVyLCBsaW5lLCBzaXplb2YobGluZSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJXggJXggJXgiLCAmcmVnLCAmY2hhbm5lbF9pZCwgJnZhbCkgIT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICgocmVnIDwgMHg4MCkgJiYgKHJlZyA+PTApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgJiYgKGNoYW5uZWxfaWQgPj0wKSAmJiAoY2hhbm5lbF9pZCA8PSAzKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIHJlZywgY2hhbm5lbF9pZCwgdmFsKTsKKyAgICAgICAgfQorfQorCisKK2ludCBfX2RldmluaXQgc25kX2NhMDEwNl9wcm9jX2luaXQoY2EwMTA2X3QgKiBlbXUpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJCisJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJpZWM5NTgiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2NhMDEwNl9wcm9jX2llYzk1OCk7CisJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJjYTAxMDZfcmVnMzIiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQzMik7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2NhMDEwNl9wcm9jX3JlZ193cml0ZTMyOworCX0KKwlpZighIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImNhMDEwNl9yZWcxNiIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQxNik7CisJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJjYTAxMDZfcmVnOCIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQ4KTsKKwlpZighIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImNhMDEwNl9yZWdzMSIsICZlbnRyeSkpIHsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDEwMjQsIHNuZF9jYTAxMDZfcHJvY19yZWdfcmVhZDEpOworCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKKwkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9jYTAxMDZfcHJvY19yZWdfd3JpdGU7CisvLwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGVtdTsKKwl9CisJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJjYTAxMDZfcmVnczIiLCAmZW50cnkpKSAKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDEwMjQsIHNuZF9jYTAxMDZfcHJvY19yZWdfcmVhZDIpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY21pcGNpLmMgYi9zb3VuZC9wY2kvY21pcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzMjA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9jbWlwY2kuYwpAQCAtMCwwICsxLDI5NTYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEMtTWVkaWEgQ01JODMzOCBhbmQgODczOCBQQ0kgc291bmRjYXJkcy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBieSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisgCisvKiBEb2VzIG5vdCB3b3JrLiBXYXJuaW5nIG1heSBibG9jayBzeXN0ZW0gaW4gY2FwdHVyZSBtb2RlICovCisvKiAjZGVmaW5lIFVTRV9WQVI0OEtSQVRFICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KKyNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CisjaW5jbHVkZSA8c291bmQvc2IuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDLU1lZGlhIENNSTh4MzggUENJIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDLU1lZGlhLENNSTg3Mzh9LCIKKwkJIntDLU1lZGlhLENNSTg3MzhCfSwiCisJCSJ7Qy1NZWRpYSxDTUk4MzM4QX0sIgorCQkie0MtTWVkaWEsQ01JODMzOEJ9fSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgc3dpdGNoZXMgKi8KK3N0YXRpYyBsb25nIG1wdV9wb3J0W1NORFJWX0NBUkRTXTsKK3N0YXRpYyBsb25nIGZtX3BvcnRbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBzb2Z0X2FjM1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV09MX07CisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworc3RhdGljIGludCBqb3lzdGlja19wb3J0W1NORFJWX0NBUkRTXTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEMtTWVkaWEgUENJIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgQy1NZWRpYSBQQ0kgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBDLU1lZGlhIFBDSSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobXB1X3BvcnQsIGxvbmcsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShmbV9wb3J0LCBsb25nLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm1fcG9ydCwgIkZNIHBvcnQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoc29mdF9hYzMsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzb2Z0X2FjMywgIlNvZndhcmUtY29udmVyc2lvbiBvZiByYXcgU1BESUYgcGFja2V0cyAobW9kZWwgMDMzIG9ubHkpLiIpOworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK21vZHVsZV9wYXJhbV9hcnJheShqb3lzdGlja19wb3J0LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhqb3lzdGlja19wb3J0LCAiSm95c3RpY2sgcG9ydCBhZGRyZXNzLiIpOworI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOAkweDAxMTEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIJMHgwMTEyCisjZW5kaWYKKworLyoKKyAqIENNOHgzOCByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQ01fUkVHX0ZVTkNUUkwwCQkweDAwCisjZGVmaW5lIENNX1JTVF9DSDEJCTB4MDAwODAwMDAKKyNkZWZpbmUgQ01fUlNUX0NIMAkJMHgwMDA0MDAwMAorI2RlZmluZSBDTV9DSEVOMQkJMHgwMDAyMDAwMAkvKiBjaDE6IGVuYWJsZSAqLworI2RlZmluZSBDTV9DSEVOMAkJMHgwMDAxMDAwMAkvKiBjaDA6IGVuYWJsZSAqLworI2RlZmluZSBDTV9QQVVTRTEJCTB4MDAwMDAwMDgJLyogY2gxOiBwYXVzZSAqLworI2RlZmluZSBDTV9QQVVTRTAJCTB4MDAwMDAwMDQJLyogY2gwOiBwYXVzZSAqLworI2RlZmluZSBDTV9DSEFEQzEJCTB4MDAwMDAwMDIJLyogY2gxLCAwOnBsYXliYWNrLCAxOnJlY29yZCAqLworI2RlZmluZSBDTV9DSEFEQzAJCTB4MDAwMDAwMDEJLyogY2gwLCAwOnBsYXliYWNrLCAxOnJlY29yZCAqLworCisjZGVmaW5lIENNX1JFR19GVU5DVFJMMQkJMHgwNAorI2RlZmluZSBDTV9BU0ZDX01BU0sJCTB4MDAwMEUwMDAJLyogQURDIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLworI2RlZmluZSBDTV9BU0ZDX1NISUZUCQkxMworI2RlZmluZSBDTV9EU0ZDX01BU0sJCTB4MDAwMDFDMDAJLyogREFDIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLworI2RlZmluZSBDTV9EU0ZDX1NISUZUCQkxMAorI2RlZmluZSBDTV9TUERGXzEJCTB4MDAwMDAyMDAJLyogU1BESUYgSU4vT1VUIGF0IGNoYW5uZWwgQiAqLworI2RlZmluZSBDTV9TUERGXzAJCTB4MDAwMDAxMDAJLyogU1BESUYgT1VUIG9ubHkgY2hhbm5lbCBBICovCisjZGVmaW5lIENNX1NQREZMT09QCQkweDAwMDAwMDgwCS8qIGV4dC4gU1BESUlGL09VVCAtPiBJTiBsb29wYmFjayAqLworI2RlZmluZSBDTV9TUERPMkRBQwkJMHgwMDAwMDA0MAkvKiBTUERJRi9PVVQgY2FuIGJlIGhlYXJkIGZyb20gaW50ZXJuYWwgREFDICovCisjZGVmaW5lIENNX0lOVFJNCQkweDAwMDAwMDIwCS8qIG1hc3RlciBjb250cm9sIGJsb2NrIChNQ0IpIGludGVycnVwdCBlbmFibGVkICovCisjZGVmaW5lIENNX0JSRVEJCQkweDAwMDAwMDEwCS8qIGJ1cyBtYXN0ZXIgZW5hYmxlZCAqLworI2RlZmluZSBDTV9WT0lDRV9FTgkJMHgwMDAwMDAwOAkvKiBsZWdhY3kgdm9pY2UgKFNCMTYsRk0pICovCisjZGVmaW5lIENNX1VBUlRfRU4JCTB4MDAwMDAwMDQJLyogVUFSVCAqLworI2RlZmluZSBDTV9KWVNUS19FTgkJMHgwMDAwMDAwMgkvKiBqb3kgc3RpY2sgKi8KKworI2RlZmluZSBDTV9SRUdfQ0hGT1JNQVQJCTB4MDgKKworI2RlZmluZSBDTV9DSEIzRDVDCQkweDgwMDAwMDAwCS8qIDUsNiBjaGFubmVscyAqLworI2RlZmluZSBDTV9DSEIzRAkJMHgyMDAwMDAwMAkvKiA0IGNoYW5uZWxzICovCisKKyNkZWZpbmUgQ01fQ0hJUF9NQVNLMQkJMHgxZjAwMDAwMAorI2RlZmluZSBDTV9DSElQXzAzNwkJMHgwMTAwMDAwMAorCisjZGVmaW5lIENNX1NQRElGX1NFTEVDVDEJMHgwMDA4MDAwMAkvKiBmb3IgbW9kZWwgPD0gMDM3ID8gKi8KKyNkZWZpbmUgQ01fQUMzRU4xCQkweDAwMTAwMDAwCS8qIGVuYWJsZSBBQzM6IG1vZGVsIDAzNyAqLworI2RlZmluZSBDTV9TUEQyNFNFTAkJMHgwMDAyMDAwMAkvKiAyNGJpdCBzcGRpZjogbW9kZWwgMDM3ICovCisvKiAjZGVmaW5lIENNX1NQRElGX0lOVkVSU0UJMHgwMDAxMDAwMCAqLyAvKiA/Pz8gKi8KKworI2RlZmluZSBDTV9BRENCSVRMRU5fTUFTSwkweDAwMDBDMDAwCQorI2RlZmluZSBDTV9BRENCSVRMRU5fMTYJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ01fQURDQklUTEVOXzE1CQkweDAwMDA0MDAwCisjZGVmaW5lIENNX0FEQ0JJVExFTl8xNAkJMHgwMDAwODAwMAorI2RlZmluZSBDTV9BRENCSVRMRU5fMTMJCTB4MDAwMEMwMDAKKworI2RlZmluZSBDTV9BRENEQUNMRU5fTUFTSwkweDAwMDAzMDAwCisjZGVmaW5lIENNX0FEQ0RBQ0xFTl8wNjAJMHgwMDAwMDAwMAorI2RlZmluZSBDTV9BRENEQUNMRU5fMDY2CTB4MDAwMDEwMDAKKyNkZWZpbmUgQ01fQURDREFDTEVOXzEzMAkweDAwMDAyMDAwCisjZGVmaW5lIENNX0FEQ0RBQ0xFTl8yODAJMHgwMDAwMzAwMAorCisjZGVmaW5lIENNX0NIMV9TUkFURV8xNzZLCTB4MDAwMDA4MDAKKyNkZWZpbmUgQ01fQ0gxX1NSQVRFXzg4SwkweDAwMDAwNDAwCisjZGVmaW5lIENNX0NIMF9TUkFURV8xNzZLCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ01fQ0gwX1NSQVRFXzg4SwkweDAwMDAwMTAwCisKKyNkZWZpbmUgQ01fU1BESUZfSU5WRVJTRTIJMHgwMDAwMDA4MAkvKiBtb2RlbCAwNTU/ICovCisKKyNkZWZpbmUgQ01fQ0gxRk1UX01BU0sJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ01fQ0gxRk1UX1NISUZUCQkyCisjZGVmaW5lIENNX0NIMEZNVF9NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIENNX0NIMEZNVF9TSElGVAkJMAorCisjZGVmaW5lIENNX1JFR19JTlRfSExEQ0xSCTB4MEMKKyNkZWZpbmUgQ01fQ0hJUF9NQVNLMgkJMHhmZjAwMDAwMAorI2RlZmluZSBDTV9DSElQXzAzOQkJMHgwNDAwMDAwMAorI2RlZmluZSBDTV9DSElQXzAzOV82Q0gJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ01fQ0hJUF8wNTUJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01fQ0hJUF84NzY4CQkweDIwMDAwMDAwCisjZGVmaW5lIENNX1RETUFfSU5UX0VOCQkweDAwMDQwMDAwCisjZGVmaW5lIENNX0NIMV9JTlRfRU4JCTB4MDAwMjAwMDAKKyNkZWZpbmUgQ01fQ0gwX0lOVF9FTgkJMHgwMDAxMDAwMAorI2RlZmluZSBDTV9JTlRfSE9MRAkJMHgwMDAwMDAwMgorI2RlZmluZSBDTV9JTlRfQ0xFQVIJCTB4MDAwMDAwMDEKKworI2RlZmluZSBDTV9SRUdfSU5UX1NUQVRVUwkweDEwCisjZGVmaW5lIENNX0lOVFIJCQkweDgwMDAwMDAwCisjZGVmaW5lIENNX1ZDTwkJCTB4MDgwMDAwMDAJLyogVm9pY2UgQ29udHJvbD8gQ01JODczOCAqLworI2RlZmluZSBDTV9NQ0JJTlQJCTB4MDQwMDAwMDAJLyogTWFzdGVyIENvbnRyb2wgQmxvY2sgYWJvcnQgY29uZC4/ICovCisjZGVmaW5lIENNX1VBUlRJTlQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ01fTFRETUFJTlQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgQ01fSFRETUFJTlQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ01fWERPNDYJCTB4MDAwMDAwODAJLyogTW9kZWxsIDAzMz8gRGlyZWN0IHByb2dyYW1taW5nIEVFUFJPTSAocmVhZCBkYXRhIHJlZ2lzdGVyKSAqLworI2RlZmluZSBDTV9MSEJUT0cJCTB4MDAwMDAwNDAJLyogSGlnaC9Mb3cgc3RhdHVzIGZyb20gRE1BIGN0cmwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ01fTEVHX0hETUEJCTB4MDAwMDAwMjAJLyogTGVnYWN5IGlzIGluIEhpZ2ggRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ01fTEVHX1NURVJFTwkJMHgwMDAwMDAxMAkvKiBMZWdhY3kgaXMgaW4gU3RlcmVvIG1vZGUgKi8KKyNkZWZpbmUgQ01fQ0gxQlVTWQkJMHgwMDAwMDAwOAorI2RlZmluZSBDTV9DSDBCVVNZCQkweDAwMDAwMDA0CisjZGVmaW5lIENNX0NISU5UMQkJMHgwMDAwMDAwMgorI2RlZmluZSBDTV9DSElOVDAJCTB4MDAwMDAwMDEKKworI2RlZmluZSBDTV9SRUdfTEVHQUNZX0NUUkwJMHgxNAorI2RlZmluZSBDTV9OWENIRwkJMHg4MDAwMDAwMAkvKiBoL3cgbXVsdGkgY2hhbm5lbHM/ICovCisjZGVmaW5lIENNX1ZNUFVfTUFTSwkJMHg2MDAwMDAwMAkvKiBNUFU0MDEgaS9vIHBvcnQgYWRkcmVzcyAqLworI2RlZmluZSBDTV9WTVBVXzMzMAkJMHgwMDAwMDAwMAorI2RlZmluZSBDTV9WTVBVXzMyMAkJMHgyMDAwMDAwMAorI2RlZmluZSBDTV9WTVBVXzMxMAkJMHg0MDAwMDAwMAorI2RlZmluZSBDTV9WTVBVXzMwMAkJMHg2MDAwMDAwMAorI2RlZmluZSBDTV9WU0JTRUxfTUFTSwkJMHgwQzAwMDAwMAkvKiBTQjE2IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDTV9WU0JTRUxfMjIwCQkweDAwMDAwMDAwCisjZGVmaW5lIENNX1ZTQlNFTF8yNDAJCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ01fVlNCU0VMXzI2MAkJMHgwODAwMDAwMAorI2RlZmluZSBDTV9WU0JTRUxfMjgwCQkweDBDMDAwMDAwCisjZGVmaW5lIENNX0ZNU0VMX01BU0sJCTB4MDMwMDAwMDAJLyogRk0gT1BMMyBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ01fRk1TRUxfMzg4CQkweDAwMDAwMDAwCisjZGVmaW5lIENNX0ZNU0VMXzNDOAkJMHgwMTAwMDAwMAorI2RlZmluZSBDTV9GTVNFTF8zRTAJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQ01fRk1TRUxfM0U4CQkweDAzMDAwMDAwCisjZGVmaW5lIENNX0VOU1BET1VUCQkweDAwODAwMDAwCS8qIGVuYWJsZSBYUERJRi9PVVQgdG8gSS9PIGludGVyZmFjZSAqLworI2RlZmluZSBDTV9TUERDT1BZUkhUCQkweDAwNDAwMDAwCS8qIHNldCBjb3B5cmlnaHQgc3BkaWYgaW4vb3V0ICovCisjZGVmaW5lIENNX0RBQzJTUERPCQkweDAwMjAwMDAwCS8qIGVuYWJsZSB3YXZlK2ZtX21pZGkgLT4gU1BESUYvT1VUICovCisjZGVmaW5lIENNX1NFVFJFVFJZCQkweDAwMDEwMDAwCS8qIDA6IGxlZ2FjeSBpL28gd2FpdCAoZGVmYXVsdCksIDE6IGxlZ2FjeSBpL28gYnVzIHJldHJ5ICovCisjZGVmaW5lIENNX0NIQjNENkMJCTB4MDAwMDgwMDAJLyogNS4xIGNoYW5uZWxzIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ01fTElORV9BU19CQVNTCQkweDAwMDA2MDAwCS8qIHVzZSBsaW5lLWluIGFzIGJhc3MgKi8KKworI2RlZmluZSBDTV9SRUdfTUlTQ19DVFJMCTB4MTgKKyNkZWZpbmUgQ01fUFdECQkJMHg4MDAwMDAwMAorI2RlZmluZSBDTV9SRVNFVAkJMHg0MDAwMDAwMAorI2RlZmluZSBDTV9TRklMX01BU0sJCTB4MzAwMDAwMDAKKyNkZWZpbmUgQ01fVFhWWAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01fTjRTUEszRAkJMHgwNDAwMDAwMAkvKiA0Y2ggb3V0cHV0ICovCisjZGVmaW5lIENNX1NQRE81VgkJMHgwMjAwMDAwMAkvKiA1ViBzcGRpZiBvdXRwdXQgKDEgPSAwLjV2IChjb2F4KSkgKi8KKyNkZWZpbmUgQ01fU1BESUY0OEsJCTB4MDEwMDAwMDAJLyogd3JpdGUgKi8KKyNkZWZpbmUgQ01fU1BBVFVTNDhLCQkweDAxMDAwMDAwCS8qIHJlYWQgKi8KKyNkZWZpbmUgQ01fRU5EQkRBQwkJMHgwMDgwMDAwMAkvKiBlbmFibGUgZHVhbCBkYWMgKi8KKyNkZWZpbmUgQ01fWENIR0RBQwkJMHgwMDQwMDAwMAkvKiAwOiBmcm9udD1jaDAsIDE6IGZyb250PWNoMSAqLworI2RlZmluZSBDTV9TUEQzMlNFTAkJMHgwMDIwMDAwMAkvKiAwOiAxNmJpdCBTUERJRiwgMTogMzJiaXQgKi8KKyNkZWZpbmUgQ01fU1BERkxPT1BJCQkweDAwMTAwMDAwCS8qIGludC4gU1BESUYtSU4gLT4gaW50LiBPVVQgKi8KKyNkZWZpbmUgQ01fRk1fRU4JCTB4MDAwODAwMDAJLyogZW5hbGJlIEZNICovCisjZGVmaW5lIENNX0FDM0VOMgkJMHgwMDA0MDAwMAkvKiBlbmFibGUgQUMzOiBtb2RlbCAwMzkgKi8KKyNkZWZpbmUgQ01fVklEV1BEU0IJCTB4MDAwMTAwMDAgCisjZGVmaW5lIENNX1NQREZfQUM5NwkJMHgwMDAwODAwMAkvKiAwOiBTUERJRi9PVVQgNDQuMUssIDE6IDQ4SyAqLworI2RlZmluZSBDTV9NQVNLX0VOCQkweDAwMDA0MDAwCisjZGVmaW5lIENNX1ZJRFdQUFJUCQkweDAwMDAyMDAwCisjZGVmaW5lIENNX1NGSUxFTkIJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQ01fTU1PREVfTUFTSwkJMHgwMDAwMEUwMAorI2RlZmluZSBDTV9TUERJRl9TRUxFQ1QyCTB4MDAwMDAxMDAJLyogZm9yIG1vZGVsID4gMDM5ID8gKi8KKyNkZWZpbmUgQ01fRU5DRU5URVIJCTB4MDAwMDAwODAKKyNkZWZpbmUgQ01fRkxJTktPTgkJMHgwMDAwMDA0MAorI2RlZmluZSBDTV9GTElOS09GRgkJMHgwMDAwMDAyMAorI2RlZmluZSBDTV9NSURTTVAJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ01fVVBERE1BX01BU0sJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ01fVFdBSVRfTUFTSwkJMHgwMDAwMDAwMworCisJLyogYnl0ZSAqLworI2RlZmluZSBDTV9SRUdfTUlYRVIwCQkweDIwCisKKyNkZWZpbmUgQ01fUkVHX1NCMTZfREFUQQkweDIyCisjZGVmaW5lIENNX1JFR19TQjE2X0FERFIJMHgyMworCisjZGVmaW5lIENNX1JFRkZSRVFfWElOCQkoMzE1KjEwMDAqMTAwMCkvMjIJLyogMTQuMzE4MTggTWh6IHJlZmVyZW5jZSBjbG9jayBmcmVxdWVuY3kgcGluIFhJTiAqLworI2RlZmluZSBDTV9BRENNVUxUX1hJTgkJNTEyCQkJLyogR3Vlc3NlZCAoNDg3IGJlc3QgZm9yIDQ0LjFrSHosIG5vdCBmb3IgODgvMTc2a0h6KSAqLworI2RlZmluZSBDTV9UT0xFUkFOQ0VfUkFURQkwLjAwMQkJCS8qIFRvbGVyYW5jZSBzYW1wbGUgcmF0ZSBwaXRjaCAoMTAwMHBwbSkgKi8KKyNkZWZpbmUgQ01fTUFYSU1VTV9SQVRFCQk4MDAwMDAwMAkJLyogTm90ZSBtb3JlIHRoYW4gODBNSHogKi8KKworI2RlZmluZSBDTV9SRUdfTUlYRVIxCQkweDI0CisjZGVmaW5lIENNX0ZNTVVURQkJMHg4MAkvKiBtdXRlIEZNICovCisjZGVmaW5lIENNX0ZNTVVURV9TSElGVAkJNworI2RlZmluZSBDTV9XU01VVEUJCTB4NDAJLyogbXV0ZSBQQ00gKi8KKyNkZWZpbmUgQ01fV1NNVVRFX1NISUZUCQk2CisjZGVmaW5lIENNX1NQSzQJCQkweDIwCS8qIGxpbi1pbiAtPiByZWFyIGxpbmUgb3V0ICovCisjZGVmaW5lIENNX1NQSzRfU0hJRlQJCTUKKyNkZWZpbmUgQ01fUkVBUjJGUk9OVAkJMHgxMAkvKiBleGNoYW5nZSByZWFyL2Zyb250ICovCisjZGVmaW5lIENNX1JFQVIyRlJPTlRfU0hJRlQJNAorI2RlZmluZSBDTV9XQVZFSU5MCQkweDA4CS8qIGRpZ2l0YWwgd2F2ZSByZWMuIGxlZnQgY2hhbiAqLworI2RlZmluZSBDTV9XQVZFSU5MX1NISUZUCTMKKyNkZWZpbmUgQ01fV0FWRUlOUgkJMHgwNAkvKiBkaWdpY2FsIHdhdmUgcmVjLiByaWdodCAqLworI2RlZmluZSBDTV9XQVZFSU5SX1NISUZUCTIKKyNkZWZpbmUgQ01fWDNERU4JCTB4MDIJLyogM0Qgc3Vycm91bmQgZW5hYmxlICovCisjZGVmaW5lIENNX1gzREVOX1NISUZUCQkxCisjZGVmaW5lIENNX0NEUExBWQkJMHgwMQkvKiBlbmFibGUgU1BESUYvSU4gUENNIC0+IERBQyAqLworI2RlZmluZSBDTV9DRFBMQVlfU0hJRlQJCTAKKworI2RlZmluZSBDTV9SRUdfTUlYRVIyCQkweDI1CisjZGVmaW5lIENNX1JBVVhSRU4JCTB4ODAJLyogQVVYIHJpZ2h0IGNhcHR1cmUgKi8KKyNkZWZpbmUgQ01fUkFVWFJFTl9TSElGVAk3CisjZGVmaW5lIENNX1JBVVhMRU4JCTB4NDAJLyogQVVYIGxlZnQgY2FwdHVyZSAqLworI2RlZmluZSBDTV9SQVVYTEVOX1NISUZUCTYKKyNkZWZpbmUgQ01fVkFVWFJNCQkweDIwCS8qIEFVWCByaWdodCBtdXRlICovCisjZGVmaW5lIENNX1ZBVVhSTV9TSElGVAkJNQorI2RlZmluZSBDTV9WQVVYTE0JCTB4MTAJLyogQVVYIGxlZnQgbXV0ZSAqLworI2RlZmluZSBDTV9WQVVYTE1fU0hJRlQJCTQKKyNkZWZpbmUgQ01fVkFETUlDX01BU0sJCTB4MGUJLyogbWljIGdhaW4gbGV2ZWwgKDAtMykgPDwgMSAqLworI2RlZmluZSBDTV9WQURNSUNfU0hJRlQJCTEKKyNkZWZpbmUgQ01fTUlDR0FJTloJCTB4MDEJLyogbWljIGJvb3N0ICovCisjZGVmaW5lIENNX01JQ0dBSU5aX1NISUZUCTAKKworI2RlZmluZSBDTV9SRUdfQVVYX1ZPTAkJMHgyNgorI2RlZmluZSBDTV9WQVVYTF9NQVNLCQkweGYwCisjZGVmaW5lIENNX1ZBVVhSX01BU0sJCTB4MGYKKworI2RlZmluZSBDTV9SRUdfTUlTQwkJMHgyNworI2RlZmluZSBDTV9YR1BPMQkJMHgyMAorLy8gI2RlZmluZSBDTV9YR1BCSU8JCTB4MDQKKyNkZWZpbmUgQ01fTUlDX0NFTlRFUl9MRkUJMHgwNAkvKiBtaWMgYXMgY2VudGVyL2xmZSBvdXQ/IChtb2RlbCAwMzkgb3IgbGF0ZXI/KSAqLworI2RlZmluZSBDTV9TUERJRl9JTlZFUlNFCTB4MDQJLyogc3BkaWYgaW5wdXQgcGhhc2UgaW52ZXJzZSAobW9kZWwgMDM3KSAqLworI2RlZmluZSBDTV9TUERWQUxJRAkJMHgwMgkvKiBzcGRpZiBpbnB1dCB2YWxpZCBjaGVjayAqLworI2RlZmluZSBDTV9ETUFVVE8JCTB4MDEKKworI2RlZmluZSBDTV9SRUdfQUM5NwkJMHgyOAkvKiBobW1tLi4gZG8gd2UgaGF2ZSBhYzk3IGxpbms/ICovCisvKgorICogRm9yIENNSS04MzM4ICgweDI4IC0gMHgyYikgLi4gaXMgdGhpcyB2YWxpZCBmb3IgQ01JLTg3MzgKKyAqIG9yIGlkZW50aWNhbCB3aXRoIEFDOTcgY29kZWM/CisgKi8KKyNkZWZpbmUgQ01fUkVHX0VYVEVSTl9DT0RFQwlDTV9SRUdfQUM5NworCisvKgorICogTVBVNDAxIHBjaSBwb3J0IGluZGV4IGFkZHJlc3MgMHg0MCAtIDB4NGYgKENNSS04NzM4IHNwZWMgdmVyLiAwLjYpCisgKi8KKyNkZWZpbmUgQ01fUkVHX01QVV9QQ0kJCTB4NDAKKworLyoKKyAqIEZNIHBjaSBwb3J0IGluZGV4IGFkZHJlc3MgMHg1MCAtIDB4NWYgKENNSS04NzM4IHNwZWMgdmVyLiAwLjYpCisgKi8KKyNkZWZpbmUgQ01fUkVHX0ZNX1BDSQkJMHg1MAorCisvKgorICogZm9yIENNSS04MzM4IC4uIHRoaXMgaXMgbm90IHZhbGlkIGZvciBDTUktODczOC4KKyAqLworI2RlZmluZSBDTV9SRUdfRVhURU5UX0lORAkweGYwCisjZGVmaW5lIENNX1ZQSE9ORV9NQVNLCQkweGUwCS8qIFBob25lIHZvbHVtZSBjb250cm9sICgwLTMpIDw8IDUgKi8KKyNkZWZpbmUgQ01fVlBIT05FX1NISUZUCQk1CisjZGVmaW5lIENNX1ZQSE9NCQkweDEwCS8qIFBob25lIG11dGUgY29udHJvbCAqLworI2RlZmluZSBDTV9WU1BLTQkJMHgwOAkvKiBTcGVha2VyIG11dGUgY29udHJvbCwgZGVmYXVsdCBoaWdoICovCisjZGVmaW5lIENNX1JMT09QUkVOCQkweDA0ICAgIC8qIFJlYy4gUi1jaGFubmVsIGVuYWJsZSAqLworI2RlZmluZSBDTV9STE9PUExFTgkJMHgwMgkvKiBSZWMuIEwtY2hhbm5lbCBlbmFibGUgKi8KKworLyoKKyAqIENNSS04MzM4IHNwZWMgdmVyIDAuNSAodGhpcyBpcyBub3QgdmFsaWQgZm9yIENNSS04NzM4KToKKyAqIHRoZSA4IHJlZ2lzdGVycyAweGY4IC0gMHhmZiBhcmUgdXNlZCBmb3IgcHJvZ3JhbW1pbmcgbS9uIGNvdW50ZXIgYnkgdGhlIFBMTAorICogdW5pdCAocmVhZG9ubHk/KS4KKyAqLworI2RlZmluZSBDTV9SRUdfUExMCQkweGY4CisKKy8qCisgKiBleHRlbmRlZCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBDTV9SRUdfQ0gwX0ZSQU1FMQkweDgwCS8qIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDTV9SRUdfQ0gwX0ZSQU1FMgkweDg0CisjZGVmaW5lIENNX1JFR19DSDFfRlJBTUUxCTB4ODgJLyogMC0xNTogY291bnQgb2Ygc2FtcGxlcyBhdCBidXMgbWFzdGVyOyBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBDTV9SRUdfQ0gxX0ZSQU1FMgkweDhDCS8qIDE2LTMxOiBjb3VudCBvZiBzYW1wbGVzIGF0IGNvZGVjOyBmcmFnbWVudCBzaXplICovCisjZGVmaW5lIENNX1JFR19NSVNDX0NUUkxfODc2OAkweDkyCS8qIHJlZy4gbmFtZSB0aGUgc2FtZSBhcyAweDE4ICovCisjZGVmaW5lIENNX0NIQjNEOEMJCTB4MjAJLyogNy4xIGNoYW5uZWxzIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ01fU1BEMzJGTVQJCTB4MTAJLyogU1BESUYvSU4gMzJrICovCisjZGVmaW5lIENNX0FEQzJTUERJRgkJMHgwOAkvKiBBREMgb3V0cHV0IHRvIFNQRElGL09VVCAqLworI2RlZmluZSBDTV9TSEFSRUFEQwkJMHgwNAkvKiBEQUMgaW4gQURDIGFzIENlbnRlci9MRkUgKi8KKyNkZWZpbmUgQ01fUkVBTFRDTVAJCTB4MDIJLyogbW9uaXRvciB0aGUgQ01QTC9DTVBSIG9mIEFEQyAqLworI2RlZmluZSBDTV9JTlZMUkNLCQkweDAxCS8qIGludmVydCBaVlBPUlQncyBMUkNLICovCisKKy8qCisgKiBzaXplIG9mIGkvbyByZWdpb24KKyAqLworI2RlZmluZSBDTV9FWFRFTlRfQ09ERUMJICAweDEwMAorI2RlZmluZSBDTV9FWFRFTlRfTUlESQkgIDB4MgorI2RlZmluZSBDTV9FWFRFTlRfU1lOVEgJICAweDQKKworCisvKgorICogcGNpIGlkcworICovCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ01FRElBCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ01FRElBICAgICAgICAgMHgxM0Y2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhBIDB4MDEwMAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QiAweDAxMDEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4ICAweDAxMTEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIgMHgwMTEyCisjZW5kaWYKKworLyoKKyAqIGNoYW5uZWxzIGZvciBwbGF5YmFjayAvIGNhcHR1cmUKKyAqLworI2RlZmluZSBDTV9DSF9QTEFZCTAKKyNkZWZpbmUgQ01fQ0hfQ0FQVAkxCisKKy8qCisgKiBmbGFncyB0byBjaGVjayBkZXZpY2Ugb3Blbi9jbG9zZQorICovCisjZGVmaW5lIENNX09QRU5fTk9ORQkwCisjZGVmaW5lIENNX09QRU5fQ0hfTUFTSwkweDAxCisjZGVmaW5lIENNX09QRU5fREFDCTB4MTAKKyNkZWZpbmUgQ01fT1BFTl9BREMJMHgyMAorI2RlZmluZSBDTV9PUEVOX1NQRElGCTB4NDAKKyNkZWZpbmUgQ01fT1BFTl9NQ0hBTgkweDgwCisjZGVmaW5lIENNX09QRU5fUExBWUJBQ0sJKENNX0NIX1BMQVkgfCBDTV9PUEVOX0RBQykKKyNkZWZpbmUgQ01fT1BFTl9QTEFZQkFDSzIJKENNX0NIX0NBUFQgfCBDTV9PUEVOX0RBQykKKyNkZWZpbmUgQ01fT1BFTl9QTEFZQkFDS19NVUxUSQkoQ01fQ0hfUExBWSB8IENNX09QRU5fREFDIHwgQ01fT1BFTl9NQ0hBTikKKyNkZWZpbmUgQ01fT1BFTl9DQVBUVVJFCQkoQ01fQ0hfQ0FQVCB8IENNX09QRU5fQURDKQorI2RlZmluZSBDTV9PUEVOX1NQRElGX1BMQVlCQUNLCShDTV9DSF9QTEFZIHwgQ01fT1BFTl9EQUMgfCBDTV9PUEVOX1NQRElGKQorI2RlZmluZSBDTV9PUEVOX1NQRElGX0NBUFRVUkUJKENNX0NIX0NBUFQgfCBDTV9PUEVOX0FEQyB8IENNX09QRU5fU1BESUYpCisKKworI2lmIENNX0NIX1BMQVkgPT0gMQorI2RlZmluZSBDTV9QTEFZQkFDS19TUkFURV8xNzZLCUNNX0NIMV9TUkFURV8xNzZLCisjZGVmaW5lIENNX1BMQVlCQUNLX1NQREYJQ01fU1BERl8xCisjZGVmaW5lIENNX0NBUFRVUkVfU1BERgkJQ01fU1BERl8wCisjZWxzZQorI2RlZmluZSBDTV9QTEFZQkFDS19TUkFURV8xNzZLIENNX0NIMF9TUkFURV8xNzZLCisjZGVmaW5lIENNX1BMQVlCQUNLX1NQREYJQ01fU1BERl8wCisjZGVmaW5lIENNX0NBUFRVUkVfU1BERgkJQ01fU1BERl8xCisjZW5kaWYKKworCisvKgorICogZHJpdmVyIGRhdGEKKyAqLworCit0eXBlZGVmIHN0cnVjdCBzbmRfc3RydV9jbWlwY2kgY21pcGNpX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfc3RydV9jbWlwY2lfcGNtIGNtaXBjaV9wY21fdDsKKworc3RydWN0IHNuZF9zdHJ1X2NtaXBjaV9wY20geworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwlpbnQgcnVubmluZzsJCS8qIGRhYy9hZGMgcnVubmluZz8gKi8KKwl1bnNpZ25lZCBpbnQgZG1hX3NpemU7CS8qIGluIGZyYW1lcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZTsJLyogaW4gZnJhbWVzICovCisJdW5zaWduZWQgaW50IG9mZnNldDsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGZtdDsJLyogZm9ybWF0IGJpdHMgKi8KKwlpbnQgY2g7CQkJLyogY2hhbm5lbCAoMC8xKSAqLworCXVuc2lnbmVkIGludCBpc19kYWM7CQkvKiBpcyBkYWM/ICovCisJaW50IGJ5dGVzX3Blcl9mcmFtZTsKKwlpbnQgc2hpZnQ7Cit9OworCisvKiBtaXhlciBlbGVtZW50cyB0b2dnbGVkL3Jlc3VtZWQgZHVyaW5nIGFjMyBwbGF5YmFjayAqLworc3RydWN0IGNtaXBjaV9taXhlcl9hdXRvX3N3aXRjaGVzIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBzd2l0Y2ggdG8gdG9nZ2xlICovCisJaW50IHRvZ2dsZV9vbjsJCS8qIHZhbHVlIHRvIGNoYW5nZSB3aGVuIGFjMyBtb2RlICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWlwY2lfbWl4ZXJfYXV0b19zd2l0Y2hlcyBjbV9zYXZlZF9taXhlcltdID0geworCXsiUENNIFBsYXliYWNrIFN3aXRjaCIsIDB9LAorCXsiSUVDOTU4IE91dHB1dCBTd2l0Y2giLCAxfSwKKwl7IklFQzk1OCBNaXggQW5hbG9nIiwgMH0sCisJLy8geyJJRUM5NTggT3V0IFRvIERBQyIsIDF9LCAvLyBubyBsb25nZXIgdXNlZAorCXsiSUVDOTU4IExvb3AiLCAwfSwKK307CisjZGVmaW5lIENNX1NBVkVEX01JWEVSUwkJQVJSQVlfU0laRShjbV9zYXZlZF9taXhlcikKKworc3RydWN0IHNuZF9zdHJ1X2NtaXBjaSB7CisJc25kX2NhcmRfdCAqY2FyZDsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJdW5zaWduZWQgaW50IGRldmljZTsJLyogZGV2aWNlIElEICovCisJaW50IGlycTsKKworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCXVuc2lnbmVkIGludCBjdHJsOwkvKiBGVU5DVFJMMCBjdXJyZW50IHZhbHVlICovCisKKwlzbmRfcGNtX3QgKnBjbTsJCS8qIERBQy9BREMgUENNICovCisJc25kX3BjbV90ICpwY20yOwkvKiAybmQgREFDICovCisJc25kX3BjbV90ICpwY21fc3BkaWY7CS8qIFNQRElGICovCisKKwlpbnQgY2hpcF92ZXJzaW9uOworCWludCBtYXhfY2hhbm5lbHM7CisJdW5zaWduZWQgaW50IGhhc19kdWFsX2RhYzogMTsKKwl1bnNpZ25lZCBpbnQgY2FuX2FjM19zdzogMTsKKwl1bnNpZ25lZCBpbnQgY2FuX2FjM19odzogMTsKKwl1bnNpZ25lZCBpbnQgY2FuX211bHRpX2NoOiAxOworCXVuc2lnbmVkIGludCBkb19zb2Z0X2FjMzogMTsKKworCXVuc2lnbmVkIGludCBzcGRpZl9wbGF5YmFja19hdmFpbDogMTsJLyogc3BkaWYgcmVhZHk/ICovCisJdW5zaWduZWQgaW50IHNwZGlmX3BsYXliYWNrX2VuYWJsZWQ6IDE7CS8qIHNwZGlmIHN3aXRjaCBlbmFibGVkPyAqLworCWludCBzcGRpZl9jb3VudGVyOwkvKiBmb3Igc29mdHdhcmUgQUMzICovCisKKwl1bnNpZ25lZCBpbnQgZGlnX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgZGlnX3BjbV9zdGF0dXM7CisKKwlzbmRfcGNtX2hhcmR3YXJlX3QgKmh3X2luZm9bM107IC8qIGZvciBwbGF5YmFja3MgKi8KKworCWludCBvcGVuZWRbMl07CS8qIG9wZW4gbW9kZSAqLworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9tdXRleDsKKworCXVuc2lnbmVkIGludCBtaXhlcl9pbnNlbnNpdGl2ZTogMTsKKwlzbmRfa2NvbnRyb2xfdCAqbWl4ZXJfcmVzX2N0bFtDTV9TQVZFRF9NSVhFUlNdOworCWludCBtaXhlcl9yZXNfc3RhdHVzW0NNX1NBVkVEX01JWEVSU107CisKKwlvcGwzX3QgKm9wbDM7CisJc25kX2h3ZGVwX3QgKm9wbDNod2RlcDsKKworCWNtaXBjaV9wY21fdCBjaGFubmVsWzJdOwkvKiBjaDAgLSBEQUMsIGNoMSAtIEFEQyBvciAybmQgREFDICovCisKKwkvKiBleHRlcm5hbCBNSURJICovCisJc25kX3Jhd21pZGlfdCAqcm1pZGk7CisKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKyNlbmRpZgorCisJc3BpbmxvY2tfdCByZWdfbG9jazsKK307CisKKworLyogcmVhZC93cml0ZSBvcGVyYXRpb25zIGZvciBkd29yZCByZWdpc3RlciAqLworaW5saW5lIHN0YXRpYyB2b2lkIHNuZF9jbWlwY2lfd3JpdGUoY21pcGNpX3QgKmNtLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlvdXRsKGRhdGEsIGNtLT5pb2Jhc2UgKyBjbWQpOworfQoraW5saW5lIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2NtaXBjaV9yZWFkKGNtaXBjaV90ICpjbSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlyZXR1cm4gaW5sKGNtLT5pb2Jhc2UgKyBjbWQpOworfQorCisvKiByZWFkL3dyaXRlIG9wZXJhdGlvbnMgZm9yIHdvcmQgcmVnaXN0ZXIgKi8KK2lubGluZSBzdGF0aWMgdm9pZCBzbmRfY21pcGNpX3dyaXRlX3coY21pcGNpX3QgKmNtLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBzaG9ydCBkYXRhKQoreworCW91dHcoZGF0YSwgY20tPmlvYmFzZSArIGNtZCk7Cit9CitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9jbWlwY2lfcmVhZF93KGNtaXBjaV90ICpjbSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlyZXR1cm4gaW53KGNtLT5pb2Jhc2UgKyBjbWQpOworfQorCisvKiByZWFkL3dyaXRlIG9wZXJhdGlvbnMgZm9yIGJ5dGUgcmVnaXN0ZXIgKi8KK2lubGluZSBzdGF0aWMgdm9pZCBzbmRfY21pcGNpX3dyaXRlX2IoY21pcGNpX3QgKmNtLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0YihkYXRhLCBjbS0+aW9iYXNlICsgY21kKTsKK30KKworaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jbWlwY2lfcmVhZF9iKGNtaXBjaV90ICpjbSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlyZXR1cm4gaW5iKGNtLT5pb2Jhc2UgKyBjbWQpOworfQorCisvKiBiaXQgb3BlcmF0aW9ucyBmb3IgZHdvcmQgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfc2V0X2JpdChjbWlwY2lfdCAqY20sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBmbGFnKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdmFsID0gaW5sKGNtLT5pb2Jhc2UgKyBjbWQpOworCXZhbCB8PSBmbGFnOworCW91dGwodmFsLCBjbS0+aW9iYXNlICsgY21kKTsKK30KKworc3RhdGljIHZvaWQgc25kX2NtaXBjaV9jbGVhcl9iaXQoY21pcGNpX3QgKmNtLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgZmxhZykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZhbCA9IGlubChjbS0+aW9iYXNlICsgY21kKTsKKwl2YWwgJj0gfmZsYWc7CisJb3V0bCh2YWwsIGNtLT5pb2Jhc2UgKyBjbWQpOworfQorCisjaWYgMCAvLyBub3QgdXNlZAorLyogYml0IG9wZXJhdGlvbnMgZm9yIGJ5dGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfc2V0X2JpdF9iKGNtaXBjaV90ICpjbSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgY2hhciBmbGFnKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCXZhbCA9IGluYihjbS0+aW9iYXNlICsgY21kKTsKKwl2YWwgfD0gZmxhZzsKKwlvdXRiKHZhbCwgY20tPmlvYmFzZSArIGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfY2xlYXJfYml0X2IoY21pcGNpX3QgKmNtLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyIGZsYWcpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdmFsID0gaW5iKGNtLT5pb2Jhc2UgKyBjbWQpOworCXZhbCAmPSB+ZmxhZzsKKwlvdXRiKHZhbCwgY20tPmlvYmFzZSArIGNtZCk7Cit9CisjZW5kaWYKKworCisvKgorICogUENNIGludGVyZmFjZQorICovCisKKy8qCisgKiBjYWxjdWxhdGUgZnJlcXVlbmN5CisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0geyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwLCA4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwIH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2NtaXBjaV9yYXRlX2ZyZXEodW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmF0ZXMpOyBpKyspIHsKKwkJaWYgKHJhdGVzW2ldID09IHJhdGUpCisJCQlyZXR1cm4gaTsKKwl9CisJc25kX0JVRygpOworCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX1ZBUjQ4S1JBVEUKKy8qCisgKiBEZXRlcm1pbmUgUExMIHZhbHVlcyBmb3IgZnJlcXVlbmN5IHNldHVwLCBtYXliZSB0aGUgQ01JODMzOCAoQ01JODczOD8/PykKKyAqIGRvZXMgaXQgdGhpcyB3YXkgLi4gbWF5YmUgbm90LiAgTmV2ZXIgZ2V0IGFueSBpbmZvcm1hdGlvbiBmcm9tIEMtTWVkaWEgYWJvdXQKKyAqIHRoYXQgPHdlcm5lckBzdXNlLmRlPi4KKyAqLworc3RhdGljIGludCBzbmRfY21pcGNpX3BsbF9ybW4odW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBhZGNtdWx0LCBpbnQgKnIsIGludCAqbSwgaW50ICpuKQoreworCXVuc2lnbmVkIGludCBkZWx0YSwgdG9sZXJhbmNlOworCWludCB4bSwgeG4sIHhyOworCisJZm9yICgqciA9IDA7IHJhdGUgPCBDTV9NQVhJTVVNX1JBVEUvYWRjbXVsdDsgKnIgKz0gKDE8PDUpKQorCQlyYXRlIDw8PSAxOworCSpuID0gLTE7CisJaWYgKCpyID4gMHhmZikKKwkJZ290byBvdXQ7CisJdG9sZXJhbmNlID0gcmF0ZSpDTV9UT0xFUkFOQ0VfUkFURTsKKworCWZvciAoeG4gPSAoMSsyKTsgeG4gPCAoMHgxZisyKTsgeG4rKykgeworCQlmb3IgKHhtID0gKDErMik7IHhtIDwgKDB4ZmYrMik7IHhtKyspIHsKKwkJCXhyID0gKChDTV9SRUZGUkVRX1hJTi9hZGNtdWx0KSAqIHhtKSAvIHhuOworCisJCQlpZiAoeHIgPCByYXRlKQorCQkJCWRlbHRhID0gcmF0ZSAtIHhyOworCQkJZWxzZQorCQkJCWRlbHRhID0geHIgLSByYXRlOworCisJCQkvKgorCQkJICogSWYgd2UgZm91bmQgb25lLCByZW1lbWJlciB0aGlzLAorCQkJICogYW5kIHRyeSB0byBmaW5kIGEgY2xvc2VyIG9uZQorCQkJICovCisJCQlpZiAoZGVsdGEgPCB0b2xlcmFuY2UpIHsKKwkJCQl0b2xlcmFuY2UgPSBkZWx0YTsKKwkJCQkqbSA9IHhtIC0gMjsKKwkJCQkqbiA9IHhuIC0gMjsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlyZXR1cm4gKCpuID4gLTEpOworfQorCisvKgorICogUHJvZ3JhbSBwbGwgcmVnaXN0ZXIgYml0cywgSSBhc3N1bWUgdGhhdCB0aGUgOCByZWdpc3RlcnMgMHhmOCB1cHRvIDB4ZmYKKyAqIGFyZSBtYXBwZWQgb250byB0aGUgOCBBREMvREFDIHNhbXBsaW5nIGZyZXF1ZW5jeSB3aGljaCBjYW4gYmUgY2hvb3NlbgorICogYXQgdGhlIHJlZ2lzdGVyIENNX1JFR19GVU5DVFJMMSAoMHgwNCkuCisgKiBQcm9ibGVtOiBvdGhlciB3YXlzIGFyZSBhbHNvIHBvc3NpYmxlIChhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdD8pCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfc2V0X3BsbChjbWlwY2lfdCAqY20sIHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgc2xvdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gQ01fUkVHX1BMTCArIHNsb3Q7CisJLyoKKwkgKiBHdWVzcyB0aGF0IHRoaXMgcHJvZ3JhbXMgYXQgcmVnLiAweDA0IHRoZSBwb3MgMTU6MTMvMTI6MTAKKwkgKiBmb3IgRFNGQy9BU0ZDICgwMDAgdXB0byAxMTEpLgorCSAqLworCisJLyogRklYTUU6IEluaXQgKERvIHdlJ3ZlIHRvIHNldCBhbiBvdGhlciByZWdpc3RlciBmaXJzdCBiZWZvcmUgcHJvZ3JhbW1pbmc/KSAqLworCisJLyogRklYTUU6IElzIHRoaXMgY29ycmVjdD8gT3Igc2hvdWxkbid0IHRoZSBtL24vciB2YWx1ZXMgYmUgdXNlZCBmb3IgdGhhdD8gKi8KKwlzbmRfY21pcGNpX3dyaXRlX2IoY20sIHJlZywgcmF0ZT4+OCk7CisJc25kX2NtaXBjaV93cml0ZV9iKGNtLCByZWcsIHJhdGUmMHhmZik7CisKKwkvKiBGSVhNRTogU2V0dXAgKERvIHdlJ3ZlIHRvIHNldCBhbiBvdGhlciByZWdpc3RlciBmaXJzdCB0byBlbmFibGUgdGhpcz8pICovCit9CisjZW5kaWYgLyogVVNFX1ZBUjQ4S1JBVEUgKi8KKworc3RhdGljIGludCBzbmRfY21pcGNpX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCXNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wbGF5YmFjazJfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCSAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaWYgKHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpID4gMikgeworCQlkb3duKCZjbS0+b3Blbl9tdXRleCk7CisJCWlmIChjbS0+b3BlbmVkW0NNX0NIX1BMQVldKSB7CisJCQl1cCgmY20tPm9wZW5fbXV0ZXgpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQkvKiByZXNlcnZlIHRoZSBjaGFubmVsIEEgKi8KKwkJY20tPm9wZW5lZFtDTV9DSF9QTEFZXSA9IENNX09QRU5fUExBWUJBQ0tfTVVMVEk7CisJCXVwKCZjbS0+b3Blbl9tdXRleCk7CisJfQorCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworfQorCitzdGF0aWMgdm9pZCBzbmRfY21pcGNpX2NoX3Jlc2V0KGNtaXBjaV90ICpjbSwgaW50IGNoKQoreworCWludCByZXNldCA9IENNX1JTVF9DSDAgPDwgKGNtLT5jaGFubmVsW2NoXS5jaCk7CisJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCBjbS0+Y3RybCB8IHJlc2V0KTsKKwlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsICYgfnJlc2V0KTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKKworLyoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGh3X2NoYW5uZWxzW10gPSB7MSwgMiwgNCwgNSwgNiwgOH07CitzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCBod19jb25zdHJhaW50c19jaGFubmVsc180ID0geworCS5jb3VudCA9IDMsCisJLmxpc3QgPSBod19jaGFubmVscywKKwkubWFzayA9IDAsCit9Oworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfY2hhbm5lbHNfNiA9IHsKKwkuY291bnQgPSA1LAorCS5saXN0ID0gaHdfY2hhbm5lbHMsCisJLm1hc2sgPSAwLAorfTsKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX2NoYW5uZWxzXzggPSB7CisJLmNvdW50ID0gNiwKKwkubGlzdCA9IGh3X2NoYW5uZWxzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBpbnQgc2V0X2RhY19jaGFubmVscyhjbWlwY2lfdCAqY20sIGNtaXBjaV9wY21fdCAqcmVjLCBpbnQgY2hhbm5lbHMpCit7CisJaWYgKGNoYW5uZWxzID4gMikgeworCQlpZiAoISBjbS0+Y2FuX211bHRpX2NoKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChyZWMtPmZtdCAhPSAweDAzKSAvKiBzdGVyZW8gMTZiaXQgb25seSAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfTEVHQUNZX0NUUkwsIENNX05YQ0hHKTsKKwkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9YQ0hHREFDKTsKKwkJaWYgKGNoYW5uZWxzID4gNCkgeworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fQ0hCM0QpOworCQkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfQ0hGT1JNQVQsIENNX0NIQjNENUMpOworCQl9IGVsc2UgeworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fQ0hCM0Q1Qyk7CisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fQ0hCM0QpOworCQl9CisJCWlmIChjaGFubmVscyA+PSA2KSB7CisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19MRUdBQ1lfQ1RSTCwgQ01fQ0hCM0Q2Qyk7CisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX0VOQ0VOVEVSKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTEVHQUNZX0NUUkwsIENNX0NIQjNENkMpOworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX0VOQ0VOVEVSKTsKKwkJfQorCQlpZiAoY20tPmNoaXBfdmVyc2lvbiA9PSA2OCkgeworCQkJaWYgKGNoYW5uZWxzID09IDgpIHsKKwkJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkxfODc2OCwgQ01fQ0hCM0Q4Qyk7CisJCQl9IGVsc2UgeworCQkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMXzg3NjgsIENNX0NIQjNEOEMpOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKworCX0gZWxzZSB7CisJCWlmIChjbS0+Y2FuX211bHRpX2NoKSB7CisJCQlzcGluX2xvY2tfaXJxKCZjbS0+cmVnX2xvY2spOworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19MRUdBQ1lfQ1RSTCwgQ01fTlhDSEcpOworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fQ0hCM0QpOworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fQ0hCM0Q1Qyk7CisJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0xFR0FDWV9DVFJMLCBDTV9DSEIzRDZDKTsKKwkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9FTkNFTlRFUik7CisJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fWENIR0RBQyk7CisJCQlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHByZXBhcmUgcGxheWJhY2svY2FwdHVyZSBjaGFubmVsCisgKiBjaGFubmVsIHRvIGJlIHVzZWQgbXVzdCBoYXZlIGJlZW4gc2V0IGluIHJlYy0+Y2guCisgKi8KK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wY21fcHJlcGFyZShjbWlwY2lfdCAqY20sIGNtaXBjaV9wY21fdCAqcmVjLAorCQkJCSBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJdW5zaWduZWQgaW50IHJlZywgZnJlcSwgdmFsOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcmVjLT5mbXQgPSAwOworCXJlYy0+c2hpZnQgPSAwOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID49IDE2KSB7CisJCXJlYy0+Zm10IHw9IDB4MDI7CisJCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID4gMTYpCisJCQlyZWMtPnNoaWZ0Kys7IC8qIDI0LzMyYml0ICovCisJfQorCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCXJlYy0+Zm10IHw9IDB4MDE7CisJaWYgKHJlYy0+aXNfZGFjICYmIHNldF9kYWNfY2hhbm5lbHMoY20sIHJlYywgcnVudGltZS0+Y2hhbm5lbHMpIDwgMCkgeworCQlzbmRfcHJpbnRkKCJjYW5ub3Qgc2V0IGRhYyBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlYy0+b2Zmc2V0ID0gcnVudGltZS0+ZG1hX2FkZHI7CisJLyogYnVmZmVyIGFuZCBwZXJpb2Qgc2l6ZXMgaW4gZnJhbWUgKi8KKwlyZWMtPmRtYV9zaXplID0gcnVudGltZS0+YnVmZmVyX3NpemUgPDwgcmVjLT5zaGlmdDsKKwlyZWMtPnBlcmlvZF9zaXplID0gcnVudGltZS0+cGVyaW9kX3NpemUgPDwgcmVjLT5zaGlmdDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAyKSB7CisJCS8qIG11bHRpLWNoYW5uZWxzICovCisJCXJlYy0+ZG1hX3NpemUgPSAocmVjLT5kbWFfc2l6ZSAqIHJ1bnRpbWUtPmNoYW5uZWxzKSAvIDI7CisJCXJlYy0+cGVyaW9kX3NpemUgPSAocmVjLT5wZXJpb2Rfc2l6ZSAqIHJ1bnRpbWUtPmNoYW5uZWxzKSAvIDI7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKworCS8qIHNldCBidWZmZXIgYWRkcmVzcyAqLworCXJlZyA9IHJlYy0+Y2ggPyBDTV9SRUdfQ0gxX0ZSQU1FMSA6IENNX1JFR19DSDBfRlJBTUUxOworCXNuZF9jbWlwY2lfd3JpdGUoY20sIHJlZywgcmVjLT5vZmZzZXQpOworCS8qIHByb2dyYW0gc2FtcGxlIGNvdW50cyAqLworCXJlZyA9IHJlYy0+Y2ggPyBDTV9SRUdfQ0gxX0ZSQU1FMiA6IENNX1JFR19DSDBfRlJBTUUyOworCXNuZF9jbWlwY2lfd3JpdGVfdyhjbSwgcmVnLCByZWMtPmRtYV9zaXplIC0gMSk7CisJc25kX2NtaXBjaV93cml0ZV93KGNtLCByZWcgKyAyLCByZWMtPnBlcmlvZF9zaXplIC0gMSk7CisKKwkvKiBzZXQgYWRjL2RhYyBmbGFnICovCisJdmFsID0gcmVjLT5jaCA/IENNX0NIQURDMSA6IENNX0NIQURDMDsKKwlpZiAocmVjLT5pc19kYWMpCisJCWNtLT5jdHJsICY9IH52YWw7CisJZWxzZQorCQljbS0+Y3RybCB8PSB2YWw7CisJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCBjbS0+Y3RybCk7CisJLy9zbmRfcHJpbnRkKCJjbWlwY2k6IGZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOworCisJLyogc2V0IHNhbXBsZSByYXRlICovCisJZnJlcSA9IHNuZF9jbWlwY2lfcmF0ZV9mcmVxKHJ1bnRpbWUtPnJhdGUpOworCXZhbCA9IHNuZF9jbWlwY2lfcmVhZChjbSwgQ01fUkVHX0ZVTkNUUkwxKTsKKwlpZiAocmVjLT5jaCkgeworCQl2YWwgJj0gfkNNX0FTRkNfTUFTSzsKKwkJdmFsIHw9IChmcmVxIDw8IENNX0FTRkNfU0hJRlQpICYgQ01fQVNGQ19NQVNLOworCX0gZWxzZSB7CisJCXZhbCAmPSB+Q01fRFNGQ19NQVNLOworCQl2YWwgfD0gKGZyZXEgPDwgQ01fRFNGQ19TSElGVCkgJiBDTV9EU0ZDX01BU0s7CisJfQorCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19GVU5DVFJMMSwgdmFsKTsKKwkvL3NuZF9wcmludGQoImNtaXBjaTogZnVuY3RybDEgPSAlMDh4XG4iLCB2YWwpOworCisJLyogc2V0IGZvcm1hdCAqLworCXZhbCA9IHNuZF9jbWlwY2lfcmVhZChjbSwgQ01fUkVHX0NIRk9STUFUKTsKKwlpZiAocmVjLT5jaCkgeworCQl2YWwgJj0gfkNNX0NIMUZNVF9NQVNLOworCQl2YWwgfD0gcmVjLT5mbXQgPDwgQ01fQ0gxRk1UX1NISUZUOworCX0gZWxzZSB7CisJCXZhbCAmPSB+Q01fQ0gwRk1UX01BU0s7CisJCXZhbCB8PSByZWMtPmZtdCA8PCBDTV9DSDBGTVRfU0hJRlQ7CisJfQorCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19DSEZPUk1BVCwgdmFsKTsKKwkvL3NuZF9wcmludGQoImNtaXBjaTogY2hmb3JtYXQgPSAlMDh4XG4iLCB2YWwpOworCisJcmVjLT5ydW5uaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBDTSB0cmlnZ2VyL3N0b3AKKyAqLworc3RhdGljIGludCBzbmRfY21pcGNpX3BjbV90cmlnZ2VyKGNtaXBjaV90ICpjbSwgY21pcGNpX3BjbV90ICpyZWMsCisJCQkJIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgaW50aGxkLCBjaGVuLCByZXNldCwgcGF1c2U7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpbnRobGQgPSBDTV9DSDBfSU5UX0VOIDw8IHJlYy0+Y2g7CisJY2hlbiA9IENNX0NIRU4wIDw8IHJlYy0+Y2g7CisJcmVzZXQgPSBDTV9SU1RfQ0gwIDw8IHJlYy0+Y2g7CisJcGF1c2UgPSBDTV9QQVVTRTAgPDwgcmVjLT5jaDsKKworCXNwaW5fbG9jaygmY20tPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXJlYy0+cnVubmluZyA9IDE7CisJCS8qIHNldCBpbnRlcnJ1cHQgKi8KKwkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfSU5UX0hMRENMUiwgaW50aGxkKTsKKwkJY20tPmN0cmwgfD0gY2hlbjsKKwkJLyogZW5hYmxlIGNoYW5uZWwgKi8KKwkJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCBjbS0+Y3RybCk7CisJCS8vc25kX3ByaW50ZCgiY21pcGNpOiBmdW5jdHJsMCA9ICUwOHhcbiIsIGNtLT5jdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlyZWMtPnJ1bm5pbmcgPSAwOworCQkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0lOVF9ITERDTFIsIGludGhsZCk7CisJCS8qIHJlc2V0ICovCisJCWNtLT5jdHJsICY9IH5jaGVuOworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsIHwgcmVzZXQpOworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsICYgfnJlc2V0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQljbS0+Y3RybCB8PSBwYXVzZTsKKwkJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCBjbS0+Y3RybCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJY20tPmN0cmwgJj0gfnBhdXNlOworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjbS0+cmVnX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiByZXR1cm4gdGhlIGN1cnJlbnQgcG9pbnRlcgorICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2NtaXBjaV9wY21fcG9pbnRlcihjbWlwY2lfdCAqY20sIGNtaXBjaV9wY21fdCAqcmVjLAorCQkJCQkgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzaXplX3QgcHRyOworCXVuc2lnbmVkIGludCByZWc7CisJaWYgKCFyZWMtPnJ1bm5pbmcpCisJCXJldHVybiAwOworI2lmIDEgLy8gdGhpcyBzZWVtcyBiZXR0ZXIuLgorCXJlZyA9IHJlYy0+Y2ggPyBDTV9SRUdfQ0gxX0ZSQU1FMiA6IENNX1JFR19DSDBfRlJBTUUyOworCXB0ciA9IHJlYy0+ZG1hX3NpemUgLSAoc25kX2NtaXBjaV9yZWFkX3coY20sIHJlZykgKyAxKTsKKwlwdHIgPj49IHJlYy0+c2hpZnQ7CisjZWxzZQorCXJlZyA9IHJlYy0+Y2ggPyBDTV9SRUdfQ0gxX0ZSQU1FMSA6IENNX1JFR19DSDBfRlJBTUUxOworCXB0ciA9IHNuZF9jbWlwY2lfcmVhZChjbSwgcmVnKSAtIHJlYy0+b2Zmc2V0OworCXB0ciA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7CisjZW5kaWYKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyA+IDIpCisJCXB0ciA9IChwdHIgKiAyKSAvIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJcmV0dXJuIHB0cjsKK30KKworLyoKKyAqIHBsYXliYWNrCisgKi8KKworc3RhdGljIGludCBzbmRfY21pcGNpX3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICAgICBpbnQgY21kKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX2NtaXBjaV9wY21fdHJpZ2dlcihjbSwgJmNtLT5jaGFubmVsW0NNX0NIX1BMQVldLCBzdWJzdHJlYW0sIGNtZCk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfY21pcGNpX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX2NtaXBjaV9wY21fcG9pbnRlcihjbSwgJmNtLT5jaGFubmVsW0NNX0NIX1BMQVldLCBzdWJzdHJlYW0pOworfQorCisKKworLyoKKyAqIGNhcHR1cmUKKyAqLworCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICAgIGludCBjbWQpCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXJldHVybiBzbmRfY21pcGNpX3BjbV90cmlnZ2VyKGNtLCAmY20tPmNoYW5uZWxbQ01fQ0hfQ0FQVF0sIHN1YnN0cmVhbSwgY21kKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9jbWlwY2lfcGNtX3BvaW50ZXIoY20sICZjbS0+Y2hhbm5lbFtDTV9DSF9DQVBUXSwgc3Vic3RyZWFtKTsKK30KKworCisvKgorICogaHcgcHJlcGFyYXRpb24gZm9yIHNwZGlmCisgKi8KKworc3RhdGljIGludCBzbmRfY21pcGNpX3NwZGlmX2RlZmF1bHRfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCQkJCSBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9zcGRpZl9kZWZhdWx0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljbWlwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1tpXSA9IChjaGlwLT5kaWdfc3RhdHVzID4+IChpICogOCkpICYgMHhmZjsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3NwZGlmX2RlZmF1bHRfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCSBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNtaXBjaV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpLCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IDA7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXZhbCB8PSAodW5zaWduZWQgaW50KXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzW2ldIDw8IChpICogOCk7CisJY2hhbmdlID0gdmFsICE9IGNoaXAtPmRpZ19zdGF0dXM7CisJY2hpcC0+ZGlnX3N0YXR1cyA9IHZhbDsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5pbmZvID0JCXNuZF9jbWlwY2lfc3BkaWZfZGVmYXVsdF9pbmZvLAorCS5nZXQgPQkJc25kX2NtaXBjaV9zcGRpZl9kZWZhdWx0X2dldCwKKwkucHV0ID0JCXNuZF9jbWlwY2lfc3BkaWZfZGVmYXVsdF9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9zcGRpZl9tYXNrX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCSAgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3NwZGlmX21hc2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAweGZmOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfc3BkaWZfbWFzayBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkuaW5mbyA9CQlzbmRfY21pcGNpX3NwZGlmX21hc2tfaW5mbywKKwkuZ2V0ID0JCXNuZF9jbWlwY2lfc3BkaWZfbWFza19nZXQsCit9OworCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfc3BkaWZfc3RyZWFtX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCQlzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9zcGRpZl9zdHJlYW1fZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwKKwkJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNtaXBjaV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzW2ldID0gKGNoaXAtPmRpZ19wY21fc3RhdHVzID4+IChpICogOCkpICYgMHhmZjsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3NwZGlmX3N0cmVhbV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCSAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY21pcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGksIGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gMDsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJdmFsIHw9ICh1bnNpZ25lZCBpbnQpdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbaV0gPDwgKGkgKiA4KTsKKwljaGFuZ2UgPSB2YWwgIT0gY2hpcC0+ZGlnX3BjbV9zdGF0dXM7CisJY2hpcC0+ZGlnX3BjbV9zdGF0dXMgPSB2YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY21pcGNpX3NwZGlmX3N0cmVhbSBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBDTV9TVFJFQU0pLAorCS5pbmZvID0JCXNuZF9jbWlwY2lfc3BkaWZfc3RyZWFtX2luZm8sCisJLmdldCA9CQlzbmRfY21pcGNpX3NwZGlmX3N0cmVhbV9nZXQsCisJLnB1dCA9CQlzbmRfY21pcGNpX3NwZGlmX3N0cmVhbV9wdXQKK307CisKKy8qCisgKi8KKworLyogc2F2ZSBtaXhlciBzZXR0aW5nIGFuZCBtdXRlIGZvciBBQzMgcGxheWJhY2sgKi8KK3N0YXRpYyBpbnQgc2F2ZV9taXhlcl9zdGF0ZShjbWlwY2lfdCAqY20pCit7CisJaWYgKCEgY20tPm1peGVyX2luc2Vuc2l0aXZlKSB7CisJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWw7CisJCXVuc2lnbmVkIGludCBpOworCisJCXZhbCA9IGttYWxsb2Moc2l6ZW9mKCp2YWwpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF2YWwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IENNX1NBVkVEX01JWEVSUzsgaSsrKSB7CisJCQlzbmRfa2NvbnRyb2xfdCAqY3RsID0gY20tPm1peGVyX3Jlc19jdGxbaV07CisJCQlpZiAoY3RsKSB7CisJCQkJaW50IGV2ZW50OworCQkJCW1lbXNldCh2YWwsIDAsIHNpemVvZigqdmFsKSk7CisJCQkJY3RsLT5nZXQoY3RsLCB2YWwpOworCQkJCWNtLT5taXhlcl9yZXNfc3RhdHVzW2ldID0gdmFsLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQkJCXZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNtX3NhdmVkX21peGVyW2ldLnRvZ2dsZV9vbjsKKwkJCQlldmVudCA9IFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk87CisJCQkJaWYgKGNtLT5taXhlcl9yZXNfc3RhdHVzW2ldICE9IHZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQkJCQljdGwtPnB1dChjdGwsIHZhbCk7IC8qIHRvZ2dsZSAqLworCQkJCQlldmVudCB8PSBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRTsKKwkJCQl9CisJCQkJY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQkJCXNuZF9jdGxfbm90aWZ5KGNtLT5jYXJkLCBldmVudCwgJmN0bC0+aWQpOworCQkJfQorCQl9CisJCWtmcmVlKHZhbCk7CisJCWNtLT5taXhlcl9pbnNlbnNpdGl2ZSA9IDE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIHJlc3RvcmUgdGhlIHByZXZpb3VzbHkgc2F2ZWQgbWl4ZXIgc3RhdHVzICovCitzdGF0aWMgdm9pZCByZXN0b3JlX21peGVyX3N0YXRlKGNtaXBjaV90ICpjbSkKK3sKKwlpZiAoY20tPm1peGVyX2luc2Vuc2l0aXZlKSB7CisJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWw7CisJCXVuc2lnbmVkIGludCBpOworCisJCXZhbCA9IGttYWxsb2Moc2l6ZW9mKCp2YWwpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2YWwpCisJCQlyZXR1cm47CisJCWNtLT5taXhlcl9pbnNlbnNpdGl2ZSA9IDA7IC8qIGF0IGZpcnN0IGNsZWFyIHRoaXM7CisJCQkJCSAgICAgIG90aGVyd2lzZSB0aGUgY2hhbmdlcyB3aWxsIGJlIGlnbm9yZWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IENNX1NBVkVEX01JWEVSUzsgaSsrKSB7CisJCQlzbmRfa2NvbnRyb2xfdCAqY3RsID0gY20tPm1peGVyX3Jlc19jdGxbaV07CisJCQlpZiAoY3RsKSB7CisJCQkJaW50IGV2ZW50OworCisJCQkJbWVtc2V0KHZhbCwgMCwgc2l6ZW9mKCp2YWwpKTsKKwkJCQljdGwtPnZkWzBdLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQkJCWN0bC0+Z2V0KGN0bCwgdmFsKTsKKwkJCQlldmVudCA9IFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk87CisJCQkJaWYgKHZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSBjbS0+bWl4ZXJfcmVzX3N0YXR1c1tpXSkgeworCQkJCQl2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjbS0+bWl4ZXJfcmVzX3N0YXR1c1tpXTsKKwkJCQkJY3RsLT5wdXQoY3RsLCB2YWwpOworCQkJCQlldmVudCB8PSBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRTsKKwkJCQl9CisJCQkJc25kX2N0bF9ub3RpZnkoY20tPmNhcmQsIGV2ZW50LCAmY3RsLT5pZCk7CisJCQl9CisJCX0KKwkJa2ZyZWUodmFsKTsKKwl9Cit9CisKKy8qIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBzZXR1cF9hYzMoY21pcGNpX3QgKmNtLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzLCBpbnQgZG9fYWMzLCBpbnQgcmF0ZSkKK3sKKwlpZiAoZG9fYWMzKSB7CisJCS8qIEFDM0VOIGZvciAwMzcgKi8KKwkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfQ0hGT1JNQVQsIENNX0FDM0VOMSk7CisJCS8qIEFDM0VOIGZvciAwMzkgKi8KKwkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9BQzNFTjIpOworCQorCQlpZiAoY20tPmNhbl9hYzNfaHcpIHsKKwkJCS8qIFNQRDI0U0VMIGZvciAwMzcsIDB4MDIgKi8KKwkJCS8qIFNQRDI0U0VMIGZvciAwMzksIDB4MjAsIGJ1dCBjYW5ub3QgYmUgc2V0ICovCisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fU1BEMjRTRUwpOworCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX1NQRDMyU0VMKTsKKwkJfSBlbHNlIHsgLyogY2FuX2FjM19zdyAqLworCQkJLyogU1BEMzJTRUwgZm9yIDAzNyAmIDAzOSwgMHgyMCAqLworCQkJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9TUEQzMlNFTCk7CisJCQkvKiBzZXQgMTc2SyBzYW1wbGUgcmF0ZSB0byBmaXggMDMzIEhXIGJ1ZyAqLworCQkJaWYgKGNtLT5jaGlwX3ZlcnNpb24gPT0gMzMpIHsKKwkJCQlpZiAocmF0ZSA+PSA0ODAwMCkgeworCQkJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fUExBWUJBQ0tfU1JBVEVfMTc2Syk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fUExBWUJBQ0tfU1JBVEVfMTc2Syk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0NIRk9STUFULCBDTV9BQzNFTjEpOworCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fQUMzRU4yKTsKKworCQlpZiAoY20tPmNhbl9hYzNfaHcpIHsKKwkJCS8qIGNoaXAgbW9kZWwgPj0gMzcgKi8KKwkJCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChzdWJzLT5ydW50aW1lLT5mb3JtYXQpID4gMTYpIHsKKwkJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX1NQRDMyU0VMKTsKKwkJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19DSEZPUk1BVCwgQ01fU1BEMjRTRUwpOworCQkJfSBlbHNlIHsKKwkJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fU1BEMzJTRUwpOworCQkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfQ0hGT1JNQVQsIENNX1NQRDI0U0VMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9TUEQzMlNFTCk7CisJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0NIRk9STUFULCBDTV9TUEQyNFNFTCk7CisJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0NIRk9STUFULCBDTV9QTEFZQkFDS19TUkFURV8xNzZLKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzZXR1cF9zcGRpZl9wbGF5YmFjayhjbWlwY2lfdCAqY20sIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMsIGludCB1cCwgaW50IGRvX2FjMykKK3sKKwlpbnQgcmF0ZSwgZXJyOworCisJcmF0ZSA9IHN1YnMtPnJ1bnRpbWUtPnJhdGU7CisKKwlpZiAodXAgJiYgZG9fYWMzKQorCQlpZiAoKGVyciA9IHNhdmVfbWl4ZXJfc3RhdGUoY20pKSA8IDApCisJCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwljbS0+c3BkaWZfcGxheWJhY2tfYXZhaWwgPSB1cDsKKwlpZiAodXApIHsKKwkJLyogdGhleSBhcmUgY29udHJvbGxlZCB2aWEgIklFQzk1OCBPdXRwdXQgU3dpdGNoIiAqLworCQkvKiBzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19MRUdBQ1lfQ1RSTCwgQ01fRU5TUERPVVQpOyAqLworCQkvKiBzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fU1BETzJEQUMpOyAqLworCQlpZiAoY20tPnNwZGlmX3BsYXliYWNrX2VuYWJsZWQpCisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fUExBWUJBQ0tfU1BERik7CisJCXNldHVwX2FjMyhjbSwgc3VicywgZG9fYWMzLCByYXRlKTsKKworCQlpZiAocmF0ZSA9PSA0ODAwMCkKKwkJCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fU1BESUY0OEsgfCBDTV9TUERGX0FDOTcpOworCQllbHNlCisJCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fU1BESUY0OEsgfCBDTV9TUERGX0FDOTcpOworCisJfSBlbHNlIHsKKwkJLyogdGhleSBhcmUgY29udHJvbGxlZCB2aWEgIklFQzk1OCBPdXRwdXQgU3dpdGNoIiAqLworCQkvKiBzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0xFR0FDWV9DVFJMLCBDTV9FTlNQRE9VVCk7ICovCisJCS8qIHNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfRlVOQ1RSTDEsIENNX1NQRE8yREFDKTsgKi8KKwkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fUExBWUJBQ0tfU1BERik7CisJCXNldHVwX2FjMyhjbSwgc3VicywgMCwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcHJlcGFyYXRpb24KKyAqLworCisvKiBwbGF5YmFjayAtIGVuYWJsZSBzcGRpZiBvbmx5IG9uIHRoZSBjZXJ0YWluIGNvbmRpdGlvbiAqLworc3RhdGljIGludCBzbmRfY21pcGNpX3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgcmF0ZSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKKwlpbnQgZXJyLCBkb19zcGRpZiwgZG9fYWMzID0gMDsKKworCWRvX3NwZGlmID0gKChyYXRlID09IDQ0MTAwIHx8IHJhdGUgPT0gNDgwMDApICYmCisJCSAgICBzdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSAmJgorCQkgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyA9PSAyKTsKKwlpZiAoZG9fc3BkaWYgJiYgY20tPmNhbl9hYzNfaHcpIAorCQlkb19hYzMgPSBjbS0+ZGlnX3BjbV9zdGF0dXMgJiBJRUM5NThfQUVTMF9OT05BVURJTzsKKwlpZiAoKGVyciA9IHNldHVwX3NwZGlmX3BsYXliYWNrKGNtLCBzdWJzdHJlYW0sIGRvX3NwZGlmLCBkb19hYzMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHNuZF9jbWlwY2lfcGNtX3ByZXBhcmUoY20sICZjbS0+Y2hhbm5lbFtDTV9DSF9QTEFZXSwgc3Vic3RyZWFtKTsKK30KKworLyogcGxheWJhY2sgICh2aWEgZGV2aWNlICMyKSAtIGVuYWJsZSBzcGRpZiBhbHdheXMgKi8KK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IGVyciwgZG9fYWMzOworCisJaWYgKGNtLT5jYW5fYWMzX2h3KSAKKwkJZG9fYWMzID0gY20tPmRpZ19wY21fc3RhdHVzICYgSUVDOTU4X0FFUzBfTk9OQVVESU87CisJZWxzZQorCQlkb19hYzMgPSAxOyAvKiBkb2Vzbid0IG1hdHRlciAqLworCWlmICgoZXJyID0gc2V0dXBfc3BkaWZfcGxheWJhY2soY20sIHN1YnN0cmVhbSwgMSwgZG9fYWMzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBzbmRfY21pcGNpX3BjbV9wcmVwYXJlKGNtLCAmY20tPmNoYW5uZWxbQ01fQ0hfUExBWV0sIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wbGF5YmFja19od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2V0dXBfc3BkaWZfcGxheWJhY2soY20sIHN1YnN0cmVhbSwgMCwgMCk7CisJcmVzdG9yZV9taXhlcl9zdGF0ZShjbSk7CisJcmV0dXJuIHNuZF9jbWlwY2lfaHdfZnJlZShzdWJzdHJlYW0pOworfQorCisvKiBjYXB0dXJlICovCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9jbWlwY2lfcGNtX3ByZXBhcmUoY20sICZjbS0+Y2hhbm5lbFtDTV9DSF9DQVBUXSwgc3Vic3RyZWFtKTsKK30KKworLyogY2FwdHVyZSB3aXRoIHNwZGlmICh2aWEgZGV2aWNlICMyKSAqLworc3RhdGljIGludCBzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fQ0FQVFVSRV9TUERGKTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gc25kX2NtaXBjaV9wY21fcHJlcGFyZShjbSwgJmNtLT5jaGFubmVsW0NNX0NIX0NBUFRdLCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKworCXNwaW5fbG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fQ0FQVFVSRV9TUERGKTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gc25kX2NtaXBjaV9od19mcmVlKHN1YnMpOworfQorCisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2NtaXBjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljbWlwY2lfdCAqY20gPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHN0YXR1cywgbWFzayA9IDA7CisJCisJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJc3RhdHVzID0gc25kX2NtaXBjaV9yZWFkKGNtLCBDTV9SRUdfSU5UX1NUQVRVUyk7CisJaWYgKCEoc3RhdHVzICYgQ01fSU5UUikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCXNwaW5fbG9jaygmY20tPnJlZ19sb2NrKTsKKwlpZiAoc3RhdHVzICYgQ01fQ0hJTlQwKQorCQltYXNrIHw9IENNX0NIMF9JTlRfRU47CisJaWYgKHN0YXR1cyAmIENNX0NISU5UMSkKKwkJbWFzayB8PSBDTV9DSDFfSU5UX0VOOworCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfSU5UX0hMRENMUiwgbWFzayk7CisJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfSU5UX0hMRENMUiwgbWFzayk7CisJc3Bpbl91bmxvY2soJmNtLT5yZWdfbG9jayk7CisKKwlpZiAoY20tPnJtaWRpICYmIChzdGF0dXMgJiBDTV9VQVJUSU5UKSkKKwkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIGNtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKworCWlmIChjbS0+cGNtKSB7CisJCWlmICgoc3RhdHVzICYgQ01fQ0hJTlQwKSAmJiBjbS0+Y2hhbm5lbFswXS5ydW5uaW5nKQorCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjbS0+Y2hhbm5lbFswXS5zdWJzdHJlYW0pOworCQlpZiAoKHN0YXR1cyAmIENNX0NISU5UMSkgJiYgY20tPmNoYW5uZWxbMV0ucnVubmluZykKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY20tPmNoYW5uZWxbMV0uc3Vic3RyZWFtKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogaC93IGluZm9zCisgKi8KKworLyogcGxheWJhY2sgb24gY2hhbm5lbCBBICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jbWlwY2lfcGxheWJhY2sgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfCBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNTUxMiB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MTIsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qIGNhcHR1cmUgb24gY2hhbm5lbCBCICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jbWlwY2lfY2FwdHVyZSA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8IFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV81NTEyIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNTUxMiwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworLyogcGxheWJhY2sgb24gY2hhbm5lbCBCIC0gc3RlcmVvIDE2Yml0IG9ubHk/ICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jbWlwY2lfcGxheWJhY2syID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNTUxMiB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MTIsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qIHNwZGlmIHBsYXliYWNrIG9uIGNoYW5uZWwgQSAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDQxMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qIHNwZGlmIHBsYXliYWNrIG9uIGNoYW5uZWwgQSAoMzJiaXQsIElFQzk1OCBzdWJmcmFtZXMpICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jbWlwY2lfcGxheWJhY2tfaWVjOTU4X3N1YmZyYW1lID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX0lFQzk1OF9TVUJGUkFNRV9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDQxMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qIHNwZGlmIGNhcHR1cmUgb24gY2hhbm5lbCBCICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZiA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8IFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0NDEwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkyLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworLyoKKyAqIGNoZWNrIGRldmljZSBvcGVuL2Nsb3NlCisgKi8KK3N0YXRpYyBpbnQgb3Blbl9kZXZpY2VfY2hlY2soY21pcGNpX3QgKmNtLCBpbnQgbW9kZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwlpbnQgY2ggPSBtb2RlICYgQ01fT1BFTl9DSF9NQVNLOworCisJLyogRklYTUU6IGEgZmlsZSBzaG91bGQgd2FpdCB1bnRpbCB0aGUgZGV2aWNlIGJlY29tZXMgZnJlZQorCSAqIHdoZW4gaXQncyBvcGVuZWQgb24gYmxvY2tpbmcgbW9kZS4gIGhvd2V2ZXIsIHNpbmNlIHRoZSBjdXJyZW50CisJICogcGNtIGZyYW1ld29yayBkb2Vzbid0IHBhc3MgZmlsZSBwb2ludGVyIGJlZm9yZSBhY3R1YWxseSBvcGVuZWQsCisJICogd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGJsb2NraW5nIG1vZGUgb3Igbm90IGluIG9wZW4gY2FsbGJhY2suLgorCSAqLworCWRvd24oJmNtLT5vcGVuX211dGV4KTsKKwlpZiAoY20tPm9wZW5lZFtjaF0pIHsKKwkJdXAoJmNtLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY20tPm9wZW5lZFtjaF0gPSBtb2RlOworCWNtLT5jaGFubmVsW2NoXS5zdWJzdHJlYW0gPSBzdWJzOworCWlmICghIChtb2RlICYgQ01fT1BFTl9EQUMpKSB7CisJCS8qIGRpc2FibGUgZHVhbCBEQUMgbW9kZSAqLworCQljbS0+Y2hhbm5lbFtjaF0uaXNfZGFjID0gMDsKKwkJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX0VOREJEQUMpOworCQlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJfQorCXVwKCZjbS0+b3Blbl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2RldmljZV9jaGVjayhjbWlwY2lfdCAqY20sIGludCBtb2RlKQoreworCWludCBjaCA9IG1vZGUgJiBDTV9PUEVOX0NIX01BU0s7CisKKwlkb3duKCZjbS0+b3Blbl9tdXRleCk7CisJaWYgKGNtLT5vcGVuZWRbY2hdID09IG1vZGUpIHsKKwkJaWYgKGNtLT5jaGFubmVsW2NoXS5zdWJzdHJlYW0pIHsKKwkJCXNuZF9jbWlwY2lfY2hfcmVzZXQoY20sIGNoKTsKKwkJCWNtLT5jaGFubmVsW2NoXS5ydW5uaW5nID0gMDsKKwkJCWNtLT5jaGFubmVsW2NoXS5zdWJzdHJlYW0gPSBOVUxMOworCQl9CisJCWNtLT5vcGVuZWRbY2hdID0gMDsKKwkJaWYgKCEgY20tPmNoYW5uZWxbY2hdLmlzX2RhYykgeworCQkJLyogZW5hYmxlIGR1YWwgREFDIG1vZGUgYWdhaW4gKi8KKwkJCWNtLT5jaGFubmVsW2NoXS5pc19kYWMgPSAxOworCQkJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwkJCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fRU5EQkRBQyk7CisJCQlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJCX0KKwl9CisJdXAoJmNtLT5vcGVuX211dGV4KTsKK30KKworLyoKKyAqLworCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IG9wZW5fZGV2aWNlX2NoZWNrKGNtLCBDTV9PUEVOX1BMQVlCQUNLLCBzdWJzdHJlYW0pKSA8IDApCisJCXJldHVybiBlcnI7CisJcnVudGltZS0+aHcgPSBzbmRfY21pcGNpX3BsYXliYWNrOworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNtLT5tYXhfY2hhbm5lbHM7CisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUsIDAsIDB4MTAwMDApOworCWNtLT5kaWdfcGNtX3N0YXR1cyA9IGNtLT5kaWdfc3RhdHVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gb3Blbl9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fQ0FQVFVSRSwgc3Vic3RyZWFtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJ1bnRpbWUtPmh3ID0gc25kX2NtaXBjaV9jYXB0dXJlOworCWlmIChjbS0+Y2hpcF92ZXJzaW9uID09IDY4KSB7CS8vIDg3Njggb25seSBzdXBwb3J0cyA0NGsvNDhrIHJlY29yZGluZworCQlydW50aW1lLT5ody5yYXRlX21pbiA9IDQxMDAwOworCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDA7CisJfQorCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCAwLCAweDEwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3BsYXliYWNrMl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gb3Blbl9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fUExBWUJBQ0syLCBzdWJzdHJlYW0pKSA8IDApIC8qIHVzZSBjaGFubmVsIEIgKi8KKwkJcmV0dXJuIGVycjsKKwlydW50aW1lLT5odyA9IHNuZF9jbWlwY2lfcGxheWJhY2syOworCWRvd24oJmNtLT5vcGVuX211dGV4KTsKKwlpZiAoISBjbS0+b3BlbmVkW0NNX0NIX1BMQVldKSB7CisJCWlmIChjbS0+Y2FuX211bHRpX2NoKSB7CisJCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBjbS0+bWF4X2NoYW5uZWxzOworCQkJaWYgKGNtLT5tYXhfY2hhbm5lbHMgPT0gNCkKKwkJCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsICZod19jb25zdHJhaW50c19jaGFubmVsc180KTsKKwkJCWVsc2UgaWYgKGNtLT5tYXhfY2hhbm5lbHMgPT0gNikKKwkJCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsICZod19jb25zdHJhaW50c19jaGFubmVsc182KTsKKwkJCWVsc2UgaWYgKGNtLT5tYXhfY2hhbm5lbHMgPT0gOCkKKwkJCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsICZod19jb25zdHJhaW50c19jaGFubmVsc184KTsKKwkJfQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgMCwgMHgxMDAwMCk7CisJfQorCXVwKCZjbS0+b3Blbl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gb3Blbl9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fU1BESUZfUExBWUJBQ0ssIHN1YnN0cmVhbSkpIDwgMCkgLyogdXNlIGNoYW5uZWwgQSAqLworCQlyZXR1cm4gZXJyOworCWlmIChjbS0+Y2FuX2FjM19odykgeworCQlydW50aW1lLT5odyA9IHNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWY7CisJCWlmIChjbS0+Y2hpcF92ZXJzaW9uID49IDM3KQorCQkJcnVudGltZS0+aHcuZm9ybWF0cyB8PSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRTsKKwl9IGVsc2UgeworCQlydW50aW1lLT5odyA9IHNuZF9jbWlwY2lfcGxheWJhY2tfaWVjOTU4X3N1YmZyYW1lOworCX0KKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgMCwgMHg0MDAwMCk7CisJY20tPmRpZ19wY21fc3RhdHVzID0gY20tPmRpZ19zdGF0dXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gb3Blbl9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fU1BESUZfQ0FQVFVSRSwgc3Vic3RyZWFtKSkgPCAwKSAvKiB1c2UgY2hhbm5lbCBCICovCisJCXJldHVybiBlcnI7CisJcnVudGltZS0+aHcgPSBzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWY7CisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUsIDAsIDB4NDAwMDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKi8KKworc3RhdGljIGludCBzbmRfY21pcGNpX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNsb3NlX2RldmljZV9jaGVjayhjbSwgQ01fT1BFTl9QTEFZQkFDSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY21pcGNpX3QgKmNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNsb3NlX2RldmljZV9jaGVjayhjbSwgQ01fT1BFTl9DQVBUVVJFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3BsYXliYWNrMl9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwljbG9zZV9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fUExBWUJBQ0syKTsKKwljbG9zZV9kZXZpY2VfY2hlY2soY20sIENNX09QRU5fUExBWUJBQ0tfTVVMVEkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY2xvc2VfZGV2aWNlX2NoZWNrKGNtLCBDTV9PUEVOX1NQRElGX1BMQVlCQUNLKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY2xvc2VfZGV2aWNlX2NoZWNrKGNtLCBDTV9PUEVOX1NQRElGX0NBUFRVUkUpOworCXJldHVybiAwOworfQorCisKKy8qCisgKi8KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NtaXBjaV9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2NtaXBjaV9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9jbWlwY2lfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9jbWlwY2lfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2NtaXBjaV9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2NtaXBjaV9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2NtaXBjaV9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2NtaXBjaV9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NtaXBjaV9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfY21pcGNpX2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfY21pcGNpX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9jbWlwY2lfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2NtaXBjaV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2NtaXBjaV9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfY21pcGNpX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NtaXBjaV9wbGF5YmFjazJfb3BzID0geworCS5vcGVuID0JCXNuZF9jbWlwY2lfcGxheWJhY2syX29wZW4sCisJLmNsb3NlID0Jc25kX2NtaXBjaV9wbGF5YmFjazJfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9jbWlwY2lfcGxheWJhY2syX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9jbWlwY2lfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wcmVwYXJlLAkvKiBjaGFubmVsIEIgKi8KKwkudHJpZ2dlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV90cmlnZ2VyLAkvKiBjaGFubmVsIEIgKi8KKwkucG9pbnRlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyLAkvKiBjaGFubmVsIEIgKi8KK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BlbiwKKwkuY2xvc2UgPQlzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfY21pcGNpX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9jbWlwY2lfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfcHJlcGFyZSwJLyogc2V0IHVwIHJhdGUgKi8KKwkudHJpZ2dlciA9CXNuZF9jbWlwY2lfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9jbWlwY2lfcGxheWJhY2tfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfY21pcGNpX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfY21pcGNpX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyLAorfTsKKworCisvKgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jbWlwY2lfcGNtX25ldyhjbWlwY2lfdCAqY20sIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGNtLT5jYXJkLCBjbS0+Y2FyZC0+ZHJpdmVyLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9jbWlwY2lfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY21pcGNpX2NhcHR1cmVfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY207CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfY21pcGNpX3BjbV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIkMtTWVkaWEgUENJIERBQy9BREMiKTsKKwljbS0+cGNtID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjbS0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jbWlwY2lfcGNtMl9uZXcoY21pcGNpX3QgKmNtLCBpbnQgZGV2aWNlKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfcGNtX25ldyhjbS0+Y2FyZCwgY20tPmNhcmQtPmRyaXZlciwgZGV2aWNlLCAxLCAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfY21pcGNpX3BsYXliYWNrMl9vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBjbTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9jbWlwY2lfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiQy1NZWRpYSBQQ0kgMm5kIERBQyIpOworCWNtLT5wY20yID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjbS0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jbWlwY2lfcGNtX3NwZGlmX25ldyhjbWlwY2lfdCAqY20sIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGNtLT5jYXJkLCBjbS0+Y2FyZC0+ZHJpdmVyLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY207CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfY21pcGNpX3BjbV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIkMtTWVkaWEgUENJIElFQzk1OCIpOworCWNtLT5wY21fc3BkaWYgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNtLT5wY2kpLCA2NCoxMDI0LCAxMjgqMTAyNCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1peGVyIGludGVyZmFjZToKKyAqIC0gQ004MzM4Lzg3MzggaGFzIGEgY29tcGF0aWJsZSBtaXhlciBpbnRlcmZhY2Ugd2l0aCBTQjE2LCBidXQKKyAqICAgbGFjayBvZiBzb21lIGVsZW1lbnRzIGxpa2UgdG9uZSBjb250cm9sLCBpL28gZ2FpbiBhbmQgQUdDLgorICogLSBBY2Nlc3MgdG8gbmF0aXZlIHJlZ2lzdGVyczoKKyAqICAgLSBBIDNEIHN3aXRjaAorICogICAtIE91dHB1dCBtdXRlIHN3aXRjaGVzCisgKi8KKworc3RhdGljIHZvaWQgc25kX2NtaXBjaV9taXhlcl93cml0ZShjbWlwY2lfdCAqcywgdW5zaWduZWQgY2hhciBpZHgsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGlkeCwgcy0+aW9iYXNlICsgQ01fUkVHX1NCMTZfQUREUik7CisJb3V0YihkYXRhLCBzLT5pb2Jhc2UgKyBDTV9SRUdfU0IxNl9EQVRBKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX2NtaXBjaV9taXhlcl9yZWFkKGNtaXBjaV90ICpzLCB1bnNpZ25lZCBjaGFyIGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHY7CisKKwlvdXRiKGlkeCwgcy0+aW9iYXNlICsgQ01fUkVHX1NCMTZfQUREUik7CisJdiA9IGluYihzLT5pb2Jhc2UgKyBDTV9SRUdfU0IxNl9EQVRBKTsKKwlyZXR1cm4gdjsKK30KKworLyoKKyAqIGdlbmVyYWwgbWl4ZXIgZWxlbWVudAorICovCit0eXBlZGVmIHN0cnVjdCBjbWlwY2lfc2JfcmVnIHsKKwl1bnNpZ25lZCBpbnQgbGVmdF9yZWcsIHJpZ2h0X3JlZzsKKwl1bnNpZ25lZCBpbnQgbGVmdF9zaGlmdCwgcmlnaHRfc2hpZnQ7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IGludmVydDogMTsKKwl1bnNpZ25lZCBpbnQgc3RlcmVvOiAxOworfSBjbWlwY2lfc2JfcmVnX3Q7CisKKyNkZWZpbmUgQ09NUE9TRV9TQl9SRUcobHJlZyxycmVnLGxzaGlmdCxyc2hpZnQsbWFzayxpbnZlcnQsc3RlcmVvKSBcCisgKChscmVnKSB8ICgocnJlZykgPDwgOCkgfCAobHNoaWZ0IDw8IDE2KSB8IChyc2hpZnQgPDwgMTkpIHwgKG1hc2sgPDwgMjQpIHwgKGludmVydCA8PCAyMikgfCAoc3RlcmVvIDw8IDIzKSkKKworI2RlZmluZSBDTUlQQ0lfRE9VQkxFKHhuYW1lLCBsZWZ0X3JlZywgcmlnaHRfcmVnLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCwgbWFzaywgaW52ZXJ0LCBzdGVyZW8pIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZm8gPSBzbmRfY21pcGNpX2luZm9fdm9sdW1lLCBcCisgIC5nZXQgPSBzbmRfY21pcGNpX2dldF92b2x1bWUsIC5wdXQgPSBzbmRfY21pcGNpX3B1dF92b2x1bWUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBDT01QT1NFX1NCX1JFRyhsZWZ0X3JlZywgcmlnaHRfcmVnLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCwgbWFzaywgaW52ZXJ0LCBzdGVyZW8pLCBcCit9CisKKyNkZWZpbmUgQ01JUENJX1NCX1ZPTF9TVEVSRU8oeG5hbWUscmVnLHNoaWZ0LG1hc2spIENNSVBDSV9ET1VCTEUoeG5hbWUsIHJlZywgcmVnKzEsIHNoaWZ0LCBzaGlmdCwgbWFzaywgMCwgMSkKKyNkZWZpbmUgQ01JUENJX1NCX1ZPTF9NT05PKHhuYW1lLHJlZyxzaGlmdCxtYXNrKSBDTUlQQ0lfRE9VQkxFKHhuYW1lLCByZWcsIHJlZywgc2hpZnQsIHNoaWZ0LCBtYXNrLCAwLCAwKQorI2RlZmluZSBDTUlQQ0lfU0JfU1dfU1RFUkVPKHhuYW1lLGxzaGlmdCxyc2hpZnQpIENNSVBDSV9ET1VCTEUoeG5hbWUsIFNCX0RTUDRfT1VUUFVUX1NXLCBTQl9EU1A0X09VVFBVVF9TVywgbHNoaWZ0LCByc2hpZnQsIDEsIDAsIDEpCisjZGVmaW5lIENNSVBDSV9TQl9TV19NT05PKHhuYW1lLHNoaWZ0KSBDTUlQQ0lfRE9VQkxFKHhuYW1lLCBTQl9EU1A0X09VVFBVVF9TVywgU0JfRFNQNF9PVVRQVVRfU1csIHNoaWZ0LCBzaGlmdCwgMSwgMCwgMCkKKworc3RhdGljIHZvaWQgY21pcGNpX3NiX3JlZ19kZWNvZGUoY21pcGNpX3NiX3JlZ190ICpyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlyLT5sZWZ0X3JlZyA9IHZhbCAmIDB4ZmY7CisJci0+cmlnaHRfcmVnID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJci0+bGVmdF9zaGlmdCA9ICh2YWwgPj4gMTYpICYgMHgwNzsKKwlyLT5yaWdodF9zaGlmdCA9ICh2YWwgPj4gMTkpICYgMHgwNzsKKwlyLT5pbnZlcnQgPSAodmFsID4+IDIyKSAmIDE7CisJci0+c3RlcmVvID0gKHZhbCA+PiAyMykgJiAxOworCXItPm1hc2sgPSAodmFsID4+IDI0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9pbmZvX3ZvbHVtZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJY21pcGNpX3NiX3JlZ190IHJlZzsKKworCWNtaXBjaV9zYl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl1aW5mby0+dHlwZSA9IHJlZy5tYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gcmVnLnN0ZXJlbyArIDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSByZWcubWFzazsKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9nZXRfdm9sdW1lKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY21pcGNpX3QgKmNtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWNtaXBjaV9zYl9yZWdfdCByZWc7CisJaW50IHZhbDsKKworCWNtaXBjaV9zYl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlzcGluX2xvY2tfaXJxKCZjbS0+cmVnX2xvY2spOworCXZhbCA9IChzbmRfY21pcGNpX21peGVyX3JlYWQoY20sIHJlZy5sZWZ0X3JlZykgPj4gcmVnLmxlZnRfc2hpZnQpICYgcmVnLm1hc2s7CisJaWYgKHJlZy5pbnZlcnQpCisJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsOworCWlmIChyZWcuc3RlcmVvKSB7CisJCXZhbCA9IChzbmRfY21pcGNpX21peGVyX3JlYWQoY20sIHJlZy5yaWdodF9yZWcpID4+IHJlZy5yaWdodF9zaGlmdCkgJiByZWcubWFzazsKKwkJaWYgKHJlZy5pbnZlcnQpCisJCQl2YWwgPSByZWcubWFzayAtIHZhbDsKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdmFsOworCX0KKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wdXRfdm9sdW1lKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY21pcGNpX3QgKmNtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWNtaXBjaV9zYl9yZWdfdCByZWc7CisJaW50IGNoYW5nZTsKKwlpbnQgbGVmdCwgcmlnaHQsIG9sZWZ0LCBvcmlnaHQ7CisKKwljbWlwY2lfc2JfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJbGVmdCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgcmVnLm1hc2s7CisJaWYgKHJlZy5pbnZlcnQpCisJCWxlZnQgPSByZWcubWFzayAtIGxlZnQ7CisJbGVmdCA8PD0gcmVnLmxlZnRfc2hpZnQ7CisJaWYgKHJlZy5zdGVyZW8pIHsKKwkJcmlnaHQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIHJlZy5tYXNrOworCQlpZiAocmVnLmludmVydCkKKwkJCXJpZ2h0ID0gcmVnLm1hc2sgLSByaWdodDsKKwkJcmlnaHQgPDw9IHJlZy5yaWdodF9zaGlmdDsKKwl9IGVsc2UKKwkJcmlnaHQgPSAwOworCXNwaW5fbG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJb2xlZnQgPSBzbmRfY21pcGNpX21peGVyX3JlYWQoY20sIHJlZy5sZWZ0X3JlZyk7CisJbGVmdCB8PSBvbGVmdCAmIH4ocmVnLm1hc2sgPDwgcmVnLmxlZnRfc2hpZnQpOworCWNoYW5nZSA9IGxlZnQgIT0gb2xlZnQ7CisJaWYgKHJlZy5zdGVyZW8pIHsKKwkJaWYgKHJlZy5sZWZ0X3JlZyAhPSByZWcucmlnaHRfcmVnKSB7CisJCQlzbmRfY21pcGNpX21peGVyX3dyaXRlKGNtLCByZWcubGVmdF9yZWcsIGxlZnQpOworCQkJb3JpZ2h0ID0gc25kX2NtaXBjaV9taXhlcl9yZWFkKGNtLCByZWcucmlnaHRfcmVnKTsKKwkJfSBlbHNlCisJCQlvcmlnaHQgPSBsZWZ0OworCQlyaWdodCB8PSBvcmlnaHQgJiB+KHJlZy5tYXNrIDw8IHJlZy5yaWdodF9zaGlmdCk7CisJCWNoYW5nZSB8PSByaWdodCAhPSBvcmlnaHQ7CisJCXNuZF9jbWlwY2lfbWl4ZXJfd3JpdGUoY20sIHJlZy5yaWdodF9yZWcsIHJpZ2h0KTsKKwl9IGVsc2UKKwkJc25kX2NtaXBjaV9taXhlcl93cml0ZShjbSwgcmVnLmxlZnRfcmVnLCBsZWZ0KTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIGlucHV0IHJvdXRlIChsZWZ0LHJpZ2h0KSAtPiAobGVmdCxyaWdodCkKKyAqLworI2RlZmluZSBDTUlQQ0lfU0JfSU5QVVRfU1coeG5hbWUsIGxlZnRfc2hpZnQsIHJpZ2h0X3NoaWZ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2NtaXBjaV9pbmZvX2lucHV0X3N3LCBcCisgIC5nZXQgPSBzbmRfY21pcGNpX2dldF9pbnB1dF9zdywgLnB1dCA9IHNuZF9jbWlwY2lfcHV0X2lucHV0X3N3LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9TQl9SRUcoU0JfRFNQNF9JTlBVVF9MRUZULCBTQl9EU1A0X0lOUFVUX1JJR0hULCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCwgMSwgMCwgMSksIFwKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX2luZm9faW5wdXRfc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDQ7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorIAorc3RhdGljIGludCBzbmRfY21pcGNpX2dldF9pbnB1dF9zdyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwljbWlwY2lfc2JfcmVnX3QgcmVnOworCWludCB2YWwxLCB2YWwyOworCisJY21pcGNpX3NiX3JlZ19kZWNvZGUoJnJlZywga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCXNwaW5fbG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJdmFsMSA9IHNuZF9jbWlwY2lfbWl4ZXJfcmVhZChjbSwgcmVnLmxlZnRfcmVnKTsKKwl2YWwyID0gc25kX2NtaXBjaV9taXhlcl9yZWFkKGNtLCByZWcucmlnaHRfcmVnKTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodmFsMSA+PiByZWcubGVmdF9zaGlmdCkgJiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gKHZhbDIgPj4gcmVnLmxlZnRfc2hpZnQpICYgMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9ICh2YWwxID4+IHJlZy5yaWdodF9zaGlmdCkgJiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gKHZhbDIgPj4gcmVnLnJpZ2h0X3NoaWZ0KSAmIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9wdXRfaW5wdXRfc3coc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJY21pcGNpX3NiX3JlZ190IHJlZzsKKwlpbnQgY2hhbmdlOworCWludCB2YWwxLCB2YWwyLCBvdmFsMSwgb3ZhbDI7CisKKwljbWlwY2lfc2JfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlvdmFsMSA9IHNuZF9jbWlwY2lfbWl4ZXJfcmVhZChjbSwgcmVnLmxlZnRfcmVnKTsKKwlvdmFsMiA9IHNuZF9jbWlwY2lfbWl4ZXJfcmVhZChjbSwgcmVnLnJpZ2h0X3JlZyk7CisJdmFsMSA9IG92YWwxICYgfigoMSA8PCByZWcubGVmdF9zaGlmdCkgfCAoMSA8PCByZWcucmlnaHRfc2hpZnQpKTsKKwl2YWwyID0gb3ZhbDIgJiB+KCgxIDw8IHJlZy5sZWZ0X3NoaWZ0KSB8ICgxIDw8IHJlZy5yaWdodF9zaGlmdCkpOworCXZhbDEgfD0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMSkgPDwgcmVnLmxlZnRfc2hpZnQ7CisJdmFsMiB8PSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiAxKSA8PCByZWcubGVmdF9zaGlmdDsKKwl2YWwxIHw9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAmIDEpIDw8IHJlZy5yaWdodF9zaGlmdDsKKwl2YWwyIHw9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSAmIDEpIDw8IHJlZy5yaWdodF9zaGlmdDsKKwljaGFuZ2UgPSB2YWwxICE9IG92YWwxIHx8IHZhbDIgIT0gb3ZhbDI7CisJc25kX2NtaXBjaV9taXhlcl93cml0ZShjbSwgcmVnLmxlZnRfcmVnLCB2YWwxKTsKKwlzbmRfY21pcGNpX21peGVyX3dyaXRlKGNtLCByZWcucmlnaHRfcmVnLCB2YWwyKTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIG5hdGl2ZSBtaXhlciBzd2l0Y2hlcy92b2x1bWVzCisgKi8KKworI2RlZmluZSBDTUlQQ0lfTUlYRVJfU1dfU1RFUkVPKHhuYW1lLCByZWcsIGxzaGlmdCwgcnNoaWZ0LCBpbnZlcnQpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZm8gPSBzbmRfY21pcGNpX2luZm9fbmF0aXZlX21peGVyLCBcCisgIC5nZXQgPSBzbmRfY21pcGNpX2dldF9uYXRpdmVfbWl4ZXIsIC5wdXQgPSBzbmRfY21pcGNpX3B1dF9uYXRpdmVfbWl4ZXIsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBDT01QT1NFX1NCX1JFRyhyZWcsIHJlZywgbHNoaWZ0LCByc2hpZnQsIDEsIGludmVydCwgMSksIFwKK30KKworI2RlZmluZSBDTUlQQ0lfTUlYRVJfU1dfTU9OTyh4bmFtZSwgcmVnLCBzaGlmdCwgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2NtaXBjaV9pbmZvX25hdGl2ZV9taXhlciwgXAorICAuZ2V0ID0gc25kX2NtaXBjaV9nZXRfbmF0aXZlX21peGVyLCAucHV0ID0gc25kX2NtaXBjaV9wdXRfbmF0aXZlX21peGVyLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9TQl9SRUcocmVnLCByZWcsIHNoaWZ0LCBzaGlmdCwgMSwgaW52ZXJ0LCAwKSwgXAorfQorCisjZGVmaW5lIENNSVBDSV9NSVhFUl9WT0xfU1RFUkVPKHhuYW1lLCByZWcsIGxzaGlmdCwgcnNoaWZ0LCBtYXNrKSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2NtaXBjaV9pbmZvX25hdGl2ZV9taXhlciwgXAorICAuZ2V0ID0gc25kX2NtaXBjaV9nZXRfbmF0aXZlX21peGVyLCAucHV0ID0gc25kX2NtaXBjaV9wdXRfbmF0aXZlX21peGVyLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gQ09NUE9TRV9TQl9SRUcocmVnLCByZWcsIGxzaGlmdCwgcnNoaWZ0LCBtYXNrLCAwLCAxKSwgXAorfQorCisjZGVmaW5lIENNSVBDSV9NSVhFUl9WT0xfTU9OTyh4bmFtZSwgcmVnLCBzaGlmdCwgbWFzaykgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5mbyA9IHNuZF9jbWlwY2lfaW5mb19uYXRpdmVfbWl4ZXIsIFwKKyAgLmdldCA9IHNuZF9jbWlwY2lfZ2V0X25hdGl2ZV9taXhlciwgLnB1dCA9IHNuZF9jbWlwY2lfcHV0X25hdGl2ZV9taXhlciwgXAorICAucHJpdmF0ZV92YWx1ZSA9IENPTVBPU0VfU0JfUkVHKHJlZywgcmVnLCBzaGlmdCwgc2hpZnQsIG1hc2ssIDAsIDApLCBcCit9CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9pbmZvX25hdGl2ZV9taXhlcihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCWNtaXBjaV9zYl9yZWdfdCByZWc7CisKKwljbWlwY2lfc2JfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdWluZm8tPnR5cGUgPSByZWcubWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IHJlZy5zdGVyZW8gKyAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcmVnLm1hc2s7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX2dldF9uYXRpdmVfbWl4ZXIoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJY21pcGNpX3NiX3JlZ190IHJlZzsKKwl1bnNpZ25lZCBjaGFyIG9yZWcsIHZhbDsKKworCWNtaXBjaV9zYl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlzcGluX2xvY2tfaXJxKCZjbS0+cmVnX2xvY2spOworCW9yZWcgPSBpbmIoY20tPmlvYmFzZSArIHJlZy5sZWZ0X3JlZyk7CisJdmFsID0gKG9yZWcgPj4gcmVnLmxlZnRfc2hpZnQpICYgcmVnLm1hc2s7CisJaWYgKHJlZy5pbnZlcnQpCisJCXZhbCA9IHJlZy5tYXNrIC0gdmFsOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsOworCWlmIChyZWcuc3RlcmVvKSB7CisJCXZhbCA9IChvcmVnID4+IHJlZy5yaWdodF9zaGlmdCkgJiByZWcubWFzazsKKwkJaWYgKHJlZy5pbnZlcnQpCisJCQl2YWwgPSByZWcubWFzayAtIHZhbDsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSB2YWw7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3B1dF9uYXRpdmVfbWl4ZXIoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljbWlwY2lfdCAqY20gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJY21pcGNpX3NiX3JlZ190IHJlZzsKKwl1bnNpZ25lZCBjaGFyIG9yZWcsIG5yZWcsIHZhbDsKKworCWNtaXBjaV9zYl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlzcGluX2xvY2tfaXJxKCZjbS0+cmVnX2xvY2spOworCW9yZWcgPSBpbmIoY20tPmlvYmFzZSArIHJlZy5sZWZ0X3JlZyk7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiByZWcubWFzazsKKwlpZiAocmVnLmludmVydCkKKwkJdmFsID0gcmVnLm1hc2sgLSB2YWw7CisJbnJlZyA9IG9yZWcgJiB+KHJlZy5tYXNrIDw8IHJlZy5sZWZ0X3NoaWZ0KTsKKwlucmVnIHw9ICh2YWwgPDwgcmVnLmxlZnRfc2hpZnQpOworCWlmIChyZWcuc3RlcmVvKSB7CisJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgcmVnLm1hc2s7CisJCWlmIChyZWcuaW52ZXJ0KQorCQkJdmFsID0gcmVnLm1hc2sgLSB2YWw7CisJCW5yZWcgJj0gfihyZWcubWFzayA8PCByZWcucmlnaHRfc2hpZnQpOworCQlucmVnIHw9ICh2YWwgPDwgcmVnLnJpZ2h0X3NoaWZ0KTsKKwl9CisJb3V0YihucmVnLCBjbS0+aW9iYXNlICsgcmVnLmxlZnRfcmVnKTsKKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJcmV0dXJuIChucmVnICE9IG9yZWcpOworfQorCisvKgorICogc3BlY2lhbCBjYXNlIC0gY2hlY2sgbWl4ZXIgc2Vuc2l0aXZpdHkKKyAqLworc3RhdGljIGludCBzbmRfY21pcGNpX2dldF9uYXRpdmVfbWl4ZXJfc2Vuc2l0aXZlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCS8vY21pcGNpX3QgKmNtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXJldHVybiBzbmRfY21pcGNpX2dldF9uYXRpdmVfbWl4ZXIoa2NvbnRyb2wsIHVjb250cm9sKTsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3B1dF9uYXRpdmVfbWl4ZXJfc2Vuc2l0aXZlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNtaXBjaV90ICpjbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpZiAoY20tPm1peGVyX2luc2Vuc2l0aXZlKSB7CisJCS8qIGlnbm9yZWQgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzbmRfY21pcGNpX3B1dF9uYXRpdmVfbWl4ZXIoa2NvbnRyb2wsIHVjb250cm9sKTsKK30KKworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfbWl4ZXJzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlDTUlQQ0lfU0JfVk9MX1NURVJFTygiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIFNCX0RTUDRfTUFTVEVSX0RFViwgMywgMzEpLAorCUNNSVBDSV9NSVhFUl9TV19NT05PKCIzRCBDb250cm9sIC0gU3dpdGNoIiwgQ01fUkVHX01JWEVSMSwgQ01fWDNERU5fU0hJRlQsIDApLAorCUNNSVBDSV9TQl9WT0xfU1RFUkVPKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgU0JfRFNQNF9QQ01fREVWLCAzLCAzMSksCisJLy9DTUlQQ0lfTUlYRVJfU1dfTU9OTygiUENNIFBsYXliYWNrIFN3aXRjaCIsIENNX1JFR19NSVhFUjEsIENNX1dTTVVURV9TSElGVCwgMSksCisJeyAvKiBzd2l0Y2ggd2l0aCBzZW5zaXRpdml0eSAqLworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gc25kX2NtaXBjaV9pbmZvX25hdGl2ZV9taXhlciwKKwkJLmdldCA9IHNuZF9jbWlwY2lfZ2V0X25hdGl2ZV9taXhlcl9zZW5zaXRpdmUsCisJCS5wdXQgPSBzbmRfY21pcGNpX3B1dF9uYXRpdmVfbWl4ZXJfc2Vuc2l0aXZlLAorCQkucHJpdmF0ZV92YWx1ZSA9IENPTVBPU0VfU0JfUkVHKENNX1JFR19NSVhFUjEsIENNX1JFR19NSVhFUjEsIENNX1dTTVVURV9TSElGVCwgQ01fV1NNVVRFX1NISUZULCAxLCAxLCAwKSwKKwl9LAorCUNNSVBDSV9NSVhFUl9TV19TVEVSRU8oIlBDTSBDYXB0dXJlIFN3aXRjaCIsIENNX1JFR19NSVhFUjEsIENNX1dBVkVJTkxfU0hJRlQsIENNX1dBVkVJTlJfU0hJRlQsIDApLAorCUNNSVBDSV9TQl9WT0xfU1RFUkVPKCJTeW50aCBQbGF5YmFjayBWb2x1bWUiLCBTQl9EU1A0X1NZTlRIX0RFViwgMywgMzEpLAorCUNNSVBDSV9NSVhFUl9TV19NT05PKCJTeW50aCBQbGF5YmFjayBTd2l0Y2giLCBDTV9SRUdfTUlYRVIxLCBDTV9GTU1VVEVfU0hJRlQsIDEpLAorCUNNSVBDSV9TQl9JTlBVVF9TVygiU3ludGggQ2FwdHVyZSBSb3V0ZSIsIDYsIDUpLAorCUNNSVBDSV9TQl9WT0xfU1RFUkVPKCJDRCBQbGF5YmFjayBWb2x1bWUiLCBTQl9EU1A0X0NEX0RFViwgMywgMzEpLAorCUNNSVBDSV9TQl9TV19TVEVSRU8oIkNEIFBsYXliYWNrIFN3aXRjaCIsIDIsIDEpLAorCUNNSVBDSV9TQl9JTlBVVF9TVygiQ0QgQ2FwdHVyZSBSb3V0ZSIsIDIsIDEpLAorCUNNSVBDSV9TQl9WT0xfU1RFUkVPKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIFNCX0RTUDRfTElORV9ERVYsIDMsIDMxKSwKKwlDTUlQQ0lfU0JfU1dfU1RFUkVPKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDQsIDMpLAorCUNNSVBDSV9TQl9JTlBVVF9TVygiTGluZSBDYXB0dXJlIFJvdXRlIiwgNCwgMyksCisJQ01JUENJX1NCX1ZPTF9NT05PKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgU0JfRFNQNF9NSUNfREVWLCAzLCAzMSksCisJQ01JUENJX1NCX1NXX01PTk8oIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAwKSwKKwlDTUlQQ0lfRE9VQkxFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCBTQl9EU1A0X0lOUFVUX0xFRlQsIFNCX0RTUDRfSU5QVVRfUklHSFQsIDAsIDAsIDEsIDAsIDApLAorCUNNSVBDSV9TQl9WT0xfTU9OTygiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBTQl9EU1A0X1NQRUFLRVJfREVWLCA2LCAzKSwKKwlDTUlQQ0lfTUlYRVJfVk9MX1NURVJFTygiQXV4IFBsYXliYWNrIFZvbHVtZSIsIENNX1JFR19BVVhfVk9MLCA0LCAwLCAxNSksCisJQ01JUENJX01JWEVSX1NXX1NURVJFTygiQXV4IFBsYXliYWNrIFN3aXRjaCIsIENNX1JFR19NSVhFUjIsIENNX1ZBVVhMTV9TSElGVCwgQ01fVkFVWFJNX1NISUZULCAwKSwKKwlDTUlQQ0lfTUlYRVJfU1dfU1RFUkVPKCJBdXggQ2FwdHVyZSBTd2l0Y2giLCBDTV9SRUdfTUlYRVIyLCBDTV9SQVVYTEVOX1NISUZULCBDTV9SQVVYUkVOX1NISUZULCAwKSwKKwlDTUlQQ0lfTUlYRVJfU1dfTU9OTygiTWljIEJvb3N0IiwgQ01fUkVHX01JWEVSMiwgQ01fTUlDR0FJTlpfU0hJRlQsIDEpLAorCUNNSVBDSV9NSVhFUl9WT0xfTU9OTygiTWljIENhcHR1cmUgVm9sdW1lIiwgQ01fUkVHX01JWEVSMiwgQ01fVkFETUlDX1NISUZULCA3KSwKK307CisKKy8qCisgKiBvdGhlciBzd2l0Y2hlcworICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9jbWlwY2lfc3dpdGNoX2FyZ3MgeworCWludCByZWc7CQkvKiByZWdpc3RlciBpbmRleCAqLworCXVuc2lnbmVkIGludCBtYXNrOwkvKiBtYXNrIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgbWFza19vbjsJLyogbWFzayBiaXRzIHRvIHR1cm4gb24gKi8KKwl1bnNpZ25lZCBpbnQgaXNfYnl0ZTogMTsJCS8qIGJ5dGUgYWNjZXNzPyAqLworCXVuc2lnbmVkIGludCBhYzNfc2Vuc2l0aXZlOiAxOwkvKiBhY2Nlc3MgZm9yYmlkZGVuIGR1cmluZyBub24tYXVkaW8gb3BlcmF0aW9uPyAqLworfSBzbmRfY21pcGNpX3N3aXRjaF9hcmdzX3Q7CisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV91c3dpdGNoX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc25kX2NtaXBjaV91c3dpdGNoX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCwgc25kX2NtaXBjaV9zd2l0Y2hfYXJnc190ICphcmdzKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJY21pcGNpX3QgKmNtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlpZiAoYXJncy0+YWMzX3NlbnNpdGl2ZSAmJiBjbS0+bWl4ZXJfaW5zZW5zaXRpdmUpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYXJncy0+aXNfYnl0ZSkKKwkJdmFsID0gaW5iKGNtLT5pb2Jhc2UgKyBhcmdzLT5yZWcpOworCWVsc2UKKwkJdmFsID0gc25kX2NtaXBjaV9yZWFkKGNtLCBhcmdzLT5yZWcpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKCh2YWwgJiBhcmdzLT5tYXNrKSA9PSBhcmdzLT5tYXNrX29uKSA/IDEgOiAwOworCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3Vzd2l0Y2hfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXNuZF9jbWlwY2lfc3dpdGNoX2FyZ3NfdCAqYXJncyA9IChzbmRfY21pcGNpX3N3aXRjaF9hcmdzX3QqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXNuZF9hc3NlcnQoYXJncyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJcmV0dXJuIF9zbmRfY21pcGNpX3Vzd2l0Y2hfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgYXJncyk7Cit9CisKK3N0YXRpYyBpbnQgX3NuZF9jbWlwY2lfdXN3aXRjaF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wsIHNuZF9jbWlwY2lfc3dpdGNoX2FyZ3NfdCAqYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisJY21pcGNpX3QgKmNtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlpZiAoYXJncy0+YWMzX3NlbnNpdGl2ZSAmJiBjbS0+bWl4ZXJfaW5zZW5zaXRpdmUpIHsKKwkJLyogaWdub3JlZCAqLworCQlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYXJncy0+aXNfYnl0ZSkKKwkJdmFsID0gaW5iKGNtLT5pb2Jhc2UgKyBhcmdzLT5yZWcpOworCWVsc2UKKwkJdmFsID0gc25kX2NtaXBjaV9yZWFkKGNtLCBhcmdzLT5yZWcpOworCWNoYW5nZSA9ICh2YWwgJiBhcmdzLT5tYXNrKSAhPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyBhcmdzLT5tYXNrIDogMCk7CisJaWYgKGNoYW5nZSkgeworCQl2YWwgJj0gfmFyZ3MtPm1hc2s7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJCXZhbCB8PSBhcmdzLT5tYXNrX29uOworCQllbHNlCisJCQl2YWwgfD0gKGFyZ3MtPm1hc2sgJiB+YXJncy0+bWFza19vbik7CisJCWlmIChhcmdzLT5pc19ieXRlKQorCQkJb3V0YigodW5zaWduZWQgY2hhcil2YWwsIGNtLT5pb2Jhc2UgKyBhcmdzLT5yZWcpOworCQllbHNlCisJCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBhcmdzLT5yZWcsIHZhbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9jbWlwY2lfdXN3aXRjaF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc25kX2NtaXBjaV9zd2l0Y2hfYXJnc190ICphcmdzID0gKHNuZF9jbWlwY2lfc3dpdGNoX2FyZ3NfdCopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc25kX2Fzc2VydChhcmdzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlyZXR1cm4gX3NuZF9jbWlwY2lfdXN3aXRjaF9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCBhcmdzKTsKK30KKworI2RlZmluZSBERUZJTkVfU1dJVENIX0FSRyhzbmFtZSwgeHJlZywgeG1hc2ssIHhtYXNrX29uLCB4aXNfYnl0ZSwgeGFjMykgXAorc3RhdGljIHNuZF9jbWlwY2lfc3dpdGNoX2FyZ3NfdCBjbWlwY2lfc3dpdGNoX2FyZ18jI3NuYW1lID0geyBcCisgIC5yZWcgPSB4cmVnLCBcCisgIC5tYXNrID0geG1hc2ssIFwKKyAgLm1hc2tfb24gPSB4bWFza19vbiwgXAorICAuaXNfYnl0ZSA9IHhpc19ieXRlLCBcCisgIC5hYzNfc2Vuc2l0aXZlID0geGFjMywgXAorfQorCQorI2RlZmluZSBERUZJTkVfQklUX1NXSVRDSF9BUkcoc25hbWUsIHhyZWcsIHhtYXNrLCB4aXNfYnl0ZSwgeGFjMykgXAorCURFRklORV9TV0lUQ0hfQVJHKHNuYW1lLCB4cmVnLCB4bWFzaywgeG1hc2ssIHhpc19ieXRlLCB4YWMzKQorCisjaWYgMCAvKiB0aGVzZSB3aWxsIGJlIGNvbnRyb2xsZWQgaW4gcGNtIGRldmljZSAqLworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlmX2luLCBDTV9SRUdfRlVOQ1RSTDEsIENNX1NQREZfMSwgMCwgMCk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkaWZfb3V0LCBDTV9SRUdfRlVOQ1RSTDEsIENNX1NQREZfMCwgMCwgMCk7CisjZW5kaWYKK0RFRklORV9CSVRfU1dJVENIX0FSRyhzcGRpZl9pbl9zZWwxLCBDTV9SRUdfQ0hGT1JNQVQsIENNX1NQRElGX1NFTEVDVDEsIDAsIDApOworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlmX2luX3NlbDIsIENNX1JFR19NSVNDX0NUUkwsIENNX1NQRElGX1NFTEVDVDIsIDAsIDApOworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlmX2VuYWJsZSwgQ01fUkVHX0xFR0FDWV9DVFJMLCBDTV9FTlNQRE9VVCwgMCwgMCk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkbzJkYWMsIENNX1JFR19GVU5DVFJMMSwgQ01fU1BETzJEQUMsIDAsIDEpOworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlfdmFsaWQsIENNX1JFR19NSVNDLCBDTV9TUERWQUxJRCwgMSwgMCk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkaWZfY29weXJpZ2h0LCBDTV9SRUdfTEVHQUNZX0NUUkwsIENNX1NQRENPUFlSSFQsIDAsIDApOworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlmX2RhY19vdXQsIENNX1JFR19MRUdBQ1lfQ1RSTCwgQ01fREFDMlNQRE8sIDAsIDEpOworREVGSU5FX1NXSVRDSF9BUkcoc3Bkb181diwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fU1BETzVWLCAwLCAwLCAwKTsgLyogaW52ZXJzZTogMCA9IDVWICovCisvLyBERUZJTkVfQklUX1NXSVRDSF9BUkcoc3Bkb180OGssIENNX1JFR19NSVNDX0NUUkwsIENNX1NQREZfQUM5N3xDTV9TUERJRjQ4SywgMCwgMSk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkaWZfbG9vcCwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9TUERGTE9PUCwgMCwgMSk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkaV9tb25pdG9yLCBDTV9SRUdfTUlYRVIxLCBDTV9DRFBMQVksIDEsIDApOworLyogREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlfcGhhc2UsIENNX1JFR19DSEZPUk1BVCwgQ01fU1BESUZfSU5WRVJTRSwgMCwgMCk7ICovCitERUZJTkVfQklUX1NXSVRDSF9BUkcoc3BkaV9waGFzZSwgQ01fUkVHX01JU0MsIENNX1NQRElGX0lOVkVSU0UsIDEsIDApOworREVGSU5FX0JJVF9TV0lUQ0hfQVJHKHNwZGlfcGhhc2UyLCBDTV9SRUdfQ0hGT1JNQVQsIENNX1NQRElGX0lOVkVSU0UyLCAwLCAwKTsKKyNpZiBDTV9DSF9QTEFZID09IDEKK0RFRklORV9TV0lUQ0hfQVJHKGV4Y2hhbmdlX2RhYywgQ01fUkVHX01JU0NfQ1RSTCwgQ01fWENIR0RBQywgMCwgMCwgMCk7IC8qIHJldmVyc2VkICovCisjZWxzZQorREVGSU5FX1NXSVRDSF9BUkcoZXhjaGFuZ2VfZGFjLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9YQ0hHREFDLCBDTV9YQ0hHREFDLCAwLCAwKTsKKyNlbmRpZgorREVGSU5FX0JJVF9TV0lUQ0hfQVJHKGZvdXJjaCwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fTjRTUEszRCwgMCwgMCk7CitERUZJTkVfQklUX1NXSVRDSF9BUkcobGluZV9yZWFyLCBDTV9SRUdfTUlYRVIxLCBDTV9TUEs0LCAxLCAwKTsKK0RFRklORV9CSVRfU1dJVENIX0FSRyhsaW5lX2Jhc3MsIENNX1JFR19MRUdBQ1lfQ1RSTCwgQ01fTElORV9BU19CQVNTLCAwLCAwKTsKKy8vIERFRklORV9CSVRfU1dJVENIX0FSRyhqb3lzdGljaywgQ01fUkVHX0ZVTkNUUkwxLCBDTV9KWVNUS19FTiwgMCwgMCk7IC8qIG5vdyBtb2R1bGUgb3B0aW9uICovCitERUZJTkVfU1dJVENIX0FSRyhtb2RlbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fRkxJTktPTnxDTV9GTElOS09GRiwgQ01fRkxJTktPTiwgMCwgMCk7CisKKyNkZWZpbmUgREVGSU5FX1NXSVRDSChzbmFtZSwgc3R5cGUsIHNhcmcpIFwKK3sgLm5hbWUgPSBzbmFtZSwgXAorICAuaWZhY2UgPSBzdHlwZSwgXAorICAuaW5mbyA9IHNuZF9jbWlwY2lfdXN3aXRjaF9pbmZvLCBcCisgIC5nZXQgPSBzbmRfY21pcGNpX3Vzd2l0Y2hfZ2V0LCBcCisgIC5wdXQgPSBzbmRfY21pcGNpX3Vzd2l0Y2hfcHV0LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJmNtaXBjaV9zd2l0Y2hfYXJnXyMjc2FyZyxcCit9CisKKyNkZWZpbmUgREVGSU5FX0NBUkRfU1dJVENIKHNuYW1lLCBzYXJnKSBERUZJTkVfU1dJVENIKHNuYW1lLCBTTkRSVl9DVExfRUxFTV9JRkFDRV9DQVJELCBzYXJnKQorI2RlZmluZSBERUZJTkVfTUlYRVJfU1dJVENIKHNuYW1lLCBzYXJnKSBERUZJTkVfU1dJVENIKHNuYW1lLCBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgc2FyZykKKworCisvKgorICogY2FsbGJhY2tzIGZvciBzcGRpZiBvdXRwdXQgc3dpdGNoCisgKiBuZWVkcyB0b2dnbGUgdHdvIHJlZ2lzdGVycy4uCisgKi8KK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9zcGRvdXRfZW5hYmxlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpbnQgY2hhbmdlZDsKKwljaGFuZ2VkID0gX3NuZF9jbWlwY2lfdXN3aXRjaF9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCAmY21pcGNpX3N3aXRjaF9hcmdfc3BkaWZfZW5hYmxlKTsKKwljaGFuZ2VkIHw9IF9zbmRfY21pcGNpX3Vzd2l0Y2hfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgJmNtaXBjaV9zd2l0Y2hfYXJnX3NwZG8yZGFjKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX3NwZG91dF9lbmFibGVfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNtaXBjaV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2VkOworCWNoYW5nZWQgPSBfc25kX2NtaXBjaV91c3dpdGNoX3B1dChrY29udHJvbCwgdWNvbnRyb2wsICZjbWlwY2lfc3dpdGNoX2FyZ19zcGRpZl9lbmFibGUpOworCWNoYW5nZWQgfD0gX3NuZF9jbWlwY2lfdXN3aXRjaF9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCAmY21pcGNpX3N3aXRjaF9hcmdfc3BkbzJkYWMpOworCWlmIChjaGFuZ2VkKSB7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQkJaWYgKGNoaXAtPnNwZGlmX3BsYXliYWNrX2F2YWlsKQorCQkJCXNuZF9jbWlwY2lfc2V0X2JpdChjaGlwLCBDTV9SRUdfRlVOQ1RSTDEsIENNX1BMQVlCQUNLX1NQREYpOworCQl9IGVsc2UgeworCQkJaWYgKGNoaXAtPnNwZGlmX3BsYXliYWNrX2F2YWlsKQorCQkJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNoaXAsIENNX1JFR19GVU5DVFJMMSwgQ01fUExBWUJBQ0tfU1BERik7CisJCX0KKwl9CisJY2hpcC0+c3BkaWZfcGxheWJhY2tfZW5hYmxlZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiBjaGFuZ2VkOworfQorCisKKy8qIGJvdGggZm9yIENNODMzOC84NzM4ICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfbWl4ZXJfc3dpdGNoZXNbXSBfX2RldmluaXRkYXRhID0geworCURFRklORV9NSVhFUl9TV0lUQ0goIkZvdXIgQ2hhbm5lbCBNb2RlIiwgZm91cmNoKSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJMaW5lLUluIEFzIFJlYXIiLCBsaW5lX3JlYXIpLAorfTsKKworLyogZm9yIG5vbi1tdWx0aWNoYW5uZWwgY2hpcHMgKi8KK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NtaXBjaV9ub211bHRpX3N3aXRjaCBfX2RldmluaXRkYXRhID0KK0RFRklORV9NSVhFUl9TV0lUQ0goIkV4Y2hhbmdlIERBQyIsIGV4Y2hhbmdlX2RhYyk7CisKKy8qIG9ubHkgZm9yIENNODczOCAqLworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY21pcGNpXzg3MzhfbWl4ZXJfc3dpdGNoZXNbXSBfX2RldmluaXRkYXRhID0geworI2lmIDAgLyogY29udHJvbGxlZCBpbiBwY20gZGV2aWNlICovCisJREVGSU5FX01JWEVSX1NXSVRDSCgiSUVDOTU4IEluIFJlY29yZCIsIHNwZGlmX2luKSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggT3V0Iiwgc3BkaWZfb3V0KSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggT3V0IFRvIERBQyIsIHNwZG8yZGFjKSwKKyNlbmRpZgorCS8vIERFRklORV9NSVhFUl9TV0lUQ0goIklFQzk1OCBPdXRwdXQgU3dpdGNoIiwgc3BkaWZfZW5hYmxlKSwKKwl7IC5uYW1lID0gIklFQzk1OCBPdXRwdXQgU3dpdGNoIiwKKwkgIC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCSAgLmluZm8gPSBzbmRfY21pcGNpX3Vzd2l0Y2hfaW5mbywKKwkgIC5nZXQgPSBzbmRfY21pcGNpX3NwZG91dF9lbmFibGVfZ2V0LAorCSAgLnB1dCA9IHNuZF9jbWlwY2lfc3Bkb3V0X2VuYWJsZV9wdXQsCisJfSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggSW4gVmFsaWQiLCBzcGRpX3ZhbGlkKSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggQ29weXJpZ2h0Iiwgc3BkaWZfY29weXJpZ2h0KSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggNVYiLCBzcGRvXzV2KSwKKy8vCURFRklORV9NSVhFUl9TV0lUQ0goIklFQzk1OCBJbi9PdXQgNDhLSHoiLCBzcGRvXzQ4ayksCisJREVGSU5FX01JWEVSX1NXSVRDSCgiSUVDOTU4IExvb3AiLCBzcGRpZl9sb29wKSwKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggSW4gTW9uaXRvciIsIHNwZGlfbW9uaXRvciksCit9OworCisvKiBvbmx5IGZvciBtb2RlbCAwMzMvMDM3ICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfb2xkX21peGVyX3N3aXRjaGVzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlERUZJTkVfTUlYRVJfU1dJVENIKCJJRUM5NTggTWl4IEFuYWxvZyIsIHNwZGlmX2RhY19vdXQpLAorCURFRklORV9NSVhFUl9TV0lUQ0goIklFQzk1OCBJbiBQaGFzZSBJbnZlcnNlIiwgc3BkaV9waGFzZSksCisJREVGSU5FX01JWEVSX1NXSVRDSCgiSUVDOTU4IEluIFNlbGVjdCIsIHNwZGlmX2luX3NlbDEpLAorfTsKKworLyogb25seSBmb3IgbW9kZWwgMDM5IG9yIGxhdGVyICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jbWlwY2lfZXh0cmFfbWl4ZXJfc3dpdGNoZXNbXSBfX2RldmluaXRkYXRhID0geworCURFRklORV9NSVhFUl9TV0lUQ0goIkxpbmUtSW4gQXMgQmFzcyIsIGxpbmVfYmFzcyksCisJREVGSU5FX01JWEVSX1NXSVRDSCgiSUVDOTU4IEluIFNlbGVjdCIsIHNwZGlmX2luX3NlbDIpLAorCURFRklORV9NSVhFUl9TV0lUQ0goIklFQzk1OCBJbiBQaGFzZSBJbnZlcnNlIiwgc3BkaV9waGFzZTIpLAorCURFRklORV9NSVhFUl9TV0lUQ0goIk1pYyBBcyBDZW50ZXIvTEZFIiwgc3BkaV9waGFzZSksIC8qIHNhbWUgYml0IGFzIHNwZGlfcGhhc2UgKi8KK307CisKKy8qIGNhcmQgY29udHJvbCBzd2l0Y2hlcyAqLworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY21pcGNpX2NvbnRyb2xfc3dpdGNoZXNbXSBfX2RldmluaXRkYXRhID0geworCS8vIERFRklORV9DQVJEX1NXSVRDSCgiSm95c3RpY2siLCBqb3lzdGljayksIC8qIG5vdyBtb2R1bGUgb3B0aW9uICovCisJREVGSU5FX0NBUkRfU1dJVENIKCJNb2RlbSIsIG1vZGVtKSwKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NtaXBjaV9taXhlcl9uZXcoY21pcGNpX3QgKmNtLCBpbnQgcGNtX3NwZGlmX2RldmljZSkKK3sKKwlzbmRfY2FyZF90ICpjYXJkOworCXNuZF9rY29udHJvbF9uZXdfdCAqc3c7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJc25kX2Fzc2VydChjbSAhPSBOVUxMICYmIGNtLT5jYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKworCWNhcmQgPSBjbS0+Y2FyZDsKKworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJDTWVkaWEgUENJIik7CisKKwlzcGluX2xvY2tfaXJxKCZjbS0+cmVnX2xvY2spOworCXNuZF9jbWlwY2lfbWl4ZXJfd3JpdGUoY20sIDB4MDAsIDB4MDApOwkJLyogbWl4ZXIgcmVzZXQgKi8KKwlzcGluX3VubG9ja19pcnEoJmNtLT5yZWdfbG9jayk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NtaXBjaV9taXhlcnMpOyBpZHgrKykgeworCQlpZiAoY20tPmNoaXBfdmVyc2lvbiA9PSA2OCkgewkvLyA4NzY4IGhhcyBubyBQQ00gdm9sdW1lCisJCQlpZiAoIXN0cmNtcChzbmRfY21pcGNpX21peGVyc1tpZHhdLm5hbWUsCisJCQkJIlBDTSBQbGF5YmFjayBWb2x1bWUiKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2NtaXBjaV9taXhlcnNbaWR4XSwgY20pKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBtaXhlciBzd2l0Y2hlcyAqLworCXN3ID0gc25kX2NtaXBjaV9taXhlcl9zd2l0Y2hlczsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NtaXBjaV9taXhlcl9zd2l0Y2hlcyk7IGlkeCsrLCBzdysrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNtLT5jYXJkLCBzbmRfY3RsX25ldzEoc3csIGNtKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKCEgY20tPmNhbl9tdWx0aV9jaCkgeworCQllcnIgPSBzbmRfY3RsX2FkZChjbS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY21pcGNpX25vbXVsdGlfc3dpdGNoLCBjbSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChjbS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOCB8fAorCSAgICBjbS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIpIHsKKwkJc3cgPSBzbmRfY21pcGNpXzg3MzhfbWl4ZXJfc3dpdGNoZXM7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfY21pcGNpXzg3MzhfbWl4ZXJfc3dpdGNoZXMpOyBpZHgrKywgc3crKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY20tPmNhcmQsIHNuZF9jdGxfbmV3MShzdywgY20pKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKGNtLT5jYW5fYWMzX2h3KSB7CisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9jbWlwY2lfc3BkaWZfZGVmYXVsdCwgY20pKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlrY3RsLT5pZC5kZXZpY2UgPSBwY21fc3BkaWZfZGV2aWNlOworCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY21pcGNpX3NwZGlmX21hc2ssIGNtKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJa2N0bC0+aWQuZGV2aWNlID0gcGNtX3NwZGlmX2RldmljZTsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2NtaXBjaV9zcGRpZl9zdHJlYW0sIGNtKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJa2N0bC0+aWQuZGV2aWNlID0gcGNtX3NwZGlmX2RldmljZTsKKwkJfQorCQlpZiAoY20tPmNoaXBfdmVyc2lvbiA8PSAzNykgeworCQkJc3cgPSBzbmRfY21pcGNpX29sZF9taXhlcl9zd2l0Y2hlczsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfY21pcGNpX29sZF9taXhlcl9zd2l0Y2hlcyk7IGlkeCsrLCBzdysrKSB7CisJCQkJZXJyID0gc25kX2N0bF9hZGQoY20tPmNhcmQsIHNuZF9jdGxfbmV3MShzdywgY20pKTsKKwkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY20tPmNoaXBfdmVyc2lvbiA+PSAzOSkgeworCQlzdyA9IHNuZF9jbWlwY2lfZXh0cmFfbWl4ZXJfc3dpdGNoZXM7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfY21pcGNpX2V4dHJhX21peGVyX3N3aXRjaGVzKTsgaWR4KyssIHN3KyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNtLT5jYXJkLCBzbmRfY3RsX25ldzEoc3csIGNtKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogY2FyZCBzd2l0Y2hlcyAqLworCXN3ID0gc25kX2NtaXBjaV9jb250cm9sX3N3aXRjaGVzOworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfY21pcGNpX2NvbnRyb2xfc3dpdGNoZXMpOyBpZHgrKywgc3crKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjbS0+Y2FyZCwgc25kX2N0bF9uZXcxKHN3LCBjbSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpZHggPSAwOyBpZHggPCBDTV9TQVZFRF9NSVhFUlM7IGlkeCsrKSB7CisJCXNuZF9jdGxfZWxlbV9pZF90IGlkOworCQlzbmRfa2NvbnRyb2xfdCAqY3RsOworCQltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwkJaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwkJc3RyY3B5KGlkLm5hbWUsIGNtX3NhdmVkX21peGVyW2lkeF0ubmFtZSk7CisJCWlmICgoY3RsID0gc25kX2N0bF9maW5kX2lkKGNtLT5jYXJkLCAmaWQpKSAhPSBOVUxMKQorCQkJY20tPm1peGVyX3Jlc19jdGxbaWR4XSA9IGN0bDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcHJvYyBpbnRlcmZhY2UKKyAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkIHNuZF9jbWlwY2lfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlcikKK3sKKwljbWlwY2lfdCAqY20gPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWludCBpOworCQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiVzXG5cbiIsIGNtLT5jYXJkLT5sb25nbmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQlpbnQgdiA9IGluYihjbS0+aW9iYXNlICsgaSk7CisJCWlmIChpICUgNCA9PSAwKQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeDogIiwgaSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMngiLCB2KTsKKwkJaWYgKGkgJSA0ID09IDMpCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCQllbHNlCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2NtaXBjaV9wcm9jX2luaXQoY21pcGNpX3QgKmNtKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY20tPmNhcmQsICJjbWlwY2kiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNtLCAxMDI0LCBzbmRfY21pcGNpX3Byb2NfcmVhZCk7Cit9CisjZWxzZSAvKiAhQ09ORklHX1BST0NfRlMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY21pcGNpX3Byb2NfaW5pdChjbWlwY2lfdCAqY20pIHt9CisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2NtaXBjaV9pZHNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9DTUVESUEsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0NNRURJQSwgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQ01FRElBLCBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0NNRURJQSwgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfSwKK307CisKKworLyoKKyAqIGNoZWNrIGNoaXAgdmVyc2lvbiBhbmQgY2FwYWJpbGl0aWVzCisgKiBkcml2ZXIgbmFtZSBpcyBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIGNoaXAgbW9kZWwKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1ZXJ5X2NoaXAoY21pcGNpX3QgKmNtKQoreworCXVuc2lnbmVkIGludCBkZXRlY3Q7CisKKwkvKiBjaGVjayByZWcgMENoLCBiaXQgMjQtMzEgKi8KKwlkZXRlY3QgPSBzbmRfY21pcGNpX3JlYWQoY20sIENNX1JFR19JTlRfSExEQ0xSKSAmIENNX0NISVBfTUFTSzI7CisJaWYgKCEgZGV0ZWN0KSB7CisJCS8qIGNoZWNrIHJlZyAwOGgsIGJpdCAyNC0yOCAqLworCQlkZXRlY3QgPSBzbmRfY21pcGNpX3JlYWQoY20sIENNX1JFR19DSEZPUk1BVCkgJiBDTV9DSElQX01BU0sxOworCQlpZiAoISBkZXRlY3QpIHsKKwkJCWNtLT5jaGlwX3ZlcnNpb24gPSAzMzsKKwkJCWNtLT5tYXhfY2hhbm5lbHMgPSAyOworCQkJaWYgKGNtLT5kb19zb2Z0X2FjMykKKwkJCQljbS0+Y2FuX2FjM19zdyA9IDE7CisJCQllbHNlCisJCQkJY20tPmNhbl9hYzNfaHcgPSAxOworCQkJY20tPmhhc19kdWFsX2RhYyA9IDE7CisJCX0gZWxzZSB7CisJCQljbS0+Y2hpcF92ZXJzaW9uID0gMzc7CisJCQljbS0+bWF4X2NoYW5uZWxzID0gMjsKKwkJCWNtLT5jYW5fYWMzX2h3ID0gMTsKKwkJCWNtLT5oYXNfZHVhbF9kYWMgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgcmVnIDBDaCwgYml0IDI2ICovCisJCWlmIChkZXRlY3QgJiBDTV9DSElQXzg3NjgpIHsKKwkJCWNtLT5jaGlwX3ZlcnNpb24gPSA2ODsKKwkJCWNtLT5tYXhfY2hhbm5lbHMgPSA4OworCQkJY20tPmNhbl9hYzNfaHcgPSAxOworCQkJY20tPmhhc19kdWFsX2RhYyA9IDE7CisJCQljbS0+Y2FuX211bHRpX2NoID0gMTsKKwkJfSBlbHNlIGlmIChkZXRlY3QgJiBDTV9DSElQXzA1NSkgeworCQkJY20tPmNoaXBfdmVyc2lvbiA9IDU1OworCQkJY20tPm1heF9jaGFubmVscyA9IDY7CisJCQljbS0+Y2FuX2FjM19odyA9IDE7CisJCQljbS0+aGFzX2R1YWxfZGFjID0gMTsKKwkJCWNtLT5jYW5fbXVsdGlfY2ggPSAxOworCQl9IGVsc2UgaWYgKGRldGVjdCAmIENNX0NISVBfMDM5KSB7CisJCQljbS0+Y2hpcF92ZXJzaW9uID0gMzk7CisJCQlpZiAoZGV0ZWN0ICYgQ01fQ0hJUF8wMzlfNkNIKSAvKiA0IG9yIDYgY2hhbm5lbHMgKi8KKwkJCQljbS0+bWF4X2NoYW5uZWxzID0gNjsKKwkJCWVsc2UKKwkJCQljbS0+bWF4X2NoYW5uZWxzID0gNDsKKwkJCWNtLT5jYW5fYWMzX2h3ID0gMTsKKwkJCWNtLT5oYXNfZHVhbF9kYWMgPSAxOworCQkJY20tPmNhbl9tdWx0aV9jaCA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNoaXAgJXggdmVyc2lvbiBub3Qgc3VwcG9ydGVkXG4iLCBkZXRlY3QpOworCQl9CisJfQorfQorCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NtaXBjaV9jcmVhdGVfZ2FtZXBvcnQoY21pcGNpX3QgKmNtLCBpbnQgZGV2KQoreworCXN0YXRpYyBpbnQgcG9ydHNbXSA9IHsgMHgyMDEsIDB4MjAwLCAwIH07IC8qIEZJWE1FOiBtYWpvcml0eSBpcyAweDIwMT8gKi8KKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCXN0cnVjdCByZXNvdXJjZSAqciA9IE5VTEw7CisJaW50IGksIGlvX3BvcnQgPSAwOworCisJaWYgKGpveXN0aWNrX3BvcnRbZGV2XSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChqb3lzdGlja19wb3J0W2Rldl0gPT0gMSkgeyAvKiBhdXRvLWRldGVjdCAqLworCQlmb3IgKGkgPSAwOyBwb3J0c1tpXTsgaSsrKSB7CisJCQlpb19wb3J0ID0gcG9ydHNbaV07CisJCQlyID0gcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgMSwgIkNNSVBDSSBnYW1lcG9ydCIpOworCQkJaWYgKHIpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlpb19wb3J0ID0gam95c3RpY2tfcG9ydFtkZXZdOworCQlyID0gcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgMSwgIkNNSVBDSSBnYW1lcG9ydCIpOworCX0KKworCWlmICghcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbWlwY2k6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnRzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwljbS0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVzb3VyY2Uocik7CisJCWtmcmVlX25vY2hlY2socik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkMtTWVkaWEgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNtLT5wY2kpKTsKKwlnYW1lcG9ydF9zZXRfZGV2X3BhcmVudChncCwgJmNtLT5wY2ktPmRldik7CisJZ3AtPmlvID0gaW9fcG9ydDsKKwlnYW1lcG9ydF9zZXRfcG9ydF9kYXRhKGdwLCByKTsKKworCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9KWVNUS19FTik7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGNtLT5nYW1lcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2NtaXBjaV9mcmVlX2dhbWVwb3J0KGNtaXBjaV90ICpjbSkKK3sKKwlpZiAoY20tPmdhbWVwb3J0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoY20tPmdhbWVwb3J0KTsKKworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoY20tPmdhbWVwb3J0KTsKKwkJY20tPmdhbWVwb3J0ID0gTlVMTDsKKworCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9KWVNUS19FTik7CisJCXJlbGVhc2VfcmVzb3VyY2Uocik7CisJCWtmcmVlX25vY2hlY2socik7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9jbWlwY2lfY3JlYXRlX2dhbWVwb3J0KGNtaXBjaV90ICpjbSwgaW50IGRldikgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9jbWlwY2lfZnJlZV9nYW1lcG9ydChjbWlwY2lfdCAqY20pIHsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX2NtaXBjaV9mcmVlKGNtaXBjaV90ICpjbSkKK3sKKwlpZiAoY20tPmlycSA+PSAwKSB7CisJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9GTV9FTik7CisJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTEVHQUNZX0NUUkwsIENNX0VOU1BET1VUKTsKKwkJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0lOVF9ITERDTFIsIDApOyAgLyogZGlzYWJsZSBpbnRzICovCisJCXNuZF9jbWlwY2lfY2hfcmVzZXQoY20sIENNX0NIX1BMQVkpOworCQlzbmRfY21pcGNpX2NoX3Jlc2V0KGNtLCBDTV9DSF9DQVBUKTsKKwkJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCAwKTsgLyogZGlzYWJsZSBjaGFubmVscyAqLworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDEsIDApOworCisJCS8qIHJlc2V0IG1peGVyICovCisJCXNuZF9jbWlwY2lfbWl4ZXJfd3JpdGUoY20sIDAsIDApOworCisJCXN5bmNocm9uaXplX2lycShjbS0+aXJxKTsKKworCQlmcmVlX2lycShjbS0+aXJxLCAodm9pZCAqKWNtKTsKKwl9CisKKwlzbmRfY21pcGNpX2ZyZWVfZ2FtZXBvcnQoY20pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY20tPnBjaSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNtLT5wY2kpOworCWtmcmVlKGNtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY21pcGNpX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWNtaXBjaV90ICpjbSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF9jbWlwY2lfZnJlZShjbSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jbWlwY2lfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgIGludCBkZXYsIGNtaXBjaV90ICoqcmNtaXBjaSkKK3sKKwljbWlwY2lfdCAqY207CisJaW50IGVycjsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF9jbWlwY2lfZGV2X2ZyZWUsCisJfTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwlsb25nIGlvbWlkaSA9IG1wdV9wb3J0W2Rldl07CisJbG9uZyBpb3N5bnRoID0gZm1fcG9ydFtkZXZdOworCWludCBwY21faW5kZXgsIHBjbV9zcGRpZl9pbmRleDsKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW50ZWxfODI0Mzd2eFtdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzN1ZYKSB9LAorCQl7IH0sCisJfTsKKworCSpyY21pcGNpID0gTlVMTDsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJY20gPSBrY2FsbG9jKDEsIHNpemVvZigqY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoY20gPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmNtLT5yZWdfbG9jayk7CisJaW5pdF9NVVRFWCgmY20tPm9wZW5fbXV0ZXgpOworCWNtLT5kZXZpY2UgPSBwY2ktPmRldmljZTsKKwljbS0+Y2FyZCA9IGNhcmQ7CisJY20tPnBjaSA9IHBjaTsKKwljbS0+aXJxID0gLTE7CisJY20tPmNoYW5uZWxbMF0uY2ggPSAwOworCWNtLT5jaGFubmVsWzFdLmNoID0gMTsKKwljbS0+Y2hhbm5lbFswXS5pc19kYWMgPSBjbS0+Y2hhbm5lbFsxXS5pc19kYWMgPSAxOyAvKiBkdWFsIERBQyBtb2RlICovCisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCBjYXJkLT5kcml2ZXIpKSA8IDApIHsKKwkJa2ZyZWUoY20pOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY20tPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY21pcGNpX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBjYXJkLT5kcml2ZXIsICh2b2lkICopY20pKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfY21pcGNpX2ZyZWUoY20pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljbS0+aXJxID0gcGNpLT5pcnE7CisKKwlwY2lfc2V0X21hc3RlcihjbS0+cGNpKTsKKworCS8qCisJICogY2hlY2sgY2hpcCB2ZXJzaW9uLCBtYXggY2hhbm5lbHMgYW5kIGNhcGFiaWxpdGllcworCSAqLworCisJY20tPmNoaXBfdmVyc2lvbiA9IDA7CisJY20tPm1heF9jaGFubmVscyA9IDI7CisJY20tPmRvX3NvZnRfYWMzID0gc29mdF9hYzNbZGV2XTsKKworCWlmIChwY2ktPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhBICYmCisJICAgIHBjaS0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEIpCisJCXF1ZXJ5X2NoaXAoY20pOworCS8qIGFkZGVkIC1NQ3ggc3VmZml4IGZvciBjaGlwIHN1cHBvcnRpbmcgbXVsdGktY2hhbm5lbHMgKi8KKwlpZiAoY20tPmNhbl9tdWx0aV9jaCkKKwkJc3ByaW50ZihjbS0+Y2FyZC0+ZHJpdmVyICsgc3RybGVuKGNtLT5jYXJkLT5kcml2ZXIpLAorCQkJIi1NQyVkIiwgY20tPm1heF9jaGFubmVscyk7CisJZWxzZSBpZiAoY20tPmNhbl9hYzNfc3cpCisJCXN0cmNweShjbS0+Y2FyZC0+ZHJpdmVyICsgc3RybGVuKGNtLT5jYXJkLT5kcml2ZXIpLCAiLVNXSUVDIik7CisKKwljbS0+ZGlnX3N0YXR1cyA9IFNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRjsKKwljbS0+ZGlnX3BjbV9zdGF0dXMgPSBTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUY7CisKKyNpZiBDTV9DSF9QTEFZID09IDEKKwljbS0+Y3RybCA9IENNX0NIQURDMDsJLyogZGVmYXVsdCBGVU5DTlRSTDAgKi8KKyNlbHNlCisJY20tPmN0cmwgPSBDTV9DSEFEQzE7CS8qIGRlZmF1bHQgRlVOQ05UUkwwICovCisjZW5kaWYKKworCS8qIGluaXRpYWxpemUgY29kZWMgcmVnaXN0ZXJzICovCisJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0lOVF9ITERDTFIsIDApOwkvKiBkaXNhYmxlIGludHMgKi8KKwlzbmRfY21pcGNpX2NoX3Jlc2V0KGNtLCBDTV9DSF9QTEFZKTsKKwlzbmRfY21pcGNpX2NoX3Jlc2V0KGNtLCBDTV9DSF9DQVBUKTsKKwlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIDApOwkvKiBkaXNhYmxlIGNoYW5uZWxzICovCisJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwxLCAwKTsKKworCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19DSEZPUk1BVCwgMCk7CisJc25kX2NtaXBjaV9zZXRfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9FTkRCREFDfENNX040U1BLM0QpOworI2lmIENNX0NIX1BMQVkgPT0gMQorCXNuZF9jbWlwY2lfc2V0X2JpdChjbSwgQ01fUkVHX01JU0NfQ1RSTCwgQ01fWENIR0RBQyk7CisjZWxzZQorCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfTUlTQ19DVFJMLCBDTV9YQ0hHREFDKTsKKyNlbmRpZgorCS8qIFNldCBCdXMgTWFzdGVyIFJlcXVlc3QgKi8KKwlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fQlJFUSk7CisKKwkvKiBBc3N1bWUgVFggYW5kIGNvbXBhdGlibGUgY2hpcCBzZXQgKEF1dG9kZXRlY3Rpb24gcmVxdWlyZWQgZm9yIFZYIGNoaXAgc2V0cykgKi8KKwlzd2l0Y2ggKHBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3Mzg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCOgorCQlpZiAoIXBjaV9kZXZfcHJlc2VudChpbnRlbF84MjQzN3Z4KSkgCisJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX1RYVlgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY20sICZvcHMpKSA8IDApIHsKKwkJc25kX2NtaXBjaV9mcmVlKGNtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBzZXQgTVBVIGFkZHJlc3MgKi8KKwlzd2l0Y2ggKGlvbWlkaSkgeworCWNhc2UgMHgzMjA6IHZhbCA9IENNX1ZNUFVfMzIwOyBicmVhazsKKwljYXNlIDB4MzEwOiB2YWwgPSBDTV9WTVBVXzMxMDsgYnJlYWs7CisJY2FzZSAweDMwMDogdmFsID0gQ01fVk1QVV8zMDA7IGJyZWFrOworCWNhc2UgMHgzMzA6IHZhbCA9IENNX1ZNUFVfMzMwOyBicmVhazsKKwlkZWZhdWx0OgorCQlpb21pZGkgPSAwOyBicmVhazsKKwl9CisJaWYgKGlvbWlkaSA+IDApIHsKKwkJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0xFR0FDWV9DVFJMLCB2YWwpOworCQkvKiBlbmFibGUgVUFSVCAqLworCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fVUFSVF9FTik7CisJfQorCisJLyogc2V0IEZNIGFkZHJlc3MgKi8KKwl2YWwgPSBzbmRfY21pcGNpX3JlYWQoY20sIENNX1JFR19MRUdBQ1lfQ1RSTCkgJiB+Q01fRk1TRUxfTUFTSzsKKwlzd2l0Y2ggKGlvc3ludGgpIHsKKwljYXNlIDB4M0U4OiB2YWwgfD0gQ01fRk1TRUxfM0U4OyBicmVhazsKKwljYXNlIDB4M0UwOiB2YWwgfD0gQ01fRk1TRUxfM0UwOyBicmVhazsKKwljYXNlIDB4M0M4OiB2YWwgfD0gQ01fRk1TRUxfM0M4OyBicmVhazsKKwljYXNlIDB4Mzg4OiB2YWwgfD0gQ01fRk1TRUxfMzg4OyBicmVhazsKKwlkZWZhdWx0OgorCQlpb3N5bnRoID0gMDsgYnJlYWs7CisJfQorCWlmIChpb3N5bnRoID4gMCkgeworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfTEVHQUNZX0NUUkwsIHZhbCk7CisJCS8qIGVuYWJsZSBGTSAqLworCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX0ZNX0VOKTsKKworCQlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGlvc3ludGgsIGlvc3ludGggKyAyLAorCQkJCSAgICBPUEwzX0hXX09QTDMsIDAsICZjbS0+b3BsMykgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogbm8gT1BMIGRldmljZSBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIGlvc3ludGgpOworCQkJaW9zeW50aCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhjbS0+b3BsMywgMCwgMSwgJmNtLT5vcGwzaHdkZXApKSA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogY2Fubm90IGNyZWF0ZSBPUEwzIGh3ZGVwXG4iKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJfQorCWlmICghIGlvc3ludGgpIHsKKwkJLyogZGlzYWJsZSBGTSAqLworCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfTEVHQUNZX0NUUkwsIHZhbCAmIH5DTV9GTVNFTF9NQVNLKTsKKwkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX0ZNX0VOKTsKKwl9CisKKwkvKiByZXNldCBtaXhlciAqLworCXNuZF9jbWlwY2lfbWl4ZXJfd3JpdGUoY20sIDAsIDApOworCisJc25kX2NtaXBjaV9wcm9jX2luaXQoY20pOworCisJLyogY3JlYXRlIHBjbSBkZXZpY2VzICovCisJcGNtX2luZGV4ID0gcGNtX3NwZGlmX2luZGV4ID0gMDsKKwlpZiAoKGVyciA9IHNuZF9jbWlwY2lfcGNtX25ldyhjbSwgcGNtX2luZGV4KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbV9pbmRleCsrOworCWlmIChjbS0+aGFzX2R1YWxfZGFjKSB7CisJCWlmICgoZXJyID0gc25kX2NtaXBjaV9wY20yX25ldyhjbSwgcGNtX2luZGV4KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJcGNtX2luZGV4Kys7CisJfQorCWlmIChjbS0+Y2FuX2FjM19odyB8fCBjbS0+Y2FuX2FjM19zdykgeworCQlwY21fc3BkaWZfaW5kZXggPSBwY21faW5kZXg7CisJCWlmICgoZXJyID0gc25kX2NtaXBjaV9wY21fc3BkaWZfbmV3KGNtLCBwY21faW5kZXgpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNyZWF0ZSBtaXhlciBpbnRlcmZhY2UgJiBzd2l0Y2hlcyAqLworCWlmICgoZXJyID0gc25kX2NtaXBjaV9taXhlcl9uZXcoY20sIHBjbV9zcGRpZl9pbmRleCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChpb21pZGkgPiAwKSB7CisJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfQ01JUENJLAorCQkJCQkgICAgICAgaW9taWRpLCAwLAorCQkJCQkgICAgICAgY20tPmlycSwgMCwgJmNtLT5ybWlkaSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IG5vIFVBUlQ0MDEgZGV2aWNlIGF0IDB4JWx4XG4iLCBpb21pZGkpOworCQl9CisJfQorCisjaWZkZWYgVVNFX1ZBUjQ4S1JBVEUKKwlmb3IgKHZhbCA9IDA7IHZhbCA8IEFSUkFZX1NJWkUocmF0ZXMpOyB2YWwrKykKKwkJc25kX2NtaXBjaV9zZXRfcGxsKGNtLCByYXRlc1t2YWxdLCB2YWwpOworCisJLyoKKwkgKiAoUmUtKUVuYWJsZSBleHRlcm5hbCBzd2l0Y2ggc3Bkb180OGsKKwkgKi8KKwlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19NSVNDX0NUUkwsIENNX1NQRElGNDhLfENNX1NQREZfQUM5Nyk7CisjZW5kaWYgLyogVVNFX1ZBUjQ4S1JBVEUgKi8KKworCWlmIChzbmRfY21pcGNpX2NyZWF0ZV9nYW1lcG9ydChjbSwgZGV2KSA8IDApCisJCXNuZF9jbWlwY2lfY2xlYXJfYml0KGNtLCBDTV9SRUdfRlVOQ1RSTDEsIENNX0pZU1RLX0VOKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyY21pcGNpID0gY207CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKi8KKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9jbWlwY2lfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NtaXBjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwljbWlwY2lfdCAqY207CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghIGVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwlzd2l0Y2ggKHBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3Mzg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCOgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQ01JODczOCIpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhCOgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQ01JODMzOCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQ01JUENJIik7CisJCWJyZWFrOworCX0KKworCWlmICgoZXJyID0gc25kX2NtaXBjaV9jcmVhdGUoY2FyZCwgcGNpLCBkZXYsICZjbSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNwcmludGYoY2FyZC0+c2hvcnRuYW1lLCAiQy1NZWRpYSBQQ0kgJXMiLCBjYXJkLT5kcml2ZXIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyAobW9kZWwgJWQpIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsCisJCWNtLT5jaGlwX3ZlcnNpb24sCisJCWNtLT5pb2Jhc2UsCisJCWNtLT5pcnEpOworCisJLy9zbmRfcHJpbnRkKCIlcyBpcyBkZXRlY3RlZFxuIiwgY2FyZC0+bG9uZ25hbWUpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfY21pcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiQy1NZWRpYSBQQ0kiLAorCS5pZF90YWJsZSA9IHNuZF9jbWlwY2lfaWRzLAorCS5wcm9iZSA9IHNuZF9jbWlwY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jbWlwY2lfcmVtb3ZlKSwKK307CisJCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfY21pcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2NtaXBjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfY21pcGNpX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfY21pcGNpX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlMDZiMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtMCwwICsxLDIxMzYgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBDaXJydXMgTG9naWMgQ1M0MjgxIGJhc2VkIFBDSSBzb3VuZGNhcmQKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4sCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaXJydXMgTG9naWMgQ1M0MjgxIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDaXJydXMgTG9naWMsQ1M0MjgxfX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgc3dpdGNoZXMgKi8KK3N0YXRpYyBpbnQgZHVhbF9jb2RlY1tTTkRSVl9DQVJEU107CS8qIGR1YWwgY29kZWMgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBDUzQyODEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBDUzQyODEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBDUzQyODEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGR1YWxfY29kZWMsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkdWFsX2NvZGVjLCAiU2Vjb25kYXJ5IENvZGVjIElEICgwID0gZGlzYWJsZWQpLiIpOworCisvKgorICoKKyAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgICAgMHgxMDEzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDI4MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180MjgxCTB4NjAwNQorI2VuZGlmCisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgQ1M0MjgxX0JBMF9TSVpFCQkweDEwMDAKKyNkZWZpbmUgQ1M0MjgxX0JBMV9TSVpFCQkweDEwMDAwCisKKy8qCisgKiAgQkEwIHJlZ2lzdGVycworICovCisjZGVmaW5lIEJBMF9ISVNSCQkweDAwMDAJLyogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEJBMF9ISVNSX0lOVEVOQQkJKDE8PDMxKQkvKiBJbnRlcm5hbCBJbnRlcnJ1cHQgRW5hYmxlIEJpdCAqLworI2RlZmluZSBCQTBfSElTUl9NSURJCQkoMTw8MjIpCS8qIE1JREkgcG9ydCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0hJU1JfRklGT0kJCSgxPDwyMCkJLyogRklGTyBwb2xsZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIEJBMF9ISVNSX0RNQUkJCSgxPDwxOCkJLyogRE1BIGludGVycnVwdCAoaGFsZiBvciBlbmQpICovCisjZGVmaW5lIEJBMF9ISVNSX0ZJRk8oYykJKDE8PCgxMisoYykpKSAvKiBGSUZPIGNoYW5uZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIEJBMF9ISVNSX0RNQShjKQkJKDE8PCg4KyhjKSkpICAvKiBETUEgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0hJU1JfR1BQSQkJKDE8PDUpCS8qIEdlbmVyYWwgUHVycG9zZSBJbnB1dCAoUHJpbWFyeSBjaGlwKSAqLworI2RlZmluZSBCQTBfSElTUl9HUFNJCQkoMTw8NCkJLyogR2VuZXJhbCBQdXJwb3NlIElucHV0IChTZWNvbmRhcnkgY2hpcCkgKi8KKyNkZWZpbmUgQkEwX0hJU1JfR1AzSQkJKDE8PDMpCS8qIEdQSU8zIHBpbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0hJU1JfR1AxSQkJKDE8PDIpCS8qIEdQSU8xIHBpbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0hJU1JfVlVQSQkJKDE8PDEpCS8qIFZPTFVQIHBpbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0hJU1JfVkROSQkJKDE8PDApCS8qIFZPTEROIHBpbiBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBCQTBfSElDUgkJMHgwMDA4CS8qIEhvc3QgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkEwX0hJQ1JfQ0hHTQkJKDE8PDEpCS8qIElOVEVOQSBDaGFuZ2UgTWFzayAqLworI2RlZmluZSBCQTBfSElDUl9JRVYJCSgxPDwwKQkvKiBJTlRFTkEgVmFsdWUgKi8KKyNkZWZpbmUgQkEwX0hJQ1JfRU9JCQkoMzw8MCkJLyogRW5kIG9mIEludGVycnVwdCBjb21tYW5kICovCisKKyNkZWZpbmUgQkEwX0hJTVIJCTB4MDAwYwkvKiBIb3N0IEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisJCQkJCS8qIFVzZSBzYW1lIGNvbnRhbnRzIGFzIGZvciBCQTBfSElTUiAqLworCisjZGVmaW5lIEJBMF9JSUVSCQkweDAwMTAJLyogSVNBIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBCQTBfSERTUjAJCTB4MDBmMAkvKiBIb3N0IERNQSBFbmdpbmUgMCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkEwX0hEU1IxCQkweDAwZjQJLyogSG9zdCBETUEgRW5naW5lIDEgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEJBMF9IRFNSMgkJMHgwMGY4CS8qIEhvc3QgRE1BIEVuZ2luZSAyIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBCQTBfSERTUjMJCTB4MDBmYwkvKiBIb3N0IERNQSBFbmdpbmUgMyBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBCQTBfSERTUl9DSDFQCQkoMTw8MjUpCS8qIENoYW5uZWwgMSBQZW5kaW5nICovCisjZGVmaW5lIEJBMF9IRFNSX0NIMlAJCSgxPDwyNCkJLyogQ2hhbm5lbCAyIFBlbmRpbmcgKi8KKyNkZWZpbmUgQkEwX0hEU1JfREhUQwkJKDE8PDE3KQkvKiBETUEgSGFsZiBUZXJtaW5hbCBDb3VudCAqLworI2RlZmluZSBCQTBfSERTUl9EVEMJCSgxPDwxNikJLyogRE1BIFRlcm1pbmFsIENvdW50ICovCisjZGVmaW5lIEJBMF9IRFNSX0RSVU4JCSgxPDwxNSkJLyogRE1BIFJ1bm5pbmcgKi8KKyNkZWZpbmUgQkEwX0hEU1JfUlEJCSgxPDw3KQkvKiBQZW5kaW5nIFJlcXVlc3QgKi8KKworI2RlZmluZSBCQTBfRENBMAkJMHgwMTEwCS8qIEhvc3QgRE1BIEVuZ2luZSAwIEN1cnJlbnQgQWRkcmVzcyAqLworI2RlZmluZSBCQTBfRENDMAkJMHgwMTE0CS8qIEhvc3QgRE1BIEVuZ2luZSAwIEN1cnJlbnQgQ291bnQgKi8KKyNkZWZpbmUgQkEwX0RCQTAJCTB4MDExOAkvKiBIb3N0IERNQSBFbmdpbmUgMCBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQkEwX0RCQzAJCTB4MDExYwkvKiBIb3N0IERNQSBFbmdpbmUgMCBCYXNlIENvdW50ICovCisjZGVmaW5lIEJBMF9EQ0ExCQkweDAxMjAJLyogSG9zdCBETUEgRW5naW5lIDEgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIEJBMF9EQ0MxCQkweDAxMjQJLyogSG9zdCBETUEgRW5naW5lIDEgQ3VycmVudCBDb3VudCAqLworI2RlZmluZSBCQTBfREJBMQkJMHgwMTI4CS8qIEhvc3QgRE1BIEVuZ2luZSAxIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBCQTBfREJDMQkJMHgwMTJjCS8qIEhvc3QgRE1BIEVuZ2luZSAxIEJhc2UgQ291bnQgKi8KKyNkZWZpbmUgQkEwX0RDQTIJCTB4MDEzMAkvKiBIb3N0IERNQSBFbmdpbmUgMiBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgQkEwX0RDQzIJCTB4MDEzNAkvKiBIb3N0IERNQSBFbmdpbmUgMiBDdXJyZW50IENvdW50ICovCisjZGVmaW5lIEJBMF9EQkEyCQkweDAxMzgJLyogSG9zdCBETUEgRW5naW5lIDIgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIEJBMF9EQkMyCQkweDAxM2MJLyogSG9zdCBETUEgRW5naW5lIDIgQmFzZSBDb3VudCAqLworI2RlZmluZSBCQTBfRENBMwkJMHgwMTQwCS8qIEhvc3QgRE1BIEVuZ2luZSAzIEN1cnJlbnQgQWRkcmVzcyAqLworI2RlZmluZSBCQTBfRENDMwkJMHgwMTQ0CS8qIEhvc3QgRE1BIEVuZ2luZSAzIEN1cnJlbnQgQ291bnQgKi8KKyNkZWZpbmUgQkEwX0RCQTMJCTB4MDE0OAkvKiBIb3N0IERNQSBFbmdpbmUgMyBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQkEwX0RCQzMJCTB4MDE0YwkvKiBIb3N0IERNQSBFbmdpbmUgMyBCYXNlIENvdW50ICovCisjZGVmaW5lIEJBMF9ETVIwCQkweDAxNTAJLyogSG9zdCBETUEgRW5naW5lIDAgTW9kZSAqLworI2RlZmluZSBCQTBfRENSMAkJMHgwMTU0CS8qIEhvc3QgRE1BIEVuZ2luZSAwIENvbW1hbmQgKi8KKyNkZWZpbmUgQkEwX0RNUjEJCTB4MDE1OAkvKiBIb3N0IERNQSBFbmdpbmUgMSBNb2RlICovCisjZGVmaW5lIEJBMF9EQ1IxCQkweDAxNWMJLyogSG9zdCBETUEgRW5naW5lIDEgQ29tbWFuZCAqLworI2RlZmluZSBCQTBfRE1SMgkJMHgwMTYwCS8qIEhvc3QgRE1BIEVuZ2luZSAyIE1vZGUgKi8KKyNkZWZpbmUgQkEwX0RDUjIJCTB4MDE2NAkvKiBIb3N0IERNQSBFbmdpbmUgMiBDb21tYW5kICovCisjZGVmaW5lIEJBMF9ETVIzCQkweDAxNjgJLyogSG9zdCBETUEgRW5naW5lIDMgTW9kZSAqLworI2RlZmluZSBCQTBfRENSMwkJMHgwMTZjCS8qIEhvc3QgRE1BIEVuZ2luZSAzIENvbW1hbmQgKi8KKworI2RlZmluZSBCQTBfRE1SX0RNQQkJKDE8PDI5KQkvKiBFbmFibGUgRE1BIG1vZGUgKi8KKyNkZWZpbmUgQkEwX0RNUl9QT0xMCQkoMTw8MjgpCS8qIEVuYWJsZSBwb2xsIG1vZGUgKi8KKyNkZWZpbmUgQkEwX0RNUl9UQkMJCSgxPDwyNSkJLyogVHJhbnNmZXIgQnkgQ2hhbm5lbCAqLworI2RlZmluZSBCQTBfRE1SX0NCQwkJKDE8PDI0KQkvKiBDb3VudCBCeSBDaGFubmVsICgwID0gZnJhbWUgcmVzb2x1dGlvbikgKi8KKyNkZWZpbmUgQkEwX0RNUl9TV0FQQwkJKDE8PDIyKQkvKiBTd2FwIExlZnQvUmlnaHQgQ2hhbm5lbHMgKi8KKyNkZWZpbmUgQkEwX0RNUl9TSVpFMjAJCSgxPDwyMCkJLyogU2FtcGxlIGlzIDIwLWJpdCAqLworI2RlZmluZSBCQTBfRE1SX1VTSUdOCQkoMTw8MTkpCS8qIFVuc2lnbmVkICovCisjZGVmaW5lIEJBMF9ETVJfQkVORAkJKDE8PDE4KQkvKiBCaWcgRW5kaWFuICovCisjZGVmaW5lIEJBMF9ETVJfTU9OTwkJKDE8PDE3KQkvKiBNb25vICovCisjZGVmaW5lIEJBMF9ETVJfU0laRTgJCSgxPDwxNikJLyogU2FtcGxlIGlzIDgtYml0ICovCisjZGVmaW5lIEJBMF9ETVJfVFlQRV9ERU1BTkQJKDA8PDYpCisjZGVmaW5lIEJBMF9ETVJfVFlQRV9TSU5HTEUJKDE8PDYpCisjZGVmaW5lIEJBMF9ETVJfVFlQRV9CTE9DSwkoMjw8NikKKyNkZWZpbmUgQkEwX0RNUl9UWVBFX0NBU0NBREUJKDM8PDYpCS8qIE5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQkEwX0RNUl9ERUMJCSgxPDw1KQkvKiBBY2Nlc3MgSW5jcmVtZW50ICgwKSBvciBEZWNyZW1lbnQgKDEpICovCisjZGVmaW5lIEJBMF9ETVJfQVVUTwkJKDE8PDQpCS8qIEF1dG8tSW5pdGlhbGl6ZSAqLworI2RlZmluZSBCQTBfRE1SX1RSX1ZFUklGWQkoMDw8MikJLyogVmVyaWZ5IFRyYW5zZmVyICovCisjZGVmaW5lIEJBMF9ETVJfVFJfV1JJVEUJKDE8PDIpCS8qIFdyaXRlIFRyYW5zZmVyICovCisjZGVmaW5lIEJBMF9ETVJfVFJfUkVBRAkJKDI8PDIpCS8qIFJlYWQgVHJhbnNmZXIgKi8KKworI2RlZmluZSBCQTBfRENSX0hUQ0lFCQkoMTw8MTcpCS8qIEhhbGYgVGVybWluYWwgQ291bnQgSW50ZXJydXB0ICovCisjZGVmaW5lIEJBMF9EQ1JfVENJRQkJKDE8PDE2KQkvKiBUZXJtaW5hbCBDb3VudCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQkEwX0RDUl9NU0sJCSgxPDwwKQkvKiBETUEgTWFzayBiaXQgKi8KKworI2RlZmluZSBCQTBfRkNSMAkJMHgwMTgwCS8qIEZJRk8gQ29udHJvbCAwICovCisjZGVmaW5lIEJBMF9GQ1IxCQkweDAxODQJLyogRklGTyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQkEwX0ZDUjIJCTB4MDE4OAkvKiBGSUZPIENvbnRyb2wgMiAqLworI2RlZmluZSBCQTBfRkNSMwkJMHgwMThjCS8qIEZJRk8gQ29udHJvbCAzICovCisKKyNkZWZpbmUgQkEwX0ZDUl9GRU4JCSgxPDwzMSkJLyogRklGTyBFbmFibGUgYml0ICovCisjZGVmaW5lIEJBMF9GQ1JfREFDWgkJKDE8PDMwKQkvKiBEQUMgWmVybyAqLworI2RlZmluZSBCQTBfRkNSX1BTSAkJKDE8PDI5KQkvKiBQcmV2aW91cyBTYW1wbGUgSG9sZCAqLworI2RlZmluZSBCQTBfRkNSX1JTKHgpCQkoKCh4KSYweDFmKTw8MjQpIC8qIFJpZ2h0IFNsb3QgTWFwcGluZyAqLworI2RlZmluZSBCQTBfRkNSX0xTKHgpCQkoKCh4KSYweDFmKTw8MTYpIC8qIExlZnQgU2xvdCBNYXBwaW5nICovCisjZGVmaW5lIEJBMF9GQ1JfU1ooeCkJCSgoKHgpJjB4N2YpPDw4KQkvKiBGSUZPIGJ1ZmZlciBzaXplIChpbiBzYW1wbGVzKSAqLworI2RlZmluZSBCQTBfRkNSX09GKHgpCQkoKCh4KSYweDdmKTw8MCkJLyogRklGTyBzdGFydGluZyBvZmZzZXQgKGluIHNhbXBsZXMpICovCisKKyNkZWZpbmUgQkEwX0ZQRFIwCQkweDAxOTAJLyogRklGTyBQb2xsZWQgRGF0YSAwICovCisjZGVmaW5lIEJBMF9GUERSMQkJMHgwMTk0CS8qIEZJRk8gUG9sbGVkIERhdGEgMSAqLworI2RlZmluZSBCQTBfRlBEUjIJCTB4MDE5OAkvKiBGSUZPIFBvbGxlZCBEYXRhIDIgKi8KKyNkZWZpbmUgQkEwX0ZQRFIzCQkweDAxOWMJLyogRklGTyBQb2xsZWQgRGF0YSAzICovCisKKyNkZWZpbmUgQkEwX0ZDSFMJCTB4MDIwYwkvKiBGSUZPIENoYW5uZWwgU3RhdHVzICovCisjZGVmaW5lIEJBMF9GQ0hTX1JDTyh4KQkJKDE8PCg3KygoKHgpJjMpPDwzKSkpIC8qIFJpZ2h0IENoYW5uZWwgT3V0ICovCisjZGVmaW5lIEJBMF9GQ0hTX0xDTyh4KQkJKDE8PCg2KygoKHgpJjMpPDwzKSkpIC8qIExlZnQgQ2hhbm5lbCBPdXQgKi8KKyNkZWZpbmUgQkEwX0ZDSFNfTVJQKHgpCQkoMTw8KDUrKCgoeCkmMyk8PDMpKSkgLyogTW92ZSBSZWFkIFBvaW50ZXIgKi8KKyNkZWZpbmUgQkEwX0ZDSFNfRkUoeCkJCSgxPDwoNCsoKCh4KSYzKTw8MykpKSAvKiBGSUZPIEVtcHR5ICovCisjZGVmaW5lIEJBMF9GQ0hTX0ZGKHgpCQkoMTw8KDMrKCgoeCkmMyk8PDMpKSkgLyogRklGTyBGdWxsICovCisjZGVmaW5lIEJBMF9GQ0hTX0lPUih4KQkJKDE8PCgyKygoKHgpJjMpPDwzKSkpIC8qIEludGVybmFsIE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBCQTBfRkNIU19SQ0koeCkJCSgxPDwoMSsoKCh4KSYzKTw8MykpKSAvKiBSaWdodCBDaGFubmVsIEluICovCisjZGVmaW5lIEJBMF9GQ0hTX0xDSSh4KQkJKDE8PCgwKygoKHgpJjMpPDwzKSkpIC8qIExlZnQgQ2hhbm5lbCBJbiAqLworCisjZGVmaW5lIEJBMF9GU0lDMAkJMHgwMjEwCS8qIEZJRk8gU3RhdHVzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCAwICovCisjZGVmaW5lIEJBMF9GU0lDMQkJMHgwMjE0CS8qIEZJRk8gU3RhdHVzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCAxICovCisjZGVmaW5lIEJBMF9GU0lDMgkJMHgwMjE4CS8qIEZJRk8gU3RhdHVzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCAyICovCisjZGVmaW5lIEJBMF9GU0lDMwkJMHgwMjFjCS8qIEZJRk8gU3RhdHVzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCAzICovCisKKyNkZWZpbmUgQkEwX0ZTSUNfRklDKHgpCQkoKCh4KSYweDdmKTw8MjQpIC8qIEZJRk8gSW50ZXJydXB0IENvdW50ICovCisjZGVmaW5lIEJBMF9GU0lDX0ZPUklFCQkoMTw8MjMpIC8qIEZJRk8gT3ZlclJ1biBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEJBMF9GU0lDX0ZVUklFCQkoMTw8MjIpIC8qIEZJRk8gVW5kZXJSdW4gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBCQTBfRlNJQ19GU0NJRQkJKDE8PDE2KQkvKiBGSUZPIFNhbXBsZSBDb3VudCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEJBMF9GU0lDX0ZTQyh4KQkJKCgoeCkmMHg3Zik8PDgpIC8qIEZJRk8gU2FtcGxlIENvdW50ICovCisjZGVmaW5lIEJBMF9GU0lDX0ZPUgkJKDE8PDcpCS8qIEZJRk8gT3ZlclJ1biAqLworI2RlZmluZSBCQTBfRlNJQ19GVVIJCSgxPDw2KQkvKiBGSUZPIFVuZGVyUnVuICovCisjZGVmaW5lIEJBMF9GU0lDX0ZTQ1IJCSgxPDwwKQkvKiBGSUZPIFNhbXBsZSBDb3VudCBSZWFjaGVkICovCisKKyNkZWZpbmUgQkEwX1BNQ1MJCTB4MDM0NAkvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wvU3RhdHVzICovCisjZGVmaW5lIEJBMF9DV1BSCQkweDAzZTAJLyogQ29uZmlndXJhdGlvbiBXcml0ZSBQcm90ZWN0ICovCisjZGVmaW5lIEJBMF9FUFBNQwkJMHgwM2U0CS8qIEV4dGVuZGVkIFBDSSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX0dQSU9SCQkweDAzZTgJLyogR1BJTyBQaW4gSW50ZXJmYWNlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQkEwX1NQTUMJCTB4MDNlYwkvKiBTZXJpYWwgUG9ydCBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgKCYgQVNESU4yIGVuYWJsZSkgKi8KKyNkZWZpbmUgQkEwX1NQTUNfR0lQUEVOCQkoMTw8MTUpCS8qIEdQIElOVCBQcmltYXJ5IFBNRSMgRW5hYmxlICovCisjZGVmaW5lIEJBMF9TUE1DX0dJU1BFTgkJKDE8PDE0KQkvKiBHUCBJTlQgU2Vjb25kYXJ5IFBNRSMgRW5hYmxlICovCisjZGVmaW5lIEJBMF9TUE1DX0VFU1BECQkoMTw8OSkJLyogRUVQUk9NIFNlcmlhbCBQb3J0IERpc2FibGUgKi8KKyNkZWZpbmUgQkEwX1NQTUNfQVNESTJFCQkoMTw8OCkJLyogQVNESU4yIEVuYWJsZSAqLworI2RlZmluZSBCQTBfU1BNQ19BU0RPCQkoMTw8NykJLyogQXN5bmNocm9ub3VzIEFTRE9VVCBBc3NlcnRpb24gKi8KKyNkZWZpbmUgQkEwX1NQTUNfV1VQMgkJKDE8PDMpCS8qIFdha2V1cCBmb3IgU2Vjb25kYXJ5IElucHV0ICovCisjZGVmaW5lIEJBMF9TUE1DX1dVUDEJCSgxPDwyKQkvKiBXYWtldXAgZm9yIFByaW1hcnkgSW5wdXQgKi8KKyNkZWZpbmUgQkEwX1NQTUNfQVNZTkMJCSgxPDwxKQkvKiBBc3luY2hyb25vdXMgQVNZTkMgQXNzZXJ0aW9uICovCisjZGVmaW5lIEJBMF9TUE1DX1JTVE4JCSgxPDwwKQkvKiBSZXNldCBOb3QhICovCisKKyNkZWZpbmUgQkEwX0NGTFIJCTB4MDNmMAkvKiBDb25maWd1cmF0aW9uIExvYWQgUmVnaXN0ZXIgKEVFUFJPTSBvciBCSU9TKSAqLworI2RlZmluZSBCQTBfQ0ZMUl9ERUZBVUxUCTB4MDAwMDAwMDEgLyogQ0ZMUiBtdXN0IGJlIGluIEFDOTcgbGluayBtb2RlICovCisjZGVmaW5lIEJBMF9JSVNSCQkweDAzZjQJLyogSVNBIEludGVycnVwdCBTZWxlY3QgKi8KKyNkZWZpbmUgQkEwX1RNUwkJCTB4MDNmOAkvKiBUZXN0IFJlZ2lzdGVyICovCisjZGVmaW5lIEJBMF9TU1ZJRAkJMHgwM2ZjCS8qIFN1YnN5c3RlbSBJRCByZWdpc3RlciAqLworCisjZGVmaW5lIEJBMF9DTEtDUjEJCTB4MDQwMAkvKiBDbG9jayBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgQkEwX0NMS0NSMV9DTEtPTgkoMTw8MjUpCS8qIFJlYWQgT25seSAqLworI2RlZmluZSBCQTBfQ0xLQ1IxX0RMTFJEWQkoMTw8MjQpCS8qIERMTCBSZWFkeSAqLworI2RlZmluZSBCQTBfQ0xLQ1IxX0RMTE9TCSgxPDw2KQkvKiBETEwgT3V0cHV0IFNlbGVjdCAqLworI2RlZmluZSBCQTBfQ0xLQ1IxX1NXQ0UJCSgxPDw1KQkvKiBDbG9jayBFbmFibGUgKi8KKyNkZWZpbmUgQkEwX0NMS0NSMV9ETExQCQkoMTw8NCkJLyogRExMIFBvd2VyVXAgKi8KKyNkZWZpbmUgQkEwX0NMS0NSMV9ETExTUwkoKCh4KSYzKTw8MykgLyogRExMIFNvdXJjZSBTZWxlY3QgKi8KKworI2RlZmluZSBCQTBfRlJSCQkJMHgwNDEwCS8qIEZlYXR1cmUgUmVwb3J0aW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEJBMF9TTFQxMk8JCTB4MDQxYwkvKiBTbG90IDEyIEdQSU8gT3V0cHV0IFJlZ2lzdGVyIGZvciBBQy1MaW5rICovCisKKyNkZWZpbmUgQkEwX1NFUk1DCQkweDA0MjAJLyogU2VyaWFsIFBvcnQgTWFzdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX1NFUk1DX0ZDUk4JCSgxPDwyNykJLyogRm9yY2UgQ29kZWMgUmVhZHkgTm90ICovCisjZGVmaW5lIEJBMF9TRVJNQ19PRFNFTjIJKDE8PDI1KQkvKiBPbi1EZW1hbmQgU3VwcG9ydCBFbmFibGUgQVNESU4yICovCisjZGVmaW5lIEJBMF9TRVJNQ19PRFNFTjEJKDE8PDI0KQkvKiBPbi1EZW1hbmQgU3VwcG9ydCBFbmFibGUgQVNESU4xICovCisjZGVmaW5lIEJBMF9TRVJNQ19TWExCCQkoMTw8MjEpCS8qIEFTRElOMiB0byBBU0RPVVQgTG9vcGJhY2sgKi8KKyNkZWZpbmUgQkEwX1NFUk1DX1NMQgkJKDE8PDIwKQkvKiBBU0RPVVQgdG8gQVNESU4yIExvb3BiYWNrICovCisjZGVmaW5lIEJBMF9TRVJNQ19MT1ZGCQkoMTw8MTkpCS8qIExvb3BiYWNrIE91dHB1dCBWYWxpZCBGcmFtZSBiaXQgKi8KKyNkZWZpbmUgQkEwX1NFUk1DX1RDSUQoeCkJKCgoeCkmMyk8PDE2KSAvKiBUYXJnZXQgU2Vjb25kYXJ5IENvZGVjIElEICovCisjZGVmaW5lIEJBMF9TRVJNQ19QWExCCQkoNTw8MSkJLyogUHJpbWFyeSBQb3J0IEV4dGVybmFsIExvb3BiYWNrICovCisjZGVmaW5lIEJBMF9TRVJNQ19QTEIJCSg0PDwxKQkvKiBQcmltYXJ5IFBvcnQgSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgQkEwX1NFUk1DX1BUQwkJKDc8PDEpCS8qIFBvcnQgVGltaW5nIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQkEwX1NFUk1DX1BUQ19BQzk3CSgxPDwxKQkvKiBBQzk3IG1vZGUgKi8KKyNkZWZpbmUgQkEwX1NFUk1DX01TUEUJCSgxPDwwKQkvKiBNYXN0ZXIgU2VyaWFsIFBvcnQgRW5hYmxlICovCisKKyNkZWZpbmUgQkEwX1NFUkMxCQkweDA0MjgJLyogU2VyaWFsIFBvcnQgQ29uZmlndXJhdGlvbiAxICovCisjZGVmaW5lIEJBMF9TRVJDMV9TTzFGKHgpCSgoKHgpJjcpPj4xKSAvKiBQcmltYXJ5IE91dHB1dCBQb3J0IEZvcm1hdCAqLworI2RlZmluZSBCQTBfU0VSQzFfQUM5NwkJKDE8PDEpCisjZGVmaW5lIEJBMF9TRVJDMV9TTzFFTgkJKDE8PDApCS8qIFByaW1hcnkgT3V0cHV0IFBvcnQgRW5hYmxlICovCisKKyNkZWZpbmUgQkEwX1NFUkMyCQkweDA0MmMJLyogU2VyaWFsIFBvcnQgQ29uZmlndXJhdGlvbiAyICovCisjZGVmaW5lIEJBMF9TRVJDMl9TSTFGKHgpCSgoKHgpJjcpPj4xKSAvKiBQcmltYXJ5IElucHV0IFBvcnQgRm9ybWF0ICovCisjZGVmaW5lIEJBMF9TRVJDMl9BQzk3CQkoMTw8MSkKKyNkZWZpbmUgQkEwX1NFUkMyX1NJMUVOCQkoMTw8MCkJLyogUHJpbWFyeSBJbnB1dCBQb3J0IEVuYWJsZSAqLworCisjZGVmaW5lIEJBMF9TTFQxMk0JCTB4MDQ1YwkvKiBTbG90IDEyIE1vbml0b3IgUmVnaXN0ZXIgZm9yIFByaW1hcnkgQUMtTGluayAqLworCisjZGVmaW5lIEJBMF9BQ0NUTAkJMHgwNDYwCS8qIEFDJzk3IENvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX0FDQ1RMX1RDCQkoMTw8NikJLyogVGFyZ2V0IENvZGVjICovCisjZGVmaW5lIEJBMF9BQ0NUTF9DUlcJCSgxPDw0KQkvKiAwPVdyaXRlLCAxPVJlYWQgQ29tbWFuZCAqLworI2RlZmluZSBCQTBfQUNDVExfRENWCQkoMTw8MykJLyogRHluYW1pYyBDb21tYW5kIFZhbGlkICovCisjZGVmaW5lIEJBMF9BQ0NUTF9WRlJNCQkoMTw8MikJLyogVmFsaWQgRnJhbWUgKi8KKyNkZWZpbmUgQkEwX0FDQ1RMX0VTWU4JCSgxPDwxKQkvKiBFbmFibGUgU3luYyAqLworCisjZGVmaW5lIEJBMF9BQ1NUUwkJMHgwNDY0CS8qIEFDJzk3IFN0YXR1cyAqLworI2RlZmluZSBCQTBfQUNTVFNfVlNUUwkJKDE8PDEpCS8qIFZhbGlkIFN0YXR1cyAqLworI2RlZmluZSBCQTBfQUNTVFNfQ1JEWQkJKDE8PDApCS8qIENvZGVjIFJlYWR5ICovCisKKyNkZWZpbmUgQkEwX0FDT1NWCQkweDA0NjgJLyogQUMnOTcgT3V0cHV0IFNsb3QgVmFsaWQgKi8KKyNkZWZpbmUgQkEwX0FDT1NWX1NMVih4KQkoMTw8KCh4KS0zKSkKKworI2RlZmluZSBCQTBfQUNDQUQJCTB4MDQ2YwkvKiBBQyc5NyBDb21tYW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgQkEwX0FDQ0RBCQkweDA0NzAJLyogQUMnOTcgQ29tbWFuZCBEYXRhICovCisKKyNkZWZpbmUgQkEwX0FDSVNWCQkweDA0NzQJLyogQUMnOTcgSW5wdXQgU2xvdCBWYWxpZCAqLworI2RlZmluZSBCQTBfQUNJU1ZfU0xWKHgpCSgxPDwoKHgpLTMpKQorCisjZGVmaW5lIEJBMF9BQ1NBRAkJMHgwNDc4CS8qIEFDJzk3IFN0YXR1cyBBZGRyZXNzICovCisjZGVmaW5lIEJBMF9BQ1NEQQkJMHgwNDdjCS8qIEFDJzk3IFN0YXR1cyBEYXRhICovCisjZGVmaW5lIEJBMF9KU1BUCQkweDA0ODAJLyogSm95c3RpY2sgcG9sbC90cmlnZ2VyICovCisjZGVmaW5lIEJBMF9KU0NUTAkJMHgwNDg0CS8qIEpveXN0aWNrIGNvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX0pTQzEJCTB4MDQ4OAkvKiBKb3lzdGljayBjb250cm9sICovCisjZGVmaW5lIEJBMF9KU0MyCQkweDA0OGMJLyogSm95c3RpY2sgY29udHJvbCAqLworI2RlZmluZSBCQTBfSlNJTwkJMHgwNGEwCisKKyNkZWZpbmUgQkEwX01JRENSCQkweDA0OTAJLyogTUlESSBDb250cm9sICovCisjZGVmaW5lIEJBMF9NSURDUl9NUlNUCQkoMTw8NSkJLyogUmVzZXQgTUlESSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQkEwX01JRENSX01MQgkJKDE8PDQpCS8qIE1JREkgTG9vcCBCYWNrIEVuYWJsZSAqLworI2RlZmluZSBCQTBfTUlEQ1JfVElFCQkoMTw8MykJLyogTUlESSBUcmFuc211aXQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBCQTBfTUlEQ1JfUklFCQkoMTw8MikJLyogTUlESSBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgQkEwX01JRENSX1JYRQkJKDE8PDEpCS8qIE1JREkgUmVjZWl2ZSBFbmFibGUgKi8KKyNkZWZpbmUgQkEwX01JRENSX1RYRQkJKDE8PDApCS8qIE1JREkgVHJhbnNtaXQgRW5hYmxlICovCisKKyNkZWZpbmUgQkEwX01JRENNRAkJMHgwNDk0CS8qIE1JREkgQ29tbWFuZCAod28pICovCisKKyNkZWZpbmUgQkEwX01JRFNSCQkweDA0OTQJLyogTUlESSBTdGF0dXMgKHJvKSAqLworI2RlZmluZSBCQTBfTUlEU1JfUkRBCQkoMTw8MTUpCS8qIFN0aWNreSBiaXQgKFJCRSAxLT4wKSAqLworI2RlZmluZSBCQTBfTUlEU1JfVEJFCQkoMTw8MTQpIC8qIFN0aWNreSBiaXQgKFRCRiAwLT4xKSAqLworI2RlZmluZSBCQTBfTUlEU1JfUkJFCQkoMTw8NykJLyogUmVjZWl2ZSBCdWZmZXIgRW1wdHkgKi8KKyNkZWZpbmUgQkEwX01JRFNSX1RCRgkJKDE8PDYpCS8qIFRyYW5zbWl0IEJ1ZmZlciBGdWxsICovCisKKyNkZWZpbmUgQkEwX01JRFdQCQkweDA0OTgJLyogTUlESSBXcml0ZSAqLworI2RlZmluZSBCQTBfTUlEUlAJCTB4MDQ5YwkvKiBNSURJIFJlYWQgKHJvKSAqLworCisjZGVmaW5lIEJBMF9BT0RTRDEJCTB4MDRhOAkvKiBBQyc5NyBPbi1EZW1hbmQgU2xvdCBEaXNhYmxlIGZvciBwcmltYXJ5IGxpbmsgKHJvKSAqLworI2RlZmluZSBCQTBfQU9EU0QxX05EUyh4KQkoMTw8KCh4KS0zKSkKKworI2RlZmluZSBCQTBfQU9EU0QyCQkweDA0YWMJLyogQUMnOTcgT24tRGVtYW5kIFNsb3QgRGlzYWJsZSBmb3Igc2Vjb25kYXJ5IGxpbmsgKHJvKSAqLworI2RlZmluZSBCQTBfQU9EU0QyX05EUyh4KQkoMTw8KCh4KS0zKSkKKworI2RlZmluZSBCQTBfQ0ZHSQkJMHgwNGIwCS8qIENvbmZpZ3VyZSBJbnRlcmZhY2UgKEVFUFJPTSBpbnRlcmZhY2UpICovCisjZGVmaW5lIEJBMF9TTFQxMk0yCQkweDA0ZGMJLyogU2xvdCAxMiBNb25pdG9yIFJlZ2lzdGVyIDIgZm9yIHNlY29uZGFyeSBBQy1saW5rICovCisjZGVmaW5lIEJBMF9BQ1NUUzIJCTB4MDRlNAkvKiBBQyc5NyBTdGF0dXMgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBCQTBfQUNJU1YyCQkweDA0ZjQJLyogQUMnOTcgSW5wdXQgU2xvdCBWYWxpZCBSZWdpc3RlciAyICovCisjZGVmaW5lIEJBMF9BQ1NBRDIJCTB4MDRmOAkvKiBBQyc5NyBTdGF0dXMgQWRkcmVzcyBSZWdpc3RlciAyICovCisjZGVmaW5lIEJBMF9BQ1NEQTIJCTB4MDRmYwkvKiBBQyc5NyBTdGF0dXMgRGF0YSBSZWdpc3RlciAyICovCisjZGVmaW5lIEJBMF9GTVNSCQkweDA3MzAJLyogRk0gU3ludGhlc2lzIFN0YXR1cyAocm8pICovCisjZGVmaW5lIEJBMF9CMEFQCQkweDA3MzAJLyogRk0gQmFuayAwIEFkZHJlc3MgUG9ydCAod28pICovCisjZGVmaW5lIEJBMF9GTURQCQkweDA3MzQJLyogRk0gRGF0YSBQb3J0ICovCisjZGVmaW5lIEJBMF9CMUFQCQkweDA3MzgJLyogRk0gQmFuayAxIEFkZHJlc3MgUG9ydCAqLworI2RlZmluZSBCQTBfQjFEUAkJMHgwNzNjCS8qIEZNIEJhbmsgMSBEYXRhIFBvcnQgKi8KKworI2RlZmluZSBCQTBfU1NQTQkJMHgwNzQwCS8qIFNvdW5kIFN5c3RlbSBQb3dlciBNYW5hZ2VtZW50ICovCisjZGVmaW5lIEJBMF9TU1BNX01JWEVOCQkoMTw8NikJLyogUGxheWJhY2sgU1JDICsgRk0vV2F2ZXRhYmxlIE1JWCAqLworI2RlZmluZSBCQTBfU1NQTV9DU1JDRU4JCSgxPDw1KQkvKiBDYXB0dXJlIFNhbXBsZSBSYXRlIENvbnZlcnRlciBFbmFibGUgKi8KKyNkZWZpbmUgQkEwX1NTUE1fUFNSQ0VOCQkoMTw8NCkJLyogUGxheWJhY2sgU2FtcGxlIFJhdGUgQ29udmVydGVyIEVuYWJsZSAqLworI2RlZmluZSBCQTBfU1NQTV9KU0VOCQkoMTw8MykJLyogSm95c3RpY2sgRW5hYmxlICovCisjZGVmaW5lIEJBMF9TU1BNX0FDTEVOCQkoMTw8MikJLyogU2VyaWFsIFBvcnQgRW5naW5lIGFuZCBBQy1MaW5rIEVuYWJsZSAqLworI2RlZmluZSBCQTBfU1NQTV9GTUVOCQkoMTw8MSkJLyogRk0gU3ludGhlc2lzIEJsb2NrIEVuYWJsZSAqLworCisjZGVmaW5lIEJBMF9EQUNTUgkJMHgwNzQ0CS8qIERBQyBTYW1wbGUgUmF0ZSAtIFBsYXliYWNrIFNSQyAqLworI2RlZmluZSBCQTBfQURDU1IJCTB4MDc0OAkvKiBBREMgU2FtcGxlIFJhdGUgLSBDYXB0dXJlIFNSQyAqLworCisjZGVmaW5lIEJBMF9TU0NSCQkweDA3NGMJLyogU291bmQgU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkEwX1NTQ1JfSFZTMQkJKDE8PDIzKQkvKiBIYXJkd2F2ZSBWb2x1bWUgU3RlcCAoMD0xLDE9MikgKi8KKyNkZWZpbmUgQkEwX1NTQ1JfTVZDUwkJKDE8PDE5KQkvKiBNYXN0ZXIgVm9sdW1lIENvZGVjIFNlbGVjdCAqLworI2RlZmluZSBCQTBfU1NDUl9NVkxECQkoMTw8MTgpCS8qIE1hc3RlciBWb2x1bWUgTGluZSBPdXQgRGlzYWJsZSAqLworI2RlZmluZSBCQTBfU1NDUl9NVkFECQkoMTw8MTcpCS8qIE1hc3RlciBWb2x1bWUgQWx0ZXJuYXRlIE91dCBEaXNhYmxlICovCisjZGVmaW5lIEJBMF9TU0NSX01WTUQJCSgxPDwxNikJLyogTWFzdGVyIFZvbHVtZSBNb25vIE91dCBEaXNhYmxlICovCisjZGVmaW5lIEJBMF9TU0NSX1hMUFNSQwkJKDE8PDgpCS8qIEV4dGVybmFsIFNSQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIEJBMF9TU0NSX0xQU1JDCQkoMTw8NykJLyogU1JDIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgQkEwX1NTQ1JfQ0RUWAkJKDE8PDUpCS8qIENEIFRyYW5zZmVyIERhdGEgKi8KKyNkZWZpbmUgQkEwX1NTQ1JfSFZDCQkoMTw8MykJLyogSGFyd2FyZSBWb2x1bWUgQ29udHJvbCBFbmFibGUgKi8KKworI2RlZmluZSBCQTBfRk1MVkMJCTB4MDc1NAkvKiBGTSBTeW50aGVzaXMgTGVmdCBWb2x1bWUgQ29udHJvbCAqLworI2RlZmluZSBCQTBfRk1SVkMJCTB4MDc1OAkvKiBGTSBTeW50aGVzaXMgUmlnaHQgVm9sdW1lIENvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX1NSQ1NBCQkweDA3NWMJLyogU1JDIFNsb3QgQXNzaWdubWVudHMgKi8KKyNkZWZpbmUgQkEwX1BQTFZDCQkweDA3NjAJLyogUENNIFBsYXliYWNrIExlZnQgVm9sdW1lIENvbnRyb2wgKi8KKyNkZWZpbmUgQkEwX1BQUlZDCQkweDA3NjQJLyogUENNIFBsYXliYWNrIFJpZ2h0IFZvbHVtZSBDb250cm9sICovCisjZGVmaW5lIEJBMF9QQVNSCQkweDA3NjgJLyogcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgQkEwX0NBU1IJCTB4MDc2QwkvKiBjYXB0dXJlIHNhbXBsZSByYXRlICovCisKKy8qIFNvdXJjZSBTbG90IE51bWJlcnMgLSBQbGF5YmFjayAqLworI2RlZmluZSBTUkNTTE9UX0xFRlRfUENNX1BMQVlCQUNLCQkwCisjZGVmaW5lIFNSQ1NMT1RfUklHSFRfUENNX1BMQVlCQUNLCQkxCisjZGVmaW5lIFNSQ1NMT1RfUEhPTkVfTElORV8xX0RBQwkJMgorI2RlZmluZSBTUkNTTE9UX0NFTlRFUl9QQ01fUExBWUJBQ0sJCTMKKyNkZWZpbmUgU1JDU0xPVF9MRUZUX1NVUlJPVU5EX1BDTV9QTEFZQkFDSwk0CisjZGVmaW5lIFNSQ1NMT1RfUklHSFRfU1VSUk9VTkRfUENNX1BMQVlCQUNLCTUKKyNkZWZpbmUgU1JDU0xPVF9MRkVfUENNX1BMQVlCQUNLCQk2CisjZGVmaW5lIFNSQ1NMT1RfUEhPTkVfTElORV8yX0RBQwkJNworI2RlZmluZSBTUkNTTE9UX0hFQURTRVRfREFDCQkJOAorI2RlZmluZSBTUkNTTE9UX0xFRlRfV1QJCQkJMjkgIC8qIGludmFsaWQgZm9yIEJBMF9TUkNTQSAqLworI2RlZmluZSBTUkNTTE9UX1JJR0hUX1dUCQkJMzAgIC8qIGludmFsaWQgZm9yIEJBMF9TUkNTQSAqLworCisvKiBTb3VyY2UgU2xvdCBOdW1iZXJzIC0gQ2FwdHVyZSAqLworI2RlZmluZSBTUkNTTE9UX0xFRlRfUENNX1JFQ09SRAkJCTEwCisjZGVmaW5lIFNSQ1NMT1RfUklHSFRfUENNX1JFQ09SRAkJMTEKKyNkZWZpbmUgU1JDU0xPVF9QSE9ORV9MSU5FXzFfQURDCQkxMgorI2RlZmluZSBTUkNTTE9UX01JQ19BREMJCQkJMTMKKyNkZWZpbmUgU1JDU0xPVF9QSE9ORV9MSU5FXzJfQURDCQkxNworI2RlZmluZSBTUkNTTE9UX0hFQURTRVRfQURDCQkJMTgKKyNkZWZpbmUgU1JDU0xPVF9TRUNPTkRBUllfTEVGVF9QQ01fUkVDT1JECTIwCisjZGVmaW5lIFNSQ1NMT1RfU0VDT05EQVJZX1JJR0hUX1BDTV9SRUNPUkQJMjEKKyNkZWZpbmUgU1JDU0xPVF9TRUNPTkRBUllfUEhPTkVfTElORV8xX0FEQwkyMgorI2RlZmluZSBTUkNTTE9UX1NFQ09OREFSWV9NSUNfQURDCQkyMworI2RlZmluZSBTUkNTTE9UX1NFQ09OREFSWV9QSE9ORV9MSU5FXzJfQURDCTI3CisjZGVmaW5lIFNSQ1NMT1RfU0VDT05EQVJZX0hFQURTRVRfQURDCQkyOAorCisvKiBTb3VyY2UgU2xvdCBOdW1iZXJzIC0gT3RoZXJzICovCisjZGVmaW5lIFNSQ1NMT1RfUE9XRVJfRE9XTgkJCTMxCisKKy8qIE1JREkgbW9kZXMgKi8KKyNkZWZpbmUgQ1M0MjgxX01PREVfT1VUUFVUCQkoMTw8MCkKKyNkZWZpbmUgQ1M0MjgxX01PREVfSU5QVVQJCSgxPDwxKQorCisvKiBqb3lzdGljayBiaXRzICovCisvKiBCaXRzIGZvciBKU1BUICovCisjZGVmaW5lIEpTUFRfQ0FYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEpTUFRfQ0FZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEpTUFRfQ0JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEpTUFRfQ0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEpTUFRfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEpTUFRfQkEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEpTUFRfQkIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEpTUFRfQkIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisKKy8qIEJpdHMgZm9yIEpTQ1RMICovCisjZGVmaW5lIEpTQ1RMX1NQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEpTQ1RMX1NQX1NMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9GQVNUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEpTQ1RMX1NQX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisKKy8qIERhdGEgcmVnaXN0ZXIgcGFpcnMgbWFza3MgKi8KKyNkZWZpbmUgSlNDMV9ZMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSlNDMV9YMVZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSlNDMV9ZMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSlNDMV9YMVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEpTQzJfWTJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEpTQzJfWDJWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lIEpTQzJfWTJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEpTQzJfWDJWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisvKiBKUyBHUElPICovCisjZGVmaW5lIEpTSU9fREFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEpTSU9fREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEpTSU9fREJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEpTSU9fREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEpTSU9fQVhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEpTSU9fQVlPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEpTSU9fQlhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEpTSU9fQllPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisKKy8qCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9jczQyODEgY3M0MjgxX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfY3M0MjgxX2RtYSBjczQyODFfZG1hX3Q7CisKK3N0cnVjdCBzbmRfY3M0MjgxX2RtYSB7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCXVuc2lnbmVkIGludCByZWdEQkE7CQkvKiBvZmZzZXQgdG8gREJBIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IHJlZ0RDQTsJCS8qIG9mZnNldCB0byBEQ0EgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVnREJDOwkJLyogb2Zmc2V0IHRvIERCQyByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWdEQ0M7CQkvKiBvZmZzZXQgdG8gRENDIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IHJlZ0RNUjsJCS8qIG9mZnNldCB0byBETVIgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVnRENSOwkJLyogb2Zmc2V0IHRvIERDUiByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWdIRFNSOwkJLyogb2Zmc2V0IHRvIEhEU1IgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVnRkNSOwkJLyogb2Zmc2V0IHRvIEZDUiByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWdGU0lDOwkJLyogb2Zmc2V0IHRvIEZTSUMgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgdmFsRE1SOwkJLyogRE1BIG1vZGUgKi8KKwl1bnNpZ25lZCBpbnQgdmFsRENSOwkJLyogRE1BIGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBpbnQgdmFsRkNSOwkJLyogRklGTyBjb250cm9sICovCisJdW5zaWduZWQgaW50IGZpZm9fb2Zmc2V0OwkvKiBGSUZPIG9mZnNldCB3aXRoaW4gQkExICovCisJdW5zaWduZWQgY2hhciBsZWZ0X3Nsb3Q7CS8qIEZJRk8gbGVmdCBzbG90ICovCisJdW5zaWduZWQgY2hhciByaWdodF9zbG90OwkvKiBGSUZPIHJpZ2h0IHNsb3QgKi8KKwlpbnQgZnJhZzsJCQkvKiBwZXJpb2QgbnVtYmVyICovCit9OworCisjZGVmaW5lIFNVU1BFTkRfUkVHSVNURVJTCTIwCisKK3N0cnVjdCBzbmRfY3M0MjgxIHsKKwlpbnQgaXJxOworCisJdm9pZCBfX2lvbWVtICpiYTA7CQkvKiB2aXJ0dWFsIChhY2Nlc3NpYmxlKSBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICpiYTE7CQkvKiB2aXJ0dWFsIChhY2Nlc3NpYmxlKSBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBiYTBfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGJhMV9hZGRyOworCisJaW50IGR1YWxfY29kZWM7CisKKwlhYzk3X2J1c190ICphYzk3X2J1czsKKwlhYzk3X3QgKmFjOTc7CisJYWM5N190ICphYzk3X3NlY29uZGFyeTsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfcmF3bWlkaV90ICpybWlkaTsKKwlzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqbWlkaV9pbnB1dDsKKwlzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqbWlkaV9vdXRwdXQ7CisKKwljczQyODFfZG1hX3QgZG1hWzRdOworCisJdW5zaWduZWQgY2hhciBzcmNfbGVmdF9wbGF5X3Nsb3Q7CisJdW5zaWduZWQgY2hhciBzcmNfcmlnaHRfcGxheV9zbG90OworCXVuc2lnbmVkIGNoYXIgc3JjX2xlZnRfcmVjX3Nsb3Q7CisJdW5zaWduZWQgY2hhciBzcmNfcmlnaHRfcmVjX3Nsb3Q7CisKKwl1bnNpZ25lZCBpbnQgc3B1cmlvdXNfZGh0Y19pcnE7CisJdW5zaWduZWQgaW50IHNwdXJpb3VzX2R0Y19pcnE7CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXVuc2lnbmVkIGludCBtaWRjcjsKKwl1bnNpZ25lZCBpbnQgdWFydG07CisKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworCisjaWZkZWYgQ09ORklHX1BNCisJdTMyIHN1c3BlbmRfcmVnc1tTVVNQRU5EX1JFR0lTVEVSU107CisjZW5kaWYKKworfTsKKworc3RhdGljIGlycXJldHVybl90IHNuZF9jczQyODFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2NzNDI4MV9pZHNbXSA9IHsKKwl7IDB4MTAxMywgMHg2MDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAkvKiBDUzQyODEgKi8KKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfY3M0MjgxX2lkcyk7CisKKy8qCisgKiAgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBDUzQyODFfRklGT19TSVpFCTMyCisKKy8qCisgKiAgY29tbW9uIEkvTyByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfZGVsYXkodW5zaWduZWQgaW50IGRlbGF5KQoreworCWlmIChkZWxheSA+IDk5OSkgeworCQl1bnNpZ25lZCBsb25nIGVuZF90aW1lOworCQlkZWxheSA9IChkZWxheSAqIEhaKSAvIDEwMDAwMDA7CisJCWlmIChkZWxheSA8IDEpCisJCQlkZWxheSA9IDE7CisJCWVuZF90aW1lID0gamlmZmllcyArIGRlbGF5OworCQlkbyB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7CisJfSBlbHNlIHsKKwkJdWRlbGF5KGRlbGF5KTsKKwl9Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBzbmRfY3M0MjgxX2RlbGF5X2xvbmcodm9pZCkKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCgxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9jczQyODFfcG9rZUJBMChjczQyODFfdCAqY2hpcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpCit7CisgICAgICAgIHdyaXRlbCh2YWwsIGNoaXAtPmJhMCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9jczQyODFfcGVla0JBMChjczQyODFfdCAqY2hpcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgICAgIHJldHVybiByZWFkbChjaGlwLT5iYTAgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0MjgxX2FjOTdfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJLyoKKwkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKwkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqLworCWNzNDI4MV90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudDsKKworCS8qCisJICogIFNldHVwIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBDUzQ2MXggdG8gc2VuZCB0aGUKKwkgKiAgYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgorCSAqICBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKKwkgKiAgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoCisJICogIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKKwkgKiAgc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAorCSAqICByZXNldCBDUlcgLSBXcml0ZSBjb21tYW5kCisJICogIHNldCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAorCSAqICBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAorCSAqICBzZXQgUlNUTiAtIEFSU1QjIGluYWN0aXZlLCBBQzk3IGNvZGVjIG5vdCByZXNldAorICAgICAgICAgKi8KKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0FDQ0FELCByZWcpOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQUNDREEsIHZhbCk7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTCwgQkEwX0FDQ1RMX0RDViB8IEJBMF9BQ0NUTF9WRlJNIHwKKwkJCQkgICAgICAgICAgICBCQTBfQUNDVExfRVNZTiB8IChhYzk3LT5udW0gPyBCQTBfQUNDVExfVEMgOiAwKSk7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjAwMDsgY291bnQrKykgeworCQkvKgorCQkgKiAgRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgorCQkgKi8KKwkJdWRlbGF5KDEwKTsKKwkJLyoKKwkJICogIE5vdywgY2hlY2sgdG8gc2VlIGlmIHRoZSB3cml0ZSBoYXMgY29tcGxldGVkLgorCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDA3aAorCQkgKi8KKwkJaWYgKCEoc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCkgJiBCQTBfQUNDVExfRENWKSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHdyaXRlIHByb2JsZW0sIHJlZyA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9jczQyODFfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywKKwkJCQkJICAgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWNzNDI4MV90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CisJLy8gRklYTUU6IHZvbGF0aWxlIGlzIG5lY2Vzc2FyeSBpbiB0aGUgZm9sbG93aW5nIGR1ZSB0byBhIGJ1ZyBvZgorCS8vIHNvbWUgZ2NjIHZlcnNpb25zCisJdm9sYXRpbGUgaW50IGFjOTdfbnVtID0gKCh2b2xhdGlsZSBhYzk3X3QgKilhYzk3KS0+bnVtOworCisJLyoKKwkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKwkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcgCisJICogIDMuIFdyaXRlIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGggZm9yIGluaXRpYXRpbmcgdGhlIHdyaXRlCisJICogIDQuIFJlYWQgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCSAqICA1LiBpZiBEQ1Ygbm90IGNsZWFyZWQsIGJyZWFrIGFuZCByZXR1cm4gZXJyb3IKKwkgKiAgNi4gUmVhZCBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgsIGNoZWNrIFZTVFMgYml0CisJICovCisKKwlzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgYWM5N19udW0gPyBCQTBfQUNTREEyIDogQkEwX0FDU0RBKTsKKworCS8qCisJICogIFNldHVwIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBDUzQ2MXggdG8gc2VuZCB0aGUKKwkgKiAgYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgorCSAqICBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKKwkgKiAgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoCisJICogIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKKwkgKiAgc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAorCSAqICBzZXQgQ1JXIC0gUmVhZCBjb21tYW5kCisJICogIHNldCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAorCSAqICBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAorCSAqICBzZXQgUlNUTiAtIEFSU1QjIGluYWN0aXZlLCBBQzk3IGNvZGVjIG5vdCByZXNldAorCSAqLworCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NBRCwgcmVnKTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0FDQ0RBLCAwKTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLCBCQTBfQUNDVExfRENWIHwgQkEwX0FDQ1RMX0NSVyB8CisJCQkJCSAgICBCQTBfQUNDVExfVkZSTSB8IEJBMF9BQ0NUTF9FU1lOIHwKKwkJCSAgIChhYzk3X251bSA/IEJBMF9BQ0NUTF9UQyA6IDApKTsKKworCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIHJlYWQgdG8gb2NjdXIuCisJICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNTAwOyBjb3VudCsrKSB7CisJCS8qCisJCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJIAkgKi8KKwkJdWRlbGF5KDEwKTsKKwkJLyoKKwkJICogIE5vdywgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWFkIGhhcyBjb21wbGV0ZWQuCisJCSAqICBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCisJCSAqLworCQlpZiAoIShzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0FDQ1RMKSAmIEJBMF9BQ0NUTF9EQ1YpKQorCQkJZ290byBfX29rMTsKKwl9CisKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZWFkIHByb2JsZW0gKEFDQ1RMX0RDViksIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJcmVzdWx0ID0gMHhmZmZmOworCWdvdG8gX19lbmQ7CisJCisgICAgICBfX29rMToKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCisJICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7CisJCS8qCisJCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KKwkJICogIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aAorCQkgKiAgVlNUUyAtIFZhbGlkIFN0YXR1cworCQkgKi8KKwkJaWYgKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBhYzk3X251bSA/IEJBMF9BQ1NUUzIgOiBCQTBfQUNTVFMpICYgQkEwX0FDU1RTX1ZTVFMpCisJCQlnb3RvIF9fb2syOworCQl1ZGVsYXkoMTApOworCX0KKwkKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZWFkIHByb2JsZW0gKEFDU1RTX1ZTVFMpLCByZWcgPSAweCV4XG4iLCByZWcpOworCXJlc3VsdCA9IDB4ZmZmZjsKKwlnb3RvIF9fZW5kOworCisgICAgICBfX29rMjoKKwkvKgorCSAqICBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCisJICovCisJcmVzdWx0ID0gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIGFjOTdfbnVtID8gQkEwX0FDU0RBMiA6IEJBMF9BQ1NEQSk7CisKKyAgICAgIF9fZW5kOgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiAgUENNIHBhcnQKKyAqLworCitzdGF0aWMgaW50IHNuZF9jczQyODFfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJY3M0MjgxX2RtYV90ICpkbWEgPSAoY3M0MjgxX2RtYV90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJY3M0MjgxX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJZG1hLT52YWxEQ1IgfD0gQkEwX0RDUl9NU0s7CisJCWRtYS0+dmFsRkNSIHw9IEJBMF9GQ1JfRkVOOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWRtYS0+dmFsRENSICY9IH5CQTBfRENSX01TSzsKKwkJZG1hLT52YWxGQ1IgJj0gfkJBMF9GQ1JfRkVOOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgZG1hLT5yZWdETVIsIGRtYS0+dmFsRE1SICYgfkJBMF9ETVJfRE1BKTsKKwkJZG1hLT52YWxETVIgfD0gQkEwX0RNUl9ETUE7CisJCWRtYS0+dmFsRENSICY9IH5CQTBfRENSX01TSzsKKwkJZG1hLT52YWxGQ1IgfD0gQkEwX0ZDUl9GRU47CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCWRtYS0+dmFsRE1SICY9IH4oQkEwX0RNUl9ETUF8QkEwX0RNUl9QT0xMKTsKKwkJZG1hLT52YWxEQ1IgfD0gQkEwX0RDUl9NU0s7CisJCWRtYS0+dmFsRkNSICY9IH5CQTBfRkNSX0ZFTjsKKwkJLyogTGVhdmUgd2F2ZSBwbGF5YmFjayBGSUZPIGVuYWJsZWQgZm9yIEZNICovCisJCWlmIChkbWEtPnJlZ0ZDUiAhPSBCQTBfRkNSMCkKKwkJCWRtYS0+dmFsRkNSICY9IH5CQTBfRkNSX0ZFTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0RNUiwgZG1hLT52YWxETVIpOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0ZDUiwgZG1hLT52YWxGQ1IpOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0RDUiwgZG1hLT52YWxEQ1IpOworCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2NzNDI4MV9yYXRlKHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgKnJlYWxfcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gfjA7CisJCisJaWYgKHJlYWxfcmF0ZSkKKwkJKnJlYWxfcmF0ZSA9IHJhdGU7CisJLyogc3BlY2lhbCAiaGFyZGNvZGVkIiByYXRlcyAqLworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoJcmV0dXJuIDU7CisJY2FzZSAxMTAyNToJcmV0dXJuIDQ7CisJY2FzZSAxNjAwMDoJcmV0dXJuIDM7CisJY2FzZSAyMjA1MDoJcmV0dXJuIDI7CisJY2FzZSA0NDEwMDoJcmV0dXJuIDE7CisJY2FzZSA0ODAwMDoJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZ290byBfX3ZhcmlhYmxlOworCX0KKyAgICAgIF9fdmFyaWFibGU6CisJdmFsID0gMTUzNjAwMCAvIHJhdGU7CisJaWYgKHJlYWxfcmF0ZSkKKwkJKnJlYWxfcmF0ZSA9IDE1MzYwMDAgLyB2YWw7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgc25kX2NzNDI4MV9tb2RlKGNzNDI4MV90ICpjaGlwLCBjczQyODFfZG1hX3QgKmRtYSwgc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUsIGludCBjYXB0dXJlLCBpbnQgc3JjKQoreworCWludCByZWNfbW9ubzsKKworCWRtYS0+dmFsRE1SID0gQkEwX0RNUl9UWVBFX1NJTkdMRSB8IEJBMF9ETVJfQVVUTyB8CisJCSAgICAgIChjYXB0dXJlID8gQkEwX0RNUl9UUl9XUklURSA6IEJBMF9ETVJfVFJfUkVBRCk7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDEpCisJCWRtYS0+dmFsRE1SIHw9IEJBMF9ETVJfTU9OTzsKKwlpZiAoc25kX3BjbV9mb3JtYXRfdW5zaWduZWQocnVudGltZS0+Zm9ybWF0KSA+IDApCisJCWRtYS0+dmFsRE1SIHw9IEJBMF9ETVJfVVNJR047CisJaWYgKHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4ocnVudGltZS0+Zm9ybWF0KSA+IDApCisJCWRtYS0+dmFsRE1SIHw9IEJBMF9ETVJfQkVORDsKKwlzd2l0Y2ggKHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkpIHsKKwljYXNlIDg6IGRtYS0+dmFsRE1SIHw9IEJBMF9ETVJfU0laRTg7CisJCWlmIChydW50aW1lLT5jaGFubmVscyA9PSAxKQorCQkJZG1hLT52YWxETVIgfD0gQkEwX0RNUl9TV0FQQzsKKwkJYnJlYWs7CisJY2FzZSAzMjogZG1hLT52YWxETVIgfD0gQkEwX0RNUl9TSVpFMjA7IGJyZWFrOworCX0KKwlkbWEtPmZyYWcgPSAwOwkvKiBmb3Igd29ya2Fyb3VuZCAqLworCWRtYS0+dmFsRENSID0gQkEwX0RDUl9UQ0lFIHwgQkEwX0RDUl9NU0s7CisJaWYgKHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICE9IHJ1bnRpbWUtPnBlcmlvZF9zaXplKQorCQlkbWEtPnZhbERDUiB8PSBCQTBfRENSX0hUQ0lFOworCS8qIEluaXRpYWxpemUgRE1BICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIGRtYS0+cmVnREJBLCBydW50aW1lLT5kbWFfYWRkcik7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIGRtYS0+cmVnREJDLCBydW50aW1lLT5idWZmZXJfc2l6ZSAtIDEpOworCXJlY19tb25vID0gKGNoaXAtPmRtYVsxXS52YWxETVIgJiBCQTBfRE1SX01PTk8pID09IEJBMF9ETVJfTU9OTzsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX1NSQ1NBLCAoY2hpcC0+c3JjX2xlZnRfcGxheV9zbG90IDw8IDApIHwKKwkJCQkJICAgIChjaGlwLT5zcmNfcmlnaHRfcGxheV9zbG90IDw8IDgpIHwKKwkJCQkJICAgIChjaGlwLT5zcmNfbGVmdF9yZWNfc2xvdCA8PCAxNikgfAorCQkJCQkgICAgKChyZWNfbW9ubyA/IDMxIDogY2hpcC0+c3JjX3JpZ2h0X3JlY19zbG90KSA8PCAyNCkpOworCWlmICghc3JjKQorCQlnb3RvIF9fc2tpcF9zcmM7CisJaWYgKCFjYXB0dXJlKSB7CisJCWlmIChkbWEtPmxlZnRfc2xvdCA9PSBjaGlwLT5zcmNfbGVmdF9wbGF5X3Nsb3QpIHsKKwkJCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfY3M0MjgxX3JhdGUocnVudGltZS0+cmF0ZSwgTlVMTCk7CisJCQlzbmRfYXNzZXJ0KGRtYS0+cmlnaHRfc2xvdCA9PSBjaGlwLT5zcmNfcmlnaHRfcGxheV9zbG90LCApOworCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9EQUNTUiwgdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkbWEtPmxlZnRfc2xvdCA9PSBjaGlwLT5zcmNfbGVmdF9yZWNfc2xvdCkgeworCQkJdW5zaWduZWQgaW50IHZhbCA9IHNuZF9jczQyODFfcmF0ZShydW50aW1lLT5yYXRlLCBOVUxMKTsKKwkJCXNuZF9hc3NlcnQoZG1hLT5yaWdodF9zbG90ID09IGNoaXAtPnNyY19yaWdodF9yZWNfc2xvdCwgKTsKKwkJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQURDU1IsIHZhbCk7CisJCX0KKwl9CisgICAgICBfX3NraXBfc3JjOgorCS8qIERlYWN0aXZhdGUgd2F2ZSBwbGF5YmFjayBGSUZPIGJlZm9yZSBjaGFuZ2luZyBzbG90IGFzc2lnbm1lbnRzICovCisJaWYgKGRtYS0+cmVnRkNSID09IEJBMF9GQ1IwKQorCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgZG1hLT5yZWdGQ1IsIHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBkbWEtPnJlZ0ZDUikgJiB+QkEwX0ZDUl9GRU4pOworCS8qIEluaXRpYWxpemUgRklGTyAqLworCWRtYS0+dmFsRkNSID0gQkEwX0ZDUl9MUyhkbWEtPmxlZnRfc2xvdCkgfAorCQkgICAgICBCQTBfRkNSX1JTKGNhcHR1cmUgJiYgKGRtYS0+dmFsRE1SICYgQkEwX0RNUl9NT05PKSA/IDMxIDogZG1hLT5yaWdodF9zbG90KSB8CisJCSAgICAgIEJBMF9GQ1JfU1ooQ1M0MjgxX0ZJRk9fU0laRSkgfAorCQkgICAgICBCQTBfRkNSX09GKGRtYS0+Zmlmb19vZmZzZXQpOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0ZDUiwgZG1hLT52YWxGQ1IgfCAoY2FwdHVyZSA/IEJBMF9GQ1JfUFNIIDogMCkpOworCS8qIEFjdGl2YXRlIEZJRk8gYWdhaW4gZm9yIEZNIHBsYXliYWNrICovCisJaWYgKGRtYS0+cmVnRkNSID09IEJBMF9GQ1IwKQorCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgZG1hLT5yZWdGQ1IsIGRtYS0+dmFsRkNSIHwgQkEwX0ZDUl9GRU4pOworCS8qIENsZWFyIEZJRk8gU3RhdHVzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0ZTSUMsIDApOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfY3M0MjgxX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWNzNDI4MV9kbWFfdCAqZG1hID0gKGNzNDI4MV9kbWFfdCAqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljczQyODFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlzbmRfY3M0MjgxX21vZGUoY2hpcCwgZG1hLCBydW50aW1lLCAwLCAxKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0MjgxX2NhcHR1cmVfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWNzNDI4MV9kbWFfdCAqZG1hID0gKGNzNDI4MV9kbWFfdCAqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljczQyODFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlzbmRfY3M0MjgxX21vZGUoY2hpcCwgZG1hLCBydW50aW1lLCAxLCAxKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQyODFfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWNzNDI4MV9kbWFfdCAqZG1hID0gKGNzNDI4MV9kbWFfdCAqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljczQyODFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCS8vIHByaW50aygiRENDID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4LCBqaWZmaWVzID0gJWxpXG4iLCBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgZG1hLT5yZWdEQ0MpLCBydW50aW1lLT5idWZmZXJfc2l6ZSwgamlmZmllcyk7CisJcmV0dXJuIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0KKwkgICAgICAgc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIGRtYS0+cmVnRENDKSAtIDE7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2NzNDI4MV9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TOCB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMTZfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMzJfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoNTEyKjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoNTEyKjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkyLAorCS5maWZvX3NpemUgPQkJQ1M0MjgxX0ZJRk9fU0laRSwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2NzNDI4MV9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1M4IHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UzMl9CRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0JFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSg1MTIqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg1MTIqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTIsCisJLmZpZm9fc2l6ZSA9CQlDUzQyODFfRklGT19TSVpFLAorfTsKKworc3RhdGljIGludCBzbmRfY3M0MjgxX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljczQyODFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljczQyODFfZG1hX3QgKmRtYTsKKworCWRtYSA9ICZjaGlwLT5kbWFbMF07CisJZG1hLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJZG1hLT5sZWZ0X3Nsb3QgPSAwOworCWRtYS0+cmlnaHRfc2xvdCA9IDE7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZG1hOworCXJ1bnRpbWUtPmh3ID0gc25kX2NzNDI4MV9wbGF5YmFjazsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJLyogc2hvdWxkIGJlIGRldGVjdGVkIGZyb20gdGhlIEFDJzk3IGxheWVyLCBidXQgaXQgc2VlbXMKKwkgICB0aGF0IGFsdGhvdWdoIENTNDI5N0EgcmV2IEIgcmVwb3J0cyAxOC1iaXQgQURDIHJlc29sdXRpb24sCisJICAgc2FtcGxlcyBhcmUgMjAtYml0ICovCisJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0MjgxX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJY3M0MjgxX2RtYV90ICpkbWE7CisKKwlkbWEgPSAmY2hpcC0+ZG1hWzFdOworCWRtYS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWRtYS0+bGVmdF9zbG90ID0gMTA7CisJZG1hLT5yaWdodF9zbG90ID0gMTE7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZG1hOworCXJ1bnRpbWUtPmh3ID0gc25kX2NzNDI4MV9jYXB0dXJlOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwkvKiBzaG91bGQgYmUgZGV0ZWN0ZWQgZnJvbSB0aGUgQUMnOTcgbGF5ZXIsIGJ1dCBpdCBzZWVtcworCSAgIHRoYXQgYWx0aG91Z2ggQ1M0Mjk3QSByZXYgQiByZXBvcnRzIDE4LWJpdCBBREMgcmVzb2x1dGlvbiwKKwkgICBzYW1wbGVzIGFyZSAyMC1iaXQgKi8KKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9wbGF5YmFja19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDI4MV9kbWFfdCAqZG1hID0gKGNzNDI4MV9kbWFfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hLT5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDI4MV9kbWFfdCAqZG1hID0gKGNzNDI4MV9kbWFfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hLT5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0MjgxX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfY3M0MjgxX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX2NzNDI4MV9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2NzNDI4MV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfY3M0MjgxX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfY3M0MjgxX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfY3M0MjgxX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfY3M0MjgxX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0MjgxX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9jczQyODFfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CXNuZF9jczQyODFfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2NzNDI4MV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfY3M0MjgxX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfY3M0MjgxX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9jczQyODFfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9jczQyODFfcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJY3M0MjgxX3QgKmNoaXAgPSBwY20tPnByaXZhdGVfZGF0YTsKKwljaGlwLT5wY20gPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY3M0MjgxX3BjbShjczQyODFfdCAqIGNoaXAsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJDUzQyODEiLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9jczQyODFfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY3M0MjgxX2NhcHR1cmVfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9jczQyODFfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiQ1M0MjgxIik7CisJY2hpcC0+cGNtID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCA1MTIqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTWl4ZXIgc2VjdGlvbgorICovCisKKyNkZWZpbmUgQ1NfVk9MX01BU0sJMHgxZgorCitzdGF0aWMgaW50IHNuZF9jczQyODFfaW5mb192b2x1bWUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlICAgICAgICAgICAgICA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgICAgICAgICAgICAgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gQ1NfVk9MX01BU0s7CisJcmV0dXJuIDA7Cit9CisgCitzdGF0aWMgaW50IHNuZF9jczQyODFfZ2V0X3ZvbHVtZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDI4MV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWdMID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmZmZjsKKwlpbnQgcmVnUiA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCWludCB2b2xMLCB2b2xSOworCisJdm9sTCA9IENTX1ZPTF9NQVNLIC0gKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCByZWdMKSAmIENTX1ZPTF9NQVNLKTsKKwl2b2xSID0gQ1NfVk9MX01BU0sgLSAoc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIHJlZ1IpICYgQ1NfVk9MX01BU0spOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2xMOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdm9sUjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0MjgxX3B1dF92b2x1bWUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljczQyODFfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlID0gMDsKKwlpbnQgcmVnTCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmZmY7CisJaW50IHJlZ1IgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmZmZjsKKwlpbnQgdm9sTCwgdm9sUjsKKworCXZvbEwgPSBDU19WT0xfTUFTSyAtIChzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgcmVnTCkgJiBDU19WT0xfTUFTSyk7CisJdm9sUiA9IENTX1ZPTF9NQVNLIC0gKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCByZWdSKSAmIENTX1ZPTF9NQVNLKTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSB2b2xMKSB7CisJCXZvbEwgPSBDU19WT0xfTUFTSyAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIENTX1ZPTF9NQVNLKTsKKwkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIHJlZ0wsIHZvbEwpOworCQljaGFuZ2UgPSAxOworCX0KKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gdm9sTCkgeworCQl2b2xSID0gQ1NfVk9MX01BU0sgLSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBDU19WT0xfTUFTSyk7CisJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCByZWdSLCB2b2xSKTsKKwkJY2hhbmdlID0gMTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY3M0MjgxX2ZtX3ZvbCA9IAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIlN5bnRoIFBsYXliYWNrIFZvbHVtZSIsCisJLmluZm8gPSBzbmRfY3M0MjgxX2luZm9fdm9sdW1lLCAKKwkuZ2V0ID0gc25kX2NzNDI4MV9nZXRfdm9sdW1lLAorCS5wdXQgPSBzbmRfY3M0MjgxX3B1dF92b2x1bWUsIAorCS5wcml2YXRlX3ZhbHVlID0gKChCQTBfRk1MVkMgPDwgMTYpIHwgQkEwX0ZNUlZDKSwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2NzNDI4MV9wY21fdm9sID0gCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiUENNIFN0cmVhbSBQbGF5YmFjayBWb2x1bWUiLAorCS5pbmZvID0gc25kX2NzNDI4MV9pbmZvX3ZvbHVtZSwgCisJLmdldCA9IHNuZF9jczQyODFfZ2V0X3ZvbHVtZSwKKwkucHV0ID0gc25kX2NzNDI4MV9wdXRfdm9sdW1lLCAKKwkucHJpdmF0ZV92YWx1ZSA9ICgoQkEwX1BQTFZDIDw8IDE2KSB8IEJBMF9QUFJWQyksCit9OworCitzdGF0aWMgdm9pZCBzbmRfY3M0MjgxX21peGVyX2ZyZWVfYWM5N19idXMoYWM5N19idXNfdCAqYnVzKQoreworCWNzNDI4MV90ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+YWM5N19idXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0MjgxX21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJY3M0MjgxX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaWYgKGFjOTctPm51bSkKKwkJY2hpcC0+YWM5N19zZWNvbmRhcnkgPSBOVUxMOworCWVsc2UKKwkJY2hpcC0+YWM5NyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQyODFfbWl4ZXIoY3M0MjgxX3QgKiBjaGlwKQoreworCXNuZF9jYXJkX3QgKmNhcmQgPSBjaGlwLT5jYXJkOworCWFjOTdfdGVtcGxhdGVfdCBhYzk3OworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX2NzNDI4MV9hYzk3X3dyaXRlLAorCQkucmVhZCA9IHNuZF9jczQyODFfYWM5N19yZWFkLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjYXJkLCAwLCAmb3BzLCBjaGlwLCAmY2hpcC0+YWM5N19idXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJY2hpcC0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9jczQyODFfbWl4ZXJfZnJlZV9hYzk3X2J1czsKKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CisJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0MjgxX21peGVyX2ZyZWVfYWM5NzsKKwlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKGNoaXAtPmFjOTdfYnVzLCAmYWM5NywgJmNoaXAtPmFjOTcpKSA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKGNoaXAtPmR1YWxfY29kZWMpIHsKKwkJYWM5Ny5udW0gPSAxOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKGNoaXAtPmFjOTdfYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdfc2Vjb25kYXJ5KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9jczQyODFfZm1fdm9sLCBjaGlwKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2NzNDI4MV9wY21fdm9sLCBjaGlwKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcHJvYyBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfY3M0MjgxX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwljczQyODFfdCAqY2hpcCA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJDaXJydXMgTG9naWMgQ1M0MjgxXG5cbiIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNwdXJpb3VzIGhhbGYgSVJRcyAgIDogJXVcbiIsIGNoaXAtPnNwdXJpb3VzX2RodGNfaXJxKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTcHVyaW91cyBlbmQgSVJRcyAgICA6ICV1XG4iLCBjaGlwLT5zcHVyaW91c19kdGNfaXJxKTsKK30KKworc3RhdGljIGxvbmcgc25kX2NzNDI4MV9CQTBfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyBwb3MpCit7CisJbG9uZyBzaXplOworCWNzNDI4MV90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwkKKwlzaXplID0gY291bnQ7CisJaWYgKHBvcyArIHNpemUgPiBDUzQyODFfQkEwX1NJWkUpCisJCXNpemUgPSAobG9uZylDUzQyODFfQkEwX1NJWkUgLSBwb3M7CisJaWYgKHNpemUgPiAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXJfZnJvbWlvKGJ1ZiwgY2hpcC0+YmEwICsgcG9zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGxvbmcgc25kX2NzNDI4MV9CQTFfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyBwb3MpCit7CisJbG9uZyBzaXplOworCWNzNDI4MV90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwkKKwlzaXplID0gY291bnQ7CisJaWYgKHBvcyArIHNpemUgPiBDUzQyODFfQkExX1NJWkUpCisJCXNpemUgPSAobG9uZylDUzQyODFfQkExX1NJWkUgLSBwb3M7CisJaWYgKHNpemUgPiAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXJfZnJvbWlvKGJ1ZiwgY2hpcC0+YmExICsgcG9zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgc25kX2NzNDI4MV9wcm9jX29wc19CQTAgPSB7CisJLnJlYWQgPSBzbmRfY3M0MjgxX0JBMF9yZWFkLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgc25kX2NzNDI4MV9wcm9jX29wc19CQTEgPSB7CisJLnJlYWQgPSBzbmRfY3M0MjgxX0JBMV9yZWFkLAorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9jczQyODFfcHJvY19pbml0KGNzNDI4MV90ICogY2hpcCkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJjczQyODEiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHNuZF9jczQyODFfcHJvY19yZWFkKTsKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAiY3M0MjgxX0JBMCIsICZlbnRyeSkpIHsKKwkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCWVudHJ5LT5jLm9wcyA9ICZzbmRfY3M0MjgxX3Byb2Nfb3BzX0JBMDsKKwkJZW50cnktPnNpemUgPSBDUzQyODFfQkEwX1NJWkU7CisJfQorCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJjczQyODFfQkExIiwgJmVudHJ5KSkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwkJZW50cnktPmMub3BzID0gJnNuZF9jczQyODFfcHJvY19vcHNfQkExOworCQllbnRyeS0+c2l6ZSA9IENTNDI4MV9CQTFfU0laRTsKKwl9Cit9CisKKy8qCisgKiBqb3lzdGljayBzdXBwb3J0CisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfZ2FtZXBvcnRfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCWNzNDI4MV90ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CisKKwlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybik7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9KU1BULCAweGZmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX2NzNDI4MV9nYW1lcG9ydF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJY3M0MjgxX3QgKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKKworCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuIDApOworCXJldHVybiBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0pTUFQpOworfQorCisjaWZkZWYgQ09PS0VEX01PREUKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9nYW1lcG9ydF9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgKmF4ZXMsIGludCAqYnV0dG9ucykKK3sKKwljczQyODFfdCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOworCXVuc2lnbmVkIGpzMSwganMyLCBqc3Q7CisJCisJc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisKKwlqczEgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0pTQzEpOworCWpzMiA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfSlNDMik7CisJanN0ID0gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9KU1BUKTsKKwkKKwkqYnV0dG9ucyA9ICh+anN0ID4+IDQpICYgMHgwRjsgCisJCisJYXhlc1swXSA9ICgoanMxICYgSlNDMV9ZMVZfTUFTSykgPj4gSlNDMV9ZMVZfU0hJRlQpICYgMHhGRkZGOworCWF4ZXNbMV0gPSAoKGpzMSAmIEpTQzFfWDFWX01BU0spID4+IEpTQzFfWDFWX1NISUZUKSAmIDB4RkZGRjsKKwlheGVzWzJdID0gKChqczIgJiBKU0MyX1kyVl9NQVNLKSA+PiBKU0MyX1kyVl9TSElGVCkgJiAweEZGRkY7CisJYXhlc1szXSA9ICgoanMyICYgSlNDMl9YMlZfTUFTSykgPj4gSlNDMl9YMlZfU0hJRlQpICYgMHhGRkZGOworCisJZm9yIChqc3QgPSAwOyBqc3QgPCA0OyArK2pzdCkKKwkJaWYgKGF4ZXNbanN0XSA9PSAweEZGRkYpIGF4ZXNbanN0XSA9IC0xOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgc25kX2NzNDI4MV9nYW1lcG9ydF9jb29rZWRfcmVhZAlOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBzbmRfY3M0MjgxX2dhbWVwb3J0X29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisjaWZkZWYgQ09PS0VEX01PREUKKwljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQyODFfY3JlYXRlX2dhbWVwb3J0KGNzNDI4MV90ICpjaGlwKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQyODE6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJDUzQyODEgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmY2hpcC0+cGNpLT5kZXYpOworCWdwLT5vcGVuID0gc25kX2NzNDI4MV9nYW1lcG9ydF9vcGVuOworCWdwLT5yZWFkID0gc25kX2NzNDI4MV9nYW1lcG9ydF9yZWFkOworCWdwLT50cmlnZ2VyID0gc25kX2NzNDI4MV9nYW1lcG9ydF90cmlnZ2VyOworCWdwLT5jb29rZWRfcmVhZCA9IHNuZF9jczQyODFfZ2FtZXBvcnRfY29va2VkX3JlYWQ7CisJZ2FtZXBvcnRfc2V0X3BvcnRfZGF0YShncCwgY2hpcCk7CisKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0pTSU8sIDB4RkYpOyAvLyA/CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9KU0NUTCwgSlNDVExfU1BfTUVESVVNX1NMT1cpOworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2NzNDI4MV9mcmVlX2dhbWVwb3J0KGNzNDI4MV90ICpjaGlwKQoreworCWlmIChjaGlwLT5nYW1lcG9ydCkgeworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoY2hpcC0+Z2FtZXBvcnQpOworCQljaGlwLT5nYW1lcG9ydCA9IE5VTEw7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9jczQyODFfY3JlYXRlX2dhbWVwb3J0KGNzNDI4MV90ICpjaGlwKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2NzNDI4MV9mcmVlX2dhbWVwb3J0KGNzNDI4MV90ICpjaGlwKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfR0FNRVBPUlQgfHwgKE1PRFVMRSAmJiBDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSAqLworCisKKy8qCisKKyAqLworCitzdGF0aWMgaW50IHNuZF9jczQyODFfZnJlZShjczQyODFfdCAqY2hpcCkKK3sKKwlzbmRfY3M0MjgxX2ZyZWVfZ2FtZXBvcnQoY2hpcCk7CisKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJLyogTWFzayBpbnRlcnJ1cHRzICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9ISU1SLCAweDdmZmZmZmZmKTsKKwkvKiBTdG9wIHRoZSBETEwgQ2xvY2sgbG9naWMuICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIDApOworCS8qIFNvdW5kIFN5c3RlbSBQb3dlciBNYW5hZ2VtZW50IC0gVHVybiBFdmVyeXRoaW5nIE9GRiAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfU1NQTSwgMCk7CisJLyogUENJIGludGVyZmFjZSAtIEQzIHN0YXRlICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShjaGlwLT5wY2ksIDMpOworCisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJaWYgKGNoaXAtPmJhMCkKKwkJaW91bm1hcChjaGlwLT5iYTApOworCWlmIChjaGlwLT5iYTEpCisJCWlvdW5tYXAoY2hpcC0+YmExKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0MjgxX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWNzNDI4MV90ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX2NzNDI4MV9mcmVlKGNoaXApOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfY2hpcF9pbml0KGNzNDI4MV90ICpjaGlwKTsgLyogZGVmaW5lZCBiZWxvdyAqLworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjczQyODFfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBjczQyODFfcmVzdW1lKHNuZF9jYXJkX3QgKmNhcmQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQyODFfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgICBjczQyODFfdCAqKiByY2hpcCwKKwkJCQkgICAgICAgaW50IGR1YWxfY29kZWMpCit7CisJY3M0MjgxX3QgKmNoaXA7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgZXJyOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX2NzNDI4MV9kZXZfZnJlZSwKKwl9OworCisJKnJjaGlwID0gTlVMTDsKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+aXJxID0gLTE7CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwlpZiAoZHVhbF9jb2RlYyA8IDAgfHwgZHVhbF9jb2RlYyA+IDMpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBkdWFsX2NvZGVjIG9wdGlvbiAlZFxuIiwgZHVhbF9jb2RlYyk7CisJCWR1YWxfY29kZWMgPSAwOworCX0KKwljaGlwLT5kdWFsX2NvZGVjID0gZHVhbF9jb2RlYzsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJDUzQyODEiKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+YmEwX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwljaGlwLT5iYTFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M0MjgxX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiQ1M0MjgxIiwgKHZvaWQgKiljaGlwKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2NzNDI4MV9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisKKwljaGlwLT5iYTAgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YmEwX2FkZHIsIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKSk7CisJY2hpcC0+YmExID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJhMV9hZGRyLCBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMSkpOworCWlmICghY2hpcC0+YmEwIHx8ICFjaGlwLT5iYTEpIHsKKwkJc25kX2NzNDI4MV9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJdG1wID0gc25kX2NzNDI4MV9jaGlwX2luaXQoY2hpcCk7CisJaWYgKHRtcCkgeworCQlzbmRfY3M0MjgxX2ZyZWUoY2hpcCk7CisJCXJldHVybiB0bXA7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2NzNDI4MV9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jczQyODFfcHJvY19pbml0KGNoaXApOworCisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIGNzNDI4MV9zdXNwZW5kLCBjczQyODFfcmVzdW1lLCBjaGlwKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyY2hpcCA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9jaGlwX2luaXQoY3M0MjgxX3QgKmNoaXApCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgdGltZW91dDsKKwlpbnQgcmV0cnlfY291bnQgPSAyOworCisgICAgICBfX3JldHJ5OgorCXRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0ZMUik7CisJaWYgKHRtcCAhPSBCQTBfQ0ZMUl9ERUZBVUxUKSB7CisJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ0ZMUiwgQkEwX0NGTFJfREVGQVVMVCk7CisJCXRtcCA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0ZMUik7CisJCWlmICh0bXAgIT0gQkEwX0NGTFJfREVGQVVMVCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ0ZMUiBzZXR1cCBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlICdDb25maWd1cmF0aW9uIFdyaXRlIFByb3RlY3QnIHJlZ2lzdGVyCisJICogdG8gNDI4MWguICBBbGxvd3MgdmVuZG9yLWRlZmluZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBzcGFjZSBiZXR3ZWVuIDBlNGggYW5kIDBmZmggdG8gYmUgd3JpdHRlbi4gKi8JCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9DV1BSLCAweDQyODEpOworCQorCWlmICgodG1wID0gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9TRVJDMSkpICE9IChCQTBfU0VSQzFfU08xRU4gfCBCQTBfU0VSQzFfQUM5NykpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiU0VSQzEgQUMnOTcgY2hlY2sgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgodG1wID0gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9TRVJDMikpICE9IChCQTBfU0VSQzJfU0kxRU4gfCBCQTBfU0VSQzJfQUM5NykpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiU0VSQzIgQUMnOTcgY2hlY2sgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU291bmQgU3lzdGVtIFBvd2VyIE1hbmFnZW1lbnQgKi8KKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX1NTUE0sIEJBMF9TU1BNX01JWEVOIHwgQkEwX1NTUE1fQ1NSQ0VOIHwKKwkJCQkgICAgICAgICAgIEJBMF9TU1BNX1BTUkNFTiB8IEJBMF9TU1BNX0pTRU4gfAorCQkJCSAgICAgICAgICAgQkEwX1NTUE1fQUNMRU4gfCBCQTBfU1NQTV9GTUVOKTsKKworCS8qIFNlcmlhbCBQb3J0IFBvd2VyIE1hbmFnZW1lbnQgKi8KKyAJLyogQmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZQorICAgICAgICAgKiBQTEwgc3RhcnRzIG91dCBpbiBhIGtub3duIHN0YXRlLCBhbmQgYmxhc3QgdGhlIG1hc3RlciBzZXJpYWwKKyAgICAgICAgICogcG9ydCBjb250cm9sIHJlZ2lzdGVyIHRvIHplcm8gc28gdGhhdCB0aGUgc2VyaWFsIHBvcnRzIGFsc28KKyAgICAgICAgICogc3RhcnQgb3V0IGluIGEga25vd24gc3RhdGUuICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIDApOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfU0VSTUMsIDApOworCisgICAgICAgIC8qIE1ha2UgRVNZTiBnbyB0byB6ZXJvIHRvIHR1cm4gb2ZmCisgICAgICAgICAqIHRoZSBTeW5jIHB1bHNlIG9uIHRoZSBBQzk3IGxpbmsuICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTCwgMCk7CisJdWRlbGF5KDUwKTsKKyAgICAgICAgICAgICAgICAKKwkvKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKKwkgKiAgc3BlYykgYW5kIHRoZW4gZHJpdmUgaXQgaGlnaC4gIFRoaXMgaXMgZG9uZSBmb3Igbm9uIEFDOTcgbW9kZXMgc2luY2UKKwkgKiAgdGhlcmUgbWlnaHQgYmUgbG9naWMgZXh0ZXJuYWwgdG8gdGhlIENTNDI4MSB0aGF0IHVzZXMgdGhlIEFSU1QjIGxpbmUKKwkgKiAgZm9yIGEgcmVzZXQuICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9TUE1DLCAwKTsKKwl1ZGVsYXkoNTApOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfU1BNQywgQkEwX1NQTUNfUlNUTik7CisJc25kX2NzNDI4MV9kZWxheSg1MDAwMCk7CisKKwlpZiAoY2hpcC0+ZHVhbF9jb2RlYykKKwkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9TUE1DLCBCQTBfU1BNQ19SU1ROIHwgQkEwX1NQTUNfQVNESTJFKTsKKworCS8qCisJICogIFNldCB0aGUgc2VyaWFsIHBvcnQgdGltaW5nIGNvbmZpZ3VyYXRpb24uCisJICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9TRVJNQywKKwkJCSAgIChjaGlwLT5kdWFsX2NvZGVjID8gQkEwX1NFUk1DX1RDSUQoY2hpcC0+ZHVhbF9jb2RlYykgOiBCQTBfU0VSTUNfVENJRCgxKSkgfAorCQkJICAgQkEwX1NFUk1DX1BUQ19BQzk3IHwgQkEwX1NFUk1DX01TUEUpOworCisJLyoKKwkgKiAgU3RhcnQgdGhlIERMTCBDbG9jayBsb2dpYy4KKwkgKi8KKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgQkEwX0NMS0NSMV9ETExQKTsKKwlzbmRfY3M0MjgxX2RlbGF5KDUwMDAwKTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgQkEwX0NMS0NSMV9TV0NFIHwgQkEwX0NMS0NSMV9ETExQKTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIERMTCByZWFkeSBzaWduYWwgZnJvbSB0aGUgY2xvY2sgbG9naWMuCisJICovCisJdGltZW91dCA9IEhaOworCWRvIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIGEgQ09ERUMKKwkJICogIHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNvZGVjLgorCQkgKi8KKwkJaWYgKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0xLQ1IxKSAmIEJBMF9DTEtDUjFfRExMUkRZKQorCQkJZ290byBfX29rMDsKKwkJc25kX2NzNDI4MV9kZWxheV9sb25nKCk7CisJfSB3aGlsZSAodGltZW91dC0tID4gMCk7CisKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJETExSRFkgbm90IHNlZW5cbiIpOworCXJldHVybiAtRUlPOworCisgICAgICBfX29rMDoKKworCS8qCisJICogIFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBoZXJlIGlzIHRvIGVuYWJsZSBzeW5jIGdlbmVyYXRpb24uICBBcyBzb29uCisJICogIGFzIHdlIHN0YXJ0IHJlY2VpdmluZyBiaXQgY2xvY2ssIHdlJ2xsIHN0YXJ0IHByb2R1Y2luZyB0aGUgU1lOQworCSAqICBzaWduYWwuCisJICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTCwgQkEwX0FDQ1RMX0VTWU4pOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgY29kZWMgcmVhZHkgc2lnbmFsIGZyb20gdGhlIEFDOTcgY29kZWMuCisJICovCisJdGltZW91dCA9IEhaOworCWRvIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIGEgQ09ERUMKKwkJICogIHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNvZGVjLgorCQkgKi8KKwkJaWYgKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMpICYgQkEwX0FDU1RTX0NSRFkpCisJCQlnb3RvIF9fb2sxOworCQlzbmRfY3M0MjgxX2RlbGF5X2xvbmcoKTsKKwl9IHdoaWxlICh0aW1lb3V0LS0gPiAwKTsKKworCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldmVyIHJlYWQgY29kZWMgcmVhZHkgZnJvbSBBQyc5NyAoMHgleClcbiIsIHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMpKTsKKwlyZXR1cm4gLUVJTzsKKworICAgICAgX19vazE6CisJaWYgKGNoaXAtPmR1YWxfY29kZWMpIHsKKwkJdGltZW91dCA9IEhaOworCQlkbyB7CisJCQlpZiAoc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUzIpICYgQkEwX0FDU1RTX0NSRFkpCisJCQkJZ290byBfX2NvZGVjMl9vazsKKwkJCXNuZF9jczQyODFfZGVsYXlfbG9uZygpOworCQl9IHdoaWxlICh0aW1lb3V0LS0gPiAwKTsKKwkJc25kX3ByaW50ayhLRVJOX0lORk8gInNlY29uZGFyeSBjb2RlYyBkb2Vzbid0IHJlc3BvbmQuIGRpc2FibGUgaXQuLi5cbiIpOworCQljaGlwLT5kdWFsX2NvZGVjID0gMDsKKwlfX2NvZGVjMl9vazogOworCX0KKworCS8qCisJICogIEFzc2VydCB0aGUgdmFsaWQgZnJhbWUgc2lnbmFsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMKKwkgKiAgdG8gdGhlIEFDOTcgY29kZWMuCisJICovCisKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLCBCQTBfQUNDVExfVkZSTSB8IEJBMF9BQ0NUTF9FU1lOKTsKKworCS8qCisJICogIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzIGFuZCA0IGFzIHZhbGlkLCBtZWFuaW5nIHRoYXQKKwkgKiAgdGhlIGNvZGVjIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQy1saW5rLgorCSAqLworCisJdGltZW91dCA9IEhaOworCWRvIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIGlucHV0IHNsb3QgdmFsaWQgcmVnaXN0ZXIgYW5kIHNlZSBpZiBpbnB1dCBzbG90cyAzCisJCSAqICA0IGFyZSB2YWxpZCB5ZXQuCisJCSAqLworICAgICAgICAgICAgICAgIGlmICgoc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9BQ0lTVikgJiAoQkEwX0FDSVNWX1NMVigzKSB8IEJBMF9BQ0lTVl9TTFYoNCkpKSA9PSAoQkEwX0FDSVNWX1NMVigzKSB8IEJBMF9BQ0lTVl9TTFYoNCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBfX29rMjsKKwkJc25kX2NzNDI4MV9kZWxheV9sb25nKCk7CisJfSB3aGlsZSAodGltZW91dC0tID4gMCk7CisKKwlpZiAoLS1yZXRyeV9jb3VudCA+IDApCisJCWdvdG8gX19yZXRyeTsKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJuZXZlciByZWFkIElTVjMgYW5kIElTVjQgZnJvbSBBQyc5N1xuIik7CisJcmV0dXJuIC1FSU87CisKKyAgICAgIF9fb2syOgorCisJLyoKKwkgKiAgTm93LCBhc3NlcnQgdmFsaWQgZnJhbWUgYW5kIHRoZSBzbG90IDMgYW5kIDQgdmFsaWQgYml0cy4gIFRoaXMgd2lsbAorCSAqICBjb21tZW5zZSB0aGUgdHJhbnNmZXIgb2YgZGlnaXRhbCBhdWRpbyBkYXRhIHRvIHRoZSBBQzk3IGNvZGVjLgorCSAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQUNPU1YsIEJBMF9BQ09TVl9TTFYoMykgfCBCQTBfQUNPU1ZfU0xWKDQpKTsKKworCS8qCisJICogIEluaXRpYWxpemUgRE1BIHN0cnVjdHVyZXMKKwkgKi8KKwlmb3IgKHRtcCA9IDA7IHRtcCA8IDQ7IHRtcCsrKSB7CisJCWNzNDI4MV9kbWFfdCAqZG1hID0gJmNoaXAtPmRtYVt0bXBdOworCQlkbWEtPnJlZ0RCQSA9IEJBMF9EQkEwICsgKHRtcCAqIDB4MTApOworCQlkbWEtPnJlZ0RDQSA9IEJBMF9EQ0EwICsgKHRtcCAqIDB4MTApOworCQlkbWEtPnJlZ0RCQyA9IEJBMF9EQkMwICsgKHRtcCAqIDB4MTApOworCQlkbWEtPnJlZ0RDQyA9IEJBMF9EQ0MwICsgKHRtcCAqIDB4MTApOworCQlkbWEtPnJlZ0RNUiA9IEJBMF9ETVIwICsgKHRtcCAqIDgpOworCQlkbWEtPnJlZ0RDUiA9IEJBMF9EQ1IwICsgKHRtcCAqIDgpOworCQlkbWEtPnJlZ0hEU1IgPSBCQTBfSERTUjAgKyAodG1wICogNCk7CisJCWRtYS0+cmVnRkNSID0gQkEwX0ZDUjAgKyAodG1wICogNCk7CisJCWRtYS0+cmVnRlNJQyA9IEJBMF9GU0lDMCArICh0bXAgKiA0KTsKKwkJZG1hLT5maWZvX29mZnNldCA9IHRtcCAqIENTNDI4MV9GSUZPX1NJWkU7CisJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBkbWEtPnJlZ0ZDUiwKKwkJCQkgICBCQTBfRkNSX0xTKDMxKSB8CisJCQkJICAgQkEwX0ZDUl9SUygzMSkgfAorCQkJCSAgIEJBMF9GQ1JfU1ooQ1M0MjgxX0ZJRk9fU0laRSkgfAorCQkJCSAgIEJBMF9GQ1JfT0YoZG1hLT5maWZvX29mZnNldCkpOworCX0KKworCWNoaXAtPnNyY19sZWZ0X3BsYXlfc2xvdCA9IDA7CS8qIEFDJzk3IGxlZnQgUENNIHBsYXliYWNrICgzKSAqLworCWNoaXAtPnNyY19yaWdodF9wbGF5X3Nsb3QgPSAxOwkvKiBBQyc5NyByaWdodCBQQ00gcGxheWJhY2sgKDQpICovCisJY2hpcC0+c3JjX2xlZnRfcmVjX3Nsb3QgPSAxMDsJLyogQUMnOTcgbGVmdCBQQ00gcmVjb3JkICgzKSAqLworCWNoaXAtPnNyY19yaWdodF9yZWNfc2xvdCA9IDExOwkvKiBBQyc5NyByaWdodCBQQ00gcmVjb3JkICg0KSAqLworCisJLyogQWN0aXZhdGUgd2F2ZSBwbGF5YmFjayBGSUZPIGZvciBGTSBwbGF5YmFjayAqLworCWNoaXAtPmRtYVswXS52YWxGQ1IgPSBCQTBfRkNSX0ZFTiB8IEJBMF9GQ1JfTFMoMCkgfAorCQkgICAgICAgICAgICAgIEJBMF9GQ1JfUlMoMSkgfAorIAkgIAkgICAgICAgICAgICAgIEJBMF9GQ1JfU1ooQ1M0MjgxX0ZJRk9fU0laRSkgfAorCQkgICAgICAgICAgICAgIEJBMF9GQ1JfT0YoY2hpcC0+ZG1hWzBdLmZpZm9fb2Zmc2V0KTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgY2hpcC0+ZG1hWzBdLnJlZ0ZDUiwgY2hpcC0+ZG1hWzBdLnZhbEZDUik7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9TUkNTQSwgKGNoaXAtPnNyY19sZWZ0X3BsYXlfc2xvdCA8PCAwKSB8CisJCQkJCSAgICAoY2hpcC0+c3JjX3JpZ2h0X3BsYXlfc2xvdCA8PCA4KSB8CisJCQkJCSAgICAoY2hpcC0+c3JjX2xlZnRfcmVjX3Nsb3QgPDwgMTYpIHwKKwkJCQkJICAgIChjaGlwLT5zcmNfcmlnaHRfcmVjX3Nsb3QgPDwgMjQpKTsKKworCS8qIEluaXRpYWxpemUgZGlnaXRhbCB2b2x1bWUgKi8KKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX1BQTFZDLCAwKTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX1BQUlZDLCAwKTsKKworCS8qIEVuYWJsZSBJUlFzICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9ISUNSLCBCQTBfSElDUl9FT0kpOworCS8qIFVubWFzayBpbnRlcnJ1cHRzICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9ISU1SLCAweDdmZmZmZmZmICYgfigKKwkJCQkJQkEwX0hJU1JfTUlESSB8CisJCQkJCUJBMF9ISVNSX0RNQUkgfAorCQkJCQlCQTBfSElTUl9ETUEoMCkgfAorCQkJCQlCQTBfSElTUl9ETUEoMSkgfAorCQkJCQlCQTBfSElTUl9ETUEoMikgfAorCQkJCQlCQTBfSElTUl9ETUEoMykpKTsKKwlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIE1JREkgc2VjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfbWlkaV9yZXNldChjczQyODFfdCAqY2hpcCkKK3sKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjciB8IEJBMF9NSURDUl9NUlNUKTsKKwl1ZGVsYXkoMTAwKTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9taWRpX2lucHV0X29wZW4oc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0MjgxX3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisgCWNoaXAtPm1pZGNyIHw9IEJBMF9NSURDUl9SWEU7CisJY2hpcC0+bWlkaV9pbnB1dCA9IHN1YnN0cmVhbTsKKwlpZiAoIShjaGlwLT51YXJ0bSAmIENTNDI4MV9NT0RFX09VVFBVVCkpIHsKKwkJc25kX2NzNDI4MV9taWRpX3Jlc2V0KGNoaXApOworCX0gZWxzZSB7CisJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfTUlEQ1IsIGNoaXAtPm1pZGNyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9taWRpX2lucHV0X2Nsb3NlKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDI4MV90ICpjaGlwID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPm1pZGNyICY9IH4oQkEwX01JRENSX1JYRSB8IEJBMF9NSURDUl9SSUUpOworCWNoaXAtPm1pZGlfaW5wdXQgPSBOVUxMOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0MjgxX01PREVfT1VUUFVUKSkgeworCQlzbmRfY3M0MjgxX21pZGlfcmVzZXQoY2hpcCk7CisJfSBlbHNlIHsKKwkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCX0KKwljaGlwLT51YXJ0bSAmPSB+Q1M0MjgxX01PREVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDI4MV9taWRpX291dHB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDI4MV90ICpjaGlwID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPnVhcnRtIHw9IENTNDI4MV9NT0RFX09VVFBVVDsKKwljaGlwLT5taWRjciB8PSBCQTBfTUlEQ1JfVFhFOworCWNoaXAtPm1pZGlfb3V0cHV0ID0gc3Vic3RyZWFtOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0MjgxX01PREVfSU5QVVQpKSB7CisJCXNuZF9jczQyODFfbWlkaV9yZXNldChjaGlwKTsKKwl9IGVsc2UgeworCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQyODFfbWlkaV9vdXRwdXRfY2xvc2Uoc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0MjgxX3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+bWlkY3IgJj0gfihCQTBfTUlEQ1JfVFhFIHwgQkEwX01JRENSX1RJRSk7CisJY2hpcC0+bWlkaV9vdXRwdXQgPSBOVUxMOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0MjgxX01PREVfSU5QVVQpKSB7CisJCXNuZF9jczQyODFfbWlkaV9yZXNldChjaGlwKTsKKwl9IGVsc2UgeworCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7CisJfQorCWNoaXAtPnVhcnRtICY9IH5DUzQyODFfTU9ERV9PVVRQVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfbWlkaV9pbnB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljczQyODFfdCAqY2hpcCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICh1cCkgeworCQlpZiAoKGNoaXAtPm1pZGNyICYgQkEwX01JRENSX1JJRSkgPT0gMCkgeworCQkJY2hpcC0+bWlkY3IgfD0gQkEwX01JRENSX1JJRTsKKwkJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfTUlEQ1IsIGNoaXAtPm1pZGNyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjaGlwLT5taWRjciAmIEJBMF9NSURDUl9SSUUpIHsKKwkJCWNoaXAtPm1pZGNyICY9IH5CQTBfTUlEQ1JfUklFOworCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jczQyODFfbWlkaV9vdXRwdXRfdHJpZ2dlcihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IHVwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY3M0MjgxX3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHVwKSB7CisJCWlmICgoY2hpcC0+bWlkY3IgJiBCQTBfTUlEQ1JfVElFKSA9PSAwKSB7CisJCQljaGlwLT5taWRjciB8PSBCQTBfTUlEQ1JfVElFOworCQkJLyogZmlsbCBVQVJUIEZJRk8gYnVmZmVyIGF0IGZpcnN0LCBhbmQgdHVybiBUeCBpbnRlcnJ1cHRzIG9ubHkgaWYgbmVjZXNzYXJ5ICovCisJCQl3aGlsZSAoKGNoaXAtPm1pZGNyICYgQkEwX01JRENSX1RJRSkgJiYKKwkJCSAgICAgICAoc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9NSURTUikgJiBCQTBfTUlEU1JfVEJGKSA9PSAwKSB7CisJCQkJaWYgKHNuZF9yYXdtaWRpX3RyYW5zbWl0KHN1YnN0cmVhbSwgJmJ5dGUsIDEpICE9IDEpIHsKKwkJCQkJY2hpcC0+bWlkY3IgJj0gfkJBMF9NSURDUl9USUU7CisJCQkJfSBlbHNlIHsKKwkJCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURXUCwgYnl0ZSk7CisJCQkJfQorCQkJfQorCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAtPm1pZGNyICYgQkEwX01JRENSX1RJRSkgeworCQkJY2hpcC0+bWlkY3IgJj0gfkJBMF9NSURDUl9USUU7CisJCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9jczQyODFfbWlkaV9vdXRwdXQgPQoreworCS5vcGVuID0JCXNuZF9jczQyODFfbWlkaV9vdXRwdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfY3M0MjgxX21pZGlfb3V0cHV0X2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX2NzNDI4MV9taWRpX291dHB1dF90cmlnZ2VyLAorfTsKKworc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9jczQyODFfbWlkaV9pbnB1dCA9Cit7CisJLm9wZW4gPSAJc25kX2NzNDI4MV9taWRpX2lucHV0X29wZW4sCisJLmNsb3NlID0Jc25kX2NzNDI4MV9taWRpX2lucHV0X2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX2NzNDI4MV9taWRpX2lucHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY3M0MjgxX21pZGkoY3M0MjgxX3QgKiBjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcmF3bWlkaV90ICoqcnJhd21pZGkpCit7CisJc25kX3Jhd21pZGlfdCAqcm1pZGk7CisJaW50IGVycjsKKworCWlmIChycmF3bWlkaSkKKwkJKnJyYXdtaWRpID0gTlVMTDsKKwlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyhjaGlwLT5jYXJkLCAiQ1M0MjgxIiwgZGV2aWNlLCAxLCAxLCAmcm1pZGkpKSA8IDApCisJCXJldHVybiBlcnI7CisJc3RyY3B5KHJtaWRpLT5uYW1lLCAiQ1M0MjgxIik7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX2NzNDI4MV9taWRpX291dHB1dCk7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZzbmRfY3M0MjgxX21pZGlfaW5wdXQpOworCXJtaWRpLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfCBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfCBTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOworCXJtaWRpLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCWNoaXAtPnJtaWRpID0gcm1pZGk7CisJaWYgKHJyYXdtaWRpKQorCQkqcnJhd21pZGkgPSBybWlkaTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBJbnRlcnJ1cHQgaGFuZGxlcgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfY3M0MjgxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNzNDI4MV90ICpjaGlwID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIGRtYSwgdmFsOworCWNzNDI4MV9kbWFfdCAqY2RtYTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiBJUlFfTk9ORTsKKwlzdGF0dXMgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0hJU1IpOworCWlmICgoc3RhdHVzICYgMHg3ZmZmZmZmZikgPT0gMCkgeworCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0hJQ1IsIEJBMF9ISUNSX0VPSSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoc3RhdHVzICYgKEJBMF9ISVNSX0RNQSgwKXxCQTBfSElTUl9ETUEoMSl8QkEwX0hJU1JfRE1BKDIpfEJBMF9ISVNSX0RNQSgzKSkpIHsKKwkJZm9yIChkbWEgPSAwOyBkbWEgPCA0OyBkbWErKykKKwkJCWlmIChzdGF0dXMgJiBCQTBfSElTUl9ETUEoZG1hKSkgeworCQkJCWNkbWEgPSAmY2hpcC0+ZG1hW2RtYV07CisJCQkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQkJLyogYWNrIERNQSBJUlEgKi8KKwkJCQl2YWwgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgY2RtYS0+cmVnSERTUik7CisJCQkJLyogd29ya2Fyb3VuZCwgc29tZXRpbWVzIENTNDI4MSBhY2tub3dsZWRnZXMgKi8KKwkJCQkvKiBlbmQgb3IgbWlkZGxlIHRyYW5zZmVyIHBvc2l0aW9uIHR3aWNlICovCisJCQkJY2RtYS0+ZnJhZysrOworCQkJCWlmICgodmFsICYgQkEwX0hEU1JfREhUQykgJiYgIShjZG1hLT5mcmFnICYgMSkpIHsKKwkJCQkJY2RtYS0+ZnJhZy0tOworCQkJCQljaGlwLT5zcHVyaW91c19kaHRjX2lycSsrOworCQkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCh2YWwgJiBCQTBfSERTUl9EVEMpICYmIChjZG1hLT5mcmFnICYgMSkpIHsKKwkJCQkJY2RtYS0+ZnJhZy0tOworCQkJCQljaGlwLT5zcHVyaW91c19kdGNfaXJxKys7CisJCQkJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2RtYS0+c3Vic3RyZWFtKTsKKwkJCX0KKwl9CisKKwlpZiAoKHN0YXR1cyAmIEJBMF9ISVNSX01JREkpICYmIGNoaXAtPnJtaWRpKSB7CisJCXVuc2lnbmVkIGNoYXIgYzsKKwkJCisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQl3aGlsZSAoKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfTUlEU1IpICYgQkEwX01JRFNSX1JCRSkgPT0gMCkgeworCQkJYyA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfTUlEUlApOworCQkJaWYgKChjaGlwLT5taWRjciAmIEJBMF9NSURDUl9SSUUpID09IDApCisJCQkJY29udGludWU7CisJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKGNoaXAtPm1pZGlfaW5wdXQsICZjLCAxKTsKKwkJfQorCQl3aGlsZSAoKHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfTUlEU1IpICYgQkEwX01JRFNSX1RCRikgPT0gMCkgeworCQkJaWYgKChjaGlwLT5taWRjciAmIEJBMF9NSURDUl9USUUpID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXQoY2hpcC0+bWlkaV9vdXRwdXQsICZjLCAxKSAhPSAxKSB7CisJCQkJY2hpcC0+bWlkY3IgJj0gfkJBMF9NSURDUl9USUU7CisJCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCQkJCWJyZWFrOworCQkJfQorCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9NSURXUCwgYyk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwl9CisKKwkvKiBFT0kgdG8gdGhlIFBDSSBwYXJ0Li4uIHJlZW5hYmxlcyBpbnRlcnJ1cHRzICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9ISUNSLCBCQTBfSElDUl9FT0kpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qCisgKiBPUEwzIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQgc25kX2NzNDI4MV9vcGwzX2NvbW1hbmQob3BsM190ICogb3BsMywgdW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNzNDI4MV90ICpjaGlwID0gb3BsMy0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbSAqcG9ydDsKKworCWlmIChjbWQgJiBPUEwzX1JJR0hUKQorCQlwb3J0ID0gY2hpcC0+YmEwICsgQkEwX0IxQVA7IC8qIHJpZ2h0IHBvcnQgKi8KKwllbHNlCisJCXBvcnQgPSBjaGlwLT5iYTAgKyBCQTBfQjBBUDsgLyogbGVmdCBwb3J0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3BsMy0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXdyaXRlbCgodW5zaWduZWQgaW50KWNtZCwgcG9ydCk7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlbCgodW5zaWduZWQgaW50KXZhbCwgcG9ydCArIDQpOworCXVkZWxheSgzMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGwzLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY3M0MjgxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWNzNDI4MV90ICpjaGlwOworCW9wbDNfdCAqb3BsMzsKKwlpbnQgZXJyOworCisgICAgICAgIGlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGVyciA9IHNuZF9jczQyODFfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXAsIGR1YWxfY29kZWNbZGV2XSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2NzNDI4MV9taXhlcihjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX2NzNDI4MV9wY20oY2hpcCwgMCwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9jczQyODFfbWlkaShjaGlwLCAwLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX29wbDNfbmV3KGNhcmQsIE9QTDNfSFdfT1BMM19DUzQyODEsICZvcGwzKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCW9wbDMtPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJb3BsMy0+Y29tbWFuZCA9IHNuZF9jczQyODFfb3BsM19jb21tYW5kOworCXNuZF9vcGwzX2luaXQob3BsMyk7CisJaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMSwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfY3M0MjgxX2NyZWF0ZV9nYW1lcG9ydChjaGlwKTsKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQ1M0MjgxIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkNpcnJ1cyBMb2dpYyBDUzQyODEiKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlZCIsCisJCWNhcmQtPnNob3J0bmFtZSwKKwkJY2hpcC0+YmEwX2FkZHIsCisJCWNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9jczQyODFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKKy8qCisgKiBQb3dlciBNYW5hZ2VtZW50CisgKi8KKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBzYXZlZF9yZWdzW1NVU1BFTkRfUkVHSVNURVJTXSA9IHsKKwlCQTBfSlNDVEwsCisJQkEwX0dQSU9SLAorCUJBMF9TU0NSLAorCUJBMF9NSURDUiwKKwlCQTBfU1JDU0EsCisJQkEwX1BBU1IsCisJQkEwX0NBU1IsCisJQkEwX0RBQ1NSLAorCUJBMF9BRENTUiwKKwlCQTBfRk1MVkMsCisJQkEwX0ZNUlZDLAorCUJBMF9QUExWQywKKwlCQTBfUFBSVkMsCit9OworCisjZGVmaW5lIENMS0NSMV9DS1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorCitzdGF0aWMgaW50IGNzNDI4MV9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwljczQyODFfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwl1MzIgdWxDTEs7CisJdW5zaWduZWQgaW50IGk7CisKKwlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CisKKwlpZiAoY2hpcC0+YWM5NykKKwkJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKwlpZiAoY2hpcC0+YWM5N19zZWNvbmRhcnkpCisJCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5N19zZWNvbmRhcnkpOworCisJdWxDTEsgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0NMS0NSMSk7CisJdWxDTEsgfD0gQ0xLQ1IxX0NLUkE7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIHVsQ0xLKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0hJQ1IsIEJBMF9ISUNSX0NIR00pOworCisJLyogcmVtZW1iZXIgdGhlIHN0YXR1cyByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYXZlZF9yZWdzKTsgaSsrKQorCQlpZiAoc2F2ZWRfcmVnc1tpXSkKKwkJCWNoaXAtPnN1c3BlbmRfcmVnc1tpXSA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBzYXZlZF9yZWdzW2ldKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBzZXJpYWwgcG9ydHMuICovCisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9TRVJNQywgMCk7CisKKwkvKiBQb3dlciBvZmYgRk0sIEpveXN0aWNrLCBBQyBsaW5rLCAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfU1NQTSwgMCk7CisKKwkvKiBETEwgb2ZmLiAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ0xLQ1IxLCAwKTsKKworCS8qIEFDIGxpbmsgb2ZmLiAqLworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfU1BNQywgMCk7CisKKwl1bENMSyA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0xLQ1IxKTsKKwl1bENMSyAmPSB+Q0xLQ1IxX0NLUkE7CisJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIHVsQ0xLKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDI4MV9yZXN1bWUoc25kX2NhcmRfdCAqY2FyZCkKK3sKKwljczQyODFfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgdWxDTEs7CisKKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisKKwl1bENMSyA9IHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQ0xLQ1IxKTsKKwl1bENMSyB8PSBDTEtDUjFfQ0tSQTsKKwlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdWxDTEspOworCisJc25kX2NzNDI4MV9jaGlwX2luaXQoY2hpcCk7CisKKwkvKiByZXN0b3JlIHRoZSBzdGF0dXMgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2F2ZWRfcmVncyk7IGkrKykKKwkJaWYgKHNhdmVkX3JlZ3NbaV0pCisJCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgc2F2ZWRfcmVnc1tpXSwgY2hpcC0+c3VzcGVuZF9yZWdzW2ldKTsKKworCWlmIChjaGlwLT5hYzk3KQorCQlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CisJaWYgKGNoaXAtPmFjOTdfc2Vjb25kYXJ5KQorCQlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5N19zZWNvbmRhcnkpOworCisJdWxDTEsgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0NMS0NSMSk7CisJdWxDTEsgJj0gfkNMS0NSMV9DS1JBOworCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfQ0xLQ1IxLCB1bENMSyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJDUzQyODEiLAorCS5pZF90YWJsZSA9IHNuZF9jczQyODFfaWRzLAorCS5wcm9iZSA9IHNuZF9jczQyODFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jczQyODFfcmVtb3ZlKSwKKwlTTkRfUENJX1BNX0NBTExCQUNLUworfTsKKwkKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9jczQyODFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfY3M0MjgxX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9jczQyODFfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9jczQyODFfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvTWFrZWZpbGUgYi9zb3VuZC9wY2kvY3M0Nnh4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Yjc3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyMKKworc25kLWNzNDZ4eC1vYmpzIDo9IGNzNDZ4eC5vIGNzNDZ4eF9saWIubworaWZlcSAoJChDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQKSx5KQorICBzbmQtY3M0Nnh4LW9ianMgKz0gZHNwX3Nwb3MubyBkc3Bfc3Bvc19zY2JfbGliLm8KK2VuZGlmCisKKyMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKK29iai0kKENPTkZJR19TTkRfQ1M0NlhYKSArPSBzbmQtY3M0Nnh4Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDY0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogIFRoZSBkcml2ZXIgZm9yIHRoZSBDaXJydXMgTG9naWMncyBTb3VuZCBGdXNpb24gQ1M0NlhYIGJhc2VkIHNvdW5kY2FyZHMKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKgorICBOT1RFUzoKKyAgLSBzb21ldGltZXMgdGhlIHNvdW5kIGlzIG1ldGFsbGljIGFuZCBzaWJpbGFudCwgdW5sb2FkaW5nIGFuZCAKKyAgICByZWxvYWRpbmcgdGhlIG1vZHVsZSBtYXkgc29sdmUgdGhpcy4KKyovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NzNDZ4eC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaXJydXMgTG9naWMgU291bmQgRnVzaW9uIENTNDZYWCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Q2lycnVzIExvZ2ljLFNvdW5kIEZ1c2lvbiAoQ1M0MjgwKX0sIgorCQkie0NpcnJ1cyBMb2dpYyxTb3VuZCBGdXNpb24gKENTNDYxMCl9LCIKKwkJIntDaXJydXMgTG9naWMsU291bmQgRnVzaW9uIChDUzQ2MTIpfSwiCisJCSJ7Q2lycnVzIExvZ2ljLFNvdW5kIEZ1c2lvbiAoQ1M0NjE1KX0sIgorCQkie0NpcnJ1cyBMb2dpYyxTb3VuZCBGdXNpb24gKENTNDYyMil9LCIKKwkJIntDaXJydXMgTG9naWMsU291bmQgRnVzaW9uIChDUzQ2MjQpfSwiCisJCSJ7Q2lycnVzIExvZ2ljLFNvdW5kIEZ1c2lvbiAoQ1M0NjMwKX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBleHRlcm5hbF9hbXBbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKK3N0YXRpYyBpbnQgdGhpbmtwYWRbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKK3N0YXRpYyBpbnQgbW1hcF92YWxpZFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDF9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIHRoZSBDUzQ2eHggc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciB0aGUgQ1M0Nnh4IHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgQ1M0Nnh4IHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShleHRlcm5hbF9hbXAsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhleHRlcm5hbF9hbXAsICJGb3JjZSB0byBlbmFibGUgZXh0ZXJuYWwgYW1wbGlmZXIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkodGhpbmtwYWQsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh0aGlua3BhZCwgIkZvcmNlIHRvIGVuYWJsZSBUaGlua3BhZCdzIENMS1JVTiBjb250cm9sLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1tYXBfdmFsaWQsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtbWFwX3ZhbGlkLCAiU3VwcG9ydCBPU1MgbW1hcC4iKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9jczQ2eHhfaWRzW10gPSB7CisgICAgICAgIHsgMHgxMDEzLCAweDYwMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sICAgLyogQ1M0MjgwICovCisgICAgICAgIHsgMHgxMDEzLCAweDYwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sICAgLyogQ1M0NjEyICovCisgICAgICAgIHsgMHgxMDEzLCAweDYwMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sICAgLyogQ1M0NjE1ICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2NzNDZ4eF9pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2FyZF9jczQ2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWNzNDZ4eF90ICpjaGlwOworCWludCBlcnI7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGVyciA9IHNuZF9jczQ2eHhfY3JlYXRlKGNhcmQsIHBjaSwKKwkJCQkgICAgIGV4dGVybmFsX2FtcFtkZXZdLCB0aGlua3BhZFtkZXZdLAorCQkJCSAgICAgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+YWNjZXB0X3ZhbGlkID0gbW1hcF92YWxpZFtkZXZdOworCWlmICgoZXJyID0gc25kX2NzNDZ4eF9wY20oY2hpcCwgMCwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJaWYgKChlcnIgPSBzbmRfY3M0Nnh4X3BjbV9yZWFyKGNoaXAsMSwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9jczQ2eHhfcGNtX2llYzk1OChjaGlwLDIsTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCWlmICgoZXJyID0gc25kX2NzNDZ4eF9taXhlcihjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlpZiAoY2hpcC0+bnJfYWM5N19jb2RlY3MgPT0yKSB7CisJCWlmICgoZXJyID0gc25kX2NzNDZ4eF9wY21fY2VudGVyX2xmZShjaGlwLDMsTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoKGVyciA9IHNuZF9jczQ2eHhfbWlkaShjaGlwLCAwLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX2NzNDZ4eF9zdGFydF9kc3AoY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCisJc25kX2NzNDZ4eF9nYW1lcG9ydChjaGlwKTsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJDUzQ2eHgiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiU291bmQgRnVzaW9uIENTNDZ4eCIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseC8weCVseCwgaXJxICVpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLAorCQljaGlwLT5iYTBfYWRkciwKKwkJY2hpcC0+YmExX2FkZHIsCisJCWNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9jYXJkX2NzNDZ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJTb3VuZCBGdXNpb24gQ1M0Nnh4IiwKKwkuaWRfdGFibGUgPSBzbmRfY3M0Nnh4X2lkcywKKwkucHJvYmUgPSBzbmRfY2FyZF9jczQ2eHhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2NzNDZ4eF9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfY3M0Nnh4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2NzNDZ4eF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfY3M0Nnh4X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfY3M0Nnh4X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9pbWFnZS5oIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzkzZjYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfaW1hZ2UuaApAQCAtMCwwICsxLDM0NjggQEAKK3N0cnVjdCBCQTFzdHJ1Y3QgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJfSBtZW1vcnlbQkExX01FTU9SWV9DT1VOVF07CisJdTMyIG1hcFtCQTFfRFdPUkRfU0laRV07Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgQkExc3RydWN0IEJBMVN0cnVjdCA9IHsKK3t7IDB4MDAwMDAwMDAsIDB4MDAwMDMwMDAgfSx7IDB4MDAwMTAwMDAsIDB4MDAwMDM4MDAgfSx7IDB4MDAwMjAwMDAsIDB4MDAwMDcwMDAgfX0sCit7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMjAwMDQwLDB4MDAwMDgwMTAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHg4MDAwMDAwMSwweDAwMDAwMDAxLDB4MDAwNjAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDkwMDA4MCwweDAwMDAwMTczLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMTAsMHgwMDgwMDAwMCwweDAwOTAwMDAwLAorMHhmMmMwMDAwZiwweDAwMDAwMjAwLDB4MDAwMDAwMDAsMHgwMDAxMDYwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDMzMDMwMGMyLAorMHgwNjAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDgwMDAsMHg4MDAwODAwMCwKKzB4M2ZjMDAwMGYsMHgwMDAwMDMwMSwweDAwMDEwNDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwYjAwMDAwLDB4MDBkMDgwNmQsMHgzMzA0ODBjMywKKzB4MDQ4MDAwMDAsMHgwMDAwMDAwMSwweDAwODAwMDAxLDB4MDAwMGZmZmYsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDY2YTA2MDAsMHgwNjM1MDA3MCwweDAwMDA5MjlkLDB4OTI5ZDkyOWQsCisweDAwMDAwMDAwLDB4MDAwMDczNWEsMHgwMDAwMDYwMCwweDAwMDAwMDAwLAorMHg5MjlkNzM1YSwweDg3MzRhYmZlLDB4MDAwMTAwMDAsMHg3MzVhNzM1YSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA4MDRmLDB4MDAwMDAwYzMsCisweDA1MDAwMDAwLDB4MDBhMDAwMTAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDA3MDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDgwLDB4MDBhMDAwMDAsMHgwMDAwODA5YSwweDAwMDAwMGMyLAorMHgwNzQwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKKzB4MDBjODAwMjgsMHgwMDAwNTU1NSwweDAwMDAwMDAwLDB4MDAwMTA3YTAsCisweDAwYzgwMDI4LDB4MDAwMDAwYzIsMHgwNjgwMDAwMCwweDAwMDAwMDAwLAorMHgwNmUwMDA4MCwweDAwMzAwMDAwLDB4MDAwMDgwYmIsMHgwMDAwMDBjOSwKKzB4MDdhMDAwMDAsMHgwNDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCisweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDAwNzgwLAorMHgwMGM4MDAyOCwweDAwMDAwMGM1LDB4ZmY4MDAwMDAsMHgwMDAwMDAwMCwKKzB4MDA2NDAwODAsMHgwMGMwMDAwMCwweDAwMDA4MTk3LDB4MDAwMDAwYzksCisweDA3ODAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA1ZSwweDAwMDAwMGMxLAorMHgwMDAwMDAwMCwweDAwODAwMDAwLDB4ODAwMDgwMDAsMHg4MDAwODAwMCwKKzB4MDAwMjAwMDAsMHgwMDAwZmZmZiwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHg5MjlkMDYwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkMDAwMCwKKzB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAorMHgwMDAwMDAwMSwweDAwN2EwMDAyLDB4MDAwMDAwMDAsMHgwNjZlMDYxMCwKKzB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHg3MzVhMDA1MSwKKzB4MDAwMDAwMDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4MDAwMDAwMDAsMHgwNjQwMDEzNiwKKzB4MDAwMDI3MGYsMHgwMDAxMDAwMCwweDAwN2EwMDAwLDB4MDAwMDAwMDAsCisweDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTAwMDQsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAwMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwOWM3MzAsMHgwMDAwMTAwMywKKzB4MDAwOGUxOWMsMHgwMDAwMTAwMywweDAwMDA4M2MxLDB4MDAwOTMwNDAsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDExNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMTk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDI5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMzE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwMGE3MzAsMHgwMDAwMTAwOCwweDAwMGUyNzMwLDB4MDAwMDEwMDIsCisweDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAorMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKzB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBmNjE5YywweDAwMDAxMDAzLAorMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDM3M2MsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMGVlMTljLDB4MDAwMDEwMDMsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAorMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMjczYywweDAwMDAxMDAwLAorMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwZTY3OWUsMHgwMDAwMTAwMywKKzB4MDAwMDc3MDUsMHgwMDAwMTQwMCwweDAwMGFjNzFlLDB4MDAwMDEwMDMsCisweDAwMDg3ZmMxLDB4MDAwYzNiZTAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAorMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTczMCwweDAwMDAxMDAzLAorMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKzB4MDAwMDAwMzcsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKzB4MDAwMDAwMzIsMHgwMDAwMTAwMCwweDAwMDAyNzNkLDB4MDAwMDEwMDAsCisweDAwMDRhNzMwLDB4MDAwMDEwMDMsMHgwMDAwMGY0MSwweDAwMDk3MTQwLAorMHgwMDAwYTg0MSwweDAwMDliMjQwLDB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwKKzB4MDAwMWM2NDEsMHgwMDA5MzU0MCwweDAwMDFjZWMxLDB4MDAwOWI1YzAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxYmYwNSwweDAwMDNmYzQwLAorMHgwMDAwMjcyNSwweDAwMGFhNDAwLDB4MDAwMTM3MDUsMHgwMDA5M2EwMCwKKzB4MDAwMDAwMmUsMHgwMDA5ZDZjMCwweDAwMDM4NjMwLDB4MDAwMDEwMDQsCisweDAwMDRlZjBhLDB4MDAwZWI3ODUsMHgwMDAzZmM4YSwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMGM3MGUwLDB4MDAwN2QxODIsMHgwMDAyYzY0MCwKKzB4MDAwMDA2MzAsMHgwMDAwMTAwNCwweDAwMDc5OWI4LDB4MDAwMmM2YzAsCisweDAwMDMxNzA1LDB4MDAwOTIyNDAsMHgwMDAzOWYwNSwweDAwMDkzMmMwLAorMHgwMDAzNTIwYSwweDAwMDAwMDAwLDB4MDAwNDA3MzEsMHgwMDAwMTAwYiwKKzB4MDAwMTA3MDUsMHgwMDBiMjBjMCwweDAwMDAwMDAwLDB4MDAwZWJhNDQsCisweDAwMDMyMTA4LDB4MDAwYzYwYzQsMHgwMDA2NTIwOCwweDAwMGMyOTE3LAorMHgwMDA0MDZiMCwweDAwMDAxMDA3LDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKKzB4MDAwMjgxOGUsMHgwMDBjMDAwMCwweDAwMDQ0MTBhLDB4MDAwMDAwMDAsCisweDAwMDQwNjMwLDB4MDAwMDEwMDcsMHgwMDAyOTcwNSwweDAwMGMwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDAzZmM0MCwKKzB4MDAwMDM3YzEsMHgwMDA5MWI0MCwweDAwMDAzZmMxLDB4MDAwOTExYzAsCisweDAwMDAzN2MxLDB4MDAwOTU3YzAsMHgwMDAwM2ZjMSwweDAwMDk1MWMwLAorMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5OTFjMCwKKzB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDAzZmMxLDB4MDAwOWQxYzAsCisweDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAxY2NjMSwweDAwMDkxNWMwLAorMHgwMDAxYzQ0MSwweDAwMDlkODAwLDB4MDAwOWNkYzEsMHgwMDA5MTI0MCwKKzB4MDAwMWM1NDEsMHgwMDA5MWQwMCwweDAwMDljZmMxLDB4MDAwOTUyNDAsCisweDAwMDFjNzQxLDB4MDAwOTVjODAsMHgwMDBlOGNhOSwweDAwMDk5MjQwLAorMHgwMDBlODVhZCwweDAwMDk1NjQwLDB4MDAwNjljYTksMHgwMDA5OWQ4MCwKKzB4MDAwZTk1MmQsMHgwMDA5OTY0MCwweDAwMGVhY2E5LDB4MDAwOWQ2YzAsCisweDAwMGVhNWFkLDB4MDAwOTFhNDAsMHgwMDA2YmNhOSwweDAwMDlkZTgwLAorMHgwMDBlYjUyZCwweDAwMDk1YTQwLDB4MDAwZWNjYTksMHgwMDA5OWFjMCwKKzB4MDAwZWM1YWQsMHgwMDA5ZGE0MCwweDAwMGVkY2E5LDB4MDAwOWQzMDAsCisweDAwMGE2ZTBhLDB4MDAwMDEwMDAsMHgwMDBlZDUyZCwweDAwMDkxZTQwLAorMHgwMDBlZWNhOSwweDAwMDk1ZWMwLDB4MDAwZWU1YWQsMHgwMDA5OWU0MCwKKzB4MDAwNmZjYTksMHgwMDAwMjUwMCwweDAwMGZiMjA4LDB4MDAwYzU5YTAsCisweDAwMGVmNTJkLDB4MDAwOWRlNDAsMHgwMDA2OGNhOSwweDAwMDkxMmMxLAorMHgwMDA2ODNhZCwweDAwMDk1MjQxLDB4MDAwMjBmMDUsMHgwMDA5OTFjMSwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDg2Zjg4LDB4MDAwMDEwMDAsCisweDAwMDljZjgxLDB4MDAwYjUzNDAsMHgwMDA5YzcwMSwweDAwMGI5MmMwLAorMHgwMDA5ZGU4MSwweDAwMGJkMzAwLDB4MDAwOWQ2MDEsMHgwMDBiMTcwMCwKKzB4MDAwMWZkODEsMHgwMDBiOWQ4MCwweDAwMDlmNTAxLDB4MDAwYjU3YzAsCisweDAwMGEwZjgxLDB4MDAwYmQ3NDAsMHgwMDAyMDcwMSwweDAwMGI1YzgwLAorMHgwMDBhMTY4MSwweDAwMGI5N2MwLDB4MDAwMjE2MDEsMHgwMDAwMjUwMCwKKzB4MDAwYTA3MDEsMHgwMDBiOWI0MCwweDAwMGEwZjgxLDB4MDAwYjFiYzAsCisweDAwMDIxNjgxLDB4MDAwMDJkMDAsMHgwMDAyMGY4MSwweDAwMGJkODAwLAorMHgwMDBhMDcwMSwweDAwMGI1YmMwLDB4MDAwMjE2MDEsMHgwMDAwMzUwMCwKKzB4MDAwYTBmODEsMHgwMDBiNWY0MCwweDAwMGEwNzAxLDB4MDAwYmRiYzAsCisweDAwMDIxNjgxLDB4MDAwMDNkMDAsMHgwMDAyMGY4MSwweDAwMGIxZDAwLAorMHgwMDBhMDcwMSwweDAwMGIxZmMwLDB4MDAwMjE2MDEsMHgwMDAyMDUwMCwKKzB4MDAwMjBmODEsMHgwMDBiMTM0MSwweDAwMGEwNzAxLDB4MDAwYjlmYzAsCisweDAwMDIxNjgxLDB4MDAwMjBkMDAsMHgwMDAyMGY4MSwweDAwMGJkZTgwLAorMHgwMDBhMDcwMSwweDAwMGJkZmMwLDB4MDAwMjE2MDEsMHgwMDAyMTUwMCwKKzB4MDAwMjBmODEsMHgwMDBiOTM0MSwweDAwMDIwNzAxLDB4MDAwYjUzYzEsCisweDAwMDIxNjgxLDB4MDAwMjFkMDAsMHgwMDBhMGY4MSwweDAwMGQwMzgwLAorMHgwMDAwYjYwMSwweDAwMGIxNWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKKzB4MDAwMDdiODEsMHgwMDBiZDFjMCwweDAwMDA3YjAxLDB4MDAwMDAwMDAsCisweDAwMDA3YjgxLDB4MDAwYjkxYzAsMHgwMDAwN2IwMSwweDAwMGI1N2MwLAorMHgwMDAwN2I4MSwweDAwMGI1MWMwLDB4MDAwMDdiMDEsMHgwMDBiMWI0MCwKKzB4MDAwMDdiODEsMHgwMDBiMTFjMCwweDAwMDg3YjAxLDB4MDAwYzNkYzAsCisweDAwMDdlNDg4LDB4MDAwZDdlNDUsMHgwMDAwMDAwMCwweDAwMGQ3YTQ0LAorMHgwMDA3ZTQ4YSwweDAwMDAwMDAwLDB4MDAwMTFmMDUsMHgwMDA4NDA4MCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxNzA1LDB4MDAwYjM1NDAsCisweDAwMDA4YTAxLDB4MDAwYmYwNDAsMHgwMDAwNzA4MSwweDAwMGJiNWMwLAorMHgwMDA1NTQ4OCwweDAwMDAwMDAwLDB4MDAwMGQ0ODIsMHgwMDAzZmM0MCwKKzB4MDAwM2ZjODgsMHgwMDAwMDAwMCwweDAwMDFlNDAxLDB4MDAwYjNhMDAsCisweDAwMDFlYzgxLDB4MDAwYmQ2YzAsMHgwMDA0ZWYwOCwweDAwMGViNzg0LAorMHgwMDBjODZiMCwweDAwMDAxMDA3LDB4MDAwMDgyODEsMHgwMDBiYjI0MCwKKzB4MDAwMGI4MDEsMHgwMDBiNzE0MCwweDAwMDA3ODg4LDB4MDAwMDAwMDAsCisweDAwMDAwNzNjLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNTUyODgsMHgwMDBjNTU1YywKKzB4MDAwNTUyOGEsMHgwMDBjMDAwMCwweDAwMDlmYTg4LDB4MDAwYzVkMDAsCisweDAwMDBmYTg4LDB4MDAwMDAwMDAsMHgwMDAwMDAzMiwweDAwMDAxMDAwLAorMHgwMDAwMDczZCwweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDhjMDFjLDB4MDAwMDEwMDMsCisweDAwMDAyNzA1LDB4MDAwMDEwMDgsMHgwMDA4YjIwMSwweDAwMGMxMzkyLAorMHgwMDAwYmEwMSwweDAwMDAwMDAwLDB4MDAwMDg3MzEsMHgwMDAwMTQwMCwKKzB4MDAwNGMxMDgsMHgwMDBmZTBjNCwweDAwMDU3NDg4LDB4MDAwMDAwMDAsCisweDAwMGE2Mzg4LDB4MDAwMDEwMDEsMHgwMDA4YjMzNCwweDAwMGJjMTQxLAorMHgwMDAzMDIwZSwweDAwMDAwMDAwLDB4MDAwODg2YjAsMHgwMDAwMTAwOCwKKzB4MDAwMDM2MjUsMHgwMDBjNWRmYSwweDAwMGE2MzhhLDB4MDAwMDEwMDEsCisweDAwMDgwMjBlLDB4MDAwMDEwMDIsMHgwMDA4YTZiMCwweDAwMDAxMDA4LAorMHgwMDA3ZjMwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDI3MjUsMHgwMDBhOGM0MCwweDAwMDAwMGFlLDB4MDAwMDAwMDAsCisweDAwMGQ4NjMwLDB4MDAwMDEwMDgsMHgwMDAwMDAwMCwweDAwMGM3NGUwLAorMHgwMDA3ZDE4MiwweDAwMDJkNjQwLDB4MDAwYTg2MzAsMHgwMDAwMTAwOCwKKzB4MDAwNzk5YjgsMHgwMDAyZDZjMCwweDAwMDA3NDhhLDB4MDAwYzNlYzUsCisweDAwMDc0MjBhLDB4MDAwYzAwMDAsMHgwMDA2MjIwOCwweDAwMGM0MTE3LAorMHgwMDA3MDYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKzB4MDAwMTAyMmUsMHgwMDAwMDAwMCwweDAwMDNhNjMwLDB4MDAwMDEwMDksCisweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAzNiwweDAwMDAxMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDJhNzMwLDB4MDAwMDEwMDgsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAorMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAyYTczMCwweDAwMDAxMDA4LAorMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwMmE3MDUsMHgwMDAwMTAwOCwKKzB4MDAwMDdhMDEsMHgwMDBjMDAwMCwweDAwMGU2Mjg4LDB4MDAwZDU1MGEsCisweDAwMDY0MjhhLDB4MDAwMDAwMDAsMHgwMDA2MDczMCwweDAwMDAxMDBhLAorMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDc4ZmIwLDB4MDAwMDEwMGIsCisweDAwMDU3NDg4LDB4MDAwMDAwMDAsMHgwMDAzM2I5NCwweDAwMDgxMTQwLAorMHgwMDAxODNhZSwweDAwMDAwMDAwLDB4MDAwNzg2YjAsMHgwMDAwMTAwYiwKKzB4MDAwMjJmMDUsMHgwMDBjMzU0NSwweDAwMDBlYjhhLDB4MDAwMDAwMDAsCisweDAwMDQyNzMxLDB4MDAwMDEwMDMsMHgwMDA3YWFiMCwweDAwMDM0ODgwLAorMHgwMDA0OGZiMCwweDAwMDAxMDBhLDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKKzB4MDAwMzNiOTQsMHgwMDA4MTE0MCwweDAwMDE4M2FlLDB4MDAwMDAwMDAsCisweDAwMDgwNmIwLDB4MDAwMDEwMGIsMHgwMDAyMmYwNSwweDAwMDAwMDAwLAorMHgwMDAwNzQwMSwweDAwMDkxMTQwLDB4MDAwNDhmMDUsMHgwMDA5NTFjMCwKKzB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDA0NzNkLDB4MDAwMDEwMDAsCisweDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAorMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwOGUxOWMsMHgwMDAwMTAwMywweDAwMDA4M2MxLDB4MDAwOTMwNDAsCisweDAwMDAwZjQxLDB4MDAwOTcxNDAsMHgwMDAwYTg0MSwweDAwMDliMjQwLAorMHgwMDAwYTBjMSwweDAwMDlmMDQwLDB4MDAwMWM2NDEsMHgwMDA5MzU0MCwKKzB4MDAwMWNlYzEsMHgwMDA5YjVjMCwweDAwMDAwMDAwLDB4MDAwZmRjNDQsCisweDAwMDU1MjA4LDB4MDAwMDAwMDAsMHgwMDAxMDcwNSwweDAwMGEyODgwLAorMHgwMDAwYTIzYSwweDAwMDkzYTAwLDB4MDAwM2ZjOGEsMHgwMDBkZjZjNSwKKzB4MDAwNGVmMGEsMHgwMDBjMDAwMCwweDAwMDEyZjA1LDB4MDAwMzY4ODAsCisweDAwMDY1MzA4LDB4MDAwYzI5OTcsMHgwMDBkODZiMCwweDAwMDAxMDBhLAorMHgwMDA0NDEwYSwweDAwMGQ0MGM3LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwODA3MzAsMHgwMDAwMTAwNCwweDAwMDU2ZjBhLDB4MDAwZWExMDUsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwNDczZCwweDAwMDAxMDAwLAorMHgwMDBmMTliMCwweDAwMGJiYzQ3LDB4MDAwODAwMDAsMHgwMDBiZmZjNywKKzB4MDAwMDI3M2QsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwZWJhNDQsCisweDAwMDQ4ZjA1LDB4MDAwMGY0NDAsMHgwMDAwNzQwMSwweDAwMDBmN2MwLAorMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKKzB4MDAwMDZhODgsMHgwMDBjNzVjNCwweDAwMDAwMDAwLDB4MDAwZTUwODQsCisweDAwMDAwMDAwLDB4MDAwZWJhNDQsMHgwMDA4NzQwMSwweDAwMGU0NzgyLAorMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKKzB4MDAwMDZhODgsMHgwMDBjNzVjNCwweDAwMDdjMTA4LDB4MDAwYzAwMDAsCisweDAwMDdlNzIxLDB4MDAwYmVkNDAsMHgwMDAwNWYyNSwweDAwMGJhZGMwLAorMHgwMDAzYmE5NywweDAwMGJlYjgwLDB4MDAwNjU1OTAsMHgwMDBiMmUwMCwKKzB4MDAwMzMyMTcsMHgwMDAwM2VjMCwweDAwMDY1NTkwLDB4MDAwYjhlNDAsCisweDAwMDNlZDgwLDB4MDAwNDkxYzAsMHgwMDA3M2ZiMCwweDAwMDc0YzgwLAorMHgwMDAyODNhMCwweDAwMDAxMDBjLDB4MDAwZWUzODgsMHgwMDA0Mjk3MCwKKzB4MDAwMDgzMDEsMHgwMDAyMWVmMiwweDAwMGI4ZjE0LDB4MDAwMDAwMGYsCisweDAwMGM0ZDhkLDB4MDAwMDAwMWIsMHgwMDBkNmRjMiwweDAwMGUwNmM2LAorMHgwMDAwMzJhYywweDAwMGMzOTE2LDB4MDAwNGVkYzIsMHgwMDA3NGM4MCwKKzB4MDAwNzg4OTgsMHgwMDAwMTAwMCwweDAwMDM4ODk0LDB4MDAwMDAwMzIsCisweDAwMGM0ZDhkLDB4MDAwOTJlMWIsMHgwMDBkNmRjMiwweDAwMGUwNmM2LAorMHgwMDA0ZWRjMiwweDAwMGMxOTU2LDB4MDAwMDcyMmMsMHgwMDAzNGEwMCwKKzB4MDAwNDE3MDUsMHgwMDA5ZWQ0MCwweDAwMDU4NzMwLDB4MDAwMDE0MDAsCisweDAwMGQ3NDg4LDB4MDAwYzNhMDAsMHgwMDA0OGYwNSwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMCwwICsxLDM5MjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiAgICAgICAgICAgICAgICAgICBDaXJydXMgTG9naWMsIEluYy4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBDaXJydXMgTG9naWMgQ1M0NjF4IGNoaXBzCisgKgorICogIEtOT1dOIEJVR1M6CisgKiAgICAtIFNvbWV0aW1lcyB0aGUgU1BESUYgaW5wdXQgRFNQIHRhc2tzIGdldCdzIHVuc3luY2hyb25pemVkCisgKiAgICAgIGFuZCB0aGUgU1BESUYgZ2V0IHNvbWV3aGF0ICJkaXN0b3JjaW9uYXRlZCIsIG9yL2FuZCBsZWZ0IHJpZ2h0IGNoYW5uZWwKKyAqICAgICAgYXJlIHN3YXBwZWQuIFRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIHdoZW4gaXQgaGFwcGVucywgbXV0ZSBhbmQgdW5tdXRlIAorICogICAgICB0aGUgU1BESUYgaW5wdXQgbWl4ZXIgY29udHJvbGwuCisgKiAgICAtIE9uIHRoZSBIZXJjdWxlcyBHYW1lIFRoZWF0ZXIgWFAgdGhlIGFtcGxpZmllciBhcmUgc29tZXRpbWVzIHR1cm5lZAorICogICAgICBvZmYgb24gaW5hZGVjdWF0ZSBtb21lbnRzIHdoaWNoIGNhdXNlcyBkaXN0b3JjaW9ucyBvbiBzb3VuZC4KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0gU2Vjb25kYXJ5IENPREVDIG9uIHNvbWUgc291bmRjYXJkcworICogICAgLSBTUERJRiBpbnB1dCBzdXBwb3J0IGZvciBvdGhlciBzYW1wbGUgcmF0ZXMgdGhlbiA0OGtoegorICogICAgLSBQb3NpYmlsaXR5IHRvIG1peCB0aGUgU1BESUYgb3V0cHV0IHdpdGggYW5hbG9nIHNvdXJjZXMuCisgKiAgICAtIFBDTSBjaGFubmVscyBmb3IgQ2VudGVyIGFuZCBMRkUgb24gc2Vjb25kYXJ5IGNvZGVjCisgKgorICogIE5PVEU6IHdpdGggQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUCB1bnNldCB1c2VzIG9sZCBEU1AgaW1hZ2UgKHdoaWNoCisgKiAgICAgICAgaXMgZGVmYXVsdCBjb25maWd1cmF0aW9uKSwgbm8gU1BESUYsIG5vIHNlY29uZGFyeSBjb2RlYywgbm8KKyAqICAgICAgICBtdWx0aSBjaGFubmVsIFBDTS4gIEJ1dCBrbm93biB0byB3b3JrLgorICoKKyAqICBGSU5BTExZOiBBIGNyZWRpdCB0byB0aGUgZGV2ZWxvcGVycyBUb20gYW5kIEpvcmRhbiAKKyAqICAgICAgICAgICBhdCBDaXJydXMgZm9yIGhhdmUgaGVscGluZyBtZSBvdXQgd2l0aCB0aGUgRFNQLCBob3dldmVyIHdlCisgKiAgICAgICAgICAgc3RpbGwgZG9uJ3QgaGF2ZSBzdWZmaWNpZW50IGRvY3VtZW50YXRpb24gYW5kIHRlY2huaWNhbAorICogICAgICAgICAgIHJlZmVyZW5jZXMgdG8gYmUgYWJsZSB0byBpbXBsZW1lbnQgYWxsIGZhbmN5IGZldXR1cmVzCisgKiAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBjczQ2eHggRFNQJ3MuIAorICogICAgICAgICAgIEJlbm55IDxiZW5ueUBob3N0bW9iaWxpdHkuY29tPgorICogICAgICAgICAgICAgICAgCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NzNDZ4eC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJjczQ2eHhfbGliLmgiCisjaW5jbHVkZSAiZHNwX3Nwb3MuaCIKKworc3RhdGljIHZvaWQgYW1wX3ZveWV0cmEoY3M0Nnh4X3QgKmNoaXAsIGludCBjaGFuZ2UpOworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19yZWFyX29wczsKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcmVhcl9vcHM7CitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0Nnh4X3BsYXliYWNrX2NsZmVfb3BzOworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19pbmRpcmVjdF9jbGZlX29wczsKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaWVjOTU4X29wczsKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfaWVjOTU4X29wczsKKyNlbmRpZgorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wczsKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3Rfb3BzOworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9jYXB0dXJlX29wczsKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfY2FwdHVyZV9pbmRpcmVjdF9vcHM7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY3M0Nnh4X3QgKmNoaXAsCisJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJCSAgICBpbnQgY29kZWNfaW5kZXgpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHJlc3VsdCx0bXA7CisJdTMyIG9mZnNldCA9IDA7CisJc25kX2Fzc2VydCAoIChjb2RlY19pbmRleCA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCkgfHwKKwkJICAgICAoY29kZWNfaW5kZXggPT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCksCisJCSAgICAgcmV0dXJuIC1FSU5WQUwpOworCisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CisKKwlpZiAoY29kZWNfaW5kZXggPT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCkKKwkJb2Zmc2V0ID0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19PRkZTRVQ7CisKKwkvKgorCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NyAKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGU3LS0tNTUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqICA2LiBSZWFkIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aCwgY2hlY2sgVlNUUyBiaXQKKwkgKi8KKworCXNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNTREEgKyBvZmZzZXQpOworCisJdG1wID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCk7CisJaWYgKCh0bXAgJiBBQ0NUTF9WRlJNKSA9PSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICAiY3M0Nnh4OiBBQ0NUTF9WRlJNIG5vdCBzZXQgMHgleFxuIix0bXApOworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLCAodG1wICYgKH5BQ0NUTF9FU1lOKSkgfCBBQ0NUTF9WRlJNICk7CisJCW1zbGVlcCg1MCk7CisJCXRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDVEwgKyBvZmZzZXQpOworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLCB0bXAgfCBBQ0NUTF9FU1lOIHwgQUNDVExfVkZSTSApOworCisJfQorCisJLyoKKwkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQorCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCisJICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAorCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKKwkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAorCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCisJICogIHNldCBDUlcgLSBSZWFkIGNvbW1hbmQKKwkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCisJICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCisJICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0CisJICovCisKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ0FELCByZWcpOworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDREEsIDApOworCWlmIChjb2RlY19pbmRleCA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCkgeworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLC8qIGNsZWFyIEFDQ1RMX0RDViAqLyBBQ0NUTF9DUlcgfCAKKwkJCQkgICBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8CisJCQkJICAgQUNDVExfUlNUTik7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX0RDViB8IEFDQ1RMX0NSVyB8CisJCQkJICAgQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4gfAorCQkJCSAgIEFDQ1RMX1JTVE4pOworCX0gZWxzZSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX0RDViB8IEFDQ1RMX1RDIHwKKwkJCQkgICBBQ0NUTF9DUlcgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8CisJCQkJICAgQUNDVExfUlNUTik7CisJfQorCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIHJlYWQgdG8gb2NjdXIuCisJICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwMDsgY291bnQrKykgeworCQkvKgorCQkgKiAgRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgorCSAJICovCisJCXVkZWxheSgxMCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVhZCBoYXMgY29tcGxldGVkLgorCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCQkgKi8KKwkJaWYgKCEoc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQorCQkJZ290byBvazE7CisJfQorCisJc25kX3ByaW50aygiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ0NUTF9EQ1YpLCByZWcgPSAweCV4XG4iLCByZWcpOworCXJlc3VsdCA9IDB4ZmZmZjsKKwlnb3RvIGVuZDsKKwkKKyBvazE6CisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIHZhbGlkIHN0YXR1cyBiaXQgdG8gZ28gYWN0aXZlLgorCSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgeworCQkvKgorCQkgKiAgUmVhZCB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCisJCSAqICBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgKKwkJICogIFZTVFMgLSBWYWxpZCBTdGF0dXMKKwkJICovCisJCWlmIChzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDU1RTICsgb2Zmc2V0KSAmIEFDU1RTX1ZTVFMpCisJCQlnb3RvIG9rMjsKKwkJdWRlbGF5KDEwKTsKKwl9CisJCisJc25kX3ByaW50aygiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgY29kZWNfaW5kZXggJWQsIHJlZyA9IDB4JXhcbiIsIGNvZGVjX2luZGV4LCByZWcpOworCXJlc3VsdCA9IDB4ZmZmZjsKKwlnb3RvIGVuZDsKKworIG9rMjoKKwkvKgorCSAqICBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCisJICovCisjaWYgMAorCXByaW50aygiZSkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgcmVnLAorCQkJc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NEQSksCisJCQlzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDQ0FEKSk7CisjZW5kaWYKKworCS8vc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NBRCk7CisJcmVzdWx0ID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NEQSArIG9mZnNldCk7CisgZW5kOgorCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2NzNDZ4eF9hYzk3X3JlYWQoYWM5N190ICogYWM5NywKKwkJCQkJICAgIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwljczQ2eHhfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJaW50IGNvZGVjX2luZGV4ID0gYWM5Ny0+bnVtOworCisJc25kX2Fzc2VydChjb2RlY19pbmRleCA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCB8fAorCQkgICBjb2RlY19pbmRleCA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYLAorCQkgICByZXR1cm4gMHhmZmZmKTsKKworCXZhbCA9IHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCByZWcsIGNvZGVjX2luZGV4KTsKKworCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9jb2RlY193cml0ZShjczQ2eHhfdCAqY2hpcCwKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJICAgdW5zaWduZWQgc2hvcnQgdmFsLAorCQkJCSAgIGludCBjb2RlY19pbmRleCkKK3sKKwlpbnQgY291bnQ7CisKKwlzbmRfYXNzZXJ0ICgoY29kZWNfaW5kZXggPT0gQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVgpIHx8CisJCSAgICAoY29kZWNfaW5kZXggPT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCksCisJCSAgICByZXR1cm4pOworCisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CisKKwkvKgorCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NworCSAqICAzLiBXcml0ZSBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoIGZvciBpbml0aWF0aW5nIHRoZSB3cml0ZQorCSAqICA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkgKiAgNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCisJICovCisKKwkvKgorCSAqICBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0NjF4IHRvIHNlbmQgdGhlCisJICogIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KKwkgKiAgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoCisJICogIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAorCSAqICBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCisJICogIHNldCBEQ1YgLSB3aWxsIGNsZWFyIHdoZW4gcHJvY2VzcyBjb21wbGV0ZWQKKwkgKiAgcmVzZXQgQ1JXIC0gV3JpdGUgY29tbWFuZAorCSAqICBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKKwkgKiAgc2V0IEVTWU4gLSBBU1lOQyBnZW5lcmF0aW9uIGVuYWJsZWQKKwkgKiAgc2V0IFJTVE4gLSBBUlNUIyBpbmFjdGl2ZSwgQUM5NyBjb2RlYyBub3QgcmVzZXQKKyAgICAgICAgICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NBRCAsIHJlZyk7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NEQSAsIHZhbCk7CisJc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ0NUTCk7CisKKwlpZiAoY29kZWNfaW5kZXggPT0gQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVgpIHsKKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTCwgLyogY2xlYXIgQUNDVExfRENWICovIEFDQ1RMX1ZGUk0gfAorCQkJCSAgIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfVkZSTSB8CisJCQkJICAgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOworCX0gZWxzZSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX0RDViB8IEFDQ1RMX1RDIHwKKwkJCQkgICBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDQwMDA7IGNvdW50KyspIHsKKwkJLyoKKwkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KKwkJICovCisJCXVkZWxheSgxMCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KKwkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkJICovCisJCWlmICghKHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSkgeworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJc25kX3ByaW50aygiQUMnOTcgd3JpdGUgcHJvYmxlbSwgY29kZWNfaW5kZXggPSAlZCwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgY29kZWNfaW5kZXgsIHJlZywgdmFsKTsKKyBlbmQ6CisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLTEpOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X2FjOTdfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IGNvZGVjX2luZGV4ID0gYWM5Ny0+bnVtOworCisJc25kX2Fzc2VydChjb2RlY19pbmRleCA9PSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCB8fAorCQkgICBjb2RlY19pbmRleCA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYLAorCQkgICByZXR1cm4pOworCisJc25kX2NzNDZ4eF9jb2RlY193cml0ZShjaGlwLCByZWcsIHZhbCwgY29kZWNfaW5kZXgpOworfQorCisKKy8qCisgKiAgQ2hpcCBpbml0aWFsaXphdGlvbgorICovCisKK2ludCBzbmRfY3M0Nnh4X2Rvd25sb2FkKGNzNDZ4eF90ICpjaGlwLAorCQkJdTMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXZvaWQgX19pb21lbSAqZHN0OworCXVuc2lnbmVkIGludCBiYW5rID0gb2Zmc2V0ID4+IDE2OworCW9mZnNldCA9IG9mZnNldCAmIDB4ZmZmZjsKKworCXNuZF9hc3NlcnQoIShvZmZzZXQgJiAzKSAmJiAhKGxlbiAmIDMpLCByZXR1cm4gLUVJTlZBTCk7CisJZHN0ID0gY2hpcC0+cmVnaW9uLmlkeFtiYW5rKzFdLnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJbGVuIC89IHNpemVvZih1MzIpOworCisJLyogd3JpdGVsIGFscmVhZHkgY29udmVydHMgMzItYml0IHZhbHVlIHRvIHJpZ2h0IGVuZGlhbmVzcyAqLworCXdoaWxlIChsZW4tLSA+IDApIHsKKwkJd3JpdGVsKCpzcmMrKywgZHN0KTsKKwkJZHN0ICs9IHNpemVvZih1MzIpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKworI2luY2x1ZGUgImltZ3MvY3djNDYzMC5oIgorI2luY2x1ZGUgImltZ3MvY3djYXN5bmMuaCIKKyNpbmNsdWRlICJpbWdzL2N3Y3Nub29wLmgiCisjaW5jbHVkZSAiaW1ncy9jd2NiaW5oYWNrLmgiCisjaW5jbHVkZSAiaW1ncy9jd2NkbWEuaCIKKworaW50IHNuZF9jczQ2eHhfY2xlYXJfQkExKGNzNDZ4eF90ICpjaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKSAKK3sKKwl2b2lkIF9faW9tZW0gKmRzdDsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IG9mZnNldCA+PiAxNjsKKwlvZmZzZXQgPSBvZmZzZXQgJiAweGZmZmY7CisKKwlzbmRfYXNzZXJ0KCEob2Zmc2V0ICYgMykgJiYgIShsZW4gJiAzKSwgcmV0dXJuIC1FSU5WQUwpOworCWRzdCA9IGNoaXAtPnJlZ2lvbi5pZHhbYmFuaysxXS5yZW1hcF9hZGRyICsgb2Zmc2V0OworCWxlbiAvPSBzaXplb2YodTMyKTsKKworCS8qIHdyaXRlbCBhbHJlYWR5IGNvbnZlcnRzIDMyLWJpdCB2YWx1ZSB0byByaWdodCBlbmRpYW5lc3MgKi8KKwl3aGlsZSAobGVuLS0gPiAwKSB7CisJCXdyaXRlbCgwLCBkc3QpOworCQlkc3QgKz0gc2l6ZW9mKHUzMik7CisJfQorCXJldHVybiAwOworfQorCisjZWxzZSAvKiBvbGQgRFNQIGltYWdlICovCisKKyNpbmNsdWRlICJjczQ2eHhfaW1hZ2UuaCIKKworaW50IHNuZF9jczQ2eHhfZG93bmxvYWRfaW1hZ2UoY3M0Nnh4X3QgKmNoaXApCit7CisJaW50IGlkeCwgZXJyOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQkExX01FTU9SWV9DT1VOVDsgaWR4KyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3M0Nnh4X2Rvd25sb2FkKGNoaXAsCisJCQkJCSAgICAgICAmQkExU3RydWN0Lm1hcFtvZmZzZXRdLAorCQkJCQkgICAgICAgQkExU3RydWN0Lm1lbW9yeVtpZHhdLm9mZnNldCwKKwkJCQkJICAgICAgIEJBMVN0cnVjdC5tZW1vcnlbaWR4XS5zaXplKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJb2Zmc2V0ICs9IEJBMVN0cnVjdC5tZW1vcnlbaWR4XS5zaXplID4+IDI7CisJfQkKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQICovCisKKy8qCisgKiAgQ2hpcCByZXNldAorICovCisKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcmVzZXQoY3M0Nnh4X3QgKmNoaXApCit7CisJaW50IGlkeDsKKworCS8qCisJICogIFdyaXRlIHRoZSByZXNldCBiaXQgb2YgdGhlIFNQIGNvbnRyb2wgcmVnaXN0ZXIuCisJICovCisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9TUENSLCBTUENSX1JTVFNQKTsKKworCS8qCisJICogIFdyaXRlIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfU1BDUiwgU1BDUl9EUlFFTik7CisKKwkvKgorCSAqICBDbGVhciB0aGUgdHJhcCByZWdpc3RlcnMuCisJICovCisJZm9yIChpZHggPSAwOyBpZHggPCA4OyBpZHgrKykgeworCQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0RSRUcsIERSRUdfUkVHSURfVFJBUF9TRUxFQ1QgKyBpZHgpOworCQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1RXUFIsIDB4RkZGRik7CisJfQorCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfRFJFRywgMCk7CisKKwkvKgorCSAqICBTZXQgdGhlIGZyYW1lIHRpbWVyIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiBjeWNsZXMgcGVyIGZyYW1lLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfRlJNVCwgMHhhZGYpOworfQorCitzdGF0aWMgaW50IGNzNDZ4eF93YWl0X2Zvcl9maWZvKGNzNDZ4eF90ICogY2hpcCxpbnQgcmV0cnlfdGltZW91dCkgCit7CisJdTMyIGksIHN0YXR1cyA9IDA7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIEZJRk8gd3JpdGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisJICovCisJZm9yKGkgPSAwOyBpIDwgNTA7IGkrKyl7CisJCXN0YXR1cyA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfU0VSQlNUKTsKKyAgICAKKwkJaWYoICEoc3RhdHVzICYgU0VSQlNUX1dCU1kpICkKKwkJCWJyZWFrOworCisJCW1kZWxheShyZXRyeV90aW1lb3V0KTsKKwl9CisgIAorCWlmKHN0YXR1cyAmIFNFUkJTVF9XQlNZKSB7CisJCXNuZF9wcmludGsoIEtFUk5fRVJSICJjczQ2eHg6IGZhaWx1cmUgd2FpdGluZyBmb3IgRklGTyBjb21tYW5kIHRvIGNvbXBsZXRlXG4iKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9jbGVhcl9zZXJpYWxfRklGT3MoY3M0Nnh4X3QgKmNoaXApCit7CisJaW50IGlkeCwgcG93ZXJkb3duID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJLyoKKwkgKiAgU2VlIGlmIHRoZSBkZXZpY2VzIGFyZSBwb3dlcmVkIGRvd24uICBJZiBzbywgd2UgbXVzdCBwb3dlciB0aGVtIHVwIGZpcnN0CisJICogIG9yIHRoZXkgd2lsbCBub3QgcmVzcG9uZC4KKwkgKi8KKwl0bXAgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0NMS0NSMSk7CisJaWYgKCEodG1wICYgQ0xLQ1IxX1NXQ0UpKSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7CisJCXBvd2VyZG93biA9IDE7CisJfQorCisJLyoKKwkgKiAgV2Ugd2FudCB0byBjbGVhciBvdXQgdGhlIHNlcmlhbCBwb3J0IEZJRk9zIHNvIHdlIGRvbid0IGVuZCB1cCBwbGF5aW5nCisJICogIHdoYXRldmVyIHJhbmRvbSBnYXJiYWdlIGhhcHBlbnMgdG8gYmUgaW4gdGhlbS4gIFdlIGZpbGwgdGhlIHNhbXBsZSBGSUZPUworCSAqICB3aXRoIHplcm8gKHNpbGVuY2UpLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSQldQLCAwKTsKKworCS8qCisJICogIEZpbGwgYWxsIDI1NiBzYW1wbGUgRklGTyBsb2NhdGlvbnMuCisJICovCisJZm9yIChpZHggPSAwOyBpZHggPCAweEZGOyBpZHgrKykgeworCQkvKgorCQkgKiAgTWFrZSBzdXJlIHRoZSBwcmV2aW91cyBGSUZPIHdyaXRlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKGNzNDZ4eF93YWl0X2Zvcl9maWZvKGNoaXAsMSkpIHsKKwkJCXNuZF9wcmludGRkICgiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsaWR4KTsKKworCQkJaWYgKHBvd2VyZG93bikKKwkJCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKKyAgICAgICAgICAKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgRklGTyBpbmRleC4KKwkJICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSQkFELCBpZHgpOworCQkvKgorCQkgKiAgVGVsbCB0aGUgc2VyaWFsIHBvcnQgdG8gbG9hZCB0aGUgbmV3IHZhbHVlIGludG8gdGhlIEZJRk8gbG9jYXRpb24uCisJCSAqLworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkJDTSwgU0VSQkNNX1dSQyk7CisJfQorCS8qCisJICogIE5vdywgaWYgd2UgcG93ZXJlZCB1cCB0aGUgZGV2aWNlcywgdGhlbiBwb3dlciB0aGVtIGJhY2sgZG93biBhZ2Fpbi4KKwkgKiAgVGhpcyBpcyBraW5kYSB1Z2x5LCBidXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKwkgKi8KKwlpZiAocG93ZXJkb3duKQorCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9wcm9jX3N0YXJ0KGNzNDZ4eF90ICpjaGlwKQoreworCWludCBjbnQ7CisKKwkvKgorCSAqICBTZXQgdGhlIGZyYW1lIHRpbWVyIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiBjeWNsZXMgcGVyIGZyYW1lLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfRlJNVCwgMHhhZGYpOworCS8qCisJICogIFR1cm4gb24gdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCisJICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfU1BDUiwgU1BDUl9SVU4gfCBTUENSX1JVTkZSIHwgU1BDUl9EUlFFTik7CisJLyoKKwkgKiAgV2FpdCB1bnRpbCB0aGUgcnVuIGF0IGZyYW1lIGJpdCByZXNldHMgaXRzZWxmIGluIHRoZSBTUCBjb250cm9sCisJICogIHJlZ2lzdGVyLgorCSAqLworCWZvciAoY250ID0gMDsgY250IDwgMjU7IGNudCsrKSB7CisJCXVkZWxheSg1MCk7CisJCWlmICghKHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfU1BDUikgJiBTUENSX1JVTkZSKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX1NQQ1IpICYgU1BDUl9SVU5GUikKKwkJc25kX3ByaW50aygiU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcHJvY19zdG9wKGNzNDZ4eF90ICpjaGlwKQoreworCS8qCisJICogIFR1cm4gb2ZmIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgorCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1NQQ1IsIDApOworfQorCisvKgorICogIFNhbXBsZSByYXRlIHJvdXRpbmVzCisgKi8KKworI2RlZmluZSBHT0ZfUEVSX1NFQyAyMDAKKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9zZXRfcGxheV9zYW1wbGVfcmF0ZShjczQ2eHhfdCAqY2hpcCwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdG1wMSwgdG1wMjsKKwl1bnNpZ25lZCBpbnQgcGhpSW5jcjsKKwl1bnNpZ25lZCBpbnQgY29ycmVjdGlvblBlckdPRiwgY29ycmVjdGlvblBlclNlYzsKKworCS8qCisJICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KKwkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQorCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6CisJICoKKwkgKiAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQorICAgICAgICAgKiAgdWxDb3JyZWN0aW9uUGVyU2VjID0gRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jciAtTQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICoKKwkgKiAgaS5lLgorCSAqCisJICogIHBoaUluY3I6b3RoZXIgPSBkaXZpZGVuZDpyZW1haW5kZXIoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCisJICogIGNvcnJlY3Rpb25QZXJHT0Y6Y29ycmVjdGlvblBlclNlYyA9CisJICogICAgICBkaXZpZGVuZDpyZW1haW5kZXIodWxPdGhlciAvIEdPRl9QRVJfU0VDKQorCSAqLworCXRtcDEgPSByYXRlIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gNDgwMDA7CisJdG1wMSAtPSBwaGlJbmNyICogNDgwMDA7CisJdG1wMSA8PD0gMTA7CisJcGhpSW5jciA8PD0gMTA7CisJdG1wMiA9IHRtcDEgLyA0ODAwMDsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogNDgwMDA7CisJY29ycmVjdGlvblBlckdPRiA9IHRtcDEgLyBHT0ZfUEVSX1NFQzsKKwl0bXAxIC09IGNvcnJlY3Rpb25QZXJHT0YgKiBHT0ZfUEVSX1NFQzsKKwljb3JyZWN0aW9uUGVyU2VjID0gdG1wMTsKKworCS8qCisJICogIEZpbGwgaW4gdGhlIFNhbXBsZVJhdGVDb252ZXJ0ZXIgY29udHJvbCBibG9jay4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1BTUkMsCisJICAoKGNvcnJlY3Rpb25QZXJTZWMgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAoY29ycmVjdGlvblBlckdPRiAmIDB4RkZGRikpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfUFBJLCBwaGlJbmNyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X3NldF9jYXB0dXJlX3NhbXBsZV9yYXRlKGNzNDZ4eF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBwaGlJbmNyLCBjb2VmZkluY3IsIHRtcDEsIHRtcDI7CisJdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWMsIGluaXRpYWxEZWxheTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVHcm91cExlbmd0aCwgY250OworCisJLyoKKwkgKiAgV2UgY2FuIG9ubHkgZGVjaW1hdGUgYnkgdXAgdG8gYSBmYWN0b3Igb2YgMS85dGggdGhlIGhhcmR3YXJlIHJhdGUuCisJICogIENvcnJlY3QgdGhlIHZhbHVlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCisJICovCisJaWYgKChyYXRlICogOSkgPCA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwIC8gOTsKKworCS8qCisJICogIFdlIGNhbiBub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgorCSAqICBSZXR1cm4gYW4gZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KKwkgKi8KKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCisJICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKKwkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IC1mbG9vcigoRnMsb3V0ICogMl4yMykgLyBGcyxpbikKKwkgKiAgICAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICAgICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCisJICogICAgIGNvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICogICAgIGluaXRpYWxEZWxheSA9IGNlaWwoKDI0ICogRnMsaW4pIC8gRnMsb3V0KQorCSAqCisJICogaS5lLgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IG5lZyhkaXZpZGVuZCgoRnMsb3V0ICogMl4yMykgLyBGcyxpbikpCisJICogICAgIHBoaUluY3I6dWxPdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKKwkgKiAgICAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KKwkgKiAJICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCisJICogICAgIGluaXRpYWxEZWxheSA9IGRpdmlkZW5kKCgoMjQgKiBGcyxpbikgKyBGcyxvdXQgLSAxKSAvIEZzLG91dCkKKwkgKi8KKworCXRtcDEgPSByYXRlIDw8IDE2OworCWNvZWZmSW5jciA9IHRtcDEgLyA0ODAwMDsKKwl0bXAxIC09IGNvZWZmSW5jciAqIDQ4MDAwOworCXRtcDEgPDw9IDc7CisJY29lZmZJbmNyIDw8PSA3OworCWNvZWZmSW5jciArPSB0bXAxIC8gNDgwMDA7CisJY29lZmZJbmNyIF49IDB4RkZGRkZGRkY7CisJY29lZmZJbmNyKys7CisJdG1wMSA9IDQ4MDAwIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gcmF0ZTsKKwl0bXAxIC09IHBoaUluY3IgKiByYXRlOworCXRtcDEgPDw9IDEwOworCXBoaUluY3IgPDw9IDEwOworCXRtcDIgPSB0bXAxIC8gcmF0ZTsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogcmF0ZTsKKwljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOworCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOworCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOworCWluaXRpYWxEZWxheSA9ICgoNDgwMDAgKiAyNCkgKyByYXRlIC0gMSkgLyByYXRlOworCisJLyoKKwkgKiAgRmlsbCBpbiB0aGUgVmFyaURlY2ltYXRlIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9DU1JDLAorCQkoKGNvcnJlY3Rpb25QZXJTZWMgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAoY29ycmVjdGlvblBlckdPRiAmIDB4RkZGRikpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ0NJLCBjb2VmZkluY3IpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ0QsCisJCSgoKEJBMV9WQVJJREVDX0JVRl8xICsgKGluaXRpYWxEZWxheSA8PCAyKSkgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAweDgwKTsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0NQSSwgcGhpSW5jcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIGdyb3VwIGxlbmd0aCBmb3IgdGhlIHdyaXRlIGJhY2sgdGFzay4gIEJhc2ljYWxseSwKKwkgKiAgdGhpcyBpcyBqdXN0IHRoZSBmYWN0b3JzIG9mIDI0MDAwICgyXjYqMyo1XjMpIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluCisJICogIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUuCisJICovCisJZnJhbWVHcm91cExlbmd0aCA9IDE7CisJZm9yIChjbnQgPSAyOyBjbnQgPD0gNjQ7IGNudCAqPSAyKSB7CisJCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKQorCQkJZnJhbWVHcm91cExlbmd0aCAqPSAyOworCX0KKwlpZiAoKChyYXRlIC8gMykgKiAzKSAhPSByYXRlKSB7CisJCWZyYW1lR3JvdXBMZW5ndGggKj0gMzsKKwl9CisJZm9yIChjbnQgPSA1OyBjbnQgPD0gMTI1OyBjbnQgKj0gNSkgeworCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkgCisJCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDU7CisgICAgICAgIH0KKworCS8qCisJICogRmlsbCBpbiB0aGUgV3JpdGVCYWNrIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9DRkcxLCBmcmFtZUdyb3VwTGVuZ3RoKTsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0NGRzIsICgweDAwODAwMDAwIHwgZnJhbWVHcm91cExlbmd0aCkpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ0NTVCwgMHgwMDAwRkZGRik7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9DU1BCLCAoKDY1NTM2ICogcmF0ZSkgLyAyNDAwMCkpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCAoQkExX0NTUEIgKyA0KSwgMHgwMDAwRkZGRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBQQ00gcGFydAorICovCisKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcGJfdHJhbnNfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgICBzbmRfcGNtX2luZGlyZWN0X3QgKnJlYywgc2l6ZV90IGJ5dGVzKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWNzNDZ4eF9wY21fdCAqIGNwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJbWVtY3B5KGNwY20tPmh3X2J1Zi5hcmVhICsgcmVjLT5od19kYXRhLCBydW50aW1lLT5kbWFfYXJlYSArIHJlYy0+c3dfZGF0YSwgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfdHJhbnNmZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWNzNDZ4eF9wY21fdCAqIGNwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3BjbV9pbmRpcmVjdF9wbGF5YmFja190cmFuc2ZlcihzdWJzdHJlYW0sICZjcGNtLT5wY21fcmVjLCBzbmRfY3M0Nnh4X3BiX3RyYW5zX2NvcHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X2NwX3RyYW5zX2NvcHkoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICAgc25kX3BjbV9pbmRpcmVjdF90ICpyZWMsIHNpemVfdCBieXRlcykKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyByZWMtPnN3X2RhdGEsCisJICAgICAgIGNoaXAtPmNhcHQuaHdfYnVmLmFyZWEgKyByZWMtPmh3X2RhdGEsIGJ5dGVzKTsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X2NhcHR1cmVfdHJhbnNmZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21faW5kaXJlY3RfY2FwdHVyZV90cmFuc2ZlcihzdWJzdHJlYW0sICZjaGlwLT5jYXB0LnBjbV9yZWMsIHNuZF9jczQ2eHhfY3BfdHJhbnNfY29weSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfY3M0Nnh4X3BsYXliYWNrX2RpcmVjdF9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjsKKwljczQ2eHhfcGNtX3QgKmNwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfYXNzZXJ0IChjcGNtLT5wY21fY2hhbm5lbCxyZXR1cm4gLUVOWElPKTsKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlwdHIgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgKGNwY20tPnBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+YWRkcmVzcyArIDIpIDw8IDIpOworI2Vsc2UKKwlwdHIgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX1BCQSk7CisjZW5kaWYKKwlwdHIgLT0gY3BjbS0+aHdfYnVmLmFkZHI7CisJcmV0dXJuIHB0ciA+PiBjcGNtLT5zaGlmdDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisJY3M0Nnh4X3BjbV90ICpjcGNtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJc25kX2Fzc2VydCAoY3BjbS0+cGNtX2NoYW5uZWwscmV0dXJuIC1FTlhJTyk7CisJcHRyID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAyKSA8PCAyKTsKKyNlbHNlCisJcHRyID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9QQkEpOworI2VuZGlmCisJcHRyIC09IGNwY20tPmh3X2J1Zi5hZGRyOworCXJldHVybiBzbmRfcGNtX2luZGlyZWN0X3BsYXliYWNrX3BvaW50ZXIoc3Vic3RyZWFtLCAmY3BjbS0+cGNtX3JlYywgcHRyKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQ2eHhfY2FwdHVyZV9kaXJlY3RfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHIgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX0NCQSkgLSBjaGlwLT5jYXB0Lmh3X2J1Zi5hZGRyOworCXJldHVybiBwdHIgPj4gY2hpcC0+Y2FwdC5zaGlmdDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQ2eHhfY2FwdHVyZV9pbmRpcmVjdF9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0ciA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfQ0JBKSAtIGNoaXAtPmNhcHQuaHdfYnVmLmFkZHI7CisJcmV0dXJuIHNuZF9wY21faW5kaXJlY3RfY2FwdHVyZV9wb2ludGVyKHN1YnN0cmVhbSwgJmNoaXAtPmNhcHQucGNtX3JlYywgcHRyKTsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgICAgaW50IGNtZCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwkvKnNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOyovCisJaW50IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJY3M0Nnh4X3BjbV90ICpjcGNtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKCEgY3BjbS0+cGNtX2NoYW5uZWwpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisjZW5kaWYKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCQkvKiBtYWdpYyB2YWx1ZSB0byB1bm11dGUgUENNIHN0cmVhbSAgcGxheWJhY2sgdm9sdW1lICovCisJCXNuZF9jczQ2eHhfcG9rZShjaGlwLCAoY3BjbS0+cGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiLT5hZGRyZXNzICsgCisJCQkJICAgICAgIFNDQlZvbHVtZUN0cmwpIDw8IDIsIDB4ODAwMDgwMDApOworCisJCWlmIChjcGNtLT5wY21fY2hhbm5lbC0+dW5saW5rZWQpCisJCQljczQ2eHhfZHNwX3BjbV9saW5rKGNoaXAsY3BjbS0+cGNtX2NoYW5uZWwpOworCisJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHMgIT0gQ1M0NlhYX0ZSQUdTKQorCQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmFuc2ZlcihzdWJzdHJlYW0pOworI2Vsc2UKKwkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHMgIT0gQ1M0NlhYX0ZSQUdTKQorCQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmFuc2ZlcihzdWJzdHJlYW0pOworCQl7IHVuc2lnbmVkIGludCB0bXA7CisJCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfUENUTCk7CisJCXRtcCAmPSAweDAwMDBmZmZmOworCQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1BDVEwsIGNoaXAtPnBsYXlfY3RsIHwgdG1wKTsKKwkJfQorCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCQkvKiBtYWdpYyBtdXRlIGNoYW5uZWwgKi8KKwkJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAKKwkJCQkgICAgICAgU0NCVm9sdW1lQ3RybCkgPDwgMiwgMHhmZmZmZmZmZik7CisKKwkJaWYgKCFjcGNtLT5wY21fY2hhbm5lbC0+dW5saW5rZWQpCisJCQljczQ2eHhfZHNwX3BjbV91bmxpbmsoY2hpcCxjcGNtLT5wY21fY2hhbm5lbCk7CisjZWxzZQorCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJeyB1bnNpZ25lZCBpbnQgdG1wOworCQl0bXAgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX1BDVEwpOworCQl0bXAgJj0gMHgwMDAwZmZmZjsKKwkJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9QQ1RMLCB0bXApOworCQl9CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X2NhcHR1cmVfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSAgICAgIGludCBjbWQpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJdG1wID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9DQ1RMKTsKKwkJdG1wICY9IDB4ZmZmZjAwMDA7CisJCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ0NUTCwgY2hpcC0+Y2FwdC5jdGwgfCB0bXApOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQl0bXAgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX0NDVEwpOworCQl0bXAgJj0gMHhmZmZmMDAwMDsKKwkJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9DQ1RMLCB0bXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCitzdGF0aWMgaW50IF9jczQ2eHhfYWRqdXN0X3NhbXBsZV9yYXRlIChjczQ2eHhfdCAqY2hpcCwgY3M0Nnh4X3BjbV90ICpjcGNtLAorCQkJCSAgICAgICBpbnQgc2FtcGxlX3JhdGUpIAoreworCisJLyogSWYgUENNUmVhZGVyU0NCIGFuZCBTcmNUYXNrU0NCIG5vdCBjcmVhdGVkIHlldCAuLi4gKi8KKwlpZiAoIGNwY20tPnBjbV9jaGFubmVsID09IE5VTEwpIHsKKwkJY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY2hpcCwgc2FtcGxlX3JhdGUsIAorCQkJCQkJCQkgICBjcGNtLCBjcGNtLT5od19idWYuYWRkcixjcGNtLT5wY21fY2hhbm5lbF9pZCk7CisJCWlmIChjcGNtLT5wY21fY2hhbm5lbCA9PSBOVUxMKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWxlZCB0byBjcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljcGNtLT5wY21fY2hhbm5lbC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKwl9IGVsc2UKKwkvKiBpZiBzYW1wbGUgcmF0ZSBpcyBjaGFuZ2VkICovCisJaWYgKChpbnQpY3BjbS0+cGNtX2NoYW5uZWwtPnNhbXBsZV9yYXRlICE9IHNhbXBsZV9yYXRlKSB7CisJCWludCB1bmxpbmtlZCA9IGNwY20tPnBjbV9jaGFubmVsLT51bmxpbmtlZDsKKwkJY3M0Nnh4X2RzcF9kZXN0cm95X3BjbV9jaGFubmVsIChjaGlwLGNwY20tPnBjbV9jaGFubmVsKTsKKworCQlpZiAoIChjcGNtLT5wY21fY2hhbm5lbCA9IGNzNDZ4eF9kc3BfY3JlYXRlX3BjbV9jaGFubmVsIChjaGlwLCBzYW1wbGVfcmF0ZSwgY3BjbSwgCisJCQkJCQkJCQkgY3BjbS0+aHdfYnVmLmFkZHIsCisJCQkJCQkJCQkgY3BjbS0+cGNtX2NoYW5uZWxfaWQpKSA9PSBOVUxMKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGZhaWxlZCB0byByZS1jcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmICghdW5saW5rZWQpIGNzNDZ4eF9kc3BfcGNtX2xpbmsgKGNoaXAsY3BjbS0+cGNtX2NoYW5uZWwpOworCQljcGNtLT5wY21fY2hhbm5lbC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJY3M0Nnh4X3BjbV90ICpjcGNtOworCWludCBlcnI7CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBzYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKGh3X3BhcmFtcyk7CisJaW50IHBlcmlvZF9zaXplID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpOworI2VuZGlmCisJY3BjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlzbmRfYXNzZXJ0IChzYW1wbGVfcmF0ZSAhPSAwLCByZXR1cm4gLUVOWElPKTsKKworCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKworCWlmIChfY3M0Nnh4X2FkanVzdF9zYW1wbGVfcmF0ZSAoY2hpcCxjcGNtLHNhbXBsZV9yYXRlKSkgeworCQl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNuZF9hc3NlcnQgKGNwY20tPnBjbV9jaGFubmVsICE9IE5VTEwpOworCWlmICghY3BjbS0+cGNtX2NoYW5uZWwpIHsKKwkJdXAgKCZjaGlwLT5zcG9zX211dGV4KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKworCWlmIChjczQ2eHhfZHNwX3BjbV9jaGFubmVsX3NldF9wZXJpb2QgKGNoaXAsY3BjbS0+cGNtX2NoYW5uZWwscGVyaW9kX3NpemUpKSB7CisJCSB1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCQkgcmV0dXJuIC1FSU5WQUw7CisJIH0KKworCXNuZF9wcmludGRkICgicGVyaW9kX3NpemUgKCVkKSwgcGVyaW9kcyAoJWQpIGJ1ZmZlcl9zaXplKCVkKVxuIiwKKwkJICAgICBwZXJpb2Rfc2l6ZSwgcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKSwKKwkJICAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworI2VuZGlmCisKKwlpZiAocGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKSA9PSBDUzQ2WFhfRlJBR1MpIHsKKwkJaWYgKHJ1bnRpbWUtPmRtYV9hcmVhICE9IGNwY20tPmh3X2J1Zi5hcmVhKQorCQkJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCQlydW50aW1lLT5kbWFfYXJlYSA9IGNwY20tPmh3X2J1Zi5hcmVhOworCQlydW50aW1lLT5kbWFfYWRkciA9IGNwY20tPmh3X2J1Zi5hZGRyOworCQlydW50aW1lLT5kbWFfYnl0ZXMgPSBjcGNtLT5od19idWYuYnl0ZXM7CisKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwkJaWYgKGNwY20tPnBjbV9jaGFubmVsX2lkID09IERTUF9QQ01fTUFJTl9DSEFOTkVMKSB7CisJCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X3BsYXliYWNrX29wczsKKwkJfSBlbHNlIGlmIChjcGNtLT5wY21fY2hhbm5lbF9pZCA9PSBEU1BfUENNX1JFQVJfQ0hBTk5FTCkgeworCQkJc3Vic3RyZWFtLT5vcHMgPSAmc25kX2NzNDZ4eF9wbGF5YmFja19yZWFyX29wczsKKwkJfSBlbHNlIGlmIChjcGNtLT5wY21fY2hhbm5lbF9pZCA9PSBEU1BfUENNX0NFTlRFUl9MRkVfQ0hBTk5FTCkgeworCQkJc3Vic3RyZWFtLT5vcHMgPSAmc25kX2NzNDZ4eF9wbGF5YmFja19jbGZlX29wczsKKwkJfSBlbHNlIGlmIChjcGNtLT5wY21fY2hhbm5lbF9pZCA9PSBEU1BfSUVDOTU4X0NIQU5ORUwpIHsKKwkJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfaWVjOTU4X29wczsKKwkJfSBlbHNlIHsKKwkJCXNuZF9hc3NlcnQoMCk7CisJCX0KKyNlbHNlCisJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfb3BzOworI2VuZGlmCisKKwl9IGVsc2UgeworCQlpZiAocnVudGltZS0+ZG1hX2FyZWEgPT0gY3BjbS0+aHdfYnVmLmFyZWEpIHsKKwkJCXJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwkJCXJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKKwkJCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSA8IDApIHsKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJCQl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworI2VuZGlmCisJCQlyZXR1cm4gZXJyOworCQl9CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJCWlmIChjcGNtLT5wY21fY2hhbm5lbF9pZCA9PSBEU1BfUENNX01BSU5fQ0hBTk5FTCkgeworCQkJc3Vic3RyZWFtLT5vcHMgPSAmc25kX2NzNDZ4eF9wbGF5YmFja19pbmRpcmVjdF9vcHM7CisJCX0gZWxzZSBpZiAoY3BjbS0+cGNtX2NoYW5uZWxfaWQgPT0gRFNQX1BDTV9SRUFSX0NIQU5ORUwpIHsKKwkJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcmVhcl9vcHM7CisJCX0gZWxzZSBpZiAoY3BjbS0+cGNtX2NoYW5uZWxfaWQgPT0gRFNQX1BDTV9DRU5URVJfTEZFX0NIQU5ORUwpIHsKKwkJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfY2xmZV9vcHM7CisJCX0gZWxzZSBpZiAoY3BjbS0+cGNtX2NoYW5uZWxfaWQgPT0gRFNQX0lFQzk1OF9DSEFOTkVMKSB7CisJCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X2llYzk1OF9vcHM7CisJCX0gZWxzZSB7CisJCQlzbmRfYXNzZXJ0KDApOworCQl9CisjZWxzZQorCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X29wczsKKyNlbmRpZgorCisJfQorCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXVwICgmY2hpcC0+c3Bvc19tdXRleCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCS8qY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ki8KKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljczQ2eHhfcGNtX3QgKmNwY207CisKKwljcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJLyogaWYgcGxheV9iYWNrIG9wZW4gZmFpbHMsIHRoZW4gdGhpcyBmdW5jdGlvbgorCSAgIGlzIGNhbGxlZCBhbmQgY3BjbSBjYW4gYWN0dWFsbHkgYmUgTlVMTCBoZXJlICovCisJaWYgKCFjcGNtKSByZXR1cm4gLUVOWElPOworCisJaWYgKHJ1bnRpbWUtPmRtYV9hcmVhICE9IGNwY20tPmh3X2J1Zi5hcmVhKQorCQlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisgICAgCisJcnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOworCXJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwl1bnNpZ25lZCBpbnQgcGZpZTsKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljczQ2eHhfcGNtX3QgKmNwY207CisKKwljcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorICAgIHNuZF9hc3NlcnQgKGNwY20tPnBjbV9jaGFubmVsICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCisJcGZpZSA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCAoY3BjbS0+cGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiLT5hZGRyZXNzICsgMSkgPDwgMiApOworCXBmaWUgJj0gfjB4MDAwMGYwM2Y7CisjZWxzZQorCS8qIG9sZCBkc3AgKi8KKwlwZmllID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9QRklFKTsKKyAJcGZpZSAmPSB+MHgwMDAwZjAzZjsKKyNlbmRpZgorCisJY3BjbS0+c2hpZnQgPSAyOworCS8qIGlmIHRvIGNvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbW9ubyAqLworCWlmIChydW50aW1lLT5jaGFubmVscyA9PSAxKSB7CisJCWNwY20tPnNoaWZ0LS07CisJCXBmaWUgfD0gMHgwMDAwMjAwMDsKKwl9CisJLyogaWYgdG8gY29udmVydCBmcm9tIDggYml0IHRvIDE2IGJpdCAqLworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDgpIHsKKwkJY3BjbS0+c2hpZnQtLTsKKwkJcGZpZSB8PSAweDAwMDAxMDAwOworCX0KKwkvKiBpZiB0byBjb252ZXJ0IHRvIHVuc2lnbmVkICovCisJaWYgKHNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkKHJ1bnRpbWUtPmZvcm1hdCkpCisJCXBmaWUgfD0gMHgwMDAwODAwMDsKKworCS8qIE5ldmVyIGNvbnZlcnQgYnl0ZSBvcmRlciB3aGVuIHNhbXBsZSBzdHJlYW0gaXMgOCBiaXQgKi8KKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSAhPSA4KSB7CisJCS8qIGNvbnZlcnQgZnJvbSBiaWcgZW5kaWFuIHRvIGxpdHRsZSBlbmRpYW4gKi8KKwkJaWYgKHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4ocnVudGltZS0+Zm9ybWF0KSkKKwkJCXBmaWUgfD0gMHgwMDAwNDAwMDsKKwl9CisJCisJbWVtc2V0KCZjcGNtLT5wY21fcmVjLCAwLCBzaXplb2YoY3BjbS0+cGNtX3JlYykpOworCWNwY20tPnBjbV9yZWMuc3dfYnVmZmVyX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwljcGNtLT5wY21fcmVjLmh3X2J1ZmZlcl9zaXplID0gcnVudGltZS0+cGVyaW9kX3NpemUgKiBDUzQ2WFhfRlJBR1MgPDwgY3BjbS0+c2hpZnQ7CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisKKwl0bXAgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgKGNwY20tPnBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+YWRkcmVzcykgPDwgMik7CisJdG1wICY9IH4weDAwMDAwM2ZmOworCXRtcCB8PSAoNCA8PCBjcGNtLT5zaGlmdCkgLSAxOworCS8qIHBsYXliYWNrIHRyYW5zYWN0aW9uIGNvdW50IHJlZ2lzdGVyICovCisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MpIDw8IDIsIHRtcCk7CisKKwkvKiBwbGF5YmFjayBmb3JtYXQgJiYgaW50ZXJydXB0IGVuYWJsZSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCAoY3BjbS0+cGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiLT5hZGRyZXNzICsgMSkgPDwgMiwgcGZpZSB8IGNwY20tPnBjbV9jaGFubmVsLT5wY21fc2xvdCk7CisjZWxzZQorCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfUEJBLCBjcGNtLT5od19idWYuYWRkcik7CisJdG1wID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9QRFRDKTsKKwl0bXAgJj0gfjB4MDAwMDAzZmY7CisJdG1wIHw9ICg0IDw8IGNwY20tPnNoaWZ0KSAtIDE7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9QRFRDLCB0bXApOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfUEZJRSwgcGZpZSk7CisJc25kX2NzNDZ4eF9zZXRfcGxheV9zYW1wbGVfcmF0ZShjaGlwLCBydW50aW1lLT5yYXRlKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9jYXB0dXJlX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCQlzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJY3M0Nnh4X2RzcF9wY21fb3N0cmVhbV9zZXRfcGVyaW9kIChjaGlwLCBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcykpOworI2VuZGlmCisJaWYgKHJ1bnRpbWUtPnBlcmlvZHMgPT0gQ1M0NlhYX0ZSQUdTKSB7CisJCWlmIChydW50aW1lLT5kbWFfYXJlYSAhPSBjaGlwLT5jYXB0Lmh3X2J1Zi5hcmVhKQorCQkJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCQlydW50aW1lLT5kbWFfYXJlYSA9IGNoaXAtPmNhcHQuaHdfYnVmLmFyZWE7CisJCXJ1bnRpbWUtPmRtYV9hZGRyID0gY2hpcC0+Y2FwdC5od19idWYuYWRkcjsKKwkJcnVudGltZS0+ZG1hX2J5dGVzID0gY2hpcC0+Y2FwdC5od19idWYuYnl0ZXM7CisJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfY2FwdHVyZV9vcHM7CisJfSBlbHNlIHsKKwkJaWYgKHJ1bnRpbWUtPmRtYV9hcmVhID09IGNoaXAtPmNhcHQuaHdfYnVmLmFyZWEpIHsKKwkJCXJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwkJCXJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKKwkJCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X2NhcHR1cmVfaW5kaXJlY3Rfb3BzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfY2FwdHVyZV9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAocnVudGltZS0+ZG1hX2FyZWEgIT0gY2hpcC0+Y2FwdC5od19idWYuYXJlYSkKKwkJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwlydW50aW1lLT5kbWFfYWRkciA9IDA7CisJcnVudGltZS0+ZG1hX2J5dGVzID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0NCQSwgY2hpcC0+Y2FwdC5od19idWYuYWRkcik7CisJY2hpcC0+Y2FwdC5zaGlmdCA9IDI7CisJbWVtc2V0KCZjaGlwLT5jYXB0LnBjbV9yZWMsIDAsIHNpemVvZihjaGlwLT5jYXB0LnBjbV9yZWMpKTsKKwljaGlwLT5jYXB0LnBjbV9yZWMuc3dfYnVmZmVyX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwljaGlwLT5jYXB0LnBjbV9yZWMuaHdfYnVmZmVyX3NpemUgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIENTNDZYWF9GUkFHUyA8PCAyOworCXNuZF9jczQ2eHhfc2V0X2NhcHR1cmVfc2FtcGxlX3JhdGUoY2hpcCwgcnVudGltZS0+cmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNuZF9jczQ2eHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBkZXZfaWQ7CisJdTMyIHN0YXR1czE7CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwl1MzIgc3RhdHVzMjsKKwlpbnQgaTsKKwljczQ2eHhfcGNtX3QgKmNwY20gPSBOVUxMOworI2VuZGlmCisKKwkvKgorCSAqICBSZWFkIHRoZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQKKwkgKi8KKwlzdGF0dXMxID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9ISVNSKTsKKwlpZiAoKHN0YXR1czEgJiAweDdmZmZmZmZmKSA9PSAwKSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfSElDUiwgSElDUl9DSEdNIHwgSElDUl9JRVYpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXN0YXR1czIgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0hTUjApOworCisJZm9yIChpID0gMDsgaSA8IERTUF9NQVhfUENNX0NIQU5ORUxTOyArK2kpIHsKKwkJaWYgKGkgPD0gMTUpIHsKKwkJCWlmICggc3RhdHVzMSAmICgxIDw8IGkpICkgeworCQkJCWlmIChpID09IENTNDZYWF9EU1BfQ0FQVFVSRV9DSEFOTkVMKSB7CisJCQkJCWlmIChjaGlwLT5jYXB0LnN1YnN0cmVhbSkKKwkJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+Y2FwdC5zdWJzdHJlYW0pOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpbnMtPnBjbV9jaGFubmVsc1tpXS5hY3RpdmUgJiYKKwkJCQkJICAgIGlucy0+cGNtX2NoYW5uZWxzW2ldLnByaXZhdGVfZGF0YSAmJgorCQkJCQkgICAgIWlucy0+cGNtX2NoYW5uZWxzW2ldLnVubGlua2VkKSB7CisJCQkJCQljcGNtID0gaW5zLT5wY21fY2hhbm5lbHNbaV0ucHJpdmF0ZV9kYXRhOworCQkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjcGNtLT5zdWJzdHJlYW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCBzdGF0dXMyICYgKDEgPDwgKGkgLSAxNikpKSB7CisJCQkJaWYgKGlucy0+cGNtX2NoYW5uZWxzW2ldLmFjdGl2ZSAmJiAKKwkJCQkgICAgaW5zLT5wY21fY2hhbm5lbHNbaV0ucHJpdmF0ZV9kYXRhICYmCisJCQkJICAgICFpbnMtPnBjbV9jaGFubmVsc1tpXS51bmxpbmtlZCkgeworCQkJCQljcGNtID0gaW5zLT5wY21fY2hhbm5lbHNbaV0ucHJpdmF0ZV9kYXRhOworCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNwY20tPnN1YnN0cmVhbSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisjZWxzZQorCS8qIG9sZCBkc3AgKi8KKwlpZiAoKHN0YXR1czEgJiBISVNSX1ZDMCkgJiYgY2hpcC0+cGxheWJhY2tfcGNtKSB7CisJCWlmIChjaGlwLT5wbGF5YmFja19wY20tPnN1YnN0cmVhbSkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cGxheWJhY2tfcGNtLT5zdWJzdHJlYW0pOworCX0KKwlpZiAoKHN0YXR1czEgJiBISVNSX1ZDMSkgJiYgY2hpcC0+cGNtKSB7CisJCWlmIChjaGlwLT5jYXB0LnN1YnN0cmVhbSkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+Y2FwdC5zdWJzdHJlYW0pOworCX0KKyNlbmRpZgorCisJaWYgKChzdGF0dXMxICYgSElTUl9NSURJKSAmJiBjaGlwLT5ybWlkaSkgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCQorCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJd2hpbGUgKChzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX01JRFNSKSAmIE1JRFNSX1JCRSkgPT0gMCkgeworCQkJYyA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfTUlEUlApOworCQkJaWYgKChjaGlwLT5taWRjciAmIE1JRENSX1JJRSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXNuZF9yYXdtaWRpX3JlY2VpdmUoY2hpcC0+bWlkaV9pbnB1dCwgJmMsIDEpOworCQl9CisJCXdoaWxlICgoc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9NSURTUikgJiBNSURTUl9UQkYpID09IDApIHsKKwkJCWlmICgoY2hpcC0+bWlkY3IgJiBNSURDUl9USUUpID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXQoY2hpcC0+bWlkaV9vdXRwdXQsICZjLCAxKSAhPSAxKSB7CisJCQkJY2hpcC0+bWlkY3IgJj0gfk1JRENSX1RJRTsKKwkJCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX01JRFdQLCBjKTsKKwkJfQorCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCX0KKwkvKgorCSAqICBFT0kgdG8gdGhlIFBDSSBwYXJ0Li4uLnJlZW5hYmxlcyBpbnRlcnJ1cHRzCisJICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9ISUNSLCBISUNSX0NIR00gfCBISUNSX0lFVik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2NzNDZ4eF9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCAKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0JCShTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAorCQkJCSBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0JFKSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMjU2ICogMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQlDUzQ2WFhfTUlOX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JQ1M0NlhYX01BWF9QRVJJT0RfU0laRSwKKwkucGVyaW9kc19taW4gPQkJQ1M0NlhYX0ZSQUdTLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2NzNDZ4eF9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMjU2ICogMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQlDUzQ2WFhfTUlOX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JQ1M0NlhYX01BWF9QRVJJT0RfU0laRSwKKwkucGVyaW9kc19taW4gPQkJQ1M0NlhYX0ZSQUdTLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemVzW10gPSB7IDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCB9OworCitzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCBod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShwZXJpb2Rfc2l6ZXMpLAorCS5saXN0ID0gcGVyaW9kX3NpemVzLAorCS5tYXNrID0gMAorfTsKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcGNtX2ZyZWVfc3Vic3RyZWFtKHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCWNzNDZ4eF9wY21fdCAqIGNwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJa2ZyZWUoY3BjbSk7Cit9CisKK3N0YXRpYyBpbnQgX2NzNDZ4eF9wbGF5YmFja19vcGVuX2NoYW5uZWwgKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0saW50IHBjbV9jaGFubmVsX2lkKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNzNDZ4eF9wY21fdCAqIGNwY207CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwljcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmNwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3BjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQlQQUdFX1NJWkUsICZjcGNtLT5od19idWYpIDwgMCkgeworCQlrZnJlZShjcGNtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcnVudGltZS0+aHcgPSBzbmRfY3M0Nnh4X3BsYXliYWNrOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGNwY207CisJcnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX2NzNDZ4eF9wY21fZnJlZV9zdWJzdHJlYW07CisKKwljcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKwljcGNtLT5wY21fY2hhbm5lbCA9IE5VTEw7IAorCWNwY20tPnBjbV9jaGFubmVsX2lkID0gcGNtX2NoYW5uZWxfaWQ7CisKKworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCisJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgCisJCQkJICAgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplcyk7CisKKwl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworI2Vsc2UKKwljaGlwLT5wbGF5YmFja19wY20gPSBjcGNtOyAvKiBIQUNLICovCisjZW5kaWYKKworCWlmIChjaGlwLT5hY2NlcHRfdmFsaWQpCisJCXN1YnN0cmVhbS0+cnVudGltZS0+aHcuaW5mbyB8PSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEOworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3ByaW50ZGQoIm9wZW4gZnJvbnQgY2hhbm5lbFxuIik7CisJcmV0dXJuIF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jaGFubmVsKHN1YnN0cmVhbSxEU1BfUENNX01BSU5fQ0hBTk5FTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9yZWFyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3ByaW50ZGQoIm9wZW4gcmVhciBjaGFubmVsXG4iKTsKKworCXJldHVybiBfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2hhbm5lbChzdWJzdHJlYW0sRFNQX1BDTV9SRUFSX0NIQU5ORUwpOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jbGZlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3ByaW50ZGQoIm9wZW4gY2VudGVyIC0gTEZFIGNoYW5uZWxcbiIpOworCisJcmV0dXJuIF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jaGFubmVsKHN1YnN0cmVhbSxEU1BfUENNX0NFTlRFUl9MRkVfQ0hBTk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuX2llYzk1OChzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc25kX3ByaW50ZGQoIm9wZW4gcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKworCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKwljczQ2eHhfaWVjOTU4X3ByZV9vcGVuIChjaGlwKTsKKwl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jaGFubmVsKHN1YnN0cmVhbSxEU1BfSUVDOTU4X0NIQU5ORUwpOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSk7CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19jbG9zZV9pZWM5NTgoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnQgZXJyOworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworICAKKwlzbmRfcHJpbnRkZCgiY2xvc2UgcmF3IGllYzk1OCBjaGFubmVsXG4iKTsKKworCWVyciA9IHNuZF9jczQ2eHhfcGxheWJhY2tfY2xvc2Uoc3Vic3RyZWFtKTsKKworCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKwljczQ2eHhfaWVjOTU4X3Bvc3RfY2xvc2UgKGNoaXApOworCXVwICgmY2hpcC0+c3Bvc19tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCVBBR0VfU0laRSwgJmNoaXAtPmNhcHQuaHdfYnVmKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCWNoaXAtPmNhcHQuc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXN1YnN0cmVhbS0+cnVudGltZS0+aHcgPSBzbmRfY3M0Nnh4X2NhcHR1cmU7CisKKwlpZiAoY2hpcC0+YWNjZXB0X3ZhbGlkKQorCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gfD0gU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRDsKKworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAKKwkJCQkgICAmaHdfY29uc3RyYWludHNfcGVyaW9kX3NpemVzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwljczQ2eHhfcGNtX3QgKiBjcGNtOworCisJY3BjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCS8qIHdoZW4gcGxheWJhY2tfb3BlbiBmYWlscywgdGhlbiBjcGNtIGNhbiBiZSBOVUxMICovCisJaWYgKCFjcGNtKSByZXR1cm4gLUVOWElPOworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKwlpZiAoY3BjbS0+cGNtX2NoYW5uZWwpIHsKKwkJY3M0Nnh4X2RzcF9kZXN0cm95X3BjbV9jaGFubmVsKGNoaXAsY3BjbS0+cGNtX2NoYW5uZWwpOworCQljcGNtLT5wY21fY2hhbm5lbCA9IE5VTEw7CisJfQorCXVwICgmY2hpcC0+c3Bvc19tdXRleCk7CisjZWxzZQorCWNoaXAtPnBsYXliYWNrX3BjbSA9IE5VTEw7CisjZW5kaWYKKworCWNwY20tPnN1YnN0cmVhbSA9IE5VTEw7CisJc25kX2RtYV9mcmVlX3BhZ2VzKCZjcGNtLT5od19idWYpOworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJY2hpcC0+Y2FwdC5zdWJzdHJlYW0gPSBOVUxMOworCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+Y2FwdC5od19idWYpOworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19yZWFyX29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuX3JlYXIsCisJLmNsb3NlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19kaXJlY3RfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcmVhcl9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9yZWFyLAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcG9pbnRlciwKKwkuYWNrID0JCQlzbmRfY3M0Nnh4X3BsYXliYWNrX3RyYW5zZmVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19jbGZlX29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuX2NsZmUsCisJLmNsb3NlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19kaXJlY3RfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfY2xmZV9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9jczQ2eHhfcGxheWJhY2tfb3Blbl9jbGZlLAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcG9pbnRlciwKKwkuYWNrID0JCQlzbmRfY3M0Nnh4X3BsYXliYWNrX3RyYW5zZmVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19pZWM5NThfb3BzID0geworCS5vcGVuID0JCQlzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW5faWVjOTU4LAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlX2llYzk1OCwKKwkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2h3X2ZyZWUsCisJLnByZXBhcmUgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2RpcmVjdF9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9wbGF5YmFja19pbmRpcmVjdF9pZWM5NThfb3BzID0geworCS5vcGVuID0JCQlzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW5faWVjOTU4LAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlX2llYzk1OCwKKwkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2h3X2ZyZWUsCisJLnByZXBhcmUgPQkJc25kX2NzNDZ4eF9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X3BvaW50ZXIsCisJLmFjayA9CQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmFuc2ZlciwKK307CisKKyNlbmRpZgorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfZGlyZWN0X3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfY3M0Nnh4X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2NzNDZ4eF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9jczQ2eHhfcGxheWJhY2tfaW5kaXJlY3RfcG9pbnRlciwKKwkuYWNrID0JCQlzbmRfY3M0Nnh4X3BsYXliYWNrX3RyYW5zZmVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2NzNDZ4eF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2NzNDZ4eF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0JCXNuZF9jczQ2eHhfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9jczQ2eHhfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9jczQ2eHhfY2FwdHVyZV9wcmVwYXJlLAorCS50cmlnZ2VyID0JCXNuZF9jczQ2eHhfY2FwdHVyZV90cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9jczQ2eHhfY2FwdHVyZV9kaXJlY3RfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jczQ2eHhfY2FwdHVyZV9pbmRpcmVjdF9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9jczQ2eHhfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX2NzNDZ4eF9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfY3M0Nnh4X2NhcHR1cmVfaW5kaXJlY3RfcG9pbnRlciwKKwkuYWNrID0JCQlzbmRfY3M0Nnh4X2NhcHR1cmVfdHJhbnNmZXIsCit9OworCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWNzNDZ4eF90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfcGNtX3JlYXJfZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPnBjbV9yZWFyID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9wY21fY2VudGVyX2xmZV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWNzNDZ4eF90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtX2NlbnRlcl9sZmUgPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X3BjbV9pZWM5NThfZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPnBjbV9pZWM5NTggPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCisjZGVmaW5lIE1BWF9QTEFZQkFDS19DSEFOTkVMUwkoRFNQX01BWF9QQ01fQ0hBTk5FTFMgLSAxKQorI2Vsc2UKKyNkZWZpbmUgTUFYX1BMQVlCQUNLX0NIQU5ORUxTCTEKKyNlbmRpZgorCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfcGNtKGNzNDZ4eF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJDUzQ2eHgiLCBkZXZpY2UsIE1BWF9QTEFZQkFDS19DSEFOTkVMUywgMSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9jczQ2eHhfcGNtX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2NzNDZ4eF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9jczQ2eHhfY2FwdHVyZV9vcHMpOworCisJLyogZ2xvYmFsIHNldHVwICovCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiQ1M0Nnh4Iik7CisJY2hpcC0+cGNtID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCAyNTYqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAoraW50IF9fZGV2aW5pdCBzbmRfY3M0Nnh4X3BjbV9yZWFyKGNzNDZ4eF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkNTNDZ4eCAtIFJlYXIiLCBkZXZpY2UsIE1BWF9QTEFZQkFDS19DSEFOTkVMUywgMCwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9jczQ2eHhfcGNtX3JlYXJfZnJlZTsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfY3M0Nnh4X3BsYXliYWNrX3JlYXJfb3BzKTsKKworCS8qIGdsb2JhbCBzZXR1cCAqLworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIkNTNDZ4eCAtIFJlYXIiKTsKKwljaGlwLT5wY21fcmVhciA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgMjU2KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2RldmluaXQgc25kX2NzNDZ4eF9wY21fY2VudGVyX2xmZShjczQ2eHhfdCAqY2hpcCwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJDUzQ2eHggLSBDZW50ZXIgTEZFIiwgZGV2aWNlLCBNQVhfUExBWUJBQ0tfQ0hBTk5FTFMsIDAsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0Nnh4X3BjbV9jZW50ZXJfbGZlX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2NzNDZ4eF9wbGF5YmFja19jbGZlX29wcyk7CisKKwkvKiBnbG9iYWwgc2V0dXAgKi8KKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsICJDUzQ2eHggLSBDZW50ZXIgTEZFIik7CisJY2hpcC0+cGNtX2NlbnRlcl9sZmUgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDI1NioxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfcGNtX2llYzk1OChjczQ2eHhfdCAqY2hpcCwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJDUzQ2eHggLSBJRUM5NTgiLCBkZXZpY2UsIDEsIDAsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0Nnh4X3BjbV9pZWM5NThfZnJlZTsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfY3M0Nnh4X3BsYXliYWNrX2llYzk1OF9vcHMpOworCisJLyogZ2xvYmFsIHNldHVwICovCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiQ1M0Nnh4IC0gSUVDOTU4Iik7CisJY2hpcC0+cGNtX3JlYXIgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDI1NioxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiAgTWl4ZXIgcm91dGluZXMKKyAqLworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9taXhlcl9mcmVlX2FjOTdfYnVzKGFjOTdfYnVzX3QgKmJ1cykKK3sKKwljczQ2eHhfdCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCisJY2hpcC0+YWM5N19idXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisKKwlzbmRfYXNzZXJ0ICgoYWM5NyA9PSBjaGlwLT5hYzk3W0NTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYXSkgfHwKKwkJICAgIChhYzk3ID09IGNoaXAtPmFjOTdbQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWF0pLAorCQkgICAgcmV0dXJuKTsKKworCWlmIChhYzk3ID09IGNoaXAtPmFjOTdbQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVhdKSB7CisJCWNoaXAtPmFjOTdbQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVhdID0gTlVMTDsKKwkJY2hpcC0+ZWFwZF9zd2l0Y2ggPSBOVUxMOworCX0KKwllbHNlCisJCWNoaXAtPmFjOTdbQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWF0gPSBOVUxMOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfdm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKKwkJCSAgICAgICBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHg3ZmZmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIHJlZyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweGZmZmYgLSAodmFsID4+IDE2KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDB4ZmZmZiAtICh2YWwgJiAweGZmZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfdm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gKCgweGZmZmYgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgPDwgMTYgfCAKKwkJCSAgICAoMHhmZmZmIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pKTsKKwl1bnNpZ25lZCBpbnQgb2xkID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIHJlZyk7CisJaW50IGNoYW5nZSA9IChvbGQgIT0gdmFsKTsKKworCWlmIChjaGFuZ2UpIHsKKwkJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIHJlZywgdmFsKTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfdm9sX2RhY19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPmRhY192b2x1bWVfbGVmdDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5kYWNfdm9sdW1lX3JpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF92b2xfZGFjX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwOworCisJaWYgKGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5kYWNfdm9sdW1lX3JpZ2h0ICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIHx8CisJICAgIGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5kYWNfdm9sdW1lX2xlZnQgIT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKwkJY3M0Nnh4X2RzcF9zZXRfZGFjX3ZvbHVtZShjaGlwLAorCQkJCQkgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQkJCQkgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwkJY2hhbmdlID0gMTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisjaWYgMAorc3RhdGljIGludCBzbmRfY3M0Nnh4X3ZvbF9pZWM5NThfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5zcGRpZl9pbnB1dF92b2x1bWVfbGVmdDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5zcGRpZl9pbnB1dF92b2x1bWVfcmlnaHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF92b2xfaWVjOTU4X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwOworCisJaWYgKGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlLT5zcGRpZl9pbnB1dF92b2x1bWVfbGVmdCAgIT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gfHwKKwkgICAgY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPnNwZGlmX2lucHV0X3ZvbHVtZV9yaWdodCE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKSB7CisJCWNzNDZ4eF9kc3Bfc2V0X2llYzk1OF92b2x1bWUgKGNoaXAsCisJCQkJCSAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQkJCQkgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCWNoYW5nZSA9IDE7CisJfQorCisJcmV0dXJuIGNoYW5nZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNuZF9taXhlcl9ib29sZWFuX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKKwkJCQkgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfaWVjOTU4X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmIChyZWcgPT0gQ1M0NlhYX01JWEVSX1NQRElGX09VVFBVVF9FTEVNRU5UKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZS0+c3BkaWZfc3RhdHVzX291dCAmIERTUF9TUERJRl9TVEFUVVNfT1VUUFVUX0VOQUJMRUQpOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZS0+c3BkaWZfc3RhdHVzX2luOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9pZWM5NThfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UsIHJlczsKKworCXN3aXRjaCAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKKwljYXNlIENTNDZYWF9NSVhFUl9TUERJRl9PVVRQVVRfRUxFTUVOVDoKKwkJZG93biAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCQljaGFuZ2UgPSAoY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPnNwZGlmX3N0YXR1c19vdXQgJiBEU1BfU1BESUZfU1RBVFVTX09VVFBVVF9FTkFCTEVEKTsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmICFjaGFuZ2UpIAorCQkJY3M0Nnh4X2RzcF9lbmFibGVfc3BkaWZfb3V0KGNoaXApOworCQllbHNlIGlmIChjaGFuZ2UgJiYgIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQkJY3M0Nnh4X2RzcF9kaXNhYmxlX3NwZGlmX291dChjaGlwKTsKKworCQlyZXMgPSAoY2hhbmdlICE9IChjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZS0+c3BkaWZfc3RhdHVzX291dCAmIERTUF9TUERJRl9TVEFUVVNfT1VUUFVUX0VOQUJMRUQpKTsKKwkJdXAgKCZjaGlwLT5zcG9zX211dGV4KTsKKwkJYnJlYWs7CisJY2FzZSBDUzQ2WFhfTUlYRVJfU1BESUZfSU5QVVRfRUxFTUVOVDoKKwkJY2hhbmdlID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPnNwZGlmX3N0YXR1c19pbjsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmICFjaGFuZ2UpIHsKKwkJCWNzNDZ4eF9kc3BfZW5hYmxlX3NwZGlmX2luKGNoaXApOworCQkJLyogcmVzdG9yZSB2b2x1bWUgKi8KKwkJfQorCQllbHNlIGlmIChjaGFuZ2UgJiYgIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQkJY3M0Nnh4X2RzcF9kaXNhYmxlX3NwZGlmX2luKGNoaXApOworCQkKKwkJcmVzID0gKGNoYW5nZSAhPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZS0+c3BkaWZfc3RhdHVzX2luKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzID0gLUVJTlZBTDsKKwkJc25kX2Fzc2VydCgwLCAodm9pZCkwKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfYWRjX2NhcHR1cmVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlpZiAoaW5zLT5hZGNfaW5wdXQgIT0gTlVMTCkgCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwllbHNlIAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9hZGNfY2FwdHVyZV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlpbnQgY2hhbmdlID0gMDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmJiAhaW5zLT5hZGNfaW5wdXQpIHsKKwkJY3M0Nnh4X2RzcF9lbmFibGVfYWRjX2NhcHR1cmUoY2hpcCk7CisJCWNoYW5nZSA9IDE7CisJfSBlbHNlICBpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmIGlucy0+YWRjX2lucHV0KSB7CisJCWNzNDZ4eF9kc3BfZGlzYWJsZV9hZGNfY2FwdHVyZShjaGlwKTsKKwkJY2hhbmdlID0gMTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3BjbV9jYXB0dXJlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCisJaWYgKGlucy0+cGNtX2lucHV0ICE9IE5VTEwpIAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZSAKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3BjbV9jYXB0dXJlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWludCBjaGFuZ2UgPSAwOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmICFpbnMtPnBjbV9pbnB1dCkgeworCQljczQ2eHhfZHNwX2VuYWJsZV9wY21fY2FwdHVyZShjaGlwKTsKKwkJY2hhbmdlID0gMTsKKwl9IGVsc2UgIGlmICghdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiYgaW5zLT5wY21faW5wdXQpIHsKKwkJY3M0Nnh4X2RzcF9kaXNhYmxlX3BjbV9jYXB0dXJlKGNoaXApOworCQljaGFuZ2UgPSAxOworCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hlcmNfc3BkaWZfc2VsZWN0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWludCB2YWwxID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9FR1BJT0RSKTsKKworCWlmICh2YWwxICYgRUdQSU9EUl9HUE9FMCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglHYW1lIFRoZWF0cmUgWFAgY2FyZCAtIEVHUElPWzBdIGlzIHVzZWQgdG8gc2VsZWN0IFNQRElGIGlucHV0IG9wdGljYWwgb3IgY29heGlhbC4KKyAqLyAKK3N0YXRpYyBpbnQgc25kX2hlcmNfc3BkaWZfc2VsZWN0X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWNzNDZ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCB2YWwxID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9FR1BJT0RSKTsKKwlpbnQgdmFsMiA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfRUdQSU9QVFIpOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJCS8qIG9wdGljYWwgaXMgZGVmYXVsdCAqLworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsIAorCQkJCSAgIEVHUElPRFJfR1BPRTAgfCB2YWwxKTsgIC8qIGVuYWJsZSBFR1BJTzAgb3V0cHV0ICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9QVFIsIAorCQkJCSAgIEVHUElPUFRSX0dQUFQwIHwgdmFsMik7IC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCisJfSBlbHNlIHsKKwkJLyogY29heGlhbCAqLworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsICB2YWwxICYgfkVHUElPRFJfR1BPRTApOyAvKiBkaXNhYmxlICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9QVFIsIHZhbDIgJiB+RUdQSU9QVFJfR1BQVDApOyAvKiBkaXNhYmxlICovCisJfQorCisJLyogY2hlY2tpbmcgZGlmZiBmcm9tIHRoZSBFR1BJTyBkaXJlY3Rpb24gcmVnaXN0ZXIgCisJICAgc2hvdWxkIGJlIGVub3VnaCAqLworCXJldHVybiAodmFsMSAhPSAoaW50KXNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfRUdQSU9EUikpOworfQorCisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3NwZGlmX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCisJZG93biAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gX3dyYXBfYWxsX2JpdHMoKGlucy0+c3BkaWZfY3N1dl9kZWZhdWx0ID4+IDI0KSAmIDB4ZmYpOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gX3dyYXBfYWxsX2JpdHMoKGlucy0+c3BkaWZfY3N1dl9kZWZhdWx0ID4+IDE2KSAmIDB4ZmYpOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gMDsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IF93cmFwX2FsbF9iaXRzKChpbnMtPnNwZGlmX2NzdXZfZGVmYXVsdCkgJiAweGZmKTsKKwl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9zcGRpZl9kZWZhdWx0X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWNzNDZ4eF90ICogY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJZG93biAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCXZhbCA9ICgodW5zaWduZWQgaW50KV93cmFwX2FsbF9iaXRzKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdKSA8PCAyNCkgfAorCQkoKHVuc2lnbmVkIGludClfd3JhcF9hbGxfYml0cyh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSkgPDwgMTYpIHwKKwkJKCh1bnNpZ25lZCBpbnQpX3dyYXBfYWxsX2JpdHModWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10pKSAgfAorCQkvKiBsZWZ0IGFuZCByaWdodCB2YWxpZGl0eSBiaXQgKi8KKwkJKDEgPDwgMTMpIHwgKDEgPDwgMTIpOworCisKKwljaGFuZ2UgPSAodW5zaWduZWQgaW50KWlucy0+c3BkaWZfY3N1dl9kZWZhdWx0ICE9IHZhbDsKKwlpbnMtPnNwZGlmX2NzdXZfZGVmYXVsdCA9IHZhbDsKKworCWlmICggIShpbnMtPnNwZGlmX3N0YXR1c19vdXQgJiBEU1BfU1BESUZfU1RBVFVTX1BMQVlCQUNLX09QRU4pICkKKwkJY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9TUERPVVRfQ1NVVix2YWwpOworCisJdXAgKCZjaGlwLT5zcG9zX211dGV4KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9zcGRpZl9tYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gMHgwMDsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9zcGRpZl9zdHJlYW1fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCisJZG93biAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gX3dyYXBfYWxsX2JpdHMoKGlucy0+c3BkaWZfY3N1dl9zdHJlYW0gPj4gMjQpICYgMHhmZik7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSBfd3JhcF9hbGxfYml0cygoaW5zLT5zcGRpZl9jc3V2X3N0cmVhbSA+PiAxNikgJiAweGZmKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IDA7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSBfd3JhcF9hbGxfYml0cygoaW5zLT5zcGRpZl9jc3V2X3N0cmVhbSkgJiAweGZmKTsKKwl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9zcGRpZl9zdHJlYW1fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqIGNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKworCWRvd24gKCZjaGlwLT5zcG9zX211dGV4KTsKKwl2YWwgPSAoKHVuc2lnbmVkIGludClfd3JhcF9hbGxfYml0cyh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSkgPDwgMjQpIHwKKwkJKCh1bnNpZ25lZCBpbnQpX3dyYXBfYWxsX2JpdHModWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0pIDw8IDE2KSB8CisJCSgodW5zaWduZWQgaW50KV93cmFwX2FsbF9iaXRzKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdKSkgfAorCQkvKiBsZWZ0IGFuZCByaWdodCB2YWxpZGl0eSBiaXQgKi8KKwkJKDEgPDwgMTMpIHwgKDEgPDwgMTIpOworCisKKwljaGFuZ2UgPSBpbnMtPnNwZGlmX2NzdXZfc3RyZWFtICE9IHZhbDsKKwlpbnMtPnNwZGlmX2NzdXZfc3RyZWFtID0gdmFsOworCisJaWYgKCBpbnMtPnNwZGlmX3N0YXR1c19vdXQgJiBEU1BfU1BESUZfU1RBVFVTX1BMQVlCQUNLX09QRU4gKQorCQljczQ2eHhfcG9rZV92aWFfZHNwIChjaGlwLFNQX1NQRE9VVF9DU1VWLHZhbCk7CisKKwl1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIGNoYW5nZTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AgKi8KKworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfREVCVUdfR1BJTworc3RhdGljIGludCBzbmRfY3M0Nnh4X2VncGlvX3NlbGVjdF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9lZ3Bpb19zZWxlY3RfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5jdXJyZW50X2dwaW87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X2VncGlvX3NlbGVjdF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlID0gKGNoaXAtPmN1cnJlbnRfZ3BpbyAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJY2hpcC0+Y3VycmVudF9ncGlvID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9lZ3Bpb19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwlzbmRfcHJpbnRkZCAoInB1dDogcmVnID0gJTA0eCwgZ3BpbyAlMDJ4XG4iLHJlZyxjaGlwLT5jdXJyZW50X2dwaW8pOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gCisJCShzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgcmVnKSAmICgxIDw8IGNoaXAtPmN1cnJlbnRfZ3BpbykpID8gMSA6IDA7CisgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfZWdwaW9fcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCB2YWwgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgcmVnKTsKKwlpbnQgb2xkdmFsID0gdmFsOworCXNuZF9wcmludGRkICgicHV0OiByZWcgPSAlMDR4LCBncGlvICUwMnhcbiIscmVnLGNoaXAtPmN1cnJlbnRfZ3Bpbyk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXZhbCB8PSAoMSA8PCBjaGlwLT5jdXJyZW50X2dwaW8pOworCWVsc2UKKwkJdmFsICY9IH4oMSA8PCBjaGlwLT5jdXJyZW50X2dwaW8pOworCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIHJlZyx2YWwpOworCXNuZF9wcmludGRkICgicHV0OiB2YWwgJTA4eCBvbGR2YWwgJTA4eFxuIix2YWwsb2xkdmFsKTsKKworCXJldHVybiAob2xkdmFsICE9IHZhbCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1NORF9DUzQ2WFhfREVCVUdfR1BJTyAqLworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jczQ2eHhfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworeworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkRBQyBWb2x1bWUiLAorCS5pbmZvID0gc25kX2NzNDZ4eF92b2xfaW5mbywKKyNpZm5kZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCS5nZXQgPSBzbmRfY3M0Nnh4X3ZvbF9nZXQsCisJLnB1dCA9IHNuZF9jczQ2eHhfdm9sX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IEJBMV9QVk9MLAorI2Vsc2UKKwkuZ2V0ID0gc25kX2NzNDZ4eF92b2xfZGFjX2dldCwKKwkucHV0ID0gc25kX2NzNDZ4eF92b2xfZGFjX3B1dCwKKyNlbmRpZgorfSwKKworeworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkFEQyBWb2x1bWUiLAorCS5pbmZvID0gc25kX2NzNDZ4eF92b2xfaW5mbywKKwkuZ2V0ID0gc25kX2NzNDZ4eF92b2xfZ2V0LAorCS5wdXQgPSBzbmRfY3M0Nnh4X3ZvbF9wdXQsCisjaWZuZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwkucHJpdmF0ZV92YWx1ZSA9IEJBMV9DVk9MLAorI2Vsc2UKKwkucHJpdmF0ZV92YWx1ZSA9IChWQVJJREVDSU1BVEVfU0NCX0FERFIgKyAweEUpIDw8IDIsCisjZW5kaWYKK30sCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkFEQyBDYXB0dXJlIFN3aXRjaCIsCisJLmluZm8gPSBzbmRfbWl4ZXJfYm9vbGVhbl9pbmZvLAorCS5nZXQgPSBzbmRfY3M0Nnh4X2FkY19jYXB0dXJlX2dldCwKKwkucHV0ID0gc25kX2NzNDZ4eF9hZGNfY2FwdHVyZV9wdXQKK30sCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiREFDIENhcHR1cmUgU3dpdGNoIiwKKwkuaW5mbyA9IHNuZF9taXhlcl9ib29sZWFuX2luZm8sCisJLmdldCA9IHNuZF9jczQ2eHhfcGNtX2NhcHR1cmVfZ2V0LAorCS5wdXQgPSBzbmRfY3M0Nnh4X3BjbV9jYXB0dXJlX3B1dAorfSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJJRUM5NTggT3V0cHV0IFN3aXRjaCIsCisJLmluZm8gPSBzbmRfbWl4ZXJfYm9vbGVhbl9pbmZvLAorCS5nZXQgPSBzbmRfY3M0Nnh4X2llYzk1OF9nZXQsCisJLnB1dCA9IHNuZF9jczQ2eHhfaWVjOTU4X3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IENTNDZYWF9NSVhFUl9TUERJRl9PVVRQVVRfRUxFTUVOVCwKK30sCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiSUVDOTU4IElucHV0IFN3aXRjaCIsCisJLmluZm8gPSBzbmRfbWl4ZXJfYm9vbGVhbl9pbmZvLAorCS5nZXQgPSBzbmRfY3M0Nnh4X2llYzk1OF9nZXQsCisJLnB1dCA9IHNuZF9jczQ2eHhfaWVjOTU4X3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IENTNDZYWF9NSVhFUl9TUERJRl9JTlBVVF9FTEVNRU5ULAorfSwKKyNpZiAwCisvKiBJbnB1dCBJRUM5NTggdm9sdW1lIGRvZXMgbm90IHdvcmsgZm9yIHRoZSBtb21lbnQuIChCZW5ueSkgKi8KK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJJRUM5NTggSW5wdXQgVm9sdW1lIiwKKwkuaW5mbyA9IHNuZF9jczQ2eHhfdm9sX2luZm8sCisJLmdldCA9IHNuZF9jczQ2eHhfdm9sX2llYzk1OF9nZXQsCisJLnB1dCA9IHNuZF9jczQ2eHhfdm9sX2llYzk1OF9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAoQVNZTkNSWF9TQ0JfQUREUiArIDB4RSkgPDwgMiwKK30sCisjZW5kaWYKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5pbmZvID0JIHNuZF9jczQ2eHhfc3BkaWZfaW5mbywKKwkuZ2V0ID0JIHNuZF9jczQ2eHhfc3BkaWZfZGVmYXVsdF9nZXQsCisJLnB1dCA9ICAgc25kX2NzNDZ4eF9zcGRpZl9kZWZhdWx0X3B1dCwKK30sCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0JIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxNQVNLKSwKKwkuaW5mbyA9CSBzbmRfY3M0Nnh4X3NwZGlmX2luZm8sCisgICAgICAgIC5nZXQgPQkgc25kX2NzNDZ4eF9zcGRpZl9tYXNrX2dldCwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQKK30sCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0JIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQQ01fU1RSRUFNKSwKKwkuaW5mbyA9CSBzbmRfY3M0Nnh4X3NwZGlmX2luZm8sCisJLmdldCA9CSBzbmRfY3M0Nnh4X3NwZGlmX3N0cmVhbV9nZXQsCisJLnB1dCA9CSBzbmRfY3M0Nnh4X3NwZGlmX3N0cmVhbV9wdXQKK30sCisKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX0RFQlVHX0dQSU8KK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJFR1BJTyBzZWxlY3QiLAorCS5pbmZvID0gc25kX2NzNDZ4eF9lZ3Bpb19zZWxlY3RfaW5mbywKKwkuZ2V0ID0gc25kX2NzNDZ4eF9lZ3Bpb19zZWxlY3RfZ2V0LAorCS5wdXQgPSBzbmRfY3M0Nnh4X2VncGlvX3NlbGVjdF9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAwLAorfSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJFR1BJTyBJbnB1dC9PdXRwdXQiLAorCS5pbmZvID0gc25kX21peGVyX2Jvb2xlYW5faW5mbywKKwkuZ2V0ID0gc25kX2NzNDZ4eF9lZ3Bpb19nZXQsCisJLnB1dCA9IHNuZF9jczQ2eHhfZWdwaW9fcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gQkEwX0VHUElPRFIsCit9LAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkVHUElPIENNT1MvT3BlbiBkcmFpbiIsCisJLmluZm8gPSBzbmRfbWl4ZXJfYm9vbGVhbl9pbmZvLAorCS5nZXQgPSBzbmRfY3M0Nnh4X2VncGlvX2dldCwKKwkucHV0ID0gc25kX2NzNDZ4eF9lZ3Bpb19wdXQsCisJLnByaXZhdGVfdmFsdWUgPSBCQTBfRUdQSU9QVFIsCit9LAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkVHUElPIE9uL09mZiIsCisJLmluZm8gPSBzbmRfbWl4ZXJfYm9vbGVhbl9pbmZvLAorCS5nZXQgPSBzbmRfY3M0Nnh4X2VncGlvX2dldCwKKwkucHV0ID0gc25kX2NzNDZ4eF9lZ3Bpb19wdXQsCisJLnByaXZhdGVfdmFsdWUgPSBCQTBfRUdQSU9TUiwKK30sCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisvKiBzZXQgcHJpbWFyeSBjczQyOTQgY29kZWMgaW50byBFeHRlbmRlZCBBdWRpbyBNb2RlICovCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfZnJvbnRfZHVwX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIAorCQkJCSAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXZhbCA9IHNuZF9hYzk3X3JlYWQoY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0sIEFDOTdfQ1NSX0FDTU9ERSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodmFsICYgMHgyMDApID8gMCA6IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9mcm9udF9kdXBfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgCisJCQkJICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0sCisJCQkJICAgIEFDOTdfQ1NSX0FDTU9ERSwgMHgyMDAsCisJCQkJICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IDB4MjAwKTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY3M0Nnh4X2Zyb250X2R1cF9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiRHVwbGljYXRlIEZyb250IiwKKwkuaW5mbyA9IHNuZF9taXhlcl9ib29sZWFuX2luZm8sCisJLmdldCA9IHNuZF9jczQ2eHhfZnJvbnRfZHVwX2dldCwKKwkucHV0ID0gc25kX2NzNDZ4eF9mcm9udF9kdXBfcHV0LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorLyogT25seSBhdmFpbGFibGUgb24gdGhlIEhlcmN1bGVzIEdhbWUgVGhlYXRlciBYUCBzb3VuZGNhcmQgKi8KK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2hlcmN1bGVzX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJPcHRpY2FsL0NvYXhpYWwgU1BESUYgSW5wdXQgU3dpdGNoIiwKKwkuaW5mbyA9IHNuZF9taXhlcl9ib29sZWFuX2luZm8sCisJLmdldCA9IHNuZF9oZXJjX3NwZGlmX3NlbGVjdF9nZXQsCisJLnB1dCA9IHNuZF9oZXJjX3NwZGlmX3NlbGVjdF9wdXQsCit9LAorfTsKKworCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X2NvZGVjX3Jlc2V0IChhYzk3X3QgKiBhYzk3KQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJaW50IGVycjsKKworCS8qIHJlc2V0IHRvIGRlZmF1bHRzICovCisJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19SRVNFVCwgMCk7CQorCisJLyogc2V0IHRoZSBkZXNpcmVkIENPREVDIG1vZGUgKi8KKwlpZiAoYWM5Ny0+bnVtID09IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKSB7CisJCXNuZF9wcmludGRkKCJjczQ2eHg6IENPRE9FQzEgbW9kZSAlMDR4XG4iLDB4MCk7CisJCXNuZF9jczQ2eHhfYWM5N193cml0ZShhYzk3LEFDOTdfQ1NSX0FDTU9ERSwweDApOworCX0gZWxzZSBpZiAoYWM5Ny0+bnVtID09IENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpIHsKKwkJc25kX3ByaW50ZGQoImNzNDZ4eDogQ09ET0VDMiBtb2RlICUwNHhcbiIsMHgzKTsKKwkJc25kX2NzNDZ4eF9hYzk3X3dyaXRlKGFjOTcsQUM5N19DU1JfQUNNT0RFLDB4Myk7CisJfSBlbHNlIHsKKwkJc25kX2Fzc2VydCgwKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAuLi4gKi8KKwl9CisKKwl1ZGVsYXkoNTApOworCisJLyogaXQncyBuZWNlc3NhcnkgdG8gd2FpdCBhd2hpbGUgdW50aWwgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NpYmxlIGFmdGVyIFJFU0VUICovCisJLyogYmVjYXVzZSB0aGUgUENNIG9yIE1BU1RFUiB2b2x1bWUgcmVnaXN0ZXJzIGNhbiBiZSBtb2RpZmllZCwgKi8KKwkvKiB0aGUgUkVDX0dBSU4gcmVnaXN0ZXIgaXMgdXNlZCBmb3IgdGVzdHMgKi8KKwllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwlkbyB7CisJCXVuc2lnbmVkIHNob3J0IGV4dF9taWQ7CisgICAgCisJCS8qIHVzZSBwcmVsaW1pbmFyeSByZWFkcyB0byBzZXR0bGUgdGhlIGNvbW11bmljYXRpb24gKi8KKwkJc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1JFU0VUKTsKKwkJc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDEpOworCQlzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfVkVORE9SX0lEMik7CisJCS8qIG1vZGVtPyAqLworCQlleHRfbWlkID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX01JRCk7CisJCWlmIChleHRfbWlkICE9IDB4ZmZmZiAmJiAoZXh0X21pZCAmIDEpICE9IDApCisJCQlyZXR1cm47CisKKwkJLyogdGVzdCBpZiB3ZSBjYW4gd3JpdGUgdG8gdGhlIHJlY29yZCBnYWluIHZvbHVtZSByZWdpc3RlciAqLworCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1JFQ19HQUlOLCAweDhhMDUpOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19SRUNfR0FJTikpID09IDB4OGEwNSkKKwkJCXJldHVybjsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFovMTAwKTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7CisKKwlzbmRfcHJpbnRrKCJDUzQ2eHggc2Vjb25kYXJ5IGNvZGVjIGRvbnQgcmVzcG9uZCFcbiIpOyAgCit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgY3M0Nnh4X2RldGVjdF9jb2RlYyhjczQ2eHhfdCAqY2hpcCwgaW50IGNvZGVjKQoreworCWludCBpZHgsIGVycjsKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CisJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0Nnh4X21peGVyX2ZyZWVfYWM5NzsKKwlhYzk3Lm51bSA9IGNvZGVjOworCWlmIChjaGlwLT5hbXBsaWZpZXJfY3RybCA9PSBhbXBfdm95ZXRyYSkKKwkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9JTlZfRUFQRDsKKworCWlmIChjb2RlYyA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSB7CisJCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgQUM5N19SRVNFVCwgMCwgY29kZWMpOworCQl1ZGVsYXkoMTApOworCQlpZiAoc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIEFDOTdfUkVTRVQsIGNvZGVjKSAmIDB4ODAwMCkgeworCQkJc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IHNlY29uYWRyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCisJc25kX2NzNDZ4eF9jb2RlY193cml0ZShjaGlwLCBBQzk3X01BU1RFUiwgMHg4MDAwLCBjb2RlYyk7CisJZm9yIChpZHggPSAwOyBpZHggPCAxMDA7ICsraWR4KSB7CisJCWlmIChzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY2hpcCwgQUM5N19NQVNURVIsIGNvZGVjKSA9PSAweDgwMDApIHsKKwkJCWVyciA9IHNuZF9hYzk3X21peGVyKGNoaXAtPmFjOTdfYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbY29kZWNdKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWi8xMDApOworCX0KKwlzbmRfcHJpbnRkZCgic25kX2NzNDZ4eDogY29kZWMgJWQgZGV0ZWN0aW9uIHRpbWVvdXRcbiIsIGNvZGVjKTsKKwlyZXR1cm4gLUVOWElPOworfQorCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfbWl4ZXIoY3M0Nnh4X3QgKmNoaXApCit7CisJc25kX2NhcmRfdCAqY2FyZCA9IGNoaXAtPmNhcmQ7CisJc25kX2N0bF9lbGVtX2lkX3QgaWQ7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCQkucmVzZXQgPSBzbmRfY3M0Nnh4X2NvZGVjX3Jlc2V0LAorI2VuZGlmCisJCS53cml0ZSA9IHNuZF9jczQ2eHhfYWM5N193cml0ZSwKKwkJLnJlYWQgPSBzbmRfY3M0Nnh4X2FjOTdfcmVhZCwKKwl9OworCisJLyogZGV0ZWN0IHByaW1hcnkgY29kZWMgKi8KKwljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDA7CisJc25kX3ByaW50ZGQoInNuZF9jczQ2eHg6IGRldGVjdGluZyBwcmltYXJ5IGNvZGVjXG4iKTsKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjYXJkLCAwLCAmb3BzLCBjaGlwLCAmY2hpcC0+YWM5N19idXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJY2hpcC0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9jczQ2eHhfbWl4ZXJfZnJlZV9hYzk3X2J1czsKKworCWlmIChjczQ2eHhfZGV0ZWN0X2NvZGVjKGNoaXAsIENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKSA8IDApCisJCXJldHVybiAtRU5YSU87CisJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAxOworCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBkZXRlY3Rpbmcgc2Vjb25hZHJ5IGNvZGVjXG4iKTsKKwkvKiB0cnkgZGV0ZWN0IGEgc2Vjb25kYXJ5IGNvZGVjICovCisJaWYgKCEgY3M0Nnh4X2RldGVjdF9jb2RlYyhjaGlwLCBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSkKKwkJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAyOworI2VuZGlmIC8qIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AgKi8KKworCS8qIGFkZCBjczQ2MzAgbWl4ZXIgY29udHJvbHMgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NzNDZ4eF9jb250cm9scyk7IGlkeCsrKSB7CisJCXNuZF9rY29udHJvbF90ICprY3RsOworCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY3M0Nnh4X2NvbnRyb2xzW2lkeF0sIGNoaXApOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGdldCBFQVBEIG1peGVyIHN3aXRjaCAoZm9yIHZveWV0cmEgaGFjaykgKi8KKwltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwlpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXN0cmNweShpZC5uYW1lLCAiRXh0ZXJuYWwgQW1wbGlmaWVyIik7CisJY2hpcC0+ZWFwZF9zd2l0Y2ggPSBzbmRfY3RsX2ZpbmRfaWQoY2hpcC0+Y2FyZCwgJmlkKTsKKyAgICAKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJaWYgKGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDEpIHsKKwkJdW5zaWduZWQgaW50IGlkMiA9IGNoaXAtPmFjOTdbQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVhdLT5pZCAmIDB4ZmZmZjsKKwkJaWYgKGlkMiA9PSAweDU5MmIgfHwgaWQyID09IDB4NTkyZCkgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY3M0Nnh4X2Zyb250X2R1cF9jdGwsIGNoaXApKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShjaGlwLT5hYzk3W0NTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYXSwKKwkJCQkJICAgICBBQzk3X0NTUl9BQ01PREUsIDB4MjAwKTsKKwkJfQorCX0KKwkvKiBkbyBzb3VuZGNhcmQgc3BlY2lmaWMgbWl4ZXIgc2V0dXAgKi8KKwlpZiAoY2hpcC0+bWl4ZXJfaW5pdCkgeworCQlzbmRfcHJpbnRkZCAoImNhbGxpbmcgY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTtcbiIpOworCQljaGlwLT5taXhlcl9pbml0KGNoaXApOworCX0KKyNlbmRpZgorCisgCS8qIHR1cm4gb24gYW1wbGlmaWVyICovCisJY2hpcC0+YW1wbGlmaWVyX2N0cmwoY2hpcCwgMSk7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUmF3TUlESSBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X21pZGlfcmVzZXQoY3M0Nnh4X3QgKmNoaXApCit7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgTUlEQ1JfTVJTVCk7CisJdWRlbGF5KDEwMCk7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfbWlkaV9pbnB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWNzNDZ4eF90ICpjaGlwID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPnVhcnRtIHw9IENTNDZYWF9NT0RFX0lOUFVUOworCWNoaXAtPm1pZGNyIHw9IE1JRENSX1JYRTsKKwljaGlwLT5taWRpX2lucHV0ID0gc3Vic3RyZWFtOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0NlhYX01PREVfT1VUUFVUKSkgeworCQlzbmRfY3M0Nnh4X21pZGlfcmVzZXQoY2hpcCk7CisJfSBlbHNlIHsKKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X21pZGlfaW5wdXRfY2xvc2Uoc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+bWlkY3IgJj0gfihNSURDUl9SWEUgfCBNSURDUl9SSUUpOworCWNoaXAtPm1pZGlfaW5wdXQgPSBOVUxMOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0NlhYX01PREVfT1VUUFVUKSkgeworCQlzbmRfY3M0Nnh4X21pZGlfcmVzZXQoY2hpcCk7CisJfSBlbHNlIHsKKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCX0KKwljaGlwLT51YXJ0bSAmPSB+Q1M0NlhYX01PREVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfbWlkaV9vdXRwdXRfb3BlbihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPnVhcnRtIHw9IENTNDZYWF9NT0RFX09VVFBVVDsKKwljaGlwLT5taWRjciB8PSBNSURDUl9UWEU7CisJY2hpcC0+bWlkaV9vdXRwdXQgPSBzdWJzdHJlYW07CisJaWYgKCEoY2hpcC0+dWFydG0gJiBDUzQ2WFhfTU9ERV9JTlBVVCkpIHsKKwkJc25kX2NzNDZ4eF9taWRpX3Jlc2V0KGNoaXApOworCX0gZWxzZSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfTUlEQ1IsIGNoaXAtPm1pZGNyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9taWRpX291dHB1dF9jbG9zZShzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwljaGlwLT5taWRjciAmPSB+KE1JRENSX1RYRSB8IE1JRENSX1RJRSk7CisJY2hpcC0+bWlkaV9vdXRwdXQgPSBOVUxMOworCWlmICghKGNoaXAtPnVhcnRtICYgQ1M0NlhYX01PREVfSU5QVVQpKSB7CisJCXNuZF9jczQ2eHhfbWlkaV9yZXNldChjaGlwKTsKKwl9IGVsc2UgeworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX01JRENSLCBjaGlwLT5taWRjcik7CisJfQorCWNoaXAtPnVhcnRtICY9IH5DUzQ2WFhfTU9ERV9PVVRQVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X21pZGlfaW5wdXRfdHJpZ2dlcihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IHVwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY3M0Nnh4X3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAodXApIHsKKwkJaWYgKChjaGlwLT5taWRjciAmIE1JRENSX1JJRSkgPT0gMCkgeworCQkJY2hpcC0+bWlkY3IgfD0gTUlEQ1JfUklFOworCQkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAtPm1pZGNyICYgTUlEQ1JfUklFKSB7CisJCQljaGlwLT5taWRjciAmPSB+TUlEQ1JfUklFOworCQkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9NSURDUiwgY2hpcC0+bWlkY3IpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jczQ2eHhfbWlkaV9vdXRwdXRfdHJpZ2dlcihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IHVwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY3M0Nnh4X3QgKmNoaXAgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHVwKSB7CisJCWlmICgoY2hpcC0+bWlkY3IgJiBNSURDUl9USUUpID09IDApIHsKKwkJCWNoaXAtPm1pZGNyIHw9IE1JRENSX1RJRTsKKwkJCS8qIGZpbGwgVUFSVCBGSUZPIGJ1ZmZlciBhdCBmaXJzdCwgYW5kIHR1cm4gVHggaW50ZXJydXB0cyBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCQkJd2hpbGUgKChjaGlwLT5taWRjciAmIE1JRENSX1RJRSkgJiYKKwkJCSAgICAgICAoc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9NSURTUikgJiBNSURTUl9UQkYpID09IDApIHsKKwkJCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXQoc3Vic3RyZWFtLCAmYnl0ZSwgMSkgIT0gMSkgeworCQkJCQljaGlwLT5taWRjciAmPSB+TUlEQ1JfVElFOworCQkJCX0gZWxzZSB7CisJCQkJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfTUlEV1AsIGJ5dGUpOworCQkJCX0KKwkJCX0KKwkJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfTUlEQ1IsIGNoaXAtPm1pZGNyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjaGlwLT5taWRjciAmIE1JRENSX1RJRSkgeworCQkJY2hpcC0+bWlkY3IgJj0gfk1JRENSX1RJRTsKKwkJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfTUlEQ1IsIGNoaXAtPm1pZGNyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc25kX3Jhd21pZGlfb3BzX3Qgc25kX2NzNDZ4eF9taWRpX291dHB1dCA9Cit7CisJLm9wZW4gPQkJc25kX2NzNDZ4eF9taWRpX291dHB1dF9vcGVuLAorCS5jbG9zZSA9CXNuZF9jczQ2eHhfbWlkaV9vdXRwdXRfY2xvc2UsCisJLnRyaWdnZXIgPQlzbmRfY3M0Nnh4X21pZGlfb3V0cHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgc25kX3Jhd21pZGlfb3BzX3Qgc25kX2NzNDZ4eF9taWRpX2lucHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfY3M0Nnh4X21pZGlfaW5wdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfY3M0Nnh4X21pZGlfaW5wdXRfY2xvc2UsCisJLnRyaWdnZXIgPQlzbmRfY3M0Nnh4X21pZGlfaW5wdXRfdHJpZ2dlciwKK307CisKK2ludCBfX2RldmluaXQgc25kX2NzNDZ4eF9taWRpKGNzNDZ4eF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcmF3bWlkaV90ICoqcnJhd21pZGkpCit7CisJc25kX3Jhd21pZGlfdCAqcm1pZGk7CisJaW50IGVycjsKKworCWlmIChycmF3bWlkaSkKKwkJKnJyYXdtaWRpID0gTlVMTDsKKwlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyhjaGlwLT5jYXJkLCAiQ1M0NlhYIiwgZGV2aWNlLCAxLCAxLCAmcm1pZGkpKSA8IDApCisJCXJldHVybiBlcnI7CisJc3RyY3B5KHJtaWRpLT5uYW1lLCAiQ1M0NlhYIik7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX2NzNDZ4eF9taWRpX291dHB1dCk7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZzbmRfY3M0Nnh4X21pZGlfaW5wdXQpOworCXJtaWRpLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfCBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfCBTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOworCXJtaWRpLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCWNoaXAtPnJtaWRpID0gcm1pZGk7CisJaWYgKHJyYXdtaWRpKQorCQkqcnJhd21pZGkgPSBOVUxMOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBnYW1lcG9ydCBpbnRlcmZhY2UKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKworc3RhdGljIHZvaWQgc25kX2NzNDZ4eF9nYW1lcG9ydF90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKKworCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0pTUFQsIDB4RkYpOyAgLy9vdXRiKGdhbWVwb3J0LT5pbywgMHhGRik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jczQ2eHhfZ2FtZXBvcnRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCWNzNDZ4eF90ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CisKKwlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybiAwKTsKKwlyZXR1cm4gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9KU1BUKTsgLy9pbmIoZ2FtZXBvcnQtPmlvKTsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X2dhbWVwb3J0X2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCAqYXhlcywgaW50ICpidXR0b25zKQoreworCWNzNDZ4eF90ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CisJdW5zaWduZWQganMxLCBqczIsIGpzdDsKKworCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuIDApOworCisJanMxID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9KU0MxKTsKKwlqczIgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0pTQzIpOworCWpzdCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfSlNQVCk7CisJCisJKmJ1dHRvbnMgPSAofmpzdCA+PiA0KSAmIDB4MEY7IAorCQorCWF4ZXNbMF0gPSAoKGpzMSAmIEpTQzFfWTFWX01BU0spID4+IEpTQzFfWTFWX1NISUZUKSAmIDB4RkZGRjsKKwlheGVzWzFdID0gKChqczEgJiBKU0MxX1gxVl9NQVNLKSA+PiBKU0MxX1gxVl9TSElGVCkgJiAweEZGRkY7CisJYXhlc1syXSA9ICgoanMyICYgSlNDMl9ZMlZfTUFTSykgPj4gSlNDMl9ZMlZfU0hJRlQpICYgMHhGRkZGOworCWF4ZXNbM10gPSAoKGpzMiAmIEpTQzJfWDJWX01BU0spID4+IEpTQzJfWDJWX1NISUZUKSAmIDB4RkZGRjsKKworCWZvcihqc3Q9MDtqc3Q8NDsrK2pzdCkKKwkJaWYoYXhlc1tqc3RdPT0weEZGRkYpIGF4ZXNbanN0XSA9IC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfZ2FtZXBvcnRfb3BlbihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgorCQlyZXR1cm4gMDsKKwljYXNlIEdBTUVQT1JUX01PREVfUkFXOgorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfZ2FtZXBvcnQoY3M0Nnh4X3QgKmNoaXApCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKworCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkNTNDZ4eCBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJZ2FtZXBvcnRfc2V0X2Rldl9wYXJlbnQoZ3AsICZjaGlwLT5wY2ktPmRldik7CisJZ2FtZXBvcnRfc2V0X3BvcnRfZGF0YShncCwgY2hpcCk7CisKKwlncC0+b3BlbiA9IHNuZF9jczQ2eHhfZ2FtZXBvcnRfb3BlbjsKKwlncC0+cmVhZCA9IHNuZF9jczQ2eHhfZ2FtZXBvcnRfcmVhZDsKKwlncC0+dHJpZ2dlciA9IHNuZF9jczQ2eHhfZ2FtZXBvcnRfdHJpZ2dlcjsKKwlncC0+Y29va2VkX3JlYWQgPSBzbmRfY3M0Nnh4X2dhbWVwb3J0X2Nvb2tlZF9yZWFkOworCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9KU0lPLCAweEZGKTsgLy8gPworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfSlNDVEwsIEpTQ1RMX1NQX01FRElVTV9TTE9XKTsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY3M0Nnh4X3JlbW92ZV9nYW1lcG9ydChjczQ2eHhfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Z2FtZXBvcnQpIHsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNoaXAtPmdhbWVwb3J0KTsKKwkJY2hpcC0+Z2FtZXBvcnQgPSBOVUxMOworCX0KK30KKyNlbHNlCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfZ2FtZXBvcnQoY3M0Nnh4X3QgKmNoaXApIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY3M0Nnh4X3JlbW92ZV9nYW1lcG9ydChjczQ2eHhfdCAqY2hpcCkgeyB9CisjZW5kaWYgLyogQ09ORklHX0dBTUVQT1JUICovCisKKy8qCisgKiAgcHJvYyBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgbG9uZyBzbmRfY3M0Nnh4X2lvX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHZvaWQgKmZpbGVfcHJpdmF0ZV9kYXRhLAorCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgcG9zKQoreworCWxvbmcgc2l6ZTsKKwlzbmRfY3M0Nnh4X3JlZ2lvbl90ICpyZWdpb24gPSAoc25kX2NzNDZ4eF9yZWdpb25fdCAqKWVudHJ5LT5wcml2YXRlX2RhdGE7CisJCisJc2l6ZSA9IGNvdW50OworCWlmIChwb3MgKyAoc2l6ZV90KXNpemUgPiByZWdpb24tPnNpemUpCisJCXNpemUgPSByZWdpb24tPnNpemUgLSBwb3M7CisJaWYgKHNpemUgPiAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXJfZnJvbWlvKGJ1ZiwgcmVnaW9uLT5yZW1hcF9hZGRyICsgcG9zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgc25kX2NzNDZ4eF9wcm9jX2lvX29wcyA9IHsKKwkucmVhZCA9IHNuZF9jczQ2eHhfaW9fcmVhZCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfcHJvY19pbml0KHNuZF9jYXJkX3QgKiBjYXJkLCBjczQ2eHhfdCAqY2hpcCkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKwlpbnQgaWR4OworCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKKwkJc25kX2NzNDZ4eF9yZWdpb25fdCAqcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKKwkJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2FyZCwgcmVnaW9uLT5uYW1lLCAmZW50cnkpKSB7CisJCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCQllbnRyeS0+Yy5vcHMgPSAmc25kX2NzNDZ4eF9wcm9jX2lvX29wczsKKwkJCWVudHJ5LT5zaXplID0gcmVnaW9uLT5zaXplOworCQkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUjsKKwkJfQorCX0KKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJY3M0Nnh4X2RzcF9wcm9jX2luaXQoY2FyZCwgY2hpcCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3Byb2NfZG9uZShjczQ2eHhfdCAqY2hpcCkKK3sKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJY3M0Nnh4X2RzcF9wcm9jX2RvbmUoY2hpcCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN0b3AgdGhlIGgvdworICovCitzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X2h3X3N0b3AoY3M0Nnh4X3QgKmNoaXApCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfUEZJRSk7CisJdG1wICY9IH4weDAwMDBmMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMDsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBkaXNhYmxlICovCisKKwl0bXAgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX0NJRSk7CisJdG1wICY9IH4weDAwMDAwMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMTsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfUENUTCk7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9QQ1RMLCB0bXAgJiAweDAwMDBmZmZmKTsKKworCS8qCisgICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgorCSAqLworCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfQ0NUTCk7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKKworCS8qCisgICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgorICAgICAgICAgKi8KKwlzbmRfY3M0Nnh4X3Jlc2V0KGNoaXApOworCisJc25kX2NzNDZ4eF9wcm9jX3N0b3AoY2hpcCk7CisKKwkvKgorCSAqICBQb3dlciBkb3duIHRoZSBQTEwuCisJICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIDApOworCisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCisJICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCXRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKK30KKworCitzdGF0aWMgaW50IHNuZF9jczQ2eHhfZnJlZShjczQ2eHhfdCAqY2hpcCkKK3sKKwlpbnQgaWR4OworCisJc25kX2Fzc2VydChjaGlwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChjaGlwLT5hY3RpdmVfY3RybCkKKwkJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CisKKwlzbmRfY3M0Nnh4X3JlbW92ZV9nYW1lcG9ydChjaGlwKTsKKworCWlmIChjaGlwLT5hbXBsaWZpZXJfY3RybCkKKwkJY2hpcC0+YW1wbGlmaWVyX2N0cmwoY2hpcCwgLWNoaXAtPmFtcGxpZmllcik7IC8qIGZvcmNlIHRvIG9mZiAqLworCQorCXNuZF9jczQ2eHhfcHJvY19kb25lKGNoaXApOworCisJaWYgKGNoaXAtPnJlZ2lvbi5pZHhbMF0ucmVzb3VyY2UpCisJCXNuZF9jczQ2eHhfaHdfc3RvcChjaGlwKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKKwkJc25kX2NzNDZ4eF9yZWdpb25fdCAqcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKKwkJaWYgKHJlZ2lvbi0+cmVtYXBfYWRkcikKKwkJCWlvdW5tYXAocmVnaW9uLT5yZW1hcF9hZGRyKTsKKwkJaWYgKHJlZ2lvbi0+cmVzb3VyY2UpIHsKKwkJCXJlbGVhc2VfcmVzb3VyY2UocmVnaW9uLT5yZXNvdXJjZSk7CisJCQlrZnJlZV9ub2NoZWNrKHJlZ2lvbi0+cmVzb3VyY2UpOworCQl9CisJfQorCWlmIChjaGlwLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOworCisJaWYgKGNoaXAtPmFjdGl2ZV9jdHJsKQorCQljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAtY2hpcC0+YW1wbGlmaWVyKTsKKwkKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJaWYgKGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlKSB7CisJCWNzNDZ4eF9kc3Bfc3Bvc19kZXN0cm95KGNoaXApOworCQljaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZSA9IE5VTEw7CisJfQorI2VuZGlmCisJCisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NzNDZ4eF9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwljczQ2eHhfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF9jczQ2eHhfZnJlZShjaGlwKTsKK30KKworLyoKKyAqICBpbml0aWFsaXplIGNoaXAKKyAqLworc3RhdGljIGludCBzbmRfY3M0Nnh4X2NoaXBfaW5pdChjczQ2eHhfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dDsKKworCS8qIAorCSAqICBGaXJzdCwgYmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZSBQTEwgc3RhcnRzCisgICAgICAgICAqICBvdXQgaW4gYSBrbm93biBzdGF0ZSwgYW5kIGJsYXN0IHRoZSBtYXN0ZXIgc2VyaWFsIHBvcnQgY29udHJvbCByZWdpc3RlcgorICAgICAgICAgKiAgdG8gemVybyBzbyB0aGF0IHRoZSBzZXJpYWwgcG9ydHMgYWxzbyBzdGFydCBvdXQgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQ0xLQ1IxLCAwKTsKKyAgICAgICAgc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJNQzEsIDApOworCisJLyoKKwkgKiAgSWYgd2UgYXJlIGluIEFDOTcgbW9kZSwgdGhlbiB3ZSBtdXN0IHNldCB0aGUgcGFydCB0byBhIGhvc3QgY29udHJvbGxlZAorICAgICAgICAgKiAgQUMtbGluay4gIE90aGVyd2lzZSwgd2Ugd29uJ3QgYmUgYWJsZSB0byBicmluZyB1cCB0aGUgbGluay4KKyAgICAgICAgICovICAgICAgICAKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ0hJUF9UWVBFXzJfMCB8IAorCQkJICAgU0VSQUNDX1RXT19DT0RFQ1MpOwkvKiAyLjAwIGR1YWwgY29kZWNzICovCisJLyogc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ0hJUF9UWVBFXzJfMCk7ICovIC8qIDIuMDAgY29kZWMgKi8KKyNlbHNlCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ0hJUF9UWVBFXzFfMDMpOyAvKiAxLjAzIGNvZGVjICovCisjZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKKyAgICAgICAgICogIHNwZWMpIGFuZCB0aGVuIGRyaXZlIGl0IGhpZ2guICBUaGlzIGlzIGRvbmUgZm9yIG5vbiBBQzk3IG1vZGVzIHNpbmNlCisgICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBsb2dpYyBleHRlcm5hbCB0byB0aGUgQ1M0NjF4IHRoYXQgdXNlcyB0aGUgQVJTVCMgbGluZQorICAgICAgICAgKiAgZm9yIGEgcmVzZXQuCisgICAgICAgICAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIDApOworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMMiwgMCk7CisjZW5kaWYKKwl1ZGVsYXkoNTApOworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX1JTVE4pOworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMMiwgQUNDVExfUlNUTik7CisjZW5kaWYKKyAgICAKKwkvKgorCSAqICBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaGVyZSBpcyB0byBlbmFibGUgc3luYyBnZW5lcmF0aW9uLiAgQXMgc29vbgorCSAqICBhcyB3ZSBzdGFydCByZWNlaXZpbmcgYml0IGNsb2NrLCB3ZSdsbCBzdGFydCBwcm9kdWNpbmcgdGhlIFNZTkMKKwkgKiAgc2lnbmFsLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQ0NUTDIsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKyNlbmRpZgorCisJLyoKKwkgKiAgTm93IHdhaXQgZm9yIGEgc2hvcnQgd2hpbGUgdG8gYWxsb3cgdGhlIEFDOTcgcGFydCB0byBzdGFydAorCSAqICBnZW5lcmF0aW5nIGJpdCBjbG9jayAoc28gd2UgZG9uJ3QgdHJ5IHRvIHN0YXJ0IHRoZSBQTEwgd2l0aG91dCBhbgorCSAqICBpbnB1dCBjbG9jaykuCisJICovCisJbWRlbGF5KDEwKTsKKworCS8qCisJICogIFNldCB0aGUgc2VyaWFsIHBvcnQgdGltaW5nIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQKKwkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgY2lyY3VpdCBnZXRzIGl0cyBjbG9jayBmcm9tIHRoZSBjb3JyZWN0IHBsYWNlLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcpOworCisJLyoKKwkgKiAgV3JpdGUgdGhlIHNlbGVjdGVkIGNsb2NrIGNvbnRyb2wgc2V0dXAgdG8gdGhlIGhhcmR3YXJlLiAgRG8gbm90IHR1cm4gb24KKwkgKiAgU1dDRSB5ZXQgKGlmIHJlcXVlc3RlZCksIHNvIHRoYXQgdGhlIGRldmljZXMgY2xvY2tlZCBieSB0aGUgb3V0cHV0IG9mCisJICogIFBMTCBhcmUgbm90IGNsb2NrZWQgdW50aWwgdGhlIFBMTCBpcyBzdGFibGUuCisJICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9QTExDQywgUExMQ0NfTFBGXzEwNTBfMjc4MF9LSFogfCBQTExDQ19DRFJfNzNfMTA0X01IWik7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9QTExNLCAweDNhKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMiwgQ0xLQ1IyX1BESVZTXzgpOworCisJLyoKKwkgKiAgUG93ZXIgdXAgdGhlIFBMTC4KKwkgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgQ0xLQ1IxX1BMTFApOworCisJLyoKKyAgICAgICAgICogIFdhaXQgdW50aWwgdGhlIFBMTCBoYXMgc3RhYmlsaXplZC4KKwkgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7IC8qIDEwMG1zICovCisKKwkvKgorCSAqICBUdXJuIG9uIGNsb2NraW5nIG9mIHRoZSBjb3JlIHNvIHRoYXQgd2UgY2FuIHNldHVwIHRoZSBzZXJpYWwgcG9ydHMuCisJICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIENMS0NSMV9QTExQIHwgQ0xLQ1IxX1NXQ0UpOworCisJLyoKKwkgKiBFbmFibGUgRklGTyAgSG9zdCBCeXBhc3MKKwkgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkJDRiwgU0VSQkNGX0hCUCk7CisKKwkvKgorCSAqICBGaWxsIHRoZSBzZXJpYWwgcG9ydCBGSUZPcyB3aXRoIHNpbGVuY2UuCisJICovCisJc25kX2NzNDZ4eF9jbGVhcl9zZXJpYWxfRklGT3MoY2hpcCk7CisKKwkvKgorCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IEZJRk8gcG9pbnRlciB0byB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoZSBGSUZPLgorCSAqLworCS8qIHNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSQlNQLCAwKTsgKi8KKworCS8qCisJICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIHRvIHRoZSBwYXJ0LiAgVGhlIG1hc3RlcgorCSAqICBlbmFibGUgYml0IGlzIG5vdCBzZXQgdW50aWwgYWxsIG90aGVyIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbi4KKwkgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkMxLCBTRVJDMV9TTzFGX0FDOTcgfCBTRVJDMV9TTzFFTik7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJDMiwgU0VSQzJfU0kxRl9BQzk3IHwgU0VSQzFfU08xRU4pOworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcgfCBTRVJNQzFfTVNQRSk7CisKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkM3LCBTRVJDN19BU0RJMkVOKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkMzLCAwKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkM0LCAwKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkM1LCAwKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX1NFUkM2LCAxKTsKKyNlbmRpZgorCisJbWRlbGF5KDUpOworCisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBjb2RlYyByZWFkeSBzaWduYWwgZnJvbSB0aGUgQUM5NyBjb2RlYy4KKwkgKi8KKwl0aW1lb3V0ID0gMTUwOworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCS8qCisJCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgd2UndmUgc2VlbiBhIENPREVDIFJFQURZCisJCSAqICBzaWduYWwgZnJvbSB0aGUgQUM5NyBjb2RlYy4KKwkJICovCisJCWlmIChzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDU1RTKSAmIEFDU1RTX0NSRFkpCisJCQlnb3RvIG9rMTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KChIWis5OSkvMTAwKTsKKwl9CisKKworCXNuZF9wcmludGsoImNyZWF0ZSAtIG5ldmVyIHJlYWQgY29kZWMgcmVhZHkgZnJvbSBBQyc5N1xuIik7CisJc25kX3ByaW50aygiaXQgaXMgbm90IHByb2JhYmx5IGJ1ZywgdHJ5IHRvIHVzZSBDUzQyMzYgZHJpdmVyXG4iKTsKKwlyZXR1cm4gLUVJTzsKKyBvazE6CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXsKKwkJaW50IGNvdW50OworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxNTA7IGNvdW50KyspIHsKKwkJCS8qIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4gKi8KKwkJCXVkZWxheSgyNSk7CisgICAgICAgIAorCQkJaWYgKHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMyKSAmIEFDU1RTX0NSRFkpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgTWFrZSBzdXJlIENPREVDIGlzIFJFQURZLgorCQkgKi8KKwkJaWYgKCEoc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NUUzIpICYgQUNTVFNfQ1JEWSkpCisJCQlzbmRfcHJpbnRkZCgiY3M0Nnh4OiBuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBzZWNvbmRhcnkgQUMnOTdcbiIpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiAgQXNzZXJ0IHRoZSB2YWlkIGZyYW1lIHNpZ25hbCBzbyB0aGF0IHdlIGNhbiBzdGFydCBzZW5kaW5nIGNvbW1hbmRzCisJICogIHRvIHRoZSBBQzk3IGNvZGVjLgorCSAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7CisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNDVEwyLCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOworI2VuZGlmCisKKworCS8qCisJICogIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzIGFuZCA0IGFzIHZhbGlkLCBtZWFuaW5nIHRoYXQKKwkgKiAgdGhlIGNvZGVjIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQy1saW5rLgorCSAqLworCXRpbWVvdXQgPSAxNTA7CisJd2hpbGUgKHRpbWVvdXQtLSA+IDApIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIGlucHV0IHNsb3QgdmFsaWQgcmVnaXN0ZXIgYW5kIHNlZSBpZiBpbnB1dCBzbG90cyAzIGFuZAorCQkgKiAgNCBhcmUgdmFsaWQgeWV0LgorCQkgKi8KKwkJaWYgKChzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDSVNWKSAmIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpID09IChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpCisJCQlnb3RvIG9rMjsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KChIWis5OSkvMTAwKTsKKwl9CisKKyNpZm5kZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXNuZF9wcmludGsoImNyZWF0ZSAtIG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7CisJcmV0dXJuIC1FSU87CisjZWxzZQorCS8qIFRoaXMgbWF5IGhhcHBlbiBvbiBhIGNvbGQgYm9vdCB3aXRoIGEgVGVycmF0ZWMgU2lYUGFjayA1LjEuCisJICAgUmVsb2FkaW5nIHRoZSBkcml2ZXIgbWF5IGhlbHAsIGlmIHRoZXJlJ3Mgb3RoZXIgc291bmRjYXJkcyAKKwkgICB3aXRoIHRoZSBzYW1lIHByb2JsZW0gSSB3b3VsZCBsaWtlIHRvIGtub3cuIChCZW5ueSkgKi8KKworCXNuZF9wcmludGsoIkVSUk9SOiBzbmQtY3M0Nnh4OiBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOworCXNuZF9wcmludGsoIiAgICAgICBUcnkgcmVsb2FkaW5nIHRoZSBBTFNBIGRyaXZlciwgaWYgeW91IGZpbmQgc29tZXRoaW5nXG4iKTsKKyAgICAgICAgc25kX3ByaW50aygiICAgICAgIGJyb2tlbiBvciBub3Qgd29ya2luZyBvbiB5b3VyIHNvdW5kY2FyZCB1cG9uXG4iKTsKKwlzbmRfcHJpbnRrKCIgICAgICAgdGhpcyBtZXNzYWdlIHBsZWFzZSByZXBvcnQgdG8gYWxzYS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIpOworCisJcmV0dXJuIC1FSU87CisjZW5kaWYKKyBvazI6CisKKwkvKgorCSAqICBOb3csIGFzc2VydCB2YWxpZCBmcmFtZSBhbmQgdGhlIHNsb3QgMyBhbmQgNCB2YWxpZCBiaXRzLiAgVGhpcyB3aWxsCisJICogIGNvbW1lbnNlIHRoZSB0cmFuc2ZlciBvZiBkaWdpdGFsIGF1ZGlvIGRhdGEgdG8gdGhlIEFDOTcgY29kZWMuCisJICovCisKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDT1NWLCBBQ09TVl9TTFYzIHwgQUNPU1ZfU0xWNCk7CisKKworCS8qCisJICogIFBvd2VyIGRvd24gdGhlIERBQyBhbmQgQURDLiAgV2Ugd2lsbCBwb3dlciB0aGVtIHVwIChpZikgd2hlbiB3ZSBuZWVkCisJICogIHRoZW0uCisJICovCisJLyogc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9BQzk3X1BPV0VSRE9XTiwgMHgzMDApOyAqLworCisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCisJICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCS8qIHRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsgKi8KKwkvKiBzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogIHN0YXJ0IGFuZCBsb2FkIERTUCAKKyAqLworaW50IF9fZGV2aW5pdCBzbmRfY3M0Nnh4X3N0YXJ0X2RzcChjczQ2eHhfdCAqY2hpcCkKK3sJCisJdW5zaWduZWQgaW50IHRtcDsKKwkvKgorCSAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgorCSAqLworCXNuZF9jczQ2eHhfcmVzZXQoY2hpcCk7CisJLyoKKwkgKiAgRG93bmxvYWQgdGhlIGltYWdlIHRvIHRoZSBwcm9jZXNzb3IuCisJICovCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorI2lmIDAKKwlpZiAoY3M0Nnh4X2RzcF9sb2FkX21vZHVsZShjaGlwLCAmY3djZW1iODBfbW9kdWxlKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW1hZ2UgZG93bmxvYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYKKworCWlmIChjczQ2eHhfZHNwX2xvYWRfbW9kdWxlKGNoaXAsICZjd2M0NjMwX21vZHVsZSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yIFtjd2M0NjMwXVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjczQ2eHhfZHNwX2xvYWRfbW9kdWxlKGNoaXAsICZjd2Nhc3luY19tb2R1bGUpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbWFnZSBkb3dubG9hZCBlcnJvciBbY3djYXN5bmNdXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNzNDZ4eF9kc3BfbG9hZF9tb2R1bGUoY2hpcCwgJmN3Y3Nub29wX21vZHVsZSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yIFtjd2Nzbm9vcF1cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoY3M0Nnh4X2RzcF9sb2FkX21vZHVsZShjaGlwLCAmY3djYmluaGFja19tb2R1bGUpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbWFnZSBkb3dubG9hZCBlcnJvciBbY3djYmluaGFja11cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoY3M0Nnh4X2RzcF9sb2FkX21vZHVsZShjaGlwLCAmY3djZG1hX21vZHVsZSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yIFtjd2NkbWFdXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNzNDZ4eF9kc3Bfc2NiX2FuZF90YXNrX2luaXQoY2hpcCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKyNlbHNlCisJLyogb2xkIGltYWdlICovCisJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWRfaW1hZ2UoY2hpcCkgPCAwKSB7CisJCXNuZF9wcmludGsoImltYWdlIGRvd25sb2FkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfUENUTCk7CisJY2hpcC0+cGxheV9jdGwgPSB0bXAgJiAweGZmZmYwMDAwOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7CisjZW5kaWYKKworCS8qCisgICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgorCSAqLworCXRtcCA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCBCQTFfQ0NUTCk7CisJY2hpcC0+Y2FwdC5jdGwgPSB0bXAgJiAweDAwMDBmZmZmOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7CisKKwltZGVsYXkoNSk7CisKKwlzbmRfY3M0Nnh4X3NldF9wbGF5X3NhbXBsZV9yYXRlKGNoaXAsIDgwMDApOworCXNuZF9jczQ2eHhfc2V0X2NhcHR1cmVfc2FtcGxlX3JhdGUoY2hpcCwgODAwMCk7CisKKwlzbmRfY3M0Nnh4X3Byb2Nfc3RhcnQoY2hpcCk7CisKKwkvKgorCSAqICBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgcGFydC4KKwkgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsKKyAgICAgICAgCisJdG1wID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9QRklFKTsKKwl0bXAgJj0gfjB4MDAwMGYwM2Y7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIEJBMV9QRklFLCB0bXApOwkvKiBwbGF5YmFjayBpbnRlcnJ1cHQgZW5hYmxlICovCisKKwl0bXAgPSBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwgQkExX0NJRSk7CisJdG1wICY9IH4weDAwMDAwMDNmOworCXRtcCB8PSAgMHgwMDAwMDAwMTsKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZW5hYmxlICovCisJCisjaWZuZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwkvKiBzZXQgdGhlIGF0dGVudWF0aW9uIHRvIDBkQiAqLyAKKwlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgQkExX1BWT0wsIDB4ODAwMDgwMDApOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCBCQTFfQ1ZPTCwgMHg4MDAwODAwMCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglBTVAgY29udHJvbCAtIG51bGwgQU1QCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFtcF9ub25lKGNzNDZ4eF90ICpjaGlwLCBpbnQgY2hhbmdlKQorewkKK30KKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKK3N0YXRpYyBpbnQgdm95ZXRyYV9zZXR1cF9lYXBkX3Nsb3QoY3M0Nnh4X3QgKmNoaXApCit7CisJCisJdTMyIGlkeCwgdmFsaWRfc2xvdHMsdG1wLHBvd2VyZG93biA9IDA7CisJdTE2IG1vZGVtX3Bvd2VyLHBpbl9jb25maWcsbG9naWNfdHlwZTsKKworCXNuZF9wcmludGRkICgiY3M0Nnh4OiBjczQ2eHhfc2V0dXBfZWFwZF9zbG90KCkrXG4iKTsKKworCS8qCisJICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdAorCSAqICBvciB0aGV5IHdpbGwgbm90IHJlc3BvbmQuCisJICovCisJdG1wID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9DTEtDUjEpOworCisJaWYgKCEodG1wICYgQ0xLQ1IxX1NXQ0UpKSB7CisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7CisJCXBvd2VyZG93biA9IDE7CisJfQorCisJLyoKKwkgKiBDbGVhciBQUkEuICBUaGUgQm9uem8gY2hpcCB3aWxsIGJlIHVzZWQgZm9yIEdQSU8gbm90IGZvciBtb2RlbQorCSAqIHN0dWZmLgorCSAqLworCWlmKGNoaXAtPm5yX2FjOTdfY29kZWNzICE9IDIpIHsKKwkJc25kX3ByaW50ayAoS0VSTl9FUlIgImNzNDZ4eDogY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpIC0gbm8gc2Vjb25kYXJ5IGNvZGVjIGNvbmZpZ3VyZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltb2RlbV9wb3dlciA9IHNuZF9jczQ2eHhfY29kZWNfcmVhZCAoY2hpcCwgCisJCQkJCSAgICAgQUM5N19FWFRFTkRFRF9NU1RBVFVTLAorCQkJCQkgICAgIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpOworCW1vZGVtX3Bvd2VyICY9MHhGRUZGOworCisJc25kX2NzNDZ4eF9jb2RlY193cml0ZShjaGlwLCAKKwkJCSAgICAgICBBQzk3X0VYVEVOREVEX01TVEFUVVMsIG1vZGVtX3Bvd2VyLAorCQkJICAgICAgIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpOworCisJLyoKKwkgKiBTZXQgR1BJTyBwaW4ncyA3IGFuZCA4IHNvIHRoYXQgdGhleSBhcmUgY29uZmlndXJlZCBmb3Igb3V0cHV0LgorCSAqLworCXBpbl9jb25maWcgPSBzbmRfY3M0Nnh4X2NvZGVjX3JlYWQgKGNoaXAsIAorCQkJCQkgICAgQUM5N19HUElPX0NGRywKKwkJCQkJICAgIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpOworCXBpbl9jb25maWcgJj0weDI3RjsKKworCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgCisJCQkgICAgICAgQUM5N19HUElPX0NGRywgcGluX2NvbmZpZywKKwkJCSAgICAgICBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKTsKKyAgICAKKwkvKgorCSAqIFNldCBHUElPIHBpbidzIDcgYW5kIDggc28gdGhhdCB0aGV5IGFyZSBjb21wYXRpYmxlIHdpdGggQ01PUyBsb2dpYy4KKwkgKi8KKworCWxvZ2ljX3R5cGUgPSBzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY2hpcCwgQUM5N19HUElPX1BPTEFSSVRZLAorCQkJCQkgICBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKTsKKwlsb2dpY190eXBlICY9MHgyN0Y7IAorCisJc25kX2NzNDZ4eF9jb2RlY193cml0ZSAoY2hpcCwgQUM5N19HUElPX1BPTEFSSVRZLCBsb2dpY190eXBlLAorCQkJCUNTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpOworCisJdmFsaWRfc2xvdHMgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDT1NWKTsKKwl2YWxpZF9zbG90cyB8PSAweDIwMDsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDT1NWLCB2YWxpZF9zbG90cyk7CisKKwlpZiAoIGNzNDZ4eF93YWl0X2Zvcl9maWZvKGNoaXAsMSkgKSB7CisJICBzbmRfcHJpbnRkZCgiRklGTyBpcyBidXN5XG4iKTsKKwkgIAorCSAgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBGaWxsIHNsb3RzIDEyIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBHUElPIHBpbnMuIAorCSAqLworCWZvcihpZHggPSAweDkwOyBpZHggPD0gMHg5RjsgaWR4KyspIHsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgZmlmbyBzbyB0aGF0IGJpdHMgNyBhbmQgOCBhcmUgb24uCisJCSAqCisJCSAqIFJlbWVtYmVyIHRoYXQgdGhlIEdQSU8gcGlucyBpbiBib256byBhcmUgc2hpZnRlZCBieSA0IGJpdHMgdG8KKwkJICogdGhlIGxlZnQuICAweDE4MDAgY29ycmVzcG9uZHMgdG8gYml0cyA3IGFuZCA4LgorCQkgKi8KKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJCV1AsIDB4MTgwMCk7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZQorCQkgKi8KKwkJaWYgKCBjczQ2eHhfd2FpdF9mb3JfZmlmbyhjaGlwLDIwMCkgKSB7CisJCQlzbmRfcHJpbnRkZCgiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsaWR4KTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICAgICAgICAgIAorCQkvKgorCQkgKiBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgRklGTyBpbmRleC4KKwkJICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfU0VSQkFELCBpZHgpOworICAgICAgCisJCS8qCisJCSAqIFRlbGwgdGhlIHNlcmlhbCBwb3J0IHRvIGxvYWQgdGhlIG5ldyB2YWx1ZSBpbnRvIHRoZSBGSUZPIGxvY2F0aW9uLgorCQkgKi8KKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9TRVJCQ00sIFNFUkJDTV9XUkMpOworCX0KKworCS8qIHdhaXQgZm9yIGxhc3QgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCWNzNDZ4eF93YWl0X2Zvcl9maWZvKGNoaXAsMjAwKTsKKworCS8qCisJICogIE5vdywgaWYgd2UgcG93ZXJlZCB1cCB0aGUgZGV2aWNlcywgdGhlbiBwb3dlciB0aGVtIGJhY2sgZG93biBhZ2Fpbi4KKwkgKiAgVGhpcyBpcyBraW5kYSB1Z2x5LCBidXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKwkgKi8KKwlpZiAocG93ZXJkb3duKQorCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0NMS0NSMSwgdG1wKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKglDcnlzdGFsIEVBUEQgbW9kZQorICovCisgCitzdGF0aWMgdm9pZCBhbXBfdm95ZXRyYShjczQ2eHhfdCAqY2hpcCwgaW50IGNoYW5nZSkKK3sKKwkvKiBNYW5hZ2UgdGhlIEVBUEQgYml0IG9uIHRoZSBDcnlzdGFsIDQyOTcgCisJICAgYW5kIHRoZSBBbmFsb2cgQUQxODg1ICovCisJICAgCisjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCWludCBvbGQgPSBjaGlwLT5hbXBsaWZpZXI7CisjZW5kaWYKKwlpbnQgb3ZhbCwgdmFsOworCQorCWNoaXAtPmFtcGxpZmllciArPSBjaGFuZ2U7CisJb3ZhbCA9IHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCBBQzk3X1BPV0VSRE9XTiwKKwkJCQkgICAgIENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKTsKKwl2YWwgPSBvdmFsOworCWlmIChjaGlwLT5hbXBsaWZpZXIpIHsKKwkJLyogVHVybiB0aGUgRUFQRCBhbXAgb24gKi8KKwkJdmFsIHw9IDB4ODAwMDsKKwl9IGVsc2UgeworCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KKwkJdmFsICY9IH4weDgwMDA7CisJfQorCWlmICh2YWwgIT0gb3ZhbCkgeworCQlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIEFDOTdfUE9XRVJET1dOLCB2YWwsCisJCQkJICAgICAgIENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKTsKKwkJaWYgKGNoaXAtPmVhcGRfc3dpdGNoKQorCQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkJICAgICAgICZjaGlwLT5lYXBkX3N3aXRjaC0+aWQpOworCX0KKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlpZiAoY2hpcC0+YW1wbGlmaWVyICYmICFvbGQpIHsKKwkJdm95ZXRyYV9zZXR1cF9lYXBkX3Nsb3QoY2hpcCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGhlcmN1bGVzX2luaXQoY3M0Nnh4X3QgKmNoaXApIAoreworCS8qIGRlZmF1bHQ6IEFNUCBvZmYsIGFuZCBTUERJRiBpbnB1dCBvcHRpY2FsICovCisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCBFR1BJT0RSX0dQT0UwKTsKKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPUFRSLCBFR1BJT0RSX0dQT0UwKTsKK30KKworCisvKgorICoJR2FtZSBUaGVhdHJlIFhQIGNhcmQgLSBFR1BJT1syXSBpcyB1c2VkIHRvIGVuYWJsZSB0aGUgZXh0ZXJuYWwgYW1wLgorICovIAorc3RhdGljIHZvaWQgYW1wX2hlcmN1bGVzKGNzNDZ4eF90ICpjaGlwLCBpbnQgY2hhbmdlKQoreworCWludCBvbGQgPSBjaGlwLT5hbXBsaWZpZXI7CisJaW50IHZhbDEgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0VHUElPRFIpOworCWludCB2YWwyID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9FR1BJT1BUUik7CisKKwljaGlwLT5hbXBsaWZpZXIgKz0gY2hhbmdlOworCWlmIChjaGlwLT5hbXBsaWZpZXIgJiYgIW9sZCkgeworCQlzbmRfcHJpbnRkZCAoIkhlcmN1bGVzIGFtcGxpZmllciBPTlxuIik7CisKKwkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCAKKwkJCQkgICBFR1BJT0RSX0dQT0UyIHwgdmFsMSk7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPUFRSLCAKKwkJCQkgICBFR1BJT1BUUl9HUFBUMiB8IHZhbDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCisJfSBlbHNlIGlmIChvbGQgJiYgIWNoaXAtPmFtcGxpZmllcikgeworCQlzbmRfcHJpbnRkZCAoIkhlcmN1bGVzIGFtcGxpZmllciBPRkZcbiIpOworCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPRFIsICB2YWwxICYgfkVHUElPRFJfR1BPRTIpOyAvKiBkaXNhYmxlICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9QVFIsIHZhbDIgJiB+RUdQSU9QVFJfR1BQVDIpOyAvKiBkaXNhYmxlICovCisJfQorfQorCitzdGF0aWMgdm9pZCB2b3lldHJhX21peGVyX2luaXQgKGNzNDZ4eF90ICpjaGlwKQoreworCXNuZF9wcmludGRkICgiaW5pdGlhbGl6aW5nIFZveWV0cmEgbWl4ZXJcbiIpOworCisJLyogRW5hYmxlIFNQRElGIG91dCAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9EUiwgRUdQSU9EUl9HUE9FMCk7CisJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT1BUUiwgRUdQSU9EUl9HUE9FMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhlcmN1bGVzX21peGVyX2luaXQgKGNzNDZ4eF90ICpjaGlwKQoreworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJc25kX2NhcmRfdCAqY2FyZCA9IGNoaXAtPmNhcmQ7CisjZW5kaWYKKworCS8qIHNldCBFR1BJTyB0byBkZWZhdWx0ICovCisJaGVyY3VsZXNfaW5pdChjaGlwKTsKKworCXNuZF9wcmludGRkICgiaW5pdGlhbGl6aW5nIEhlcmN1bGVzIG1peGVyXG4iKTsKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKwlmb3IgKGlkeCA9IDAgOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9oZXJjdWxlc19jb250cm9scyk7IGlkeCsrKSB7CisJCXNuZF9rY29udHJvbF90ICprY3RsOworCisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZXJjdWxlc19jb250cm9sc1tpZHhdLCBjaGlwKTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkgPCAwKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJjczQ2eHg6IGZhaWxlZCB0byBpbml0aWFsaXplIEhlcmN1bGVzIG1peGVyICglZClcbiIsZXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCit9CisKKworI2lmIDAKKy8qCisgKglVbnRlc3RlZAorICovCisgCitzdGF0aWMgdm9pZCBhbXBfdm95ZXRyYV80Mjk0KGNzNDZ4eF90ICpjaGlwLCBpbnQgY2hhbmdlKQoreworCWNoaXAtPmFtcGxpZmllciArPSBjaGFuZ2U7CisKKwlpZiAoY2hpcC0+YW1wbGlmaWVyKSB7CisJCS8qIFN3aXRjaCB0aGUgR1BJTyBwaW5zIDcgYW5kIDggdG8gb3BlbiBkcmFpbiAqLworCQlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIDB4NEMsCisJCQkJICAgICAgIHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCAweDRDKSAmIDB4RkU3Rik7CisJCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgMHg0RSwKKwkJCQkgICAgICAgc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIDB4NEUpIHwgMHgwMTgwKTsKKwkJLyogTm93IHdha2UgdGhlIEFNUCAodGhpcyBtaWdodCBiZSBiYWNrd2FyZHMpICovCisJCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgMHg1NCwKKwkJCQkgICAgICAgc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIDB4NTQpICYgfjB4MDE4MCk7CisJfSBlbHNlIHsKKwkJc25kX2NzNDZ4eF9jb2RlY193cml0ZShjaGlwLCAweDU0LAorCQkJCSAgICAgICBzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY2hpcCwgMHg1NCkgfCAweDAxODApOworCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBwaWl4NCBwY2kgaWRzCisgKi8KKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9JTlRFTAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMIDB4ODA4NgorI2VuZGlmIC8qIFBDSV9WRU5ET1JfSURfSU5URUwgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMyAweDcxMTMKKyNlbmRpZiAvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMyAqLworCisvKgorICoJSGFuZGxlIHRoZSBDTEtSVU4gb24gYSB0aGlua3BhZC4gV2UgbXVzdCBkaXNhYmxlIENMS1JVTiBzdXBwb3J0CisgKgl3aGVuZXZlciB3ZSBuZWVkIHRvIGJlYXQgb24gdGhlIGNoaXAuCisgKgorICoJVGhlIG9yaWdpbmFsIGlkZWEgYW5kIGNvZGUgZm9yIHRoaXMgaGFjayBjb21lcyBmcm9tIERhdmlkIEthaXNlciBhdAorICoJTGludXhjYXJlLiBQZXJoYXBzIG9uZSBkYXkgQ3J5c3RhbCB3aWxsIGRvY3VtZW50IHRoZWlyIGNoaXBzIHdlbGwKKyAqCWVub3VnaCB0byBtYWtlIHRoZW0gdXNlZnVsLgorICovCisgCitzdGF0aWMgdm9pZCBjbGtydW5faGFjayhjczQ2eHhfdCAqY2hpcCwgaW50IGNoYW5nZSkKK3sKKwl1MTYgY29udHJvbCwgbnZhbDsKKwkKKwlpZiAoY2hpcC0+YWNwaV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2hpcC0+YW1wbGlmaWVyICs9IGNoYW5nZTsKKwkKKwkvKiBSZWFkIEFDUEkgcG9ydCAqLwkKKwludmFsID0gY29udHJvbCA9IGludyhjaGlwLT5hY3BpX3BvcnQgKyAweDEwKTsKKworCS8qIEZsaXAgQ0xLUlVOIG9mZiB3aGlsZSBydW5uaW5nICovCisJaWYgKCEgY2hpcC0+YW1wbGlmaWVyKQorCQludmFsIHw9IDB4MjAwMDsKKwllbHNlCisJCW52YWwgJj0gfjB4MjAwMDsKKwlpZiAobnZhbCAhPSBjb250cm9sKQorCQlvdXR3KG52YWwsIGNoaXAtPmFjcGlfcG9ydCArIDB4MTApOworfQorCisJCisvKgorICogZGV0ZWN0IGludGVsIHBpaXg0CisgKi8KK3N0YXRpYyB2b2lkIGNsa3J1bl9pbml0KGNzNDZ4eF90ICpjaGlwKQoreworCXU4IHBwOworCisJY2hpcC0+YWNwaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCWlmIChjaGlwLT5hY3BpX2RldiA9PSBOVUxMKQorCQlyZXR1cm47CQkvKiBOb3QgYSB0aGlua3BhZCB0aGF0cyBmb3Igc3VyZSAqLworCisJLyogRmluZCB0aGUgY29udHJvbCBwb3J0ICovCQkKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5hY3BpX2RldiwgMHg0MSwgJnBwKTsKKwljaGlwLT5hY3BpX3BvcnQgPSBwcCA8PCA4OworfQorCisKKy8qCisgKiBDYXJkIHN1YmlkIHRhYmxlCisgKi8KKyAKK3N0cnVjdCBjc19jYXJkX3R5cGUKK3sKKwl1MTYgdmVuZG9yOworCXUxNiBpZDsKKwljaGFyICpuYW1lOworCXZvaWQgKCppbml0KShjczQ2eHhfdCAqKTsKKwl2b2lkICgqYW1wKShjczQ2eHhfdCAqLCBpbnQpOworCXZvaWQgKCphY3RpdmUpKGNzNDZ4eF90ICosIGludCk7CisJdm9pZCAoKm1peGVyX2luaXQpKGNzNDZ4eF90ICopOworfTsKKworc3RhdGljIHN0cnVjdCBjc19jYXJkX3R5cGUgX19kZXZpbml0ZGF0YSBjYXJkc1tdID0geworCXsKKwkJLnZlbmRvciA9IDB4MTQ4OSwKKwkJLmlkID0gMHg3MDAxLAorCQkubmFtZSA9ICJHZW5pdXMgU291bmRtYWtlciAxMjggdmFsdWUiLAorCQkvKiBub3RoaW5nIHNwZWNpYWwgKi8KKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4NTA1MywKKwkJLmlkID0gMHgzMzU3LAorCQkubmFtZSA9ICJWb3lldHJhIiwKKwkJLmFtcCA9IGFtcF92b3lldHJhLAorCQkubWl4ZXJfaW5pdCA9IHZveWV0cmFfbWl4ZXJfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTA3MSwKKwkJLmlkID0gMHg2MDAzLAorCQkubmFtZSA9ICJNaXRhYyBNSTYwMjAvMjEiLAorCQkuYW1wID0gYW1wX3ZveWV0cmEsCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDE0QUYsCisJCS5pZCA9IDB4MDA1MCwKKwkJLm5hbWUgPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcCA9IGFtcF9oZXJjdWxlcywKKwkJLm1peGVyX2luaXQgPSBoZXJjdWxlc19taXhlcl9pbml0LAorCX0sCisJeworCQkudmVuZG9yID0gMHgxNjgxLAorCQkuaWQgPSAweDAwNTAsCisJCS5uYW1lID0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAgPSBhbXBfaGVyY3VsZXMsCisJCS5taXhlcl9pbml0ID0gaGVyY3VsZXNfbWl4ZXJfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTY4MSwKKwkJLmlkID0gMHgwMDUxLAorCQkubmFtZSA9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wID0gYW1wX2hlcmN1bGVzLAorCQkubWl4ZXJfaW5pdCA9IGhlcmN1bGVzX21peGVyX2luaXQsCisKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTY4MSwKKwkJLmlkID0gMHgwMDUyLAorCQkubmFtZSA9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wID0gYW1wX2hlcmN1bGVzLAorCQkubWl4ZXJfaW5pdCA9IGhlcmN1bGVzX21peGVyX2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDE2ODEsCisJCS5pZCA9IDB4MDA1MywKKwkJLm5hbWUgPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcCA9IGFtcF9oZXJjdWxlcywKKwkJLm1peGVyX2luaXQgPSBoZXJjdWxlc19taXhlcl9pbml0LAorCX0sCisJeworCQkudmVuZG9yID0gMHgxNjgxLAorCQkuaWQgPSAweDAwNTQsCisJCS5uYW1lID0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAgPSBhbXBfaGVyY3VsZXMsCisJCS5taXhlcl9pbml0ID0gaGVyY3VsZXNfbWl4ZXJfaW5pdCwKKwl9LAorCS8qIFRlcmF0ZWMgKi8KKwl7CisJCS52ZW5kb3IgPSAweDE1M2IsCisJCS5pZCA9IDB4MTEzNiwKKwkJLm5hbWUgPSAiVGVycmF0ZWMgU2lYUGFjayA1LjEiLAorCX0sCisJLyogTm90IHN1cmUgaWYgdGhlIDU3MCBuZWVkcyB0aGUgY2xrcnVuIGhhY2sgKi8KKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lCTSwKKwkJLmlkID0gMHgwMTMyLAorCQkubmFtZSA9ICJUaGlua3BhZCA1NzAiLAorCQkuaW5pdCA9IGNsa3J1bl9pbml0LAorCQkuYWN0aXZlID0gY2xrcnVuX2hhY2ssCisJfSwKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lCTSwKKwkJLmlkID0gMHgwMTUzLAorCQkubmFtZSA9ICJUaGlua3BhZCA2MDBYL0EyMC9UMjAiLAorCQkuaW5pdCA9IGNsa3J1bl9pbml0LAorCQkuYWN0aXZlID0gY2xrcnVuX2hhY2ssCisJfSwKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lCTSwKKwkJLmlkID0gMHgxMDEwLAorCQkubmFtZSA9ICJUaGlua3BhZCA2MDBFICh1bnN1cHBvcnRlZCkiLAorCX0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworCisvKgorICogQVBNIHN1cHBvcnQKKyAqLworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzbmRfY3M0Nnh4X3N1c3BlbmQoc25kX2NhcmRfdCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWNzNDZ4eF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBhbXBfc2F2ZWQ7CisKKwlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CisJLy8gY2hpcC0+YWM5N19wb3dlcmRvd24gPSBzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY2hpcCwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkvLyBjaGlwLT5hYzk3X2dlbmVyYWxfcHVycG9zZSA9IHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UpOworCisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3W0NTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYXSk7CisJaWYgKGNoaXAtPmFjOTdbQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWF0pCisJCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5N1tDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYXSk7CisKKwlhbXBfc2F2ZWQgPSBjaGlwLT5hbXBsaWZpZXI7CisJLyogdHVybiBvZmYgYW1wICovCisJY2hpcC0+YW1wbGlmaWVyX2N0cmwoY2hpcCwgLWNoaXAtPmFtcGxpZmllcik7CisJc25kX2NzNDZ4eF9od19zdG9wKGNoaXApOworCS8qIGRpc2FibGUgQ0xLUlVOICovCisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgLWNoaXAtPmFtcGxpZmllcik7CisJY2hpcC0+YW1wbGlmaWVyID0gYW1wX3NhdmVkOyAvKiByZXN0b3JlIHRoZSBzdGF0dXMgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY3M0Nnh4X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWNzNDZ4eF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBhbXBfc2F2ZWQ7CisKKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisJYW1wX3NhdmVkID0gY2hpcC0+YW1wbGlmaWVyOworCWNoaXAtPmFtcGxpZmllciA9IDA7CisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7IC8qIGZvcmNlIHRvIG9uICovCisKKwlzbmRfY3M0Nnh4X2NoaXBfaW5pdChjaGlwKTsKKworI2lmIDAKKwlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIEJBMF9BQzk3X0dFTkVSQUxfUFVSUE9TRSwgCisJCQkgICAgICAgY2hpcC0+YWM5N19nZW5lcmFsX3B1cnBvc2UpOworCXNuZF9jczQ2eHhfY29kZWNfd3JpdGUoY2hpcCwgQUM5N19QT1dFUl9DT05UUk9MLCAKKwkJCSAgICAgICBjaGlwLT5hYzk3X3Bvd2VyZG93bik7CisJbWRlbGF5KDEwKTsKKwlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIEJBMF9BQzk3X1BPV0VSRE9XTiwKKwkJCSAgICAgICBjaGlwLT5hYzk3X3Bvd2VyZG93bik7CisJbWRlbGF5KDUpOworI2VuZGlmCisKKwlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0pOworCWlmIChjaGlwLT5hYzk3W0NTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVhdKQorCQlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5N1tDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYXSk7CisKKwlpZiAoYW1wX3NhdmVkKQorCQljaGlwLT5hbXBsaWZpZXJfY3RybChjaGlwLCAxKTsgLyogdHVybiBhbXAgb24gKi8KKwllbHNlCisJCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsgLyogZGlzYWJsZSBDTEtSVU4gKi8KKwljaGlwLT5hbXBsaWZpZXIgPSBhbXBfc2F2ZWQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworLyoKKyAqLworCitpbnQgX19kZXZpbml0IHNuZF9jczQ2eHhfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqIHBjaSwKKwkJICAgICAgaW50IGV4dGVybmFsX2FtcCwgaW50IHRoaW5rcGFkLAorCQkgICAgICBjczQ2eHhfdCAqKiByY2hpcCkKK3sKKwljczQ2eHhfdCAqY2hpcDsKKwlpbnQgZXJyLCBpZHg7CisJc25kX2NzNDZ4eF9yZWdpb25fdCAqcmVnaW9uOworCXN0cnVjdCBjc19jYXJkX3R5cGUgKmNwOworCXUxNiBzc19jYXJkLCBzc192ZW5kb3I7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfY3M0Nnh4X2Rldl9mcmVlLAorCX07CisJCisJKnJjaGlwID0gTlVMTDsKKworCS8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJaW5pdF9NVVRFWCgmY2hpcC0+c3Bvc19tdXRleCk7CisjZW5kaWYKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+aXJxID0gLTE7CisJY2hpcC0+YmEwX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwljaGlwLT5iYTFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCWlmIChjaGlwLT5iYTBfYWRkciA9PSAwIHx8IGNoaXAtPmJhMF9hZGRyID09ICh1bnNpZ25lZCBsb25nKX4wIHx8CisJICAgIGNoaXAtPmJhMV9hZGRyID09IDAgfHwgY2hpcC0+YmExX2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpfjApIHsKKwkgICAgCXNuZF9wcmludGsoIndyb25nIGFkZHJlc3MoZXMpIC0gYmEwID0gMHglbHgsIGJhMSA9IDB4JWx4XG4iLCBjaGlwLT5iYTBfYWRkciwgY2hpcC0+YmExX2FkZHIpOworCSAgICAJc25kX2NzNDZ4eF9mcmVlKGNoaXApOworCSAgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5uYW1lLmJhMDsKKwlzdHJjcHkocmVnaW9uLT5uYW1lLCAiQ1M0Nnh4X0JBMCIpOworCXJlZ2lvbi0+YmFzZSA9IGNoaXAtPmJhMF9hZGRyOworCXJlZ2lvbi0+c2l6ZSA9IENTNDZYWF9CQTBfU0laRTsKKworCXJlZ2lvbiA9ICZjaGlwLT5yZWdpb24ubmFtZS5kYXRhMDsKKwlzdHJjcHkocmVnaW9uLT5uYW1lLCAiQ1M0Nnh4X0JBMV9kYXRhMCIpOworCXJlZ2lvbi0+YmFzZSA9IGNoaXAtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0wOworCXJlZ2lvbi0+c2l6ZSA9IENTNDZYWF9CQTFfREFUQTBfU0laRTsKKworCXJlZ2lvbiA9ICZjaGlwLT5yZWdpb24ubmFtZS5kYXRhMTsKKwlzdHJjcHkocmVnaW9uLT5uYW1lLCAiQ1M0Nnh4X0JBMV9kYXRhMSIpOworCXJlZ2lvbi0+YmFzZSA9IGNoaXAtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0xOworCXJlZ2lvbi0+c2l6ZSA9IENTNDZYWF9CQTFfREFUQTFfU0laRTsKKworCXJlZ2lvbiA9ICZjaGlwLT5yZWdpb24ubmFtZS5wbWVtOworCXN0cmNweShyZWdpb24tPm5hbWUsICJDUzQ2eHhfQkExX3BtZW0iKTsKKwlyZWdpb24tPmJhc2UgPSBjaGlwLT5iYTFfYWRkciArIEJBMV9TUF9QTUVNOworCXJlZ2lvbi0+c2l6ZSA9IENTNDZYWF9CQTFfUFJHX1NJWkU7CisKKwlyZWdpb24gPSAmY2hpcC0+cmVnaW9uLm5hbWUucmVnOworCXN0cmNweShyZWdpb24tPm5hbWUsICJDUzQ2eHhfQkExX3JlZyIpOworCXJlZ2lvbi0+YmFzZSA9IGNoaXAtPmJhMV9hZGRyICsgQkExX1NQX1JFRzsKKwlyZWdpb24tPnNpemUgPSBDUzQ2WFhfQkExX1JFR19TSVpFOworCisJLyogc2V0IHVwIGFtcCBhbmQgY2xrcnVuIGhhY2sgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3NfdmVuZG9yKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZzc19jYXJkKTsKKworCWZvciAoY3AgPSAmY2FyZHNbMF07IGNwLT5uYW1lOyBjcCsrKSB7CisJCWlmIChjcC0+dmVuZG9yID09IHNzX3ZlbmRvciAmJiBjcC0+aWQgPT0gc3NfY2FyZCkgeworCQkJc25kX3ByaW50ZGQgKCJoYWNrIGZvciAlcyBlbmFibGVkXG4iLCBjcC0+bmFtZSk7CisKKwkJCWNoaXAtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKKwkJCWNoaXAtPmFjdGl2ZV9jdHJsID0gY3AtPmFjdGl2ZTsKKwkJCWNoaXAtPm1peGVyX2luaXQgPSBjcC0+bWl4ZXJfaW5pdDsKKworCQkJaWYgKGNwLT5pbml0KQorCQkJCWNwLT5pbml0KGNoaXApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXh0ZXJuYWxfYW1wKSB7CisJCXNuZF9wcmludGsoIkNyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOworCQljaGlwLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOworCX0KKworCWlmICh0aGlua3BhZCkgeworCQlzbmRfcHJpbnRrKCJBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOworCQljaGlwLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOworCQljbGtydW5faW5pdChjaGlwKTsKKwl9CisJCisJaWYgKGNoaXAtPmFtcGxpZmllcl9jdHJsID09IE5VTEwpCisJCWNoaXAtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7CisJaWYgKGNoaXAtPmFjdGl2ZV9jdHJsID09IE5VTEwpCisJCWNoaXAtPmFjdGl2ZV9jdHJsID0gYW1wX25vbmU7CisKKwljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAxKTsgLyogZW5hYmxlIENMS1JVTiAqLworCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKKwkJcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKKwkJaWYgKChyZWdpb24tPnJlc291cmNlID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ2lvbi0+YmFzZSwgcmVnaW9uLT5zaXplLCByZWdpb24tPm5hbWUpKSA9PSBOVUxMKSB7CisJCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCByZWdpb24tPmJhc2UsIHJlZ2lvbi0+YmFzZSArIHJlZ2lvbi0+c2l6ZSAtIDEpOworCQkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlyZWdpb24tPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocmVnaW9uLT5iYXNlLCByZWdpb24tPnNpemUpOworCQlpZiAocmVnaW9uLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKKwkJCXNuZF9wcmludGsoIiVzIGlvcmVtYXAgcHJvYmxlbVxuIiwgcmVnaW9uLT5uYW1lKTsKKwkJCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M0Nnh4X2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiQ1M0NlhYIiwgKHZvaWQgKikgY2hpcCkpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisKKyNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCisJY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UgPSBjczQ2eHhfZHNwX3Nwb3NfY3JlYXRlKGNoaXApOworCWlmIChjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZSA9PSBOVUxMKSB7CisJCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorI2VuZGlmCisKKwllcnIgPSBzbmRfY3M0Nnh4X2NoaXBfaW5pdChjaGlwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlzbmRfY3M0Nnh4X3Byb2NfaW5pdChjYXJkLCBjaGlwKTsKKworCXNuZF9jYXJkX3NldF9wbV9jYWxsYmFjayhjYXJkLCBzbmRfY3M0Nnh4X3N1c3BlbmQsIHNuZF9jczQ2eHhfcmVzdW1lLCBjaGlwKTsKKworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsgLyogZGlzYWJsZSBDTEtSVU4gKi8KKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyY2hpcCA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuaCBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmVjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqICBUaGUgZHJpdmVyIGZvciB0aGUgQ2lycnVzIExvZ2ljJ3MgU291bmQgRnVzaW9uIENTNDZYWCBiYXNlZCBzb3VuZGNhcmRzCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0NTNDZYWF9MSUJfSF9fCisjZGVmaW5lIF9fQ1M0NlhYX0xJQl9IX18KKworLyoKKyAqICBjb25zdGFudHMKKyAqLworCisjZGVmaW5lIENTNDZYWF9CQTBfU0laRQkJICAweDEwMDAKKyNkZWZpbmUgQ1M0NlhYX0JBMV9EQVRBMF9TSVpFIDB4MzAwMAorI2RlZmluZSBDUzQ2WFhfQkExX0RBVEExX1NJWkUgMHgzODAwCisjZGVmaW5lIENTNDZYWF9CQTFfUFJHX1NJWkUJICAweDcwMDAKKyNkZWZpbmUgQ1M0NlhYX0JBMV9SRUdfU0laRQkgIDB4MDEwMAorCisKKworI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKyNkZWZpbmUgQ1M0NlhYX01JTl9QRVJJT0RfU0laRSAxCisjZGVmaW5lIENTNDZYWF9NQVhfUEVSSU9EX1NJWkUgMTAyNCoxMDI0CisjZWxzZQorI2RlZmluZSBDUzQ2WFhfTUlOX1BFUklPRF9TSVpFIDIwNDgKKyNkZWZpbmUgQ1M0NlhYX01BWF9QRVJJT0RfU0laRSAyMDQ4CisjZW5kaWYKKworI2RlZmluZSBDUzQ2WFhfRlJBR1MgMgorLyogI2RlZmluZSBDUzQ2WFhfQlVGRkVSX1NJWkUgQ1M0NlhYX01BWF9QRVJJT0RfU0laRSAqIENTNDZYWF9GUkFHUyAqLworCisjZGVmaW5lIFNDQl9OT19QQVJFTlQgICAgICAgICAgICAgMAorI2RlZmluZSBTQ0JfT05fUEFSRU5UX05FWFRfU0NCICAgIDEKKyNkZWZpbmUgU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQiAyCisKKy8qIDMqMTAyNCBwYXJhbWV0ZXIsIDMuNSoxMDI0IHNhbXBsZSwgMiozLjUqMTAyNCBjb2RlICovCisjZGVmaW5lIEJBMV9EV09SRF9TSVpFCQkoMTMgKiAxMDI0ICsgNTEyKQorI2RlZmluZSBCQTFfTUVNT1JZX0NPVU5UCTMKKworLyoKKyAqICBjb21tb24gSS9PIHJvdXRpbmVzCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9jczQ2eHhfcG9rZShjczQ2eHhfdCAqY2hpcCwgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IGJhbmsgPSByZWcgPj4gMTY7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHJlZyAmIDB4ZmZmZjsKKworCS8qaWYgKGJhbmsgPT0gMCkgcHJpbnRrKCJzbmRfY3M0Nnh4X3Bva2U6ICUwNFggLSAlMDhYXG4iLHJlZyA+PiAyLHZhbCk7ICovCisJd3JpdGVsKHZhbCwgY2hpcC0+cmVnaW9uLmlkeFtiYW5rKzFdLnJlbWFwX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbmRfY3M0Nnh4X3BlZWsoY3M0Nnh4X3QgKmNoaXAsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXVuc2lnbmVkIGludCBiYW5rID0gcmVnID4+IDE2OworCXVuc2lnbmVkIGludCBvZmZzZXQgPSByZWcgJiAweGZmZmY7CisJcmV0dXJuIHJlYWRsKGNoaXAtPnJlZ2lvbi5pZHhbYmFuaysxXS5yZW1hcF9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9jczQ2eHhfcG9rZUJBMChjczQ2eHhfdCAqY2hpcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwgY2hpcC0+cmVnaW9uLm5hbWUuYmEwLnJlbWFwX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbmRfY3M0Nnh4X3BlZWtCQTAoY3M0Nnh4X3QgKmNoaXAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiByZWFkbChjaGlwLT5yZWdpb24ubmFtZS5iYTAucmVtYXBfYWRkciArIG9mZnNldCk7Cit9CisKK2RzcF9zcG9zX2luc3RhbmNlX3QgKiAgY3M0Nnh4X2RzcF9zcG9zX2NyZWF0ZSAoY3M0Nnh4X3QgKiBjaGlwKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9zcG9zX2Rlc3Ryb3kgKGNzNDZ4eF90ICogY2hpcCk7CitpbnQgICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9kc3BfbG9hZF9tb2R1bGUgKGNzNDZ4eF90ICogY2hpcCxkc3BfbW9kdWxlX2Rlc2NfdCAqIG1vZHVsZSk7CitzeW1ib2xfZW50cnlfdCAqICAgICAgIGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbCAoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzeW1ib2xfbmFtZSxpbnQgc3ltYm9sX3R5cGUpOworaW50ICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3Byb2NfaW5pdCAoc25kX2NhcmRfdCAqIGNhcmQsIGNzNDZ4eF90ICpjaGlwKTsKK2ludCAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9wcm9jX2RvbmUgKGNzNDZ4eF90ICpjaGlwKTsKK2ludCAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9zY2JfYW5kX3Rhc2tfaW5pdCAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICBzbmRfY3M0Nnh4X2Rvd25sb2FkIChjczQ2eHhfdCAqY2hpcCx1MzIgKnNyYyx1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW4pOworaW50ICAgICAgICAgICAgICAgICAgICBzbmRfY3M0Nnh4X2NsZWFyX0JBMShjczQ2eHhfdCAqY2hpcCx1bnNpZ25lZCBsb25nIG9mZnNldCx1bnNpZ25lZCBsb25nIGxlbik7CitpbnQgICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9kc3BfZW5hYmxlX3NwZGlmX291dCAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX2VuYWJsZV9zcGRpZl9odyAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX2Rpc2FibGVfc3BkaWZfb3V0IChjczQ2eHhfdCAqY2hpcCk7CitpbnQgICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9kc3BfZW5hYmxlX3NwZGlmX2luIChjczQ2eHhfdCAqY2hpcCk7CitpbnQgICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9kc3BfZGlzYWJsZV9zcGRpZl9pbiAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX2VuYWJsZV9wY21fY2FwdHVyZSAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX2Rpc2FibGVfcGNtX2NhcHR1cmUgKGNzNDZ4eF90ICpjaGlwKTsKK2ludCAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9lbmFibGVfYWRjX2NhcHR1cmUgKGNzNDZ4eF90ICpjaGlwKTsKK2ludCAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9kaXNhYmxlX2FkY19jYXB0dXJlIChjczQ2eHhfdCAqY2hpcCk7CitpbnQgICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9wb2tlX3ZpYV9kc3AgKGNzNDZ4eF90ICpjaGlwLHUzMiBhZGRyZXNzLHUzMiBkYXRhKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogY3M0Nnh4X2RzcF9jcmVhdGVfc2NiIChjczQ2eHhfdCAqY2hpcCxjaGFyICogbmFtZSwgdTMyICogc2NiX2RhdGEsdTMyIGRlc3QpOwordm9pZCAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3Byb2NfZnJlZV9zY2JfZGVzYyAoZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2IpOwordm9pZCAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3Byb2NfcmVnaXN0ZXJfc2NiX2Rlc2MgKGNzNDZ4eF90ICpjaGlwLGRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogY3M0Nnh4X2RzcF9jcmVhdGVfdGltaW5nX21hc3Rlcl9zY2IgKGNzNDZ4eF90ICpjaGlwKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfb3V0X3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIGNvZGVjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNoYW5uZWxfZGlzcCx1MTYgZmlmb19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjaGlsZF9zY2JfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfaW5fc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogY29kZWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjaGFubmVsX2Rpc3AsdTE2IGZpZm9fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBzYW1wbGVfYnVmZmVyX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50X3NjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7Cit2b2lkICAgICAgICAgICAgICAgICAgIGNzNDZ4eF9kc3BfcmVtb3ZlX3NjYiAoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2IpOworZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAgY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfaW5fc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogY29kZWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgY2hhbm5lbF9kaXNwLHUxNiBmaWZvX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHNhbXBsZV9idWZmZXJfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGVzdCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogIGNzNDZ4eF9kc3BfY3JlYXRlX3NyY190YXNrX3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLAorCQkJCQkJICAgICAgIGludCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc3JjX2J1ZmZlcl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBzcmNfZGVsYXlfYnVmZmVyX2FkZHIsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSwKKwkJCQkJCSAgICAgICBpbnQgcGFzc190aHJvdWdoKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogIGNzNDZ4eF9kc3BfY3JlYXRlX21peF9vbmx5X3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBtaXhfYnVmZmVyX2FkZHIsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7CisKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogIGNzNDZ4eF9kc3BfY3JlYXRlX3ZhcmlfZGVjaW1hdGVfc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogc2NiX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmFyaV9idWZmZXJfYWRkcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmFyaV9idWZmZXJfYWRkcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50X3NjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7Citkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGNzNDZ4eF9kc3BfY3JlYXRlX2FzeW5jaF9mZ19yeF9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSx1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgaGZnX3NjYl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhc3luY2hfYnVmZmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7Citkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqICBjczQ2eHhfZHNwX2NyZWF0ZV9zcGlvX3dyaXRlX3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogIGNzNDZ4eF9kc3BfY3JlYXRlX21peF90b19vc3RyZWFtX3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBtaXhfYnVmZmVyX2FkZHIsdTE2IHdyaXRlYmFja19zcGIsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7Citkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqICBjczQ2eHhfZHNwX2NyZWF0ZV9tYWdpY19zbm9vcF9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSx1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc25vb3BfYnVmZmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzbm9vcF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSk7CitwY21fY2hhbm5lbF9kZXNjcmlwdG9yX3QgKiBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fY2hhbm5lbCAoY3M0Nnh4X3QgKiBjaGlwLHUzMiBzYW1wbGVfcmF0ZSwgdm9pZCAqIHByaXZhdGVfZGF0YSwgdTMyIGh3X2RtYV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwY21fY2hhbm5lbF9pZCk7Cit2b2lkICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX2Rlc3Ryb3lfcGNtX2NoYW5uZWwgKGNzNDZ4eF90ICogY2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtX2NoYW5uZWxfZGVzY3JpcHRvcl90ICogcGNtX2NoYW5uZWwpOworaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9wY21fdW5saW5rIChjczQ2eHhfdCAqIGNoaXAscGNtX2NoYW5uZWxfZGVzY3JpcHRvcl90ICogcGNtX2NoYW5uZWwpOworaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9wY21fbGluayAoY3M0Nnh4X3QgKiBjaGlwLHBjbV9jaGFubmVsX2Rlc2NyaXB0b3JfdCAqIHBjbV9jaGFubmVsKTsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogICAgIGNzNDZ4eF9hZGRfcmVjb3JkX3NvdXJjZSAoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyLGNoYXIgKiBzY2JfbmFtZSk7CitpbnQgICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfc3JjX3VubGluayhjczQ2eHhfdCAqY2hpcCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNyYyk7CitpbnQgICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfc3JjX2xpbmsoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzcmMpOworaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2llYzk1OF9wcmVfb3BlbiAoY3M0Nnh4X3QgKmNoaXApOworaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2llYzk1OF9wb3N0X2Nsb3NlIChjczQ2eHhfdCAqY2hpcCk7CitpbnQgICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3BjbV9jaGFubmVsX3NldF9wZXJpb2QgKGNzNDZ4eF90ICogY2hpcCwKKwkJCQkJCQkgICAgICAgcGNtX2NoYW5uZWxfZGVzY3JpcHRvcl90ICogcGNtX2NoYW5uZWwsCisJCQkJCQkJICAgICAgIGludCBwZXJpb2Rfc2l6ZSk7CitpbnQgICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3BjbV9vc3RyZWFtX3NldF9wZXJpb2QgKGNzNDZ4eF90ICogY2hpcCwKKwkJCQkJCQkgICAgICBpbnQgcGVyaW9kX3NpemUpOworaW50ICAgICAgICAgICAgICAgICAgICAgICAgY3M0Nnh4X2RzcF9zZXRfZGFjX3ZvbHVtZSAoY3M0Nnh4X3QgKiBjaGlwLHUxNiBsZWZ0LHUxNiByaWdodCk7CitpbnQgICAgICAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3NldF9pZWM5NThfdm9sdW1lIChjczQ2eHhfdCAqIGNoaXAsdTE2IGxlZnQsdTE2IHJpZ2h0KTsKKyNlbmRpZiAvKiBfX0NTNDZYWF9MSUJfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwpAQCAtMCwwICsxLDE4OTIgQEAKKy8qCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiAyMDAyLTA3IEJlbm55IFNqb3N0cmFuZCBiZW5ueUBob3N0bW9iaWxpdHkuY29tCisgKi8KKworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvY3M0Nnh4Lmg+CisKKyNpbmNsdWRlICJjczQ2eHhfbGliLmgiCisjaW5jbHVkZSAiZHNwX3Nwb3MuaCIKKworc3RhdGljIGludCBjczQ2eHhfZHNwX2FzeW5jX2luaXQgKGNzNDZ4eF90ICpjaGlwLCBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGZnX2VudHJ5KTsKKworc3RhdGljIHdpZGVfb3Bjb2RlX3Qgd2lkZV9vcGNvZGVzW10gPSB7IAorCVdJREVfRk9SX0JFR0lOX0xPT1AsCisJV0lERV9GT1JfQkVHSU5fTE9PUDIsCisJV0lERV9DT05EX0dPVE9fQUREUiwKKwlXSURFX0NPTkRfR09UT19DQUxMLAorCVdJREVfVEJFUV9DT05EX0dPVE9fQUREUiwKKwlXSURFX1RCRVFfQ09ORF9DQUxMX0FERFIsCisJV0lERV9UQkVRX05DT05EX0dPVE9fQUREUiwKKwlXSURFX1RCRVFfTkNPTkRfQ0FMTF9BRERSLAorCVdJREVfVEJFUV9DT05EX0dPVE8xX0FERFIsCisJV0lERV9UQkVRX0NPTkRfQ0FMTDFfQUREUiwKKwlXSURFX1RCRVFfTkNPTkRfR09UT0lfQUREUiwKKwlXSURFX1RCRVFfTkNPTkRfQ0FMTDFfQUREUgorfTsKKworc3RhdGljIGludCBzaGFkb3dfYW5kX3JlYWxsb2NhdGVfY29kZSAoY3M0Nnh4X3QgKiBjaGlwLHUzMiAqIGRhdGEsdTMyIHNpemUsIHUzMiBvdmVybGF5X2JlZ2luX2FkZHJlc3MpCit7CisJdW5zaWduZWQgaW50IGkgPSAwLCBqLCBucmVhbGxvY2F0ZWQgPSAwOworCXUzMiBoaXZhbCxsb3ZhbCxhZGRyZXNzOworCXUzMiBtb3Bfb3BlcmFuZHMsbW9wX3R5cGUsd2lkZV9vcDsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlzbmRfYXNzZXJ0KCAoKHNpemUgJSAyKSA9PSAwKSwgcmV0dXJuIC1FSU5WQUwpOworICAKKwl3aGlsZSAoaSA8IHNpemUpIHsKKwkJbG92YWwgPSBkYXRhW2krK107CisJCWhpdmFsID0gZGF0YVtpKytdOworCisJCWlmIChpbnMtPmNvZGUub2Zmc2V0ID4gMCkgeworCQkJbW9wX29wZXJhbmRzID0gKGhpdmFsID4+IDYpICYgMHgwM2ZmZjsKKwkJCW1vcF90eXBlID0gbW9wX29wZXJhbmRzID4+IDEwOworICAgICAgCisJCQkvKiBjaGVjayBmb3Igd2lkZSB0eXBlIGluc3RydWN0aW9uICovCisJCQlpZiAobW9wX3R5cGUgPT0gMCAmJgorCQkJICAgIChtb3Bfb3BlcmFuZHMgJiBXSURFX0xBRERfSU5TVFJfTUFTSykgPT0gMCAmJgorCQkJICAgIChtb3Bfb3BlcmFuZHMgJiBXSURFX0lOU1RSX01BU0spICE9IDApIHsKKwkJCQl3aWRlX29wID0gbG92YWwgJiAweDdmOworCQkJCWZvciAoaiA9IDA7aiA8IEFSUkFZX1NJWkUod2lkZV9vcGNvZGVzKTsgKytqKSB7CisJCQkJCWlmICh3aWRlX29wY29kZXNbal0gPT0gd2lkZV9vcCkgeworCQkJCQkJLyogbmVlZCB0byByZWFsbG9jYXRlIGluc3RydWN0aW9uICovCisJCQkJCQlhZGRyZXNzICA9IChoaXZhbCAmIDB4MDBGRkYpIDw8IDU7CisJCQkJCQlhZGRyZXNzIHw9ICBsb3ZhbCA+PiAxNTsKKyAgICAgICAgICAgIAorCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3BbMV06ICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsaGl2YWwsbG92YWwsYWRkcmVzcyk7CisgICAgICAgICAgICAKKwkJCQkJCWlmICggIShhZGRyZXNzICYgMHg4MDAwKSApIHsKKwkJCQkJCQlhZGRyZXNzICs9IChpbnMtPmNvZGUub2Zmc2V0IC8gMikgLSBvdmVybGF5X2JlZ2luX2FkZHJlc3M7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXNuZF9wcmludGRkKCJoYW5kbGVfd2lkZW9wWzFdOiBST00gc3ltYm9sIG5vdCByZWFsbG9jYXRlZFxuIik7CisJCQkJCQl9CisgICAgICAgICAgICAKKwkJCQkJCWhpdmFsICY9IDB4RkYwMDA7CisJCQkJCQlsb3ZhbCAmPSAweDA3RkZGOworICAgICAgICAgICAgCisJCQkJCQloaXZhbCB8PSAoIChhZGRyZXNzID4+IDUpICAmIDB4MDBGRkYpOworCQkJCQkJbG92YWwgfD0gKCAoYWRkcmVzcyA8PCAxNSkgJiAweEY4MDAwKTsKKyAgICAgICAgICAgIAorCQkJCQkJYWRkcmVzcyAgPSAoaGl2YWwgJiAweDAwRkZGKSA8PCA1OworCQkJCQkJYWRkcmVzcyB8PSAgbG92YWwgPj4gMTU7CisgICAgICAgICAgICAKKwkJCQkJCXNuZF9wcmludGRkKCJoYW5kbGVfd2lkZW9wOlsyXSAlMDV4OiUwNXggYWRkciAlMDR4XG4iLGhpdmFsLGxvdmFsLGFkZHJlc3MpOyAgICAgICAgICAgIAorCQkJCQkJbnJlYWxsb2NhdGVkICsrOworCQkJCQl9IC8qIHdpZGVfb3Bjb2Rlc1tqXSA9PSB3aWRlX29wICovCisJCQkJfSAvKiBmb3IgKi8KKwkJCX0gLyogbW9kX3R5cGUgPT0gMCAuLi4gKi8KKwkJfSAvKiBpbnMtPmNvZGUub2Zmc2V0ID4gMCAqLworCisJCWlucy0+Y29kZS5kYXRhW2lucy0+Y29kZS5zaXplKytdID0gbG92YWw7CisJCWlucy0+Y29kZS5kYXRhW2lucy0+Y29kZS5zaXplKytdID0gaGl2YWw7CisJfQorCisJc25kX3ByaW50ZGQoImRzcF9zcG9zOiAlZCBpbnN0cnVjdGlvbnMgcmVhbGxvY2F0ZWRcbiIsbnJlYWxsb2NhdGVkKTsKKwlyZXR1cm4gbnJlYWxsb2NhdGVkOworfQorCitzdGF0aWMgc2VnbWVudF9kZXNjX3QgKiBnZXRfc2VnbWVudF9kZXNjIChkc3BfbW9kdWxlX2Rlc2NfdCAqIG1vZHVsZSwgaW50IHNlZ190eXBlKQoreworCWludCBpOworCWZvciAoaSA9IDA7aSA8IG1vZHVsZS0+bnNlZ21lbnRzOyArK2kpIHsKKwkJaWYgKG1vZHVsZS0+c2VnbWVudHNbaV0uc2VnbWVudF90eXBlID09IHNlZ190eXBlKSB7CisJCQlyZXR1cm4gKG1vZHVsZS0+c2VnbWVudHMgKyBpKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfTsKKworc3RhdGljIGludCBmaW5kX2ZyZWVfc3ltYm9sX2luZGV4IChkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zKQoreworCWludCBpbmRleCA9IGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzLGk7CisKKwlmb3IgKGkgPSBpbnMtPnN5bWJvbF90YWJsZS5oaWdoZXN0X2ZyYWdfaW5kZXg7IGkgPCBpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9sczsgKytpKSB7CisJCWlmIChpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLmRlbGV0ZWQpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IGFkZF9zeW1ib2xzIChjczQ2eHhfdCAqIGNoaXAsIGRzcF9tb2R1bGVfZGVzY190ICogbW9kdWxlKQoreworCWludCBpOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCWlmIChtb2R1bGUtPnN5bWJvbF90YWJsZS5uc3ltYm9scyA+IDApIHsKKwkJaWYgKCFzdHJjbXAobW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9sc1swXS5zeW1ib2xfbmFtZSwgIk9WRVJMQVlCRUdJTkFERFJFU1MiKSAmJgorCQkgICAgbW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9sc1swXS5zeW1ib2xfdHlwZSA9PSBTWU1CT0xfQ09OU1RBTlQgKSB7CisJCQltb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyA9IG1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbMF0uYWRkcmVzczsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7aSA8IG1vZHVsZS0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzOyArK2kpIHsKKwkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID09IChEU1BfTUFYX1NZTUJPTFMgLSAxKSkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCB0YWJsZSBpcyBmdWxsXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKworCQlpZiAoY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsCisJCQkJCSAgICAgbW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tpXS5zeW1ib2xfbmFtZSwKKwkJCQkJICAgICBtb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF90eXBlKSA9PSBOVUxMKSB7CisKKwkJCWlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHNdID0gbW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tpXTsKKwkJCWlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHNdLmFkZHJlc3MgKz0gKChpbnMtPmNvZGUub2Zmc2V0IC8gMikgLSBtb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyk7CisJCQlpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2lucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzXS5tb2R1bGUgPSBtb2R1bGU7CisJCQlpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2lucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzXS5kZWxldGVkID0gMDsKKworCQkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID4gaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4KSAKKwkJCQlpbnMtPnN5bWJvbF90YWJsZS5oaWdoZXN0X2ZyYWdfaW5kZXggPSBpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9sczsKKworCQkJaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMrKzsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAvKiBpZiAoMCkgcHJpbnRrICgiZHNwX3Nwb3M6IHN5bWJvbCA8JXM+IGR1cGxpY2F0ZWQsIHByb2JhYmx5IG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGF0IChDaXJydXM/KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tpXS5zeW1ib2xfbmFtZSk7ICovCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN5bWJvbF9lbnRyeV90ICogYWRkX3N5bWJvbCAoY3M0Nnh4X3QgKiBjaGlwLCBjaGFyICogc3ltYm9sX25hbWUsIHUzMiBhZGRyZXNzLCBpbnQgdHlwZSkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJc3ltYm9sX2VudHJ5X3QgKiBzeW1ib2wgPSBOVUxMOworCWludCBpbmRleDsKKworCWlmIChpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9scyA9PSAoRFNQX01BWF9TWU1CT0xTIC0gMSkpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCB0YWJsZSBpcyBmdWxsXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorICAKKwlpZiAoY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsCisJCQkJICAgICBzeW1ib2xfbmFtZSwKKwkJCQkgICAgIHR5cGUpICE9IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCA8JXM+IGR1cGxpY2F0ZWRcbiIsIHN5bWJvbF9uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5kZXggPSBmaW5kX2ZyZWVfc3ltYm9sX2luZGV4IChpbnMpOworCisJc3RyY3B5IChpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2luZGV4XS5zeW1ib2xfbmFtZSwgc3ltYm9sX25hbWUpOworCWlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaW5kZXhdLmFkZHJlc3MgPSBhZGRyZXNzOworCWlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaW5kZXhdLnN5bWJvbF90eXBlID0gdHlwZTsKKwlpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2luZGV4XS5tb2R1bGUgPSBOVUxMOworCWlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaW5kZXhdLmRlbGV0ZWQgPSAwOworCXN5bWJvbCA9IChpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzICsgaW5kZXgpOworCisJaWYgKGluZGV4ID4gaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4KSAKKwkJaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4ID0gaW5kZXg7CisKKwlpZiAoaW5kZXggPT0gaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMpCisJCWlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzKys7IC8qIG5vIGZyYWcuIGluIGxpc3QgKi8KKworCXJldHVybiBzeW1ib2w7Cit9CisKK2RzcF9zcG9zX2luc3RhbmNlX3QgKiAgY3M0Nnh4X2RzcF9zcG9zX2NyZWF0ZSAoY3M0Nnh4X3QgKiBjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBrbWFsbG9jKHNpemVvZihkc3Bfc3Bvc19pbnN0YW5jZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoaW5zID09IE5VTEwpIAorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoaW5zLCAwLCBzaXplb2YoKmlucykpOworCisJLyogYmV0dGVyIHRvIHVzZSB2bWFsbG9jIGZvciB0aGlzIGJpZyB0YWJsZSAqLworCWlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID0gMDsKKwlpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzID0gdm1hbGxvYyhzaXplb2Yoc3ltYm9sX2VudHJ5X3QpICogRFNQX01BWF9TWU1CT0xTKTsKKwlpbnMtPnN5bWJvbF90YWJsZS5oaWdoZXN0X2ZyYWdfaW5kZXggPSAwOworCisJaWYgKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHMgPT0gTlVMTCkgeworCQljczQ2eHhfZHNwX3Nwb3NfZGVzdHJveShjaGlwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5zLT5jb2RlLm9mZnNldCA9IDA7CisJaW5zLT5jb2RlLnNpemUgPSAwOworCWlucy0+Y29kZS5kYXRhID0ga21hbGxvYyhEU1BfQ09ERV9CWVRFX1NJWkUsIEdGUF9LRVJORUwpOworCisJaWYgKGlucy0+Y29kZS5kYXRhID09IE5VTEwpIHsKKwkJY3M0Nnh4X2RzcF9zcG9zX2Rlc3Ryb3koY2hpcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlucy0+bnNjYiA9IDA7CisJaW5zLT5udGFzayA9IDA7CisKKwlpbnMtPm5tb2R1bGVzID0gMDsKKwlpbnMtPm1vZHVsZXMgPSBrbWFsbG9jKHNpemVvZihkc3BfbW9kdWxlX2Rlc2NfdCkgKiBEU1BfTUFYX01PRFVMRVMsIEdGUF9LRVJORUwpOworCisJaWYgKGlucy0+bW9kdWxlcyA9PSBOVUxMKSB7CisJCWNzNDZ4eF9kc3Bfc3Bvc19kZXN0cm95KGNoaXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBkZWZhdWx0IFNQRElGIGlucHV0IHNhbXBsZSByYXRlCisJICAgdG8gNDgwMDAga2h6ICovCisJaW5zLT5zcGRpZl9pbl9zYW1wbGVfcmF0ZSA9IDQ4MDAwOworCisJLyogbWF4aW1pemUgdm9sdW1lICovCisJaW5zLT5kYWNfdm9sdW1lX3JpZ2h0ID0gMHg4MDAwOworCWlucy0+ZGFjX3ZvbHVtZV9sZWZ0ID0gMHg4MDAwOworCWlucy0+c3BkaWZfaW5wdXRfdm9sdW1lX3JpZ2h0ID0gMHg4MDAwOworCWlucy0+c3BkaWZfaW5wdXRfdm9sdW1lX2xlZnQgPSAweDgwMDA7CisKKwkvKiBzZXQgbGVmdCBhbmQgcmlnaHQgdmFsaWRpdHkgYml0cyBhbmQKKwkgICBkZWZhdWx0IGNoYW5uZWwgc3RhdHVzICovCisJaW5zLT5zcGRpZl9jc3V2X2RlZmF1bHQgPSAKKwkJaW5zLT5zcGRpZl9jc3V2X3N0cmVhbSA9ICAKKwkgLyogYnl0ZSAwICovICAoKHVuc2lnbmVkIGludClfd3JhcF9hbGxfYml0cyggIChTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUYgICAgICAgICYgMHhmZikpIDw8IDI0KSB8CisJIC8qIGJ5dGUgMSAqLyAgKCh1bnNpZ25lZCBpbnQpX3dyYXBfYWxsX2JpdHMoICgoU05EUlZfUENNX0RFRkFVTFRfQ09OX1NQRElGID4+IDgpICYgMHhmZikpIDw8IDE2KSB8CisJIC8qIGJ5dGUgMyAqLyAgICh1bnNpZ25lZCBpbnQpX3dyYXBfYWxsX2JpdHMoICAoU05EUlZfUENNX0RFRkFVTFRfQ09OX1NQRElGID4+IDI0KSAmIDB4ZmYpIHwKKwkgLyogbGVmdCBhbmQgcmlnaHQgdmFsaWRpdHkgYml0cyAqLyAoMSA8PCAxMykgfCAoMSA8PCAxMik7CisKKwlyZXR1cm4gaW5zOworfQorCit2b2lkICBjczQ2eHhfZHNwX3Nwb3NfZGVzdHJveSAoY3M0Nnh4X3QgKiBjaGlwKQoreworCWludCBpOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCXNuZF9hc3NlcnQoaW5zICE9IE5VTEwsIHJldHVybik7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zLT5uc2NiOyArK2kpIHsKKwkJaWYgKGlucy0+c2Nic1tpXS5kZWxldGVkKSBjb250aW51ZTsKKworCQljczQ2eHhfZHNwX3Byb2NfZnJlZV9zY2JfZGVzYyAoIChpbnMtPnNjYnMgKyBpKSApOworCX0KKworCWtmcmVlKGlucy0+Y29kZS5kYXRhKTsKKwl2ZnJlZShpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzKTsKKwlrZnJlZShpbnMtPm1vZHVsZXMpOworCWtmcmVlKGlucyk7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworfQorCitpbnQgY3M0Nnh4X2RzcF9sb2FkX21vZHVsZSAoY3M0Nnh4X3QgKiBjaGlwLCBkc3BfbW9kdWxlX2Rlc2NfdCAqIG1vZHVsZSkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJc2VnbWVudF9kZXNjX3QgKiBjb2RlID0gZ2V0X3NlZ21lbnRfZGVzYyAobW9kdWxlLFNFR1RZUEVfU1BfUFJPR1JBTSk7CisJc2VnbWVudF9kZXNjX3QgKiBwYXJhbWV0ZXIgPSBnZXRfc2VnbWVudF9kZXNjIChtb2R1bGUsU0VHVFlQRV9TUF9QQVJBTUVURVIpOworCXNlZ21lbnRfZGVzY190ICogc2FtcGxlID0gZ2V0X3NlZ21lbnRfZGVzYyAobW9kdWxlLFNFR1RZUEVfU1BfU0FNUExFKTsKKwl1MzIgZG9mZnNldCwgZHNpemU7CisKKwlpZiAoaW5zLT5ubW9kdWxlcyA9PSBEU1BfTUFYX01PRFVMRVMgLSAxKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiB0byBtYW55IG1vZHVsZXMgbG9hZGVkIGludG8gRFNQXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBsb2FkaW5nIG1vZHVsZSAlcyBpbnRvIERTUFxuIiwgbW9kdWxlLT5tb2R1bGVfbmFtZSk7CisgIAorCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKKwkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBwYXJhbWV0ZXIgYXJlYVxuIik7CisJCXNuZF9jczQ2eHhfY2xlYXJfQkExKGNoaXAsIERTUF9QQVJBTUVURVJfQllURV9PRkZTRVQsIERTUF9QQVJBTUVURVJfQllURV9TSVpFKTsKKwl9CisgIAorCWlmIChwYXJhbWV0ZXIgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gcGFyYW1ldGVyIHNlZ21lbnRcbiIpOworCX0gZWxzZSB7CisJCWlmIChpbnMtPm5tb2R1bGVzID4gMCkgeworCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImRzcF9zcG9zOiBXQVJOSU5HIGN1cnJlbnQgcGFyYW1ldGVyIGRhdGEgbWF5IGJlIG92ZXJ3cml0ZW4hXG4iKTsKKwkJfQorCisJCWRvZmZzZXQgPSAocGFyYW1ldGVyLT5vZmZzZXQgKiA0ICsgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCk7CisJCWRzaXplICAgPSBwYXJhbWV0ZXItPnNpemUgKiA0OworCisJCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgcGFyYW1ldGVyIGRhdGEgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKKwkJCSAgICBkb2Zmc2V0LGRvZmZzZXQgKyBkc2l6ZSk7CisKKwkJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsIHBhcmFtZXRlci0+ZGF0YSwgZG9mZnNldCwgZHNpemUpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGRvd25sb2FkIHBhcmFtZXRlciBkYXRhIHRvIERTUFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChpbnMtPm5tb2R1bGVzID09IDApIHsKKwkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBjbGVhcmluZyBzYW1wbGUgYXJlYVxuIik7CisJCXNuZF9jczQ2eHhfY2xlYXJfQkExKGNoaXAsIERTUF9TQU1QTEVfQllURV9PRkZTRVQsIERTUF9TQU1QTEVfQllURV9TSVpFKTsKKwl9CisKKwlpZiAoc2FtcGxlID09IE5VTEwpIHsKKwkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBtb2R1bGUgZ290IG5vIHNhbXBsZSBzZWdtZW50XG4iKTsKKwl9IGVsc2UgeworCQlpZiAoaW5zLT5ubW9kdWxlcyA+IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJkc3Bfc3BvczogV0FSTklORyBjdXJyZW50IHNhbXBsZSBkYXRhIG1heSBiZSBvdmVyd3JpdGVuXG4iKTsKKwkJfQorCisJCWRvZmZzZXQgPSAoc2FtcGxlLT5vZmZzZXQgKiA0ICArIERTUF9TQU1QTEVfQllURV9PRkZTRVQpOworCQlkc2l6ZSAgID0gIHNhbXBsZS0+c2l6ZSAqIDQ7CisKKwkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBkb3dubG9hZGluZyBzYW1wbGUgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCQkJICAgIGRvZmZzZXQsZG9mZnNldCArIGRzaXplKTsKKworCQlpZiAoc25kX2NzNDZ4eF9kb3dubG9hZCAoY2hpcCxzYW1wbGUtPmRhdGEsZG9mZnNldCxkc2l6ZSkpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gc2FtcGxlIGRhdGEgdG8gRFNQXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisKKwlpZiAoaW5zLT5ubW9kdWxlcyA9PSAwKSB7CisJCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY2xlYXJpbmcgY29kZSBhcmVhXG4iKTsKKwkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX0NPREVfQllURV9PRkZTRVQsIERTUF9DT0RFX0JZVEVfU0laRSk7CisJfQorCisJaWYgKGNvZGUgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gY29kZSBzZWdtZW50XG4iKTsKKwl9IGVsc2UgeworCQlpZiAoaW5zLT5jb2RlLm9mZnNldCArIGNvZGUtPnNpemUgPiBEU1BfQ09ERV9CWVRFX1NJWkUpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBubyBzcGFjZSBhdmFpbGFibGUgaW4gRFNQXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbW9kdWxlLT5sb2FkX2FkZHJlc3MgPSBpbnMtPmNvZGUub2Zmc2V0OworCQltb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyA9IDB4MDAwOworCisJCS8qIGlmIG1vZHVsZSBoYXMgYSBjb2RlIHNlZ21lbnQgaXQgbXVzdCBoYXZlCisJCSAgIHN5bWJvbCB0YWJsZSAqLworCQlzbmRfYXNzZXJ0KG1vZHVsZS0+c3ltYm9sX3RhYmxlLnN5bWJvbHMgIT0gTlVMTCAscmV0dXJuIC1FTk9NRU0pOworCQlpZiAoYWRkX3N5bWJvbHMoY2hpcCxtb2R1bGUpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisgICAgCisJCWRvZmZzZXQgPSAoY29kZS0+b2Zmc2V0ICogNCArIGlucy0+Y29kZS5vZmZzZXQgKiA0ICsgRFNQX0NPREVfQllURV9PRkZTRVQpOworCQlkc2l6ZSAgID0gY29kZS0+c2l6ZSAqIDQ7CisJCXNuZF9wcmludGRkKCJkc3Bfc3BvczogZG93bmxvYWRpbmcgY29kZSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAorCQkJICAgIGRvZmZzZXQsZG9mZnNldCArIGRzaXplKTsgICAKKworCQltb2R1bGUtPm5maXh1cHMgPSBzaGFkb3dfYW5kX3JlYWxsb2NhdGVfY29kZShjaGlwLGNvZGUtPmRhdGEsY29kZS0+c2l6ZSxtb2R1bGUtPm92ZXJsYXlfYmVnaW5fYWRkcmVzcyk7CisKKwkJaWYgKHNuZF9jczQ2eHhfZG93bmxvYWQgKGNoaXAsKGlucy0+Y29kZS5kYXRhICsgaW5zLT5jb2RlLm9mZnNldCksZG9mZnNldCxkc2l6ZSkpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gZG93bmxvYWQgY29kZSB0byBEU1BcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbnMtPmNvZGUub2Zmc2V0ICs9IGNvZGUtPnNpemU7CisJfQorCisJLyogTk9URTogbW9kdWxlIHNlZ21lbnRzIGFuZCBzeW1ib2wgdGFibGUgbXVzdCBiZQorCSAgIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiBDYXNlIHRoYXQgbW9kdWxlIGRhdGEgaXMKKwkgICBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBvc3BwYXJzZXIgKi8KKwlpbnMtPm1vZHVsZXNbaW5zLT5ubW9kdWxlc10gPSAqbW9kdWxlOworCWlucy0+bm1vZHVsZXMrKzsKKworCXJldHVybiAwOworfQorCitzeW1ib2xfZW50cnlfdCAqIGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbCAoY3M0Nnh4X3QgKiBjaGlwLCBjaGFyICogc3ltYm9sX25hbWUsIGludCBzeW1ib2xfdHlwZSkKK3sKKwlpbnQgaTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlmb3IgKCBpID0gMDsgaSA8IGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzOyArK2kgKSB7CisKKwkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uZGVsZXRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyY21wKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUsc3ltYm9sX25hbWUpICYmCisJCSAgICBpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF90eXBlID09IHN5bWJvbF90eXBlKSB7CisJCQlyZXR1cm4gKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHMgKyBpKTsKKwkJfQorCX0KKworI2lmIDAKKwlwcmludGsgKCJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gdHlwZSAlMDJ4IG5vdCBmb3VuZFxuIiwKKwkJc3ltYm9sX25hbWUsc3ltYm9sX3R5cGUpOworI2VuZGlmCisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgc3ltYm9sX2VudHJ5X3QgKiBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2xfYWRkciAoY3M0Nnh4X3QgKiBjaGlwLCB1MzIgYWRkcmVzcywgaW50IHN5bWJvbF90eXBlKQoreworCWludCBpOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHM7ICsraSApIHsKKworCQlpZiAoaW5zLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tpXS5kZWxldGVkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uYWRkcmVzcyA9PSBhZGRyZXNzICYmCisJCSAgICBpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF90eXBlID09IHN5bWJvbF90eXBlKSB7CisJCQlyZXR1cm4gKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHMgKyBpKTsKKwkJfQorCX0KKworCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgY3M0Nnh4X2RzcF9wcm9jX3N5bWJvbF90YWJsZV9yZWFkIChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlpbnQgaTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNZTUJPTFM6XG4iKTsKKwlmb3IgKCBpID0gMDsgaSA8IGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzOyArK2kgKSB7CisJCWNoYXIgKm1vZHVsZV9zdHIgPSAic3lzdGVtIjsKKworCQlpZiAoaW5zLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tpXS5kZWxldGVkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0ubW9kdWxlICE9IE5VTEwpIHsKKwkJCW1vZHVsZV9zdHIgPSBpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLm1vZHVsZS0+bW9kdWxlX25hbWU7CisJCX0KKworICAgIAorCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDRYIDwlMDJYPiAlcyBbJXNdXG4iLAorCQkJICAgIGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uYWRkcmVzcywKKwkJCSAgICBpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF90eXBlLAorCQkJICAgIGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHNbaV0uc3ltYm9sX25hbWUsCisJCQkgICAgbW9kdWxlX3N0cik7ICAgIAorCX0KK30KKworCitzdGF0aWMgdm9pZCBjczQ2eHhfZHNwX3Byb2NfbW9kdWxlc19yZWFkIChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlpbnQgaSxqOworCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiTU9EVUxFUzpcbiIpOworCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5ubW9kdWxlczsgKytpICkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiVzOlxuIiwgaW5zLT5tb2R1bGVzW2ldLm1vZHVsZV9uYW1lKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICAgJWQgc3ltYm9sc1xuIiwgaW5zLT5tb2R1bGVzW2ldLnN5bWJvbF90YWJsZS5uc3ltYm9scyk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgICVkIGZpeHVwc1xuIiwgaW5zLT5tb2R1bGVzW2ldLm5maXh1cHMpOworCisJCWZvciAoaiA9IDA7IGogPCBpbnMtPm1vZHVsZXNbaV0ubnNlZ21lbnRzOyArKyBqKSB7CisJCQlzZWdtZW50X2Rlc2NfdCAqIGRlc2MgPSAoaW5zLT5tb2R1bGVzW2ldLnNlZ21lbnRzICsgaik7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgICBzZWdtZW50ICUwMnggb2Zmc2V0ICUwOHggc2l6ZSAlMDh4XG4iLAorCQkJCSAgICBkZXNjLT5zZWdtZW50X3R5cGUsZGVzYy0+b2Zmc2V0LCBkZXNjLT5zaXplKTsKKwkJfQorCX0KKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfcHJvY190YXNrX3RyZWVfcmVhZCAoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNzNDZ4eF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJaW50IGksaixjb2w7CisJdm9pZCBfX2lvbWVtICpkc3QgPSBjaGlwLT5yZWdpb24uaWR4WzFdLnJlbWFwX2FkZHIgKyBEU1BfUEFSQU1FVEVSX0JZVEVfT0ZGU0VUOworCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiVEFTSyBUUkVFUzpcbiIpOworCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5udGFzazsgKytpKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4lMDR4ICVzOlxuIixpbnMtPnRhc2tzW2ldLmFkZHJlc3MsaW5zLT50YXNrc1tpXS50YXNrX25hbWUpOworCisJCWZvciAoY29sID0gMCxqID0gMDtqIDwgaW5zLT50YXNrc1tpXS5zaXplOyBqKyssY29sKyspIHsKKwkJCXUzMiB2YWw7CisJCQlpZiAoY29sID09IDQpIHsKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJCQkJY29sID0gMDsKKwkJCX0KKwkJCXZhbCA9IHJlYWRsKGRzdCArIChpbnMtPnRhc2tzW2ldLmFkZHJlc3MgKyBqKSAqIHNpemVvZih1MzIpKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4eCAiLHZhbCk7CisJCX0KKwl9CisKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7ICAKKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfcHJvY19zY2JfcmVhZCAoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNzNDZ4eF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJaW50IGk7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTQ0InczpcbiIpOworCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5uc2NiOyArK2kpIHsKKwkJaWYgKGlucy0+c2Nic1tpXS5kZWxldGVkKQorCQkJY29udGludWU7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4lMDR4ICVzOlxuXG4iLGlucy0+c2Nic1tpXS5hZGRyZXNzLGlucy0+c2Nic1tpXS5zY2JfbmFtZSk7CisKKwkJaWYgKGlucy0+c2Nic1tpXS5wYXJlbnRfc2NiX3B0ciAhPSBOVUxMKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsInBhcmVudCBbJXM6JTA0eF0gIiwgCisJCQkJICAgIGlucy0+c2Nic1tpXS5wYXJlbnRfc2NiX3B0ci0+c2NiX25hbWUsCisJCQkJICAgIGlucy0+c2Nic1tpXS5wYXJlbnRfc2NiX3B0ci0+YWRkcmVzcyk7CisJCX0gZWxzZSBzbmRfaXByaW50ZihidWZmZXIsInBhcmVudCBbbm9uZV0gIik7CisKKwkJc25kX2lwcmludGYoYnVmZmVyLCJzdWJfbGlzdF9wdHIgWyVzOiUwNHhdXG5uZXh0X3NjYl9wdHIgWyVzOiUwNHhdICB0YXNrX2VudHJ5IFslczolMDR4XVxuIiwKKwkJCSAgICBpbnMtPnNjYnNbaV0uc3ViX2xpc3RfcHRyLT5zY2JfbmFtZSwKKwkJCSAgICBpbnMtPnNjYnNbaV0uc3ViX2xpc3RfcHRyLT5hZGRyZXNzLAorCQkJICAgIGlucy0+c2Nic1tpXS5uZXh0X3NjYl9wdHItPnNjYl9uYW1lLAorCQkJICAgIGlucy0+c2Nic1tpXS5uZXh0X3NjYl9wdHItPmFkZHJlc3MsCisJCQkgICAgaW5zLT5zY2JzW2ldLnRhc2tfZW50cnktPnN5bWJvbF9uYW1lLAorCQkJICAgIGlucy0+c2Nic1tpXS50YXNrX2VudHJ5LT5hZGRyZXNzKTsKKwl9CisKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjczQ2eHhfZHNwX3Byb2NfcGFyYW1ldGVyX2R1bXBfcmVhZCAoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWNzNDZ4eF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwkvKmRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsgKi8KKwl1bnNpZ25lZCBpbnQgaSxjb2wgPSAwOworCXZvaWQgX19pb21lbSAqZHN0ID0gY2hpcC0+cmVnaW9uLmlkeFsxXS5yZW1hcF9hZGRyICsgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVDsKKwlzeW1ib2xfZW50cnlfdCAqIHN5bWJvbDsgCisKKwlmb3IgKGkgPSAwO2kgPCBEU1BfUEFSQU1FVEVSX0JZVEVfU0laRTsgaSArPSBzaXplb2YodTMyKSxjb2wgKyspIHsKKwkJaWYgKGNvbCA9PSA0KSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJCQljb2wgPSAwOworCQl9CisKKwkJaWYgKCAoc3ltYm9sID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sX2FkZHIgKGNoaXAsaSAvIHNpemVvZih1MzIpLCBTWU1CT0xfUEFSQU1FVEVSKSkgIT0gTlVMTCkgeworCQkJY29sID0gMDsKKwkJCXNuZF9pcHJpbnRmIChidWZmZXIsIlxuJXM6XG4iLHN5bWJvbC0+c3ltYm9sX25hbWUpOworCQl9CisKKwkJaWYgKGNvbCA9PSAwKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDRYICIsIGkgLyAodW5zaWduZWQgaW50KXNpemVvZih1MzIpKTsKKwkJfQorCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfcHJvY19zYW1wbGVfZHVtcF9yZWFkIChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJY3M0Nnh4X3QgKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWludCBpLGNvbCA9IDA7CisJdm9pZCBfX2lvbWVtICpkc3QgPSBjaGlwLT5yZWdpb24uaWR4WzJdLnJlbWFwX2FkZHI7CisKKwlzbmRfaXByaW50ZihidWZmZXIsIlBDTVJFQURFUjpcbiIpOworCWZvciAoaSA9IFBDTV9SRUFERVJfQlVGMTtpIDwgUENNX1JFQURFUl9CVUYxICsgMHgzMDsgaSArPSBzaXplb2YodTMyKSxjb2wgKyspIHsKKwkJaWYgKGNvbCA9PSA0KSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJCQljb2wgPSAwOworCQl9CisKKwkJaWYgKGNvbCA9PSAwKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDRYICIsaSk7CisJCX0KKworCQlzbmRfaXByaW50ZihidWZmZXIsIiUwOFggIixyZWFkbChkc3QgKyBpKSk7CisJfQorCisJc25kX2lwcmludGYoYnVmZmVyLCJcbk1JWF9TQU1QTEVfQlVGMTpcbiIpOworCisJY29sID0gMDsKKwlmb3IgKGkgPSBNSVhfU0FNUExFX0JVRjE7aSA8IE1JWF9TQU1QTEVfQlVGMSArIDB4NDA7IGkgKz0gc2l6ZW9mKHUzMiksY29sICsrKSB7CisJCWlmIChjb2wgPT0gNCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCJcbiIpOworCQkJY29sID0gMDsKKwkJfQorCisJCWlmIChjb2wgPT0gMCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTA0WCAiLGkpOworCQl9CisKKwkJc25kX2lwcmludGYoYnVmZmVyLCIlMDhYICIscmVhZGwoZHN0ICsgaSkpOworCX0KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG5TUkNfVEFTS19TQ0IxOlxuIik7CisJY29sID0gMDsKKwlmb3IgKGkgPSAweDI0ODAgOyBpIDwgMHgyNDgwICsgMHg0MCA7IGkgKz0gc2l6ZW9mKHUzMiksY29sICsrKSB7CisJCWlmIChjb2wgPT0gNCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCJcbiIpOworCQkJY29sID0gMDsKKwkJfQorCQkKKwkJaWYgKGNvbCA9PSAwKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDRYICIsaSk7CisJCX0KKworCQlzbmRfaXByaW50ZihidWZmZXIsIiUwOFggIixyZWFkbChkc3QgKyBpKSk7CisJfQorCisKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuU1BESUZPX0JVRkZFUjpcbiIpOworCWNvbCA9IDA7CisJZm9yIChpID0gU1BESUZPX0lQX09VVFBVVF9CVUZGRVIxO2kgPCBTUERJRk9fSVBfT1VUUFVUX0JVRkZFUjEgKyAweDMwOyBpICs9IHNpemVvZih1MzIpLGNvbCArKykgeworCQlpZiAoY29sID09IDQpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4iKTsKKwkJCWNvbCA9IDA7CisJCX0KKworCQlpZiAoY29sID09IDApIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwNFggIixpKTsKKwkJfQorCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9CisKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuLi4uXG4iKTsKKwljb2wgPSAwOworCisJZm9yIChpID0gU1BESUZPX0lQX09VVFBVVF9CVUZGRVIxKzB4RDA7aSA8IFNQRElGT19JUF9PVVRQVVRfQlVGRkVSMSArIDB4MTEwOyBpICs9IHNpemVvZih1MzIpLGNvbCArKykgeworCQlpZiAoY29sID09IDQpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4iKTsKKwkJCWNvbCA9IDA7CisJCX0KKworCQlpZiAoY29sID09IDApIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwNFggIixpKTsKKwkJfQorCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9CisKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG5PVVRQVVRfU05PT1A6XG4iKTsKKwljb2wgPSAwOworCWZvciAoaSA9IE9VVFBVVF9TTk9PUF9CVUZGRVI7aSA8IE9VVFBVVF9TTk9PUF9CVUZGRVIgKyAweDQwOyBpICs9IHNpemVvZih1MzIpLGNvbCArKykgeworCQlpZiAoY29sID09IDQpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4iKTsKKwkJCWNvbCA9IDA7CisJCX0KKworCQlpZiAoY29sID09IDApIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwNFggIixpKTsKKwkJfQorCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9CisKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuQ09ERUNfSU5QVVRfQlVGMTogXG4iKTsKKwljb2wgPSAwOworCWZvciAoaSA9IENPREVDX0lOUFVUX0JVRjE7aSA8IENPREVDX0lOUFVUX0JVRjEgKyAweDQwOyBpICs9IHNpemVvZih1MzIpLGNvbCArKykgeworCQlpZiAoY29sID09IDQpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4iKTsKKwkJCWNvbCA9IDA7CisJCX0KKworCQlpZiAoY29sID09IDApIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwNFggIixpKTsKKwkJfQorCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9CisjaWYgMAorCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG5XUklURV9CQUNLX0JVRjE6IFxuIik7CisJY29sID0gMDsKKwlmb3IgKGkgPSBXUklURV9CQUNLX0JVRjE7aSA8IFdSSVRFX0JBQ0tfQlVGMSArIDB4NDA7IGkgKz0gc2l6ZW9mKHUzMiksY29sICsrKSB7CisJCWlmIChjb2wgPT0gNCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCJcbiIpOworCQkJY29sID0gMDsKKwkJfQorCisJCWlmIChjb2wgPT0gMCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTA0WCAiLGkpOworCQl9CisKKwkJc25kX2lwcmludGYoYnVmZmVyLCIlMDhYICIscmVhZGwoZHN0ICsgaSkpOworCX0KKyNlbmRpZgorCisJc25kX2lwcmludGYoYnVmZmVyLCJcblNQRElGSV9JUF9PVVRQVVRfQlVGRkVSMTogXG4iKTsKKwljb2wgPSAwOworCWZvciAoaSA9IFNQRElGSV9JUF9PVVRQVVRfQlVGRkVSMTtpIDwgU1BESUZJX0lQX09VVFBVVF9CVUZGRVIxICsgMHg4MDsgaSArPSBzaXplb2YodTMyKSxjb2wgKyspIHsKKwkJaWYgKGNvbCA9PSA0KSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJCQljb2wgPSAwOworCQl9CisKKwkJaWYgKGNvbCA9PSAwKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDRYICIsaSk7CisJCX0KKwkJCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4WCAiLHJlYWRsKGRzdCArIGkpKTsKKwl9CisJc25kX2lwcmludGYoYnVmZmVyLCJcbiIpOworfQorCitpbnQgY3M0Nnh4X2RzcF9wcm9jX2luaXQgKHNuZF9jYXJkX3QgKiBjYXJkLCBjczQ2eHhfdCAqY2hpcCkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJaW50IGk7CisKKwlpbnMtPnNuZF9jYXJkID0gY2FyZDsKKworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAiZHNwIiwgY2FyZC0+cHJvY19yb290KSkgIT0gTlVMTCkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOworCQllbnRyeS0+bW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKKwkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA1MTI7CisgICAgICAKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCisJaW5zLT5wcm9jX2RzcF9kaXIgPSBlbnRyeTsKKworCWlmICghaW5zLT5wcm9jX2RzcF9kaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsICJzcG9zX3N5bWJvbHMiLCBpbnMtPnByb2NfZHNwX2RpcikpICE9IE5VTEwpIHsKKwkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSOworCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDUxMjsKKwkJZW50cnktPmMudGV4dC5yZWFkID0gY3M0Nnh4X2RzcF9wcm9jX3N5bWJvbF90YWJsZV9yZWFkOworCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgeworCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9CisJaW5zLT5wcm9jX3N5bV9pbmZvX2VudHJ5ID0gZW50cnk7CisgICAgCisJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsICJzcG9zX21vZHVsZXMiLCBpbnMtPnByb2NfZHNwX2RpcikpICE9IE5VTEwpIHsKKwkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSOworCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDUxMjsKKwkJZW50cnktPmMudGV4dC5yZWFkID0gY3M0Nnh4X2RzcF9wcm9jX21vZHVsZXNfcmVhZDsKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCWlucy0+cHJvY19tb2R1bGVzX2luZm9fZW50cnkgPSBlbnRyeTsKKworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAicGFyYW1ldGVyIiwgaW5zLT5wcm9jX2RzcF9kaXIpKSAhPSBOVUxMKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKKwkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA1MTI7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IGNzNDZ4eF9kc3BfcHJvY19wYXJhbWV0ZXJfZHVtcF9yZWFkOworCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgeworCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9CisJaW5zLT5wcm9jX3BhcmFtZXRlcl9kdW1wX2luZm9fZW50cnkgPSBlbnRyeTsKKworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAic2FtcGxlIiwgaW5zLT5wcm9jX2RzcF9kaXIpKSAhPSBOVUxMKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKKwkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA1MTI7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IGNzNDZ4eF9kc3BfcHJvY19zYW1wbGVfZHVtcF9yZWFkOworCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgeworCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9CisJaW5zLT5wcm9jX3NhbXBsZV9kdW1wX2luZm9fZW50cnkgPSBlbnRyeTsKKworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAidGFza190cmVlIiwgaW5zLT5wcm9jX2RzcF9kaXIpKSAhPSBOVUxMKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKKwkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA1MTI7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IGNzNDZ4eF9kc3BfcHJvY190YXNrX3RyZWVfcmVhZDsKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCWlucy0+cHJvY190YXNrX2luZm9fZW50cnkgPSBlbnRyeTsKKworCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAic2NiX2luZm8iLCBpbnMtPnByb2NfZHNwX2RpcikpICE9IE5VTEwpIHsKKwkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSOworCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDEwMjQ7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IGNzNDZ4eF9kc3BfcHJvY19zY2JfcmVhZDsKKwkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKKwkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJZW50cnkgPSBOVUxMOworCQl9CisJfQorCWlucy0+cHJvY19zY2JfaW5mb19lbnRyeSA9IGVudHJ5OworCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJLyogcmVnaXN0ZXIvdXBkYXRlIFNDQidzIGVudHJpZXMgb24gcHJvYyAqLworCWZvciAoaSA9IDA7IGkgPCBpbnMtPm5zY2I7ICsraSkgeworCQlpZiAoaW5zLT5zY2JzW2ldLmRlbGV0ZWQpIGNvbnRpbnVlOworCisJCWNzNDZ4eF9kc3BfcHJvY19yZWdpc3Rlcl9zY2JfZGVzYyAoY2hpcCwgKGlucy0+c2NicyArIGkpKTsKKwl9CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX3Byb2NfZG9uZSAoY3M0Nnh4X3QgKmNoaXApCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWludCBpOworCisJaWYgKGlucy0+cHJvY19zeW1faW5mb19lbnRyeSkgeworCQlzbmRfaW5mb191bnJlZ2lzdGVyKGlucy0+cHJvY19zeW1faW5mb19lbnRyeSk7CisJCWlucy0+cHJvY19zeW1faW5mb19lbnRyeSA9IE5VTEw7CisJfQorICAKKwlpZiAoaW5zLT5wcm9jX21vZHVsZXNfaW5mb19lbnRyeSkgeworCQlzbmRfaW5mb191bnJlZ2lzdGVyKGlucy0+cHJvY19tb2R1bGVzX2luZm9fZW50cnkpOworCQlpbnMtPnByb2NfbW9kdWxlc19pbmZvX2VudHJ5ID0gTlVMTDsKKwl9CisgCisJaWYgKGlucy0+cHJvY19wYXJhbWV0ZXJfZHVtcF9pbmZvX2VudHJ5KSB7CisJCXNuZF9pbmZvX3VucmVnaXN0ZXIoaW5zLT5wcm9jX3BhcmFtZXRlcl9kdW1wX2luZm9fZW50cnkpOworCQlpbnMtPnByb2NfcGFyYW1ldGVyX2R1bXBfaW5mb19lbnRyeSA9IE5VTEw7CisJfQorICAKKwlpZiAoaW5zLT5wcm9jX3NhbXBsZV9kdW1wX2luZm9fZW50cnkpIHsKKwkJc25kX2luZm9fdW5yZWdpc3RlcihpbnMtPnByb2Nfc2FtcGxlX2R1bXBfaW5mb19lbnRyeSk7CisJCWlucy0+cHJvY19zYW1wbGVfZHVtcF9pbmZvX2VudHJ5ID0gTlVMTDsKKwl9CisgIAorCWlmIChpbnMtPnByb2Nfc2NiX2luZm9fZW50cnkpIHsKKwkJc25kX2luZm9fdW5yZWdpc3RlcihpbnMtPnByb2Nfc2NiX2luZm9fZW50cnkpOworCQlpbnMtPnByb2Nfc2NiX2luZm9fZW50cnkgPSBOVUxMOworCX0KKyAgCisJaWYgKGlucy0+cHJvY190YXNrX2luZm9fZW50cnkpIHsKKwkJc25kX2luZm9fdW5yZWdpc3RlcihpbnMtPnByb2NfdGFza19pbmZvX2VudHJ5KTsKKwkJaW5zLT5wcm9jX3Rhc2tfaW5mb19lbnRyeSA9IE5VTEw7CisJfQorCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IGlucy0+bnNjYjsgKytpKSB7CisJCWlmIChpbnMtPnNjYnNbaV0uZGVsZXRlZCkgY29udGludWU7CisJCWNzNDZ4eF9kc3BfcHJvY19mcmVlX3NjYl9kZXNjICggKGlucy0+c2NicyArIGkpICk7CisJfQorCXVwKCZjaGlwLT5zcG9zX211dGV4KTsKKworCWlmIChpbnMtPnByb2NfZHNwX2RpcikgeworCQlzbmRfaW5mb191bnJlZ2lzdGVyIChpbnMtPnByb2NfZHNwX2Rpcik7CisJCWlucy0+cHJvY19kc3BfZGlyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z190cmVlOworc3RhdGljIHZvaWQgX2RzcF9jcmVhdGVfdGFza190cmVlIChjczQ2eHhfdCAqY2hpcCx1MzIgKiB0YXNrX2RhdGEsIHUzMiAgZGVzdCwgaW50IHNpemUpCit7CisJdm9pZCBfX2lvbWVtICpzcGRzdCA9IGNoaXAtPnJlZ2lvbi5pZHhbMV0ucmVtYXBfYWRkciArIAorCQlEU1BfUEFSQU1FVEVSX0JZVEVfT0ZGU0VUICsgZGVzdCAqIHNpemVvZih1MzIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQlpZiAoZGVidWdfdHJlZSkgcHJpbnRrICgiYWRkciAlcCwgdmFsICUwOHhcbiIsc3Bkc3QsdGFza19kYXRhW2ldKTsKKwkJd3JpdGVsKHRhc2tfZGF0YVtpXSxzcGRzdCk7CisJCXNwZHN0ICs9IHNpemVvZih1MzIpOworCX0KK30KKworc3RhdGljIGludCBkZWJ1Z19zY2I7CitzdGF0aWMgdm9pZCBfZHNwX2NyZWF0ZV9zY2IgKGNzNDZ4eF90ICpjaGlwLHUzMiAqIHNjYl9kYXRhLCB1MzIgIGRlc3QpCit7CisJdm9pZCBfX2lvbWVtICpzcGRzdCA9IGNoaXAtPnJlZ2lvbi5pZHhbMV0ucmVtYXBfYWRkciArIAorCQlEU1BfUEFSQU1FVEVSX0JZVEVfT0ZGU0VUICsgZGVzdCAqIHNpemVvZih1MzIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4MTA7ICsraSkgeworCQlpZiAoZGVidWdfc2NiKSBwcmludGsgKCJhZGRyICVwLCB2YWwgJTA4eFxuIixzcGRzdCxzY2JfZGF0YVtpXSk7CisJCXdyaXRlbChzY2JfZGF0YVtpXSxzcGRzdCk7CisJCXNwZHN0ICs9IHNpemVvZih1MzIpOworCX0KK30KKworc3RhdGljIGludCBmaW5kX2ZyZWVfc2NiX2luZGV4IChkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zKQoreworCWludCBpbmRleCA9IGlucy0+bnNjYiwgaTsKKworCWZvciAoaSA9IGlucy0+c2NiX2hpZ2hlc3RfZnJhZ19pbmRleDsgaSA8IGlucy0+bnNjYjsgKytpKSB7CisJCWlmIChpbnMtPnNjYnNbaV0uZGVsZXRlZCkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIF9tYXBfc2NiIChjczQ2eHhfdCAqY2hpcCxjaGFyICogbmFtZSx1MzIgZGVzdCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBkZXNjID0gTlVMTDsKKwlpbnQgaW5kZXg7CisKKwlpZiAoaW5zLT5uc2NiID09IERTUF9NQVhfU0NCX0RFU0MgLSAxKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFNDQlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWluZGV4ID0gZmluZF9mcmVlX3NjYl9pbmRleCAoaW5zKTsKKworCXN0cmNweShpbnMtPnNjYnNbaW5kZXhdLnNjYl9uYW1lLCBuYW1lKTsKKwlpbnMtPnNjYnNbaW5kZXhdLmFkZHJlc3MgPSBkZXN0OworCWlucy0+c2Nic1tpbmRleF0uaW5kZXggPSBpbmRleDsKKwlpbnMtPnNjYnNbaW5kZXhdLnByb2NfaW5mbyA9IE5VTEw7CisJaW5zLT5zY2JzW2luZGV4XS5yZWZfY291bnQgPSAxOworCWlucy0+c2Nic1tpbmRleF0uZGVsZXRlZCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmlucy0+c2Nic1tpbmRleF0ubG9jayk7CisKKwlkZXNjID0gKGlucy0+c2NicyArIGluZGV4KTsKKwlpbnMtPnNjYnNbaW5kZXhdLnNjYl9zeW1ib2wgPSBhZGRfc3ltYm9sIChjaGlwLCBuYW1lLCBkZXN0LCBTWU1CT0xfUEFSQU1FVEVSKTsKKworCWlmIChpbmRleCA+IGlucy0+c2NiX2hpZ2hlc3RfZnJhZ19pbmRleCkKKwkJaW5zLT5zY2JfaGlnaGVzdF9mcmFnX2luZGV4ID0gaW5kZXg7CisKKwlpZiAoaW5kZXggPT0gaW5zLT5uc2NiKQorCQlpbnMtPm5zY2IrKzsKKworCXJldHVybiBkZXNjOworfQorCitzdGF0aWMgZHNwX3Rhc2tfZGVzY3JpcHRvcl90ICogX21hcF90YXNrX3RyZWUgKGNzNDZ4eF90ICpjaGlwLGNoYXIgKiBuYW1lLHUzMiBkZXN0LHUzMiBzaXplKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlkc3BfdGFza19kZXNjcmlwdG9yX3QgKiBkZXNjID0gTlVMTDsKKworCWlmIChpbnMtPm50YXNrID09IERTUF9NQVhfVEFTS19ERVNDIC0gMSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZ290IG5vIHBsYWNlIGZvciBvdGhlciBUQVNLXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3RyY3B5KGlucy0+dGFza3NbaW5zLT5udGFza10udGFza19uYW1lLG5hbWUpOworCWlucy0+dGFza3NbaW5zLT5udGFza10uYWRkcmVzcyA9IGRlc3Q7CisJaW5zLT50YXNrc1tpbnMtPm50YXNrXS5zaXplID0gc2l6ZTsKKworCS8qIHF1aWNrIGZpbmQgaW4gbGlzdCAqLworCWlucy0+dGFza3NbaW5zLT5udGFza10uaW5kZXggPSBpbnMtPm50YXNrOworCWRlc2MgPSAoaW5zLT50YXNrcyArIGlucy0+bnRhc2spOworCWlucy0+bnRhc2srKzsKKworCWFkZF9zeW1ib2wgKGNoaXAsbmFtZSxkZXN0LFNZTUJPTF9QQVJBTUVURVIpOworCXJldHVybiBkZXNjOworfQorCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGNzNDZ4eF9kc3BfY3JlYXRlX3NjYiAoY3M0Nnh4X3QgKmNoaXAsY2hhciAqIG5hbWUsIHUzMiAqIHNjYl9kYXRhLHUzMiBkZXN0KQoreworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogZGVzYzsKKworCWRlc2MgPSBfbWFwX3NjYiAoY2hpcCxuYW1lLGRlc3QpOworCWlmIChkZXNjKSB7CisJCV9kc3BfY3JlYXRlX3NjYihjaGlwLHNjYl9kYXRhLGRlc3QpOworCX0gZWxzZSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFNDQlxuIik7CisJfQorCisJcmV0dXJuIGRlc2M7Cit9CisKKworc3RhdGljIGRzcF90YXNrX2Rlc2NyaXB0b3JfdCAqICBjczQ2eHhfZHNwX2NyZWF0ZV90YXNrX3RyZWUgKGNzNDZ4eF90ICpjaGlwLGNoYXIgKiBuYW1lLCB1MzIgKiB0YXNrX2RhdGEsdTMyIGRlc3QsaW50IHNpemUpCit7CisJZHNwX3Rhc2tfZGVzY3JpcHRvcl90ICogZGVzYzsKKworCWRlc2MgPSBfbWFwX3Rhc2tfdHJlZSAoY2hpcCxuYW1lLGRlc3Qsc2l6ZSk7CisJaWYgKGRlc2MpIHsKKwkJX2RzcF9jcmVhdGVfdGFza190cmVlKGNoaXAsdGFza19kYXRhLGRlc3Qsc2l6ZSk7CisJfSBlbHNlIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBtYXAgVEFTS1xuIik7CisJfQorCisJcmV0dXJuIGRlc2M7Cit9CisKK2ludCBjczQ2eHhfZHNwX3NjYl9hbmRfdGFza19pbml0IChjczQ2eHhfdCAqY2hpcCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJc3ltYm9sX2VudHJ5X3QgKiBmZ190YXNrX3RyZWVfaGVhZGVyX2NvZGU7CisJc3ltYm9sX2VudHJ5X3QgKiB0YXNrX3RyZWVfaGVhZGVyX2NvZGU7CisJc3ltYm9sX2VudHJ5X3QgKiB0YXNrX3RyZWVfdGhyZWFkOworCXN5bWJvbF9lbnRyeV90ICogbnVsbF9hbGdvcml0aG07CisJc3ltYm9sX2VudHJ5X3QgKiBtYWdpY19zbm9vcF90YXNrOworCisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiB0aW1pbmdfbWFzdGVyX3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGNvZGVjX291dF9zY2I7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBjb2RlY19pbl9zY2I7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzcmNfdGFza19zY2I7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBtYXN0ZXJfbWl4X3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHJlYXJfbWl4X3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHJlY29yZF9taXhfc2NiOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogd3JpdGVfYmFja19zY2I7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiB2YXJpX2RlY2ltYXRlX3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHJlYXJfY29kZWNfb3V0X3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGNsZmVfY29kZWNfb3V0X3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIG1hZ2ljX3Nub29wX3NjYjsKKwkKKwlpbnQgZmlmb19hZGRyLGZpZm9fc3Bhbix2YWxpZF9zbG90czsKKworCXN0YXRpYyBzcG9zX2NvbnRyb2xfYmxvY2tfdCBzcG9zY2IgPSB7CisJCS8qIDAgKi8gSEZHX1RSRUVfU0NCLEhGR19TVEFDSywKKwkJLyogMSAqLyBTUE9TQ0JfQUREUixCR19UUkVFX1NDQl9BRERSLAorCQkvKiAyICovIERTUF9TUE9TX0RDLDAsCisJCS8qIDMgKi8gRFNQX1NQT1NfREMsRFNQX1NQT1NfREMsCisJCS8qIDQgKi8gMCwwLAorCQkvKiA1ICovIERTUF9TUE9TX1VVLDAsCisJCS8qIDYgKi8gRkdfVEFTS19IRUFERVJfQUREUiwwLAorCQkvKiA3ICovIDAsMCwKKwkJLyogOCAqLyBEU1BfU1BPU19VVSxEU1BfU1BPU19EQywKKwkJLyogOSAqLyAwLAorCQkvKiBBICovIDAsSEZHX0ZJUlNUX0VYRUNVVEVfTU9ERSwKKwkJLyogQiAqLyBEU1BfU1BPU19VVSxEU1BfU1BPU19VVSwKKwkJLyogQyAqLyBEU1BfU1BPU19EQ19EQywKKwkJLyogRCAqLyBEU1BfU1BPU19EQ19EQywKKwkJLyogRSAqLyBEU1BfU1BPU19EQ19EQywKKwkJLyogRiAqLyBEU1BfU1BPU19EQ19EQworCX07CisKKwljczQ2eHhfZHNwX2NyZWF0ZV90YXNrX3RyZWUoY2hpcCwgInNwb3NDQiIsICh1MzIgKikmc3Bvc2NiLCBTUE9TQ0JfQUREUiwgMHgxMCk7CisKKwludWxsX2FsZ29yaXRobSAgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIk5VTExBTEdPUklUSE0iLCBTWU1CT0xfQ09ERSk7CisJaWYgKG51bGxfYWxnb3JpdGhtID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWZnX3Rhc2tfdHJlZV9oZWFkZXJfY29kZSA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiRkdUQVNLVFJFRUhFQURFUkNPREUiLCBTWU1CT0xfQ09ERSk7ICAKKwlpZiAoZmdfdGFza190cmVlX2hlYWRlcl9jb2RlID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBGR1RBU0tUUkVFSEVBREVSQ09ERSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0YXNrX3RyZWVfaGVhZGVyX2NvZGUgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIlRBU0tUUkVFSEVBREVSQ09ERSIsIFNZTUJPTF9DT0RFKTsgIAorCWlmICh0YXNrX3RyZWVfaGVhZGVyX2NvZGUgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFRBU0tUUkVFSEVBREVSQ09ERSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisgIAorCXRhc2tfdHJlZV90aHJlYWQgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIlRBU0tUUkVFVEhSRUFEIiwgU1lNQk9MX0NPREUpOworCWlmICh0YXNrX3RyZWVfdGhyZWFkID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBUQVNLVFJFRVRIUkVBRCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltYWdpY19zbm9vcF90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJNQUdJQ1NOT09QVEFTSyIsIFNZTUJPTF9DT0RFKTsKKwlpZiAobWFnaWNfc25vb3BfdGFzayA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTUFHSUNTTk9PUFRBU0sgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorICAKKwl7CisJCS8qIGNyZWF0ZSB0aGUgbnVsbCBTQ0IgKi8KKwkJc3RhdGljIGdlbmVyaWNfc2NiX3QgbnVsbF9zY2IgPSB7CisJCQl7IDAsIDAsIDAsIDAgfSwKKwkJCXsgMCwgMCwgMCwgMCwgMCB9LAorCQkJTlVMTF9TQ0JfQUREUiwgTlVMTF9TQ0JfQUREUiwKKwkJCTAsIDAsIDAsIDAsIDAsCisJCQl7CisJCQkJMCwwLAorCQkJCTAsMCwKKwkJCX0KKwkJfTsKKworCQludWxsX3NjYi5lbnRyeV9wb2ludCA9IG51bGxfYWxnb3JpdGhtLT5hZGRyZXNzOworCQlpbnMtPnRoZV9udWxsX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NjYihjaGlwLCAibnVsbFNDQiIsICh1MzIgKikmbnVsbF9zY2IsIE5VTExfU0NCX0FERFIpOworCQlpbnMtPnRoZV9udWxsX3NjYi0+dGFza19lbnRyeSA9IG51bGxfYWxnb3JpdGhtOworCQlpbnMtPnRoZV9udWxsX3NjYi0+c3ViX2xpc3RfcHRyID0gaW5zLT50aGVfbnVsbF9zY2I7CisJCWlucy0+dGhlX251bGxfc2NiLT5uZXh0X3NjYl9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJaW5zLT50aGVfbnVsbF9zY2ItPnBhcmVudF9zY2JfcHRyID0gTlVMTDsKKwkJY3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNjIChjaGlwLGlucy0+dGhlX251bGxfc2NiKTsKKwl9CisKKwl7CisJCS8qIHNldHVwIGZvcmVncm91bmQgdGFzayB0cmVlICovCisJCXN0YXRpYyB0YXNrX3RyZWVfY29udHJvbF9ibG9ja190IGZnX3Rhc2tfdHJlZV9oZHIgPSAgeworCQkJeyBGR19UQVNLX0hFQURFUl9BRERSIHwgKERTUF9TUE9TX0RDIDw8IDB4MTApLAorCQkJICBEU1BfU1BPU19EQ19EQywKKwkJCSAgRFNQX1NQT1NfRENfREMsCisJCQkgIDB4MDAwMCxEU1BfU1BPU19EQywKKwkJCSAgRFNQX1NQT1NfREMsIERTUF9TUE9TX0RDLAorCQkJICBEU1BfU1BPU19EQ19EQywKKwkJCSAgRFNQX1NQT1NfRENfREMsCisJCQkgIERTUF9TUE9TX0RDX0RDLAorCQkJICBEU1BfU1BPU19EQyxEU1BfU1BPU19EQyB9LAorICAgIAorCQkJeworCQkJCUJHX1RSRUVfU0NCX0FERFIsVElNSU5HTUFTVEVSX1NDQl9BRERSLCAKKwkJCQkwLAorCQkJCUZHX1RBU0tfSEVBREVSX0FERFIgKyBUQ0JEYXRhLCAgICAgICAgICAgICAgICAgIAorCQkJfSwKKworCQkJeyAgICAKKwkJCQk0LDAsCisJCQkJMSwwLAorCQkJCTIsU1BPU0NCX0FERFIgKyBIRkdGbGFncywKKwkJCQkwLDAsCisJCQkJRkdfVEFTS19IRUFERVJfQUREUiArIFRDQkNvbnRleHRCbGssRkdfU1RBQ0sKKwkJCX0sCisKKwkJCXsKKwkJCQlEU1BfU1BPU19EQywwLAorCQkJCURTUF9TUE9TX0RDLERTUF9TUE9TX0RDLAorCQkJCURTUF9TUE9TX0RDLERTUF9TUE9TX0RDLAorCQkJCURTUF9TUE9TX0RDLERTUF9TUE9TX0RDLAorCQkJCURTUF9TUE9TX0RDLERTUF9TUE9TX0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfVVUsMSwKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDIAorCQkJfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJeyAKKwkJCQlGR19JTlRFUlZBTF9USU1FUl9QRVJJT0QsRFNQX1NQT1NfVVUsCisJCQkJMCwwCisJCQl9CisJCX07CisKKwkJZmdfdGFza190cmVlX2hkci5saW5rcy5lbnRyeV9wb2ludCA9IGZnX3Rhc2tfdHJlZV9oZWFkZXJfY29kZS0+YWRkcmVzczsKKwkJZmdfdGFza190cmVlX2hkci5jb250ZXh0X2Jsay5zdGFjazAgPSB0YXNrX3RyZWVfdGhyZWFkLT5hZGRyZXNzOworCQljczQ2eHhfZHNwX2NyZWF0ZV90YXNrX3RyZWUoY2hpcCwiRkd0YXNrVHJlZUhkciIsKHUzMiAqKSZmZ190YXNrX3RyZWVfaGRyLEZHX1RBU0tfSEVBREVSX0FERFIsMHgzNSk7CisJfQorCisKKwl7CisJCS8qIHNldHVwIGZvcmVncm91bmQgdGFzayB0cmVlICovCisJCXN0YXRpYyB0YXNrX3RyZWVfY29udHJvbF9ibG9ja190IGJnX3Rhc2tfdHJlZV9oZHIgPSAgeworCQkJeyBEU1BfU1BPU19EQ19EQywKKwkJCSAgRFNQX1NQT1NfRENfREMsCisJCQkgIERTUF9TUE9TX0RDX0RDLAorCQkJICBEU1BfU1BPU19EQywgRFNQX1NQT1NfREMsCisJCQkgIERTUF9TUE9TX0RDLCBEU1BfU1BPU19EQywKKwkJCSAgRFNQX1NQT1NfRENfREMsCisJCQkgIERTUF9TUE9TX0RDX0RDLAorCQkJICBEU1BfU1BPU19EQ19EQywKKwkJCSAgRFNQX1NQT1NfREMsRFNQX1NQT1NfREMgfSwKKyAgICAKKwkJCXsKKwkJCQlOVUxMX1NDQl9BRERSLE5VTExfU0NCX0FERFIsICAvKiBTZXQgdXAgdGhlIGJhY2tncm91bmQgdG8gZG8gbm90aGluZyAqLworCQkJCTAsCisJCQkJQkdfVFJFRV9TQ0JfQUREUiArIFRDQkRhdGEsCisJCQl9LAorCisJCQl7ICAgIAorCQkJCTk5OTksMCwKKwkJCQkwLDEsCisJCQkJMCxTUE9TQ0JfQUREUiArIEhGR0ZsYWdzLAorCQkJCTAsMCwKKwkJCQlCR19UUkVFX1NDQl9BRERSICsgVENCQ29udGV4dEJsayxCR19TVEFDSworCQkJfSwKKworCQkJeworCQkJCURTUF9TUE9TX0RDLDAsCisJCQkJRFNQX1NQT1NfREMsRFNQX1NQT1NfREMsCisJCQkJRFNQX1NQT1NfREMsRFNQX1NQT1NfREMsCisJCQkJRFNQX1NQT1NfREMsRFNQX1NQT1NfREMsCisJCQkJRFNQX1NQT1NfREMsRFNQX1NQT1NfREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19VVSwxLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMsCisJCQkJRFNQX1NQT1NfRENEQywKKwkJCQlEU1BfU1BPU19EQ0RDLAorCQkJCURTUF9TUE9TX0RDREMgCisJCQl9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl7IAorCQkJCUJHX0lOVEVSVkFMX1RJTUVSX1BFUklPRCxEU1BfU1BPU19VVSwKKwkJCQkwLDAKKwkJCX0KKwkJfTsKKworCQliZ190YXNrX3RyZWVfaGRyLmxpbmtzLmVudHJ5X3BvaW50ID0gdGFza190cmVlX2hlYWRlcl9jb2RlLT5hZGRyZXNzOworCQliZ190YXNrX3RyZWVfaGRyLmNvbnRleHRfYmxrLnN0YWNrMCA9IHRhc2tfdHJlZV90aHJlYWQtPmFkZHJlc3M7CisJCWNzNDZ4eF9kc3BfY3JlYXRlX3Rhc2tfdHJlZShjaGlwLCJCR3Rhc2tUcmVlSGRyIiwodTMyICopJmJnX3Rhc2tfdHJlZV9oZHIsQkdfVFJFRV9TQ0JfQUREUiwweDM1KTsKKwl9CisKKwkvKiBjcmVhdGUgdGltaW5nIG1hc3RlciBTQ0IgKi8KKwl0aW1pbmdfbWFzdGVyX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3RpbWluZ19tYXN0ZXJfc2NiKGNoaXApOworCisJLyogY3JlYXRlIHRoZSBDT0RFQyBvdXRwdXQgdGFzayAqLworCWNvZGVjX291dF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9jb2RlY19vdXRfc2NiKGNoaXAsIkNvZGVjT3V0U0NCX0kiLDB4MDAxMCwweDAwMDAsCisJCQkJCQkJTUFTVEVSTUlYX1NDQl9BRERSLAorCQkJCQkJCUNPREVDT1VUX1NDQl9BRERSLHRpbWluZ19tYXN0ZXJfc2NiLAorCQkJCQkJCVNDQl9PTl9QQVJFTlRfU1VCTElTVF9TQ0IpOworCisJaWYgKCFjb2RlY19vdXRfc2NiKSBnb3RvIF9mYWlsX2VuZDsKKwkvKiBjcmVhdGUgdGhlIG1hc3RlciBtaXggU0NCICovCisJbWFzdGVyX21peF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9taXhfb25seV9zY2IoY2hpcCwiTWFzdGVyTWl4U0NCIiwKKwkJCQkJCQlNSVhfU0FNUExFX0JVRjEsTUFTVEVSTUlYX1NDQl9BRERSLAorCQkJCQkJCWNvZGVjX291dF9zY2IsCisJCQkJCQkJU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQik7CisJaW5zLT5tYXN0ZXJfbWl4X3NjYiA9IG1hc3Rlcl9taXhfc2NiOworCisJaWYgKCFtYXN0ZXJfbWl4X3NjYikgZ290byBfZmFpbF9lbmQ7CisKKwkvKiBjcmVhdGUgY29kZWMgaW4gKi8KKwljb2RlY19pbl9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9jb2RlY19pbl9zY2IoY2hpcCwiQ29kZWNJblNDQiIsMHgwMDEwLDB4MDBBMCwKKwkJCQkJCSAgICAgIENPREVDX0lOUFVUX0JVRjEsCisJCQkJCQkgICAgICBDT0RFQ0lOX1NDQl9BRERSLGNvZGVjX291dF9zY2IsCisJCQkJCQkgICAgICBTQ0JfT05fUEFSRU5UX05FWFRfU0NCKTsKKwlpZiAoIWNvZGVjX2luX3NjYikgZ290byBfZmFpbF9lbmQ7CisJaW5zLT5jb2RlY19pbl9zY2IgPSBjb2RlY19pbl9zY2I7CisKKwkvKiBjcmVhdGUgd3JpdGUgYmFjayBzY2IgKi8KKwl3cml0ZV9iYWNrX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX21peF90b19vc3RyZWFtX3NjYihjaGlwLCJXcml0ZUJhY2tTQ0IiLAorCQkJCQkJCSAgICAgIFdSSVRFX0JBQ0tfQlVGMSxXUklURV9CQUNLX1NQQiwKKwkJCQkJCQkgICAgICBXUklURUJBQ0tfU0NCX0FERFIsCisJCQkJCQkJICAgICAgdGltaW5nX21hc3Rlcl9zY2IsCisJCQkJCQkJICAgICAgU0NCX09OX1BBUkVOVF9ORVhUX1NDQik7CisJaWYgKCF3cml0ZV9iYWNrX3NjYikgZ290byBfZmFpbF9lbmQ7CisKKwl7CisJCXN0YXRpYyBtaXgyX29zdHJlYW1fc3BiX3QgbWl4Ml9vc3RyZWFtX3NwYiA9IHsKKwkJCTB4MDAwMjAwMDAsCisJCQkweDAwMDBmZmZmCisJCX07CisgICAgCisJCS8qIGRpcnR5IGhhY2sgLi4uICovCisJCV9kc3BfY3JlYXRlX3Rhc2tfdHJlZSAoY2hpcCwodTMyICopJm1peDJfb3N0cmVhbV9zcGIsV1JJVEVfQkFDS19TUEIsMik7CisJfQorCisJLyogaW5wdXQgc2FtcGxlIGNvbnZlcnRlciAqLworCXZhcmlfZGVjaW1hdGVfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfdmFyaV9kZWNpbWF0ZV9zY2IoY2hpcCwiVmFyaURlY2ltYXRlU0NCIiwKKwkJCQkJCQkJVkFSSV9ERUNJTUFURV9CVUYwLAorCQkJCQkJCQlWQVJJX0RFQ0lNQVRFX0JVRjEsCisJCQkJCQkJCVZBUklERUNJTUFURV9TQ0JfQUREUiwKKwkJCQkJCQkJd3JpdGVfYmFja19zY2IsCisJCQkJCQkJCVNDQl9PTl9QQVJFTlRfU1VCTElTVF9TQ0IpOworCWlmICghdmFyaV9kZWNpbWF0ZV9zY2IpIGdvdG8gX2ZhaWxfZW5kOworCisJLyogY3JlYXRlIHRoZSByZWNvcmQgbWl4ZXIgU0NCICovCisJcmVjb3JkX21peF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9taXhfb25seV9zY2IoY2hpcCwiUmVjb3JkTWl4ZXJTQ0IiLAorCQkJCQkJCU1JWF9TQU1QTEVfQlVGMiwKKwkJCQkJCQlSRUNPUkRfTUlYRVJfU0NCX0FERFIsCisJCQkJCQkJdmFyaV9kZWNpbWF0ZV9zY2IsCisJCQkJCQkJU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQik7CisJaW5zLT5yZWNvcmRfbWl4ZXJfc2NiID0gcmVjb3JkX21peF9zY2I7CisKKwlpZiAoIXJlY29yZF9taXhfc2NiKSBnb3RvIF9mYWlsX2VuZDsKKworCXZhbGlkX3Nsb3RzID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ09TVik7CisKKwlzbmRfYXNzZXJ0IChjaGlwLT5ucl9hYzk3X2NvZGVjcyA9PSAxIHx8IGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDIpOworCisJaWYgKGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDEpIHsKKwkJLyogb3V0cHV0IG9uIHNsb3QgNSBhbmQgMTEgCisJCSAgIG9uIHByaW1hcnkgQ09ERUMgKi8KKwkJZmlmb19hZGRyID0gMHgyMDsKKwkJZmlmb19zcGFuID0gMHg2MDsKKworCQkvKiBlbmFibGUgc2xvdCA1IGFuZCAxMSAqLworCQl2YWxpZF9zbG90cyB8PSBBQ09TVl9TTFY1IHwgQUNPU1ZfU0xWMTE7CisJfSBlbHNlIHsKKwkJLyogb3V0cHV0IG9uIHNsb3QgNyBhbmQgOCAKKwkJICAgb24gc2Vjb25kYXJ5IENPREVDICovCisJCWZpZm9fYWRkciA9IDB4NDA7CisJCWZpZm9fc3BhbiA9IDB4MTA7CisKKwkJLyogZW5hYmxlIHNsb3QgNyBhbmQgOCAqLworCQl2YWxpZF9zbG90cyB8PSBBQ09TVl9TTFY3IHwgQUNPU1ZfU0xWODsKKwl9CisJLyogY3JlYXRlIENPREVDIHRhc2tsZXQgZm9yIHJlYXIgc3BlYWtlcnMgb3V0cHV0Ki8KKwlyZWFyX2NvZGVjX291dF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9jb2RlY19vdXRfc2NiKGNoaXAsIkNvZGVjT3V0U0NCX1JlYXIiLGZpZm9fc3BhbixmaWZvX2FkZHIsCisJCQkJCQkJICAgICBSRUFSX01JWEVSX1NDQl9BRERSLAorCQkJCQkJCSAgICAgUkVBUl9DT0RFQ09VVF9TQ0JfQUREUixjb2RlY19pbl9zY2IsCisJCQkJCQkJICAgICBTQ0JfT05fUEFSRU5UX05FWFRfU0NCKTsKKwlpZiAoIXJlYXJfY29kZWNfb3V0X3NjYikgZ290byBfZmFpbF9lbmQ7CisJCisJCisJLyogY3JlYXRlIHRoZSByZWFyIFBDTSBjaGFubmVsICBtaXhlciBTQ0IgKi8KKwlyZWFyX21peF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9taXhfb25seV9zY2IoY2hpcCwiUmVhck1peGVyU0NCIiwKKwkJCQkJCSAgICAgIE1JWF9TQU1QTEVfQlVGMywKKwkJCQkJCSAgICAgIFJFQVJfTUlYRVJfU0NCX0FERFIsCisJCQkJCQkgICAgICByZWFyX2NvZGVjX291dF9zY2IsCisJCQkJCQkgICAgICBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NCKTsKKwlpbnMtPnJlYXJfbWl4X3NjYiA9IHJlYXJfbWl4X3NjYjsKKwlpZiAoIXJlYXJfbWl4X3NjYikgZ290byBfZmFpbF9lbmQ7CisJCisJaWYgKGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDIpIHsKKwkJLyogY3JlYXRlIENPREVDIHRhc2tsZXQgZm9yIHJlYXIgQ2VudGVyL0xGRSBvdXRwdXQgCisJCSAgIHNsb3QgNiBhbmQgOSBvbiBzZWNvbmFkcnkgQ09ERUMgKi8KKwkJY2xmZV9jb2RlY19vdXRfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfb3V0X3NjYihjaGlwLCJDb2RlY091dFNDQl9DTEZFIiwweDAwMzAsMHgwMDMwLAorCQkJCQkJCQkgICAgIENMRkVfTUlYRVJfU0NCX0FERFIsCisJCQkJCQkJCSAgICAgQ0xGRV9DT0RFQ19TQ0JfQUREUiwKKwkJCQkJCQkJICAgICByZWFyX2NvZGVjX291dF9zY2IsCisJCQkJCQkJCSAgICAgU0NCX09OX1BBUkVOVF9ORVhUX1NDQik7CisJCWlmICghY2xmZV9jb2RlY19vdXRfc2NiKSBnb3RvIF9mYWlsX2VuZDsKKwkJCisJCQorCQkvKiBjcmVhdGUgdGhlIHJlYXIgUENNIGNoYW5uZWwgIG1peGVyIFNDQiAqLworCQlpbnMtPmNlbnRlcl9sZmVfbWl4X3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX21peF9vbmx5X3NjYihjaGlwLCJDTEZFTWl4ZXJTQ0IiLAorCQkJCQkJCQkJIE1JWF9TQU1QTEVfQlVGNCwKKwkJCQkJCQkJCSBDTEZFX01JWEVSX1NDQl9BRERSLAorCQkJCQkJCQkJIGNsZmVfY29kZWNfb3V0X3NjYiwKKwkJCQkJCQkJCSBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NCKTsKKwkJaWYgKCFpbnMtPmNlbnRlcl9sZmVfbWl4X3NjYikgZ290byBfZmFpbF9lbmQ7CisKKwkJLyogZW5hYmxlIHNsb3QgNiBhbmQgOSAqLworCQl2YWxpZF9zbG90cyB8PSBBQ09TVl9TTFY2IHwgQUNPU1ZfU0xWOTsKKwl9IGVsc2UgeworCQljbGZlX2NvZGVjX291dF9zY2IgPSByZWFyX2NvZGVjX291dF9zY2I7CisJCWlucy0+Y2VudGVyX2xmZV9taXhfc2NiID0gcmVhcl9taXhfc2NiOworCX0KKworCS8qIGVuYWJsZSBzbG90cyBkZXBlbmRpbmcgb24gQ09ERUMgY29uZmlndXJhdGlvbiAqLworCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNPU1YsIHZhbGlkX3Nsb3RzKTsKKworCS8qIHRoZSBtYWdpYyBzbm9vcGVyICovCisJbWFnaWNfc25vb3Bfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfbWFnaWNfc25vb3Bfc2NiIChjaGlwLCJNYWdpY1Nub29wU0NCX0kiLE9VVFBVVFNOT09QX1NDQl9BRERSLAorCQkJCQkJCSAgICAgT1VUUFVUX1NOT09QX0JVRkZFUiwKKwkJCQkJCQkgICAgIGNvZGVjX291dF9zY2IsCisJCQkJCQkJICAgICBjbGZlX2NvZGVjX291dF9zY2IsCisJCQkJCQkJICAgICBTQ0JfT05fUEFSRU5UX05FWFRfU0NCKTsKKworICAgIAorCWlmICghbWFnaWNfc25vb3Bfc2NiKSBnb3RvIF9mYWlsX2VuZDsKKwlpbnMtPnJlZl9zbm9vcF9zY2IgPSBtYWdpY19zbm9vcF9zY2I7CisKKwkvKiBTUCBJTyBhY2Nlc3MgKi8KKwlpZiAoIWNzNDZ4eF9kc3BfY3JlYXRlX3NwaW9fd3JpdGVfc2NiKGNoaXAsIlNQSU9Xcml0ZVNDQiIsU1BJT1dSSVRFX1NDQl9BRERSLAorCQkJCQkgICAgICBtYWdpY19zbm9vcF9zY2IsCisJCQkJCSAgICAgIFNDQl9PTl9QQVJFTlRfTkVYVF9TQ0IpKQorCQlnb3RvIF9mYWlsX2VuZDsKKworCS8qIFNQRElGIGlucHV0IHNhbXBlbCByYXRlIGNvbnZlcnRlciAqLworCXNyY190YXNrX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NyY190YXNrX3NjYihjaGlwLCJTcmNUYXNrU0NCX1NQRElGSSIsCisJCQkJCQkgICAgICBpbnMtPnNwZGlmX2luX3NhbXBsZV9yYXRlLAorCQkJCQkJICAgICAgU1JDX09VVFBVVF9CVUYxLAorCQkJCQkJICAgICAgU1JDX0RFTEFZX0JVRjEsU1JDVEFTS19TQ0JfQUREUiwKKwkJCQkJCSAgICAgIG1hc3Rlcl9taXhfc2NiLAorCQkJCQkJICAgICAgU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQiwxKTsKKworCWlmICghc3JjX3Rhc2tfc2NiKSBnb3RvIF9mYWlsX2VuZDsKKwljczQ2eHhfc3JjX3VubGluayhjaGlwLHNyY190YXNrX3NjYik7CisKKwkvKiBOT1RFOiB3aGVuIHdlIG5vdyBob3cgdG8gZGV0ZWN0IHRoZSBTUERJRiBpbnB1dAorCSAgIHNhbXBsZSByYXRlIHdlIHdpbGwgdXNlIHRoaXMgU1JDIHRvIGFkanVzdCBpdCAqLworCWlucy0+c3BkaWZfaW5fc3JjID0gc3JjX3Rhc2tfc2NiOworCisJY3M0Nnh4X2RzcF9hc3luY19pbml0KGNoaXAsdGltaW5nX21hc3Rlcl9zY2IpOworCXJldHVybiAwOworCisgX2ZhaWxfZW5kOgorCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gc2V0dXAgU0NCJ3MgaW4gRFNQXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjczQ2eHhfZHNwX2FzeW5jX2luaXQgKGNzNDZ4eF90ICpjaGlwLCBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGZnX2VudHJ5KQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlzeW1ib2xfZW50cnlfdCAqIHMxNl9hc3luY19jb2RlY19pbnB1dF90YXNrOworCXN5bWJvbF9lbnRyeV90ICogc3BkaWZvX3Rhc2s7CisJc3ltYm9sX2VudHJ5X3QgKiBzcGRpZmlfdGFzazsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNwZGlmaV9zY2JfZGVzYywqIHNwZGlmb19zY2JfZGVzYywqIGFzeW5jX2NvZGVjX3NjYl9kZXNjOworCisJczE2X2FzeW5jX2NvZGVjX2lucHV0X3Rhc2sgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwgIlMxNl9BU1lOQ0NPREVDSU5QVVRUQVNLIiwgU1lNQk9MX0NPREUpOworCWlmIChzMTZfYXN5bmNfY29kZWNfaW5wdXRfdGFzayA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgUzE2X0FTWU5DQ09ERUNJTlBVVFRBU0sgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXNwZGlmb190YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTUERJRk9UQVNLIiwgU1lNQk9MX0NPREUpOworCWlmIChzcGRpZm9fdGFzayA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgU1BESUZPVEFTSyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGRpZmlfdGFzayA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiU1BESUZJVEFTSyIsIFNZTUJPTF9DT0RFKTsKKwlpZiAoc3BkaWZpX3Rhc2sgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFNQRElGSVRBU0sgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJeworCQkvKiAweEJDMCAqLworCQlzcGRpZm9zY2JfdCBzcGRpZm9fc2NiID0geworCQkJLyogMCAqLyBEU1BfU1BPU19VVVVVLAorCQkJeworCQkJCS8qIDEgKi8gMHhiMCwgCisJCQkJLyogMiAqLyAwLCAKKwkJCQkvKiAzICovIDAsIAorCQkJCS8qIDQgKi8gMCwgCisJCQl9LAorCQkJLyogTk9URTogdGhlIFNQRElGIG91dHB1dCB0YXNrIHJlYWQgc2FtcGxlcyBpbiBtb25vCisJCQkgICBmb3JtYXQsIHRoZSBBc3luY2hGR1R4U0NCIHRhc2sgd3JpdGVzIHRvIGJ1ZmZlcgorCQkJICAgaW4gc3RlcmVvIGZvcm1hdAorCQkJKi8KKwkJCS8qIDUgKi8gUlNDT05GSUdfU0FNUExFXzE2TU9OTyArIFJTQ09ORklHX01PRFVMT18yNTYsCisJCQkvKiA2ICovICggU1BESUZPX0lQX09VVFBVVF9CVUZGRVIxIDw8IDB4MTAgKSAgfCAgMHhGRkZDLAorCQkJLyogNyAqLyAwLDAsIAorCQkJLyogOCAqLyAwLCAKKwkJCS8qIDkgKi8gRkdfVEFTS19IRUFERVJfQUREUiwgTlVMTF9TQ0JfQUREUiwgCisJCQkvKiBBICovIHNwZGlmb190YXNrLT5hZGRyZXNzLAorCQkJU1BESUZPX1NDQl9JTlNUICsgU1BESUZPRklGT1BvaW50ZXIsCisJCQl7CisJCQkJLyogQiAqLyAweDAwNDAsIC8qRFNQX1NQT1NfVVVVVSwqLworCQkJCS8qIEMgKi8gMHgyMGZmLCAvKkRTUF9TUE9TX1VVVVUsKi8KKwkJCX0sCisJCQkvKiBEICovIDB4ODA0YywwLAkJCQkJCQkgIC8qIFNQRElGT0ZJRk9Qb2ludGVyOlNQRElGT1N0YXRSZWdBZGRyOyAqLworCQkJLyogRSAqLyAweDAxMDgsMHgwMDAxLAkJCQkJICAvKiBTUERJRk9TdE1vRm9ybWF0OlNQRElGT0ZJRk9CYXNlQWRkcjsgKi8KKwkJCS8qIEYgKi8gRFNQX1NQT1NfVVVVVQkgIAkJCSAgICAgICAgICAvKiBTUERJRk9GcmVlOyAqLworCQl9OworCisJCS8qIDB4QkIwICovCisJCXNwZGlmaXNjYl90IHNwZGlmaV9zY2IgPSB7CisJCQkvKiAwICovIERTUF9TUE9TX1VVTE8sRFNQX1NQT1NfVVVISSwKKwkJCS8qIDEgKi8gMCwKKwkJCS8qIDIgKi8gMCwKKwkJCS8qIDMgKi8gMSw0MDAwLCAgICAgICAgLyogU1BESUZJQ291bnRMaW1pdCBTUERJRklDb3VudCAqLyAKKwkJCS8qIDQgKi8gRFNQX1NQT1NfVVVVVSwgLyogU1BESUZJU3RhdHVzRGF0YSAqLworCQkJLyogNSAqLyAwLERTUF9TUE9TX1VVSEksIC8qIFN0YXR1c0RhdGEsIEZyZWU0ICovCisJCQkvKiA2ICovIERTUF9TUE9TX1VVVVUsICAvKiBGcmVlMyAqLworCQkJLyogNyAqLyBEU1BfU1BPU19VVSxEU1BfU1BPU19EQywgIC8qIEZyZWUyIEJpdENvdW50Ki8KKwkJCS8qIDggKi8gRFNQX1NQT1NfVVVVVSwJLyogVGVtcFN0YXR1cyAqLworCQkJLyogOSAqLyBTUERJRk9fU0NCX0lOU1QsIE5VTExfU0NCX0FERFIsCisJCQkvKiBBICovIHNwZGlmaV90YXNrLT5hZGRyZXNzLAorCQkJU1BESUZJX1NDQl9JTlNUICsgU1BESUZJRklGT1BvaW50ZXIsCisJCQkvKiBOT1RFOiBUaGUgU1BESUYgaW5wdXQgdGFzayB3cml0ZSB0aGUgc2FtcGxlIGluIG1vbm8KKwkJCSAgIGZvcm1hdCBmcm9tIHRoZSBIVyBGSUZPLCB0aGUgQXN5bmNoRkdSeFNDQiB0YXNrICByZWFkcyAKKwkJCSAgIHRoZW0gaW4gc3RlcmVvIAorCQkJKi8KKwkJCS8qIEIgKi8gUlNDT05GSUdfU0FNUExFXzE2TU9OTyArIFJTQ09ORklHX01PRFVMT18xMjgsCisJCQkvKiBDICovIChTUERJRklfSVBfT1VUUFVUX0JVRkZFUjEgPDwgMHgxMCkgfCAweEZGRkMsCisJCQkvKiBEICovIDB4ODA0OCwwLAorCQkJLyogRSAqLyAweDAxZjAsMHgwMDAxLAorCQkJLyogRiAqLyBEU1BfU1BPU19VVVVVIC8qIFNQRElOX1NUQVRVUyBtb25pdG9yICovCisJCX07CisKKwkJLyogMHhCQTAgKi8KKwkJYXN5bmNfY29kZWNfaW5wdXRfc2NiX3QgYXN5bmNfY29kZWNfaW5wdXRfc2NiID0geworCQkJLyogMCAqLyBEU1BfU1BPU19VVVVVLAorCQkJLyogMSAqLyAwLAorCQkJLyogMiAqLyAwLAorCQkJLyogMyAqLyAxLDQwMDAsCisJCQkvKiA0ICovIDB4MDExOCwweDAwMDEsCisJCQkvKiA1ICovIFJTQ09ORklHX1NBTVBMRV8xNk1PTk8gKyBSU0NPTkZJR19NT0RVTE9fNjQsCisJCQkvKiA2ICovIChBU1lOQ19JUF9PVVRQVVRfQlVGRkVSMSA8PCAweDEwKSB8IDB4RkZGQywKKwkJCS8qIDcgKi8gRFNQX1NQT1NfVVUsMHgzLAorCQkJLyogOCAqLyBEU1BfU1BPU19VVVVVLAorCQkJLyogOSAqLyBTUERJRklfU0NCX0lOU1QsTlVMTF9TQ0JfQUREUiwKKwkJCS8qIEEgKi8gczE2X2FzeW5jX2NvZGVjX2lucHV0X3Rhc2stPmFkZHJlc3MsCisJCQlIRkdfVFJFRV9TQ0IgKyBBc3luY0NJT0ZJRk9Qb2ludGVyLAorICAgICAgICAgICAgICAKKwkJCS8qIEIgKi8gUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzY0LAorCQkJLyogQyAqLyAoQVNZTkNfSVBfT1VUUFVUX0JVRkZFUjEgPDwgMHgxMCksICAvKihBU1lOQ19JUF9PVVRQVVRfQlVGRkVSMSA8PCAweDEwKSB8IDB4RkZGQywqLworICAgICAgCisjaWZkZWYgVXNlQVNFUjFJbnB1dAorCQkJLyogc2hvcnQgQXN5bmNDSUZJRk9Qb2ludGVyOkFzeW5jQ0lTdGF0UmVnQWRkcjsJICAgICAgIAorCQkJICAgSW5pdC4gMDAwMDo4MDQyOiBmb3IgQVNFUjEKKwkJCSAgIDAwMDA6ODA0NDogZm9yIEFTRVIyICovCisJCQkvKiBEICovIDB4ODA0MiwwLAorICAgICAgCisJCQkvKiBzaG9ydCBBc3luY0NJU3RNb0Zvcm1hdDpBc3luY0NJRklGT0Jhc2VBZGRyOworCQkJICAgSW5pdCAxIHN0ZXJvOjgwNTAgQVNFUjEKKwkJCSAgIEluaXQgMCAgbW9ubzo4MDcwIEFTRVIyCisJCQkgICBJbml0IDEgU3RlcmVvIDogMDEwMCBBU0VSMSAoU2V0IGJ5IHNjcmlwdCkgKi8KKwkJCS8qIEUgKi8gMHgwMTAwLDB4MDAwMSwKKyAgICAgIAorI2VuZGlmCisgICAgICAKKyNpZmRlZiBVc2VBU0VSMklucHV0CisJCQkvKiBzaG9ydCBBc3luY0NJRklGT1BvaW50ZXI6QXN5bmNDSVN0YXRSZWdBZGRyOworCQkJICAgSW5pdC4gMDAwMDo4MDQyOiBmb3IgQVNFUjEKKwkJCSAgIDAwMDA6ODA0NDogZm9yIEFTRVIyICovCisJCQkvKiBEICovIDB4ODA0NCwwLAorICAgICAgCisJCQkvKiBzaG9ydCBBc3luY0NJU3RNb0Zvcm1hdDpBc3luY0NJRklGT0Jhc2VBZGRyOworCQkJICAgSW5pdCAxIHN0ZXJvOjgwNTAgQVNFUjEKKwkJCSAgIEluaXQgMCAgbW9ubzo4MDcwIEFTRVIyCisJCQkgICBJbml0IDEgU3RlcmVvIDogMDEwMCBBU0VSMSAoU2V0IGJ5IHNjcmlwdCkgKi8KKwkJCS8qIEUgKi8gMHgwMTEwLDB4MDAwMSwKKyAgICAgIAorI2VuZGlmCisgICAgICAKKwkJCS8qIHNob3J0IEFzeW5jQ0lPdXRwdXRCdWZNb2R1bG86QXN5bmNDSUZyZWU7CisJCQkgICBBc3luY0NJT3V0cHV0QnVmTW9kdWxvOiBUaGUgbW9kdWxvIHNpemUgZm9yICAgCisJCQkgICB0aGUgb3V0cHV0IGJ1ZmZlciBvZiB0aGlzIHRhc2sgKi8KKwkJCS8qIEYgKi8gMCwgLyogRFNQX1NQT1NfVVVVVSAqLworCQl9OworCisJCXNwZGlmb19zY2JfZGVzYyA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NjYihjaGlwLCJTUERJRk9TQ0IiLCh1MzIgKikmc3BkaWZvX3NjYixTUERJRk9fU0NCX0lOU1QpOworCisJCXNuZF9hc3NlcnQoc3BkaWZvX3NjYl9kZXNjLCByZXR1cm4gLUVJTyk7CisJCXNwZGlmaV9zY2JfZGVzYyA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NjYihjaGlwLCJTUERJRklTQ0IiLCh1MzIgKikmc3BkaWZpX3NjYixTUERJRklfU0NCX0lOU1QpOworCQlzbmRfYXNzZXJ0KHNwZGlmaV9zY2JfZGVzYywgcmV0dXJuIC1FSU8pOworCQlhc3luY19jb2RlY19zY2JfZGVzYyA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NjYihjaGlwLCJBc3luQ29kZWNJbnB1dFNDQiIsKHUzMiAqKSZhc3luY19jb2RlY19pbnB1dF9zY2IsIEhGR19UUkVFX1NDQik7CisJCXNuZF9hc3NlcnQoYXN5bmNfY29kZWNfc2NiX2Rlc2MsIHJldHVybiAtRUlPKTsKKworCQlhc3luY19jb2RlY19zY2JfZGVzYy0+cGFyZW50X3NjYl9wdHIgPSBOVUxMOworCQlhc3luY19jb2RlY19zY2JfZGVzYy0+bmV4dF9zY2JfcHRyID0gc3BkaWZpX3NjYl9kZXNjOworCQlhc3luY19jb2RlY19zY2JfZGVzYy0+c3ViX2xpc3RfcHRyID0gaW5zLT50aGVfbnVsbF9zY2I7CisJCWFzeW5jX2NvZGVjX3NjYl9kZXNjLT50YXNrX2VudHJ5ID0gczE2X2FzeW5jX2NvZGVjX2lucHV0X3Rhc2s7CisKKwkJc3BkaWZpX3NjYl9kZXNjLT5wYXJlbnRfc2NiX3B0ciA9IGFzeW5jX2NvZGVjX3NjYl9kZXNjOworCQlzcGRpZmlfc2NiX2Rlc2MtPm5leHRfc2NiX3B0ciA9IHNwZGlmb19zY2JfZGVzYzsKKwkJc3BkaWZpX3NjYl9kZXNjLT5zdWJfbGlzdF9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJc3BkaWZpX3NjYl9kZXNjLT50YXNrX2VudHJ5ID0gc3BkaWZpX3Rhc2s7CisKKwkJc3BkaWZvX3NjYl9kZXNjLT5wYXJlbnRfc2NiX3B0ciA9IHNwZGlmaV9zY2JfZGVzYzsKKwkJc3BkaWZvX3NjYl9kZXNjLT5uZXh0X3NjYl9wdHIgPSBmZ19lbnRyeTsKKwkJc3BkaWZvX3NjYl9kZXNjLT5zdWJfbGlzdF9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJc3BkaWZvX3NjYl9kZXNjLT50YXNrX2VudHJ5ID0gc3BkaWZvX3Rhc2s7CisKKwkJLyogdGhpcyBvbmUgaXMgZmFrZWQsIGFzIHRoZSBwYXJuZXQgb2YgU1BESUZPIHRhc2sKKwkJICAgaXMgdGhlIEZHIHRhc2sgdHJlZSAqLworCQlmZ19lbnRyeS0+cGFyZW50X3NjYl9wdHIgPSBzcGRpZm9fc2NiX2Rlc2M7CisKKwkJLyogZm9yIHByb2MgZnMgKi8KKwkJY3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNjIChjaGlwLHNwZGlmb19zY2JfZGVzYyk7CisJCWNzNDZ4eF9kc3BfcHJvY19yZWdpc3Rlcl9zY2JfZGVzYyAoY2hpcCxzcGRpZmlfc2NiX2Rlc2MpOworCQljczQ2eHhfZHNwX3Byb2NfcmVnaXN0ZXJfc2NiX2Rlc2MgKGNoaXAsYXN5bmNfY29kZWNfc2NiX2Rlc2MpOworCisJCS8qIEFzeW5jIE1BU1RFUiBFTkFCTEUsIGFmZmVjdHMgYm90aCBTUERJRiBpbnB1dCBhbmQgb3V0cHV0ICovCisJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQVNFUl9NQVNURVIsIDB4MSApOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfZGlzYWJsZV9zcGRpZl9odyAoY3M0Nnh4X3QgKmNoaXApCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCisJLyogc2V0IFNQRElGIG91dHB1dCBGSUZPIHNsb3QgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FTRVJfRkFERFIsIDApOworCisJLyogU1BESUYgb3V0cHV0IE1BU1RFUiBFTkFCTEUgKi8KKwljczQ2eHhfcG9rZV92aWFfZHNwIChjaGlwLFNQX1NQRE9VVF9DT05UUk9MLCAwKTsKKworCS8qIHJpZ2h0IGFuZCBsZWZ0IHZhbGlkYXRlIGJpdCAqLworCS8qY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9TUERPVVRfQ1NVViwgaW5zLT5zcGRpZl9jc3V2X2RlZmF1bHQpOyovCisJY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9TUERPVVRfQ1NVViwgMHgwKTsKKworCS8qIGNsZWFyIGZpZm8gcG9pbnRlciAqLworCWNzNDZ4eF9wb2tlX3ZpYV9kc3AgKGNoaXAsU1BfU1BESU5fRklGT1BUUiwgMHgwKTsKKworCS8qIG1vbml0b3Igc3RhdGUgKi8KKwlpbnMtPnNwZGlmX3N0YXR1c19vdXQgJj0gfkRTUF9TUERJRl9TVEFUVVNfSFdfRU5BQkxFRDsKK30KKworaW50IGNzNDZ4eF9kc3BfZW5hYmxlX3NwZGlmX2h3IChjczQ2eHhfdCAqY2hpcCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwkvKiBpZiBody1jdHJsIGFscmVhZHkgZW5hYmxlZCwgdHVybiBvZmYgdG8gcmVzZXQgbG9naWMgLi4uICovCisJY3M0Nnh4X2RzcF9kaXNhYmxlX3NwZGlmX2h3IChjaGlwKTsKKwl1ZGVsYXkoNTApOworCisJLyogc2V0IFNQRElGIG91dHB1dCBGSUZPIHNsb3QgKi8KKwlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FTRVJfRkFERFIsICggMHg4MDAwIHwgKChTUF9TUERPVVRfRklGTyA+PiA0KSA8PCA0KSApKTsKKworCS8qIFNQRElGIG91dHB1dCBNQVNURVIgRU5BQkxFICovCisJY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9TUERPVVRfQ09OVFJPTCwgMHg4MDAwMDAwMCk7CisKKwkvKiByaWdodCBhbmQgbGVmdCB2YWxpZGF0ZSBiaXQgKi8KKwljczQ2eHhfcG9rZV92aWFfZHNwIChjaGlwLFNQX1NQRE9VVF9DU1VWLCBpbnMtPnNwZGlmX2NzdXZfZGVmYXVsdCk7CisKKwkvKiBtb25pdG9yIHN0YXRlICovCisJaW5zLT5zcGRpZl9zdGF0dXNfb3V0IHw9IERTUF9TUERJRl9TVEFUVVNfSFdfRU5BQkxFRDsKKworCXJldHVybiAwOworfQorCitpbnQgY3M0Nnh4X2RzcF9lbmFibGVfc3BkaWZfaW4gKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCS8qIHR1cm4gb24gYW1wbGlmaWVyICovCisJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CisJY2hpcC0+YW1wbGlmaWVyX2N0cmwoY2hpcCwgMSk7CisKKwlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF9yeF9zY2IgPT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydCAoaW5zLT5zcGRpZl9pbl9zcmMgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKworCWlmICggISAoaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICYgRFNQX1NQRElGX1NUQVRVU19JTlBVVF9DVFJMX0VOQUJMRUQpICkgeworCQkvKiB0aW1lIGNvdW50ZG93biBlbmFibGUgKi8KKwkJY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9BU0VSX0NPVU5URE9XTiwgMHg4MDAwMDAwNSk7CisJCS8qIE5PVEU6IDgwMDAwMDA1IHZhbHVlIGlzIGp1c3QgbWFnaWMuIFdpdGggYWxsIHZhbHVlcworCQkgICB0aGF0IEkndmUgdGVzdGVkIHRoaXMgb25lIHNlZW0gdG8gZ2l2ZSB0aGUgYmVzdCByZXN1bHQuCisJCSAgIEdvdCBubyBleHBsaWNhdGlvbiB3aHkuIChCZW5ueSkgKi8KKworCQkvKiBTUERJRiBpbnB1dCBNQVNURVIgRU5BQkxFICovCisJCWNzNDZ4eF9wb2tlX3ZpYV9kc3AgKGNoaXAsU1BfU1BESU5fQ09OVFJPTCwgMHg4MDAwMDNmZik7CisKKwkJaW5zLT5zcGRpZl9zdGF0dXNfb3V0IHw9IERTUF9TUERJRl9TVEFUVVNfSU5QVVRfQ1RSTF9FTkFCTEVEOworCX0KKworCS8qIGNyZWF0ZSBhbmQgc3RhcnQgdGhlIGFzeW5jaHJvbm91cyByZWNlaXZlciBTQ0IgKi8KKwlpbnMtPmFzeW5jaF9yeF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9hc3luY2hfZmdfcnhfc2NiKGNoaXAsIkFzeW5jaEZHUnhTQ0IiLAorCQkJCQkJCQlBU1lOQ1JYX1NDQl9BRERSLAorCQkJCQkJCQlTUERJRklfU0NCX0lOU1QsCisJCQkJCQkJCVNQRElGSV9JUF9PVVRQVVRfQlVGRkVSMSwKKwkJCQkJCQkJaW5zLT5zcGRpZl9pbl9zcmMsCisJCQkJCQkJCVNDQl9PTl9QQVJFTlRfU1VCTElTVF9TQ0IpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJLyogcmVzZXQgU1BESUYgaW5wdXQgc2FtcGxlIGJ1ZmZlciBwb2ludGVyICovCisJLypzbmRfY3M0Nnh4X3Bva2UgKGNoaXAsIChTUERJRklfU0NCX0lOU1QgKyAweDBjKSA8PCAyLAorCSAgKFNQRElGSV9JUF9PVVRQVVRfQlVGRkVSMSA8PCAweDEwKSB8IDB4RkZGQyk7Ki8KKworCS8qIHJlc2V0IEZJRk8gcHRyICovCisJLypjczQ2eHhfcG9rZV92aWFfZHNwIChjaGlwLFNQX1NQRElOX0ZJRk9QVFIsIDB4MCk7Ki8KKwljczQ2eHhfc3JjX2xpbmsoY2hpcCxpbnMtPnNwZGlmX2luX3NyYyk7CisKKwkvKiB1bm11dGUgU1JDIHZvbHVtZSAqLworCWNzNDZ4eF9kc3Bfc2NiX3NldF92b2x1bWUgKGNoaXAsaW5zLT5zcGRpZl9pbl9zcmMsMHg3ZmZmLDB4N2ZmZik7CisKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCS8qIHNldCBTUERJRiBpbnB1dCBzYW1wbGUgcmF0ZSBhbmQgdW5tdXRlCisJICAgTk9URTogb25seSA0OGtoeiBzdXBwb3J0IGZvciBTUERJRiBpbnB1dCB0aGlzIHRpbWUgKi8KKwkvKiBjczQ2eHhfZHNwX3NldF9zcmNfc2FtcGxlX3JhdGUoY2hpcCxpbnMtPnNwZGlmX2luX3NyYyw0ODAwMCk7ICovCisKKwkvKiBtb25pdG9yIHN0YXRlICovCisJaW5zLT5zcGRpZl9zdGF0dXNfaW4gPSAxOworCXVwKCZjaGlwLT5zcG9zX211dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgY3M0Nnh4X2RzcF9kaXNhYmxlX3NwZGlmX2luIChjczQ2eHhfdCAqY2hpcCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF9yeF9zY2IgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQgKGlucy0+c3BkaWZfaW5fc3JjICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOwkKKworCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJLyogUmVtb3ZlIHRoZSBhc3luY2hyb25vdXMgcmVjZWl2ZXIgU0NCICovCisJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiIChjaGlwLGlucy0+YXN5bmNoX3J4X3NjYik7CisJaW5zLT5hc3luY2hfcnhfc2NiID0gTlVMTDsKKworCWNzNDZ4eF9zcmNfdW5saW5rKGNoaXAsaW5zLT5zcGRpZl9pbl9zcmMpOworCisJLyogbW9uaXRvciBzdGF0ZSAqLworCWlucy0+c3BkaWZfc3RhdHVzX2luID0gMDsKKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7CisKKwkvKiByZXN0b3JlIGFtcGxpZmllciAqLworCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKKwljaGlwLT5hbXBsaWZpZXJfY3RybChjaGlwLCAtMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNzNDZ4eF9kc3BfZW5hYmxlX3BjbV9jYXB0dXJlIChjczQ2eHhfdCAqY2hpcCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlzbmRfYXNzZXJ0IChpbnMtPnBjbV9pbnB1dCA9PSBOVUxMLHJldHVybiAtRUlOVkFMKTsKKwlzbmRfYXNzZXJ0IChpbnMtPnJlZl9zbm9vcF9zY2IgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKwlpbnMtPnBjbV9pbnB1dCA9IGNzNDZ4eF9hZGRfcmVjb3JkX3NvdXJjZShjaGlwLGlucy0+cmVmX3Nub29wX3NjYixQQ01TRVJJQUxJTl9QQ01fU0NCX0FERFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQ01TZXJpYWxJbnB1dF9XYXZlIik7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX2Rpc2FibGVfcGNtX2NhcHR1cmUgKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCXNuZF9hc3NlcnQgKGlucy0+cGNtX2lucHV0ICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOworCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiIChjaGlwLGlucy0+cGNtX2lucHV0KTsKKwlpbnMtPnBjbV9pbnB1dCA9IE5VTEw7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX2VuYWJsZV9hZGNfY2FwdHVyZSAoY3M0Nnh4X3QgKmNoaXApCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCisJc25kX2Fzc2VydCAoaW5zLT5hZGNfaW5wdXQgPT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydCAoaW5zLT5jb2RlY19pbl9zY2IgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKwlpbnMtPmFkY19pbnB1dCA9IGNzNDZ4eF9hZGRfcmVjb3JkX3NvdXJjZShjaGlwLGlucy0+Y29kZWNfaW5fc2NiLFBDTVNFUklBTElOX1NDQl9BRERSLAorCQkJCQkJICAiUENNU2VyaWFsSW5wdXRfQURDIik7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX2Rpc2FibGVfYWRjX2NhcHR1cmUgKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCXNuZF9hc3NlcnQgKGlucy0+YWRjX2lucHV0ICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOworCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiIChjaGlwLGlucy0+YWRjX2lucHV0KTsKKwlpbnMtPmFkY19pbnB1dCA9IE5VTEw7CisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfcG9rZV92aWFfZHNwIChjczQ2eHhfdCAqY2hpcCx1MzIgYWRkcmVzcyx1MzIgZGF0YSkKK3sKKwl1MzIgdGVtcDsKKwlpbnQgIGk7CisKKwkvKiBzYW50aXkgY2hlY2sgdGhlIHBhcmFtZXRlcnMuICAoVGhlc2UgbnVtYmVycyBhcmUgbm90IDEwMCUgY29ycmVjdC4gIFRoZXkgYXJlCisJICAgYSByb3VnaCBndWVzcyBmcm9tIGxvb2tpbmcgYXQgdGhlIGNvbnRyb2xsZXIgc3BlYy4pICovCisJaWYgKGFkZHJlc3MgPCAweDgwMDAgfHwgYWRkcmVzcyA+PSAweDkwMDApCisJCXJldHVybiAtRUlOVkFMOworICAgICAgICAKKwkvKiBpbml0aWFsaXplIHRoZSBTUF9JT19XUklURSBTQ0Igd2l0aCB0aGUgZGF0YS4gKi8KKwl0ZW1wID0gKCBhZGRyZXNzIDw8IDE2ICkgfCAoIGFkZHJlc3MgJiAweDAwMDBGRkZGKTsgICAvKiBvZmZzZXQgMCA8LS0gYWRkcmVzczIgOiBhZGRyZXNzMSAqLworCisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsKCBTUElPV1JJVEVfU0NCX0FERFIgICAgICA8PCAyKSwgdGVtcCk7CisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsKChTUElPV1JJVEVfU0NCX0FERFIgKyAxKSA8PCAyKSwgZGF0YSk7IC8qIG9mZnNldCAxIDwtLSBkYXRhMSAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCgoU1BJT1dSSVRFX1NDQl9BRERSICsgMikgPDwgMiksIGRhdGEpOyAvKiBvZmZzZXQgMSA8LS0gZGF0YTIgKi8KKyAgICAKKwkvKiBQb2tlIHRoaXMgbG9jYXRpb24gdG8gdGVsbCB0aGUgdGFzayB0byBzdGFydCAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCgoU1BJT1dSSVRFX1NDQl9BRERSICsgNikgPDwgMiksIFNQSU9XUklURV9TQ0JfQUREUiA8PCAweDEwKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSB0YXNrIHJhbiAqLworCWZvciAoaT0wOyBpPDI1OyBpKyspIHsKKwkJdWRlbGF5KDEyNSk7CisKKwkJdGVtcCA9ICBzbmRfY3M0Nnh4X3BlZWsoY2hpcCwoKFNQSU9XUklURV9TQ0JfQUREUiArIDYpIDw8IDIpKTsKKwkJaWYgKHRlbXAgPT0gMHgwMDAwMDAwMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDI1KSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBTUElPV3JpdGVUYXNrIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNzNDZ4eF9kc3Bfc2V0X2RhY192b2x1bWUgKGNzNDZ4eF90ICogY2hpcCx1MTYgbGVmdCx1MTYgcmlnaHQpCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOyAKKworCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOworCQorCS8qIG1haW4gb3V0cHV0ICovCisJc2NiID0gaW5zLT5tYXN0ZXJfbWl4X3NjYi0+c3ViX2xpc3RfcHRyOworCXdoaWxlIChzY2IgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJY3M0Nnh4X2RzcF9zY2Jfc2V0X3ZvbHVtZSAoY2hpcCxzY2IsbGVmdCxyaWdodCk7CisJCXNjYiA9IHNjYi0+bmV4dF9zY2JfcHRyOworCX0KKworCS8qIHJlYXIgb3V0cHV0ICovCisJc2NiID0gaW5zLT5yZWFyX21peF9zY2ItPnN1Yl9saXN0X3B0cjsKKwl3aGlsZSAoc2NiICE9IGlucy0+dGhlX251bGxfc2NiKSB7CisJCWNzNDZ4eF9kc3Bfc2NiX3NldF92b2x1bWUgKGNoaXAsc2NiLGxlZnQscmlnaHQpOworCQlzY2IgPSBzY2ItPm5leHRfc2NiX3B0cjsKKwl9CisKKwlpbnMtPmRhY192b2x1bWVfbGVmdCA9IGxlZnQ7CisJaW5zLT5kYWNfdm9sdW1lX3JpZ2h0ID0gcmlnaHQ7CisKKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNzNDZ4eF9kc3Bfc2V0X2llYzk1OF92b2x1bWUgKGNzNDZ4eF90ICogY2hpcCx1MTYgbGVmdCx1MTYgcmlnaHQpIHsKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKKworCWlmIChpbnMtPmFzeW5jaF9yeF9zY2IgIT0gTlVMTCkKKwkJY3M0Nnh4X2RzcF9zY2Jfc2V0X3ZvbHVtZSAoY2hpcCxpbnMtPmFzeW5jaF9yeF9zY2IsCisJCQkJCSAgIGxlZnQscmlnaHQpOworCisJaW5zLT5zcGRpZl9pbnB1dF92b2x1bWVfbGVmdCA9IGxlZnQ7CisJaW5zLT5zcGRpZl9pbnB1dF92b2x1bWVfcmlnaHQgPSByaWdodDsKKworCXVwKCZjaGlwLT5zcG9zX211dGV4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5oIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODcxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiAgVGhlIGRyaXZlciBmb3IgdGhlIENpcnJ1cyBMb2dpYydzIFNvdW5kIEZ1c2lvbiBDUzQ2WFggYmFzZWQgc291bmRjYXJkcworICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiAyMDAyLTA3IEJlbm55IFNqb3N0cmFuZCBiZW5ueUBob3N0bW9iaWxpdHkuY29tCisgKi8KKworI2lmZGVmICBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQIC8qIGhhY2sgLi4uICovCisjaWZuZGVmIF9fRFNQX1NQT1NfSF9fCisjZGVmaW5lIF9fRFNQX1NQT1NfSF9fCisKKyNkZWZpbmUgRFNQX01BWF9TWU1CT0xTIDEwMjQKKyNkZWZpbmUgRFNQX01BWF9NT0RVTEVTIDY0CisKKyNkZWZpbmUgRFNQX0NPREVfQllURV9TSVpFICAgICAgICAgICAgIDB4MDAwMDcwMDBVTAorI2RlZmluZSBEU1BfUEFSQU1FVEVSX0JZVEVfU0laRSAgICAgICAgMHgwMDAwMzAwMFVMCisjZGVmaW5lIERTUF9TQU1QTEVfQllURV9TSVpFICAgICAgICAgICAweDAwMDAzODAwVUwKKyNkZWZpbmUgRFNQX1BBUkFNRVRFUl9CWVRFX09GRlNFVCAgICAgIDB4MDAwMDAwMDBVTAorI2RlZmluZSBEU1BfU0FNUExFX0JZVEVfT0ZGU0VUICAgICAgICAgMHgwMDAxMDAwMFVMCisjZGVmaW5lIERTUF9DT0RFX0JZVEVfT0ZGU0VUICAgICAgICAgICAweDAwMDIwMDAwVUwKKworI2RlZmluZSBXSURFX0lOU1RSX01BU0sgICAgICAgMHgwMDQwCisjZGVmaW5lIFdJREVfTEFERF9JTlNUUl9NQVNLICAweDAzODAKKworLyogdGhpcyBpbnN0cnVjdGlvbiB0eXBlcworICAgbmVlZHMgdG8gYmUgcmVhbGxvY2F0ZWQgd2hlbiBsb2FkCisgICBjb2RlIGludG8gRFNQICovCit0eXBlZGVmIGVudW0gIHsKKwlXSURFX0ZPUl9CRUdJTl9MT09QID0gMHgyMCwKKwlXSURFX0ZPUl9CRUdJTl9MT09QMiwKKworCVdJREVfQ09ORF9HT1RPX0FERFIgPSAweDMwLAorCVdJREVfQ09ORF9HT1RPX0NBTEwsCisKKwlXSURFX1RCRVFfQ09ORF9HT1RPX0FERFIgPSAweDcwLAorCVdJREVfVEJFUV9DT05EX0NBTExfQUREUiwKKwlXSURFX1RCRVFfTkNPTkRfR09UT19BRERSLAorCVdJREVfVEJFUV9OQ09ORF9DQUxMX0FERFIsCisJV0lERV9UQkVRX0NPTkRfR09UTzFfQUREUiwKKwlXSURFX1RCRVFfQ09ORF9DQUxMMV9BRERSLAorCVdJREVfVEJFUV9OQ09ORF9HT1RPSV9BRERSLAorCVdJREVfVEJFUV9OQ09ORF9DQUxMMV9BRERSLAorfSB3aWRlX29wY29kZV90OworCisvKiBTQU1QTEUgc2VnbWVudCAqLworI2RlZmluZSBWQVJJX0RFQ0lNQVRFX0JVRjEgICAgICAgMHgwMDAwCisjZGVmaW5lIFdSSVRFX0JBQ0tfQlVGMSAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgQ09ERUNfSU5QVVRfQlVGMSAgICAgICAgIDB4MDUwMAorI2RlZmluZSBQQ01fUkVBREVSX0JVRjEgICAgICAgICAgMHgwNjAwCisjZGVmaW5lIFNSQ19ERUxBWV9CVUYxICAgICAgICAgICAweDA2ODAKKyNkZWZpbmUgVkFSSV9ERUNJTUFURV9CVUYwICAgICAgIDB4MDc4MAorI2RlZmluZSBTUkNfT1VUUFVUX0JVRjEgICAgICAgICAgMHgwN0EwCisjZGVmaW5lIEFTWU5DX0lQX09VVFBVVF9CVUZGRVIxICAweDBBMDAKKyNkZWZpbmUgT1VUUFVUX1NOT09QX0JVRkZFUiAgICAgIDB4MEIwMAorI2RlZmluZSBTUERJRklfSVBfT1VUUFVUX0JVRkZFUjEgMHgwRTAwCisjZGVmaW5lIFNQRElGT19JUF9PVVRQVVRfQlVGRkVSMSAweDEwMDAKKyNkZWZpbmUgTUlYX1NBTVBMRV9CVUYxICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBNSVhfU0FNUExFX0JVRjIgICAgICAgICAgMHgyRTgwCisjZGVmaW5lIE1JWF9TQU1QTEVfQlVGMyAgICAgICAgICAweDJGMDAKKyNkZWZpbmUgTUlYX1NBTVBMRV9CVUY0ICAgICAgICAgIDB4MkY4MAorI2RlZmluZSBNSVhfU0FNUExFX0JVRjUgICAgICAgICAgMHgzMDAwCisKKy8qIFRhc2sgc3RhY2sgYWRkcmVzcyAqLworI2RlZmluZSBIRkdfU1RBQ0sgICAgICAgICAgICAgICAgMHgwNjZBCisjZGVmaW5lIEZHX1NUQUNLICAgICAgICAgICAgICAgICAweDA2NkUKKyNkZWZpbmUgQkdfU1RBQ0sgICAgICAgICAgICAgICAgIDB4MDY4RQorCisvKiBTQ0IncyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU1BPU0NCX0FERFIgICAgICAgICAgICAgIDB4MDcwCisjZGVmaW5lIEJHX1RSRUVfU0NCX0FERFIgICAgICAgICAweDYzNQorI2RlZmluZSBOVUxMX1NDQl9BRERSICAgICAgICAgICAgMHgwMDAKKyNkZWZpbmUgVElNSU5HTUFTVEVSX1NDQl9BRERSICAgIDB4MDEwCisjZGVmaW5lIENPREVDT1VUX1NDQl9BRERSICAgICAgICAweDAyMAorI2RlZmluZSBQQ01SRUFERVJfU0NCX0FERFIgICAgICAgMHgwMzAKKyNkZWZpbmUgV1JJVEVCQUNLX1NDQl9BRERSICAgICAgIDB4MDQwCisjZGVmaW5lIENPREVDSU5fU0NCX0FERFIgICAgICAgICAweDA4MAorI2RlZmluZSBNQVNURVJNSVhfU0NCX0FERFIgICAgICAgMHgwOTAKKyNkZWZpbmUgU1JDVEFTS19TQ0JfQUREUiAgICAgICAgIDB4MEEwCisjZGVmaW5lIFZBUklERUNJTUFURV9TQ0JfQUREUiAgICAweDBCMAorI2RlZmluZSBQQ01TRVJJQUxJTl9TQ0JfQUREUiAgICAgMHgwQzAKKyNkZWZpbmUgRkdfVEFTS19IRUFERVJfQUREUiAgICAgIDB4NjAwCisjZGVmaW5lIEFTWU5DVFhfU0NCX0FERFIgICAgICAgICAweDBFMAorI2RlZmluZSBBU1lOQ1JYX1NDQl9BRERSICAgICAgICAgMHgwRjAKKyNkZWZpbmUgU1JDVEFTS0lJX1NDQl9BRERSICAgICAgIDB4MTAwCisjZGVmaW5lIE9VVFBVVFNOT09QX1NDQl9BRERSICAgICAweDExMAorI2RlZmluZSBQQ01TRVJJQUxJTklJX1NDQl9BRERSICAgMHgxMjAKKyNkZWZpbmUgU1BJT1dSSVRFX1NDQl9BRERSICAgICAgIDB4MTMwCisjZGVmaW5lIFJFQVJfQ09ERUNPVVRfU0NCX0FERFIgICAweDE0MAorI2RlZmluZSBPVVRQVVRTTk9PUElJX1NDQl9BRERSICAgMHgxNTAKKyNkZWZpbmUgUENNU0VSSUFMSU5fUENNX1NDQl9BRERSIDB4MTYwCisjZGVmaW5lIFJFQ09SRF9NSVhFUl9TQ0JfQUREUiAgICAweDE3MAorI2RlZmluZSBSRUFSX01JWEVSX1NDQl9BRERSICAgICAgMHgxODAKKyNkZWZpbmUgQ0xGRV9NSVhFUl9TQ0JfQUREUiAgICAgIDB4MTkwCisjZGVmaW5lIENMRkVfQ09ERUNfU0NCX0FERFIgICAgICAweDFBMAorCisvKiBoeXBlcmZvcmdyb3VuZCBTQ0IncyovCisjZGVmaW5lIEhGR19UUkVFX1NDQiAgICAgICAgICAgICAweEJBMAorI2RlZmluZSBTUERJRklfU0NCX0lOU1QgICAgICAgICAgMHhCQjAKKyNkZWZpbmUgU1BESUZPX1NDQl9JTlNUICAgICAgICAgIDB4QkMwCisjZGVmaW5lIFdSSVRFX0JBQ0tfU1BCICAgICAgICAgICAweDBEMAorCisvKiBvZmZzZXRzICovCisjZGVmaW5lIEFzeW5jQ0lPRklGT1BvaW50ZXIgIDB4ZAorI2RlZmluZSBTUERJRk9GSUZPUG9pbnRlciAgICAweGQKKyNkZWZpbmUgU1BESUZJRklGT1BvaW50ZXIgICAgMHhkCisjZGVmaW5lIFRDQkRhdGEgICAgICAgICAgICAgIDB4YgorI2RlZmluZSBIRkdGbGFncyAgICAgICAgICAgICAweGEKKyNkZWZpbmUgVENCQ29udGV4dEJsayAgICAgICAgMHgxMAorI2RlZmluZSBBRkdUeEFjY3VtUGhpICAgICAgICAweDQKKyNkZWZpbmUgU0NCc3ViTGlzdFB0ciAgICAgICAgMHg5CisjZGVmaW5lIFNDQmZ1bmNFbnRyeVB0ciAgICAgIDB4QQorI2RlZmluZSBTUkNDb3JQZXJHb2YgICAgICAgICAweDIKKyNkZWZpbmUgU1JDUGhpSW5jcjZJbnQyNkZyYWMgMHhkCisjZGVmaW5lIFNDQlZvbHVtZUN0cmwgICAgICAgIDB4ZQorCisvKiBjb25mICovCisjZGVmaW5lIFVzZUFTRVIxSW5wdXQgMQorCisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcnNDb25maWcwMS8yMyByZWdpc3RlcnMgb2YKKyAqIHRoZSBTUC4KKyAqLworCisjZGVmaW5lIFJTQ09ORklHX01PRFVMT19TSVpFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDBGTAorI2RlZmluZSBSU0NPTkZJR19NT0RVTE9fMTYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUlNDT05GSUdfTU9EVUxPXzMyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFJTQ09ORklHX01PRFVMT182NCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzTAorI2RlZmluZSBSU0NPTkZJR19NT0RVTE9fMTI4ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgUlNDT05GSUdfTU9EVUxPXzI1NiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVMCisjZGVmaW5lIFJTQ09ORklHX01PRFVMT181MTIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2TAorI2RlZmluZSBSU0NPTkZJR19NT0RVTE9fMTAyNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN0wKKyNkZWZpbmUgUlNDT05GSUdfTU9EVUxPXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIFJTQ09ORklHX01PRFVMT184ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5TAorI2RlZmluZSBSU0NPTkZJR19TQU1QTEVfU0laRV9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBDMEwKKyNkZWZpbmUgUlNDT05GSUdfU0FNUExFXzhNT05PICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIFJTQ09ORklHX1NBTVBMRV84U1RFUkVPICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBSU0NPTkZJR19TQU1QTEVfMTZNT05PICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICAgICAgICAgICAgICAgIDB4MDAwMDAwQzBMCisjZGVmaW5lIFJTQ09ORklHX1VOREVSUlVOX1pFUk8gICAgICAgICAgICAgICAgICAweDAwMDA0MDAwTAorI2RlZmluZSBSU0NPTkZJR19ETUFfVE9fSE9TVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMEwKKyNkZWZpbmUgUlNDT05GSUdfU1RSRUFNX05VTV9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRjAwMDBMCisjZGVmaW5lIFJTQ09ORklHX01BWF9ETUFfU0laRV9NQVNLICAgICAgICAgICAgICAweDFGMDAwMDAwTAorI2RlZmluZSBSU0NPTkZJR19ETUFfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgUlNDT05GSUdfUFJJT1JJVFlfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDBMCisjZGVmaW5lIFJTQ09ORklHX1BSSU9SSVRZX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBSU0NPTkZJR19QUklPUklUWV9NRURJVU1fSElHSCAgICAgICAgICAgMHg0MDAwMDAwMEwKKyNkZWZpbmUgUlNDT05GSUdfUFJJT1JJVFlfTUVESVVNX0xPVyAgICAgICAgICAgIDB4ODAwMDAwMDBMCisjZGVmaW5lIFJTQ09ORklHX1BSSU9SSVRZX0xPVyAgICAgICAgICAgICAgICAgICAweEMwMDAwMDAwTAorI2RlZmluZSBSU0NPTkZJR19TVFJFQU1fTlVNX1NISUZUICAgICAgICAgICAgICAgMTZMCisjZGVmaW5lIFJTQ09ORklHX01BWF9ETUFfU0laRV9TSElGVCAgICAgICAgICAgICAyNEwKKworLyogU1AgY29uc3RhbnRzICovCisjZGVmaW5lIEZHX0lOVEVSVkFMX1RJTUVSX1BFUklPRCAgICAgICAgICAgICAgICAweDAwNTEKKyNkZWZpbmUgQkdfSU5URVJWQUxfVElNRVJfUEVSSU9EICAgICAgICAgICAgICAgIDB4MDEwMAorCisKKy8qIE9ubHkgU1AgYWNjZXNzaWJsZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1BfQVNFUl9DT1VOVERPV04gMHg4MDQwCisjZGVmaW5lIFNQX1NQRE9VVF9GSUZPICAgIDB4MDEwOAorI2RlZmluZSBTUF9TUERJTl9NSV9GSUZPICAweDAxRTAKKyNkZWZpbmUgU1BfU1BESU5fRF9GSUZPICAgMHgwMUYwCisjZGVmaW5lIFNQX1NQRElOX1NUQVRVUyAgIDB4ODA0OAorI2RlZmluZSBTUF9TUERJTl9DT05UUk9MICAweDgwNDkKKyNkZWZpbmUgU1BfU1BESU5fRklGT1BUUiAgMHg4MDRBCisjZGVmaW5lIFNQX1NQRE9VVF9TVEFUVVMgIDB4ODA0QworI2RlZmluZSBTUF9TUERPVVRfQ09OVFJPTCAweDgwNEQKKyNkZWZpbmUgU1BfU1BET1VUX0NTVVYgICAgMHg4MDhFCisKK3N0YXRpYyBpbmxpbmUgdTggX3dyYXBfYWxsX2JpdHMgKHU4IHZhbCkgeworCXU4IHdyYXBwZWQ7CisJCisJLyogd3JhcCBhbGwgOCBiaXRzICovCisJd3JhcHBlZCA9IAorCQkoKHZhbCAmIDB4MSApIDw8IDcpIHwKKwkJKCh2YWwgJiAweDIgKSA8PCA1KSB8CisJCSgodmFsICYgMHg0ICkgPDwgMykgfAorCQkoKHZhbCAmIDB4OCApIDw8IDEpIHwKKwkJKCh2YWwgJiAweDEwKSA+PiAxKSB8CisJCSgodmFsICYgMHgyMCkgPj4gMykgfAorCQkoKHZhbCAmIDB4NDApID4+IDUpIHwKKwkJKCh2YWwgJiAweDgwKSA+PiA3KTsKKworCXJldHVybiB3cmFwcGVkOworCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGNzNDZ4eF9kc3Bfc3Bvc191cGRhdGVfc2NiIChjczQ2eHhfdCAqIGNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2IpIAoreworCS8qIHVwZGF0ZSBuZXh0U0NCIGFuZCBzdWJMaXN0UHRyIGluIFNDQiAqLworCXNuZF9jczQ2eHhfcG9rZShjaGlwLAorCQkJKHNjYi0+YWRkcmVzcyArIFNDQnN1Ykxpc3RQdHIpIDw8IDIsCisJCQkoc2NiLT5zdWJfbGlzdF9wdHItPmFkZHJlc3MgPDwgMHgxMCkgfAorCQkJKHNjYi0+bmV4dF9zY2JfcHRyLT5hZGRyZXNzKSk7CQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3M0Nnh4X2RzcF9zY2Jfc2V0X3ZvbHVtZSAoY3M0Nnh4X3QgKiBjaGlwLGRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiLAorCQkJCQkgICAgICB1MTYgbGVmdCx1MTYgcmlnaHQpIHsKKwl1bnNpZ25lZCBpbnQgdmFsID0gKCgweGZmZmYgLSBsZWZ0KSA8PCAxNiB8ICgweGZmZmYgLSByaWdodCkpOworCisJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIChzY2ItPmFkZHJlc3MgKyBTQ0JWb2x1bWVDdHJsKSA8PCAyLCB2YWwpOworCXNuZF9jczQ2eHhfcG9rZShjaGlwLCAoc2NiLT5hZGRyZXNzICsgU0NCVm9sdW1lQ3RybCArIDEpIDw8IDIsIHZhbCk7Cit9CisjZW5kaWYgLyogX19EU1BfU1BPU19IX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg0OWUxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMKQEAgLTAsMCArMSwxNzUwIEBACisvKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworLyoKKyAqIDIwMDItMDcgQmVubnkgU2pvc3RyYW5kIGJlbm55QGhvc3Rtb2JpbGl0eS5jb20KKyAqLworCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jczQ2eHguaD4KKworI2luY2x1ZGUgImNzNDZ4eF9saWIuaCIKKyNpbmNsdWRlICJkc3Bfc3Bvcy5oIgorCit0eXBlZGVmIHN0cnVjdCBfcHJvY19zY2JfaW5mb190IHsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYl9kZXNjOworCWNzNDZ4eF90ICpjaGlwOworfSBwcm9jX3NjYl9pbmZvX3Q7CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9zeW1ib2wgKGNzNDZ4eF90ICogY2hpcCxzeW1ib2xfZW50cnlfdCAqIHN5bWJvbCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJaW50IHN5bWJvbF9pbmRleCA9IChpbnQpKHN5bWJvbCAtIGlucy0+c3ltYm9sX3RhYmxlLnN5bWJvbHMpOworCisJc25kX2Fzc2VydChpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9scyA+IDAscmV0dXJuKTsKKwlzbmRfYXNzZXJ0KHN5bWJvbF9pbmRleCA+PSAwICYmIHN5bWJvbF9pbmRleCA8IGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzLCByZXR1cm4pOworCisJaW5zLT5zeW1ib2xfdGFibGUuc3ltYm9sc1tzeW1ib2xfaW5kZXhdLmRlbGV0ZWQgPSAxOworCisJaWYgKHN5bWJvbF9pbmRleCA8IGlucy0+c3ltYm9sX3RhYmxlLmhpZ2hlc3RfZnJhZ19pbmRleCkgeworCQlpbnMtPnN5bWJvbF90YWJsZS5oaWdoZXN0X2ZyYWdfaW5kZXggPSBzeW1ib2xfaW5kZXg7CisJfQorICAKKwlpZiAoc3ltYm9sX2luZGV4ID09IGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzIC0gMSkKKwkJaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMgLS07CisKKwlpZiAoaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4ID4gaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMpIHsKKwkJaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4ID0gaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHM7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfcHJvY19zY2JfaW5mb19yZWFkIChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJcHJvY19zY2JfaW5mb190ICogc2NiX2luZm8gID0gKHByb2Nfc2NiX2luZm9fdCAqKWVudHJ5LT5wcml2YXRlX2RhdGE7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2IgPSBzY2JfaW5mby0+c2NiX2Rlc2M7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGluczsKKwljczQ2eHhfdCAqY2hpcCA9IHNjYl9pbmZvLT5jaGlwOworCWludCBqLGNvbDsKKwl2b2lkIF9faW9tZW0gKmRzdCA9IGNoaXAtPnJlZ2lvbi5pZHhbMV0ucmVtYXBfYWRkciArIERTUF9QQVJBTUVURVJfQllURV9PRkZTRVQ7CisKKwlpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA0eCAlczpcbiIsc2NiLT5hZGRyZXNzLHNjYi0+c2NiX25hbWUpOworCisJZm9yIChjb2wgPSAwLGogPSAwO2ogPCAweDEwOyBqKyssY29sKyspIHsKKwkJaWYgKGNvbCA9PSA0KSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJCQljb2wgPSAwOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA4eCAiLHJlYWRsKGRzdCArIChzY2ItPmFkZHJlc3MgKyBqKSAqIHNpemVvZih1MzIpKSk7CisJfQorICAKKwlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisKKwlpZiAoc2NiLT5wYXJlbnRfc2NiX3B0ciAhPSBOVUxMKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwicGFyZW50IFslczolMDR4XSAiLCAKKwkJCSAgICBzY2ItPnBhcmVudF9zY2JfcHRyLT5zY2JfbmFtZSwKKwkJCSAgICBzY2ItPnBhcmVudF9zY2JfcHRyLT5hZGRyZXNzKTsKKwl9IGVsc2Ugc25kX2lwcmludGYoYnVmZmVyLCJwYXJlbnQgW25vbmVdICIpOworICAKKwlzbmRfaXByaW50ZihidWZmZXIsInN1Yl9saXN0X3B0ciBbJXM6JTA0eF1cbm5leHRfc2NiX3B0ciBbJXM6JTA0eF0gIHRhc2tfZW50cnkgWyVzOiUwNHhdXG4iLAorCQkgICAgc2NiLT5zdWJfbGlzdF9wdHItPnNjYl9uYW1lLAorCQkgICAgc2NiLT5zdWJfbGlzdF9wdHItPmFkZHJlc3MsCisJCSAgICBzY2ItPm5leHRfc2NiX3B0ci0+c2NiX25hbWUsCisJCSAgICBzY2ItPm5leHRfc2NiX3B0ci0+YWRkcmVzcywKKwkJICAgIHNjYi0+dGFza19lbnRyeS0+c3ltYm9sX25hbWUsCisJCSAgICBzY2ItPnRhc2tfZW50cnktPmFkZHJlc3MpOworCisJc25kX2lwcmludGYoYnVmZmVyLCJpbmRleCBbJWRdIHJlZl9jb3VudCBbJWRdXG4iLHNjYi0+aW5kZXgsc2NiLT5yZWZfY291bnQpOyAgCisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBfZHNwX3VubGlua19zY2IgKGNzNDZ4eF90ICpjaGlwLGRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCBzY2ItPnBhcmVudF9zY2JfcHRyICkgeworCQkvKiB1bmxpbmsgcGFyZW50IFNDQiAqLworCQlzbmRfYXNzZXJ0ICgoc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID09IHNjYiB8fAorCQkJICAgICBzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPT0gc2NiKSxyZXR1cm4pOworICAKKwkJaWYgKHNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ciA9PSBzY2IpIHsKKworCQkJaWYgKHNjYi0+bmV4dF9zY2JfcHRyID09IGlucy0+dGhlX251bGxfc2NiKSB7CisJCQkJLyogbGFzdCBhbmQgb25seSBub2RlIGluIHBhcmVudCBzdWJsaXN0ICovCisJCQkJc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID0gc2NiLT5zdWJfbGlzdF9wdHI7CisKKwkJCQlpZiAoc2NiLT5zdWJfbGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJCQkJc2NiLT5zdWJfbGlzdF9wdHItPnBhcmVudF9zY2JfcHRyID0gc2NiLT5wYXJlbnRfc2NiX3B0cjsKKwkJCQl9CisJCQkJc2NiLT5zdWJfbGlzdF9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJCX0gZWxzZSB7CisJCQkJLyogZmlyc3Qgbm9kZSBpbiBwYXJlbnQgc3VibGlzdCAqLworCQkJCXNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ciA9IHNjYi0+bmV4dF9zY2JfcHRyOworCisJCQkJaWYgKHNjYi0+bmV4dF9zY2JfcHRyICE9IGlucy0+dGhlX251bGxfc2NiKSB7CisJCQkJCS8qIHVwZGF0ZSBuZXh0IG5vZGUgcGFyZW50IHB0ci4gKi8KKwkJCQkJc2NiLT5uZXh0X3NjYl9wdHItPnBhcmVudF9zY2JfcHRyID0gc2NiLT5wYXJlbnRfc2NiX3B0cjsKKwkJCQl9CisJCQkJc2NiLT5uZXh0X3NjYl9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHNuZF9hc3NlcnQgKCAoc2NiLT5zdWJfbGlzdF9wdHIgPT0gaW5zLT50aGVfbnVsbF9zY2IpLCByZXR1cm4pOyAqLworCQkJc2NiLT5wYXJlbnRfc2NiX3B0ci0+bmV4dF9zY2JfcHRyID0gc2NiLT5uZXh0X3NjYl9wdHI7CisKKwkJCWlmIChzY2ItPm5leHRfc2NiX3B0ciAhPSBpbnMtPnRoZV9udWxsX3NjYikgeworCQkJCS8qIHVwZGF0ZSBuZXh0IG5vZGUgcGFyZW50IHB0ci4gKi8KKwkJCQlzY2ItPm5leHRfc2NiX3B0ci0+cGFyZW50X3NjYl9wdHIgPSBzY2ItPnBhcmVudF9zY2JfcHRyOworCQkJfQorCQkJc2NiLT5uZXh0X3NjYl9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOyAgICAKKworCQkvKiB1cGRhdGUgcGFyZW50IGZpcnN0IGVudHJ5IGluIERTUCBSQU0gKi8KKwkJY3M0Nnh4X2RzcF9zcG9zX3VwZGF0ZV9zY2IoY2hpcCxzY2ItPnBhcmVudF9zY2JfcHRyKTsKKworCQkvKiB0aGVuIHVwZGF0ZSBlbnRyeSBpbiBEU1AgUkFNICovCisJCWNzNDZ4eF9kc3Bfc3Bvc191cGRhdGVfc2NiKGNoaXAsc2NiKTsKKworCQlzY2ItPnBhcmVudF9zY2JfcHRyID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9kc3BfY2xlYXJfc2FtcGxlX2J1ZmZlciAoY3M0Nnh4X3QgKmNoaXAsIHUzMiBzYW1wbGVfYnVmZmVyX2FkZHIsIGludCBkd29yZF9jb3VudCkgCit7CisJdm9pZCBfX2lvbWVtICpkc3QgPSBjaGlwLT5yZWdpb24uaWR4WzJdLnJlbWFwX2FkZHIgKyBzYW1wbGVfYnVmZmVyX2FkZHI7CisJaW50IGk7CisgIAorCWZvciAoaSA9IDA7IGkgPCBkd29yZF9jb3VudCA7ICsraSApIHsKKwkJd3JpdGVsKDAsIGRzdCk7CisJCWRzdCArPSA0OworCX0gIAorfQorCit2b2lkIGNzNDZ4eF9kc3BfcmVtb3ZlX3NjYiAoY3M0Nnh4X3QgKmNoaXAsIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCS8qIGNoZWNrIGludGVncmV0eSAqLworCXNuZF9hc3NlcnQgKCAoc2NiLT5pbmRleCA+PSAwICYmIAorCQkgICAgICBzY2ItPmluZGV4IDwgaW5zLT5uc2NiICYmIAorCQkgICAgICAoaW5zLT5zY2JzICsgc2NiLT5pbmRleCkgPT0gc2NiKSwgcmV0dXJuICk7CisKKyNpZiAwCisJLyogY2FuJ3QgcmVtb3ZlIGEgU0NCIHdpdGggY2hpbGRzIGJlZm9yZSAKKwkgICByZW1vdmluZyBjaGlsZHMgZmlyc3QgICovCisJc25kX2Fzc2VydCAoIChzY2ItPnN1Yl9saXN0X3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiAmJgorCQkgICAgICBzY2ItPm5leHRfc2NiX3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiksCisJCSAgICAgZ290byBfZW5kKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZzY2ItPmxvY2spOworCV9kc3BfdW5saW5rX3NjYiAoY2hpcCxzY2IpOworCXNwaW5fdW5sb2NrKCZzY2ItPmxvY2spOworCisJY3M0Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2Moc2NiKTsKKwlzbmRfYXNzZXJ0IChzY2ItPnNjYl9zeW1ib2wgIT0gTlVMTCwgcmV0dXJuICk7CisJcmVtb3ZlX3N5bWJvbCAoY2hpcCxzY2ItPnNjYl9zeW1ib2wpOworCisJaW5zLT5zY2JzW3NjYi0+aW5kZXhdLmRlbGV0ZWQgPSAxOworCisJaWYgKHNjYi0+aW5kZXggPCBpbnMtPnNjYl9oaWdoZXN0X2ZyYWdfaW5kZXgpCisJCWlucy0+c2NiX2hpZ2hlc3RfZnJhZ19pbmRleCA9IHNjYi0+aW5kZXg7CisKKwlpZiAoc2NiLT5pbmRleCA9PSBpbnMtPm5zY2IgLSAxKSB7CisJCWlucy0+bnNjYiAtLTsKKwl9CisKKwlpZiAoaW5zLT5zY2JfaGlnaGVzdF9mcmFnX2luZGV4ID4gaW5zLT5uc2NiKSB7CisJCWlucy0+c2NiX2hpZ2hlc3RfZnJhZ19pbmRleCA9IGlucy0+bnNjYjsKKwl9CisKKyNpZiAwCisJLyogISEhISBUSElTIElTIEEgUElFQ0UgT0YgU0hJVCBNQURFIEJZIE1FICEhISAqLworCWZvcihpID0gc2NiLT5pbmRleCArIDE7aSA8IGlucy0+bnNjYjsgKytpKSB7CisJCWlucy0+c2Nic1tpIC0gMV0uaW5kZXggPSBpIC0gMTsKKwl9CisjZW5kaWYKK30KKworCit2b2lkIGNzNDZ4eF9kc3BfcHJvY19mcmVlX3NjYl9kZXNjIChkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYikKK3sKKwlpZiAoc2NiLT5wcm9jX2luZm8pIHsKKwkJcHJvY19zY2JfaW5mb190ICogc2NiX2luZm8gID0gKHByb2Nfc2NiX2luZm9fdCAqKXNjYi0+cHJvY19pbmZvLT5wcml2YXRlX2RhdGE7CisKKwkJc25kX3ByaW50ZGQoImNzNDZ4eF9kc3BfcHJvY19mcmVlX3NjYl9kZXNjOiBmcmVlaW5nICVzXG4iLHNjYi0+c2NiX25hbWUpOworCisJCXNuZF9pbmZvX3VucmVnaXN0ZXIoc2NiLT5wcm9jX2luZm8pOworCQlzY2ItPnByb2NfaW5mbyA9IE5VTEw7CisKKwkJc25kX2Fzc2VydCAoc2NiX2luZm8gIT0gTlVMTCwgcmV0dXJuKTsKKwkJa2ZyZWUgKHNjYl9pbmZvKTsKKwl9Cit9CisKK3ZvaWQgY3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNjIChjczQ2eHhfdCAqY2hpcCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYikKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJc25kX2luZm9fZW50cnlfdCAqIGVudHJ5OworCXByb2Nfc2NiX2luZm9fdCAqIHNjYl9pbmZvOworCisJLyogcmVnaXN0ZXIgdG8gcHJvYyAqLworCWlmIChpbnMtPnNuZF9jYXJkICE9IE5VTEwgJiYgaW5zLT5wcm9jX2RzcF9kaXIgIT0gTlVMTCAmJgorCSAgICBzY2ItPnByb2NfaW5mbyA9PSBOVUxMKSB7CisgIAorCQlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoaW5zLT5zbmRfY2FyZCwgc2NiLT5zY2JfbmFtZSwgCisJCQkJCQkJaW5zLT5wcm9jX2RzcF9kaXIpKSAhPSBOVUxMKSB7CisJCQlzY2JfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHByb2Nfc2NiX2luZm9fdCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFzY2JfaW5mbykgeworCQkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOworCQkJCWVudHJ5ID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJc2NiX2luZm8tPmNoaXAgPSBjaGlwOworCQkJc2NiX2luZm8tPnNjYl9kZXNjID0gc2NiOworICAgICAgCisJCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOworCQkJZW50cnktPnByaXZhdGVfZGF0YSA9IHNjYl9pbmZvOworCQkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7CisgICAgICAKKwkJCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOworCQkJZW50cnktPmMudGV4dC5yZWFkID0gY3M0Nnh4X2RzcF9wcm9jX3NjYl9pbmZvX3JlYWQ7CisgICAgICAKKwkJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CisJCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQkJa2ZyZWUgKHNjYl9pbmZvKTsKKwkJCQllbnRyeSA9IE5VTEw7CisJCQl9CisJCX0KK291dDoKKwkJc2NiLT5wcm9jX2luZm8gPSBlbnRyeTsKKwl9Cit9CisKK3N0YXRpYyBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorX2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IgKGNzNDZ4eF90ICpjaGlwLGNoYXIgKiBuYW1lLCB1MzIgKiBzY2JfZGF0YSx1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZW50cnlfdCAqIHRhc2tfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisgIAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzbmRfYXNzZXJ0IChpbnMtPnRoZV9udWxsX3NjYiAhPSBOVUxMLHJldHVybiBOVUxMKTsKKworCS8qIGZpbGwgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHdyb3RlbiB0byBEU1AgKi8KKwlzY2JfZGF0YVtTQ0JzdWJMaXN0UHRyXSA9IAorCQkoaW5zLT50aGVfbnVsbF9zY2ItPmFkZHJlc3MgPDwgMHgxMCkgfCBpbnMtPnRoZV9udWxsX3NjYi0+YWRkcmVzczsKKworCXNjYl9kYXRhW1NDQmZ1bmNFbnRyeVB0cl0gJj0gMHhGRkZGMDAwMDsKKwlzY2JfZGF0YVtTQ0JmdW5jRW50cnlQdHJdIHw9IHRhc2tfZW50cnktPmFkZHJlc3M7CisKKwlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGNyZWF0aW5nIFNDQiA8JXM+XG4iLG5hbWUpOworCisJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsbmFtZSxzY2JfZGF0YSxkZXN0KTsKKworCisJc2NiLT5zdWJfbGlzdF9wdHIgPSBpbnMtPnRoZV9udWxsX3NjYjsKKwlzY2ItPm5leHRfc2NiX3B0ciA9IGlucy0+dGhlX251bGxfc2NiOworCisJc2NiLT5wYXJlbnRfc2NiX3B0ciA9IHBhcmVudF9zY2I7CisJc2NiLT50YXNrX2VudHJ5ID0gdGFza19lbnRyeTsKKworICAKKwkvKiB1cGRhdGUgcGFyZW50IFNDQiAqLworCWlmIChzY2ItPnBhcmVudF9zY2JfcHRyKSB7CisjaWYgMAorCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyID0gJXNcbiIsc2NiLT5wYXJlbnRfc2NiX3B0ci0+c2NiX25hbWUpOworCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHItPnNjYl9uYW1lKTsKKwkJcHJpbnRrICgic2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID0gJXNcbiIsc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyLT5zY2JfbmFtZSk7CisjZW5kaWYKKwkJLyogbGluayB0byAgcGFyZW50IFNDQiAqLworCQlpZiAoc2NiX2NoaWxkX3R5cGUgPT0gU0NCX09OX1BBUkVOVF9ORVhUX1NDQikgeworCQkJc25kX2Fzc2VydCAoIChzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPT0gaW5zLT50aGVfbnVsbF9zY2IpLAorCQkJCSAgICAgcmV0dXJuIE5VTEwpOworCisJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSBzY2I7CisKKwkJfSBlbHNlIGlmIChzY2JfY2hpbGRfdHlwZSA9PSBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NCKSB7CisJCQlzbmRfYXNzZXJ0ICggKHNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiksCisJCQkJICAgICByZXR1cm4gTlVMTCk7CisKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ciA9IHNjYjsKKwkJfSBlbHNlIHsKKwkJCXNuZF9hc3NlcnQgKDAscmV0dXJuIE5VTEwpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkJLyogdXBkYXRlIGVudHJ5IGluIERTUCBSQU0gKi8KKwkJY3M0Nnh4X2RzcF9zcG9zX3VwZGF0ZV9zY2IoY2hpcCxzY2ItPnBhcmVudF9zY2JfcHRyKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCX0KKworCisJY3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNjIChjaGlwLHNjYik7CisKKwlyZXR1cm4gc2NiOworfQorCitzdGF0aWMgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAKK2NzNDZ4eF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiIChjczQ2eHhfdCAqY2hpcCxjaGFyICogbmFtZSwgdTMyICogc2NiX2RhdGEsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHRhc2tfZW50cnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKQoreworCXN5bWJvbF9lbnRyeV90ICogdGFza19lbnRyeTsKKworCXRhc2tfZW50cnkgPSBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2wgKGNoaXAsdGFza19lbnRyeV9uYW1lLAorCQkJCQkgICAgICAgU1lNQk9MX0NPREUpOworICAKKwlpZiAodGFza19lbnRyeSA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sICVzIG5vdCBmb3VuZFxuIix0YXNrX2VudHJ5X25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisgIAorCXJldHVybiBfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYiAoY2hpcCxuYW1lLHNjYl9kYXRhLGRlc3QsdGFza19lbnRyeSwKKwkJCQkJcGFyZW50X3NjYixzY2JfY2hpbGRfdHlwZSk7Cit9CisKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogCitjczQ2eHhfZHNwX2NyZWF0ZV90aW1pbmdfbWFzdGVyX3NjYiAoY3M0Nnh4X3QgKmNoaXApCit7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisgIAorCXRpbWluZ19tYXN0ZXJfc2NiX3QgdGltaW5nX21hc3Rlcl9zY2IgPSB7CisJCXsgMCwKKwkJICAwLAorCQkgIDAsCisJCSAgMAorCQl9LAorCQl7IDAsCisJCSAgMCwKKwkJICAwLAorCQkgIDAsCisJCSAgMAorCQl9LAorCQkwLDAsCisJCTAsTlVMTF9TQ0JfQUREUiwKKwkJMCwwLCAgICAgICAgICAgICAvKiBleHRyYVNhbXBsZUFjY3VtOlRNcmVzZXJ2ZWQgKi8KKwkJMCwwLCAgICAgICAgICAgICAvKiBjb2RlY0ZJRk9wdHI6Y29kZWNGSUZPc3luY2QgKi8KKwkJMHgwMDAxLDB4ODAwMCwgICAvKiBmcmFjU2FtcEFjY3VtUW0xOlRNZnJtc0xlZnRJbkdyb3VwICovCisJCTB4MDAwMSwweDAwMDAsICAgLyogZnJhY1NhbXBDb3JyZWN0aW9uUW0xOlRNZnJtR3JvdXBMZW5ndGggKi8KKwkJMHgwMDA2MDAwMCAgICAgICAvKiBuU2FtcFBlckZybVExNSAqLworCX07ICAgIAorICAKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLCJUaW1pbmdNYXN0ZXJTQ0JJbnN0IiwodTMyICopJnRpbWluZ19tYXN0ZXJfc2NiLAorCQkJCQkgICAgVElNSU5HTUFTVEVSX1NDQl9BRERSLAorCQkJCQkgICAgIlRJTUlOR01BU1RFUiIsTlVMTCxTQ0JfTk9fUEFSRU5UKTsKKworCXJldHVybiBzY2I7Cit9CisKKworZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAKK2NzNDZ4eF9kc3BfY3JlYXRlX2NvZGVjX291dF9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBjb2RlY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgY2hhbm5lbF9kaXNwLHUxNiBmaWZvX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjaGlsZF9zY2JfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGRlc3QsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisgIAorCWNvZGVjX291dHB1dF9zY2JfdCBjb2RlY19vdXRfc2NiID0geworCQl7IDAsCisJCSAgMCwKKwkJICAwLAorCQkgIDAKKwkJfSwKKwkJeworCQkJMCwKKwkJCTAsCisJCQkwLAorCQkJMCwKKwkJCTAKKwkJfSwKKwkJMCwwLAorCQkwLE5VTExfU0NCX0FERFIsCisJCTAsICAgICAgICAgICAgICAgICAgICAgIC8qIENPc3RybVJzQ29uZmlnICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgIC8qIENPc3RybUJ1ZlB0ciAqLworCQljaGFubmVsX2Rpc3AsZmlmb19hZGRyLCAvKiBsZWZ0Q2hhbkJhc2VJT2FkZHI6cmlnaHRDaGFuSU9kaXNwICovCisJCTB4MDAwMCwweDAwODAsICAgICAgICAgIC8qICghQUM5NyEpIENPZXhwVm9sQ2hhbmdlUmF0ZTpDT3NjYWxlU2hpZnRDb3VudCAqLworCQkwLGNoaWxkX3NjYl9hZGRyICAgICAgICAvKiBDT3Jlc2VydmVkIC0gbmVlZCBjaGlsZCBzY2IgdG8gd29yayB3aXRoIHJvbSBjb2RlICovCisJfTsKKyAgCisgIAorCXNjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiKGNoaXAsY29kZWNfbmFtZSwodTMyICopJmNvZGVjX291dF9zY2IsCisJCQkJCSAgICBkZXN0LCJTMTZfQ09ERUNPVVRQVVRUQVNLIixwYXJlbnRfc2NiLAorCQkJCQkgICAgc2NiX2NoaWxkX3R5cGUpOworICAKKwlyZXR1cm4gc2NiOworfQorCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfaW5fc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogY29kZWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNoYW5uZWxfZGlzcCx1MTYgZmlmb19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc2FtcGxlX2J1ZmZlcl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGVzdCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSkKK3sKKworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOworCWNvZGVjX2lucHV0X3NjYl90IGNvZGVjX2lucHV0X3NjYiA9IHsKKwkJeyAwLAorCQkgIDAsCisJCSAgMCwKKwkJICAwCisJCX0sCisJCXsKKwkJCTAsCisJCQkwLAorCQkJMCwKKwkJCTAsCisJCQkwCisJCX0sCisgICAgCisjaWYgMCAgLyogY3M0NjIwICovCisJCVN5bmNJT1NDQixOVUxMX1NDQl9BRERSCisjZWxzZQorCQkwICwgMCwKKyNlbmRpZgorCQkwLDAsCisKKwkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzY0LCAgLyogc3RybVJzQ29uZmlnICovCisJCXNhbXBsZV9idWZmZXJfYWRkciA8PCAweDEwLCAgICAgICAvKiBzdHJtQnVmUHRyOyBkZWZpbmVkIGFzIGEgZHdvcmQgcHRyLCB1c2VkIGFzIGEgYnl0ZSBwdHIgKi8KKwkJY2hhbm5lbF9kaXNwLGZpZm9fYWRkciwgICAgICAgICAgIC8qICghQUM5NyEpIGxlZnRDaGFuQmFzZUlOYWRkcj1BQzk3cHJpbWFyeSAKKwkJCQkJCSAgICAgbGluayBpbnB1dCBzbG90IDMgOnJpZ2h0Q2hhbklOZGlzcD0iInNsb3QgNCAqLworCQkweDAwMDAsMHgwMDAwLCAgICAgICAgICAgICAgICAgICAgLyogKCFBQzk3ISkgPz8/PzpzY2FsZVNoaWZ0Q291bnQ7IG5vIHNoaWZ0IG5lZWRlZCAKKwkJCQkJCSAgICAgYmVjYXVzZSBBQzk3IGlzIGFscmVhZHkgMjAgYml0cyAqLworCQkweDgwMDA4MDAwICAgICAgICAgICAgICAgICAgICAgICAgLyogPz9jbHcgY3djZ2FtZS5zY2IgaGFzIDAgKi8KKwl9OworICAKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLGNvZGVjX25hbWUsKHUzMiAqKSZjb2RlY19pbnB1dF9zY2IsCisJCQkJCSAgICBkZXN0LCJTMTZfQ09ERUNJTlBVVFRBU0siLHBhcmVudF9zY2IsCisJCQkJCSAgICBzY2JfY2hpbGRfdHlwZSk7CisJcmV0dXJuIHNjYjsKK30KKworCitzdGF0aWMgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAKK2NzNDZ4eF9kc3BfY3JlYXRlX3BjbV9yZWFkZXJfc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogc2NiX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc2FtcGxlX2J1ZmZlcl9hZGRyLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZpcnR1YWxfY2hhbm5lbCwgdTMyIHBsYXliYWNrX2h3X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOworICAKKwlnZW5lcmljX3NjYl90IHBjbV9yZWFkZXJfc2NiID0geworICAgIAorCQkvKgorCQkgIFBsYXkgRE1BIFRhc2sgeGZlcnMgZGF0YSBmcm9tIGhvc3QgYnVmZmVyIHRvIFNQIGJ1ZmZlcgorCQkgIGluaXQvcnVudGltZSB2YXJpYWJsZXM6CisJCSAgUGxheUFDOiBQbGF5IEF1ZGlvIERhdGEgQ29udmVyc2lvbiAtIFNDQiBsb2M6IDJuZCBkd29yZCwgbWFzazogMHgwMDAwRjAwMEwKKwkJICBEQVRBX0ZNVF8xNkJJVF9TVF9MVExFTkQoMHgwMDAwMDAwMEwpICAgZnJvbSAxNi1iaXQgc3RlcmVvLCBsaXR0bGUtZW5kaWFuCisJCSAgREFUQV9GTVRfOF9CSVRfU1RfU0lHTkVEKDB4MDAwMDEwMDBMKSAgIGZyb20gOC1iaXQgc3RlcmVvLCBzaWduZWQKKwkJICBEQVRBX0ZNVF8xNkJJVF9NTl9MVExFTkQoMHgwMDAwMjAwMEwpICAgZnJvbSAxNi1iaXQgbW9ubywgbGl0dGxlLWVuZGlhbgorCQkgIERBVEFfRk1UXzhfQklUX01OX1NJR05FRCgweDAwMDAzMDAwTCkgICBmcm9tIDgtYml0IG1vbm8sIHNpZ25lZAorCQkgIERBVEFfRk1UXzE2QklUX1NUX0JJR0VORCgweDAwMDA0MDAwTCkgICBmcm9tIDE2LWJpdCBzdGVyZW8sIGJpZy1lbmRpYW4KKwkJICBEQVRBX0ZNVF8xNkJJVF9NTl9CSUdFTkQoMHgwMDAwNjAwMEwpICAgZnJvbSAxNi1iaXQgbW9ubywgYmlnLWVuZGlhbgorCQkgIERBVEFfRk1UXzhfQklUX1NUX1VOU0lHTkVEKDB4MDAwMDkwMDBMKSBmcm9tIDgtYml0IHN0ZXJlbywgdW5zaWduZWQKKwkJICBEQVRBX0ZNVF84X0JJVF9NTl9VTlNJR05FRCgweDAwMDBiMDAwTCkgZnJvbSA4LWJpdCBtb25vLCB1bnNpZ25lZAorCQkgID8gT3RoZXIgY29tYmluYXRpb25zIHBvc3NpYmxlIGZyb206CisJCSAgRE1BX1JRX0MyX0FVRElPX0NPTlZFUlRfTUFTSyAgICAweDAwMDBGMDAwTAorCQkgIERNQV9SUV9DMl9BQ19OT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKwkJICBETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgIDB4MDAwMDEwMDBMCisJCSAgRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPICAgICAweDAwMDAyMDAwTAorCQkgIERNQV9SUV9DMl9BQ19FTkRJQU5fQ09OVkVSVCAgICAgMHgwMDAwNDAwMEwKKwkJICBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQgICAgIDB4MDAwMDgwMDBMCisgICAgICAgIAorCQkgIEhvc3RCdWZmQWRkcjogSG9zdCBCdWZmZXIgUGh5c2ljYWwgQnl0ZSBBZGRyZXNzIC0gU0NCIGxvYzozcmQgZHdvcmQsIE1hc2s6IDB4RkZGRkZGRkZMCisJCSAgYWxpZ25lZCB0byBkd29yZCBib3VuZGFyeQorCQkqLworCQkvKiBCYXNpYyAobm9uIHNjYXR0ZXIvZ2F0aGVyKSBETUEgcmVxdWVzdG9yICg0IGludHMpICovCisJCXsgRE1BX1JRX0MxX1NPVVJDRV9PTl9IT1NUICsgICAgICAgIC8qIHNvdXJjZSBidWZmZXIgaXMgb24gdGhlIGhvc3QgKi8KKwkJICBETUFfUlFfQzFfU09VUkNFX01PRDEwMjQgKyAgICAgICAgLyogc291cmNlIGJ1ZmZlciBpcyAxMDI0IGR3b3JkcyAoNDA5NiBieXRlcykgKi8KKwkJICBETUFfUlFfQzFfREVTVF9NT0QzMiArICAgICAgICAgICAgLyogZGVzdCBidWZmZXIoUENNcmVhZGVyQnVmKSBpcyAzMiBkd29yZHMqLworCQkgIERNQV9SUV9DMV9XUklURUJBQ0tfU1JDX0ZMQUcgKyAgICAvKiA/PyAqLworCQkgIERNQV9SUV9DMV9XUklURUJBQ0tfREVTVF9GTEFHICsgICAvKiA/PyAqLworCQkgIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHdvcmRDb3VudC0xOiBwaWNrZWQgMTYgZm9yIER3b3JkQ291bnQgYmVjYXVzZSBKaW0gKi8KKwkJICAvKiAgICAgICAgQmFybmV0dGUgc2FpZCB0aGF0IGlzIHdoYXQgd2Ugc2hvdWxkIHVzZSBzaW5jZSAqLworCQkgIC8qICAgICAgICB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gb3B0aW1pemVkIG1vZGU/ICovCisJCSAgRE1BX1JRX0MyX0FDX05PTkUgKworCQkgIERNQV9SUV9DMl9TSUdOQUxfU09VUkNFX1BJTkdQT05HICsgLyogc2V0IHBsYXkgaW50ZXJydXB0IChiaXQwKSBpbiBISVNSIHdoZW4gc291cmNlICovCisJCSAgLyogICBidWZmZXIgKG9uIGhvc3QpIGNyb3NzZXMgaGFsZi13YXkgcG9pbnQgKi8KKwkJICB2aXJ0dWFsX2NoYW5uZWwsICAgICAgICAgICAgICAgICAgIC8qIFBsYXkgRE1BIGNoYW5uZWwgYXJiaXRyYXJpbHkgc2V0IHRvIDAgKi8KKwkJICBwbGF5YmFja19od19hZGRyLCAgICAgICAgICAgICAgICAgIC8qIEhvc3RCdWZmQWRkciAoc291cmNlKSAqLworCQkgIERNQV9SUV9TRF9TUF9TQU1QTEVfQUREUiArICAgICAgICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGlzIGluIFNQIFNhbXBsZSBNZW1vcnkgKi8KKwkJICBzYW1wbGVfYnVmZmVyX2FkZHIgICAgICAgICAgICAgICAgIC8qIFNQIEJ1ZmZlciBBZGRyZXNzIChkZXN0aW5hdGlvbikgKi8KKwkJfSwKKwkJLyogU2NhdHRlci9nYXRoZXIgRE1BIHJlcXVlc3RvciBleHRlbnNpb24gICAoNSBpbnRzKSAqLworCQl7CisJCQkwLAorCQkJMCwKKwkJCTAsCisJCQkwLAorCQkJMCAKKwkJfSwKKwkJLyogU3VibGlzdCBwb2ludGVyICYgbmV4dCBzdHJlYW0gY29udHJvbCBibG9jayAoU0NCKSBsaW5rLiAqLworCQlOVUxMX1NDQl9BRERSLE5VTExfU0NCX0FERFIsCisJCS8qIFBvaW50ZXIgdG8gdGhpcyB0YXNrcyBwYXJhbWV0ZXIgYmxvY2sgJiBzdHJlYW0gZnVuY3Rpb24gcG9pbnRlciAqLworCQkwLE5VTExfU0NCX0FERFIsCisJCS8qIHJzQ29uZmlnIHJlZ2lzdGVyIGZvciBzdHJlYW0gYnVmZmVyIChyc0RNQSByZWcuIGlzIGxvYWRlZCBmcm9tIGJhc2ljUmVxLmRhdyAqLworCQkvKiAgIGZvciBpbmNvbWluZyBzdHJlYW1zLCBvciBiYXNpY1JlcS5zYXcsIGZvciBvdXRnb2luZyBzdHJlYW1zKSAqLworCQlSU0NPTkZJR19ETUFfRU5BQkxFICsgICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBETUEgKi8KKwkJKDE5IDw8IFJTQ09ORklHX01BWF9ETUFfU0laRV9TSElGVCkgKyAvKiBNQVhfRE1BX1NJWkUgcGlja2VkIHRvIGJlIDE5IHNpbmNlIFNQVUQgICovCisJCS8qICB1c2VzIGl0IGZvciBzb21lIHJlYXNvbiAqLworCQkoKGRlc3QgPj4gNCkgPDwgUlNDT05GSUdfU1RSRUFNX05VTV9TSElGVCkgKyAvKiBzdHJlYW0gbnVtYmVyID0gU0NCYWRkci8xNiAqLworCQlSU0NPTkZJR19TQU1QTEVfMTZTVEVSRU8gKworCQlSU0NPTkZJR19NT0RVTE9fMzIsICAgICAgICAgICAgIC8qIGRlc3QgYnVmZmVyKFBDTXJlYWRlckJ1ZikgaXMgMzIgZHdvcmRzICgyNTYgYnl0ZXMpICovCisJCS8qIFN0cmVhbSBzYW1wbGUgcG9pbnRlciAmIE1BQy11bml0IG1vZGUgZm9yIHRoaXMgc3RyZWFtICovCisJCShzYW1wbGVfYnVmZmVyX2FkZHIgPDwgMHgxMCksCisJCS8qIEZyYWN0aW9uYWwgaW5jcmVtZW50IHBlciBvdXRwdXQgc2FtcGxlIGluIHRoZSBpbnB1dCBzYW1wbGUgYnVmZmVyICovCisJCTAsIAorCQl7CisJCQkvKiBTdGFuZGFyZCBzdGVyZW8gdm9sdW1lIGNvbnRyb2wKKwkJCSAgIGRlZmF1bHQgbXV0ZWQgKi8KKwkJCTB4ZmZmZiwweGZmZmYsCisJCQkweGZmZmYsMHhmZmZmCisJCX0KKwl9OworCisJaWYgKGlucy0+bnVsbF9hbGdvcml0aG0gPT0gTlVMTCkgeworCQlpbnMtPm51bGxfYWxnb3JpdGhtID0gIGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbCAoY2hpcCwiTlVMTEFMR09SSVRITSIsCisJCQkJCQkJCSBTWU1CT0xfQ09ERSk7CisgICAgCisJCWlmIChpbnMtPm51bGxfYWxnb3JpdGhtID09IE5VTEwpIHsKKwkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIE5VTExBTEdPUklUSE0gbm90IGZvdW5kXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9ICAgIAorCX0KKworCXNjYiA9IF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiKGNoaXAsc2NiX25hbWUsKHUzMiAqKSZwY21fcmVhZGVyX3NjYiwKKwkJCQkgICAgICBkZXN0LGlucy0+bnVsbF9hbGdvcml0aG0scGFyZW50X3NjYiwKKwkJCQkgICAgICBzY2JfY2hpbGRfdHlwZSk7CisgIAorCXJldHVybiBzY2I7Cit9CisKKyNkZWZpbmUgR09GX1BFUl9TRUMgMjAwCisKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogCitjczQ2eHhfZHNwX2NyZWF0ZV9zcmNfdGFza19zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSwKKwkJCSAgICAgICBpbnQgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc3JjX2J1ZmZlcl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBzcmNfZGVsYXlfYnVmZmVyX2FkZHIsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSwKKwkgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzX3Rocm91Z2gpCit7CisKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisJdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7CisJdW5zaWduZWQgaW50IHBoaUluY3I7CisJdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWM7CisKKwlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBzZXR0aW5nICVzIHJhdGUgdG8gJXVcbiIsc2NiX25hbWUscmF0ZSk7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCisJICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKKwkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgorCSAqCisJICogIHBoaUluY3IgPSBmbG9vcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKKwkgKiAgY29ycmVjdGlvblBlckdPRiA9IGZsb29yKChGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyKSAvCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQorCSAqICB1bENvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC1NCisJICogICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDICogY29ycmVjdGlvblBlckdPRgorCSAqCisJICogIGkuZS4KKwkgKgorCSAqICBwaGlJbmNyOm90aGVyID0gZGl2aWRlbmQ6cmVtYWluZGVyKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICBjb3JyZWN0aW9uUGVyR09GOmNvcnJlY3Rpb25QZXJTZWMgPQorCSAqICAgICAgZGl2aWRlbmQ6cmVtYWluZGVyKHVsT3RoZXIgLyBHT0ZfUEVSX1NFQykKKwkgKi8KKwl0bXAxID0gcmF0ZSA8PCAxNjsKKwlwaGlJbmNyID0gdG1wMSAvIDQ4MDAwOworCXRtcDEgLT0gcGhpSW5jciAqIDQ4MDAwOworCXRtcDEgPDw9IDEwOworCXBoaUluY3IgPDw9IDEwOworCXRtcDIgPSB0bXAxIC8gNDgwMDA7CisJcGhpSW5jciArPSB0bXAyOworCXRtcDEgLT0gdG1wMiAqIDQ4MDAwOworCWNvcnJlY3Rpb25QZXJHT0YgPSB0bXAxIC8gR09GX1BFUl9TRUM7CisJdG1wMSAtPSBjb3JyZWN0aW9uUGVyR09GICogR09GX1BFUl9TRUM7CisJY29ycmVjdGlvblBlclNlYyA9IHRtcDE7CisKKwl7CisJCXNyY190YXNrX3NjYl90IHNyY190YXNrX3NjYiA9IHsKKwkJCTB4MDAyOCwweDAwYzgsCisJCQkweDU1NTUsMHgwMDAwLAorCQkJMHgwMDAwLDB4MDAwMCwKKwkJCXNyY19idWZmZXJfYWRkciwxLAorCQkJY29ycmVjdGlvblBlckdPRixjb3JyZWN0aW9uUGVyU2VjLAorCQkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzMyLCAgCisJCQkweDAwMDAsc3JjX2RlbGF5X2J1ZmZlcl9hZGRyLCAgICAgICAgICAgICAgICAgIAorCQkJMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkweDA4MCwoc3JjX2RlbGF5X2J1ZmZlcl9hZGRyICsgKDI0ICogNCkpLAorCQkJMCwwLCAvKiBuZXh0X3NjYiwgc3ViX2xpc3RfcHRyICovCisJCQkwLDAsIC8qIGVudHJ5LCB0aGlzX3NwYiAqLworCQkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzgsCisJCQlzcmNfYnVmZmVyX2FkZHIgPDwgMHgxMCwKKwkJCXBoaUluY3IsCisJCQl7IAorCQkJCTB4ZmZmZiAtIGlucy0+ZGFjX3ZvbHVtZV9yaWdodCwweGZmZmYgLSBpbnMtPmRhY192b2x1bWVfbGVmdCwKKwkJCQkweGZmZmYgLSBpbnMtPmRhY192b2x1bWVfcmlnaHQsMHhmZmZmIC0gaW5zLT5kYWNfdm9sdW1lX2xlZnQKKwkJCX0KKwkJfTsKKwkJCisJCWlmIChpbnMtPnMxNl91cCA9PSBOVUxMKSB7CisJCQlpbnMtPnMxNl91cCA9ICBjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2wgKGNoaXAsIlMxNl9VUFNSQyIsCisJCQkJCQkJCSBTWU1CT0xfQ09ERSk7CisJCQkKKwkJCWlmIChpbnMtPnMxNl91cCA9PSBOVUxMKSB7CisJCQkJc25kX3ByaW50ayAoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgUzE2X1VQU1JDIG5vdCBmb3VuZFxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9ICAgIAorCQl9CisJCQorCQkvKiBjbGVhciBidWZmZXJzICovCisJCV9kc3BfY2xlYXJfc2FtcGxlX2J1ZmZlciAoY2hpcCxzcmNfYnVmZmVyX2FkZHIsOCk7CisJCV9kc3BfY2xlYXJfc2FtcGxlX2J1ZmZlciAoY2hpcCxzcmNfZGVsYXlfYnVmZmVyX2FkZHIsMzIpOworCQkJCQorCQlpZiAocGFzc190aHJvdWdoKSB7CisJCQkvKiB3b250IHdvcmsgd2l0aCBhbnkgb3RoZXIgcmF0ZSB0aGFuCisJCQkgICB0aGUgbmF0aXZlIERTUCByYXRlICovCisJCQlzbmRfYXNzZXJ0IChyYXRlID0gNDgwMDApOworCisJCQlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLHNjYl9uYW1lLCh1MzIgKikmc3JjX3Rhc2tfc2NiLAorCQkJCQkJCSAgICBkZXN0LCJETUFSRUFERVIiLHBhcmVudF9zY2IsCisJCQkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKwkJfSBlbHNlIHsKKwkJCXNjYiA9IF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiKGNoaXAsc2NiX25hbWUsKHUzMiAqKSZzcmNfdGFza19zY2IsCisJCQkJCQkgICAgICBkZXN0LGlucy0+czE2X3VwLHBhcmVudF9zY2IsCisJCQkJCQkgICAgICBzY2JfY2hpbGRfdHlwZSk7CisJCX0KKworCisJfQorCisJcmV0dXJuIHNjYjsKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogCitjczQ2eHhfZHNwX2NyZWF0ZV9maWx0ZXJfc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogc2NiX25hbWUsCisJCQkgICAgIHUxNiBidWZmZXJfYWRkcix1MzIgZGVzdCwKKwkJCSAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorCQkJICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpIHsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYjsKKwkKKwlmaWx0ZXJfc2NiX3QgZmlsdGVyX3NjYiA9IHsKKwkJLmEwX3JpZ2h0ICAgICAgICAgICAgPSAweDQxYTksCisJCS5hMF9sZWZ0ICAgICAgICAgICAgID0gMHg0MWE5LAorCQkuYTFfcmlnaHQgICAgICAgICAgICA9IDB4YjhlNCwKKwkJLmExX2xlZnQgICAgICAgICAgICAgPSAweGI4ZTQsCisJCS5hMl9yaWdodCAgICAgICAgICAgID0gMHgzZTU1LAorCQkuYTJfbGVmdCAgICAgICAgICAgICA9IDB4M2U1NSwKKwkJCisJCS5maWx0ZXJfdW51c2VkMyAgICAgID0gMHgwMDAwLAorCQkuZmlsdGVyX3VudXNlZDIgICAgICA9IDB4MDAwMCwKKworCQkub3V0cHV0X2J1Zl9wdHIgICAgICA9IGJ1ZmZlcl9hZGRyLAorCQkuaW5pdCAgICAgICAgICAgICAgICA9IDB4MDAwLAorCisJCS5wcmV2X3NhbXBsZV9vdXRwdXQxID0gMHgwMDAwMDAwMCwKKwkJLnByZXZfc2FtcGxlX291dHB1dDIgPSAweDAwMDAwMDAwLAorCisJCS5wcmV2X3NhbXBsZV9pbnB1dDEgID0gMHgwMDAwMDAwMCwKKwkJLnByZXZfc2FtcGxlX2lucHV0MiAgPSAweDAwMDAwMDAwLAorCisJCS5uZXh0X3NjYl9wdHIgICAgICAgID0gMHgwMDAwLAorCQkuc3ViX2xpc3RfcHRyICAgICAgICA9IDB4MDAwMCwKKworCQkuZW50cnlfcG9pbnQgICAgICAgICA9IDB4MDAwMCwKKwkJLnNwYl9wdHIgICAgICAgICAgICAgPSAweDAwMDAsCisKKwkJLmIwX3JpZ2h0ICAgICAgICAgICAgPSAweDBlMzgsCisJCS5iMF9sZWZ0ICAgICAgICAgICAgID0gMHgwZTM4LAorCQkuYjFfcmlnaHQgICAgICAgICAgICA9IDB4MWM3MSwKKwkJLmIxX2xlZnQgICAgICAgICAgICAgPSAweDFjNzEsCisJCS5iMl9yaWdodCAgICAgICAgICAgID0gMHgwZTM4LAorCQkuYjJfbGVmdCAgICAgICAgICAgICA9IDB4MGUzOCwKKwl9OworCisKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLHNjYl9uYW1lLCh1MzIgKikmZmlsdGVyX3NjYiwKKwkJCQkJICAgIGRlc3QsIkZJTFRFUlRBU0siLHBhcmVudF9zY2IsCisJCQkJCSAgICBzY2JfY2hpbGRfdHlwZSk7CisKKyAJcmV0dXJuIHNjYjsKK30KKyNlbmRpZiAvKiBub3QgdXNlZCAqLworCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorY3M0Nnh4X2RzcF9jcmVhdGVfbWl4X29ubHlfc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogc2NiX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IG1peF9idWZmZXJfYWRkcix1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKQoreworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOworICAKKwltaXhfb25seV9zY2JfdCBtYXN0ZXJfbWl4X3NjYiA9IHsKKwkJLyogMCAqLyB7IDAsCisJCQkgIC8qIDEgKi8gICAwLAorCQkJICAvKiAyICovICBtaXhfYnVmZmVyX2FkZHIsCisJCQkgIC8qIDMgKi8gIDAKKwkJCSAgLyogICAqLyB9LAorCQl7CisJCQkvKiA0ICovICAwLAorCQkJLyogNSAqLyAgMCwKKwkJCS8qIDYgKi8gIDAsCisJCQkvKiA3ICovICAwLAorCQkJLyogOCAqLyAgMHgwMDAwMDA4MAorCQl9LAorCQkvKiA5ICovIDAsMCwKKwkJLyogQSAqLyAwLDAsCisJCS8qIEIgKi8gUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzMyLAorCQkvKiBDICovIChtaXhfYnVmZmVyX2FkZHIgICsgKDE2ICogNCkpIDw8IDB4MTAsIAorCQkvKiBEICovIDAsCisJCXsKKwkJCS8qIEUgKi8gMHg4MDAwLDB4ODAwMCwKKwkJCS8qIEYgKi8gMHg4MDAwLDB4ODAwMAorCQl9CisJfTsKKworCisJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IoY2hpcCxzY2JfbmFtZSwodTMyICopJm1hc3Rlcl9taXhfc2NiLAorCQkJCQkgICAgZGVzdCwiUzE2X01JWCIscGFyZW50X3NjYiwKKwkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKwlyZXR1cm4gc2NiOworfQorCisKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogCitjczQ2eHhfZHNwX2NyZWF0ZV9taXhfdG9fb3N0cmVhbV9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgbWl4X2J1ZmZlcl9hZGRyLHUxNiB3cml0ZWJhY2tfc3BiLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50X3NjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisKKwltaXgyX29zdHJlYW1fc2NiX3QgbWl4Ml9vc3RyZWFtX3NjYiA9IHsKKwkJLyogQmFzaWMgKG5vbiBzY2F0dGVyL2dhdGhlcikgRE1BIHJlcXVlc3RvciAoNCBpbnRzKSAqLworCQl7IAorCQkJRE1BX1JRX0MxX1NPVVJDRV9NT0Q2NCArCisJCQlETUFfUlFfQzFfREVTVF9PTl9IT1NUICsKKwkJCURNQV9SUV9DMV9ERVNUX01PRDEwMjQgKworCQkJRE1BX1JRX0MxX1dSSVRFQkFDS19TUkNfRkxBRyArIAorCQkJRE1BX1JRX0MxX1dSSVRFQkFDS19ERVNUX0ZMQUcgKworCQkJMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgCisJCQlETUFfUlFfQzJfQUNfTk9ORSArCisJCQlETUFfUlFfQzJfU0lHTkFMX0RFU1RfUElOR1BPTkcgKyAKKyAgICAgIAorCQkJQ1M0NlhYX0RTUF9DQVBUVVJFX0NIQU5ORUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlETUFfUlFfU0RfU1BfU0FNUExFX0FERFIgKyAKKwkJCW1peF9idWZmZXJfYWRkciwgCisJCQkweDAgICAgICAgICAgICAgICAgICAgCisJCX0sCisgICAgCisJCXsgMCwgMCwgMCwgMCwgMCwgfSwKKwkJMCwwLAorCQkwLHdyaXRlYmFja19zcGIsCisgICAgCisJCVJTQ09ORklHX0RNQV9FTkFCTEUgKyAKKwkJKDE5IDw8IFJTQ09ORklHX01BWF9ETUFfU0laRV9TSElGVCkgKyAKKyAgICAKKwkJKChkZXN0ID4+IDQpIDw8IFJTQ09ORklHX1NUUkVBTV9OVU1fU0hJRlQpICsKKwkJUlNDT05GSUdfRE1BX1RPX0hPU1QgKyAKKwkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsKKwkJUlNDT05GSUdfTU9EVUxPXzY0LCAgICAKKwkJKG1peF9idWZmZXJfYWRkciArICgzMiAqIDQpKSA8PCAweDEwLAorCQkxLDAsICAgICAgICAgICAgCisJCTB4MDAwMSwweDAwODAsCisJCTB4RkZGRiwwCisJfTsKKworCisJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IoY2hpcCxzY2JfbmFtZSwodTMyICopJm1peDJfb3N0cmVhbV9zY2IsCisJCQkJCisJICAgIGRlc3QsIlMxNl9NSVhfVE9fT1NUUkVBTSIscGFyZW50X3NjYiwKKwkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKyAgCisJcmV0dXJuIHNjYjsKK30KKworCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorY3M0Nnh4X2RzcF9jcmVhdGVfdmFyaV9kZWNpbWF0ZV9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB2YXJpX2J1ZmZlcl9hZGRyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB2YXJpX2J1ZmZlcl9hZGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKQoreworCisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisgIAorCXZhcmlfZGVjaW1hdGVfc2NiX3QgdmFyaV9kZWNpbWF0ZV9zY2IgPSB7CisJCTB4MDAyOCwweDAwYzgsCisJCTB4NTU1NSwweDAwMDAsCisJCTB4MDAwMCwweDAwMDAsCisJCXZhcmlfYnVmZmVyX2FkZHIwLHZhcmlfYnVmZmVyX2FkZHIxLAorICAgIAorCQkweDAwMjgsMHgwMGM4LAorCQlSU0NPTkZJR19TQU1QTEVfMTZTVEVSRU8gKyBSU0NPTkZJR19NT0RVTE9fMjU2LCAKKyAgICAKKwkJMHhGRjgwMDAwMCwgICAKKwkJMCwKKwkJMHgwMDgwLHZhcmlfYnVmZmVyX2FkZHIxICsgKDI1ICogNCksIAorICAgIAorCQkwLDAsIAorCQkwLDAsCisKKwkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzgsCisJCXZhcmlfYnVmZmVyX2FkZHIwIDw8IDB4MTAsICAgCisJCTB4MDQwMDAwMDAsICAgICAgICAgICAgICAgICAgIAorCQl7CisJCQkweDgwMDAsMHg4MDAwLCAKKwkJCTB4RkZGRiwweEZGRkYKKwkJfQorCX07CisKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLHNjYl9uYW1lLCh1MzIgKikmdmFyaV9kZWNpbWF0ZV9zY2IsCisJCQkJCSAgICBkZXN0LCJWQVJJREVDSU1BVEUiLHBhcmVudF9zY2IsCisJCQkJCSAgICBzY2JfY2hpbGRfdHlwZSk7CisgIAorCXJldHVybiBzY2I7Cit9CisKKworc3RhdGljIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogCitjczQ2eHhfZHNwX2NyZWF0ZV9wY21fc2VyaWFsX2lucHV0X3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBpbnB1dF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYjsKKworCisJcGNtX3NlcmlhbF9pbnB1dF9zY2JfdCBwY21fc2VyaWFsX2lucHV0X3NjYiA9IHsKKwkJeyAwLAorCQkgIDAsCisJCSAgMCwKKwkJICAwCisJCX0sCisJCXsKKwkJCTAsCisJCQkwLAorCQkJMCwKKwkJCTAsCisJCQkwCisJCX0sCisKKwkJMCwwLAorCQkwLDAsCisKKwkJUlNDT05GSUdfU0FNUExFXzE2U1RFUkVPICsgUlNDT05GSUdfTU9EVUxPXzE2LAorCQkwLAorICAgICAgLyogMHhEICovIDAsaW5wdXRfc2NiLT5hZGRyZXNzLAorCQl7CisgICAgICAvKiAweEUgKi8gICAweDgwMDAsMHg4MDAwLAorICAgICAgLyogMHhGICovCSAgMHg4MDAwLDB4ODAwMAorCQl9CisJfTsKKworCXNjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiKGNoaXAsc2NiX25hbWUsKHUzMiAqKSZwY21fc2VyaWFsX2lucHV0X3NjYiwKKwkJCQkJICAgIGRlc3QsIlBDTVNFUklBTElOUFVUVEFTSyIscGFyZW50X3NjYiwKKwkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKwlyZXR1cm4gc2NiOworfQorCisKK3N0YXRpYyBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorY3M0Nnh4X2RzcF9jcmVhdGVfYXN5bmNoX2ZnX3R4X3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgaGZnX3NjYl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYXN5bmNoX2J1ZmZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSkKK3sKKworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOworCisJYXN5bmNoX2ZnX3R4X3NjYl90IGFzeW5jaF9mZ190eF9zY2IgPSB7CisJCTB4ZmMwMCwweDAzZmYsICAgICAgLyogIFByb3RvdHlwZSBzYW1wbGUgYnVmZmVyIHNpemUgb2YgMjU2IGR3b3JkcyAqLworCQkweDAwNTgsMHgwMDI4LCAgICAgIC8qIE1pbiBEZWx0YSA3IGR3b3JkcyA9PSAyOCBieXRlcyAqLworCQkvKiA6IE1heCBkZWx0YSAyNSBkd29yZHMgPT0gMTAwIGJ5dGVzICovCisJCTAsaGZnX3NjYl9hZGRyZXNzLCAgLyogUG9pbnQgdG8gSEZHIHRhc2sgU0NCICovCisJCTAsMCwJCSAgICAvKiBJbml0aWFsaXplIGN1cnJlbnQgRGVsdGEgYW5kIENvbnN1bWVyIHB0ciBhZGp1c3RtZW50IGNvdW50ICovCisJCTAsICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhY2N1bXVsYXRlZCBQaGkgdG8gMCAqLworCQkwLDB4MmFhYiwgICAgICAgICAgIC8qIENvbnN0IDEvMyAqLworICAgIAorCQl7CisJCQkwLCAgICAgICAgIC8qIERlZmluZSB0aGUgdW51c2VkIGVsZW1lbnRzICovCisJCQkwLAorCQkJMAorCQl9LAorICAgIAorCQkwLDAsCisJCTAsZGVzdCArIEFGR1R4QWNjdW1QaGksCisgICAgCisJCVJTQ09ORklHX1NBTVBMRV8xNlNURVJFTyArIFJTQ09ORklHX01PRFVMT18yNTYsIC8qIFN0ZXJlbywgMjU2IGR3b3JkICovCisJCShhc3luY2hfYnVmZmVyX2FkZHJlc3MpIDw8IDB4MTAsICAvKiBUaGlzIHNob3VsZCBiZSBhdXRvbWFnaWNhbGx5IHN5bmNocm9uaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcHJvZHVjZXIgcG9pbnRlciAqLworICAgIAorCQkvKiBUaGVyZSBpcyBubyBjb3JyZWN0IGluaXRpYWwgdmFsdWUsIGl0IHdpbGwgZGVwZW5kIHVwb24gdGhlIGRldGVjdGVkCisJCSAgIHJhdGUgZXRjICAqLworCQkweDE4MDAwMDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIFBoaSBpbmNyZW1lbnQgZm9yIGFwcHJveCAzMmsgb3BlcmF0aW9uICovCisJCTB4ODAwMCwweDgwMDAsICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIGNvbnRyb2xzIGFyZSB1bnVzZWQgYXQgdGhpcyB0aW1lICovCisJCTB4ODAwMCwweDgwMDAKKwl9OworICAKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLHNjYl9uYW1lLCh1MzIgKikmYXN5bmNoX2ZnX3R4X3NjYiwKKwkJCQkJICAgIGRlc3QsIkFTWU5DSEZHVFhDT0RFIixwYXJlbnRfc2NiLAorCQkJCQkgICAgc2NiX2NoaWxkX3R5cGUpOworCisJcmV0dXJuIHNjYjsKK30KKworCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIAorY3M0Nnh4X2RzcF9jcmVhdGVfYXN5bmNoX2ZnX3J4X3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgaGZnX3NjYl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYXN5bmNoX2J1ZmZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2JfY2hpbGRfdHlwZSkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisKKwlhc3luY2hfZmdfcnhfc2NiX3QgYXN5bmNoX2ZnX3J4X3NjYiA9IHsKKwkJMHhmZTAwLDB4MDFmZiwgICAgICAvKiAgUHJvdG90eXBlIHNhbXBsZSBidWZmZXIgc2l6ZSBvZiAxMjggZHdvcmRzICovCisJCTB4MDA2NCwweDAwMWMsICAgICAgLyogTWluIERlbHRhIDcgZHdvcmRzID09IDI4IGJ5dGVzICovCisJCSAgICAgICAgICAgICAgICAgICAgLyogOiBNYXggZGVsdGEgMjUgZHdvcmRzID09IDEwMCBieXRlcyAqLworCQkwLGhmZ19zY2JfYWRkcmVzcywgIC8qIFBvaW50IHRvIEhGRyB0YXNrIFNDQiAqLworCQkwLDAsCQkJCS8qIEluaXRpYWxpemUgY3VycmVudCBEZWx0YSBhbmQgQ29uc3VtZXIgcHRyIGFkanVzdG1lbnQgY291bnQgKi8KKwkJeworCQkJMCwgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoZSB1bnVzZWQgZWxlbWVudHMgKi8KKwkJCTAsCisJCQkwLAorCQkJMCwKKwkJCTAKKwkJfSwKKyAgICAgIAorCQkwLDAsCisJCTAsZGVzdCwKKyAgICAKKwkJUlNDT05GSUdfTU9EVUxPXzEyOCB8CisgICAgICAgIFJTQ09ORklHX1NBTVBMRV8xNlNURVJFTywgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvLCAxMjggZHdvcmQgKi8KKwkJKCAoYXN5bmNoX2J1ZmZlcl9hZGRyZXNzICsgKDE2ICogNCkpICA8PCAweDEwKSwgICAvKiBUaGlzIHNob3VsZCBiZSBhdXRvbWFnaWNhbGx5IAorCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJpbml6ZWQgdG8gdGhlIHByb2R1Y2VyIHBvaW50ZXIgKi8KKyAgICAKKwkJLyogVGhlcmUgaXMgbm8gY29ycmVjdCBpbml0aWFsIHZhbHVlLCBpdCB3aWxsIGRlcGVuZCB1cG9uIHRoZSBkZXRlY3RlZAorCQkgICByYXRlIGV0YyAgKi8KKwkJMHgxODAwMDAwMCwgICAgICAgICAKKworCQkvKiBTZXQgSUVDOTU4IGlucHV0IHZvbHVtZSAqLworCQkweGZmZmYgLSBpbnMtPnNwZGlmX2lucHV0X3ZvbHVtZV9yaWdodCwweGZmZmYgLSBpbnMtPnNwZGlmX2lucHV0X3ZvbHVtZV9sZWZ0LAorCQkweGZmZmYgLSBpbnMtPnNwZGlmX2lucHV0X3ZvbHVtZV9yaWdodCwweGZmZmYgLSBpbnMtPnNwZGlmX2lucHV0X3ZvbHVtZV9sZWZ0LAorCX07CisKKwlzY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9nZW5lcmljX3NjYihjaGlwLHNjYl9uYW1lLCh1MzIgKikmYXN5bmNoX2ZnX3J4X3NjYiwKKwkJCQkJICAgIGRlc3QsIkFTWU5DSEZHUlhDT0RFIixwYXJlbnRfc2NiLAorCQkJCQkgICAgc2NiX2NoaWxkX3R5cGUpOworCisJcmV0dXJuIHNjYjsKK30KKworCisjaWYgMCAvKiBub3QgdXNlZCAqLworZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAKK2NzNDZ4eF9kc3BfY3JlYXRlX291dHB1dF9zbm9vcF9zY2IoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzY2JfbmFtZSx1MzIgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHNub29wX2J1ZmZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNub29wX3NjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYjsKKyAgCisJb3V0cHV0X3Nub29wX3NjYl90IG91dHB1dF9zbm9vcF9zY2IgPSB7CisJCXsgMCwJLyogIG5vdCB1c2VkLiAgWmVybyAqLworCQkgIDAsCisJCSAgMCwKKwkJICAwLAorCQl9LAorCQl7CisJCQkwLCAvKiBub3QgdXNlZC4gIFplcm8gKi8KKwkJCTAsCisJCQkwLAorCQkJMCwKKwkJCTAKKwkJfSwKKyAgICAKKwkJMCwwLAorCQkwLDAsCisgICAgCisJCVJTQ09ORklHX1NBTVBMRV8xNlNURVJFTyArIFJTQ09ORklHX01PRFVMT182NCwKKwkJc25vb3BfYnVmZmVyX2FkZHJlc3MgPDwgMHgxMCwgIAorCQkwLDAsCisJCTAsCisJCTAsc25vb3Bfc2NiLT5hZGRyZXNzCisJfTsKKyAgCisJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IoY2hpcCxzY2JfbmFtZSwodTMyICopJm91dHB1dF9zbm9vcF9zY2IsCisJCQkJCSAgICBkZXN0LCJPVVRQVVRTTk9PUCIscGFyZW50X3NjYiwKKwkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKwlyZXR1cm4gc2NiOworfQorI2VuZGlmIC8qIG5vdCB1c2VkICovCisKKworZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiAKK2NzNDZ4eF9kc3BfY3JlYXRlX3NwaW9fd3JpdGVfc2NiKGNzNDZ4eF90ICogY2hpcCxjaGFyICogc2NiX25hbWUsdTMyIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NiX2NoaWxkX3R5cGUpCit7CisJZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzY2I7CisgIAorCXNwaW9fd3JpdGVfc2NiX3Qgc3Bpb193cml0ZV9zY2IgPSB7CisJCTAsMCwgICAgICAgICAvKiAgIFNQSU9XQWRkcmVzczI6U1BJT1dBZGRyZXNzMTsgKi8KKwkJMCwgICAgICAgICAgIC8qICAgU1BJT1dEYXRhMTsgKi8KKwkJMCwgICAgICAgICAgIC8qICAgU1BJT1dEYXRhMjsgKi8KKwkJMCwwLCAgICAgICAgIC8qICAgU1BJT1dBZGRyZXNzNDpTUElPV0FkZHJlc3MzOyAqLworCQkwLCAgICAgICAgICAgLyogICBTUElPV0RhdGEzOyAqLworCQkwLCAgICAgICAgICAgLyogICBTUElPV0RhdGE0OyAqLworCQkwLDAsICAgICAgICAgLyogICBTUElPV0RhdGFQdHI6VW51c2VkMTsgKi8KKwkJeyAwLDAgfSwgICAgIC8qICAgVW51c2VkMlsyXTsgKi8KKyAgICAKKwkJMCwwLAkgICAgIC8qICAgU1BJT1dDaGlsZFB0cjpTUElPV1NpYmxpbmdQdHI7ICovCisJCTAsMCwgICAgICAgICAvKiAgIFNQSU9XVGhpc1B0cjpTUElPV0VudHJ5UG9pbnQ7ICovCisgICAgCisJCXsgCisJCQkwLAorCQkJMCwKKwkJCTAsCisJCQkwLAorCQkJMCAgICAgICAgICAvKiAgIFVudXNlZDNbNV07ICAqLworCQl9CisJfTsKKworCXNjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX2dlbmVyaWNfc2NiKGNoaXAsc2NiX25hbWUsKHUzMiAqKSZzcGlvX3dyaXRlX3NjYiwKKwkJCQkJICAgIGRlc3QsIlNQSU9XUklURSIscGFyZW50X3NjYiwKKwkJCQkJICAgIHNjYl9jaGlsZF90eXBlKTsKKworCXJldHVybiBzY2I7Cit9CisKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogIGNzNDZ4eF9kc3BfY3JlYXRlX21hZ2ljX3Nub29wX3NjYihjczQ2eHhfdCAqIGNoaXAsY2hhciAqIHNjYl9uYW1lLHUzMiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBzbm9vcF9idWZmZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNub29wX3NjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBhcmVudF9zY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYl9jaGlsZF90eXBlKQoreworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiOworICAKKwltYWdpY19zbm9vcF90YXNrX3QgbWFnaWNfc25vb3Bfc2NiID0geworCQkvKiAwICovIDAsIC8qIGkwICovCisJCS8qIDEgKi8gMCwgLyogaTEgKi8KKwkJLyogMiAqLyBzbm9vcF9idWZmZXJfYWRkcmVzcyA8PCAweDEwLAorCQkvKiAzICovIDAsc25vb3Bfc2NiLT5hZGRyZXNzLAorCQkvKiA0ICovIDAsIC8qIGkzICovCisJCS8qIDUgKi8gMCwgLyogaTQgKi8KKwkJLyogNiAqLyAwLCAvKiBpNSAqLworCQkvKiA3ICovIDAsIC8qIGk2ICovCisJCS8qIDggKi8gMCwgLyogaTcgKi8KKwkJLyogOSAqLyAwLDAsIC8qIG5leHRfc2NiLCBzdWJfbGlzdF9wdHIgKi8KKwkJLyogQSAqLyAwLDAsIC8qIGVudHJ5X3BvaW50LCB0aGlzX3B0ciAqLworCQkvKiBCICovIFJTQ09ORklHX1NBTVBMRV8xNlNURVJFTyArIFJTQ09ORklHX01PRFVMT182NCwKKwkJLyogQyAqLyBzbm9vcF9idWZmZXJfYWRkcmVzcyAgPDwgMHgxMCwKKwkJLyogRCAqLyAwLAorCQkvKiBFICovIHsgMHg4MDAwLDB4ODAwMCwKKwkgICAgICAgIC8qIEYgKi8gICAweGZmZmYsMHhmZmZmCisJCX0KKwl9OworCisJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IoY2hpcCxzY2JfbmFtZSwodTMyICopJm1hZ2ljX3Nub29wX3NjYiwKKwkJCQkJICAgIGRlc3QsIk1BR0lDU05PT1BUQVNLIixwYXJlbnRfc2NiLAorCQkJCQkgICAgc2NiX2NoaWxkX3R5cGUpOworCisJcmV0dXJuIHNjYjsKK30KKworc3RhdGljIGRzcF9zY2JfZGVzY3JpcHRvcl90ICogZmluZF9uZXh0X2ZyZWVfc2NiIChjczQ2eHhfdCAqIGNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBmcm9tKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNjYiA9IGZyb207CisKKwl3aGlsZSAoc2NiLT5uZXh0X3NjYl9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJc25kX2Fzc2VydCAoc2NiLT5uZXh0X3NjYl9wdHIgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOworCisJCXNjYiA9IHNjYi0+bmV4dF9zY2JfcHRyOworCX0KKworCXJldHVybiBzY2I7Cit9CisKK3N0YXRpYyB1MzIgcGNtX3JlYWRlcl9idWZmZXJfYWRkcltEU1BfTUFYX1BDTV9DSEFOTkVMU10gPSB7CisJMHgwNjAwLCAvKiAxICovCisJMHgxNTAwLCAvKiAyICovCisJMHgxNTgwLCAvKiAzICovCisJMHgxNjAwLCAvKiA0ICovCisJMHgxNjgwLCAvKiA1ICovCisJMHgxNzAwLCAvKiA2ICovCisJMHgxNzgwLCAvKiA3ICovCisJMHgxODAwLCAvKiA4ICovCisJMHgxODgwLCAvKiA5ICovCisJMHgxOTAwLCAvKiAxMCAqLworCTB4MTk4MCwgLyogMTEgKi8KKwkweDFBMDAsIC8qIDEyICovCisJMHgxQTgwLCAvKiAxMyAqLworCTB4MUIwMCwgLyogMTQgKi8KKwkweDFCODAsIC8qIDE1ICovCisJMHgxQzAwLCAvKiAxNiAqLworCTB4MUM4MCwgLyogMTcgKi8KKwkweDFEMDAsIC8qIDE4ICovCisJMHgxRDgwLCAvKiAxOSAqLworCTB4MUUwMCwgLyogMjAgKi8KKwkweDFFODAsIC8qIDIxICovCisJMHgxRjAwLCAvKiAyMiAqLworCTB4MUY4MCwgLyogMjMgKi8KKwkweDIwMDAsIC8qIDI0ICovCisJMHgyMDgwLCAvKiAyNSAqLworCTB4MjEwMCwgLyogMjYgKi8KKwkweDIxODAsIC8qIDI3ICovCisJMHgyMjAwLCAvKiAyOCAqLworCTB4MjI4MCwgLyogMjkgKi8KKwkweDIzMDAsIC8qIDMwICovCisJMHgyMzgwLCAvKiAzMSAqLworCTB4MjQwMCwgLyogMzIgKi8KK307CisKK3N0YXRpYyB1MzIgc3JjX291dHB1dF9idWZmZXJfYWRkcltEU1BfTUFYX1NSQ19OUl0gPSB7CisJMHgyQjgwLAorCTB4MkJBMCwKKwkweDJCQzAsCisJMHgyQkUwLAorCTB4MkQwMCwgIAorCTB4MkQyMCwgIAorCTB4MkQ0MCwgIAorCTB4MkQ2MCwKKwkweDJEODAsCisJMHgyREEwLAorCTB4MkRDMCwKKwkweDJERTAsCisJMHgyRTAwLAorCTB4MkUyMAorfTsKKworc3RhdGljIHUzMiBzcmNfZGVsYXlfYnVmZmVyX2FkZHJbRFNQX01BWF9TUkNfTlJdID0geworCTB4MjQ4MCwKKwkweDI1MDAsCisJMHgyNTgwLAorCTB4MjYwMCwKKwkweDI2ODAsCisJMHgyNzAwLAorCTB4Mjc4MCwKKwkweDI4MDAsCisJMHgyODgwLAorCTB4MjkwMCwKKwkweDI5ODAsCisJMHgyQTAwLAorCTB4MkE4MCwKKwkweDJCMDAKK307CisKK3BjbV9jaGFubmVsX2Rlc2NyaXB0b3JfdCAqIGNzNDZ4eF9kc3BfY3JlYXRlX3BjbV9jaGFubmVsIChjczQ2eHhfdCAqIGNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHNhbXBsZV9yYXRlLCB2b2lkICogcHJpdmF0ZV9kYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaHdfZG1hX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBjbV9jaGFubmVsX2lkKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNyY19zY2IgPSBOVUxMLCogcGNtX3NjYiwgKiBtaXhlcl9zY2IgPSBOVUxMOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogc3JjX3BhcmVudF9zY2IgPSBOVUxMOworCisJLyogZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwY21fcGFyZW50X3NjYjsgKi8KKwljaGFyIHNjYl9uYW1lW0RTUF9NQVhfU0NCX05BTUVdOworCWludCBpLHBjbV9pbmRleCA9IC0xLCBpbnNlcnRfcG9pbnQsIHNyY19pbmRleCA9IC0xLHBhc3NfdGhyb3VnaCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAocGNtX2NoYW5uZWxfaWQpIHsKKwljYXNlIERTUF9QQ01fTUFJTl9DSEFOTkVMOgorCQltaXhlcl9zY2IgPSBpbnMtPm1hc3Rlcl9taXhfc2NiOworCQlicmVhazsKKwljYXNlIERTUF9QQ01fUkVBUl9DSEFOTkVMOgorCQltaXhlcl9zY2IgPSBpbnMtPnJlYXJfbWl4X3NjYjsKKwkJYnJlYWs7CisJY2FzZSBEU1BfUENNX0NFTlRFUl9MRkVfQ0hBTk5FTDoKKwkJbWl4ZXJfc2NiID0gaW5zLT5jZW50ZXJfbGZlX21peF9zY2I7CisJCWJyZWFrOworCWNhc2UgRFNQX1BDTV9TNzFfQ0hBTk5FTDoKKwkJLyogVE9ETyAqLworCQlzbmRfYXNzZXJ0KDApOworCQlicmVhazsKKwljYXNlIERTUF9JRUM5NThfQ0hBTk5FTDoKKwkJc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfdHhfc2NiICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKwkJbWl4ZXJfc2NiID0gaW5zLT5hc3luY2hfdHhfc2NiOworCisJCS8qIGlmIHNhbXBsZSByYXRlIGlzIHNldCB0byA0OGtoeiB3ZSBwYXNzCisJCSAgIHRoZSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZWQgKHdoaWNoIGNvdWxkCisJCSAgIGFsdGVyIHRoZSByYXcgZGF0YSBzdHJlYW0gLi4uKSAqLworCQlpZiAoc2FtcGxlX3JhdGUgPT0gNDgwMDApIHsKKwkJCXNuZF9wcmludGRkICgiSUVDOTU4IHBhc3MgdGhyb3VnaFxuIik7CisJCQkvKiBIYWNrIHRvIGJ5cGFzcyBjcmVhdGluZyBhIG5ldyBTUkMgKi8KKwkJCXBhc3NfdGhyb3VnaCA9IDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX2Fzc2VydCAoMCk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBkZWZhdWx0IHNhbXBsZSByYXRlIGlzIDQ0MTAwICovCisJaWYgKCFzYW1wbGVfcmF0ZSkgc2FtcGxlX3JhdGUgPSA0NDEwMDsKKworCS8qIHNlYXJjaCBmb3IgYSBhbHJlYWR5IGNyZWF0ZWQgU1JDIFNDQiB3aXRoIHRoZSBzYW1lIHNhbXBsZSByYXRlICovCisJZm9yIChpID0gMDsgaSA8IERTUF9NQVhfUENNX0NIQU5ORUxTICYmIAorCQkgICAgIChwY21faW5kZXggPT0gLTEgfHwgc3JjX3NjYiA9PSBOVUxMKTsgKytpKSB7CisKKwkJLyogdmlydHVhbCBjaGFubmVsIHJlc2VydmVkIAorCQkgICBmb3IgY2FwdHVyZSAqLworCQlpZiAoaSA9PSBDUzQ2WFhfRFNQX0NBUFRVUkVfQ0hBTk5FTCkgY29udGludWU7CisKKwkJaWYgKGlucy0+cGNtX2NoYW5uZWxzW2ldLmFjdGl2ZSkgeworCQkJaWYgKCFzcmNfc2NiICYmIAorCQkJICAgIGlucy0+cGNtX2NoYW5uZWxzW2ldLnNhbXBsZV9yYXRlID09IHNhbXBsZV9yYXRlICYmCisJCQkgICAgaW5zLT5wY21fY2hhbm5lbHNbaV0ubWl4ZXJfc2NiID09IG1peGVyX3NjYikgeworCQkJCXNyY19zY2IgPSBpbnMtPnBjbV9jaGFubmVsc1tpXS5zcmNfc2NiOworCQkJCWlucy0+cGNtX2NoYW5uZWxzW2ldLnNyY19zY2ItPnJlZl9jb3VudCArKzsKKwkJCQlzcmNfaW5kZXggPSBpbnMtPnBjbV9jaGFubmVsc1tpXS5zcmNfc2xvdDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwY21faW5kZXggPT0gLTEpIHsKKwkJCXBjbV9pbmRleCA9IGk7CisJCX0KKwl9CisKKwlpZiAocGNtX2luZGV4ID09IC0xKSB7CisJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3Bvczogbm8gZnJlZSBQQ00gY2hhbm5lbFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzcmNfc2NiID09IE5VTEwpIHsKKwkJaWYgKGlucy0+bnNyY19zY2IgPj0gRFNQX01BWF9TUkNfTlIpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiB0byBtYW55IFNSQyBpbnN0YW5jZXNcbiEiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogZmluZCBhIGZyZWUgc2xvdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgRFNQX01BWF9TUkNfTlI7ICsraSkgeworCQkJaWYgKGlucy0+c3JjX3NjYl9zbG90c1tpXSA9PSAwKSB7CisJCQkJc3JjX2luZGV4ID0gaTsKKwkJCQlpbnMtPnNyY19zY2Jfc2xvdHNbaV0gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNuZF9hc3NlcnQgKHNyY19pbmRleCAhPSAtMSxyZXR1cm4gTlVMTCk7CisKKwkJLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgU1JDIFNDQiAqLworCQlpZiAobWl4ZXJfc2NiLT5zdWJfbGlzdF9wdHIgPT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJCXNyY19wYXJlbnRfc2NiID0gbWl4ZXJfc2NiOworCQkJaW5zZXJ0X3BvaW50ID0gU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQjsKKwkJfSBlbHNlIHsKKwkJCXNyY19wYXJlbnRfc2NiID0gZmluZF9uZXh0X2ZyZWVfc2NiKGNoaXAsbWl4ZXJfc2NiLT5zdWJfbGlzdF9wdHIpOworCQkJaW5zZXJ0X3BvaW50ID0gU0NCX09OX1BBUkVOVF9ORVhUX1NDQjsKKwkJfQorCisJCXNucHJpbnRmIChzY2JfbmFtZSxEU1BfTUFYX1NDQl9OQU1FLCJTcmNUYXNrX1NDQiVkIixzcmNfaW5kZXgpOworCQkKKwkJc25kX3ByaW50ZGQoICJkc3Bfc3BvczogY3JlYXRpbmcgU1JDIFwiJXNcIlxuIixzY2JfbmFtZSk7CisJCXNyY19zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9zcmNfdGFza19zY2IoY2hpcCxzY2JfbmFtZSwKKwkJCQkJCQkgc2FtcGxlX3JhdGUsCisJCQkJCQkJIHNyY19vdXRwdXRfYnVmZmVyX2FkZHJbc3JjX2luZGV4XSwKKwkJCQkJCQkgc3JjX2RlbGF5X2J1ZmZlcl9hZGRyW3NyY19pbmRleF0sCisJCQkJCQkJIC8qIDB4NDAwIC0gMHg2MDAgc291cmNlIFNDQnMgKi8KKwkJCQkJCQkgMHg0MDAgKyAoc3JjX2luZGV4ICogMHgxMCkgLAorCQkJCQkJCSBzcmNfcGFyZW50X3NjYiwKKwkJCQkJCQkgaW5zZXJ0X3BvaW50LAorCQkJCQkJCSBwYXNzX3Rocm91Z2gpOworCisJCWlmICghc3JjX3NjYikgeworCQkJc25kX3ByaW50ayAoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gY3JlYXRlIFNSQ3Rhc2tTQ0JcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBjczQ2eHhfZHNwX3NldF9zcmNfc2FtcGxlX3JhdGUoY2hpcCxzcmNfc2NiLHNhbXBsZV9yYXRlKTsgKi8KKworCQlpbnMtPm5zcmNfc2NiICsrOworCX0gCisgIAorICAKKwlzbnByaW50ZiAoc2NiX25hbWUsRFNQX01BWF9TQ0JfTkFNRSwiUENNUmVhZGVyX1NDQiVkIixwY21faW5kZXgpOworCisJc25kX3ByaW50ZGQoICJkc3Bfc3BvczogY3JlYXRpbmcgUENNIFwiJXNcIiAoJWQpXG4iLHNjYl9uYW1lLAorICAgICAgICAgICAgICAgICBwY21fY2hhbm5lbF9pZCk7CisKKwlwY21fc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX3JlYWRlcl9zY2IoY2hpcCxzY2JfbmFtZSwKKwkJCQkJCSAgIHBjbV9yZWFkZXJfYnVmZmVyX2FkZHJbcGNtX2luZGV4XSwKKwkJCQkJCSAgIC8qIDB4MjAwIC0gNDAwIFBDTXJlYWRlciBTQ0JzICovCisJCQkJCQkgICAocGNtX2luZGV4ICogMHgxMCkgKyAweDIwMCwKKwkJCQkJCSAgIHBjbV9pbmRleCwgICAgLyogdmlydHVhbCBjaGFubmVsIDAtMzEgKi8KKwkJCQkJCSAgIGh3X2RtYV9hZGRyLCAgLyogcGNtIGh3IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgLyogcGFyZW50IFNDQiBwdHIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgLyogaW5zZXJ0IHBvaW50ICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCWlmICghcGNtX3NjYikgeworCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBjcmVhdGUgUENNcmVhZGVyU0NCXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0uc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKwlpbnMtPnBjbV9jaGFubmVsc1twY21faW5kZXhdLnBjbV9yZWFkZXJfc2NiID0gcGNtX3NjYjsKKwlpbnMtPnBjbV9jaGFubmVsc1twY21faW5kZXhdLnNyY19zY2IgPSBzcmNfc2NiOworCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0udW5saW5rZWQgPSAxOworCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0ucHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0uc3JjX3Nsb3QgPSBzcmNfaW5kZXg7CisJaW5zLT5wY21fY2hhbm5lbHNbcGNtX2luZGV4XS5hY3RpdmUgPSAxOworCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0ucGNtX3Nsb3QgPSBwY21faW5kZXg7CisJaW5zLT5wY21fY2hhbm5lbHNbcGNtX2luZGV4XS5taXhlcl9zY2IgPSBtaXhlcl9zY2I7CisJaW5zLT5ucGNtX2NoYW5uZWxzICsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKGlucy0+cGNtX2NoYW5uZWxzICsgcGNtX2luZGV4KTsKK30KKworaW50IGNzNDZ4eF9kc3BfcGNtX2NoYW5uZWxfc2V0X3BlcmlvZCAoY3M0Nnh4X3QgKiBjaGlwLAorCQkJCSAgICAgICBwY21fY2hhbm5lbF9kZXNjcmlwdG9yX3QgKiBwY21fY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHBlcmlvZF9zaXplKQoreworCXUzMiB0ZW1wID0gc25kX2NzNDZ4eF9wZWVrIChjaGlwLHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+YWRkcmVzcyA8PCAyKTsKKwl0ZW1wICY9IH5ETUFfUlFfQzFfU09VUkNFX1NJWkVfTUFTSzsKKworCXN3aXRjaCAocGVyaW9kX3NpemUpIHsKKwljYXNlIDIwNDg6CisJCXRlbXAgfD0gRE1BX1JRX0MxX1NPVVJDRV9NT0QxMDI0OworCQlicmVhazsKKwljYXNlIDEwMjQ6CisJCXRlbXAgfD0gRE1BX1JRX0MxX1NPVVJDRV9NT0Q1MTI7CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQl0ZW1wIHw9IERNQV9SUV9DMV9TT1VSQ0VfTU9EMjU2OworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJdGVtcCB8PSBETUFfUlFfQzFfU09VUkNFX01PRDEyODsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CisJCXRlbXAgfD0gRE1BX1JRX0MxX1NPVVJDRV9NT0Q2NDsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJdGVtcCB8PSBETUFfUlFfQzFfU09VUkNFX01PRDMyOworCQlicmVhazsJCSAgICAgIAorCWNhc2UgMzI6CisJCXRlbXAgfD0gRE1BX1JRX0MxX1NPVVJDRV9NT0QxNjsKKwkJYnJlYWs7IAorCWRlZmF1bHQ6CisJCXNuZF9wcmludGRkICgicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9jczQ2eHhfcG9rZSAoY2hpcCxwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgPDwgMix0ZW1wKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3M0Nnh4X2RzcF9wY21fb3N0cmVhbV9zZXRfcGVyaW9kIChjczQ2eHhfdCAqIGNoaXAsCisJCQkJICAgICAgIGludCBwZXJpb2Rfc2l6ZSkKK3sKKwl1MzIgdGVtcCA9IHNuZF9jczQ2eHhfcGVlayAoY2hpcCxXUklURUJBQ0tfU0NCX0FERFIgPDwgMik7CisJdGVtcCAmPSB+RE1BX1JRX0MxX0RFU1RfU0laRV9NQVNLOworCisJc3dpdGNoIChwZXJpb2Rfc2l6ZSkgeworCWNhc2UgMjA0ODoKKwkJdGVtcCB8PSBETUFfUlFfQzFfREVTVF9NT0QxMDI0OworCQlicmVhazsKKwljYXNlIDEwMjQ6CisJCXRlbXAgfD0gRE1BX1JRX0MxX0RFU1RfTU9ENTEyOworCQlicmVhazsKKwljYXNlIDUxMjoKKwkJdGVtcCB8PSBETUFfUlFfQzFfREVTVF9NT0QyNTY7CisJCWJyZWFrOworCWNhc2UgMjU2OgorCQl0ZW1wIHw9IERNQV9SUV9DMV9ERVNUX01PRDEyODsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CisJCXRlbXAgfD0gRE1BX1JRX0MxX0RFU1RfTU9ENjQ7CisJCWJyZWFrOworCWNhc2UgNjQ6CisJCXRlbXAgfD0gRE1BX1JRX0MxX0RFU1RfTU9EMzI7CisJCWJyZWFrOwkJICAgICAgCisJY2FzZSAzMjoKKwkJdGVtcCB8PSBETUFfUlFfQzFfREVTVF9NT0QxNjsKKwkJYnJlYWs7IAorCWRlZmF1bHQ6CisJCXNuZF9wcmludGRkICgicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9jczQ2eHhfcG9rZSAoY2hpcCxXUklURUJBQ0tfU0NCX0FERFIgPDwgMix0ZW1wKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNzNDZ4eF9kc3BfZGVzdHJveV9wY21fY2hhbm5lbCAoY3M0Nnh4X3QgKiBjaGlwLHBjbV9jaGFubmVsX2Rlc2NyaXB0b3JfdCAqIHBjbV9jaGFubmVsKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc25kX2Fzc2VydChwY21fY2hhbm5lbC0+YWN0aXZlLCByZXR1cm4gKTsKKwlzbmRfYXNzZXJ0KGlucy0+bnBjbV9jaGFubmVscyA+IDAsIHJldHVybiApOworCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwtPnNyY19zY2ItPnJlZl9jb3VudCA+IDAsIHJldHVybiApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcGNtX2NoYW5uZWwtPnVubGlua2VkID0gMTsKKwlwY21fY2hhbm5lbC0+YWN0aXZlID0gMDsKKwlwY21fY2hhbm5lbC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlwY21fY2hhbm5lbC0+c3JjX3NjYi0+cmVmX2NvdW50IC0tOworCWlucy0+bnBjbV9jaGFubmVscyAtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCisJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiKGNoaXAscGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiKTsKKworCWlmICghcGNtX2NoYW5uZWwtPnNyY19zY2ItPnJlZl9jb3VudCkgeworCQljczQ2eHhfZHNwX3JlbW92ZV9zY2IoY2hpcCxwY21fY2hhbm5lbC0+c3JjX3NjYik7CisKKwkJc25kX2Fzc2VydCAocGNtX2NoYW5uZWwtPnNyY19zbG90ID49IDAgJiYgcGNtX2NoYW5uZWwtPnNyY19zbG90IDw9IERTUF9NQVhfU1JDX05SLAorCQkJICAgIHJldHVybiApOworCisJCWlucy0+c3JjX3NjYl9zbG90c1twY21fY2hhbm5lbC0+c3JjX3Nsb3RdID0gMDsKKwkJaW5zLT5uc3JjX3NjYiAtLTsKKwl9Cit9CisKK2ludCBjczQ2eHhfZHNwX3BjbV91bmxpbmsgKGNzNDZ4eF90ICogY2hpcCxwY21fY2hhbm5lbF9kZXNjcmlwdG9yX3QgKiBwY21fY2hhbm5lbCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwtPmFjdGl2ZSxyZXR1cm4gLUVJTyk7CisJc25kX2Fzc2VydChpbnMtPm5wY21fY2hhbm5lbHMgPiAwLHJldHVybiAtRUlPKTsKKworCXNwaW5fbG9jaygmcGNtX2NoYW5uZWwtPnNyY19zY2ItPmxvY2spOworCisJaWYgKHBjbV9jaGFubmVsLT51bmxpbmtlZCkgeworCQlzcGluX3VubG9jaygmcGNtX2NoYW5uZWwtPnNyY19zY2ItPmxvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlwY21fY2hhbm5lbC0+dW5saW5rZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlfZHNwX3VubGlua19zY2IgKGNoaXAscGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiKTsKKworCXNwaW5fdW5sb2NrKCZwY21fY2hhbm5lbC0+c3JjX3NjYi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX3BjbV9saW5rIChjczQ2eHhfdCAqIGNoaXAscGNtX2NoYW5uZWxfZGVzY3JpcHRvcl90ICogcGNtX2NoYW5uZWwpCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50X3NjYjsKKwlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHNyY19zY2IgPSBwY21fY2hhbm5lbC0+c3JjX3NjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZwY21fY2hhbm5lbC0+c3JjX3NjYi0+bG9jayk7CisKKwlpZiAocGNtX2NoYW5uZWwtPnVubGlua2VkID09IDApIHsKKwkJc3Bpbl91bmxvY2soJnBjbV9jaGFubmVsLT5zcmNfc2NiLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGFyZW50X3NjYiA9IHNyY19zY2I7CisKKwlpZiAoc3JjX3NjYi0+c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxfc2NiKSB7CisJCXNyY19zY2ItPnN1Yl9saXN0X3B0ci0+cGFyZW50X3NjYl9wdHIgPSBwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2I7CisJCXBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+bmV4dF9zY2JfcHRyID0gc3JjX3NjYi0+c3ViX2xpc3RfcHRyOworCX0KKworCXNyY19zY2ItPnN1Yl9saXN0X3B0ciA9IHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYjsKKworCXNuZF9hc3NlcnQgKHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIgPT0gTlVMTCwgOyApOworCXBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIgPSBwYXJlbnRfc2NiOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkvKiB1cGRhdGUgU0NCIGVudHJ5IGluIERTUCBSQU0gKi8KKwljczQ2eHhfZHNwX3Nwb3NfdXBkYXRlX3NjYihjaGlwLHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYik7CisKKwkvKiB1cGRhdGUgcGFyZW50IFNDQiBlbnRyeSAqLworCWNzNDZ4eF9kc3Bfc3Bvc191cGRhdGVfc2NiKGNoaXAscGFyZW50X3NjYik7CisKKwlwY21fY2hhbm5lbC0+dW5saW5rZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlzcGluX3VubG9jaygmcGNtX2NoYW5uZWwtPnNyY19zY2ItPmxvY2spOworCXJldHVybiAwOworfQorCitkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIGNzNDZ4eF9hZGRfcmVjb3JkX3NvdXJjZSAoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHIsY2hhciAqIHNjYl9uYW1lKQoreworICAJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50OworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGNtX2lucHV0OworCWludCBpbnNlcnRfcG9pbnQ7CisKKwlzbmRfYXNzZXJ0IChpbnMtPnJlY29yZF9taXhlcl9zY2IgIT0gTlVMTCxyZXR1cm4gTlVMTCk7CisKKwlpZiAoaW5zLT5yZWNvcmRfbWl4ZXJfc2NiLT5zdWJfbGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJcGFyZW50ID0gZmluZF9uZXh0X2ZyZWVfc2NiIChjaGlwLGlucy0+cmVjb3JkX21peGVyX3NjYi0+c3ViX2xpc3RfcHRyKTsKKwkJaW5zZXJ0X3BvaW50ID0gU0NCX09OX1BBUkVOVF9ORVhUX1NDQjsKKwl9IGVsc2UgeworCQlwYXJlbnQgPSBpbnMtPnJlY29yZF9taXhlcl9zY2I7CisJCWluc2VydF9wb2ludCA9IFNDQl9PTl9QQVJFTlRfU1VCTElTVF9TQ0I7CisJfQorCisJcGNtX2lucHV0ID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX3NlcmlhbF9pbnB1dF9zY2IoY2hpcCxzY2JfbmFtZSxhZGRyLAorCQkJCQkJCSAgIHNvdXJjZSwgcGFyZW50LAorCQkJCQkJCSAgIGluc2VydF9wb2ludCk7CisKKwlyZXR1cm4gcGNtX2lucHV0OworfQorCitpbnQgY3M0Nnh4X3NyY191bmxpbmsoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzcmMpCit7CisJc25kX2Fzc2VydCAoc3JjLT5wYXJlbnRfc2NiX3B0ciAhPSBOVUxMLCAgcmV0dXJuIC1FSU5WQUwgKTsKKworCS8qIG11dGUgU0NCICovCisJY3M0Nnh4X2RzcF9zY2Jfc2V0X3ZvbHVtZSAoY2hpcCxzcmMsMCwwKTsKKworCV9kc3BfdW5saW5rX3NjYiAoY2hpcCxzcmMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfc3JjX2xpbmsoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzcmMpCit7CisJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOworCWRzcF9zY2JfZGVzY3JpcHRvcl90ICogcGFyZW50X3NjYjsKKworCXNuZF9hc3NlcnQgKHNyYy0+cGFyZW50X3NjYl9wdHIgPT0gTlVMTCwgICByZXR1cm4gLUVJTlZBTCApOworCXNuZF9hc3NlcnQoaW5zLT5tYXN0ZXJfbWl4X3NjYiAhPU5VTEwsICAgcmV0dXJuIC1FSU5WQUwgKTsKKworCWlmIChpbnMtPm1hc3Rlcl9taXhfc2NiLT5zdWJfbGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKwkJcGFyZW50X3NjYiA9IGZpbmRfbmV4dF9mcmVlX3NjYiAoY2hpcCxpbnMtPm1hc3Rlcl9taXhfc2NiLT5zdWJfbGlzdF9wdHIpOworCQlwYXJlbnRfc2NiLT5uZXh0X3NjYl9wdHIgPSBzcmM7CisJfSBlbHNlIHsKKwkJcGFyZW50X3NjYiA9IGlucy0+bWFzdGVyX21peF9zY2I7CisJCXBhcmVudF9zY2ItPnN1Yl9saXN0X3B0ciA9IHNyYzsKKwl9CisKKwlzcmMtPnBhcmVudF9zY2JfcHRyID0gcGFyZW50X3NjYjsKKworCS8qIHVwZGF0ZSBlbnRyeSBpbiBEU1AgUkFNICovCisJY3M0Nnh4X2RzcF9zcG9zX3VwZGF0ZV9zY2IoY2hpcCxwYXJlbnRfc2NiKTsKKyAgCisJcmV0dXJuIDA7Cit9CisKK2ludCBjczQ2eHhfZHNwX2VuYWJsZV9zcGRpZl9vdXQgKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCWlmICggISAoaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICYgRFNQX1NQRElGX1NUQVRVU19IV19FTkFCTEVEKSApIHsKKwkJY3M0Nnh4X2RzcF9lbmFibGVfc3BkaWZfaHcgKGNoaXApOworCX0KKworCS8qIGRvbnQgdG91Y2ggYW55dGhpbmcgaWYgU1BESUYgaXMgb3BlbiAqLworCWlmICggaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICYgRFNQX1NQRElGX1NUQVRVU19QTEFZQkFDS19PUEVOKSB7CisJCS8qIHdoZW4gY3M0Nnh4X2llYzk1OF9wb3N0X2Nsb3NlKC4uLikgaXMgY2FsbGVkIGl0CisJCSAgIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIG5lY2Vzc2FyeSBkZXBlbmRpbmcgb24KKwkJICAgdGhpcyBiaXQgKi8KKwkJaW5zLT5zcGRpZl9zdGF0dXNfb3V0IHw9IERTUF9TUERJRl9TVEFUVVNfT1VUUFVUX0VOQUJMRUQ7CisKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2IgPT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQgKGlucy0+bWFzdGVyX21peF9zY2ItPm5leHRfc2NiX3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiwgcmV0dXJuIC1FSU5WQUwpOworCisJLyogcmVzZXQgb3V0cHV0IHNub29wZXIgc2FtcGxlIGJ1ZmZlciBwb2ludGVyICovCisJc25kX2NzNDZ4eF9wb2tlIChjaGlwLCAoaW5zLT5yZWZfc25vb3Bfc2NiLT5hZGRyZXNzICsgMikgPDwgMiwKKwkJCSAoT1VUUFVUX1NOT09QX0JVRkZFUiArIDB4MTApIDw8IDB4MTAgKTsKKwkKKwkvKiBUaGUgYXN5bmNoLiB0cmFuc2ZlciB0YXNrICovCisJaW5zLT5hc3luY2hfdHhfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfYXN5bmNoX2ZnX3R4X3NjYihjaGlwLCJBc3luY2hGR1R4U0NCIixBU1lOQ1RYX1NDQl9BRERSLAorCQkJCQkJCQlTUERJRk9fU0NCX0lOU1QsCisJCQkJCQkJCVNQRElGT19JUF9PVVRQVVRfQlVGRkVSMSwKKwkJCQkJCQkJaW5zLT5tYXN0ZXJfbWl4X3NjYiwKKwkJCQkJCQkJU0NCX09OX1BBUkVOVF9ORVhUX1NDQik7CisJaWYgKCFpbnMtPmFzeW5jaF90eF9zY2IpIHJldHVybiAtRU5PTUVNOworCisJaW5zLT5zcGRpZl9wY21faW5wdXRfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX3NlcmlhbF9pbnB1dF9zY2IoY2hpcCwiUENNU2VyaWFsSW5wdXRfSUkiLAorCQkJCQkJCQkJICBQQ01TRVJJQUxJTklJX1NDQl9BRERSLAorCQkJCQkJCQkJICBpbnMtPnJlZl9zbm9vcF9zY2IsCisJCQkJCQkJCQkgIGlucy0+YXN5bmNoX3R4X3NjYiwKKwkJCQkJCQkJCSAgU0NCX09OX1BBUkVOVF9TVUJMSVNUX1NDQik7CisgIAorCQorCWlmICghaW5zLT5zcGRpZl9wY21faW5wdXRfc2NiKSByZXR1cm4gLUVOT01FTTsKKworCS8qIG1vbml0b3Igc3RhdGUgKi8KKwlpbnMtPnNwZGlmX3N0YXR1c19vdXQgfD0gRFNQX1NQRElGX1NUQVRVU19PVVRQVVRfRU5BQkxFRDsKKworCXJldHVybiAwOworfQorCitpbnQgIGNzNDZ4eF9kc3BfZGlzYWJsZV9zcGRpZl9vdXQgKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCS8qIGRvbnQgdG91Y2ggYW55dGhpbmcgaWYgU1BESUYgaXMgb3BlbiAqLworCWlmICggaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICYgRFNQX1NQRElGX1NUQVRVU19QTEFZQkFDS19PUEVOKSB7CisJCWlucy0+c3BkaWZfc3RhdHVzX291dCAmPSB+RFNQX1NQRElGX1NUQVRVU19PVVRQVVRfRU5BQkxFRDsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBjaGVjayBpbnRlZ3JldHkgKi8KKwlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2IgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQgKGlucy0+c3BkaWZfcGNtX2lucHV0X3NjYiAhPSBOVUxMLHJldHVybiAtRUlOVkFMKTsKKwlzbmRfYXNzZXJ0IChpbnMtPm1hc3Rlcl9taXhfc2NiLT5uZXh0X3NjYl9wdHIgPT0gaW5zLT5hc3luY2hfdHhfc2NiLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfdHhfc2NiLT5wYXJlbnRfc2NiX3B0ciA9PSBpbnMtPm1hc3Rlcl9taXhfc2NiLCByZXR1cm4gLUVJTlZBTCk7CisKKwljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAsaW5zLT5zcGRpZl9wY21faW5wdXRfc2NiKTsKKwljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAsaW5zLT5hc3luY2hfdHhfc2NiKTsKKworCWlucy0+c3BkaWZfcGNtX2lucHV0X3NjYiA9IE5VTEw7CisJaW5zLT5hc3luY2hfdHhfc2NiID0gTlVMTDsKKworCS8qIGNsZWFyIGJ1ZmZlciB0byBwcmV2ZW50IGFueSB1bmRlc2lyZWQgbm9pc2UgKi8KKwlfZHNwX2NsZWFyX3NhbXBsZV9idWZmZXIoY2hpcCxTUERJRk9fSVBfT1VUUFVUX0JVRkZFUjEsMjU2KTsKKworCS8qIG1vbml0b3Igc3RhdGUgKi8KKwlpbnMtPnNwZGlmX3N0YXR1c19vdXQgICY9IH5EU1BfU1BESUZfU1RBVFVTX09VVFBVVF9FTkFCTEVEOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IGNzNDZ4eF9pZWM5NThfcHJlX29wZW4gKGNzNDZ4eF90ICpjaGlwKQoreworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKKworCWlmICggaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICYgRFNQX1NQRElGX1NUQVRVU19PVVRQVVRfRU5BQkxFRCApIHsKKwkJLyogcmVtb3ZlIEFzeW5jaEZHVHhTQ0IgYW5kIGFuZCBQQ01TZXJpYWxJbnB1dF9JSSAqLworCQljczQ2eHhfZHNwX2Rpc2FibGVfc3BkaWZfb3V0IChjaGlwKTsKKworCQkvKiBzYXZlIHN0YXRlICovCisJCWlucy0+c3BkaWZfc3RhdHVzX291dCB8PSBEU1BfU1BESUZfU1RBVFVTX09VVFBVVF9FTkFCTEVEOworCX0KKwkKKwkvKiBpZiBub3QgZW5hYmxlZCBhbHJlYWR5ICovCisJaWYgKCAhKGlucy0+c3BkaWZfc3RhdHVzX291dCAmIERTUF9TUERJRl9TVEFUVVNfSFdfRU5BQkxFRCkgKSB7CisJCWNzNDZ4eF9kc3BfZW5hYmxlX3NwZGlmX2h3IChjaGlwKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGFzeW5jaC4gdHJhbnNmZXIgdGFzayAgZm9yIHBsYXliYWNrICovCisJaW5zLT5hc3luY2hfdHhfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfYXN5bmNoX2ZnX3R4X3NjYihjaGlwLCJBc3luY2hGR1R4U0NCIixBU1lOQ1RYX1NDQl9BRERSLAorCQkJCQkJCQlTUERJRk9fU0NCX0lOU1QsCisJCQkJCQkJCVNQRElGT19JUF9PVVRQVVRfQlVGRkVSMSwKKwkJCQkJCQkJaW5zLT5tYXN0ZXJfbWl4X3NjYiwKKwkJCQkJCQkJU0NCX09OX1BBUkVOVF9ORVhUX1NDQik7CisKKworCS8qIHNldCBzcGRpZiBjaGFubmVsIHN0YXR1cyB2YWx1ZSBmb3Igc3RyZWFtaW5nICovCisJY3M0Nnh4X3Bva2VfdmlhX2RzcCAoY2hpcCxTUF9TUERPVVRfQ1NVViwgaW5zLT5zcGRpZl9jc3V2X3N0cmVhbSk7CisKKwlpbnMtPnNwZGlmX3N0YXR1c19vdXQgIHw9IERTUF9TUERJRl9TVEFUVVNfUExBWUJBQ0tfT1BFTjsKKworCXJldHVybiAwOworfQorCitpbnQgY3M0Nnh4X2llYzk1OF9wb3N0X2Nsb3NlIChjczQ2eHhfdCAqY2hpcCkKK3sKKwlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisKKwlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2IgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCisJaW5zLT5zcGRpZl9zdGF0dXNfb3V0ICAmPSB+RFNQX1NQRElGX1NUQVRVU19QTEFZQkFDS19PUEVOOworCisJLyogcmVzdG9yZSBzZXR0aW5ncyAqLworCWNzNDZ4eF9wb2tlX3ZpYV9kc3AgKGNoaXAsU1BfU1BET1VUX0NTVVYsIGlucy0+c3BkaWZfY3N1dl9kZWZhdWx0KTsKKwkKKwkvKiBkZWFsbG9jYXRlIHN0dWZmICovCisJaWYgKGlucy0+c3BkaWZfcGNtX2lucHV0X3NjYiAhPSBOVUxMKSB7CisJCWNzNDZ4eF9kc3BfcmVtb3ZlX3NjYiAoY2hpcCxpbnMtPnNwZGlmX3BjbV9pbnB1dF9zY2IpOworCQlpbnMtPnNwZGlmX3BjbV9pbnB1dF9zY2IgPSBOVUxMOworCX0KKworCWNzNDZ4eF9kc3BfcmVtb3ZlX3NjYiAoY2hpcCxpbnMtPmFzeW5jaF90eF9zY2IpOworCWlucy0+YXN5bmNoX3R4X3NjYiA9IE5VTEw7CisKKwkvKiBjbGVhciBidWZmZXIgdG8gcHJldmVudCBhbnkgdW5kZXNpcmVkIG5vaXNlICovCisJX2RzcF9jbGVhcl9zYW1wbGVfYnVmZmVyKGNoaXAsU1BESUZPX0lQX09VVFBVVF9CVUZGRVIxLDI1Nik7CisKKwkvKiByZXN0b3JlIHN0YXRlICovCisJaWYgKCBpbnMtPnNwZGlmX3N0YXR1c19vdXQgJiBEU1BfU1BESUZfU1RBVFVTX09VVFBVVF9FTkFCTEVEICkgeworCQljczQ2eHhfZHNwX2VuYWJsZV9zcGRpZl9vdXQgKGNoaXApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2M0NjMwLmggYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djNDYzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWQwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djNDYzMC5oCkBAIC0wLDAgKzEsMzIwIEBACisvKiBnZW5lcmF0ZWQgZnJvbSBjd2M0NjMwLm9zcCBETyBOT1QgTU9ESUZZICovCisKKyNpZm5kZWYgX19IRUFERVJfY3djNDYzMF9IX18KKyNkZWZpbmUgX19IRUFERVJfY3djNDYzMF9IX18KKworc3RhdGljIHN5bWJvbF9lbnRyeV90IGN3YzQ2MzBfc3ltYm9sc1tdID0geworICB7IDB4MDAwMCwgIkJFR0lOQUREUkVTUyIsMHgwMCB9LAorICB7IDB4ODAwMCwgIkVYRUNDSElMRCIsMHgwMyB9LAorICB7IDB4ODAwMSwgIkVYRUNDSElMRF85OCIsMHgwMyB9LAorICB7IDB4ODAwMywgIkVYRUNDSElMRF9QVVNIMUlORCIsMHgwMyB9LAorICB7IDB4ODAwOCwgIkVYRUNTSUJMSU5HIiwweDAzIH0sCisgIHsgMHg4MDBhLCAiRVhFQ1NJQkxJTkdfMjk4IiwweDAzIH0sCisgIHsgMHg4MDBiLCAiRVhFQ1NJQkxJTkdfMklORDEiLDB4MDMgfSwKKyAgeyAweDgwMTAsICJUSU1JTkdNQVNURVIiLDB4MDMgfSwKKyAgeyAweDgwNGYsICJTMTZfQ09ERUNJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgwNWUsICJQQ01TRVJJQUxJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgwNmQsICJTMTZfTUlYX1RPX09TVFJFQU0iLDB4MDMgfSwKKyAgeyAweDgwOWEsICJTMTZfTUlYIiwweDAzIH0sCisgIHsgMHg4MGJiLCAiUzE2X1VQU1JDIiwweDAzIH0sCisgIHsgMHg4MTNiLCAiTUlYM19FWFAiLDB4MDMgfSwKKyAgeyAweDgxNjQsICJERUNJTUFURUJZUE9XMiIsMHgwMyB9LAorICB7IDB4ODE5NywgIlZBUklERUNJTUFURSIsMHgwMyB9LAorICB7IDB4ODFmMiwgIl8zRElOUFVUVEFTSyIsMHgwMyB9LAorICB7IDB4ODIwYSwgIl8zRFBSTEdDSU5QVEFTSyIsMHgwMyB9LAorICB7IDB4ODIyNywgIl8zRFNURVJFT0lOUFVUVEFTSyIsMHgwMyB9LAorICB7IDB4ODI0MiwgIl8zRE9VVFBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyYzQsICJIUlRGX01PUlBIX1RBU0siLDB4MDMgfSwKKyAgeyAweDgyYzYsICJXQUlUNERBVEEiLDB4MDMgfSwKKyAgeyAweDgyZmEsICJQUk9MT0dJQyIsMHgwMyB9LAorICB7IDB4ODQ5NiwgIkRFQ09SUkVMQVRPUiIsMHgwMyB9LAorICB7IDB4ODRhNCwgIlNURVJFTzJNT05PIiwweDAzIH0sCisgIHsgMHgwMDcwLCAiU1BPU0NCIiwweDAyIH0sCisgIHsgMHgwMTA3LCAiVEFTS1RSRUVUSFJFQUQiLDB4MDMgfSwKKyAgeyAweDAxM2MsICJUQVNLVFJFRUhFQURFUkNPREUiLDB4MDMgfSwKKyAgeyAweDAxNDUsICJGR1RBU0tUUkVFSEVBREVSQ09ERSIsMHgwMyB9LAorICB7IDB4MDE2OSwgIk5VTExBTEdPUklUSE0iLDB4MDMgfSwKKyAgeyAweDAxNmQsICJIRkdFWEVDQ0hJTEQiLDB4MDMgfSwKKyAgeyAweDAxNmUsICJIRkdFWEVDQ0hJTERfOTgiLDB4MDMgfSwKKyAgeyAweDAxNzAsICJIRkdFWEVDQ0hJTERfUFVTSDFJTkQiLDB4MDMgfSwKKyAgeyAweDAxNzMsICJIRkdFWEVDU0lCTElORyIsMHgwMyB9LAorICB7IDB4MDE3NSwgIkhGR0VYRUNTSUJMSU5HXzI5OCIsMHgwMyB9LAorICB7IDB4MDE3NiwgIkhGR0VYRUNTSUJMSU5HXzJJTkQxIiwweDAzIH0sCisgIHsgMHgwMTc5LCAiUzE2X0NPREVDT1VUUFVUVEFTSyIsMHgwMyB9LAorICB7IDB4MDE5NCwgIiNDT0RFX0VORCIsMHgwMCB9LAorfTsgLyogY3djNDYzMCBzeW1ib2xzICovCisKK3N0YXRpYyB1MzIgY3djNDYzMF9jb2RlW10gPSB7CisvKiBCRUdJTkFERFJFU1MgKi8KKy8qIDAwMDAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMDIgKi8gMHgwMDAwMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMDQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMDYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMDggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMEEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMEMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMEUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMTIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMTYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMUEgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMUMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMUUgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMjAgKi8gMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwOWM3MzAsMHgwMDAwMTAwMywKKy8qIDAwMjIgKi8gMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKy8qIDAwMjQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMjYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMjggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMkEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMkMgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMkUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzAgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMzIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMzYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwM0EgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwM0MgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwM0UgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwNDAgKi8gMHgwMDAxYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKKy8qIDAwNDIgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDQgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDYgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwZjYxOWMsMHgwMDAwMTAwMywKKy8qIDAwNEEgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKKy8qIDAwNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNEUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTAgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTIgKi8gMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTQgKi8gMHgwMDBlZTE5YywweDAwMDAxMDAzLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNTYgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNUEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3M2MsMHgwMDAwMTAwMCwKKy8qIDAwNUMgKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwZTY3OWUsMHgwMDAwMTAwMywKKy8qIDAwNUUgKi8gMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKKy8qIDAwNjAgKi8gMHgwMDA4N2ZjMSwweDAwMGMzYmUwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNjIgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjYgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE3MzAsMHgwMDAwMTAwMywKKy8qIDAwNjggKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNkEgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNkUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAwNzAgKi8gMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKKy8qIDAwNzIgKi8gMHgwMDA0YTczMCwweDAwMDAxMDAzLDB4MDAwMDBmNDEsMHgwMDA5NzE0MCwKKy8qIDAwNzQgKi8gMHgwMDAwYTg0MSwweDAwMDliMjQwLDB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwKKy8qIDAwNzYgKi8gMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKKy8qIDAwNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMWJmMDUsMHgwMDAzZmM0MCwKKy8qIDAwN0EgKi8gMHgwMDAwMjcyNSwweDAwMGFhNDAwLDB4MDAwMTM3MDUsMHgwMDA5M2EwMCwKKy8qIDAwN0MgKi8gMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMmVmOGEsMHgwMDAwMDAwMCwKKy8qIDAwN0UgKi8gMHgwMDA0MDYzMCwweDAwMDAxMDA0LDB4MDAwNGVmMGEsMHgwMDBlYjc4NSwKKy8qIDAwODAgKi8gMHgwMDAzZmM4YSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjNzBlMCwKKy8qIDAwODIgKi8gMHgwMDA3ZDE4MiwweDAwMDJjNjQwLDB4MDAwMDg2MzAsMHgwMDAwMTAwNCwKKy8qIDAwODQgKi8gMHgwMDA3OTliOCwweDAwMDJjNmMwLDB4MDAwMzE3MDUsMHgwMDA5MjI0MCwKKy8qIDAwODYgKi8gMHgwMDAzOWYwNSwweDAwMDkzMmMwLDB4MDAwMzUyMGEsMHgwMDAwMDAwMCwKKy8qIDAwODggKi8gMHgwMDA3MDczMSwweDAwMDAxMDBiLDB4MDAwMTA3MDUsMHgwMDBiMjBjMCwKKy8qIDAwOEEgKi8gMHgwMDAwMDAwMCwweDAwMGViYTQ0LDB4MDAwMzIxMDgsMHgwMDBjNjBjNCwKKy8qIDAwOEMgKi8gMHgwMDA2NTIwOCwweDAwMGMyOTE3LDB4MDAwNDg2YjAsMHgwMDAwMTAwNywKKy8qIDAwOEUgKi8gMHgwMDAxMmYwNSwweDAwMDM2ODgwLDB4MDAwMjgxOGUsMHgwMDBjMDAwMCwKKy8qIDAwOTAgKi8gMHgwMDA0NDEwYSwweDAwMDAwMDAwLDB4MDAwNDg2MzAsMHgwMDAwMTAwNywKKy8qIDAwOTIgKi8gMHgwMDAyOTcwNSwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOTQgKi8gMHgwMDAwM2ZjMSwweDAwMDNmYzQwLDB4MDAwMDM3YzEsMHgwMDA5MWI0MCwKKy8qIDAwOTYgKi8gMHgwMDAwM2ZjMSwweDAwMDkxMWMwLDB4MDAwMDM3YzEsMHgwMDA5NTdjMCwKKy8qIDAwOTggKi8gMHgwMDAwM2ZjMSwweDAwMDk1MWMwLDB4MDAwMDM3YzEsMHgwMDAwMDAwMCwKKy8qIDAwOUEgKi8gMHgwMDAwM2ZjMSwweDAwMDk5MWMwLDB4MDAwMDM3YzEsMHgwMDAwMDAwMCwKKy8qIDAwOUMgKi8gMHgwMDAwM2ZjMSwweDAwMDlkMWMwLDB4MDAwMDM3YzEsMHgwMDAwMDAwMCwKKy8qIDAwOUUgKi8gMHgwMDAxY2NjMSwweDAwMDkxNWMwLDB4MDAwMWM0NDEsMHgwMDA5ZDgwMCwKKy8qIDAwQTAgKi8gMHgwMDA5Y2RjMSwweDAwMDkxMjQwLDB4MDAwMWM1NDEsMHgwMDA5MWQwMCwKKy8qIDAwQTIgKi8gMHgwMDA5Y2ZjMSwweDAwMDk1MjQwLDB4MDAwMWM3NDEsMHgwMDA5NWM4MCwKKy8qIDAwQTQgKi8gMHgwMDBlOGNhOSwweDAwMDk5MjQwLDB4MDAwZTg1YWQsMHgwMDA5NTY0MCwKKy8qIDAwQTYgKi8gMHgwMDA2OWNhOSwweDAwMDk5ZDgwLDB4MDAwZTk1MmQsMHgwMDA5OTY0MCwKKy8qIDAwQTggKi8gMHgwMDBlYWNhOSwweDAwMDlkNmMwLDB4MDAwZWE1YWQsMHgwMDA5MWE0MCwKKy8qIDAwQUEgKi8gMHgwMDA2YmNhOSwweDAwMDlkZTgwLDB4MDAwZWI1MmQsMHgwMDA5NWE0MCwKKy8qIDAwQUMgKi8gMHgwMDBlY2NhOSwweDAwMDk5YWMwLDB4MDAwZWM1YWQsMHgwMDA5ZGE0MCwKKy8qIDAwQUUgKi8gMHgwMDBlZGNhOSwweDAwMDlkMzAwLDB4MDAwYTZlMGEsMHgwMDAwMTAwMCwKKy8qIDAwQjAgKi8gMHgwMDBlZDUyZCwweDAwMDkxZTQwLDB4MDAwZWVjYTksMHgwMDA5NWVjMCwKKy8qIDAwQjIgKi8gMHgwMDBlZTVhZCwweDAwMDk5ZTQwLDB4MDAwNmZjYTksMHgwMDAwMjUwMCwKKy8qIDAwQjQgKi8gMHgwMDBmYjIwOCwweDAwMGM1OWEwLDB4MDAwZWY1MmQsMHgwMDA5ZGU0MCwKKy8qIDAwQjYgKi8gMHgwMDA2OGNhOSwweDAwMDkxMmMxLDB4MDAwNjgzYWQsMHgwMDA5NTI0MSwKKy8qIDAwQjggKi8gMHgwMDAyMGYwNSwweDAwMDk5MWMxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQkEgKi8gMHgwMDA4NmY4OCwweDAwMDAxMDAwLDB4MDAwOWNmODEsMHgwMDBiNTM0MCwKKy8qIDAwQkMgKi8gMHgwMDA5YzcwMSwweDAwMGI5MmMwLDB4MDAwOWRlODEsMHgwMDBiZDMwMCwKKy8qIDAwQkUgKi8gMHgwMDA5ZDYwMSwweDAwMGIxNzAwLDB4MDAwMWZkODEsMHgwMDBiOWQ4MCwKKy8qIDAwQzAgKi8gMHgwMDA5ZjUwMSwweDAwMGI1N2MwLDB4MDAwYTBmODEsMHgwMDBiZDc0MCwKKy8qIDAwQzIgKi8gMHgwMDAyMDcwMSwweDAwMGI1YzgwLDB4MDAwYTE2ODEsMHgwMDBiOTdjMCwKKy8qIDAwQzQgKi8gMHgwMDAyMTYwMSwweDAwMDAyNTAwLDB4MDAwYTA3MDEsMHgwMDBiOWI0MCwKKy8qIDAwQzYgKi8gMHgwMDBhMGY4MSwweDAwMGIxYmMwLDB4MDAwMjE2ODEsMHgwMDAwMmQwMCwKKy8qIDAwQzggKi8gMHgwMDAyMGY4MSwweDAwMGJkODAwLDB4MDAwYTA3MDEsMHgwMDBiNWJjMCwKKy8qIDAwQ0EgKi8gMHgwMDAyMTYwMSwweDAwMDAzNTAwLDB4MDAwYTBmODEsMHgwMDBiNWY0MCwKKy8qIDAwQ0MgKi8gMHgwMDBhMDcwMSwweDAwMGJkYmMwLDB4MDAwMjE2ODEsMHgwMDAwM2QwMCwKKy8qIDAwQ0UgKi8gMHgwMDAyMGY4MSwweDAwMGIxZDAwLDB4MDAwYTA3MDEsMHgwMDBiMWZjMCwKKy8qIDAwRDAgKi8gMHgwMDAyMTYwMSwweDAwMDIwNTAwLDB4MDAwMjBmODEsMHgwMDBiMTM0MSwKKy8qIDAwRDIgKi8gMHgwMDBhMDcwMSwweDAwMGI5ZmMwLDB4MDAwMjE2ODEsMHgwMDAyMGQwMCwKKy8qIDAwRDQgKi8gMHgwMDAyMGY4MSwweDAwMGJkZTgwLDB4MDAwYTA3MDEsMHgwMDBiZGZjMCwKKy8qIDAwRDYgKi8gMHgwMDAyMTYwMSwweDAwMDIxNTAwLDB4MDAwMjBmODEsMHgwMDBiOTM0MSwKKy8qIDAwRDggKi8gMHgwMDAyMDcwMSwweDAwMGI1M2MxLDB4MDAwMjE2ODEsMHgwMDAyMWQwMCwKKy8qIDAwREEgKi8gMHgwMDBhMGY4MSwweDAwMGQwMzgwLDB4MDAwMGI2MDEsMHgwMDBiMTVjMCwKKy8qIDAwREMgKi8gMHgwMDAwN2IwMSwweDAwMDAwMDAwLDB4MDAwMDdiODEsMHgwMDBiZDFjMCwKKy8qIDAwREUgKi8gMHgwMDAwN2IwMSwweDAwMDAwMDAwLDB4MDAwMDdiODEsMHgwMDBiOTFjMCwKKy8qIDAwRTAgKi8gMHgwMDAwN2IwMSwweDAwMGI1N2MwLDB4MDAwMDdiODEsMHgwMDBiNTFjMCwKKy8qIDAwRTIgKi8gMHgwMDAwN2IwMSwweDAwMGIxYjQwLDB4MDAwMDdiODEsMHgwMDBiMTFjMCwKKy8qIDAwRTQgKi8gMHgwMDA4N2IwMSwweDAwMGMzZGMwLDB4MDAwN2U0ODgsMHgwMDBkN2U0NSwKKy8qIDAwRTYgKi8gMHgwMDAwMDAwMCwweDAwMGQ3YTQ0LDB4MDAwN2U0OGEsMHgwMDAwMDAwMCwKKy8qIDAwRTggKi8gMHgwMDAxMWYwNSwweDAwMDg0MDgwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRUEgKi8gMHgwMDAwMTcwNSwweDAwMGIzNTQwLDB4MDAwMDhhMDEsMHgwMDBiZjA0MCwKKy8qIDAwRUMgKi8gMHgwMDAwNzA4MSwweDAwMGJiNWMwLDB4MDAwNTU0ODgsMHgwMDAwMDAwMCwKKy8qIDAwRUUgKi8gMHgwMDAwZDQ4MiwweDAwMDNmYzQwLDB4MDAwM2ZjODgsMHgwMDAwMDAwMCwKKy8qIDAwRjAgKi8gMHgwMDAxZTQwMSwweDAwMGIzYTAwLDB4MDAwMWVjODEsMHgwMDBiZDZjMCwKKy8qIDAwRjIgKi8gMHgwMDAyZWY4OCwweDAwMGU3Nzg0LDB4MDAwNTZmMDgsMHgwMDAwMDAwMCwKKy8qIDAwRjQgKi8gMHgwMDBkODZiMCwweDAwMDAxMDA3LDB4MDAwMDgyODEsMHgwMDBiYjI0MCwKKy8qIDAwRjYgKi8gMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKKy8qIDAwRjggKi8gMHgwMDAwMDczYywweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKKy8qIDAwRkEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNTUyODgsMHgwMDBjNTU1YywKKy8qIDAwRkMgKi8gMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKKy8qIDAwRkUgKi8gMHgwMDAwZmE4OCwweDAwMDAwMDAwLDB4MDAwMDAwMzIsMHgwMDAwMTAwMCwKKy8qIDAxMDAgKi8gMHgwMDAwMDczZCwweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKKy8qIDAxMDIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKKy8qIDAxMDQgKi8gMHgwMDAwMjcwNSwweDAwMDAxMDA4LDB4MDAwOGIyMDEsMHgwMDBjMTM5MiwKKy8qIDAxMDYgKi8gMHgwMDAwYmEwMSwweDAwMDAwMDAwLAorLyogVEFTS1RSRUVUSFJFQUQgKi8KKy8qIDAxMDcgKi8gMHgwMDAwODczMSwweDAwMDAxNDAwLDB4MDAwNGMxMDgsMHgwMDBmZTBjNCwKKy8qIDAxMDkgKi8gMHgwMDA1NzQ4OCwweDAwMDAwMDAwLDB4MDAwYTYzODgsMHgwMDAwMTAwMSwKKy8qIDAxMEIgKi8gMHgwMDA4YjMzNCwweDAwMGJjMTQxLDB4MDAwMzAyMGUsMHgwMDAwMDAwMCwKKy8qIDAxMEQgKi8gMHgwMDA5ODZiMCwweDAwMDAxMDA4LDB4MDAwMDM2MjUsMHgwMDBjNWRmYSwKKy8qIDAxMEYgKi8gMHgwMDBhNjM4YSwweDAwMDAxMDAxLDB4MDAwODAyMGUsMHgwMDAwMTAwMiwKKy8qIDAxMTEgKi8gMHgwMDA5YTZiMCwweDAwMDAxMDA4LDB4MDAwN2YzMDEsMHgwMDAwMDAwMCwKKy8qIDAxMTMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3MjUsMHgwMDBhOGM0MCwKKy8qIDAxMTUgKi8gMHgwMDAwMDBhZSwweDAwMDAwMDAwLDB4MDAwZTg2MzAsMHgwMDAwMTAwOCwKKy8qIDAxMTcgKi8gMHgwMDAwMDAwMCwweDAwMGM3NGUwLDB4MDAwN2QxODIsMHgwMDAyZDY0MCwKKy8qIDAxMTkgKi8gMHgwMDBiODYzMCwweDAwMDAxMDA4LDB4MDAwNzk5YjgsMHgwMDAyZDZjMCwKKy8qIDAxMUIgKi8gMHgwMDAwNzQ4YSwweDAwMGMzZWM1LDB4MDAwNzQyMGEsMHgwMDBjMDAwMCwKKy8qIDAxMUQgKi8gMHgwMDA2MjIwOCwweDAwMGM0MTE3LDB4MDAwYTA2MzAsMHgwMDAwMTAwOSwKKy8qIDAxMUYgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMTAyMmUsMHgwMDAwMDAwMCwKKy8qIDAxMjEgKi8gMHgwMDA2YTYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMzIsMHgwMDAwMTAwMCwKKy8qIDAxMjMgKi8gMHgwMDBjYTIxYywweDAwMDAxMDAzLDB4MDAwMDVhMDIsMHgwMDAwMDAwMCwKKy8qIDAxMjUgKi8gMHgwMDAxYTYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAxMjcgKi8gMHgwMDAwMDAzNiwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjkgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMkIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwM2E3MzAsMHgwMDAwMTAwOCwKKy8qIDAxMkQgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKKy8qIDAxMkYgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMzEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMzMgKi8gMHgwMDAzYTczMCwweDAwMDAxMDA4LDB4MDAwMDAwMzMsMHgwMDAwMTAwMCwKKy8qIDAxMzUgKi8gMHgwMDAzYTcwNSwweDAwMDAxMDA4LDB4MDAwMDdhMDEsMHgwMDBjMDAwMCwKKy8qIDAxMzcgKi8gMHgwMDBlNjI4OCwweDAwMGQ1NTBhLDB4MDAwNjQyOGEsMHgwMDAwMDAwMCwKKy8qIDAxMzkgKi8gMHgwMDA5MDczMCwweDAwMDAxMDBhLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAxM0IgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogVEFTS1RSRUVIRUFERVJDT0RFICovCisvKiAwMTNDICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMGE4ZmIwLDB4MDAwMDEwMGIsCisvKiAwMTNFICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisvKiAwMTQwICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMGE4NmIwLDB4MDAwMDEwMGIsCisvKiAwMTQyICovIDB4MDAwMjJmMDUsMHgwMDBjMzU0NSwweDAwMDBlYjhhLDB4MDAwMDAwMDAsCisvKiAwMTQ0ICovIDB4MDAwNDI3MzEsMHgwMDAwMTAwMywKKy8qIEZHVEFTS1RSRUVIRUFERVJDT0RFICovCisvKiAwMTQ1ICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDc4ZmIwLDB4MDAwMDEwMGEsCisvKiAwMTQ3ICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisvKiAwMTQ5ICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMGIwNmIwLDB4MDAwMDEwMGIsCisvKiAwMTRCICovIDB4MDAwMjJmMDUsMHgwMDAwMDAwMCwweDAwMDA3NDAxLDB4MDAwOTExNDAsCisvKiAwMTREICovIDB4MDAwNDhmMDUsMHgwMDA5NTFjMCwweDAwMDQyNzMxLDB4MDAwMDEwMDMsCisvKiAwMTRGICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCisvKiAwMTUxICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMGZlMTllLDB4MDAwMDEwMDMsCisvKiAwMTUzICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDhlMTljLDB4MDAwMDEwMDMsCisvKiAwMTU1ICovIDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwweDAwMDAwZjQxLDB4MDAwOTcxNDAsCisvKiAwMTU3ICovIDB4MDAwMGE4NDEsMHgwMDA5YjI0MCwweDAwMDBhMGMxLDB4MDAwOWYwNDAsCisvKiAwMTU5ICovIDB4MDAwMWM2NDEsMHgwMDA5MzU0MCwweDAwMDFjZWMxLDB4MDAwOWI1YzAsCisvKiAwMTVCICovIDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwweDAwMDU1MjA4LDB4MDAwMDAwMDAsCisvKiAwMTVEICovIDB4MDAwMTA3MDUsMHgwMDBhMjg4MCwweDAwMDBhMjNhLDB4MDAwOTNhMDAsCisvKiAwMTVGICovIDB4MDAwM2ZjOGEsMHgwMDBkZjZjNSwweDAwMDRlZjBhLDB4MDAwYzAwMDAsCisvKiAwMTYxICovIDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwweDAwMDY1MzA4LDB4MDAwYzI5OTcsCisvKiAwMTYzICovIDB4MDAwMDg2YjAsMHgwMDAwMTAwYiwweDAwMDQ0MTBhLDB4MDAwZDQwYzcsCisvKiAwMTY1ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDg4NzMwLDB4MDAwMDEwMDQsCisvKiAwMTY3ICovIDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiBOVUxMQUxHT1JJVEhNICovCisvKiAwMTY5ICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCisvKiAwMTZCICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMDAyNzNkLDB4MDAwMDEwMDAsCisvKiBIRkdFWEVDQ0hJTEQgKi8KKy8qIDAxNkQgKi8gMHgwMDAwMDAwMCwweDAwMGViYTQ0LAorLyogSEZHRVhFQ0NISUxEXzk4ICovCisvKiAwMTZFICovIDB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCisvKiBIRkdFWEVDQ0hJTERfUFVTSDFJTkQgKi8KKy8qIDAxNzAgKi8gMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKKy8qIDAxNzIgKi8gMHgwMDAwNmE4OCwweDAwMGM3NWM0LAorLyogSEZHRVhFQ1NJQkxJTkcgKi8KKy8qIDAxNzMgKi8gMHgwMDAwMDAwMCwweDAwMGU1MDg0LDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKy8qIEhGR0VYRUNTSUJMSU5HXzI5OCAqLworLyogMDE3NSAqLyAweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCisvKiBIRkdFWEVDU0lCTElOR18ySU5EMSAqLworLyogMDE3NiAqLyAweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorLyogMDE3OCAqLyAweDAwMDA2YTg4LDB4MDAwYzc1YzQsCisvKiBTMTZfQ09ERUNPVVRQVVRUQVNLICovCisvKiAwMTc5ICovIDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwweDAwMDdlNzIxLDB4MDAwYmVkNDAsCisvKiAwMTdCICovIDB4MDAwMDVmMjUsMHgwMDBiYWRjMCwweDAwMDNiYTk3LDB4MDAwYmViODAsCisvKiAwMTdEICovIDB4MDAwNjU1OTAsMHgwMDBiMmUwMCwweDAwMDMzMjE3LDB4MDAwMDNlYzAsCisvKiAwMTdGICovIDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwweDAwMDNlZDgwLDB4MDAwNDkxYzAsCisvKiAwMTgxICovIDB4MDAwNzNmYjAsMHgwMDA3NGM4MCwweDAwMDU4M2EwLDB4MDAwMDEwMGMsCisvKiAwMTgzICovIDB4MDAwZWUzODgsMHgwMDA0Mjk3MCwweDAwMDA4MzAxLDB4MDAwMjFlZjIsCisvKiAwMTg1ICovIDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwweDAwMGM0ZDhkLDB4MDAwMDAwMWIsCisvKiAwMTg3ICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDAzMmFjLDB4MDAwYzM5MTYsCisvKiAwMTg5ICovIDB4MDAwNGVkYzIsMHgwMDA3NGM4MCwweDAwMDc4ODk4LDB4MDAwMDEwMDAsCisvKiAwMThCICovIDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwweDAwMGM0ZDhkLDB4MDAwOTJlMWIsCisvKiAwMThEICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDRlZGMyLDB4MDAwYzE5NTYsCisvKiAwMThGICovIDB4MDAwMDcyMmMsMHgwMDAzNGEwMCwweDAwMDQxNzA1LDB4MDAwOWVkNDAsCisvKiAwMTkxICovIDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwweDAwMGQ3NDg4LDB4MDAwYzNhMDAsCisvKiAwMTkzICovIDB4MDAwNDhmMDUsMHgwMDAwMDAwMAorfTsKKy8qICNDT0RFX0VORCAqLworCitzdGF0aWMgdTMyIGN3YzQ2MzBfcGFyYW1ldGVyW10gPSB7CisvKiAwMDAwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDA0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDA4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDBDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDEwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDE0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDE4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDFDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDIwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDI0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDI4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDJDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDMwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDM0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDM4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDNDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDQwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDQ0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDQ4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDRDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDUwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDU0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDU4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDVDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDYwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDY0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDY4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDZDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDcwICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDc0ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDc4ICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiAwMDdDICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAKK307IC8qICNQQVJBTUVURVJfRU5EICovCisKKworc3RhdGljIHNlZ21lbnRfZGVzY190IGN3YzQ2MzBfc2VnbWVudHNbXSA9IHsKKyAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDB4MDAwMDAzMjgsIGN3YzQ2MzBfY29kZSB9LAorICB7IFNFR1RZUEVfU1BfUEFSQU1FVEVSLCAweDAwMDAwMDAwLCAweDAwMDAwMDgwLCBjd2M0NjMwX3BhcmFtZXRlciB9LAorfTsKKworc3RhdGljIGRzcF9tb2R1bGVfZGVzY190IGN3YzQ2MzBfbW9kdWxlID0geworICAiY3djNDYzMCIsCisgIHsKKyAgICAzOCwKKyAgICBjd2M0NjMwX3N5bWJvbHMKKyAgfSwKKyAgMiwKKyAgY3djNDYzMF9zZWdtZW50cywKK307CisKKyNlbmRpZiAvKiBfX0hFQURFUl9jd2M0NjMwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2FzeW5jLmggYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djYXN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFhN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2FzeW5jLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qIGdlbmVyYXRlZCBmcm9tIGN3Y2FzeW5jLm9zcCBETyBOT1QgTU9ESUZZICovCisKKyNpZm5kZWYgX19IRUFERVJfY3djYXN5bmNfSF9fCisjZGVmaW5lIF9fSEVBREVSX2N3Y2FzeW5jX0hfXworCitzdGF0aWMgc3ltYm9sX2VudHJ5X3QgY3djYXN5bmNfc3ltYm9sc1tdID0geworICB7IDB4ODAwMCwgIkVYRUNDSElMRCIsMHgwMyB9LAorICB7IDB4ODAwMSwgIkVYRUNDSElMRF85OCIsMHgwMyB9LAorICB7IDB4ODAwMywgIkVYRUNDSElMRF9QVVNIMUlORCIsMHgwMyB9LAorICB7IDB4ODAwOCwgIkVYRUNTSUJMSU5HIiwweDAzIH0sCisgIHsgMHg4MDBhLCAiRVhFQ1NJQkxJTkdfMjk4IiwweDAzIH0sCisgIHsgMHg4MDBiLCAiRVhFQ1NJQkxJTkdfMklORDEiLDB4MDMgfSwKKyAgeyAweDgwMTAsICJUSU1JTkdNQVNURVIiLDB4MDMgfSwKKyAgeyAweDgwNGYsICJTMTZfQ09ERUNJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgwNWUsICJQQ01TRVJJQUxJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgwNmQsICJTMTZfTUlYX1RPX09TVFJFQU0iLDB4MDMgfSwKKyAgeyAweDgwOWEsICJTMTZfTUlYIiwweDAzIH0sCisgIHsgMHg4MGJiLCAiUzE2X1VQU1JDIiwweDAzIH0sCisgIHsgMHg4MTNiLCAiTUlYM19FWFAiLDB4MDMgfSwKKyAgeyAweDgxNjQsICJERUNJTUFURUJZUE9XMiIsMHgwMyB9LAorICB7IDB4ODE5NywgIlZBUklERUNJTUFURSIsMHgwMyB9LAorICB7IDB4ODFmMiwgIl8zRElOUFVUVEFTSyIsMHgwMyB9LAorICB7IDB4ODIwYSwgIl8zRFBSTEdDSU5QVEFTSyIsMHgwMyB9LAorICB7IDB4ODIyNywgIl8zRFNURVJFT0lOUFVUVEFTSyIsMHgwMyB9LAorICB7IDB4ODI0MiwgIl8zRE9VVFBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyYzQsICJIUlRGX01PUlBIX1RBU0siLDB4MDMgfSwKKyAgeyAweDgyYzYsICJXQUlUNERBVEEiLDB4MDMgfSwKKyAgeyAweDgyZmEsICJQUk9MT0dJQyIsMHgwMyB9LAorICB7IDB4ODQ5NiwgIkRFQ09SUkVMQVRPUiIsMHgwMyB9LAorICB7IDB4ODRhNCwgIlNURVJFTzJNT05PIiwweDAzIH0sCisgIHsgMHgwMDAwLCAiT1ZFUkxBWUJFR0lOQUREUkVTUyIsMHgwMCB9LAorICB7IDB4MDAwMCwgIlNQSU9XUklURSIsMHgwMyB9LAorICB7IDB4MDAwZCwgIlMxNl9BU1lOQ0NPREVDSU5QVVRUQVNLIiwweDAzIH0sCisgIHsgMHgwMDQzLCAiU1BESUZJVEFTSyIsMHgwMyB9LAorICB7IDB4MDA3YiwgIlNQRElGT1RBU0siLDB4MDMgfSwKKyAgeyAweDAwOTcsICJBU1lOQ0hGR1RYQ09ERSIsMHgwMyB9LAorICB7IDB4MDBiZSwgIkFTWU5DSEZHUlhDT0RFIiwweDAzIH0sCisgIHsgMHgwMGRiLCAiI0NPREVfRU5EIiwweDAwIH0sCit9OyAvKiBjd2Nhc3luYyBzeW1ib2xzICovCisKK3N0YXRpYyB1MzIgY3djYXN5bmNfY29kZVtdID0geworLyogT1ZFUkxBWUJFR0lOQUREUkVTUyAqLworLyogMDAwMCAqLyAweDAwMDAyNzMxLDB4MDAwMDE0MDAsMHgwMDAwMzcyNSwweDAwMGE4NDQwLAorLyogMDAwMiAqLyAweDAwMDAwMGFlLDB4MDAwMDAwMDAsMHgwMDA2MDYzMCwweDAwMDAxMDAwLAorLyogMDAwNCAqLyAweDAwMDAwMDAwLDB4MDAwYzc1NjAsMHgwMDA3NTI4MiwweDAwMDJkNjQwLAorLyogMDAwNiAqLyAweDAwMDIxNzA1LDB4MDAwMDAwMDAsMHgwMDA3MmFiOCwweDAwMDJkNmMwLAorLyogMDAwOCAqLyAweDAwMDIwNjMwLDB4MDAwMDEwMDAsMHgwMDBjNzRjMiwweDAwMGQ0YjgyLAorLyogMDAwQSAqLyAweDAwMDQ3NWMyLDB4MDAwMDAwMDAsMHgwMDAzNDMwYSwweDAwMGMwMDAwLAorLyogMDAwQyAqLyAweDAwMDQyNzMwLDB4MDAwMDE0MDAsCisvKiBTMTZfQVNZTkNDT0RFQ0lOUFVUVEFTSyAqLworLyogMDAwRCAqLyAweDAwMDZhMTA4LDB4MDAwY2YyYzQsMHgwMDA0ZjRjMCwweDAwMDAwMDAwLAorLyogMDAwRiAqLyAweDAwMGZhNDE4LDB4MDAwMDEwMWYsMHgwMDA1ZDQwMiwweDAwMDFjNTAwLAorLyogMDAxMSAqLyAweDAwMGYwNjMwLDB4MDAwMDEwMDAsMHgwMDAwNDQxOCwweDAwMDAxMzgwLAorLyogMDAxMyAqLyAweDAwMGUyNDNkLDB4MDAwZDM5NGEsMHgwMDA0OTcwNSwweDAwMDAwMDAwLAorLyogMDAxNSAqLyAweDAwMDdkNTMwLDB4MDAwYjQyNDAsMHgwMDBlMDBmMiwweDAwMDAxMDAwLAorLyogMDAxNyAqLyAweDAwMDA5MTM0LDB4MDAwY2EyMGEsMHgwMDAwNGM5MCwweDAwMDAxMDAwLAorLyogMDAxOSAqLyAweDAwMDVkNzA1LDB4MDAwMDAwMDAsMHgwMDAwNGYyNSwweDAwMDk4MjQwLAorLyogMDAxQiAqLyAweDAwMDA0NzI1LDB4MDAwMDAwMDAsMHgwMDAwZTQ4YSwweDAwMDAwMDAwLAorLyogMDAxRCAqLyAweDAwMDI3Mjk1LDB4MDAwOWMyYzAsMHgwMDAzZGYyNSwweDAwMDAwMDAwLAorLyogMDAxRiAqLyAweDAwMGU4MDMwLDB4MDAwMDEwMDEsMHgwMDA1ZjcxOCwweDAwMGFjNjAwLAorLyogMDAyMSAqLyAweDAwMDdjZjMwLDB4MDAwYzJhMDEsMHgwMDA4MjYzMCwweDAwMDAxMDAxLAorLyogMDAyMyAqLyAweDAwMDUwNGEwLDB4MDAwMDEwMDEsMHgwMDAyOTMxNCwweDAwMGJjYjgwLAorLyogMDAyNSAqLyAweDAwMDNjZjI1LDB4MDAwYjBlMDAsMHgwMDA0ZjVjMCwweDAwMDAwMDAwLAorLyogMDAyNyAqLyAweDAwMDQ5MTE4LDB4MDAwZDg4OGEsMHgwMDA3ZGQwMiwweDAwMGM2ZWZhLAorLyogMDAyOSAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA0ZjVjMCwweDAwMDY5YzgwLAorLyogMDAyQiAqLyAweDAwMDBkNDAyLDB4MDAwMDAwMDAsMHgwMDBlODYzMCwweDAwMDAxMDAxLAorLyogMDAyRCAqLyAweDAwMDc5MTMwLDB4MDAwMDAwMDAsMHgwMDA0OTExOCwweDAwMDkwZTAwLAorLyogMDAyRiAqLyAweDAwMDZjMTBhLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorLyogMDAzMSAqLyAweDAwMDdjZjMwLDB4MDAwMzA1ODAsMHgwMDAwNTcyNSwweDAwMDAwMDAwLAorLyogMDAzMyAqLyAweDAwMGQ4NGEwLDB4MDAwMDEwMDEsMHgwMDAyOTMxNCwweDAwMGI0NzgwLAorLyogMDAzNSAqLyAweDAwMDNjZjI1LDB4MDAwYjg2MDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAzNyAqLyAweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDQyYzgwLAorLyogMDAzOSAqLyAweDAwMDFkZWMxLDB4MDAwZTQ4OGMsMHgwMDAzMTExNCwweDAwMDAwMDAwLAorLyogMDAzQiAqLyAweDAwMDRmNWMyLDB4MDAwMDAwMDAsMHgwMDAzNjQwYSwweDAwMDAwMDAwLAorLyogMDAzRCAqLyAweDAwMDAwMDAwLDB4MDAwZTUwODQsMHgwMDAwMDAwMCwweDAwMGViODQ0LAorLyogMDAzRiAqLyAweDAwMDA3MDAxLDB4MDAwMDAwMDAsMHgwMDAwMDczNCwweDAwMDAxMDAwLAorLyogMDA0MSAqLyAweDAwMDEwNzA1LDB4MDAwYTY4ODAsMHgwMDAwNmE4OCwweDAwMGM3NWM0LAorLyogU1BESUZJVEFTSyAqLworLyogMDA0MyAqLyAweDAwMDZhMTA4LDB4MDAwY2YyYzQsMHgwMDA0ZjRjMCwweDAwMGQ1Mzg0LAorLyogMDA0NSAqLyAweDAwMDdlNDhhLDB4MDAwMDAwMDAsMHgwMDA2NzcxOCwweDAwMDAxMDAwLAorLyogMDA0NyAqLyAweDAwMDdhNDE4LDB4MDAwMDEwMDAsMHgwMDA3MjIxYSwweDAwMDAwMDAwLAorLyogMDA0OSAqLyAweDAwMDVkNDAyLDB4MDAwMTQ1MDAsMHgwMDBiODYzMCwweDAwMDAxMDAyLAorLyogMDA0QiAqLyAweDAwMDA0NDE4LDB4MDAwMDE3ODAsMHgwMDBlMjQzZCwweDAwMGQzOTRhLAorLyogMDA0RCAqLyAweDAwMDQ5NzA1LDB4MDAwMDAwMDAsMHgwMDA3ZDUzMCwweDAwMGI0MjQwLAorLyogMDA0RiAqLyAweDAwMGFjMGYyLDB4MDAwMDEwMDIsMHgwMDAxNDQxNCwweDAwMDAwMDAwLAorLyogMDA1MSAqLyAweDAwMDA0YzkwLDB4MDAwMDEwMDAsMHgwMDA1ZDcwNSwweDAwMDAwMDAwLAorLyogMDA1MyAqLyAweDAwMDA0ZjI1LDB4MDAwOTgyNDAsMHgwMDAwNDcyNSwweDAwMDAwMDAwLAorLyogMDA1NSAqLyAweDAwMDBlNDhhLDB4MDAwMDAwMDAsMHgwMDAyNzI5NSwweDAwMDljMmMwLAorLyogMDA1NyAqLyAweDAwMDdkZjI1LDB4MDAwMDAwMDAsMHgwMDBhYzAzMCwweDAwMDAxMDAzLAorLyogMDA1OSAqLyAweDAwMDVmNzE4LDB4MDAwZmU3OTgsMHgwMDAyOTMxNCwweDAwMGJjYjgwLAorLyogMDA1QiAqLyAweDAwMDAwOTMwLDB4MDAwYjBlMDAsMHgwMDA0ZjVjMCwweDAwMGRlMjA0LAorLyogMDA1RCAqLyAweDAwMDg4NGEwLDB4MDAwMDEwMDMsMHgwMDA3Y2YyNSwweDAwMGUzNTYwLAorLyogMDA1RiAqLyAweDAwMDQ5MTE4LDB4MDAwMDAwMDAsMHgwMDA0OTExOCwweDAwMGQ4ODhhLAorLyogMDA2MSAqLyAweDAwMDdkZDAyLDB4MDAwYzZlZmEsMHgwMDAwYzQzNCwweDAwMDMwMDQwLAorLyogMDA2MyAqLyAweDAwMGZkYTgyLDB4MDAwYzIzMTIsMHgwMDBmZGMwZSwweDAwMDAxMDAxLAorLyogMDA2NSAqLyAweDAwMDgzNDAyLDB4MDAwYzJiOTIsMHgwMDA3MDZiMCwweDAwMDAxMDAzLAorLyogMDA2NyAqLyAweDAwMDc1YTgyLDB4MDAwMDAwMDAsMHgwMDAwZDYyNSwweDAwMGIwOTQwLAorLyogMDA2OSAqLyAweDAwMDA4NDBlLDB4MDAwMDEwMDIsMHgwMDAwYWFiYywweDAwMGM1MTFlLAorLyogMDA2QiAqLyAweDAwMDc4NzMwLDB4MDAwMDEwMDMsMHgwMDAwYWFmNCwweDAwMGU5MTBhLAorLyogMDA2RCAqLyAweDAwMDQ2MjhhLDB4MDAwMDAwMDAsMHgwMDAwNmFjYSwweDAwMDAwMDAwLAorLyogMDA2RiAqLyAweDAwMDAwOTMwLDB4MDAwMDAwMDAsMHgwMDA0ZjVjMCwweDAwMDY5YzgwLAorLyogMDA3MSAqLyAweDAwMDQ2YWMwLDB4MDAwMDAwMDAsMHgwMDAzYzQwYSwweDAwMGZjODk4LAorLyogMDA3MyAqLyAweDAwMDQ5MTE4LDB4MDAwOTBlMDAsMHgwMDA2YzEwYSwweDAwMDAwMDAwLAorLyogMDA3NSAqLyAweDAwMDAwMDAwLDB4MDAwZTUwODQsMHgwMDAwMDAwMCwweDAwMGViODQ0LAorLyogMDA3NyAqLyAweDAwMDA3MDAxLDB4MDAwMDAwMDAsMHgwMDAwMDczNCwweDAwMDAxMDAwLAorLyogMDA3OSAqLyAweDAwMDEwNzA1LDB4MDAwYTY4ODAsMHgwMDAwNmE4OCwweDAwMGM3NWM0LAorLyogU1BESUZPVEFTSyAqLworLyogMDA3QiAqLyAweDAwMDZhMTA4LDB4MDAwYzAwMDAsMHgwMDA0ZjRjMCwweDAwMGMzMjQ1LAorLyogMDA3RCAqLyAweDAwMDBhNDE4LDB4MDAwMDEwMDAsMHgwMDAzYTIwYSwweDAwMDAwMDAwLAorLyogMDA3RiAqLyAweDAwMDA0NDE4LDB4MDAwMDEzODAsMHgwMDBlMjQzZCwweDAwMGQzOTRhLAorLyogMDA4MSAqLyAweDAwMGM5NzA1LDB4MDAwZGVmOTIsMHgwMDA4YzAzMCwweDAwMDAxMDA0LAorLyogMDA4MyAqLyAweDAwMDVmNzE4LDB4MDAwZmU3OTgsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorLyogMDA4NSAqLyAweDAwMDA1NzI1LDB4MDAwMDAwMDAsMHgwMDA3MDRhMCwweDAwMDAxMDA0LAorLyogMDA4NyAqLyAweDAwMDI5MzE0LDB4MDAwYjQ3ODAsMHgwMDAzY2YyNSwweDAwMGI4NjAwLAorLyogMDA4OSAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorLyogMDA4QiAqLyAweDAwMDAwMDAwLDB4MDAwNDJjODAsMHgwMDAxZGVjMSwweDAwMGU0ODhjLAorLyogMDA4RCAqLyAweDAwMDMxMTE0LDB4MDAwMDAwMDAsMHgwMDA0ZjVjMiwweDAwMDAwMDAwLAorLyogMDA4RiAqLyAweDAwMDRhOTE4LDB4MDAwOTg2MDAsMHgwMDA2YzI4YSwweDAwMDAwMDAwLAorLyogMDA5MSAqLyAweDAwMDAwMDAwLDB4MDAwZTUwODQsMHgwMDAwMDAwMCwweDAwMGViODQ0LAorLyogMDA5MyAqLyAweDAwMDA3MDAxLDB4MDAwMDAwMDAsMHgwMDAwMDczNCwweDAwMDAxMDAwLAorLyogMDA5NSAqLyAweDAwMDEwNzA1LDB4MDAwYTY4ODAsMHgwMDAwNmE4OCwweDAwMGM3NWM0LAorLyogQVNZTkNIRkdUWENPREUgKi8KKy8qIDAwOTcgKi8gMHgwMDAyYTg4MCwweDAwMGI0ZTQwLDB4MDAwNDIyMTQsMHgwMDBlNTU0OCwKKy8qIDAwOTkgKi8gMHgwMDA1NDJiZiwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA0ODFjMCwKKy8qIDAwOUIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAzMCwKKy8qIDAwOUQgKi8gMHgwMDAwMDcyZCwweDAwMGZiZjhhLDB4MDAwNzdmOTQsMHgwMDBlYTdkZiwKKy8qIDAwOUYgKi8gMHgwMDAyYWM5NSwweDAwMGQzMTQ1LDB4MDAwMDI3MzEsMHgwMDAwMTQwMCwKKy8qIDAwQTEgKi8gMHgwMDAwNjI4OCwweDAwMGM3MWM0LDB4MDAwMTQxMDgsMHgwMDBlNjA0NCwKKy8qIDAwQTMgKi8gMHgwMDAzNTQwOCwweDAwMDAwMDAwLDB4MDAwMjU0MTgsMHgwMDBhMGVjMCwKKy8qIDAwQTUgKi8gMHgwMDAxNDQzZCwweDAwMGNhMjFlLDB4MDAwNDY1OTUsMHgwMDBkNzMwYywKKy8qIDAwQTcgKi8gMHgwMDA2NTM4ZSwweDAwMDAwMDAwLDB4MDAwNjQ2MzAsMHgwMDAwMTAwNSwKKy8qIDAwQTkgKi8gMHgwMDBlN2IwZSwweDAwMGRmNzgyLDB4MDAwNzQ2YjAsMHgwMDAwMTAwNSwKKy8qIDAwQUIgKi8gMHgwMDAzNmYwNSwweDAwMGMwMDAwLDB4MDAwNDM2OTUsMHgwMDBkNTk4YywKKy8qIDAwQUQgKi8gMHgwMDA1MzMxYSwweDAwMGYyMTg1LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQUYgKi8gMHgwMDAwMDdhZSwweDAwMGJkYjAwLDB4MDAwNDA2MzAsMHgwMDAwMTQwMCwKKy8qIDAwQjEgKi8gMHgwMDA1ZTcwOCwweDAwMGMwMDAwLDB4MDAwN2VmMzAsMHgwMDBiMWMwMCwKKy8qIDAwQjMgKi8gMHgwMDBkODZhMCwweDAwMDAxMDA1LDB4MDAwNjY0MDgsMHgwMDBjMDAwMCwKKy8qIDAwQjUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMjE4NDMsMHgwMDAwMDAwMCwKKy8qIDAwQjcgKi8gMHgwMDAwMGNhYywweDAwMDYyYzAwLDB4MDAwMDFkYWMsMHgwMDA2MzQwMCwKKy8qIDAwQjkgKi8gMHgwMDAwMmNhYywweDAwMDZjYzgwLDB4MDAwZGI5NDMsMHgwMDBlNWNhMSwKKy8qIDAwQkIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNjY4MGEsMHgwMDBmMzIwNSwKKy8qIDAwQkQgKi8gMHgwMDA0MjczMCwweDAwMDAxNDAwLAorLyogQVNZTkNIRkdSWENPREUgKi8KKy8qIDAwQkUgKi8gMHgwMDAxNDEwOCwweDAwMGYyMjA0LDB4MDAwMjU0MTgsMHgwMDBhMmVjMCwKKy8qIDAwQzAgKi8gMHgwMDAxNWRiZCwweDAwMDM4MTAwLDB4MDAwMTVkYmMsMHgwMDAwMDAwMCwKKy8qIDAwQzIgKi8gMHgwMDA1ZTQxNSwweDAwMDM0ODgwLDB4MDAwMTI1OGEsMHgwMDBkNzMwYywKKy8qIDAwQzQgKi8gMHgwMDA2NTM4ZSwweDAwMGJhYTQwLDB4MDAwNjA2MzAsMHgwMDAwMTAwNiwKKy8qIDAwQzYgKi8gMHgwMDA2N2IwZSwweDAwMGFjMzgwLDB4MDAwM2VmMDUsMHgwMDAwMDAwMCwKKy8qIDAwQzggKi8gMHgwMDAwZjczNCwweDAwMDFjMzAwLDB4MDAwNTg2YjAsMHgwMDAwMTQwMCwKKy8qIDAwQ0EgKi8gMHgwMDBiNmYwNSwweDAwMGMzYTAwLDB4MDAwNDhmMDUsMHgwMDAwMDAwMCwKKy8qIDAwQ0MgKi8gMHgwMDA1YjY5NSwweDAwMDhjMzgwLDB4MDAwMjA1OGUsMHgwMDAwMDAwMCwKKy8qIDAwQ0UgKi8gMHgwMDA1MDBiMCwweDAwMDAxNDAwLDB4MDAwMmIzMTgsMHgwMDBlOTk4ZCwKKy8qIDAwRDAgKi8gMHgwMDA2NDMwYSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBlZjM4NCwKKy8qIDAwRDIgKi8gMHgwMDAwNDcyNSwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDBmMzIwNCwKKy8qIDAwRDQgKi8gMHgwMDAwNGYyNSwweDAwMGMwMDAwLDB4MDAwODAwMDAsMHgwMDBlNWNhMSwKKy8qIDAwRDYgKi8gMHgwMDBjYjk0MywweDAwMGU1Y2ExLDB4MDAwNGI5NDMsMHgwMDAwMDAwMCwKKy8qIDAwRDggKi8gMHgwMDA0MDczMCwweDAwMDAxNDAwLDB4MDAwY2I5NDMsMHgwMDBlNWNhMSwKKy8qIDAwREEgKi8gMHgwMDA0Yjk0MywweDAwMDAwMDAwCit9OworLyogI0NPREVfRU5EICovCisKK3N0YXRpYyBzZWdtZW50X2Rlc2NfdCBjd2Nhc3luY19zZWdtZW50c1tdID0geworICB7IFNFR1RZUEVfU1BfUFJPR1JBTSwgMHgwMDAwMDAwMCwgMHgwMDAwMDFiNiwgY3djYXN5bmNfY29kZSB9LAorfTsKKworc3RhdGljIGRzcF9tb2R1bGVfZGVzY190IGN3Y2FzeW5jX21vZHVsZSA9IHsKKyAgImN3Y2FzeW5jIiwKKyAgeworICAgIDMyLAorICAgIGN3Y2FzeW5jX3N5bWJvbHMKKyAgfSwKKyAgMSwKKyAgY3djYXN5bmNfc2VnbWVudHMsCit9OworCisjZW5kaWYgLyogX19IRUFERVJfY3djYXN5bmNfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djYmluaGFjay5oIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2JpbmhhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZiMzhiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2JpbmhhY2suaApAQCAtMCwwICsxLDQ4IEBACisvKiBnZW5lcmF0ZWQgYnkgQmVubnkgCisgICBNT0RJRlkgT04gWU9VUiBPV04gUklTSyAqLworCisjaWZuZGVmIF9fSEVBREVSX2N3Y2JpbmhhY2tfSF9fCisjZGVmaW5lIF9fSEVBREVSX2N3Y2JpbmhhY2tfSF9fCisKK3N0YXRpYyBzeW1ib2xfZW50cnlfdCBjd2NiaW5oYWNrX3N5bWJvbHNbXSA9IHsKKyAgeyAweDAyYzgsICJPVkVSTEFZQkVHSU5BRERSRVNTIiwweDAwIH0sCisgIHsgMHgwMmM4LCAiTUFHSUNTTk9PUFRBU0siLDB4MDMgfSwKKyAgeyAweDAzMDgsICIjQ09ERV9FTkQiLDB4MDAgfSwKK307IC8qIGN3Y2JpbmhhY2sgc3ltYm9scyAqLworCitzdGF0aWMgdTMyIGN3Y2JpbmhhY2tfY29kZVtdID0geworICAvKiAweDAyYzggKi8KKyAgMHgwMDA3YmZiMCwweDAwMGJjMjQwLDB4MDAwMDBjMmUsMHgwMDBjNjA4NCwgLyogMSAqLworICAweDAwMGI4NjMwLDB4MDAwMDEwMTYsMHgwMDAwNjQwOCwweDAwMGVmYjg0LCAvKiAyICovCisgIDB4MDAwMTYwMDgsMHgwMDAwMDAwMCwweDAwMDFjMDg4LDB4MDAwYzAwMDAsIC8qIDMgKi8KKyAgMHgwMDBmYzkwOCwweDAwMGUzMzkyLDB4MDAwNWY0ODgsMHgwMDBlZmI4NCwgLyogNCAqLworICAweDAwMDFkNDAyLDB4MDAwYjJlMDAsMHgwMDAzZDQxOCwweDAwMDAxMDAwLCAvKiA1ICovCisgIDB4MDAwOGQ1NzQsMHgwMDBjNDI5MywweDAwMDY1NjI1LDB4MDAwZWEzMGUsIC8qIDYgKi8KKyAgMHgwMDA5NmMwMSwweDAwMGM2ZjkyLDB4MDAwMWE1OGEsMHgwMDBjNjA4NSwgLyogNyAqLworICAweDAwMDAyZjQzLDB4MDAwMDAwMDAsMHgwMDBlMDNhMCwweDAwMDAxMDE2LCAvKiA4ICovCisgIDB4MDAwNWU2MDgsMHgwMDBjMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsIC8qIDkgKi8KKyAgMHgwMDBjYTEwOCwweDAwMGRjY2ExLDB4MDAwMDNiYWMsMHgwMDBjMzIwNSwgLyogMTAgKi8KKyAgMHgwMDA3Mzg0MywweDAwMDAwMDAwLDB4MDAwMTA3MzAsMHgwMDAwMTAxNywgLyogMTEgKi8KKyAgMHgwMDAxNjAwYSwweDAwMGMwMDAwLDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwgLyogMTIgKi8KKyAgMHgwMDAwMDAwMCwweDAwMGU1MDg0LDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwgLyogMTMgKi8KKyAgMHgwMDA4NzQwMSwweDAwMGU0NzgyLDB4MDAwMDA3MzQsMHgwMDAwMTAwMCwgLyogMTQgKi8KKyAgMHgwMDAxMDcwNSwweDAwMGE2ODgwLDB4MDAwMDZhODgsMHgwMDBjNzVjNCwgLyogMTUgKi8KKyAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwgLyogMTYgKi8KK307CisvKiAjQ09ERV9FTkQgKi8KKworc3RhdGljIHNlZ21lbnRfZGVzY190IGN3Y2JpbmhhY2tfc2VnbWVudHNbXSA9IHsKKyAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDY0LCBjd2NiaW5oYWNrX2NvZGUgfSwKK307CisKK3N0YXRpYyBkc3BfbW9kdWxlX2Rlc2NfdCBjd2NiaW5oYWNrX21vZHVsZSA9IHsKKyAgImN3Y2JpbmhhY2siLAorICB7CisgICAgMywKKyAgICBjd2NiaW5oYWNrX3N5bWJvbHMKKyAgfSwKKyAgMSwKKyAgY3djYmluaGFja19zZWdtZW50cywKK307CisKKyNlbmRpZiAvKiBfX0hFQURFUl9jd2NiaW5oYWNrX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5hc3AgYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djZG1hLmFzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQyNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5hc3AKQEAgLTAsMCArMSwxNjkgQEAKKy8vIAorLy8gIENvcHlyaWdodChjKSBieSBCZW5ueSBTam9zdHJhbmQgKGJlbm55QGhvc3Rtb2JpbGl0eS5jb20pCisvLworLy8gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorLy8gIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKy8vCisKKworLy8KKy8vIFRoaXMgY29kZSBydW5zIGluc2lkZSB0aGUgRFNQIChjczQ2MTAsIGNzNDYxMiwgY3M0NjI0LCBvciBjczQ2MzApLAorLy8gdG8gY29tcGlsZSBpdCB5b3UgbmVlZCBhIHRvb2wgbmFtZWQgU1BBU00gMy4wIGFuZCBEU1AgY29kZSBvd25lZCBieSAKKy8vIENpcnJ1cyBMb2dpYyhSKS4gVGhlIFNQQVNNIHByb2dyYW0gd2lsbCBnZW5lcmF0ZSBhIG9iamVjdCBmaWxlIChjd2NkbWEub3NwKSwKKy8vIHRoZSAib3NwcGFyc2VyIiAgdG9vbCB3aWxsIGdlbmVyZWF0ZSB0aGUgY3djZG1hLmggZmlsZSBpdCdzIGluY2x1ZGVkIGZyb20KKy8vIHRoZSBjczQ2eHhfbGliLmMgZmlsZS4KKy8vCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjb2RlIGlzIHZlcnkgc2ltcGxlOiBtYWtlIGl0IHBvc3NpYmxlIHRvIHRyYW5mc2VyCisvLyB0aGUgc2FtcGxlcyAnYXMgdGhleSBhcmUnIHdpdGggbm8gYWx0ZXJhdGlvbiBmcm9tIGEgUENNcmVhZGVyIFNDQiAoRE1BIGZyb20gaG9zdCkKKy8vIHRvIGFueSBvdGhlciBTQ0IuIFRoaXMgaXMgdXNlZnVsIGZvciBBQzMgdGhyb3VnIFNQRElGLiBTUkMgKHNvdXJjZSByYXRlIGNvbnZlcnRlcnMpIAorLy8gdGFzayBhbHdheXMgYWx0ZXJzIHRoZSBzYW1wbGVzIGluIHNvbWUgaG93LCBob3dldmVyIGl0J3MgZnJvbSA0OGtoeiAtPiA0OGtoei4gVGhlCisvLyBhbHRlcmF0aW9ucyBhcmUgbm90IGF1ZGlibGUsIGJ1dCBBQzMgd29udCB3b3JrLiAKKy8vCisvLyAgICAgICAgLi4uCisvLyAgICAgICAgIHwKKy8vICstLS0tLS0tLS0tLS0tLS0rCisvLyB8IEFzeW5jaEZHVHhTQ0IgfAorLy8gKy0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAgICB8CisvLyAgICBzdWJMaXN0UHRyCisvLyAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tKworLy8gfCAgIERNQVJlYWRlciAgfAorLy8gKy0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgIHwKKy8vICAgIHN1Ykxpc3RQdHIKKy8vICAgICAgICB8CisvLyArLS0tLS0tLS0tLS0tLSsKKy8vIHwgUENNUmVhZGVyICAgfAorLy8gKy0tLS0tLS0tLS0tLS0rCisvLyAoRE1BIGZyb20gaG9zdCkKKy8vCisKK3N0cnVjdCBkbWFTQ0IKKyAgeworICAgIGxvbmcgIGRtYV9yZXNlcnZlZDFbM107CisKKyAgICBzaG9ydCBkbWFfcmVzZXJ2ZWQyOmRtYV9vdXRCdWZQdHI7CisKKyAgICBzaG9ydCBkbWFfdW51c2VkMTpkbWFfdW51c2VkMjsKKworICAgIGxvbmcgIGRtYV9yZXNlcnZlZDNbNF07CisKKyAgICBzaG9ydCBkbWFfc3ViTGlzdFB0cjpkbWFfbmV4dFNDQjsKKyAgICBzaG9ydCBkbWFfU1BCcHRyOmRtYV9lbnRyeVBvaW50OworCisgICAgbG9uZyAgZG1hX3N0cm1Sc0NvbmZpZzsKKyAgICBsb25nICBkbWFfc3RybUJ1ZlB0cjsKKworICAgIGxvbmcgIGRtYV9yZXNlcnZlZDQ7CisKKyAgICBWb2x1bWVDb250cm9sIHMybV92b2x1bWU7CisgIH07CisKKyNleHBvcnQgRE1BUmVhZGVyCit2b2lkIERNQVJlYWRlcigpCit7CisgIGV4ZWNDaGlsZCgpOworICByMiA9IHIwLT5kbWFfc3ViTGlzdFB0cjsKKyAgcjEgPSByMC0+bmV4dFNDQjsKKwkKKyAgcnNDb25maWcwMSA9IHIyLT5zdHJtUnNDb25maWc7CisgIC8vIExvYWQgcnNDb25maWcgZm9yIGlucHV0IGJ1ZmZlcgorCisgIHJzRE1BMDEgPSByMi0+YmFzaWNSZXEuZGF3LCAgICAgICAsICAgICAgICAgICAgICAgICAgIHRiID0gWigwIC0gcmYpOworICAvLyBMb2FkIHJzRE1BIGluIGNhc2UgaW5wdXQgYnVmZmVyIGlzIGEgRE1BIGJ1ZmZlciAgICBUZXN0IHRvIHNlZSBpZiB0aGVyZSBpcyBhbnkgZGF0YSB0byB0cmFuc2ZlcgorCisgIGlmICh0YikgZ290byBleGVjU2libGluZ18yaW5kMSBhZnRlciB7CisgICAgICByNSA9IHJmICsgKC0xKTsKKyAgICAgIHI2ID0gcjEtPmRtYV9lbnRyeVBvaW50OyAgICAgICAgICAgLy8gcjYgPSBlbnRyeSBwb2ludCBvZiBzaWJsaW5nIHRhc2sKKyAgICAgIHIxID0gcjEtPmRtYV9TUEJwdHIsICAgICAgICAgICAgICAgLy8gcjEgPSBwb2ludGVyIHRvIHNpYmxpbmcgdGFzaydzIFNQQgorICAgICAgICAgICwgICBpbmQgPSByNjsgICAgICAgICAgICAgICAgICAvLyBMb2FkIGVudHJ5IHBvaW50IG9mIHNpYmxpbmcgdGFzaworICB9CisKKyAgcnNDb25maWcyMyA9IHIwLT5kbWFfc3RybVJzQ29uZmlnOworICAvLyBMb2FkIHJzQ29uZmlnIGZvciBvdXRwdXQgYnVmZmVyIChuZXZlciBhIERNQSBidWZmZXIpCisKKyAgcjQgPSByMC0+ZG1hX291dEJ1ZlB0cjsKKworICByc2EwID0gcjItPnN0cm1CdWZQdHI7CisgIC8vIHJzYTAgPSBpbnB1dCBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaSA9IHI1OyBpID49IDA7IC0taSkKKyAgICBhZnRlciB7CisgICAgICByc2EyID0gcjQ7CisgICAgICAvLyByc2EyID0gb3V0cHV0IGJ1ZmZlciBwb2ludGVyCisKKyAgICAgIG5vcDsKKyAgICAgIG5vcDsKKyAgICB9CisgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLy8gVE9ETzogY3ljbGVzIHRvIHRoaXMgcG9pbnQgKgorICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgeworICAgICAgYWNjMCA9ICAocnNkMCA9ICpyc2EwKysxKTsKKyAgICAgIC8vIGdldCBzYW1wbGUKKworICAgICAgbm9wOyAgLy8gVGhvc2UgIm5vcCIncyBhcmUgcmVhbGx5IHVnZ2x5LCBidXQgdGhlcmUncworICAgICAgbm9wOyAgLy8gc29tZXRoaW5nIHdpdGggRFNQJ3MgcGlwZWxpbmVzIHdoaWNoIEkgZG9uJ3QKKyAgICAgIG5vcDsgIC8vIHVuZGVyc3RhbmQsIHJlc3VsdGluZyB0aGlzIGNvZGUgdG8gZmFpbCB3aXRob3V0CisgICAgICAgICAgICAvLyBoYXZpbmcgdGhvc2UgIm5vcCIncyAoQmVubnkpCisKKyAgICAgIHJzYTA/cmVxRE1BID0gcjI7CisgICAgICAvLyBUcmlnZ2VyIERNQSB0cmFuc2ZlciBvbiBpbnB1dCBzdHJlYW0sIAorICAgICAgLy8gaWYgbmVlZGVkIHRvIHJlcGxlbmlzaCBpbnB1dCBidWZmZXIKKworICAgICAgbm9wOworICAgICAgLy8gWWV0IGFub3RoZXIgbWFnaWMgIm5vcCIgdG8gbWFrZSBzdHVmZiB3b3JrCisKKyAgICAgICwscjk4ID0gYWNjMCAkKz4+IDA7CisgICAgICAvLyBzdG9yZSBzYW1wbGUgaW4gQUxVCisKKyAgICAgIG5vcDsKKyAgICAgIC8vIGxhdGVuY3kgb24gbG9hZCByZWdpc3Rlci4KKyAgICAgIC8vICh0aGlzIG9uZSBpcyB1bmRlcnN0YW5kYWJsZSkKKworICAgICAgKnJzYTIrKzEgPSByOTg7CisgICAgICAvLyBzdG9yZSBzYW1wbGUgaW4gb3V0cHV0IGJ1ZmZlcgorCisgICAgICBub3A7IC8vIFRoZSBzYW1lIHN0b3J5CisgICAgICBub3A7IC8vIGFzIGFib3ZlIGFnYWluIC4uLgorICAgICAgbm9wOworICAgIH0KKyAgLy8gVE9ETzogY3ljbGVzIHBlciBsb29wIGl0ZXJhdGlvbgorCisgIHIyLT5zdHJtQnVmUHRyID0gcnNhMCwsICAgOworICAvLyBVcGRhdGUgdGhlIG1vZGlmaWVkIGJ1ZmZlciBwb2ludGVycworCisgIHI0ID0gcnNhMjsKKyAgLy8gTG9hZCBvdXRwdXQgcG9pbnRlciBwb3NpdGlvbiBpbnRvIHI0CisKKyAgcjIgPSByMC0+bmV4dFNDQjsKKyAgLy8gU2libGluZyB0YXNrCisKKyAgZ290byBleGVjU2libGluZ18yaW5kMSAvLyB0YWtlcyA2IGN5Y2xlcworICAgIGFmdGVyIHsKKyAgICAgIHI5OCA9IHIyLT50aGlzU1BCOmVudHJ5UG9pbnQ7CisgICAgICAvLyBMb2FkIGNoaWxkIHJvdXRpbmUgZW50cnkgYW5kIGRhdGEgYWRkcmVzcyAKKworICAgICAgcjEgPSByOTsKKyAgICAgIC8vIHI5IGlzIHIyLT50aGlzU1BCCisKKyAgICAgIHIwLT5kbWFfb3V0QnVmUHRyID0gcjQsLAorICAgICAgLy8gU3RvcmUgdXBkYXRlZCBvdXRwdXQgYnVmZmVyIHBvaW50ZXIKKworICAgICAgaW5kID0gcjg7CisgICAgICAvLyByOCBpcyByMi0+ZW50cnlQb2ludAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2NkbWEuaCBiL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2NkbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg2MDQzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIGdlbmVyYXRlZCBmcm9tIGN3Y2RtYS5vc3AgRE8gTk9UIE1PRElGWSAqLworCisjaWZuZGVmIF9fSEVBREVSX2N3Y2RtYV9IX18KKyNkZWZpbmUgX19IRUFERVJfY3djZG1hX0hfXworCitzdGF0aWMgc3ltYm9sX2VudHJ5X3QgY3djZG1hX3N5bWJvbHNbXSA9IHsKKyAgeyAweDgwMDAsICJFWEVDQ0hJTEQiLDB4MDMgfSwKKyAgeyAweDgwMDEsICJFWEVDQ0hJTERfOTgiLDB4MDMgfSwKKyAgeyAweDgwMDMsICJFWEVDQ0hJTERfUFVTSDFJTkQiLDB4MDMgfSwKKyAgeyAweDgwMDgsICJFWEVDU0lCTElORyIsMHgwMyB9LAorICB7IDB4ODAwYSwgIkVYRUNTSUJMSU5HXzI5OCIsMHgwMyB9LAorICB7IDB4ODAwYiwgIkVYRUNTSUJMSU5HXzJJTkQxIiwweDAzIH0sCisgIHsgMHg4MDEwLCAiVElNSU5HTUFTVEVSIiwweDAzIH0sCisgIHsgMHg4MDRmLCAiUzE2X0NPREVDSU5QVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MDVlLCAiUENNU0VSSUFMSU5QVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MDZkLCAiUzE2X01JWF9UT19PU1RSRUFNIiwweDAzIH0sCisgIHsgMHg4MDlhLCAiUzE2X01JWCIsMHgwMyB9LAorICB7IDB4ODBiYiwgIlMxNl9VUFNSQyIsMHgwMyB9LAorICB7IDB4ODEzYiwgIk1JWDNfRVhQIiwweDAzIH0sCisgIHsgMHg4MTY0LCAiREVDSU1BVEVCWVBPVzIiLDB4MDMgfSwKKyAgeyAweDgxOTcsICJWQVJJREVDSU1BVEUiLDB4MDMgfSwKKyAgeyAweDgxZjIsICJfM0RJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyMGEsICJfM0RQUkxHQ0lOUFRBU0siLDB4MDMgfSwKKyAgeyAweDgyMjcsICJfM0RTVEVSRU9JTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyNDIsICJfM0RPVVRQVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MmM0LCAiSFJURl9NT1JQSF9UQVNLIiwweDAzIH0sCisgIHsgMHg4MmM2LCAiV0FJVDREQVRBIiwweDAzIH0sCisgIHsgMHg4MmZhLCAiUFJPTE9HSUMiLDB4MDMgfSwKKyAgeyAweDg0OTYsICJERUNPUlJFTEFUT1IiLDB4MDMgfSwKKyAgeyAweDg0YTQsICJTVEVSRU8yTU9OTyIsMHgwMyB9LAorICB7IDB4MDAwMCwgIk9WRVJMQVlCRUdJTkFERFJFU1MiLDB4MDAgfSwKKyAgeyAweDAwMDAsICJETUFSRUFERVIiLDB4MDMgfSwKKyAgeyAweDAwMTgsICIjQ09ERV9FTkQiLDB4MDAgfSwKK307IC8qIGN3Y2RtYSBzeW1ib2xzICovCisKK3N0YXRpYyB1MzIgY3djZG1hX2NvZGVbXSA9IHsKKy8qIE9WRVJMQVlCRUdJTkFERFJFU1MgKi8KKy8qIDAwMDAgKi8gMHgwMDAwMjczMSwweDAwMDAxNDAwLDB4MDAwNGMxMDgsMHgwMDBlNTA0NCwKKy8qIDAwMDIgKi8gMHgwMDA1ZjYwOCwweDAwMDAwMDAwLDB4MDAwMDA3YWUsMHgwMDBiZTMwMCwKKy8qIDAwMDQgKi8gMHgwMDA1ODYzMCwweDAwMDAxNDAwLDB4MDAwN2FmYjAsMHgwMDBlOTU4NCwKKy8qIDAwMDYgKi8gMHgwMDAwNzMwMSwweDAwMGE5ODQwLDB4MDAwNWU3MDgsMHgwMDBjZDEwNCwKKy8qIDAwMDggKi8gMHgwMDA2NzAwOCwweDAwMDAwMDAwLDB4MDAwOTAyYTAsMHgwMDAwMTAwMCwKKy8qIDAwMEEgKi8gMHgwMDAxMmEwMSwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMEMgKi8gMHgwMDAyMTg0MywweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAwMEUgKi8gMHgwMDAwZTEwMSwweDAwMGMwMDAwLDB4MDAwMDBjYWMsMHgwMDAwMDAwMCwKKy8qIDAwMTAgKi8gMHgwMDA4MDAwMCwweDAwMGU1Y2ExLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAwMTIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA5MmMwMCwKKy8qIDAwMTQgKi8gMHgwMDAxMjJjMSwweDAwMGU1MDg0LDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwKKy8qIDAwMTYgKi8gMHgwMDBkNzQ4OCwweDAwMGU0NzgyLDB4MDAwMDc0MDEsMHgwMDAxYzEwMAorfTsKKworLyogI0NPREVfRU5EICovCisKK3N0YXRpYyBzZWdtZW50X2Rlc2NfdCBjd2NkbWFfc2VnbWVudHNbXSA9IHsKKyAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDB4MDAwMDAwMzAsIGN3Y2RtYV9jb2RlIH0sCit9OworCitzdGF0aWMgZHNwX21vZHVsZV9kZXNjX3QgY3djZG1hX21vZHVsZSA9IHsKKyAgImN3Y2RtYSIsCisgIHsKKyAgICAyNywKKyAgICBjd2NkbWFfc3ltYm9scworICB9LAorICAxLAorICBjd2NkbWFfc2VnbWVudHMsCit9OworCisjZW5kaWYgLyogX19IRUFERVJfY3djZG1hX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2VtYjgwLmggYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djZW1iODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjEzNTUxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2VtYjgwLmgKQEAgLTAsMCArMSwxNjA3IEBACisvKiBnZW5lcmF0ZWQgZnJvbSBjd2NlbWI4MC5vc3AgRE8gTk9UIE1PRElGWSAqLworCisjaWZuZGVmIF9fSEVBREVSX2N3Y2VtYjgwX0hfXworI2RlZmluZSBfX0hFQURFUl9jd2NlbWI4MF9IX18KKworc3RhdGljIHN5bWJvbF9lbnRyeV90IGN3Y2VtYjgwX3N5bWJvbHNbXSA9IHsKKyAgeyAweDAwMDAsICJCRUdJTkFERFJFU1MiLDB4MDAgfSwKKyAgeyAweDgwMDAsICJFWEVDQ0hJTEQiLDB4MDMgfSwKKyAgeyAweDgwMDEsICJFWEVDQ0hJTERfOTgiLDB4MDMgfSwKKyAgeyAweDgwMDMsICJFWEVDQ0hJTERfUFVTSDFJTkQiLDB4MDMgfSwKKyAgeyAweDgwMDgsICJFWEVDU0lCTElORyIsMHgwMyB9LAorICB7IDB4ODAwYSwgIkVYRUNTSUJMSU5HXzI5OCIsMHgwMyB9LAorICB7IDB4ODAwYiwgIkVYRUNTSUJMSU5HXzJJTkQxIiwweDAzIH0sCisgIHsgMHg4MDEwLCAiVElNSU5HTUFTVEVSIiwweDAzIH0sCisgIHsgMHg4MDRmLCAiUzE2X0NPREVDSU5QVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MDVlLCAiUENNU0VSSUFMSU5QVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MDZkLCAiUzE2X01JWF9UT19PU1RSRUFNIiwweDAzIH0sCisgIHsgMHg4MDlhLCAiUzE2X01JWCIsMHgwMyB9LAorICB7IDB4ODBiYiwgIlMxNl9VUFNSQyIsMHgwMyB9LAorICB7IDB4ODEzYiwgIk1JWDNfRVhQIiwweDAzIH0sCisgIHsgMHg4MTY0LCAiREVDSU1BVEVCWVBPVzIiLDB4MDMgfSwKKyAgeyAweDgxOTcsICJWQVJJREVDSU1BVEUiLDB4MDMgfSwKKyAgeyAweDgxZjIsICJfM0RJTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyMGEsICJfM0RQUkxHQ0lOUFRBU0siLDB4MDMgfSwKKyAgeyAweDgyMjcsICJfM0RTVEVSRU9JTlBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDgyNDIsICJfM0RPVVRQVVRUQVNLIiwweDAzIH0sCisgIHsgMHg4MmM0LCAiSFJURl9NT1JQSF9UQVNLIiwweDAzIH0sCisgIHsgMHg4MmM2LCAiV0FJVDREQVRBIiwweDAzIH0sCisgIHsgMHg4MmZhLCAiUFJPTE9HSUMiLDB4MDMgfSwKKyAgeyAweDg0OTYsICJERUNPUlJFTEFUT1IiLDB4MDMgfSwKKyAgeyAweDg0YTQsICJTVEVSRU8yTU9OTyIsMHgwMyB9LAorICB7IDB4MDA3MCwgIlNQT1NDQiIsMHgwMiB9LAorICB7IDB4MDEwNSwgIlRBU0tUUkVFVEhSRUFEIiwweDAzIH0sCisgIHsgMHgwMTM2LCAiVEFTS1RSRUVIRUFERVJDT0RFIiwweDAzIH0sCisgIHsgMHgwMTNmLCAiRkdUQVNLVFJFRUhFQURFUkNPREUiLDB4MDMgfSwKKyAgeyAweDAxNjMsICJOVUxMQUxHT1JJVEhNIiwweDAzIH0sCisgIHsgMHgwMTY3LCAiSEZHRVhFQ0NISUxEIiwweDAzIH0sCisgIHsgMHgwMTY4LCAiSEZHRVhFQ0NISUxEXzk4IiwweDAzIH0sCisgIHsgMHgwMTZhLCAiSEZHRVhFQ0NISUxEX1BVU0gxSU5EIiwweDAzIH0sCisgIHsgMHgwMTZkLCAiSEZHRVhFQ1NJQkxJTkciLDB4MDMgfSwKKyAgeyAweDAxNmYsICJIRkdFWEVDU0lCTElOR18yOTgiLDB4MDMgfSwKKyAgeyAweDAxNzAsICJIRkdFWEVDU0lCTElOR18ySU5EMSIsMHgwMyB9LAorICB7IDB4MDE3MywgIlMxNl9DT0RFQ09VVFBVVFRBU0siLDB4MDMgfSwKKyAgeyAweDAxOGUsICIjQ09ERV9FTkQiLDB4MDAgfSwKK307IC8qIGN3Y2VtYjgwIHN5bWJvbHMgKi8KKworc3RhdGljIHUzMiBjd2NlbWI4MF9jb2RlW10gPSB7CisvKiBCRUdJTkFERFJFU1MgKi8KKy8qIDAwMDAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMDIgKi8gMHgwMDAwMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMDQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMDYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMDggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMEEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMEMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMEUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMTIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMTYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMTggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMUEgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMUMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKy8qIDAwMUUgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKy8qIDAwMjAgKi8gMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwOWM3MzAsMHgwMDAwMTAwMywKKy8qIDAwMjIgKi8gMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKy8qIDAwMjQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMjYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMjggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMkEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMkMgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMkUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzAgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMzIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwMzYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwMzggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwM0EgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwM0MgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKy8qIDAwM0UgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKy8qIDAwNDAgKi8gMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKKy8qIDAwNDIgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDQgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDYgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKy8qIDAwNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwZjYxOWMsMHgwMDAwMTAwMywKKy8qIDAwNEEgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKKy8qIDAwNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNEUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTAgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTIgKi8gMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTQgKi8gMHgwMDBlZTE5YywweDAwMDAxMDAzLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNTYgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNUEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3M2MsMHgwMDAwMTAwMCwKKy8qIDAwNUMgKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwZTY3OWUsMHgwMDAwMTAwMywKKy8qIDAwNUUgKi8gMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKKy8qIDAwNjAgKi8gMHgwMDA4N2ZjMSwweDAwMGMzYmUwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNjIgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjYgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE3MzAsMHgwMDAwMTAwMywKKy8qIDAwNjggKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKKy8qIDAwNkEgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNkUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAwNzAgKi8gMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKKy8qIDAwNzIgKi8gMHgwMDA0YTczMCwweDAwMDAxMDAzLDB4MDAwMDBmNDEsMHgwMDA5NzE0MCwKKy8qIDAwNzQgKi8gMHgwMDAwYTg0MSwweDAwMDliMjQwLDB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwKKy8qIDAwNzYgKi8gMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKKy8qIDAwNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMWJmMDUsMHgwMDAzZmM0MCwKKy8qIDAwN0EgKi8gMHgwMDAwMjcyNSwweDAwMGFhNDAwLDB4MDAwMTM3MDUsMHgwMDA5M2EwMCwKKy8qIDAwN0MgKi8gMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKKy8qIDAwN0UgKi8gMHgwMDA0ZWYwYSwweDAwMGViNzg1LDB4MDAwM2ZjOGEsMHgwMDAwMDAwMCwKKy8qIDAwODAgKi8gMHgwMDAwMDAwMCwweDAwMGM3MGUwLDB4MDAwN2QxODIsMHgwMDAyYzY0MCwKKy8qIDAwODIgKi8gMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKKy8qIDAwODQgKi8gMHgwMDAzMTcwNSwweDAwMDkyMjQwLDB4MDAwMzlmMDUsMHgwMDA5MzJjMCwKKy8qIDAwODYgKi8gMHgwMDAzNTIwYSwweDAwMDAwMDAwLDB4MDAwNDA3MzEsMHgwMDAwMTAwYiwKKy8qIDAwODggKi8gMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKy8qIDAwOEEgKi8gMHgwMDAzMjEwOCwweDAwMGM2MGM0LDB4MDAwNjUyMDgsMHgwMDBjMjkxNywKKy8qIDAwOEMgKi8gMHgwMDA0MDZiMCwweDAwMDAxMDA3LDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKKy8qIDAwOEUgKi8gMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKKy8qIDAwOTAgKi8gMHgwMDA0MDYzMCwweDAwMDAxMDA3LDB4MDAwMjk3MDUsMHgwMDBjMDAwMCwKKy8qIDAwOTIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDAzZmM0MCwKKy8qIDAwOTQgKi8gMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKKy8qIDAwOTYgKi8gMHgwMDAwMzdjMSwweDAwMDk1N2MwLDB4MDAwMDNmYzEsMHgwMDA5NTFjMCwKKy8qIDAwOTggKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5OTFjMCwKKy8qIDAwOUEgKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKKy8qIDAwOUMgKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMWNjYzEsMHgwMDA5MTVjMCwKKy8qIDAwOUUgKi8gMHgwMDAxYzQ0MSwweDAwMDlkODAwLDB4MDAwOWNkYzEsMHgwMDA5MTI0MCwKKy8qIDAwQTAgKi8gMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKKy8qIDAwQTIgKi8gMHgwMDAxYzc0MSwweDAwMDk1YzgwLDB4MDAwZThjYTksMHgwMDA5OTI0MCwKKy8qIDAwQTQgKi8gMHgwMDBlODVhZCwweDAwMDk1NjQwLDB4MDAwNjljYTksMHgwMDA5OWQ4MCwKKy8qIDAwQTYgKi8gMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKKy8qIDAwQTggKi8gMHgwMDBlYTVhZCwweDAwMDkxYTQwLDB4MDAwNmJjYTksMHgwMDA5ZGU4MCwKKy8qIDAwQUEgKi8gMHgwMDBlYjUyZCwweDAwMDk1YTQwLDB4MDAwZWNjYTksMHgwMDA5OWFjMCwKKy8qIDAwQUMgKi8gMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKKy8qIDAwQUUgKi8gMHgwMDBhNmUwYSwweDAwMDAxMDAwLDB4MDAwZWQ1MmQsMHgwMDA5MWU0MCwKKy8qIDAwQjAgKi8gMHgwMDBlZWNhOSwweDAwMDk1ZWMwLDB4MDAwZWU1YWQsMHgwMDA5OWU0MCwKKy8qIDAwQjIgKi8gMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKKy8qIDAwQjQgKi8gMHgwMDBlZjUyZCwweDAwMDlkZTQwLDB4MDAwNjhjYTksMHgwMDA5MTJjMSwKKy8qIDAwQjYgKi8gMHgwMDA2ODNhZCwweDAwMDk1MjQxLDB4MDAwMjBmMDUsMHgwMDA5OTFjMSwKKy8qIDAwQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKKy8qIDAwQkEgKi8gMHgwMDA5Y2Y4MSwweDAwMGI1MzQwLDB4MDAwOWM3MDEsMHgwMDBiOTJjMCwKKy8qIDAwQkMgKi8gMHgwMDA5ZGU4MSwweDAwMGJkMzAwLDB4MDAwOWQ2MDEsMHgwMDBiMTcwMCwKKy8qIDAwQkUgKi8gMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKKy8qIDAwQzAgKi8gMHgwMDBhMGY4MSwweDAwMGJkNzQwLDB4MDAwMjA3MDEsMHgwMDBiNWM4MCwKKy8qIDAwQzIgKi8gMHgwMDBhMTY4MSwweDAwMGI5N2MwLDB4MDAwMjE2MDEsMHgwMDAwMjUwMCwKKy8qIDAwQzQgKi8gMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKKy8qIDAwQzYgKi8gMHgwMDAyMTY4MSwweDAwMDAyZDAwLDB4MDAwMjBmODEsMHgwMDBiZDgwMCwKKy8qIDAwQzggKi8gMHgwMDBhMDcwMSwweDAwMGI1YmMwLDB4MDAwMjE2MDEsMHgwMDAwMzUwMCwKKy8qIDAwQ0EgKi8gMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKKy8qIDAwQ0MgKi8gMHgwMDAyMTY4MSwweDAwMDAzZDAwLDB4MDAwMjBmODEsMHgwMDBiMWQwMCwKKy8qIDAwQ0UgKi8gMHgwMDBhMDcwMSwweDAwMGIxZmMwLDB4MDAwMjE2MDEsMHgwMDAyMDUwMCwKKy8qIDAwRDAgKi8gMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKKy8qIDAwRDIgKi8gMHgwMDAyMTY4MSwweDAwMDIwZDAwLDB4MDAwMjBmODEsMHgwMDBiZGU4MCwKKy8qIDAwRDQgKi8gMHgwMDBhMDcwMSwweDAwMGJkZmMwLDB4MDAwMjE2MDEsMHgwMDAyMTUwMCwKKy8qIDAwRDYgKi8gMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKKy8qIDAwRDggKi8gMHgwMDAyMTY4MSwweDAwMDIxZDAwLDB4MDAwYTBmODEsMHgwMDBkMDM4MCwKKy8qIDAwREEgKi8gMHgwMDAwYjYwMSwweDAwMGIxNWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKKy8qIDAwREMgKi8gMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKKy8qIDAwREUgKi8gMHgwMDAwN2I4MSwweDAwMGI5MWMwLDB4MDAwMDdiMDEsMHgwMDBiNTdjMCwKKy8qIDAwRTAgKi8gMHgwMDAwN2I4MSwweDAwMGI1MWMwLDB4MDAwMDdiMDEsMHgwMDBiMWI0MCwKKy8qIDAwRTIgKi8gMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKKy8qIDAwRTQgKi8gMHgwMDA3ZTQ4OCwweDAwMGQ3ZTQ1LDB4MDAwMDAwMDAsMHgwMDBkN2E0NCwKKy8qIDAwRTYgKi8gMHgwMDA3ZTQ4YSwweDAwMDAwMDAwLDB4MDAwMTFmMDUsMHgwMDA4NDA4MCwKKy8qIDAwRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKKy8qIDAwRUEgKi8gMHgwMDAwOGEwMSwweDAwMGJmMDQwLDB4MDAwMDcwODEsMHgwMDBiYjVjMCwKKy8qIDAwRUMgKi8gMHgwMDA1NTQ4OCwweDAwMDAwMDAwLDB4MDAwMGQ0ODIsMHgwMDAzZmM0MCwKKy8qIDAwRUUgKi8gMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKKy8qIDAwRjAgKi8gMHgwMDAxZWM4MSwweDAwMGJkNmMwLDB4MDAwNGVmMDgsMHgwMDBlYjc4NCwKKy8qIDAwRjIgKi8gMHgwMDBjODZiMCwweDAwMDAxMDA3LDB4MDAwMDgyODEsMHgwMDBiYjI0MCwKKy8qIDAwRjQgKi8gMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKKy8qIDAwRjYgKi8gMHgwMDAwMDczYywweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKKy8qIDAwRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNTUyODgsMHgwMDBjNTU1YywKKy8qIDAwRkEgKi8gMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKKy8qIDAwRkMgKi8gMHgwMDAwZmE4OCwweDAwMDAwMDAwLDB4MDAwMDAwMzIsMHgwMDAwMTAwMCwKKy8qIDAwRkUgKi8gMHgwMDAwMDczZCwweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKKy8qIDAxMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKKy8qIDAxMDIgKi8gMHgwMDAwMjcwNSwweDAwMDAxMDA4LDB4MDAwOGIyMDEsMHgwMDBjMTM5MiwKKy8qIDAxMDQgKi8gMHgwMDAwYmEwMSwweDAwMDAwMDAwLAorLyogVEFTS1RSRUVUSFJFQUQgKi8KKy8qIDAxMDUgKi8gMHgwMDAwODczMSwweDAwMDAxNDAwLDB4MDAwNGMxMDgsMHgwMDBmZTBjNCwKKy8qIDAxMDcgKi8gMHgwMDA1NzQ4OCwweDAwMDAwMDAwLDB4MDAwYTYzODgsMHgwMDAwMTAwMSwKKy8qIDAxMDkgKi8gMHgwMDA4YjMzNCwweDAwMGJjMTQxLDB4MDAwMzAyMGUsMHgwMDAwMDAwMCwKKy8qIDAxMEIgKi8gMHgwMDA4ODZiMCwweDAwMDAxMDA4LDB4MDAwMDM2MjUsMHgwMDBjNWRmYSwKKy8qIDAxMEQgKi8gMHgwMDBhNjM4YSwweDAwMDAxMDAxLDB4MDAwODAyMGUsMHgwMDAwMTAwMiwKKy8qIDAxMEYgKi8gMHgwMDA4YTZiMCwweDAwMDAxMDA4LDB4MDAwN2YzMDEsMHgwMDAwMDAwMCwKKy8qIDAxMTEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3MjUsMHgwMDBhOGM0MCwKKy8qIDAxMTMgKi8gMHgwMDAwMDBhZSwweDAwMDAwMDAwLDB4MDAwZDg2MzAsMHgwMDAwMTAwOCwKKy8qIDAxMTUgKi8gMHgwMDAwMDAwMCwweDAwMGM3NGUwLDB4MDAwN2QxODIsMHgwMDAyZDY0MCwKKy8qIDAxMTcgKi8gMHgwMDBhODYzMCwweDAwMDAxMDA4LDB4MDAwNzk5YjgsMHgwMDAyZDZjMCwKKy8qIDAxMTkgKi8gMHgwMDAwNzQ4YSwweDAwMGMzZWM1LDB4MDAwNzQyMGEsMHgwMDBjMDAwMCwKKy8qIDAxMUIgKi8gMHgwMDA2MjIwOCwweDAwMGM0MTE3LDB4MDAwNzA2MzAsMHgwMDAwMTAwOSwKKy8qIDAxMUQgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMTAyMmUsMHgwMDAwMDAwMCwKKy8qIDAxMUYgKi8gMHgwMDAzYTYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAxMjEgKi8gMHgwMDAwMDAzNiwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMmE3MzAsMHgwMDAwMTAwOCwKKy8qIDAxMjcgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKKy8qIDAxMjkgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMkIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMkQgKi8gMHgwMDAyYTczMCwweDAwMDAxMDA4LDB4MDAwMDAwMzMsMHgwMDAwMTAwMCwKKy8qIDAxMkYgKi8gMHgwMDAyYTcwNSwweDAwMDAxMDA4LDB4MDAwMDdhMDEsMHgwMDBjMDAwMCwKKy8qIDAxMzEgKi8gMHgwMDBlNjI4OCwweDAwMGQ1NTBhLDB4MDAwNjQyOGEsMHgwMDAwMDAwMCwKKy8qIDAxMzMgKi8gMHgwMDA2MDczMCwweDAwMDAxMDBhLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKKy8qIDAxMzUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogVEFTS1RSRUVIRUFERVJDT0RFICovCisvKiAwMTM2ICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDc4ZmIwLDB4MDAwMDEwMGIsCisvKiAwMTM4ICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisvKiAwMTNBICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMDc4NmIwLDB4MDAwMDEwMGIsCisvKiAwMTNDICovIDB4MDAwMjJmMDUsMHgwMDBjMzU0NSwweDAwMDBlYjhhLDB4MDAwMDAwMDAsCisvKiAwMTNFICovIDB4MDAwNDI3MzEsMHgwMDAwMTAwMywKKy8qIEZHVEFTS1RSRUVIRUFERVJDT0RFICovCisvKiAwMTNGICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDQ4ZmIwLDB4MDAwMDEwMGEsCisvKiAwMTQxICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisvKiAwMTQzICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMDgwNmIwLDB4MDAwMDEwMGIsCisvKiAwMTQ1ICovIDB4MDAwMjJmMDUsMHgwMDAwMDAwMCwweDAwMDA3NDAxLDB4MDAwOTExNDAsCisvKiAwMTQ3ICovIDB4MDAwNDhmMDUsMHgwMDA5NTFjMCwweDAwMDQyNzMxLDB4MDAwMDEwMDMsCisvKiAwMTQ5ICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCisvKiAwMTRCICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMGZlMTllLDB4MDAwMDEwMDMsCisvKiAwMTREICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDhlMTljLDB4MDAwMDEwMDMsCisvKiAwMTRGICovIDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwweDAwMDAwZjQxLDB4MDAwOTcxNDAsCisvKiAwMTUxICovIDB4MDAwMGE4NDEsMHgwMDA5YjI0MCwweDAwMDBhMGMxLDB4MDAwOWYwNDAsCisvKiAwMTUzICovIDB4MDAwMWM2NDEsMHgwMDA5MzU0MCwweDAwMDFjZWMxLDB4MDAwOWI1YzAsCisvKiAwMTU1ICovIDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwweDAwMDU1MjA4LDB4MDAwMDAwMDAsCisvKiAwMTU3ICovIDB4MDAwMTA3MDUsMHgwMDBhMjg4MCwweDAwMDBhMjNhLDB4MDAwOTNhMDAsCisvKiAwMTU5ICovIDB4MDAwM2ZjOGEsMHgwMDBkZjZjNSwweDAwMDRlZjBhLDB4MDAwYzAwMDAsCisvKiAwMTVCICovIDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwweDAwMDY1MzA4LDB4MDAwYzI5OTcsCisvKiAwMTVEICovIDB4MDAwZDg2YjAsMHgwMDAwMTAwYSwweDAwMDQ0MTBhLDB4MDAwZDQwYzcsCisvKiAwMTVGICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDgwNzMwLDB4MDAwMDEwMDQsCisvKiAwMTYxICovIDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKiBOVUxMQUxHT1JJVEhNICovCisvKiAwMTYzICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCisvKiAwMTY1ICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMDAyNzNkLDB4MDAwMDEwMDAsCisvKiBIRkdFWEVDQ0hJTEQgKi8KKy8qIDAxNjcgKi8gMHgwMDAwMDAwMCwweDAwMGViYTQ0LAorLyogSEZHRVhFQ0NISUxEXzk4ICovCisvKiAwMTY4ICovIDB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCisvKiBIRkdFWEVDQ0hJTERfUFVTSDFJTkQgKi8KKy8qIDAxNkEgKi8gMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKKy8qIDAxNkMgKi8gMHgwMDAwNmE4OCwweDAwMGM3NWM0LAorLyogSEZHRVhFQ1NJQkxJTkcgKi8KKy8qIDAxNkQgKi8gMHgwMDAwMDAwMCwweDAwMGU1MDg0LDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKy8qIEhGR0VYRUNTSUJMSU5HXzI5OCAqLworLyogMDE2RiAqLyAweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCisvKiBIRkdFWEVDU0lCTElOR18ySU5EMSAqLworLyogMDE3MCAqLyAweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorLyogMDE3MiAqLyAweDAwMDA2YTg4LDB4MDAwYzc1YzQsCisvKiBTMTZfQ09ERUNPVVRQVVRUQVNLICovCisvKiAwMTczICovIDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwweDAwMDdlNzIxLDB4MDAwYmVkNDAsCisvKiAwMTc1ICovIDB4MDAwMDVmMjUsMHgwMDBiYWRjMCwweDAwMDNiYTk3LDB4MDAwYmViODAsCisvKiAwMTc3ICovIDB4MDAwNjU1OTAsMHgwMDBiMmUwMCwweDAwMDMzMjE3LDB4MDAwMDNlYzAsCisvKiAwMTc5ICovIDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwweDAwMDNlZDgwLDB4MDAwNDkxYzAsCisvKiAwMTdCICovIDB4MDAwNzNmYjAsMHgwMDA3NGM4MCwweDAwMDI4M2EwLDB4MDAwMDEwMGMsCisvKiAwMTdEICovIDB4MDAwZWUzODgsMHgwMDA0Mjk3MCwweDAwMDA4MzAxLDB4MDAwMjFlZjIsCisvKiAwMTdGICovIDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwweDAwMGM0ZDhkLDB4MDAwMDAwMWIsCisvKiAwMTgxICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDAzMmFjLDB4MDAwYzM5MTYsCisvKiAwMTgzICovIDB4MDAwNGVkYzIsMHgwMDA3NGM4MCwweDAwMDc4ODk4LDB4MDAwMDEwMDAsCisvKiAwMTg1ICovIDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwweDAwMGM0ZDhkLDB4MDAwOTJlMWIsCisvKiAwMTg3ICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDRlZGMyLDB4MDAwYzE5NTYsCisvKiAwMTg5ICovIDB4MDAwMDcyMmMsMHgwMDAzNGEwMCwweDAwMDQxNzA1LDB4MDAwOWVkNDAsCisvKiAwMThCICovIDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwweDAwMGQ3NDg4LDB4MDAwYzNhMDAsCisvKiAwMThEICovIDB4MDAwNDhmMDUsMHgwMDAwMDAwMAorfTsKKy8qICNDT0RFX0VORCAqLworCitzdGF0aWMgdTMyIGN3Y2VtYjgwX3BhcmFtZXRlcltdID0geworLyogMDAwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDAwMDAwMDAwLAorLyogMDAwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAxOCAqLyAweDAwMDAwMDAwLDB4MDAyMDAwNDAsMHgwMDAwODAxMCwweDAwMDAwMDAwLAorLyogMDAxQyAqLyAweDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAorLyogMDAyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAyOCAqLyAweDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAorLyogMDAyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMTAsMHgwMDgwMDAwMCwweDAwOTAwMDAwLAorLyogMDAzMCAqLyAweGYyYzAwMDBmLDB4MDAwMDAyMDAsMHgwMDAwMDAwMCwweDAwMDEwNjAwLAorLyogMDAzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDAzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDMzMDMwMGMyLAorLyogMDAzQyAqLyAweDA2MDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAorLyogMDA0MCAqLyAweDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAorLyogMDA0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA0OCAqLyAweDAwMDAwMDAwLDB4MDBiMDAwMDAsMHgwMGQwODA2ZCwweDMzMDQ4MGMzLAorLyogMDA0QyAqLyAweDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAorLyogMDA1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA3MCAqLyAweDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAorLyogMDA3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDczNWEsMHgwMDAwMDYwMCwweDAwMDAwMDAwLAorLyogMDA3OCAqLyAweDkyOWQ3MzVhLDB4MDAwMDAwMDAsMHgwMDAxMDAwMCwweDczNWE3MzVhLAorLyogMDA3QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDA4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAorLyogMDA4QyAqLyAweDA1MDAwMDAwLDB4MDBhMDAwMTAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLAorLyogMDA5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDcwMCwweDAwMDAwMDAwLAorLyogMDA5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDA5OCAqLyAweDAwMDAwMDgwLDB4MDBhMDAwMDAsMHgwMDAwODA5YSwweDAwMDAwMGMyLAorLyogMDA5QyAqLyAweDA3NDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorLyogMDBBMCAqLyAweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAorLyogMDBBNCAqLyAweDAwYzgwMDI4LDB4MDAwMDAwYzIsMHgwNjgwMDAwMCwweDAwMDAwMDAwLAorLyogMDBBOCAqLyAweDA2ZTAwMDgwLDB4MDAzMDAwMDAsMHgwMDAwODBiYiwweDAwMDAwMGM5LAorLyogMDBBQyAqLyAweDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorLyogMDBCMCAqLyAweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDAwNzgwLAorLyogMDBCNCAqLyAweDAwYzgwMDI4LDB4MDAwMDAwYzUsMHhmZjgwMDAwMCwweDAwMDAwMDAwLAorLyogMDBCOCAqLyAweDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAorLyogMDBCQyAqLyAweDA3ODAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorLyogMDBDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA1ZSwweDAwMDAwMGMxLAorLyogMDBDQyAqLyAweDAwMDAwMDAwLDB4MDA4MDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAorLyogMDBEMCAqLyAweDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDBGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDExMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDExNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDExOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDExQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDEzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDE5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDFGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDIzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDI5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDJGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDMzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDM5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDNGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDQ5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDREMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDREOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDREQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDRGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDUzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDU5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDVGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDYwMCAqLyAweDkyOWQwNjAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQwMDAwLAorLyogMDYwNCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorLyogMDYwOCAqLyAweDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAorLyogMDYwQyAqLyAweDAwMDAwMDAxLDB4MDA3YTAwMDIsMHgwMDAwMDAwMCwweDA2NmUwNjEwLAorLyogMDYxMCAqLyAweDAxMDU5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorLyogMDYxNCAqLyAweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAorLyogMDYxOCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYxQyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYyMCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYyNCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYyOCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYyQyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDYzMCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweDczNWEwMDUxLAorLyogMDYzNCAqLyAweDAwMDAwMDAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorLyogMDYzOCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorLyogMDYzQyAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHgwMDAwMDAwMCwweDA2NDAwMTM2LAorLyogMDY0MCAqLyAweDAwMDAyNzBmLDB4MDAwMTAwMDAsMHgwMDdhMDAwMCwweDAwMDAwMDAwLAorLyogMDY0NCAqLyAweDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorLyogMDY0OCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHhhNDMxYWM3NSwweDAwMDE3MzVhLAorLyogMDY0QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY1MCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY1NCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY1OCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY1QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY2MCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY2NCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorLyogMDY2OCAqLyAweDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyogMDY5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMAorfTsgLyogI1BBUkFNRVRFUl9FTkQgKi8KKworc3RhdGljIHUzMiBjd2NlbWI4MF9zYW1wbGVbXSA9IHsKKy8qIDAwMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAwRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAxRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAyRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDAzRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA0RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA1RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA2RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA3RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA4RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDA5RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBBRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBCRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBDRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBENzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBEREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qIDBERkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNAorfTsgLyogI1NBTVBMRV9FTkQgKi8KKworCitzdGF0aWMgc2VnbWVudF9kZXNjX3QgY3djZW1iODBfc2VnbWVudHNbXSA9IHsKKyAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDB4MDAwMDAzMWMsIGN3Y2VtYjgwX2NvZGUgfSwKKyAgeyBTRUdUWVBFX1NQX1BBUkFNRVRFUiwgMHgwMDAwMDAwMCwgMHgwMDAwMDY5NywgY3djZW1iODBfcGFyYW1ldGVyIH0sCisgIHsgU0VHVFlQRV9TUF9TQU1QTEUsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMDAsIGN3Y2VtYjgwX3NhbXBsZSB9LAorfTsKKworc3RhdGljIGRzcF9tb2R1bGVfZGVzY190IGN3Y2VtYjgwX21vZHVsZSA9IHsKKyAgImN3Y2VtYjgwIiwKKyAgeworICAgIDM4LAorICAgIGN3Y2VtYjgwX3N5bWJvbHMKKyAgfSwKKyAgMywKKyAgY3djZW1iODBfc2VnbWVudHMsCit9OworCisjZW5kaWYgLyogX19IRUFERVJfY3djZW1iODBfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djc25vb3AuaCBiL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2Nzbm9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djc25vb3AuaApAQCAtMCwwICsxLDQ2IEBACisvKiBnZW5lcmF0ZWQgZnJvbSBjd2Nzbm9vcC5vc3AgRE8gTk9UIE1PRElGWSAqLworCisjaWZuZGVmIF9fSEVBREVSX2N3Y3Nub29wX0hfXworI2RlZmluZSBfX0hFQURFUl9jd2Nzbm9vcF9IX18KKworc3RhdGljIHN5bWJvbF9lbnRyeV90IGN3Y3Nub29wX3N5bWJvbHNbXSA9IHsKKyAgeyAweDA1MDAsICJPVkVSTEFZQkVHSU5BRERSRVNTIiwweDAwIH0sCisgIHsgMHgwNTAwLCAiT1VUUFVUU05PT1AiLDB4MDMgfSwKKyAgeyAweDA1MWYsICIjQ09ERV9FTkQiLDB4MDAgfSwKK307IC8qIGN3Y3Nub29wIHN5bWJvbHMgKi8KKworc3RhdGljIHUzMiBjd2Nzbm9vcF9jb2RlW10gPSB7CisvKiAwMDAwICovIDB4MDAwN2JmYjAsMHgwMDBiNGU0MCwweDAwMDdjMDg4LDB4MDAwYzA2MTcsCisvKiAwMDAyICovIDB4MDAwNDk3MDUsMHgwMDAwMDAwMCwweDAwMDgwNjMwLDB4MDAwMDEwMjgsCisvKiAwMDA0ICovIDB4MDAwNzY0MDgsMHgwMDBlZmI4NCwweDAwMDY2MDA4LDB4MDAwMDAwMDAsCisvKiAwMDA2ICovIDB4MDAwN2M5MDgsMHgwMDBjMDAwMCwweDAwMDQ2NzI1LDB4MDAwZWZhNDQsCisvKiAwMDA4ICovIDB4MDAwNWY3MDgsMHgwMDAwMDAwMCwweDAwMDFkNDAyLDB4MDAwYjJlMDAsCisvKiAwMDBBICovIDB4MDAwM2Q0MTgsMHgwMDAwMTAwMCwweDAwMDhkNTc0LDB4MDAwYzQyOTMsCisvKiAwMDBDICovIDB4MDAwNjU2MjUsMHgwMDBlYTMwZSwweDAwMDk2YzAxLDB4MDAwYzZmOTIsCisvKiAwMDBFICovIDB4MDAwNmE1OGEsMHgwMDBmNjA4NSwweDAwMDAyZjQzLDB4MDAwMDAwMDAsCisvKiAwMDEwICovIDB4MDAwYTgzYTAsMHgwMDAwMTAyOCwweDAwMDVlNjA4LDB4MDAwYzAwMDAsCisvKiAwMDEyICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGNhMTA4LDB4MDAwZGNjYTEsCisvKiAwMDE0ICovIDB4MDAwMDNiYWMsMHgwMDBmYjIwNSwweDAwMDczODQzLDB4MDAwMDAwMDAsCisvKiAwMDE2ICovIDB4MDAwZDg3MzAsMHgwMDAwMTAyOCwweDAwMDY2MDBhLDB4MDAwYzAwMDAsCisvKiAwMDE4ICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwZTUwODQsCisvKiAwMDFBICovIDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCisvKiAwMDFDICovIDB4MDAwMDA3MzQsMHgwMDAwMTAwMCwweDAwMDEwNzA1LDB4MDAwYTY4ODAsCisvKiAwMDFFICovIDB4MDAwMDZhODgsMHgwMDBjNzVjNAorfTsKKy8qICNDT0RFX0VORCAqLworCitzdGF0aWMgc2VnbWVudF9kZXNjX3QgY3djc25vb3Bfc2VnbWVudHNbXSA9IHsKKyAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDB4MDAwMDAwM2UsIGN3Y3Nub29wX2NvZGUgfSwKK307CisKK3N0YXRpYyBkc3BfbW9kdWxlX2Rlc2NfdCBjd2Nzbm9vcF9tb2R1bGUgPSB7CisgICJjd2Nzbm9vcCIsCisgIHsKKyAgICAzLAorICAgIGN3Y3Nub29wX3N5bWJvbHMKKyAgfSwKKyAgMSwKKyAgY3djc25vb3Bfc2VnbWVudHMsCit9OworCisjZW5kaWYgLyogX19IRUFERVJfY3djc25vb3BfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9lbXUxMGsxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjFjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACisjCisjIE1ha2VmaWxlIGZvciBBTFNBCisjIENvcHlyaWdodCAoYykgMjAwMSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisjCisKK3NuZC1lbXUxMGsxLW9ianMgOj0gZW11MTBrMS5vIGVtdTEwazFfbWFpbi5vIFwKKwkJICAgIGlycS5vIG1lbW9yeS5vIHZvaWNlLm8gZW11bXB1NDAxLm8gZW11cGNtLm8gaW8ubyBcCisJCSAgICBlbXVwcm9jLm8gZW11bWl4ZXIubyBlbXVmeC5vIHRpbWVyLm8gcDE2di5vCitzbmQtZW11MTBrMS1zeW50aC1vYmpzIDo9IGVtdTEwazFfc3ludGgubyBlbXUxMGsxX2NhbGxiYWNrLm8gZW11MTBrMV9wYXRjaC5vCitzbmQtZW11MTBrMXgtb2JqcyA6PSBlbXUxMGsxeC5vCisKKyMKKyMgdGhpcyBmdW5jdGlvbiByZXR1cm5zOgorIyAgICJtIiAtIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG0KKyMgICA8ZW1wdHkgc3RyaW5nPiAtIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIHVuZGVmaW5lZAorIyAgIG90aGVyd2lzZSBwYXJhbWV0ZXIgIzEgdmFsdWUKKyMKK3NlcXVlbmNlciA9ICQoaWYgJChzdWJzdCB5LCwkKENPTkZJR19TTkRfU0VRVUVOQ0VSKSksJChpZiAkKDEpLG0pLCQoaWYgJChDT05GSUdfU05EX1NFUVVFTkNFUiksJCgxKSkpCisKKyMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKK29iai0kKENPTkZJR19TTkRfRU1VMTBLMSkgKz0gc25kLWVtdTEwazEubworb2JqLSQoY2FsbCBzZXF1ZW5jZXIsJChDT05GSUdfU05EX0VNVTEwSzEpKSArPSBzbmQtZW11MTBrMS1zeW50aC5vCitvYmotJChDT05GSUdfU05EX0VNVTEwSzFYKSArPSBzbmQtZW11MTBrMXgubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDZhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiAgVGhlIGRyaXZlciBmb3IgdGhlIEVNVTEwSzEgKFNCIExpdmUhKSBiYXNlZCBzb3VuZGNhcmRzCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgQXVkaWd5IDIgVmFsdWUuCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVNVTEwSzEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0NyZWF0aXZlIExhYnMsU0IgTGl2ZSEvUENJNTEyL0UtbXUgQVBTfSwiCisJICAgICAgICJ7Q3JlYXRpdmUgTGFicyxTQiBBdWRpZ3l9fSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUikgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkpCisjZGVmaW5lIEVOQUJMRV9TWU5USAorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazFfc3ludGguaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZXh0aW5bU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKK3N0YXRpYyBpbnQgZXh0b3V0W1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07CitzdGF0aWMgaW50IHNlcV9wb3J0c1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDR9Oworc3RhdGljIGludCBtYXhfc3ludGhfdm9pY2VzW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNjR9Oworc3RhdGljIGludCBtYXhfYnVmZmVyX3NpemVbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxMjh9Oworc3RhdGljIGludCBlbmFibGVfaXJbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0aGUgRU1VMTBLMSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIHRoZSBFTVUxMEsxIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdGhlIEVNVTEwSzEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGV4dGluLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhleHRpbiwgIkF2YWlsYWJsZSBleHRlcm5hbCBpbnB1dHMgZm9yIEZYODAxMC4gWmVybz1kZWZhdWx0LiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGV4dG91dCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXh0b3V0LCAiQXZhaWxhYmxlIGV4dGVybmFsIG91dHB1dHMgZm9yIEZYODAxMC4gWmVybz1kZWZhdWx0LiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHNlcV9wb3J0cywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2VxX3BvcnRzLCAiQWxsb2NhdGVkIHNlcXVlbmNlciBwb3J0cyBmb3IgaW50ZXJuYWwgc3ludGhlc2l6ZXIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3N5bnRoX3ZvaWNlcywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3N5bnRoX3ZvaWNlcywgIk1heGltdW0gbnVtYmVyIG9mIHZvaWNlcyBmb3IgV2F2ZVRhYmxlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9idWZmZXJfc2l6ZSwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2J1ZmZlcl9zaXplLCAiTWF4aW11bSBzYW1wbGUgYnVmZmVyIHNpemUgaW4gTUIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlX2lyLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2lyLCAiRW5hYmxlIElSLiIpOworCisvKgorICogQ2xhc3MgMDQwMTogMTEwMjowMDA4IChyZXYgMDApIFN1YnN5c3RlbTogMTEwMjoxMDAxIC0+IEF1ZGlneTIgVmFsdWUgIE1vZGVsOlNCMDQwMAorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2VtdTEwazFfaWRzW10gPSB7CisJeyAweDExMDIsIDB4MDAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAkvKiBFTVUxMEsxICovCisJeyAweDExMDIsIDB4MDAwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAkvKiBBdWRpZ3kgKi8KKwl7IDB4MTEwMiwgMHgwMDA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCS8qIEF1ZGlneSAyIFZhbHVlIFNCMDQwMCAqLworCXsgMCwgfQorfTsKKworLyoKKyAqIEF1ZGlneSAyIFZhbHVlIG5vdGVzOgorICogQV9JT0NGRyBJbnB1dCAoR1BJTykKKyAqIDB4NDAwICA9IEZyb250IGFuYWxvZyBqYWNrIHBsdWdnZWQgaW4uIChHcmVlbiBzb2NrZXQpCisgKiAweDEwMDAgPSBSZWFkIGFuYWxvZyBqYWNrIHBsdWdnZWQgaW4uIChCbGFjayBzb2NrZXQpCisgKiAweDIwMDAgPSBDZW50ZXIvTEZFIGFuYWxvZyBqYWNrIHBsdWdnZWQgaW4uIChPcmFuZ2Ugc29ja2V0KQorICogQV9JT0NGRyBPdXRwdXQgKEdQSU8pCisgKiAweDYwID0gU291bmQgb3V0IG9mIGZyb250IExlZnQuCisgKiBXaW4gc2V0cyBpdCB0byAweFhYNjEKKyAqLworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2VtdTEwazFfaWRzKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NhcmRfZW11MTBrMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWVtdTEwazFfdCAqZW11OworI2lmZGVmIEVOQUJMRV9TWU5USAorCXNuZF9zZXFfZGV2aWNlX3QgKndhdmUgPSBOVUxMOworI2VuZGlmCisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisgICAgICAgIAlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobWF4X2J1ZmZlcl9zaXplW2Rldl0gPCAzMikKKwkJbWF4X2J1ZmZlcl9zaXplW2Rldl0gPSAzMjsKKwllbHNlIGlmIChtYXhfYnVmZmVyX3NpemVbZGV2XSA+IDEwMjQpCisJCW1heF9idWZmZXJfc2l6ZVtkZXZdID0gMTAyNDsKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2NyZWF0ZShjYXJkLCBwY2ksIGV4dGluW2Rldl0sIGV4dG91dFtkZXZdLAorCQkJCSAgICAgIChsb25nKW1heF9idWZmZXJfc2l6ZVtkZXZdICogMTAyNCAqIDEwMjQsCisJCQkJICAgICAgZW5hYmxlX2lyW2Rldl0sCisJCQkJICAgICAgJmVtdSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0JCQorCWlmICgoZXJyID0gc25kX2VtdTEwazFfcGNtKGVtdSwgMCwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0JCQorCWlmICgoZXJyID0gc25kX2VtdTEwazFfcGNtX21pYyhlbXUsIDEsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CQkKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX3BjbV9lZngoZW11LCAyLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCS8qIFRoaXMgc3RvcmVzIHRoZSBwZXJpb2RzIHRhYmxlLiAqLworCWlmIChlbXUtPmF1ZGlneSAmJiBlbXUtPnJldmlzaW9uID09IDQpIHsgLyogUDE2ViAqLwkKKwkJaWYoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwgMTAyNCwgJmVtdS0+cDE2dl9idWZmZXIpIDwgMCkgeworCQkJc25kX3AxNnZfZnJlZShlbXUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX21peGVyKGVtdSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX3RpbWVyKGVtdSwgMCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2VtdTEwazFfcGNtX211bHRpKGVtdSwgMywgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoZW11LT5hdWRpZ3kgJiYgZW11LT5yZXZpc2lvbiA9PSA0KSB7IC8qIFAxNlYgKi8JCisJCWlmICgoZXJyID0gc25kX3AxNnZfcGNtKGVtdSwgNCwgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJaWYgKGVtdS0+YXVkaWd5KSB7CisJCWlmICgoZXJyID0gc25kX2VtdTEwazFfYXVkaWd5X21pZGkoZW11KSkgPCAwKSB7CisJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoZXJyID0gc25kX2VtdTEwazFfbWlkaShlbXUpKSA8IDApIHsKKwkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCWlmICgoZXJyID0gc25kX2VtdTEwazFfZng4MDEwX25ldyhlbXUsIDAsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisjaWZkZWYgRU5BQkxFX1NZTlRICisJaWYgKHNuZF9zZXFfZGV2aWNlX25ldyhjYXJkLCAxLCBTTkRSVl9TRVFfREVWX0lEX0VNVTEwSzFfU1lOVEgsCisJCQkgICAgICAgc2l6ZW9mKHNuZF9lbXUxMGsxX3N5bnRoX2FyZ190KSwgJndhdmUpIDwgMCB8fAorCSAgICB3YXZlID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygiY2FuJ3QgaW5pdGlhbGl6ZSBFbXUxMGsxIHdhdmV0YWJsZSBzeW50aFxuIik7CisJfSBlbHNlIHsKKwkJc25kX2VtdTEwazFfc3ludGhfYXJnX3QgKmFyZzsKKwkJYXJnID0gU05EUlZfU0VRX0RFVklDRV9BUkdQVFIod2F2ZSk7CisJCXN0cmNweSh3YXZlLT5uYW1lLCAiRW11LTEwazEgU3ludGgiKTsKKwkJYXJnLT5od3B0ciA9IGVtdTsKKwkJYXJnLT5pbmRleCA9IDE7CisJCWFyZy0+c2VxX3BvcnRzID0gc2VxX3BvcnRzW2Rldl07CisJCWFyZy0+bWF4X3ZvaWNlcyA9IG1heF9zeW50aF92b2ljZXNbZGV2XTsKKwl9CisjZW5kaWYKKyAKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5kcml2ZXIpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPm5hbWUpOworCXNucHJpbnRmKGNhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+bG9uZ25hbWUpLAorCQkgIiVzIChyZXYuJWQsIHNlcmlhbDoweCV4KSBhdCAweCVseCwgaXJxICVpIiwKKwkJIGNhcmQtPnNob3J0bmFtZSwgZW11LT5yZXZpc2lvbiwgZW11LT5zZXJpYWwsIGVtdS0+cG9ydCwgZW11LT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2NhcmRfZW11MTBrMV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJFTVUxMEsxX0F1ZGlneSIsCisJLmlkX3RhYmxlID0gc25kX2VtdTEwazFfaWRzLAorCS5wcm9iZSA9IHNuZF9jYXJkX2VtdTEwazFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2VtdTEwazFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9lbXUxMGsxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2VtdTEwazFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2VtdTEwazFfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9lbXUxMGsxX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMmY5MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqICBzeW50aCBjYWxsYmFjayByb3V0aW5lcyBmb3IgRW11MTBrMQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAiZW11MTBrMV9zeW50aF9sb2NhbC5oIgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisKKy8qIHZvaWNlIHN0YXR1cyAqLworZW51bSB7CisJVl9GUkVFPTAsIFZfT0ZGLCBWX1JFTEVBU0VELCBWX1BMQVlJTkcsIFZfRU5ECit9OworCisvKiBLZWVwcyB0cmFjayBvZiB3aGF0IHdlIGFyZSBmaW5kaW5nICovCit0eXBlZGVmIHN0cnVjdCBiZXN0X3ZvaWNlIHsKKwl1bnNpZ25lZCBpbnQgdGltZTsKKwlpbnQgdm9pY2U7Cit9IGJlc3Rfdm9pY2VfdDsKKworLyoKKyAqIHByb3RvdHlwZXMKKyAqLworc3RhdGljIHZvaWQgbG9va3VwX3ZvaWNlcyhzbmRfZW11eF90ICplbXUsIGVtdTEwazFfdCAqaHcsIGJlc3Rfdm9pY2VfdCAqYmVzdCwgaW50IGFjdGl2ZV9vbmx5KTsKK3N0YXRpYyBzbmRfZW11eF92b2ljZV90ICpnZXRfdm9pY2Uoc25kX2VtdXhfdCAqZW11LCBzbmRfZW11eF9wb3J0X3QgKnBvcnQpOworc3RhdGljIGludCBzdGFydF92b2ljZShzbmRfZW11eF92b2ljZV90ICp2cCk7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfdm9pY2Uoc25kX2VtdXhfdm9pY2VfdCAqdnApOworc3RhdGljIHZvaWQgdXBkYXRlX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwLCBpbnQgdXBkYXRlKTsKK3N0YXRpYyB2b2lkIHRlcm1pbmF0ZV92b2ljZShzbmRfZW11eF92b2ljZV90ICp2cCk7CitzdGF0aWMgdm9pZCBmcmVlX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKTsKKworc3RhdGljIHZvaWQgc2V0X2ZtbW9kKGVtdTEwazFfdCAqaHcsIHNuZF9lbXV4X3ZvaWNlX3QgKnZwKTsKK3N0YXRpYyB2b2lkIHNldF9mbTJmcnEyKGVtdTEwazFfdCAqaHcsIHNuZF9lbXV4X3ZvaWNlX3QgKnZwKTsKK3N0YXRpYyB2b2lkIHNldF9maWx0ZXJRKGVtdTEwazFfdCAqaHcsIHNuZF9lbXV4X3ZvaWNlX3QgKnZwKTsKKworLyoKKyAqIEVuc3VyZSBhIHZhbHVlIGlzIGJldHdlZW4gdHdvIHBvaW50cworICogbWFjcm8gZXZhbHVhdGVzIGl0cyBhcmdzIG1vcmUgdGhhbiBvbmNlLCBzbyBjaGFuZ2VkIHRvIHVwcGVyLWNhc2UuCisgKi8KKyNkZWZpbmUgTElNSVRWQUxVRSh4LCBhLCBiKSBkbyB7IGlmICgoeCkgPCAoYSkpICh4KSA9IChhKTsgZWxzZSBpZiAoKHgpID4gKGIpKSAoeCkgPSAoYik7IH0gd2hpbGUgKDApCisjZGVmaW5lIExJTUlUTUFYKHgsIGEpIGRvIHtpZiAoKHgpID4gKGEpKSAoeCkgPSAoYSk7IH0gd2hpbGUgKDApCisKKworLyoKKyAqIHNldCB1cCBvcGVyYXRvcnMKKyAqLworc3RhdGljIHNuZF9lbXV4X29wZXJhdG9yc190IGVtdTEwazFfb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5nZXRfdm9pY2UgPQlnZXRfdm9pY2UsCisJLnByZXBhcmUgPQlzdGFydF92b2ljZSwKKwkudHJpZ2dlciA9CXRyaWdnZXJfdm9pY2UsCisJLnJlbGVhc2UgPQlyZWxlYXNlX3ZvaWNlLAorCS51cGRhdGUgPQl1cGRhdGVfdm9pY2UsCisJLnRlcm1pbmF0ZSA9CXRlcm1pbmF0ZV92b2ljZSwKKwkuZnJlZV92b2ljZSA9CWZyZWVfdm9pY2UsCisJLnNhbXBsZV9uZXcgPQlzbmRfZW11MTBrMV9zYW1wbGVfbmV3LAorCS5zYW1wbGVfZnJlZSA9CXNuZF9lbXUxMGsxX3NhbXBsZV9mcmVlLAorfTsKKwordm9pZAorc25kX2VtdTEwazFfb3BzX3NldHVwKHNuZF9lbXV4X3QgKmVtdSkKK3sKKwllbXUtPm9wcyA9IGVtdTEwazFfb3BzOworfQorCisKKy8qCisgKiBnZXQgbW9yZSB2b2ljZSBmb3IgcGNtCisgKgorICogdGVybWluYXRlIG1vc3QgaW5hY3RpdmUgdm9pY2UgYW5kIGdpdmUgaXQgYXMgYSBwY20gdm9pY2UuCisgKi8KK2ludAorc25kX2VtdTEwazFfc3ludGhfZ2V0X3ZvaWNlKGVtdTEwazFfdCAqaHcpCit7CisJc25kX2VtdXhfdCAqZW11OworCXNuZF9lbXV4X3ZvaWNlX3QgKnZwOworCWJlc3Rfdm9pY2VfdCBiZXN0W1ZfRU5EXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJZW11ID0gaHctPnN5bnRoOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWxvb2t1cF92b2ljZXMoZW11LCBodywgYmVzdCwgMSk7IC8qIG5vIE9GRiB2b2ljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVl9FTkQ7IGkrKykgeworCQlpZiAoYmVzdFtpXS52b2ljZSA+PSAwKSB7CisJCQlpbnQgY2g7CisJCQl2cCA9ICZlbXUtPnZvaWNlc1tiZXN0W2ldLnZvaWNlXTsKKwkJCWlmICgoY2ggPSB2cC0+Y2gpIDwgMCkgeworCQkJCS8vcHJpbnRrKCJzeW50aF9nZXRfdm9pY2U6IGNoIDwgMCAoJWQpID8/IiwgaSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQl2cC0+ZW11LT5udW1fdm9pY2VzLS07CisJCQl2cC0+Y2ggPSAtMTsKKwkJCXZwLT5zdGF0ZSA9IFNORFJWX0VNVVhfU1RfT0ZGOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gY2g7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CisKKwkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKgorICogdHVybiBvZmYgdGhlIHZvaWNlIChub3QgdGVybWluYXRlZCkKKyAqLworc3RhdGljIHZvaWQKK3JlbGVhc2Vfdm9pY2Uoc25kX2VtdXhfdm9pY2VfdCAqdnApCit7CisJaW50IGRjeXN1c3Y7CisJZW11MTBrMV90ICpodzsKKwkKKwlodyA9IHZwLT5odzsKKwlkY3lzdXN2ID0gMHg4MDAwIHwgKHVuc2lnbmVkIGNoYXIpdnAtPnJlZy5wYXJtLm1vZHJlbGVhc2U7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBEQ1lTVVNNLCB2cC0+Y2gsIGRjeXN1c3YpOworCWRjeXN1c3YgPSAweDgwMDAgfCAodW5zaWduZWQgY2hhcil2cC0+cmVnLnBhcm0udm9scmVsZWFzZSB8IERDWVNVU1ZfQ0hBTk5FTEVOQUJMRV9NQVNLOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgRENZU1VTViwgdnAtPmNoLCBkY3lzdXN2KTsKK30KKworCisvKgorICogdGVybWluYXRlIHRoZSB2b2ljZQorICovCitzdGF0aWMgdm9pZAordGVybWluYXRlX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCWVtdTEwazFfdCAqaHc7CisJCisJc25kX2Fzc2VydCh2cCwgcmV0dXJuKTsKKwlodyA9IHZwLT5odzsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIERDWVNVU1YsIHZwLT5jaCwgMHg4MDdmIHwgRENZU1VTVl9DSEFOTkVMRU5BQkxFX01BU0spOworCWlmICh2cC0+YmxvY2spIHsKKwkJZW11MTBrMV9tZW1ibGtfdCAqZW1lbTsKKwkJZW1lbSA9IChlbXUxMGsxX21lbWJsa190ICopdnAtPmJsb2NrOworCQlpZiAoZW1lbS0+bWFwX2xvY2tlZCA+IDApCisJCQllbWVtLT5tYXBfbG9ja2VkLS07CisJfQorfQorCisvKgorICogcmVsZWFzZSB0aGUgdm9pY2UgdG8gc3lzdGVtCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCWVtdTEwazFfdCAqaHc7CisJCisJaHcgPSB2cC0+aHc7CisJaWYgKHZwLT5jaCA+PSAwKSB7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgSUZBVE4sIHZwLT5jaCwgMHhmZjAwKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBEQ1lTVVNWLCB2cC0+Y2gsIDB4ODA3ZiB8IERDWVNVU1ZfQ0hBTk5FTEVOQUJMRV9NQVNLKTsKKwkJLy8gc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBEQ1lTVVNWLCB2cC0+Y2gsIDApOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIFZURlQsIHZwLT5jaCwgMHhmZmZmKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDVkNGLCB2cC0+Y2gsIDB4ZmZmZik7CisJCXNuZF9lbXUxMGsxX3ZvaWNlX2ZyZWUoaHcsICZody0+dm9pY2VzW3ZwLT5jaF0pOworCQl2cC0+ZW11LT5udW1fdm9pY2VzLS07CisJCXZwLT5jaCA9IC0xOworCX0KK30KKworCisvKgorICogdXBkYXRlIHJlZ2lzdGVycworICovCitzdGF0aWMgdm9pZAordXBkYXRlX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwLCBpbnQgdXBkYXRlKQoreworCWVtdTEwazFfdCAqaHc7CisJCisJaHcgPSB2cC0+aHc7CisJaWYgKHVwZGF0ZSAmIFNORFJWX0VNVVhfVVBEQVRFX1ZPTFVNRSkKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBJRkFUTl9BVFRFTlVBVElPTiwgdnAtPmNoLCB2cC0+YXZvbCk7CisJaWYgKHVwZGF0ZSAmIFNORFJWX0VNVVhfVVBEQVRFX1BJVENIKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIElQLCB2cC0+Y2gsIHZwLT5hcGl0Y2gpOworCWlmICh1cGRhdGUgJiBTTkRSVl9FTVVYX1VQREFURV9QQU4pIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBQVFJYX0ZYU0VOREFNT1VOVF9BLCB2cC0+Y2gsIHZwLT5hcGFuKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBQVFJYX0ZYU0VOREFNT1VOVF9CLCB2cC0+Y2gsIHZwLT5hYXV4KTsKKwl9CisJaWYgKHVwZGF0ZSAmIFNORFJWX0VNVVhfVVBEQVRFX0ZNTU9EKQorCQlzZXRfZm1tb2QoaHcsIHZwKTsKKwlpZiAodXBkYXRlICYgU05EUlZfRU1VWF9VUERBVEVfVFJFTUZSRVEpCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgVFJFTUZSUSwgdnAtPmNoLCB2cC0+cmVnLnBhcm0udHJlbWZycSk7CisJaWYgKHVwZGF0ZSAmIFNORFJWX0VNVVhfVVBEQVRFX0ZNMkZSUTIpCisJCXNldF9mbTJmcnEyKGh3LCB2cCk7CisJaWYgKHVwZGF0ZSAmIFNORFJWX0VNVVhfVVBEQVRFX1EpCisJCXNldF9maWx0ZXJRKGh3LCB2cCk7Cit9CisKKworLyoKKyAqIGxvb2sgdXAgdm9pY2UgdGFibGUgLSBnZXQgdGhlIGJlc3Qgdm9pY2UgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQorICovCisvKiBzcGlubG9jayBoZWxkISAqLworc3RhdGljIHZvaWQKK2xvb2t1cF92b2ljZXMoc25kX2VtdXhfdCAqZW11LCBlbXUxMGsxX3QgKmh3LCBiZXN0X3ZvaWNlX3QgKmJlc3QsIGludCBhY3RpdmVfb25seSkKK3sKKwlzbmRfZW11eF92b2ljZV90ICp2cDsKKwliZXN0X3ZvaWNlX3QgKmJwOworCWludCAgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWX0VORDsgaSsrKSB7CisJCWJlc3RbaV0udGltZSA9ICh1bnNpZ25lZCBpbnQpLTE7IC8qIFhYWCBNQVhfP0lOVCByZWFsbHkgKi87CisJCWJlc3RbaV0udm9pY2UgPSAtMTsKKwl9CisKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlbSBhbGwgYW5kIGdldCBhIGJlc3Qgb25lIHRvIHVzZS4KKwkgKiBOT1RFOiBjb3VsZCBhbHNvIGxvb2sgYXQgdm9sdW1lIGFuZCBwaWNrIHRoZSBxdWlldGVzdCBvbmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IGVtdS0+bWF4X3ZvaWNlczsgaSsrKSB7CisJCWludCBzdGF0ZSwgdmFsOworCisJCXZwID0gJmVtdS0+dm9pY2VzW2ldOworCQlzdGF0ZSA9IHZwLT5zdGF0ZTsKKwkJaWYgKHN0YXRlID09IFNORFJWX0VNVVhfU1RfT0ZGKSB7CisJCQlpZiAodnAtPmNoIDwgMCkgeworCQkJCWlmIChhY3RpdmVfb25seSkKKwkJCQkJY29udGludWU7CisJCQkJYnAgPSBiZXN0ICsgVl9GUkVFOworCQkJfSBlbHNlCisJCQkJYnAgPSBiZXN0ICsgVl9PRkY7CisJCX0KKwkJZWxzZSBpZiAoc3RhdGUgPT0gU05EUlZfRU1VWF9TVF9SRUxFQVNFRCB8fAorCQkJIHN0YXRlID09IFNORFJWX0VNVVhfU1RfUEVORElORykgeworCQkJYnAgPSBiZXN0ICsgVl9SRUxFQVNFRDsKKyNpZiAwCisJCQl2YWwgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChodywgQ1ZDRl9DVVJSRU5UVk9MLCB2cC0+Y2gpOworCQkJaWYgKCEgdmFsKQorCQkJCWJwID0gYmVzdCArIFZfT0ZGOworI2VuZGlmCisJCX0KKwkJZWxzZSBpZiAoc3RhdGUgPT0gU05EUlZfRU1VWF9TVF9TVEFOREJZKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKHN0YXRlICYgU05EUlZfRU1VWF9TVF9PTikKKwkJCWJwID0gYmVzdCArIFZfUExBWUlORzsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJLyogY2hlY2sgaWYgc2FtcGxlIGlzIGZpbmlzaGVkIHBsYXlpbmcgKG5vbi1sb29waW5nIG9ubHkpICovCisJCWlmIChicCAhPSBiZXN0ICsgVl9PRkYgJiYgYnAgIT0gYmVzdCArIFZfRlJFRSAmJgorCQkgICAgKHZwLT5yZWcuc2FtcGxlX21vZGUgJiBTTkRSVl9TRk5UX1NBTVBMRV9TSU5HTEVTSE9UKSkgeworCQkJdmFsID0gc25kX2VtdTEwazFfcHRyX3JlYWQoaHcsIENDQ0FfQ1VSUkFERFIsIHZwLT5jaCk7CisJCQlpZiAodmFsID49IHZwLT5yZWcubG9vcHN0YXJ0KQorCQkJCWJwID0gYmVzdCArIFZfT0ZGOworCQl9CisKKwkJaWYgKHZwLT50aW1lIDwgYnAtPnRpbWUpIHsKKwkJCWJwLT50aW1lID0gdnAtPnRpbWU7CisJCQlicC0+dm9pY2UgPSBpOworCQl9CisJfQorfQorCisvKgorICogZ2V0IGFuIGVtcHR5IHZvaWNlCisgKgorICogZW11LT52b2ljZV9sb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAqLworc3RhdGljIHNuZF9lbXV4X3ZvaWNlX3QgKgorZ2V0X3ZvaWNlKHNuZF9lbXV4X3QgKmVtdSwgc25kX2VtdXhfcG9ydF90ICpwb3J0KQoreworCWVtdTEwazFfdCAqaHc7CisJc25kX2VtdXhfdm9pY2VfdCAqdnA7CisJYmVzdF92b2ljZV90IGJlc3RbVl9FTkRdOworCWludCBpOworCisJaHcgPSBlbXUtPmh3OworCisJbG9va3VwX3ZvaWNlcyhlbXUsIGh3LCBiZXN0LCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgVl9FTkQ7IGkrKykgeworCQlpZiAoYmVzdFtpXS52b2ljZSA+PSAwKSB7CisJCQl2cCA9ICZlbXUtPnZvaWNlc1tiZXN0W2ldLnZvaWNlXTsKKwkJCWlmICh2cC0+Y2ggPCAwKSB7CisJCQkJLyogYWxsb2NhdGUgYSB2b2ljZSAqLworCQkJCWVtdTEwazFfdm9pY2VfdCAqaHd2b2ljZTsKKwkJCQlpZiAoc25kX2VtdTEwazFfdm9pY2VfYWxsb2MoaHcsIEVNVTEwSzFfU1lOVEgsIDEsICZod3ZvaWNlKSA8IDAgfHwgaHd2b2ljZSA9PSBOVUxMKQorCQkJCQljb250aW51ZTsKKwkJCQl2cC0+Y2ggPSBod3ZvaWNlLT5udW1iZXI7CisJCQkJZW11LT5udW1fdm9pY2VzKys7CisJCQl9CisJCQlyZXR1cm4gdnA7CisJCX0KKwl9CisKKwkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHByZXBhcmUgZW52ZWxvcGVzIGFuZCBMRk9zCisgKi8KK3N0YXRpYyBpbnQKK3N0YXJ0X3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCWludCBjaDsKKwl1bnNpZ25lZCBpbnQgYWRkciwgbWFwcGVkX29mZnNldDsKKwlzbmRfbWlkaV9jaGFubmVsX3QgKmNoYW47CisJZW11MTBrMV90ICpodzsKKwllbXUxMGsxX21lbWJsa190ICplbWVtOworCQorCWh3ID0gdnAtPmh3OworCWNoID0gdnAtPmNoOworCXNuZF9hc3NlcnQoY2ggPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWNoYW4gPSB2cC0+Y2hhbjsKKworCWVtZW0gPSAoZW11MTBrMV9tZW1ibGtfdCAqKXZwLT5ibG9jazsKKwlpZiAoZW1lbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbWVtLT5tYXBfbG9ja2VkKys7CisJaWYgKHNuZF9lbXUxMGsxX21lbWJsa19tYXAoaHcsIGVtZW0pIDwgMCkgeworCQkvLyBwcmludGsoImVtdTogY2Fubm90IG1hcCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWFwcGVkX29mZnNldCA9IHNuZF9lbXUxMGsxX21lbWJsa19vZmZzZXQoZW1lbSkgPj4gMTsKKwl2cC0+cmVnLnN0YXJ0ICs9IG1hcHBlZF9vZmZzZXQ7CisJdnAtPnJlZy5lbmQgKz0gbWFwcGVkX29mZnNldDsKKwl2cC0+cmVnLmxvb3BzdGFydCArPSBtYXBwZWRfb2Zmc2V0OworCXZwLT5yZWcubG9vcGVuZCArPSBtYXBwZWRfb2Zmc2V0OworCisJLyogc2V0IGNoYW5uZWwgcm91dGluZyAqLworCS8qIEEgPSBsZWZ0KDApLCBCID0gcmlnaHQoMSksIEMgPSByZXZlcmIoYyksIEQgPSBjaG9ydXMoZCkgKi8KKwlpZiAoaHctPmF1ZGlneSkgeworCQl0ZW1wID0gRlhCVVNfTUlESV9MRUZUIHwgKEZYQlVTX01JRElfUklHSFQgPDwgOCkgfCAKKwkJCShGWEJVU19NSURJX1JFVkVSQiA8PCAxNikgfCAoRlhCVVNfTUlESV9DSE9SVVMgPDwgMjQpOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIEFfRlhSVDEsIGNoLCB0ZW1wKTsKKwl9IGVsc2UgeworCQl0ZW1wID0gKEZYQlVTX01JRElfTEVGVCA8PCAxNikgfCAoRlhCVVNfTUlESV9SSUdIVCA8PCAyMCkgfCAKKwkJCShGWEJVU19NSURJX1JFVkVSQiA8PCAyNCkgfCAoRlhCVVNfTUlESV9DSE9SVVMgPDwgMjgpOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIEZYUlQsIGNoLCB0ZW1wKTsKKwl9CisKKwkvKiBjaGFubmVsIHRvIGJlIHNpbGVudCBhbmQgaWRsZSAqLworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgRENZU1VTViwgY2gsIDB4MDA4MCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBWVEZULCBjaCwgMHgwMDAwRkZGRik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDVkNGLCBjaCwgMHgwMDAwRkZGRik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBQVFJYLCBjaCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDUEYsIGNoLCAwKTsKKworCS8qIHNldCBwaXRjaCBvZmZzZXQgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIElQLCB2cC0+Y2gsIHZwLT5hcGl0Y2gpOworCisJLyogc2V0IGVudmVsb3BlIHBhcmFtZXRlcnMgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIEVOVlZBTCwgY2gsIHZwLT5yZWcucGFybS5tb2RkZWxheSk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBBVEtITERNLCBjaCwgdnAtPnJlZy5wYXJtLm1vZGF0a2hsZCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBEQ1lTVVNNLCBjaCwgdnAtPnJlZy5wYXJtLm1vZGRjeXN1cyk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBFTlZWT0wsIGNoLCB2cC0+cmVnLnBhcm0udm9sZGVsYXkpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgQVRLSExEViwgY2gsIHZwLT5yZWcucGFybS52b2xhdGtobGQpOworCS8qIGRlY2F5L3N1c3RhaW4gcGFyYW1ldGVyIGZvciB2b2x1bWUgZW52ZWxvcGUgaXMgdXNlZAorCSAgIGZvciB0cmlnZ2VyZyB0aGUgdm9pY2UgKi8KKworCS8qIGN1dG9mZiBhbmQgdm9sdW1lICovCisJdGVtcCA9ICh1bnNpZ25lZCBpbnQpdnAtPmFjdXRvZmYgPDwgOCB8ICh1bnNpZ25lZCBjaGFyKXZwLT5hdm9sOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgSUZBVE4sIHZwLT5jaCwgdGVtcCk7CisKKwkvKiBtb2R1bGF0aW9uIGVudmVsb3BlIGhlaWdodHMgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIFBFRkUsIGNoLCB2cC0+cmVnLnBhcm0ucGVmZSk7CisKKwkvKiBsZm8xLzIgZGVsYXkgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIExGT1ZBTDEsIGNoLCB2cC0+cmVnLnBhcm0ubGZvMWRlbGF5KTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIExGT1ZBTDIsIGNoLCB2cC0+cmVnLnBhcm0ubGZvMmRlbGF5KTsKKworCS8qIGxmbzEgcGl0Y2ggJiBjdXRvZmYgc2hpZnQgKi8KKwlzZXRfZm1tb2QoaHcsIHZwKTsKKwkvKiBsZm8xIHZvbHVtZSAmIGZyZXEgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIFRSRU1GUlEsIHZwLT5jaCwgdnAtPnJlZy5wYXJtLnRyZW1mcnEpOworCS8qIGxmbzIgcGl0Y2ggJiBmcmVxICovCisJc2V0X2ZtMmZycTIoaHcsIHZwKTsKKworCS8qIHJldmVyYiBhbmQgbG9vcCBzdGFydCAocmV2ZXJiIDhiaXQsIE1TQikgKi8KKwl0ZW1wID0gdnAtPnJlZy5wYXJtLnJldmVyYjsKKwl0ZW1wICs9IChpbnQpdnAtPmNoYW4tPmNvbnRyb2xbTUlESV9DVExfRTFfUkVWRVJCX0RFUFRIXSAqIDkgLyAxMDsKKwlMSU1JVE1BWCh0ZW1wLCAyNTUpOworCWFkZHIgPSB2cC0+cmVnLmxvb3BzdGFydDsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIFBTU1QsIHZwLT5jaCwgKHRlbXAgPDwgMjQpIHwgYWRkcik7CisKKwkvKiBjaG9ydXMgJiBsb29wIGVuZCAoY2hvcnVzIDhiaXQsIE1TQikgKi8KKwlhZGRyID0gdnAtPnJlZy5sb29wZW5kOworCXRlbXAgPSB2cC0+cmVnLnBhcm0uY2hvcnVzOworCXRlbXAgKz0gKGludCljaGFuLT5jb250cm9sW01JRElfQ1RMX0UzX0NIT1JVU19ERVBUSF0gKiA5IC8gMTA7CisJTElNSVRNQVgodGVtcCwgMjU1KTsKKwl0ZW1wID0gKHRlbXAgPDwyNCkgfCBhZGRyOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgRFNMLCBjaCwgdGVtcCk7CisKKwkvKiBjbGVhciBmaWx0ZXIgZGVsYXkgbWVtb3J5ICovCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBaMSwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgWjIsIGNoLCAwKTsKKworCS8qIGludmFsaWRhdGUgbWFwcyAqLworCXRlbXAgPSAoaHctPnNpbGVudF9wYWdlLmFkZHIgPDwgMSkgfCBNQVBfUFRJX01BU0s7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBNQVBBLCBjaCwgdGVtcCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBNQVBCLCBjaCwgdGVtcCk7CisjaWYgMAorCS8qIGNhY2hlICovCisJeworCQl1bnNpZ25lZCBpbnQgdmFsLCBzYW1wbGU7CisJCXZhbCA9IDMyOworCQlpZiAodnAtPnJlZy5zYW1wbGVfbW9kZSAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKQorCQkJc2FtcGxlID0gMHg4MDgwODA4MDsKKwkJZWxzZSB7CisJCQlzYW1wbGUgPSAwOworCQkJdmFsICo9IDI7CisJCX0KKworCQkvKiBjYWNoZSAqLworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIENDUiwgY2gsIDB4MWMgPDwgMTYpOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIENERSwgY2gsIHNhbXBsZSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgQ0RGLCBjaCwgc2FtcGxlKTsKKworCQkvKiBpbnZhbGlkYXRlIG1hcHMgKi8KKwkJdGVtcCA9ICgodW5zaWduZWQgaW50KWh3LT5zaWxlbnRfcGFnZS5hZGRyIDw8IDEpIHwgTUFQX1BUSV9NQVNLOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIE1BUEEsIGNoLCB0ZW1wKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBNQVBCLCBjaCwgdGVtcCk7CisJCQorCQkvKiBmaWxsIGNhY2hlICovCisJCXZhbCAtPSA0OworCQl2YWwgPDw9IDI1OworCQl2YWwgfD0gMHgxYyA8PCAxNjsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDQ1IsIGNoLCB2YWwpOworCX0KKyNlbmRpZgorCisJLyogUSAmIGN1cnJlbnQgYWRkcmVzcyAoUSA0Yml0IHZhbHVlLCBNU0IpICovCisJYWRkciA9IHZwLT5yZWcuc3RhcnQ7CisJdGVtcCA9IHZwLT5yZWcucGFybS5maWx0ZXJROworCXRlbXAgPSAodGVtcDw8MjgpIHwgYWRkcjsKKwlpZiAodnAtPmFwaXRjaCA8IDB4ZTQwMCkKKwkJdGVtcCB8PSBDQ0NBX0lOVEVSUFJPTV8wOworCWVsc2UgeworCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAodnAtPmFwaXRjaCAtIDB4ZTAwMCkgPj4gMTA7CisJCXRlbXAgfD0gc2hpZnQgPDwgMjU7CisJfQorCWlmICh2cC0+cmVnLnNhbXBsZV9tb2RlICYgU05EUlZfU0ZOVF9TQU1QTEVfOEJJVFMpCisJCXRlbXAgfD0gQ0NDQV84QklUU0VMRUNUOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgQ0NDQSwgY2gsIHRlbXApOworCisJLyogcmVzZXQgdm9sdW1lICovCisJdGVtcCA9ICh1bnNpZ25lZCBpbnQpdnAtPnZ0YXJnZXQgPDwgMTY7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBWVEZULCBjaCwgdGVtcCB8IHZwLT5mdGFyZ2V0KTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIENWQ0YsIGNoLCB0ZW1wIHwgMHhmZjAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXJ0IGVudmVsb3BlCisgKi8KK3N0YXRpYyB2b2lkCit0cmlnZ2VyX3ZvaWNlKHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCXVuc2lnbmVkIGludCB0ZW1wLCBwdGFyZ2V0OworCWVtdTEwazFfdCAqaHc7CisJZW11MTBrMV9tZW1ibGtfdCAqZW1lbTsKKwkKKwlodyA9IHZwLT5odzsKKworCWVtZW0gPSAoZW11MTBrMV9tZW1ibGtfdCAqKXZwLT5ibG9jazsKKwlpZiAoISBlbWVtIHx8IGVtZW0tPm1hcHBlZF9wYWdlIDwgMCkKKwkJcmV0dXJuOyAvKiBub3QgbWFwcGVkICovCisKKyNpZiAwCisJcHRhcmdldCA9ICh1bnNpZ25lZCBpbnQpdnAtPnB0YXJnZXQgPDwgMTY7CisjZWxzZQorCXB0YXJnZXQgPSBJUF9UT19DUCh2cC0+YXBpdGNoKTsKKyNlbmRpZgorCS8qIHNldCBwaXRjaCB0YXJnZXQgYW5kIHBhbiAodm9sdW1lKSAqLworCXRlbXAgPSBwdGFyZ2V0IHwgKHZwLT5hcGFuIDw8IDgpIHwgdnAtPmFhdXg7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBQVFJYLCB2cC0+Y2gsIHRlbXApOworCisJLyogcGl0Y2ggdGFyZ2V0ICovCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDUEYsIHZwLT5jaCwgcHRhcmdldCk7CisKKwkvKiB0cmlnZ2VyIHZvaWNlICovCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBEQ1lTVVNWLCB2cC0+Y2gsIHZwLT5yZWcucGFybS52b2xkY3lzdXN8RENZU1VTVl9DSEFOTkVMRU5BQkxFX01BU0spOworfQorCisjZGVmaW5lIE1PRF9TRU5TRSAxOAorCisvKiBzZXQgbGZvMSBtb2R1bGF0aW9uIGhlaWdodCBhbmQgY3V0b2ZmICovCitzdGF0aWMgdm9pZAorc2V0X2ZtbW9kKGVtdTEwazFfdCAqaHcsIHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCXVuc2lnbmVkIHNob3J0IGZtbW9kOworCXNob3J0IHBpdGNoOworCXVuc2lnbmVkIGNoYXIgY3V0b2ZmOworCWludCBtb2R1bGF0aW9uOworCisJcGl0Y2ggPSAoY2hhcikodnAtPnJlZy5wYXJtLmZtbW9kPj44KTsKKwljdXRvZmYgPSAodnAtPnJlZy5wYXJtLmZtbW9kICYgMHhmZik7CisJbW9kdWxhdGlvbiA9IHZwLT5jaGFuLT5nbV9tb2R1bGF0aW9uICsgdnAtPmNoYW4tPm1pZGlfcHJlc3N1cmU7CisJcGl0Y2ggKz0gKE1PRF9TRU5TRSAqIG1vZHVsYXRpb24pIC8gMTIwMDsKKwlMSU1JVFZBTFVFKHBpdGNoLCAtMTI4LCAxMjcpOworCWZtbW9kID0gKCh1bnNpZ25lZCBjaGFyKXBpdGNoPDw4KSB8IGN1dG9mZjsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoaHcsIEZNTU9ELCB2cC0+Y2gsIGZtbW9kKTsKK30KKworLyogc2V0IGxmbzIgcGl0Y2ggJiBmcmVxdWVuY3kgKi8KK3N0YXRpYyB2b2lkCitzZXRfZm0yZnJxMihlbXUxMGsxX3QgKmh3LCBzbmRfZW11eF92b2ljZV90ICp2cCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmbTJmcnEyOworCXNob3J0IHBpdGNoOworCXVuc2lnbmVkIGNoYXIgZnJlcTsKKwlpbnQgbW9kdWxhdGlvbjsKKworCXBpdGNoID0gKGNoYXIpKHZwLT5yZWcucGFybS5mbTJmcnEyPj44KTsKKwlmcmVxID0gdnAtPnJlZy5wYXJtLmZtMmZycTIgJiAweGZmOworCW1vZHVsYXRpb24gPSB2cC0+Y2hhbi0+Z21fbW9kdWxhdGlvbiArIHZwLT5jaGFuLT5taWRpX3ByZXNzdXJlOworCXBpdGNoICs9IChNT0RfU0VOU0UgKiBtb2R1bGF0aW9uKSAvIDEyMDA7CisJTElNSVRWQUxVRShwaXRjaCwgLTEyOCwgMTI3KTsKKwlmbTJmcnEyID0gKCh1bnNpZ25lZCBjaGFyKXBpdGNoPDw4KSB8IGZyZXE7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBGTTJGUlEyLCB2cC0+Y2gsIGZtMmZycTIpOworfQorCisvKiBzZXQgZmlsdGVyUSAqLworc3RhdGljIHZvaWQKK3NldF9maWx0ZXJRKGVtdTEwazFfdCAqaHcsIHNuZF9lbXV4X3ZvaWNlX3QgKnZwKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdmFsID0gc25kX2VtdTEwazFfcHRyX3JlYWQoaHcsIENDQ0EsIHZwLT5jaCkgJiB+Q0NDQV9SRVNPTkFOQ0U7CisJdmFsIHw9ICh2cC0+cmVnLnBhcm0uZmlsdGVyUSA8PCAyOCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGh3LCBDQ0NBLCB2cC0+Y2gsIHZhbCk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzk2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwpAQCAtMCwwICsxLDg3NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzCisgKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgQXVkaWd5IDIgVmFsdWUuCisgKgorICoKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisjaW5jbHVkZSAicDE2di5oIgorCisjaWYgMAorTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiwgQ3JlYXRpdmUgTGFicywgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVNVTEwSzEgaW5pdCAvIGRvbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNuZF9lbXUxMGsxX3ZvaWNlX2luaXQoZW11MTBrMV90ICogZW11LCBpbnQgY2gpCit7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRENZU1VTViwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIElQLCBjaCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVlRGVCwgY2gsIDB4ZmZmZik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ1ZDRiwgY2gsIDB4ZmZmZik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRSWCwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENQRiwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUiwgY2gsIDApOworCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFNTVCwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERTTCwgY2gsIDB4MTApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDQ0EsIGNoLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBaMSwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFoyLCBjaCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRlhSVCwgY2gsIDB4MzIxMDAwMDApOworCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQVRLSExETSwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERDWVNVU00sIGNoLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBJRkFUTiwgY2gsIDB4ZmZmZik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUEVGRSwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZNTU9ELCBjaCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVFJFTUZSUSwgY2gsIDI0KTsJLyogMSBIeiAqLworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZNMkZSUTIsIGNoLCAyNCk7CS8qIDEgSHogKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBURU1QRU5WLCBjaCwgMCk7CisKKwkvKioqIHRoZXNlIGFyZSBsYXN0IHNvIE9GRiBwcmV2ZW50cyB3cml0aW5nICoqKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBMRk9WQUwyLCBjaCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgTEZPVkFMMSwgY2gsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFUS0hMRFYsIGNoLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBFTlZWT0wsIGNoLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBFTlZWQUwsIGNoLCAwKTsKKworCS8qIEF1ZGlneSBleHRyYSBzdHVmZnMgKi8KKwlpZiAoZW11LT5hdWRpZ3kpIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgMHg0YywgY2gsIDApOyAvKiA/PyAqLworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCAweDRkLCBjaCwgMCk7IC8qID8/ICovCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIDB4NGUsIGNoLCAwKTsgLyogPz8gKi8KKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgMHg0ZiwgY2gsIDApOyAvKiA/PyAqLworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0ZYUlQxLCBjaCwgMHgwMzAyMDEwMCk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhSVDIsIGNoLCAweDNmM2YzZjNmKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9TRU5EQU1PVU5UUywgY2gsIDApOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VtdTEwazFfaW5pdChlbXUxMGsxX3QgKiBlbXUsIGludCBlbmFibGVfaXIpCit7CisJaW50IGNoLCBpZHgsIGVycjsKKwl1bnNpZ25lZCBpbnQgc2lsZW50X3BhZ2U7CisKKwllbXUtPmZ4ODAxMC5pdHJhbV9zaXplID0gKDE2ICogMTAyNCkvMjsKKwllbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5hcmVhID0gTlVMTDsKKwllbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5ieXRlcyA9IDA7CisKKwkvKiBkaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCisJb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOworCisJLyogcmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNSUNCUywgMCwgQURDQlNfQlVGU0laRV9OT05FKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNSUNCQSwgMCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRlhCUywgMCwgQURDQlNfQlVGU0laRV9OT05FKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWEJBLCAwLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBRENCUywgMCwgQURDQlNfQlVGU0laRV9OT05FKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBRENCQSwgMCwgMCk7CisKKwkvKiBkaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0ICovCisJb3V0bCgwLCBlbXUtPnBvcnQgKyBJTlRFKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDTElFTCwgMCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0xJRUgsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFNPTEVMLCAwLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBTT0xFSCwgMCwgMCk7CisKKwlpZiAoZW11LT5hdWRpZ3kpeworCQkvKiBzZXQgU1BESUYgYnlwYXNzIG1vZGUgKi8KKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgU1BCWVBBU1MsIDAsIFNQQllQQVNTX0ZPUk1BVCk7CisJCS8qIGVuYWJsZSByZWFyIGxlZnQgKyByZWFyIHJpZ2h0IEFDOTcgc2xvdHMgKi8KKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX1JFQVJfUklHSFQgfCBBQzk3U0xPVF9SRUFSX0xFRlQpOworCX0KKworCS8qIGluaXQgZW52ZWxvcGUgZW5naW5lICovCisJZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspIHsKKwkJZW11LT52b2ljZXNbY2hdLmVtdSA9IGVtdTsKKwkJZW11LT52b2ljZXNbY2hdLm51bWJlciA9IGNoOworCQlzbmRfZW11MTBrMV92b2ljZV9pbml0KGVtdSwgY2gpOworCX0KKworCS8qCisJICogIEluaXQgdG8gMHgwMjEwOTIwNCA6CisJICogIENsb2NrIGFjY3VyYWN5ICAgID0gMCAgICAgKDEwMDBwcG0pCisJICogIFNhbXBsZSBSYXRlICAgICAgID0gMiAgICAgKDQ4a0h6KQorCSAqICBBdWRpbyBDaGFubmVsICAgICA9IDEgICAgIChMZWZ0IG9mIDIpCisJICogIFNvdXJjZSBOdW1iZXIgICAgID0gMCAgICAgKFVuc3BlY2lmaWVkKQorCSAqICBHZW5lcmF0aW9uIFN0YXR1cyA9IDEgICAgIChPcmlnaW5hbCBmb3IgQ2F0IENvZGUgMTIpCisJICogIENhdCBDb2RlICAgICAgICAgID0gMTIgICAgKERpZ2l0YWwgU2lnbmFsIE1peGVyKQorCSAqICBNb2RlICAgICAgICAgICAgICA9IDAgICAgIChNb2RlIDApCisJICogIEVtcGhhc2lzICAgICAgICAgID0gMCAgICAgKE5vbmUpCisJICogIENQICAgICAgICAgICAgICAgID0gMSAgICAgKENvcHlyaWdodCB1bmFzc2VydGVkKQorCSAqICBBTiAgICAgICAgICAgICAgICA9IDAgICAgIChBdWRpbyBkYXRhKQorCSAqICBQICAgICAgICAgICAgICAgICA9IDAgICAgIChDb25zdW1lcikKKwkgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBTUENTMCwgMCwKKwkJCWVtdS0+c3BkaWZfYml0c1swXSA9CisJCQlTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IFNQQ1NfU0FNUExFUkFURV80OCB8CisJCQlTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8CisJCQlTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwKKwkJCTB4MDAwMDAwMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgU1BDUzEsIDAsCisJCQllbXUtPnNwZGlmX2JpdHNbMV0gPQorCQkJU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAorCQkJU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfAorCQkJU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8CisJCQkweDAwMDAwMDAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFNQQ1MyLCAwLAorCQkJZW11LT5zcGRpZl9iaXRzWzJdID0KKwkJCVNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwKKwkJCVNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfAorCQkJMHgwMDAwMDAwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKTsKKworCWlmIChlbXUtPmF1ZGlneSAmJiBlbXUtPnJldmlzaW9uID09IDQpIHsgLyogYXVkaWd5MiAqLworCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLworCQl1MzIgdG1wOworCisJCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQorCQl0bXAgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CisJCXRtcCAmPSAweGZmZmZmMWZmOworCQl0bXAgfD0gKDB4Mjw8OSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCwgdG1wKTsKKwkJCisJCS8qIFNldHVwIFNSQ1NlbCAoRW5hYmxlIFNwZGlmLEkyUyBTUkNNdWx0aSkgKi8KKwkJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBTUkNTZWwsIDAsIDB4MTQpOworCQkvKiBTZXR1cCBTUkNNdWx0aSBJbnB1dCBBdWRpbyBFbmFibGUgKi8KKwkJLyogVXNlIDB4RkZGRkZGRkYgdG8gZW5hYmxlIFAxNlYgc291bmRzLiAqLworCQlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIFNSQ01VTFRJX0VOQUJMRSwgMCwgMHhGRkZGRkZGRik7CisKKwkJLyogRW5hYmxlZCBQaGFzZWQgKDgtY2hhbm5lbCkgUDE2ViBwbGF5YmFjayAqLworCQlvdXRsKDB4MDIwMSwgZW11LT5wb3J0ICsgSENGRzIpOworCQkvKiBTZXQgcGxheWJhY2sgcm91dGluZy4gKi8KKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0FQVFVSRV9QMTZWX1NPVVJDRSwgMCwgNzhlNCk7CisJfQorCWlmIChlbXUtPmF1ZGlneSAmJiAoZW11LT5zZXJpYWwgPT0gMHgxMDAxMTEwMikgKSB7IC8qIGF1ZGlneTIgVmFsdWUgKi8KKwkJLyogSGFja3MgZm9yIEFsaWNlMyB0byB3b3JrIGluZGVwZW5kZW50IG9mIGhhUDE2ViBkcml2ZXIgKi8KKwkJdTMyIHRtcDsKKworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBdWRpZ3kyIHZhbHVlOlNwZWNpYWwgY29uZmlnLlxuIik7CisJCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQorCQl0bXAgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CisJCXRtcCAmPSAweGZmZmZmMWZmOworCQl0bXAgfD0gKDB4Mjw8OSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCwgdG1wKTsKKworCQkvKiBTZXR1cCBTUkNTZWwgKEVuYWJsZSBTcGRpZixJMlMgU1JDTXVsdGkpICovCisJCW91dGwoMHg2MDAwMDAsIGVtdS0+cG9ydCArIDB4MjApOworCQlvdXRsKDB4MTQsIGVtdS0+cG9ydCArIDB4MjQpOworCisJCS8qIFNldHVwIFNSQ011bHRpIElucHV0IEF1ZGlvIEVuYWJsZSAqLworCQlvdXRsKDB4N2IwMDAwLCBlbXUtPnBvcnQgKyAweDIwKTsKKwkJb3V0bCgweEZGMDAwMDAwLCBlbXUtPnBvcnQgKyAweDI0KTsKKworCQkvKiBTZXR1cCBTUERJRiBPdXQgQXVkaW8gRW5hYmxlICovCisJCS8qIFRoZSBBdWRpZ3kgMiBWYWx1ZSBoYXMgYSBzZXBhcmF0ZSBTUERJRiBvdXQsCisJCSAqIHNvIG5vIG5lZWQgZm9yIGEgbWl4ZXIgc3dpdGNoCisJCSAqLworCQlvdXRsKDB4N2EwMDAwLCBlbXUtPnBvcnQgKyAweDIwKTsKKwkJb3V0bCgweEZGMDAwMDAwLCBlbXUtPnBvcnQgKyAweDI0KTsKKwkJdG1wID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpICYgfjB4ODsgLyogQ2xlYXIgYml0IDMgKi8KKwkJb3V0bCh0bXAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCX0KKworCisJLyoKKwkgKiAgQ2xlYXIgcGFnZSB3aXRoIHNpbGVuY2UgJiBzZXR1cCBhbGwgcG9pbnRlcnMgdG8gdGhpcyBwYWdlCisJICovCisJbWVtc2V0KGVtdS0+c2lsZW50X3BhZ2UuYXJlYSwgMCwgUEFHRV9TSVpFKTsKKwlzaWxlbnRfcGFnZSA9IGVtdS0+c2lsZW50X3BhZ2UuYWRkciA8PCAxOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYUEFHRVM7IGlkeCsrKQorCQkoKHUzMiAqKWVtdS0+cHRiX3BhZ2VzLmFyZWEpW2lkeF0gPSBjcHVfdG9fbGUzMihzaWxlbnRfcGFnZSB8IGlkeCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRCLCAwLCBlbXUtPnB0Yl9wYWdlcy5hZGRyKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQ0IsIDAsIDApOwkvKiB0YWtlbiBmcm9tIG9yaWdpbmFsIGRyaXZlciAqLworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRDQlMsIDAsIDQpOwkvKiB0YWtlbiBmcm9tIG9yaWdpbmFsIGRyaXZlciAqLworCisJc2lsZW50X3BhZ2UgPSAoZW11LT5zaWxlbnRfcGFnZS5hZGRyIDw8IDEpIHwgTUFQX1BUSV9NQVNLOworCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKSB7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIE1BUEEsIGNoLCBzaWxlbnRfcGFnZSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIE1BUEIsIGNoLCBzaWxlbnRfcGFnZSk7CisJfQorCisJLyoKKwkgKiAgSG9rYXksIHNldHVwIEhDRkcKKwkgKiAgIE11dGUgRGlzYWJsZSBBdWRpbyA9IDAKKwkgKiAgIExvY2sgVGFuayBNZW1vcnkgPSAxCisJICogICBMb2NrIFNvdW5kIE1lbW9yeSA9IDAKKwkgKiAgIEF1dG8gTXV0ZSA9IDEKKwkgKi8KKwlpZiAoZW11LT5hdWRpZ3kpIHsKKwkJaWYgKGVtdS0+cmV2aXNpb24gPT0gNCkgLyogYXVkaWd5MiAqLworCQkJb3V0bChIQ0ZHX0FVRElPRU5BQkxFIHwKKwkJCSAgICAgSENGR19BQzNFTkFCTEVfQ0RTUERJRiB8CisJCQkgICAgIEhDRkdfQUMzRU5BQkxFX0dQU1BESUYgfAorCQkJICAgICBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOworCQllbHNlCisJCQlvdXRsKEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSwgZW11LT5wb3J0ICsgSENGRyk7CisJfSBlbHNlIGlmIChlbXUtPm1vZGVsID09IDB4MjAgfHwKKwkgICAgZW11LT5tb2RlbCA9PSAweGM0MDAgfHwKKwkgICAgKGVtdS0+bW9kZWwgPT0gMHgyMSAmJiBlbXUtPnJldmlzaW9uIDwgNikpCisJCW91dGwoSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwllbHNlCisJCS8vIFdpdGggb24tY2hpcCBqb3lzdGljaworCQlvdXRsKEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKworCWlmIChlbmFibGVfaXIpIHsJLyogZW5hYmxlIElSIGZvciBTQiBMaXZlICovCisJCWlmIChlbXUtPmF1ZGlneSkgeworCQkJdW5zaWduZWQgaW50IHJlZyA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJCW91dGwocmVnIHwgQV9JT0NGR19HUE9VVDIsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQkJdWRlbGF5KDUwMCk7CisJCQlvdXRsKHJlZyB8IEFfSU9DRkdfR1BPVVQxIHwgQV9JT0NGR19HUE9VVDIsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQkJdWRlbGF5KDEwMCk7CisJCQlvdXRsKHJlZywgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgcmVnID0gaW5sKGVtdS0+cG9ydCArIEhDRkcpOworCQkJb3V0bChyZWcgfCBIQ0ZHX0dQT1VUMiwgZW11LT5wb3J0ICsgSENGRyk7CisJCQl1ZGVsYXkoNTAwKTsKKwkJCW91dGwocmVnIHwgSENGR19HUE9VVDEgfCBIQ0ZHX0dQT1VUMiwgZW11LT5wb3J0ICsgSENGRyk7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCW91dGwocmVnLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKyAJCX0KKwl9CisJCisJaWYgKGVtdS0+YXVkaWd5KSB7CS8qIGVuYWJsZSBhbmFsb2cgb3V0cHV0ICovCisJCXVuc2lnbmVkIGludCByZWcgPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCW91dGwocmVnIHwgQV9JT0NGR19HUE9VVDAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCX0KKworCS8qCisJICogIEluaXRpYWxpemUgdGhlIGVmZmVjdCBlbmdpbmUKKwkgKi8KKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2luaXRfZWZ4KGVtdSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICogIEVuYWJsZSB0aGUgYXVkaW8gYml0CisJICovCisJb3V0bChpbmwoZW11LT5wb3J0ICsgSENGRykgfCBIQ0ZHX0FVRElPRU5BQkxFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKworCS8qIEVuYWJsZSBhbmFsb2cvZGlnaXRhbCBvdXRzIG9uIGF1ZGlneSAqLworCWlmIChlbXUtPmF1ZGlneSkgeworCQlvdXRsKGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKSAmIH4weDQ0LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKyAKKwkJaWYgKGVtdS0+cmV2aXNpb24gPT0gNCkgeyAvKiBhdWRpZ3kyICovCisJCQkvKiBVbm11dGUgQW5hbG9nIG5vdy4gIFNldCBHUE82IHRvIDEgZm9yIEFwb2xsby4KKwkJCSAqIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaW5pdCBBTGljZTMgSTJTT3V0IGJleW9uZCA0OEtIei4KKwkJCSAqIFNvLCBzZXF1ZW5jZSBpcyBpbXBvcnRhbnQuICovCisJCQlvdXRsKGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKSB8IDB4MDA0MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCX0gZWxzZSBpZiAoZW11LT5zZXJpYWwgPT0gMHgxMDAxMTEwMikgeyAvKiBhdWRpZ3kyIHZhbHVlICovCisJCQkvKiBVbm11dGUgQW5hbG9nIG5vdy4gKi8KKwkJCW91dGwoaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpIHwgMHgwMDYwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgcm91dGluZyBmcm9tIEFDOTcgbGluZSBvdXQgdG8gRnJvbnQgc3BlYWtlcnMgKi8KKwkJCW91dGwoaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpIHwgMHgwMDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJfQorCX0KKwkKKyNpZiAwCisJeworCXVuc2lnbmVkIGludCB0bXA7CisJLyogRklYTUU6IHRoZSBmb2xsb3dpbmcgcm91dGluZSBkaXNhYmxlcyBMaXZlRHJpdmUtSUkgISEgKi8KKwkvLyBUT1NMaW5rIGRldGVjdGlvbgorCWVtdS0+dG9zX2xpbmsgPSAwOworCXRtcCA9IGlubChlbXUtPnBvcnQgKyBIQ0ZHKTsKKwlpZiAodG1wICYgKEhDRkdfR1BJTlBVVDAgfCBIQ0ZHX0dQSU5QVVQxKSkgeworCQlvdXRsKHRtcHwweDgwMCwgZW11LT5wb3J0ICsgSENGRyk7CisJCXVkZWxheSg1MCk7CisJCWlmICh0bXAgIT0gKGlubChlbXUtPnBvcnQgKyBIQ0ZHKSAmIH4weDgwMCkpIHsKKwkJCWVtdS0+dG9zX2xpbmsgPSAxOworCQkJb3V0bCh0bXAsIGVtdS0+cG9ydCArIEhDRkcpOworCQl9CisJfQorCX0KKyNlbmRpZgorCisJc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11LCBJTlRFX1BDSUVSUk9SRU5BQkxFKTsKKworCWVtdS0+cmVzZXJ2ZWRfcGFnZSA9IChlbXUxMGsxX21lbWJsa190ICopc25kX2VtdTEwazFfc3ludGhfYWxsb2MoZW11LCA0MDk2KTsKKwlpZiAoZW11LT5yZXNlcnZlZF9wYWdlKQorCQllbXUtPnJlc2VydmVkX3BhZ2UtPm1hcF9sb2NrZWQgPSAxOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2RvbmUoZW11MTBrMV90ICogZW11KQoreworCWludCBjaDsKKworCW91dGwoMCwgZW11LT5wb3J0ICsgSU5URSk7CisKKwkvKgorCSAqICBTaHV0ZG93biB0aGUgY2hpcAorCSAqLworCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQ1lTVVNWLCBjaCwgMCk7CisJZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVlRGVCwgY2gsIDApOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDVkNGLCBjaCwgMCk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBUUlgsIGNoLCAwKTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ1BGLCBjaCwgMCk7CisJfQorCisJLyogcmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNSUNCUywgMCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgTUlDQkEsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYQlMsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYQkEsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYV0MsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFEQ0JTLCAwLCBBRENCU19CVUZTSVpFX05PTkUpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFEQ0JBLCAwLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQ0JTLCAwLCBUQ0JTX0JVRkZTSVpFXzE2Syk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVENCLCAwLCAwKTsKKwlpZiAoZW11LT5hdWRpZ3kpCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCBBX0RCR19TSU5HTEVfU1RFUCk7CisJZWxzZQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQKTsKKworCS8qIGRpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDTElFTCwgMCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0xJRUgsIDAsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFNPTEVMLCAwLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBTT0xFSCwgMCwgMCk7CisKKwkvKiByZW1vdmUgcmVzZXJ2ZWQgcGFnZSAqLworCWlmIChlbXUtPnJlc2VydmVkX3BhZ2UgIT0gTlVMTCkgeworCQlzbmRfZW11MTBrMV9zeW50aF9mcmVlKGVtdSwgKHNuZF91dGlsX21lbWJsa190ICopZW11LT5yZXNlcnZlZF9wYWdlKTsKKwkJZW11LT5yZXNlcnZlZF9wYWdlID0gTlVMTDsKKwl9CisKKwkvKiBkaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCisJb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBUQiwgMCwgMCk7CisKKwlzbmRfZW11MTBrMV9mcmVlX2VmeChlbXUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFQ0FSRCBmdW5jdGlvbmFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW4gQTEgU2lsaWNvbiwgdGhlc2UgYml0cyBhcmUgaW4gdGhlIEhDIHJlZ2lzdGVyICovCisjZGVmaW5lIEhPT0tOX0JJVAkJKDFMIDw8IDEyKQorI2RlZmluZSBIQU5ETl9CSVQJCSgxTCA8PCAxMSkKKyNkZWZpbmUgUFVMU0VOX0JJVAkJKDFMIDw8IDEwKQorCisjZGVmaW5lIEVDX0dESTEJCQkoMSA8PCAxMykKKyNkZWZpbmUgRUNfR0RJMAkJCSgxIDw8IDE0KQorCisjZGVmaW5lIEVDX05VTV9DT05UUk9MX0JJVFMJMjAKKworI2RlZmluZSBFQ19BQzNfREFUQV9TRUxOCTB4MDAwMUwKKyNkZWZpbmUgRUNfRUVfREFUQV9TRUwJCTB4MDAwMkwKKyNkZWZpbmUgRUNfRUVfQ05UUkxfU0VMTgkweDAwMDRMCisjZGVmaW5lIEVDX0VFQ0xLCQkweDAwMDhMCisjZGVmaW5lIEVDX0VFQ1MJCQkweDAwMTBMCisjZGVmaW5lIEVDX0VFU0RPCQkweDAwMjBMCisjZGVmaW5lIEVDX1RSSU1fQ1NOCQkweDAwNDBMCisjZGVmaW5lIEVDX1RSSU1fU0NMSwkJMHgwMDgwTAorI2RlZmluZSBFQ19UUklNX1NEQVRBCQkweDAxMDBMCisjZGVmaW5lIEVDX1RSSU1fTVVURU4JCTB4MDIwMEwKKyNkZWZpbmUgRUNfQURDQ0FMCQkweDA0MDBMCisjZGVmaW5lIEVDX0FEQ1JTVE4JCTB4MDgwMEwKKyNkZWZpbmUgRUNfREFDQ0FMCQkweDEwMDBMCisjZGVmaW5lIEVDX0RBQ01VVEVOCQkweDIwMDBMCisjZGVmaW5lIEVDX0xFRE4JCQkweDQwMDBMCisKKyNkZWZpbmUgRUNfU1BESUYwX1NFTF9TSElGVAkxNQorI2RlZmluZSBFQ19TUERJRjFfU0VMX1NISUZUCTE3CisjZGVmaW5lIEVDX1NQRElGMF9TRUxfTUFTSwkoMHgzTCA8PCBFQ19TUERJRjBfU0VMX1NISUZUKQorI2RlZmluZSBFQ19TUERJRjFfU0VMX01BU0sJKDB4N0wgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkKKyNkZWZpbmUgRUNfU1BESUYwX1NFTEVDVChfeCkJKCgoX3gpIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpICYgRUNfU1BESUYwX1NFTF9NQVNLKQorI2RlZmluZSBFQ19TUERJRjFfU0VMRUNUKF94KQkoKChfeCkgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkgJiBFQ19TUERJRjFfU0VMX01BU0spCisjZGVmaW5lIEVDX0NVUlJFTlRfUFJPTV9WRVJTSU9OIDB4MDEJLyogU2VsZi1leHBsYW5hdG9yeS4gIFRoaXMgc2hvdWxkCisJCQkJCSAqIGJlIGluY3JlbWVudGVkIGFueSB0aW1lIHRoZSBFRVBST00ncworCQkJCQkgKiBmb3JtYXQgaXMgY2hhbmdlZC4gICovCisKKyNkZWZpbmUgRUNfRUVQUk9NX1NJWkUJCTB4NDAJLyogRUNBUkQgRUVQUk9NIGhhcyA2NCAxNi1iaXQgd29yZHMgKi8KKworLyogQWRkcmVzc2VzIGZvciBzcGVjaWFsIHZhbHVlcyBzdG9yZWQgaW4gdG8gRUVQUk9NICovCisjZGVmaW5lIEVDX1BST01fVkVSU0lPTl9BRERSCTB4MjAJLyogQWRkcmVzcyBvZiB0aGUgY3VycmVudCBwcm9tIHZlcnNpb24gKi8KKyNkZWZpbmUgRUNfQk9BUkRSRVYwX0FERFIJMHgyMQkvKiBMU1cgb2YgYm9hcmQgcmV2ICovCisjZGVmaW5lIEVDX0JPQVJEUkVWMV9BRERSCTB4MjIJLyogTVNXIG9mIGJvYXJkIHJldiAqLworCisjZGVmaW5lIEVDX0xBU1RfUFJPTUZJTEVfQUREUgkweDJmCisKKyNkZWZpbmUgRUNfU0VSSUFMTlVNX0FERFIJMHgzMAkvKiBGaXJzdCB3b3JkIG9mIHNlcmlhbCBudW1iZXIuICBUaGUgCisJCQkJCSAqIGNhbiBiZSB1cCB0byAzMCBjaGFyYWN0ZXJzIGluIGxlbmd0aAorCQkJCQkgKiBhbmQgaXMgc3RvcmVkIGFzIGEgTlVMTC10ZXJtaW5hdGVkCisJCQkJCSAqIEFTQ0lJIHN0cmluZy4gIEFueSB1bnVzZWQgYnl0ZXMgbXVzdCBiZQorCQkJCQkgKiBmaWxsZWQgd2l0aCB6ZXJvcyAqLworI2RlZmluZSBFQ19DSEVDS1NVTV9BRERSCTB4M2YJLyogTG9jYXRpb24gYXQgd2hpY2ggY2hlY2tzdW0gaXMgc3RvcmVkICovCisKKworLyogTW9zdCBvZiB0aGlzIHN0dWZmIGlzIHByZXR0eSBzZWxmLWV2aWRlbnQuICBBY2NvcmRpbmcgdG8gdGhlIGhhcmR3YXJlIAorICogZHVkZXMsIHdlIG5lZWQgdG8gbGVhdmUgdGhlIEFEQ0NBTCBiaXQgbG93IGluIG9yZGVyIHRvIGF2b2lkIGEgREMgCisgKiBvZmZzZXQgcHJvYmxlbS4gIFdlaXJkLgorICovCisjZGVmaW5lIEVDX1JBV19SVU5fTU9ERQkJKEVDX0RBQ01VVEVOIHwgRUNfQURDUlNUTiB8IEVDX1RSSU1fTVVURU4gfCBcCisJCQkJIEVDX1RSSU1fQ1NOKQorCisKKyNkZWZpbmUgRUNfREVGQVVMVF9BRENfR0FJTgkweEM0QzQKKyNkZWZpbmUgRUNfREVGQVVMVF9TUERJRjBfU0VMCTB4MAorI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMV9TRUwJMHg0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZ1bmMgQ2xvY2sgYml0cyBpbnRvIHRoZSBFY2FyZCdzIGNvbnRyb2wgbGF0Y2guICBUaGUgRWNhcmQgdXNlcyBhCisgKiAgY29udHJvbCBsYXRjaCB3aWxsIGlzIGxvYWRlZCBiaXQtc2VyaWFsbHkgYnkgdG9nZ2xpbmcgdGhlIE1vZGVtIGNvbnRyb2wKKyAqICBsaW5lcyBmcm9tIGZ1bmN0aW9uIDIgb24gdGhlIEU4MDEwLiAgVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGVzZSBkZXRhaWxzCisgKiAgYW5kIHByZXNlbnRzIHRoZSBpbGx1c2lvbiB0aGF0IHdlIGFyZSBhY3R1YWxseSB3cml0aW5nIHRvIGEgZGlzdGluY3QKKyAqICByZWdpc3Rlci4KKyAqLworCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9lY2FyZF93cml0ZShlbXUxMGsxX3QgKiBlbXUsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGhjX3BvcnQ7CisJdW5zaWduZWQgaW50IGhjX3ZhbHVlOworCisJaGNfcG9ydCA9IGVtdS0+cG9ydCArIEhDRkc7CisJaGNfdmFsdWUgPSBpbmwoaGNfcG9ydCkgJiB+KEhPT0tOX0JJVCB8IEhBTkROX0JJVCB8IFBVTFNFTl9CSVQpOworCW91dGwoaGNfdmFsdWUsIGhjX3BvcnQpOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgRUNfTlVNX0NPTlRST0xfQklUUzsgY291bnQrKykgeworCisJCS8qIFNldCB1cCB0aGUgdmFsdWUgKi8KKwkJZGF0YSA9ICgodmFsdWUgJiAweDEpID8gUFVMU0VOX0JJVCA6IDApOworCQl2YWx1ZSA+Pj0gMTsKKworCQlvdXRsKGhjX3ZhbHVlIHwgZGF0YSwgaGNfcG9ydCk7CisKKwkJLyogQ2xvY2sgdGhlIHNoaWZ0IHJlZ2lzdGVyICovCisJCW91dGwoaGNfdmFsdWUgfCBkYXRhIHwgSEFORE5fQklULCBoY19wb3J0KTsKKwkJb3V0bChoY192YWx1ZSB8IGRhdGEsIGhjX3BvcnQpOworCX0KKworCS8qIExhdGNoIHRoZSBiaXRzICovCisJb3V0bChoY192YWx1ZSB8IEhPT0tOX0JJVCwgaGNfcG9ydCk7CisJb3V0bChoY192YWx1ZSwgaGNfcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZ1bmMgU2V0IHRoZSBnYWluIG9mIHRoZSBFQ0FSRCdzIENTMzMxMCBUcmltL2dhaW4gY29udHJvbGxlci4gIFRoZQorICogdHJpbSB2YWx1ZSBjb25zaXN0cyBvZiBhIDE2Yml0IHZhbHVlIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHR3bworICogOCBiaXQgZ2Fpbi90cmltIHZhbHVlcywgb25lIGZvciB0aGUgbGVmdCBjaGFubmVsIGFuZCBvbmUgZm9yIHRoZQorICogcmlnaHQgY2hhbm5lbC4gIFRoZSBmb2xsb3dpbmcgdGFibGUgbWFwcyBmcm9tIHRoZSBHYWluL0F0dGVudWF0aW9uCisgKiB2YWx1ZSBpbiBkZWNpYmVscyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBwYXR0ZXJuIGZvciBhIHNpbmdsZQorICogY2hhbm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9lY2FyZF9zZXRhZGNnYWluKGVtdTEwazFfdCAqIGVtdSwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IGdhaW4pCit7CisJdW5zaWduZWQgaW50IGJpdDsKKworCS8qIEVuYWJsZSB3cml0aW5nIHRvIHRoZSBUUklNIHJlZ2lzdGVycyAqLworCXNuZF9lbXUxMGsxX2VjYXJkX3dyaXRlKGVtdSwgZW11LT5lY2FyZF9jdHJsICYgfkVDX1RSSU1fQ1NOKTsKKworCS8qIERvIGl0IGFnYWluIHRvIGluc3VyZSB0aGF0IHdlIG1lZXQgaG9sZCB0aW1lIHJlcXVpcmVtZW50cyAqLworCXNuZF9lbXUxMGsxX2VjYXJkX3dyaXRlKGVtdSwgZW11LT5lY2FyZF9jdHJsICYgfkVDX1RSSU1fQ1NOKTsKKworCWZvciAoYml0ID0gKDEgPDwgMTUpOyBiaXQ7IGJpdCA+Pj0gMSkgeworCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisJCQorCQl2YWx1ZSA9IGVtdS0+ZWNhcmRfY3RybCAmIH4oRUNfVFJJTV9DU04gfCBFQ19UUklNX1NEQVRBKTsKKworCQlpZiAoZ2FpbiAmIGJpdCkKKwkJCXZhbHVlIHw9IEVDX1RSSU1fU0RBVEE7CisKKwkJLyogQ2xvY2sgdGhlIGJpdCAqLworCQlzbmRfZW11MTBrMV9lY2FyZF93cml0ZShlbXUsIHZhbHVlKTsKKwkJc25kX2VtdTEwazFfZWNhcmRfd3JpdGUoZW11LCB2YWx1ZSB8IEVDX1RSSU1fU0NMSyk7CisJCXNuZF9lbXUxMGsxX2VjYXJkX3dyaXRlKGVtdSwgdmFsdWUpOworCX0KKworCXNuZF9lbXUxMGsxX2VjYXJkX3dyaXRlKGVtdSwgZW11LT5lY2FyZF9jdHJsKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VtdTEwazFfZWNhcmRfaW5pdChlbXUxMGsxX3QgKiBlbXUpCit7CisJdW5zaWduZWQgaW50IGhjX3ZhbHVlOworCisJLyogU2V0IHVwIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisJZW11LT5lY2FyZF9jdHJsID0gRUNfUkFXX1JVTl9NT0RFIHwKKwkJCSAgRUNfU1BESUYwX1NFTEVDVChFQ19ERUZBVUxUX1NQRElGMF9TRUwpIHwKKwkJCSAgRUNfU1BESUYxX1NFTEVDVChFQ19ERUZBVUxUX1NQRElGMV9TRUwpOworCisJLyogU3RlcCAwOiBTZXQgdGhlIGNvZGVjIHR5cGUgaW4gdGhlIGhhcmR3YXJlIGNvbnRyb2wgcmVnaXN0ZXIgCisJICogYW5kIGVuYWJsZSBhdWRpbyBvdXRwdXQgKi8KKwloY192YWx1ZSA9IGlubChlbXUtPnBvcnQgKyBIQ0ZHKTsKKwlvdXRsKGhjX3ZhbHVlIHwgSENGR19BVURJT0VOQUJMRSB8IEhDRkdfQ09ERUNGT1JNQVRfSTJTLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwlpbmwoZW11LT5wb3J0ICsgSENGRyk7CisKKwkvKiBTdGVwIDE6IFR1cm4gb2ZmIHRoZSBsZWQgYW5kIGRlYXNzZXJ0IFRSSU1fQ1MgKi8KKwlzbmRfZW11MTBrMV9lY2FyZF93cml0ZShlbXUsIEVDX0FEQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7CisKKwkvKiBTdGVwIDI6IENhbGlicmF0ZSB0aGUgQURDIGFuZCBEQUMgKi8KKwlzbmRfZW11MTBrMV9lY2FyZF93cml0ZShlbXUsIEVDX0RBQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7CisKKwkvKiBTdGVwIDM6IFdhaXQgZm9yIGF3aGlsZTsgICBYWFggV2UgY2FuJ3QgZ2V0IGF3YXkgd2l0aCB0aGlzCisJICogdW5kZXIgYSByZWFsIG9wZXJhdGluZyBzeXN0ZW07IHdlJ2xsIG5lZWQgdG8gYmxvY2sgYW5kIHdhaXQgdGhhdAorCSAqIHdheS4gKi8KKwlzbmRfZW11MTBrMV93YWl0KGVtdSwgNDgwMDApOworCisJLyogU3RlcCA0OiBTd2l0Y2ggb2ZmIHRoZSBEQUMgYW5kIEFEQyBjYWxpYnJhdGlvbi4gIE5vdGUKKwkgKiBUaGF0IEFEQ19DQUwgaXMgYWN0dWFsbHkgYW4gaW52ZXJ0ZWQgc2lnbmFsLCBzbyB3ZSBhc3NlcnQKKwkgKiBpdCBoZXJlIHRvIHN0b3AgY2FsaWJyYXRpb24uICAqLworCXNuZF9lbXUxMGsxX2VjYXJkX3dyaXRlKGVtdSwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKKworCS8qIFN0ZXAgNDogU3dpdGNoIGludG8gcnVuIG1vZGUgKi8KKwlzbmRfZW11MTBrMV9lY2FyZF93cml0ZShlbXUsIGVtdS0+ZWNhcmRfY3RybCk7CisKKwkvKiBTdGVwIDU6IFNldCB0aGUgYW5hbG9nIGlucHV0IGdhaW4gKi8KKwlzbmRfZW11MTBrMV9lY2FyZF9zZXRhZGNnYWluKGVtdSwgRUNfREVGQVVMVF9BRENfR0FJTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBDcmVhdGUgdGhlIEVNVTEwSzEgaW5zdGFuY2UKKyAqLworCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2ZyZWUoZW11MTBrMV90ICplbXUpCit7CisJaWYgKGVtdS0+cG9ydCkgewkvKiBhdm9pZCBhY2Nlc3MgdG8gYWxyZWFkeSB1c2VkIGhhcmR3YXJlICovCisJICAgICAgIAlzbmRfZW11MTBrMV9meDgwMTBfdHJhbV9zZXR1cChlbXUsIDApOworCQlzbmRfZW11MTBrMV9kb25lKGVtdSk7CisgICAgICAgCX0KKwlpZiAoZW11LT5tZW1oZHIpCisJCXNuZF91dGlsX21lbWhkcl9mcmVlKGVtdS0+bWVtaGRyKTsKKwlpZiAoZW11LT5zaWxlbnRfcGFnZS5hcmVhKQorCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmVtdS0+c2lsZW50X3BhZ2UpOworCWlmIChlbXUtPnB0Yl9wYWdlcy5hcmVhKQorCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmVtdS0+cHRiX3BhZ2VzKTsKKwl2ZnJlZShlbXUtPnBhZ2VfcHRyX3RhYmxlKTsKKwl2ZnJlZShlbXUtPnBhZ2VfYWRkcl90YWJsZSk7CisJaWYgKGVtdS0+aXJxID49IDApCisJCWZyZWVfaXJxKGVtdS0+aXJxLCAodm9pZCAqKWVtdSk7CisJaWYgKGVtdS0+cG9ydCkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhlbXUtPnBjaSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGVtdS0+cGNpKTsKKwlpZiAoZW11LT5hdWRpZ3kgJiYgZW11LT5yZXZpc2lvbiA9PSA0KSAvKiBQMTZWICovCQorCQlzbmRfcDE2dl9mcmVlKGVtdSk7CisJa2ZyZWUoZW11KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF9lbXUxMGsxX2ZyZWUoZW11KTsKK30KKworLyogdmVuZG9yLCBkZXZpY2UsIHN1YnN5c3RlbSwgZW11MTBrMV9jaGlwLCBlbXUxMGsyX2NoaXAsIGNhMDEwMl9jaGlwLCBjYTAxMDhfY2hpcCwgY2EwMTUxX2NoaXAsIHNwazcxLCBzcGRpZl9idWcsIGFjOTdfY2hpcCwgZWNhcmQsIGRyaXZlciwgbmFtZSAqLworCitzdGF0aWMgZW11X2NoaXBfZGV0YWlsc190IGVtdV9jaGlwX2RldGFpbHNbXSA9IHsKKwkvKiBBdWRpZ3kgMiBWYWx1ZSBBQzMgb3V0IGRvZXMgbm90IHdvcmsgeWV0LiBOZWVkIHRvIGZpbmQgb3V0IGhvdyB0byB0dXJuIG9mZiBpbnRlcnBvbGF0b3JzLiovCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsIC5zdWJzeXN0ZW0gPSAweDEwMDExMTAyLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJBdWRpZ3kgMiBWYWx1ZSBbU0IwNDAwXSIsIAorCSAuZW11MTBrMl9jaGlwID0gMSwKKwkgLmNhMDEwOF9jaGlwID0gMSwKKwkgLnNwazcxID0gMX0gLAorCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LCAKKwkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgVmFsdWUgW1Vua25vd25dIiwgCisJIC5lbXUxMGsyX2NoaXAgPSAxLAorCSAuY2EwMTA4X2NoaXAgPSAxfSAsCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDQsIC5zdWJzeXN0ZW0gPSAweDIwMDcxMTAyLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJBdWRpZ3kgNCBQUk8gW1NCMDM4MF0iLCAKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDJfY2hpcCA9IDEsCisJIC5jYTAxNTFfY2hpcCA9IDEsCisJIC5zcGs3MSA9IDEsCisJIC5zcGRpZl9idWcgPSAxLAorCSAuYWM5N19jaGlwID0gMX0gLAorCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA0LCAuc3Vic3lzdGVtID0gMHgyMDAyMTEwMiwKKwkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgWlMgW1NCMDM1MF0iLCAKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDJfY2hpcCA9IDEsCisJIC5jYTAxNTFfY2hpcCA9IDEsCisJIC5zcGs3MSA9IDEsCisJIC5zcGRpZl9idWcgPSAxLAorCSAuYWM5N19jaGlwID0gMX0gLAorCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA0LCAuc3Vic3lzdGVtID0gMHgyMDAxMTEwMiwKKwkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgWlMgWzIwMDFdIiwgCisJIC5lbXUxMGsyX2NoaXAgPSAxLAorCSAuY2EwMTAyX2NoaXAgPSAxLAorCSAuY2EwMTUxX2NoaXAgPSAxLAorCSAuc3BrNzEgPSAxLAorCSAuc3BkaWZfYnVnID0gMSwKKwkgLmFjOTdfY2hpcCA9IDF9ICwKKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwNCwgLnN1YnN5c3RlbSA9IDB4MTAwNzExMDIsCisJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIFtTQjAyNDBdIiwgCisJIC5lbXUxMGsyX2NoaXAgPSAxLAorCSAuY2EwMTAyX2NoaXAgPSAxLAorCSAuY2EwMTUxX2NoaXAgPSAxLAorCSAuc3BrNzEgPSAxLAorCSAuc3BkaWZfYnVnID0gMSwKKwkgLmFjOTdfY2hpcCA9IDF9ICwKKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwNCwgLnN1YnN5c3RlbSA9IDB4MTAwNTExMDIsCisJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIEVYIFsxMDA1XSIsIAorCSAuZW11MTBrMl9jaGlwID0gMSwKKwkgLmNhMDEwMl9jaGlwID0gMSwKKwkgLmNhMDE1MV9jaGlwID0gMSwKKwkgLnNwZGlmX2J1ZyA9IDF9ICwKKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwNCwgLnN1YnN5c3RlbSA9IDB4MTAwMjExMDIsCisJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIFBsYXRpbnVtIFtTQjAyNDBQXSIsIAorCSAuZW11MTBrMl9jaGlwID0gMSwKKwkgLmNhMDEwMl9jaGlwID0gMSwKKwkgLmNhMDE1MV9jaGlwID0gMSwKKwkgLnNwazcxID0gMSwKKwkgLnNwZGlmX2J1ZyA9IDEsCisJIC5hYzk3X2NoaXAgPSAxfSAsCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDQsCisJIC5kcml2ZXIgPSAiQXVkaWd5IiwgLm5hbWUgPSAiQXVkaWd5IDEgb3IgMiBbVW5rbm93bl0iLCAKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDJfY2hpcCA9IDEsCisJIC5zcGRpZl9idWcgPSAxfSAsCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDIsIC5zdWJzeXN0ZW0gPSAweDQwMDExMTAyLAorCSAuZHJpdmVyID0gIkVNVTEwSzEiLCAubmFtZSA9ICJFLW11IEFQUyBbNDAwMV0iLCAKKwkgLmVtdTEwazFfY2hpcCA9IDEsCisJIC5lY2FyZCA9IDF9ICwKKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwMiwgLnN1YnN5c3RlbSA9IDB4ODA2NDExMDIsCisJIC5kcml2ZXIgPSAiRU1VMTBLMSIsIC5uYW1lID0gIlNCIExpdmUgNS4xIiwgCisJIC5lbXUxMGsxX2NoaXAgPSAxLAorCSAuYWM5N19jaGlwID0gMX0gLAorCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDAyLAorCSAuZHJpdmVyID0gIkVNVTEwSzEiLCAubmFtZSA9ICJTQiBMaXZlIFtVbmtub3duXSIsIAorCSAuZW11MTBrMV9jaGlwID0gMSwKKwkgLmFjOTdfY2hpcCA9IDF9ICwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9jcmVhdGUoc25kX2NhcmRfdCAqIGNhcmQsCisJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqIHBjaSwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IGV4dGluX21hc2ssCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBleHRvdXRfbWFzaywKKwkJICAgICAgIGxvbmcgbWF4X2NhY2hlX2J5dGVzLAorCQkgICAgICAgaW50IGVuYWJsZV9pciwKKwkJICAgICAgIGVtdTEwazFfdCAqKiByZW11KQoreworCWVtdTEwazFfdCAqZW11OworCWludCBlcnI7CisJaW50IGlzX2F1ZGlneTsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCWNvbnN0IGVtdV9jaGlwX2RldGFpbHNfdCAqYzsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF9lbXUxMGsxX2Rldl9mcmVlLAorCX07CisJCisJKnJlbXUgPSBOVUxMOworCisJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVtdSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCplbXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW11ID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbXUtPmNhcmQgPSBjYXJkOworCXNwaW5fbG9ja19pbml0KCZlbXUtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZW11LT5lbXVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmVtdS0+dm9pY2VfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmVtdS0+c3ludGhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmVtdS0+bWVtYmxrX2xvY2spOworCWluaXRfTVVURVgoJmVtdS0+cHRiX2xvY2spOworCWluaXRfTVVURVgoJmVtdS0+Zng4MDEwLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZlbXUtPm1hcHBlZF9saW5rX2hlYWQpOworCUlOSVRfTElTVF9IRUFEKCZlbXUtPm1hcHBlZF9vcmRlcl9saW5rX2hlYWQpOworCWVtdS0+cGNpID0gcGNpOworCWVtdS0+aXJxID0gLTE7CisJZW11LT5zeW50aCA9IE5VTEw7CisJZW11LT5nZXRfc3ludGhfdm9pY2UgPSBOVUxMOworCS8qIHJlYWQgcmV2aXNpb24gJiBzZXJpYWwgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKwllbXUtPnJldmlzaW9uID0gcmV2aXNpb247CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZlbXUtPnNlcmlhbCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmZW11LT5tb2RlbCk7CisJZW11LT5jYXJkX3R5cGUgPSBFTVUxMEsxX0NBUkRfQ1JFQVRJVkU7CisJc25kX3ByaW50ZGQoInZlbmRvcj0weCV4LCBkZXZpY2U9MHgleCwgc3Vic3lzdGVtX3ZlbmRvcl9pZD0weCV4LCBzdWJzeXN0ZW1faWQ9MHgleFxuIixwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsIGVtdS0+c2VyaWFsLCBlbXUtPm1vZGVsKTsKKworCWZvciAoYyA9IGVtdV9jaGlwX2RldGFpbHM7IGMtPnZlbmRvcjsgYysrKSB7CisJCWlmIChjLT52ZW5kb3IgPT0gcGNpLT52ZW5kb3IgJiYgYy0+ZGV2aWNlID09IHBjaS0+ZGV2aWNlKSB7CisJCQlpZiAoYy0+c3Vic3lzdGVtID09IGVtdS0+c2VyaWFsKSBicmVhazsKKwkJCWlmIChjLT5zdWJzeXN0ZW0gPT0gMCkgYnJlYWs7CisJCX0KKwl9CisJaWYgKGMtPnZlbmRvciA9PSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazE6IENhcmQgbm90IHJlY29nbmlzZWRcbiIpOworCQlrZnJlZShlbXUpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMgPSBjOworCWlmIChjLT5zdWJzeXN0ZW0gIT0gMCkKKwkJc25kX3ByaW50ZGQoIlNvdW5kIGNhcmQgbmFtZT0lc1xuIiwgYy0+bmFtZSk7CisJZWxzZQorCQlzbmRfcHJpbnRkZCgiU291bmQgY2FyZCBuYW1lPSVzLCB2ZW5kb3I9MHgleCwgZGV2aWNlPTB4JXgsIHN1YnN5c3RlbT0weCV4XG4iLCBjLT5uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsIGVtdS0+c2VyaWFsKTsKKwkKKwlpc19hdWRpZ3kgPSBlbXUtPmF1ZGlneSA9IGMtPmVtdTEwazJfY2hpcDsKKworCS8qIHNldCB0aGUgRE1BIHRyYW5zZmVyIG1hc2sgKi8KKwllbXUtPmRtYV9tYXNrID0gaXNfYXVkaWd5ID8gQVVESUdZX0RNQV9NQVNLIDogRU1VMTBLMV9ETUFfTUFTSzsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIGVtdS0+ZG1hX21hc2spIDwgMCB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBlbXUtPmRtYV9tYXNrKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgUENJIGJ1c21hc3RlciBETUEgd2l0aCBtYXNrIDB4JWx4XG4iLCBlbXUtPmRtYV9tYXNrKTsKKwkJa2ZyZWUoZW11KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChpc19hdWRpZ3kpCisJCWVtdS0+Z3ByX2Jhc2UgPSBBX0ZYR1BSRUdCQVNFOworCWVsc2UKKwkJZW11LT5ncHJfYmFzZSA9IEZYR1BSRUdCQVNFOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkVNVTEwSzEiKSkgPCAwKSB7CisJCWtmcmVlKGVtdSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwllbXUtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VtdTEwazFfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJFTVUxMEsxIiwgKHZvaWQgKillbXUpKSB7CisJCXNuZF9lbXUxMGsxX2ZyZWUoZW11KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZW11LT5pcnEgPSBwY2ktPmlycTsKKworCWVtdS0+bWF4X2NhY2hlX3BhZ2VzID0gbWF4X2NhY2hlX2J5dGVzID4+IFBBR0VfU0hJRlQ7CisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJMzIgKiAxMDI0LCAmZW11LT5wdGJfcGFnZXMpIDwgMCkgeworCQlzbmRfZW11MTBrMV9mcmVlKGVtdSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVtdS0+cGFnZV9wdHJfdGFibGUgPSAodm9pZCAqKil2bWFsbG9jKGVtdS0+bWF4X2NhY2hlX3BhZ2VzICogc2l6ZW9mKHZvaWQqKSk7CisJZW11LT5wYWdlX2FkZHJfdGFibGUgPSAodW5zaWduZWQgbG9uZyopdm1hbGxvYyhlbXUtPm1heF9jYWNoZV9wYWdlcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKGVtdS0+cGFnZV9wdHJfdGFibGUgPT0gTlVMTCB8fCBlbXUtPnBhZ2VfYWRkcl90YWJsZSA9PSBOVUxMKSB7CisJCXNuZF9lbXUxMGsxX2ZyZWUoZW11KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJRU1VUEFHRVNJWkUsICZlbXUtPnNpbGVudF9wYWdlKSA8IDApIHsKKwkJc25kX2VtdTEwazFfZnJlZShlbXUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZW11LT5tZW1oZHIgPSBzbmRfdXRpbF9tZW1oZHJfbmV3KGVtdS0+bWF4X2NhY2hlX3BhZ2VzICogUEFHRV9TSVpFKTsKKwlpZiAoZW11LT5tZW1oZHIgPT0gTlVMTCkgeworCQlzbmRfZW11MTBrMV9mcmVlKGVtdSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbXUtPm1lbWhkci0+YmxvY2tfZXh0cmFfc2l6ZSA9IHNpemVvZihlbXUxMGsxX21lbWJsa190KSAtIHNpemVvZihzbmRfdXRpbF9tZW1ibGtfdCk7CisKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCisJaWYgKGMtPmVjYXJkKSB7CisJCWVtdS0+Y2FyZF90eXBlID0gRU1VMTBLMV9DQVJEX0VNVUFQUzsKKwkJZW11LT5BUFMgPSAxOworCX0KKwlpZiAoISBjLT5hYzk3X2NoaXApCisJCWVtdS0+bm9fYWM5NyA9IDE7CisJCisJZW11LT5zcGs3MSA9IGMtPnNwazcxOworCQorCWVtdS0+Zng4MDEwLmZ4YnVzX21hc2sgPSAweDMwM2Y7CisJaWYgKGV4dGluX21hc2sgPT0gMCkKKwkJZXh0aW5fbWFzayA9IDB4M2ZjZjsKKwlpZiAoZXh0b3V0X21hc2sgPT0gMCkKKwkJZXh0b3V0X21hc2sgPSAweDdmZmY7CisJZW11LT5meDgwMTAuZXh0aW5fbWFzayA9IGV4dGluX21hc2s7CisJZW11LT5meDgwMTAuZXh0b3V0X21hc2sgPSBleHRvdXRfbWFzazsKKworCWlmIChlbXUtPkFQUykgeworCQlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2VjYXJkX2luaXQoZW11KSkgPCAwKSB7CisJCQlzbmRfZW11MTBrMV9mcmVlKGVtdSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJLyogNS4xOiBFbmFibGUgdGhlIGFkZGl0aW9uYWwgQUM5NyBTbG90cy4gSWYgdGhlIGVtdTEwazEgdmVyc2lvbgorCQkJZG9lcyBub3Qgc3VwcG9ydCB0aGlzLCBpdCBzaG91bGRuJ3QgZG8gYW55IGhhcm0gKi8KKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFJ8QUM5N1NMT1RfTEZFKTsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2luaXQoZW11LCBlbmFibGVfaXIpKSA8IDApIHsKKwkJc25kX2VtdTEwazFfZnJlZShlbXUpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBlbXUsICZvcHMpKSA8IDApIHsKKwkJc25kX2VtdTEwazFfZnJlZShlbXUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9lbXUxMGsxX3Byb2NfaW5pdChlbXUpOworCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCSpyZW11ID0gZW11OworCXJldHVybiAwOworfQorCisvKiBtZW1vcnkuYyAqLworRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9zeW50aF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3N5bnRoX2ZyZWUpOworRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9zeW50aF9iemVybyk7CitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3N5bnRoX2NvcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfbWVtYmxrX21hcCk7CisvKiB2b2ljZS5jICovCitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3ZvaWNlX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfdm9pY2VfZnJlZSk7CisvKiBpby5jICovCitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3B0cl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfcHRyX3dyaXRlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGY2NjhlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIFBhdGNoIHRyYW5zZmVyIGNhbGxiYWNrIGZvciBFbXUxMGsxCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBUYWthc2hpIGl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisvKgorICogQWxsIHRoZSBjb2RlIGZvciBsb2FkaW5nIGluIGEgcGF0Y2guICBUaGVyZSBpcyB2ZXJ5IGxpdHRsZSB0aGF0IGlzCisgKiBjaGlwIHNwZWNpZmljIGhlcmUuICBKdXN0IHRoZSBhY3R1YWwgd3JpdGluZyB0byB0aGUgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgImVtdTEwazFfc3ludGhfbG9jYWwuaCIKKworLyoKKyAqLworI2RlZmluZSBCTEFOS19MT09QX1NUQVJUCTQKKyNkZWZpbmUgQkxBTktfTE9PUF9FTkQJCTgKKyNkZWZpbmUgQkxBTktfTE9PUF9TSVpFCQkxMgorI2RlZmluZSBCTEFOS19IRUFEX1NJWkUJCTMyCisKKy8qCisgKiBhbGxvY2F0ZSBhIHNhbXBsZSBibG9jayBhbmQgY29weSBkYXRhIGZyb20gdXNlcnNwYWNlCisgKi8KK2ludAorc25kX2VtdTEwazFfc2FtcGxlX25ldyhzbmRfZW11eF90ICpyZWMsIHNuZF9zZl9zYW1wbGVfdCAqc3AsCisJCSAgICAgICBzbmRfdXRpbF9tZW1oZHJfdCAqaGRyLCBjb25zdCB2b2lkIF9fdXNlciAqZGF0YSwgbG9uZyBjb3VudCkKK3sKKwlpbnQgb2Zmc2V0OworCWludCB0cnVlc2l6ZSwgc2l6ZSwgbG9vcHNpemUsIGJsb2Nrc2l6ZTsKKwlpbnQgbG9vcGVuZCwgc2FtcGxlZW5kOworCXVuc2lnbmVkIGludCBzdGFydF9hZGRyOworCWVtdTEwazFfdCAqZW11OworCisJZW11ID0gcmVjLT5odzsKKwlzbmRfYXNzZXJ0KHNwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfYXNzZXJ0KGhkciAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoc3AtPnYuc2l6ZSA9PSAwKSB7CisJCXNuZF9wcmludGQoImVtdTogcm9tIGZvbnQgZm9yIHNhbXBsZSAlZFxuIiwgc3AtPnYuc2FtcGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcmVjYWxjdWxhdGUgYWRkcmVzcyBvZmZzZXQgKi8KKwlzcC0+di5lbmQgLT0gc3AtPnYuc3RhcnQ7CisJc3AtPnYubG9vcHN0YXJ0IC09IHNwLT52LnN0YXJ0OworCXNwLT52Lmxvb3BlbmQgLT0gc3AtPnYuc3RhcnQ7CisJc3AtPnYuc3RhcnQgPSAwOworCisJLyogc29tZSBzYW1wbGVzIGhhdmUgaW52YWxpZCBkYXRhLiAgdGhlIGFkZHJlc3NlcyBhcmUgY29ycmVjdGVkIGluIHZvaWNlIGluZm8gKi8KKwlzYW1wbGVlbmQgPSBzcC0+di5lbmQ7CisJaWYgKHNhbXBsZWVuZCA+IHNwLT52LnNpemUpCisJCXNhbXBsZWVuZCA9IHNwLT52LnNpemU7CisJbG9vcGVuZCA9IHNwLT52Lmxvb3BlbmQ7CisJaWYgKGxvb3BlbmQgPiBzYW1wbGVlbmQpCisJCWxvb3BlbmQgPSBzYW1wbGVlbmQ7CisKKwkvKiBiZSBzdXJlIGxvb3AgcG9pbnRzIHN0YXJ0IDwgZW5kICovCisJaWYgKHNwLT52Lmxvb3BzdGFydCA+PSBzcC0+di5sb29wZW5kKSB7CisJCWludCB0bXAgPSBzcC0+di5sb29wc3RhcnQ7CisJCXNwLT52Lmxvb3BzdGFydCA9IHNwLT52Lmxvb3BlbmQ7CisJCXNwLT52Lmxvb3BlbmQgPSB0bXA7CisJfQorCisJLyogY29tcHV0ZSB0cnVlIGRhdGEgc2l6ZSB0byBiZSBsb2FkZWQgKi8KKwl0cnVlc2l6ZSA9IHNwLT52LnNpemUgKyBCTEFOS19IRUFEX1NJWkU7CisJbG9vcHNpemUgPSAwOworI2lmIDAgLyogbm90IHN1cHBvcnRlZCAqLworCWlmIChzcC0+di5tb2RlX2ZsYWdzICYgKFNORFJWX1NGTlRfU0FNUExFX0JJRElSX0xPT1B8U05EUlZfU0ZOVF9TQU1QTEVfUkVWRVJTRV9MT09QKSkKKwkJbG9vcHNpemUgPSBzcC0+di5sb29wZW5kIC0gc3AtPnYubG9vcHN0YXJ0OworCXRydWVzaXplICs9IGxvb3BzaXplOworI2VuZGlmCisJaWYgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV9OT19CTEFOSykKKwkJdHJ1ZXNpemUgKz0gQkxBTktfTE9PUF9TSVpFOworCisJLyogdHJ5IHRvIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrICovCisJYmxvY2tzaXplID0gdHJ1ZXNpemU7CisJaWYgKCEgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV84QklUUykpCisJCWJsb2Nrc2l6ZSAqPSAyOworCXNwLT5ibG9jayA9IHNuZF9lbXUxMGsxX3N5bnRoX2FsbG9jKGVtdSwgYmxvY2tzaXplKTsKKwlpZiAoc3AtPmJsb2NrID09IE5VTEwpIHsKKwkJc25kX3ByaW50ZCgiZW11MTBrMTogc3ludGggbWFsbG9jIGZhaWxlZCAoc2l6ZT0lZClcbiIsIGJsb2Nrc2l6ZSk7CisJCS8qIG5vdCBFTk9NRU0gKGZvciBjb21wYXRpYmlsaXR5IHdpdGggT1NTKSAqLworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJLyogc2V0IHRoZSB0b3RhbCBzaXplICovCisJc3AtPnYudHJ1ZXNpemUgPSBibG9ja3NpemU7CisKKwkvKiB3cml0ZSBibGFuayBzYW1wbGVzIGF0IGhlYWQgKi8KKwlvZmZzZXQgPSAwOworCXNpemUgPSBCTEFOS19IRUFEX1NJWkU7CisJaWYgKCEgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV84QklUUykpCisJCXNpemUgKj0gMjsKKwlzbmRfYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gYmxvY2tzaXplLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2VtdTEwazFfc3ludGhfYnplcm8oZW11LCBzcC0+YmxvY2ssIG9mZnNldCwgc2l6ZSk7CisJb2Zmc2V0ICs9IHNpemU7CisKKwkvKiBjb3B5IHN0YXJ0LT5sb29wZW5kICovCisJc2l6ZSA9IGxvb3BlbmQ7CisJaWYgKCEgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV84QklUUykpCisJCXNpemUgKj0gMjsKKwlzbmRfYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gYmxvY2tzaXplLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9lbXUxMGsxX3N5bnRoX2NvcHlfZnJvbV91c2VyKGVtdSwgc3AtPmJsb2NrLCBvZmZzZXQsIGRhdGEsIHNpemUpKSB7CisJCXNuZF9lbXUxMGsxX3N5bnRoX2ZyZWUoZW11LCBzcC0+YmxvY2spOworCQlzcC0+YmxvY2sgPSBOVUxMOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJb2Zmc2V0ICs9IHNpemU7CisJZGF0YSArPSBzaXplOworCisjaWYgMCAvKiBub3Qgc3VwcHBvcnRlZCB5ZXQgKi8KKwkvKiBoYW5kbGUgcmV2ZXJzZSAob3IgYmlkaXJlY3Rpb25hbCkgbG9vcCAqLworCWlmIChzcC0+di5tb2RlX2ZsYWdzICYgKFNORFJWX1NGTlRfU0FNUExFX0JJRElSX0xPT1B8U05EUlZfU0ZOVF9TQU1QTEVfUkVWRVJTRV9MT09QKSkgeworCQkvKiBjb3B5IGxvb3AgaW4gcmV2ZXJzZSAqLworCQlpZiAoISAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKSkgeworCQkJaW50IHdvZmZzZXQ7CisJCQl1bnNpZ25lZCBzaG9ydCAqd2Jsb2NrID0gKHVuc2lnbmVkIHNob3J0KilibG9jazsKKwkJCXdvZmZzZXQgPSBvZmZzZXQgLyAyOworCQkJc25kX2Fzc2VydChvZmZzZXQgKyBsb29wc2l6ZSoyIDw9IGJsb2Nrc2l6ZSwgcmV0dXJuIC1FSU5WQUwpOworCQkJZm9yIChpID0gMDsgaSA8IGxvb3BzaXplOyBpKyspCisJCQkJd2Jsb2NrW3dvZmZzZXQgKyBpXSA9IHdibG9ja1t3b2Zmc2V0IC0gaSAtMV07CisJCQlvZmZzZXQgKz0gbG9vcHNpemUgKiAyOworCQl9IGVsc2UgeworCQkJc25kX2Fzc2VydChvZmZzZXQgKyBsb29wc2l6ZSA8PSBibG9ja3NpemUsIHJldHVybiAtRUlOVkFMKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsb29wc2l6ZTsgaSsrKQorCQkJCWJsb2NrW29mZnNldCArIGldID0gYmxvY2tbb2Zmc2V0IC0gaSAtMV07CisJCQlvZmZzZXQgKz0gbG9vcHNpemU7CisJCX0KKworCQkvKiBtb2RpZnkgbG9vcCBwb2ludGVycyAqLworCQlpZiAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFX0JJRElSX0xPT1ApIHsKKwkJCXNwLT52Lmxvb3BlbmQgKz0gbG9vcHNpemU7CisJCX0gZWxzZSB7CisJCQlzcC0+di5sb29wc3RhcnQgKz0gbG9vcHNpemU7CisJCQlzcC0+di5sb29wZW5kICs9IGxvb3BzaXplOworCQl9CisJCS8qIGFkZCBzYW1wbGUgcG9pbnRlciAqLworCQlzcC0+di5lbmQgKz0gbG9vcHNpemU7CisJfQorI2VuZGlmCisKKwkvKiBsb29wZW5kIC0+IHNhbXBsZSBlbmQgKi8KKwlzaXplID0gc3AtPnYuc2l6ZSAtIGxvb3BlbmQ7CisJc25kX2Fzc2VydChzaXplID49IDAsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoISAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKSkKKwkJc2l6ZSAqPSAyOworCWlmIChzbmRfZW11MTBrMV9zeW50aF9jb3B5X2Zyb21fdXNlcihlbXUsIHNwLT5ibG9jaywgb2Zmc2V0LCBkYXRhLCBzaXplKSkgeworCQlzbmRfZW11MTBrMV9zeW50aF9mcmVlKGVtdSwgc3AtPmJsb2NrKTsKKwkJc3AtPmJsb2NrID0gTlVMTDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCW9mZnNldCArPSBzaXplOworCisJLyogY2xlYXIgcmVzdCBvZiBzYW1wbGVzIChpZiBhbnkpICovCisJaWYgKG9mZnNldCA8IGJsb2Nrc2l6ZSkKKwkJc25kX2VtdTEwazFfc3ludGhfYnplcm8oZW11LCBzcC0+YmxvY2ssIG9mZnNldCwgYmxvY2tzaXplIC0gb2Zmc2V0KTsKKworCWlmIChzcC0+di5tb2RlX2ZsYWdzICYgU05EUlZfU0ZOVF9TQU1QTEVfTk9fQkxBTkspIHsKKwkJLyogaWYgbm8gYmxhbmsgbG9vcCBpcyBhdHRhY2hlZCBpbiB0aGUgc2FtcGxlLCBhZGQgaXQgKi8KKwkJaWYgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV9TSU5HTEVTSE9UKSB7CisJCQlzcC0+di5sb29wc3RhcnQgPSBzcC0+di5lbmQgKyBCTEFOS19MT09QX1NUQVJUOworCQkJc3AtPnYubG9vcGVuZCA9IHNwLT52LmVuZCArIEJMQU5LX0xPT1BfRU5EOworCQl9CisJfQorCisjaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworCWlmIChzcC0+di5tb2RlX2ZsYWdzICYgU05EUlZfU0ZOVF9TQU1QTEVfVU5TSUdORUQpIHsKKwkJLyogdW5zaWduZWQgLT4gc2lnbmVkICovCisJCWlmICghIChzcC0+di5tb2RlX2ZsYWdzICYgU05EUlZfU0ZOVF9TQU1QTEVfOEJJVFMpKSB7CisJCQl1bnNpZ25lZCBzaG9ydCAqd2Jsb2NrID0gKHVuc2lnbmVkIHNob3J0KilibG9jazsKKwkJCWZvciAoaSA9IDA7IGkgPCB0cnVlc2l6ZTsgaSsrKQorCQkJCXdibG9ja1tpXSBePSAweDgwMDA7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgdHJ1ZXNpemU7IGkrKykKKwkJCQlibG9ja1tpXSBePSAweDgwOworCQl9CisJfQorI2VuZGlmCisKKwkvKiByZWNhbGN1bGF0ZSBvZmZzZXQgKi8KKwlzdGFydF9hZGRyID0gQkxBTktfSEVBRF9TSVpFICogMjsKKwlpZiAoISAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKSkKKwkJc3RhcnRfYWRkciA+Pj0gMTsKKwlzcC0+di5zdGFydCArPSBzdGFydF9hZGRyOworCXNwLT52LmVuZCArPSBzdGFydF9hZGRyOworCXNwLT52Lmxvb3BzdGFydCArPSBzdGFydF9hZGRyOworCXNwLT52Lmxvb3BlbmQgKz0gc3RhcnRfYWRkcjsKKworCXJldHVybiAwOworfQorCisvKgorICogZnJlZSBhIHNhbXBsZSBibG9jaworICovCitpbnQKK3NuZF9lbXUxMGsxX3NhbXBsZV9mcmVlKHNuZF9lbXV4X3QgKnJlYywgc25kX3NmX3NhbXBsZV90ICpzcCwKKwkJCXNuZF91dGlsX21lbWhkcl90ICpoZHIpCit7CisJZW11MTBrMV90ICplbXU7CisKKwllbXUgPSByZWMtPmh3OworCXNuZF9hc3NlcnQoc3AgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQoaGRyICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChzcC0+YmxvY2spIHsKKwkJc25kX2VtdTEwazFfc3ludGhfZnJlZShlbXUsIHNwLT5ibG9jayk7CisJCXNwLT5ibG9jayA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNThkMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfc3ludGguYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIFdhdmVUYWJsZSBzeW50aAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAiZW11MTBrMV9zeW50aF9sb2NhbC5oIgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvdXRpbmVzIGZvciBjb250cm9sIG9mIEVNVTEwSzEgV2F2ZVRhYmxlIHN5bnRoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBjcmVhdGUgYSBuZXcgaGFyZHdhcmUgZGVwZW5kZW50IGRldmljZSBmb3IgRW11MTBrMQorICovCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3N5bnRoX25ld19kZXZpY2Uoc25kX3NlcV9kZXZpY2VfdCAqZGV2KQoreworCXNuZF9lbXV4X3QgKmVtdTsKKwllbXUxMGsxX3QgKmh3OworCXNuZF9lbXUxMGsxX3N5bnRoX2FyZ190ICphcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFyZyA9IFNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKGRldik7CisJaWYgKGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhcmctPnNlcV9wb3J0cyA8PSAwKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyAqLworCWlmIChhcmctPm1heF92b2ljZXMgPCAxKQorCQlhcmctPm1heF92b2ljZXMgPSAxOworCWVsc2UgaWYgKGFyZy0+bWF4X3ZvaWNlcyA+IDY0KQorCQlhcmctPm1heF92b2ljZXMgPSA2NDsKKworCWlmIChzbmRfZW11eF9uZXcoJmVtdSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNuZF9lbXUxMGsxX29wc19zZXR1cChlbXUpOworCWVtdS0+aHcgPSBodyA9IGFyZy0+aHdwdHI7CisJZW11LT5tYXhfdm9pY2VzID0gYXJnLT5tYXhfdm9pY2VzOworCWVtdS0+bnVtX3BvcnRzID0gYXJnLT5zZXFfcG9ydHM7CisJZW11LT5waXRjaF9zaGlmdCA9IC01MDE7CisJZW11LT5tZW1oZHIgPSBody0+bWVtaGRyOworCWVtdS0+bWlkaV9wb3J0cyA9IGFyZy0+c2VxX3BvcnRzIDwgMiA/IGFyZy0+c2VxX3BvcnRzIDogMjsgLyogbWF4aW11bSB0d28gcG9ydHMgKi8KKwllbXUtPm1pZGlfZGV2aWR4ID0gaHctPmF1ZGlneSA/IDIgOiAxOyAvKiBhdWRpZ3kgaGFzIHR3byBleHRlcm5hbCBtaWRpcyAqLworCWVtdS0+bGluZWFyX3Bhbm5pbmcgPSAwOworCWVtdS0+aHdkZXBfaWR4ID0gMjsgLyogRklYRUQgKi8KKworCWlmIChzbmRfZW11eF9yZWdpc3RlcihlbXUsIGRldi0+Y2FyZCwgYXJnLT5pbmRleCwgIkVtdTEwazEiKSA8IDApIHsKKwkJc25kX2VtdXhfZnJlZShlbXUpOworCQllbXUtPmh3ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT52b2ljZV9sb2NrLCBmbGFncyk7CisJaHctPnN5bnRoID0gZW11OworCWh3LT5nZXRfc3ludGhfdm9pY2UgPSBzbmRfZW11MTBrMV9zeW50aF9nZXRfdm9pY2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnZvaWNlX2xvY2ssIGZsYWdzKTsKKworCWRldi0+ZHJpdmVyX2RhdGEgPSBlbXU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zeW50aF9kZWxldGVfZGV2aWNlKHNuZF9zZXFfZGV2aWNlX3QgKmRldikKK3sKKwlzbmRfZW11eF90ICplbXU7CisJZW11MTBrMV90ICpodzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldi0+ZHJpdmVyX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIG5vdCByZWdpc3RlcmVkIGFjdHVhbGx5ICovCisKKwllbXUgPSBkZXYtPmRyaXZlcl9kYXRhOworCisJaHcgPSBlbXUtPmh3OworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWh3LT5zeW50aCA9IE5VTEw7CisJaHctPmdldF9zeW50aF92b2ljZSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnZvaWNlX2xvY2ssIGZsYWdzKTsKKworCXNuZF9lbXV4X2ZyZWUoZW11KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBJTklUIHBhcnQKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2VtdTEwazFfc3ludGhfaW5pdCh2b2lkKQoreworCQorCXN0YXRpYyBzbmRfc2VxX2Rldl9vcHNfdCBvcHMgPSB7CisJCXNuZF9lbXUxMGsxX3N5bnRoX25ld19kZXZpY2UsCisJCXNuZF9lbXUxMGsxX3N5bnRoX2RlbGV0ZV9kZXZpY2UsCisJfTsKKwlyZXR1cm4gc25kX3NlcV9kZXZpY2VfcmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfRU1VMTBLMV9TWU5USCwgJm9wcywgc2l6ZW9mKHNuZF9lbXUxMGsxX3N5bnRoX2FyZ190KSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2VtdTEwazFfc3ludGhfZXhpdCh2b2lkKQoreworCXNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfRU1VMTBLMV9TWU5USCk7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfZW11MTBrMV9zeW50aF9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9lbXUxMGsxX3N5bnRoX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoX2xvY2FsLmggYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoX2xvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1MGIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfc3ludGhfbG9jYWwuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9fRU1VMTBLMV9TWU5USF9MT0NBTF9ICisjZGVmaW5lIF9fRU1VMTBLMV9TWU5USF9MT0NBTF9ICisvKgorICogIExvY2FsIGRlZmluaW5pdG9ucyBmb3IgRW11MTBrMSB3YXZldGFibGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvZW11MTBrMV9zeW50aC5oPgorCisvKiBlbXUxMGsxX3BhdGNoLmMgKi8KK2ludCBzbmRfZW11MTBrMV9zYW1wbGVfbmV3KHNuZF9lbXV4X3QgKnByaXZhdGVfZGF0YSwgc25kX3NmX3NhbXBsZV90ICpzcCwgc25kX3V0aWxfbWVtaGRyX3QgKmhkciwgY29uc3Qgdm9pZCBfX3VzZXIgKl9kYXRhLCBsb25nIGNvdW50KTsKK2ludCBzbmRfZW11MTBrMV9zYW1wbGVfZnJlZShzbmRfZW11eF90ICpwcml2YXRlX2RhdGEsIHNuZF9zZl9zYW1wbGVfdCAqc3AsIHNuZF91dGlsX21lbWhkcl90ICpoZHIpOworaW50IHNuZF9lbXUxMGsxX21lbWhkcl9pbml0KHNuZF9lbXV4X3QgKmVtdSk7CisKKy8qIGVtdTEwazFfY2FsbGJhY2suYyAqLwordm9pZCBzbmRfZW11MTBrMV9vcHNfc2V0dXAoc25kX2VtdXhfdCAqZW11KTsKK2ludCBzbmRfZW11MTBrMV9zeW50aF9nZXRfdm9pY2UoZW11MTBrMV90ICpodyk7CisKKworI2VuZGlmCS8qIF9fRU1VMTBLMV9TWU5USF9MT0NBTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmZDhkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtMCwwICsxLDE2NDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBGcmFuY2lzY28gTW9yYWVzIDxmbW9yYWVzQG5jLnJyLmNvbT4KKyAqICBEcml2ZXIgRU1VMTBLMVggY2hpcHMKKyAqCisgKiAgUGFydHMgb2YgdGhpcyBjb2RlIHdlcmUgYWRhcHRlZCBmcm9tIGF1ZGlneWxzLmMgZHJpdmVyIHdoaWNoIGlzCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrPgorICoKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqCisgKiAgQ2hpcHMgKFNCMDIwMCBtb2RlbCk6CisgKiAgICAtIEVNVTEwSzFYLURCUQorICogICAgLSBTVEFDIDk3MDhUCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgorCitNT0RVTEVfQVVUSE9SKCJGcmFuY2lzY28gTW9yYWVzIDxmbW9yYWVzQG5jLnJyLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRU1VMTBLMVgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0RlbGwgQ3JlYXRpdmUgTGFicyxTQiBMaXZlIX0iKTsKKworLy8gbW9kdWxlIHBhcmFtZXRlcnMgKHNlZSAiTW9kdWxlIFBhcmFtZXRlcnMiKQorc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsKK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsKK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0aGUgRU1VMTBLMVggc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciB0aGUgRU1VMTBLMVggc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSB0aGUgRU1VMTBLMVggc291bmRjYXJkLiIpOworCisKKy8vIHNvbWUgZGVmaW5pdGlvbnMgd2VyZSBib3Jyb3dlZCBmcm9tIGVtdTEwazEgZHJpdmVyIGFzIHRoZXkgc2VlbSB0byBiZSB0aGUgc2FtZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBmdW5jdGlvbiAwIHJlZ2lzdGVycywgYWRkcmVzcyA9IDx2YWw+ICsgUENJQkFTRTAJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQVFIJCQkweDAwCQkvKiBJbmRleGVkIHJlZ2lzdGVyIHNldCBwb2ludGVyIHJlZ2lzdGVyCSovCisJCQkJCQkvKiBOT1RFOiBUaGUgQ0hBTk5FTE5VTSBhbmQgQUREUkVTUyB3b3JkcyBjYW4JKi8KKwkJCQkJCS8qIGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlci4JKi8KKworI2RlZmluZSBEQVRBCQkJMHgwNAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlcgkJKi8KKworI2RlZmluZSBJUFIJCQkweDA4CQkvKiBHbG9iYWwgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSovCisJCQkJCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgYnkgd3JpdGluZyBhIDEgdG8JKi8KKwkJCQkJCS8qIHRoZSByZWxldmFudCBiaXRzIGFuZCB6ZXJvIHRvIHRoZSBvdGhlciBiaXRzCSovCisjZGVmaW5lIElQUl9NSURJVFJBTlNCVUZFTVBUWSAgIDB4MDAwMDAwMDEJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KKyNkZWZpbmUgSVBSX01JRElSRUNWQlVGRU1QVFkgICAgMHgwMDAwMDAwMgkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIElQUl9DSF8wX0xPT1AgICAgICAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBDaGFubmVsIDAgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUFJfQ0hfMF9IQUxGX0xPT1AgICAgICAweDAwMDAwMTAwICAgICAgLyogQ2hhbm5lbCAwIGhhbGYgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVBSX0NBUF8wX0xPT1AgICAgICAgICAgMHgwMDA4MDAwMCAgICAgIC8qIENoYW5uZWwgY2FwdHVyZSBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElQUl9DQVBfMF9IQUxGX0xPT1AgICAgIDB4MDAwMTAwMDAgICAgICAvKiBDaGFubmVsIGNhcHR1cmUgaGFsZiBsb29wICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIElOVEUJCQkweDBjCQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgSU5URV9NSURJVFhFTkFCTEUgICAgICAgMHgwMDAwMDAwMQkvKiBFbmFibGUgTUlESSB0cmFuc21pdC1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLworI2RlZmluZSBJTlRFX01JRElSWEVOQUJMRSAgICAgICAweDAwMDAwMDAyCS8qIEVuYWJsZSBNSURJIHJlY2VpdmUtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KKyNkZWZpbmUgSU5URV9DSF8wX0xPT1AgICAgICAgICAgMHgwMDAwMDgwMCAgICAgIC8qIENoYW5uZWwgMCBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElOVEVfQ0hfMF9IQUxGX0xPT1AgICAgIDB4MDAwMDAxMDAgICAgICAvKiBDaGFubmVsIDAgaGFsZiBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJTlRFX0NBUF8wX0xPT1AgICAgICAgICAweDAwMDgwMDAwICAgICAgLyogQ2hhbm5lbCBjYXB0dXJlIGxvb3AgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSU5URV9DQVBfMF9IQUxGX0xPT1AgICAgMHgwMDAxMDAwMCAgICAgIC8qIENoYW5uZWwgY2FwdHVyZSBoYWxmIGxvb3AgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSENGRwkJCTB4MTQJCS8qIEhhcmR3YXJlIGNvbmZpZyByZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgSENGR19MT0NLU09VTkRDQUNIRQkweDAwMDAwMDA4CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byBzb3VuZGNhY2hlICovCisJCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLworI2RlZmluZSBIQ0ZHX0FVRElPRU5BQkxFCTB4MDAwMDAwMDEJLyogMCA9IENPREVDcyB0cmFuc21pdCB6ZXJvLXZhbHVlZCBzYW1wbGVzCSovCisJCQkJCQkvKiBTaG91bGQgYmUgc2V0IHRvIDEgd2hlbiB0aGUgRU1VMTBLMSBpcwkqLworCQkJCQkJLyogY29tcGxldGVseSBpbml0aWFsaXplZC4JCQkqLworI2RlZmluZSBHUElPCQkJMHgxOAkJLyogRGVmYXVsdHM6IDAwMDAxMDgwLUFuYWxvZywgMDAwMDEwMDAtU1BESUYuICAgKi8KKworCisjZGVmaW5lIEFDOTdEQVRBCQkweDFjCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBkYXRhIHJlZ2lzdGVyICgxNiBiaXQpCSovCisKKyNkZWZpbmUgQUM5N0FERFJFU1MJCTB4MWUJCS8qIEFDOTcgcmVnaXN0ZXIgc2V0IGFkZHJlc3MgcmVnaXN0ZXIgKDggYml0KQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFbXUxMGsxeCBwb2ludGVyLW9mZnNldCByZWdpc3RlciBzZXQsIGFjY2Vzc2VkIHRocm91Z2ggdGhlIFBUUiBhbmQgREFUQSByZWdpc3RlcnMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQTEFZQkFDS19MSVNUX0FERFIJMHgwMAkJLyogQmFzZSBETUEgYWRkcmVzcyBvZiBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gZWFjaCBwZXJpb2Qvc2l6ZSAqLworCQkJCQkJLyogT25lIGxpc3QgZW50cnk6IDQgYnl0ZXMgZm9yIERNQSBhZGRyZXNzLCAKKwkJCQkJCSAqIDQgYnl0ZXMgZm9yIHBlcmlvZF9zaXplIDw8IDE2LgorCQkJCQkJICogT25lIGxpc3QgZW50cnkgaXMgOCBieXRlcyBsb25nLgorCQkJCQkJICogT25lIGxpc3QgZW50cnkgZm9yIGVhY2ggcGVyaW9kIGluIHRoZSBidWZmZXIuCisJCQkJCQkgKi8KKyNkZWZpbmUgUExBWUJBQ0tfTElTVF9TSVpFCTB4MDEJCS8qIFNpemUgb2YgbGlzdCBpbiBieXRlcyA8PCAxNi4gRS5nLiA4IHBlcmlvZHMgLT4gMHgwMDM4MDAwMCAgKi8KKyNkZWZpbmUgUExBWUJBQ0tfTElTVF9QVFIJMHgwMgkJLyogUG9pbnRlciB0byB0aGUgY3VycmVudCBwZXJpb2QgYmVpbmcgcGxheWVkICovCisjZGVmaW5lIFBMQVlCQUNLX0RNQV9BRERSCTB4MDQJCS8qIFBsYXliYWNrIERNQSBhZGRyZXNzcyAqLworI2RlZmluZSBQTEFZQkFDS19QRVJJT0RfU0laRQkweDA1CQkvKiBQbGF5YmFjayBwZXJpb2Qgc2l6ZSAqLworI2RlZmluZSBQTEFZQkFDS19QT0lOVEVSCTB4MDYJCS8qIFBsYXliYWNrIHBlcmlvZCBwb2ludGVyLiBTYW1wbGUgY3VycmVudGx5IGluIERBQyAqLworI2RlZmluZSBQTEFZQkFDS19VTktOT1dOMSAgICAgICAweDA3CisjZGVmaW5lIFBMQVlCQUNLX1VOS05PV04yICAgICAgIDB4MDgKKworLyogT25seSBvbmUgY2FwdHVyZSBjaGFubmVsIHN1cHBvcnRlZCAqLworI2RlZmluZSBDQVBUVVJFX0RNQV9BRERSCTB4MTAJCS8qIENhcHR1cmUgRE1BIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0FQVFVSRV9CVUZGRVJfU0laRQkweDExCQkvKiBDYXB0dXJlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIENBUFRVUkVfUE9JTlRFUgkJMHgxMgkJLyogQ2FwdHVyZSBidWZmZXIgcG9pbnRlci4gU2FtcGxlIGN1cnJlbnRseSBpbiBBREMgKi8KKyNkZWZpbmUgQ0FQVFVSRV9VTktOT1dOICAgICAgICAgMHgxMworCisvKiBGcm9tIDB4MjAgLSAweDNmLCBsYXN0IHNhbXBsZXMgcGxheWVkIG9uIGVhY2ggY2hhbm5lbCAqLworCisjZGVmaW5lIFRSSUdHRVJfQ0hBTk5FTCAgICAgICAgIDB4NDAgICAgICAgICAgICAvKiBUcmlnZ2VyIGNoYW5uZWwgcGxheWJhY2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUUklHR0VSX0NIQU5ORUxfMCAgICAgICAweDAwMDAwMDAxICAgICAgLyogVHJpZ2dlciBjaGFubmVsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFJJR0dFUl9DSEFOTkVMXzEgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIFRyaWdnZXIgY2hhbm5lbCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRSSUdHRVJfQ0hBTk5FTF8yICAgICAgIDB4MDAwMDAwMDQgICAgICAvKiBUcmlnZ2VyIGNoYW5uZWwgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUUklHR0VSX0NBUFRVUkUgICAgICAgICAweDAwMDAwMTAwICAgICAgLyogVHJpZ2dlciBjYXB0dXJlIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBST1VUSU5HICAgICAgICAgICAgICAgICAweDQxICAgICAgICAgICAgLyogU2V0dXAgc291bmQgcm91dGluZyA/ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUk9VVElOR19GUk9OVF9MRUZUICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBST1VUSU5HX0ZST05UX1JJR0hUICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFJPVVRJTkdfUkVBUl9MRUZUICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUk9VVElOR19SRUFSX1JJR0hUICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBST1VUSU5HX0NFTlRFUl9MRkUgICAgICAweDAwMDEwMDAwCisKKyNkZWZpbmUgU1BDUzAJCQkweDQyCQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMCByZWdpc3RlcgkqLworCisjZGVmaW5lIFNQQ1MxCQkJMHg0MwkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDEgcmVnaXN0ZXIJKi8KKworI2RlZmluZSBTUENTMgkJCTB4NDQJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAyIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgU1BDU19DTEtBQ0NZTUFTSwkweDMwMDAwMDAwCS8qIENsb2NrIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNCTB4MDAwMDAwMDAJLyogMTAwMCBwYXJ0cyBwZXIgbWlsbGlvbgkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV81MFBQTQkweDEwMDAwMDAwCS8qIDUwIHBhcnRzIHBlciBtaWxsaW9uCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV9WQVJJQUJMRQkweDIwMDAwMDAwCS8qIFZhcmlhYmxlIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfU0FNUExFUkFURU1BU0sJMHgwZjAwMDAwMAkvKiBTYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDAJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDgJMHgwMjAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfMzIJMHgwMzAwMDAwMAkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX0NIQU5ORUxOVU1NQVNLCTB4MDBmMDAwMDAJLyogQ2hhbm5lbCBudW1iZXIJCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX0xFRlQJMHgwMDEwMDAwMAkvKiBMZWZ0IGNoYW5uZWwJCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9SSUdIVAkweDAwMjAwMDAwCS8qIFJpZ2h0IGNoYW5uZWwJCQkJKi8KKyNkZWZpbmUgU1BDU19TT1VSQ0VOVU1NQVNLCTB4MDAwZjAwMDAJLyogU291cmNlIG51bWJlcgkJCQkqLworI2RlZmluZSBTUENTX1NPVVJDRU5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBzb3VyY2UgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19HRU5FUkFUSU9OU1RBVFVTCTB4MDAwMDgwMDAJLyogT3JpZ2luYWxpdHkgZmxhZyAoc2VlIElFQy05NTggc3BlYykJCSovCisjZGVmaW5lIFNQQ1NfQ0FURUdPUllDT0RFTUFTSwkweDAwMDA3ZjAwCS8qIENhdGVnb3J5IGNvZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLworI2RlZmluZSBTUENTX01PREVNQVNLCQkweDAwMDAwMGMwCS8qIE1vZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU01BU0sJMHgwMDAwMDAzOAkvKiBFbXBoYXNpcwkJCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU19OT05FCTB4MDAwMDAwMDAJLyogTm8gZW1waGFzaXMJCQkJCSovCisjZGVmaW5lIFNQQ1NfRU1QSEFTSVNfNTBfMTUJMHgwMDAwMDAwOAkvKiA1MC8xNSB1c2VjIDIgY2hhbm5lbAkJCQkqLworI2RlZmluZSBTUENTX0NPUFlSSUdIVAkJMHgwMDAwMDAwNAkvKiBDb3B5cmlnaHQgYXNzZXJ0ZWQgZmxhZyAtLSBkbyBub3QgbW9kaWZ5CSovCisjZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCisjZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLworCisjZGVmaW5lIFNQRElGX1NFTEVDVAkJMHg0NQkJLyogRW5hYmxlcyBTUERJRiBvciBBbmFsb2d1ZSBvdXRwdXRzIDAtQW5hbG9ndWUsIDB4NzAwLVNQRElGICovCisKKy8qIFRoaXMgaXMgdGhlIE1QVSBwb3J0IG9uIHRoZSBjYXJkICAgICAgICAgICAgICAgICAgICAgIAkJCQkJKi8KKyNkZWZpbmUgTVVEQVRBCQkweDQ3CisjZGVmaW5lIE1VQ01ECQkweDQ4CisjZGVmaW5lIE1VU1RBVAkJTVVDTUQKKworLyogRnJvbSAweDUwIC0gMHg1ZiwgbGFzdCBzYW1wbGVzIGNhcHR1cmVkICovCisKKy8qKgorICogVGhlIGhhcmR3YXJlIGhhcyAzIGNoYW5uZWxzIGZvciBwbGF5YmFjayBhbmQgMSBmb3IgY2FwdHVyZS4KKyAqICAtIGNoYW5uZWwgMCBpcyB0aGUgZnJvbnQgY2hhbm5lbAorICogIC0gY2hhbm5lbCAxIGlzIHRoZSByZWFyIGNoYW5uZWwKKyAqICAtIGNoYW5uZWwgMiBpcyB0aGUgY2VudGVyL2xmZSBjaGFuZWwKKyAqIFZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBBQzk3IGZvciB0aGUgZnJvbnQgYW5kIHJlYXIgY2hhbm5lbHMgYnkKKyAqIHRoZSBQQ00gUGxheWJhY2sgVm9sdW1lLCBTaWdtYXRlbCBTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUgYW5kIAorICogU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lLiBUaGUgU2lnbWF0ZWwgNC1TcGVha2VyIFN0ZXJlbyBzd2l0Y2ggYWZmZWN0cworICogdGhlIGZyb250L3JlYXIgY2hhbm5lbCBtaXhpbmcgaW4gdGhlIFJFQVIgT1VUIGphY2suIFdoZW4gdXNpbmcgdGhlCisgKiA0LVNwZWFrZXIgU3RlcmVvLCBib3RoIGZyb250IGFuZCByZWFyIGNoYW5uZWxzIHdpbGwgYmUgbWl4ZWQgaW4gdGhlCisgKiBSRUFSIE9VVC4KKyAqIFRoZSBjZW50ZXIvbGZlIGNoYW5uZWwgaGFzIG5vIHZvbHVtZSBjb250cm9sIGFuZCBjYW5ub3QgYmUgbXV0ZWQgZHVyaW5nCisgKiBwbGF5YmFjay4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMXhfdm9pY2UgZW11MTBrMXhfdm9pY2VfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9lbXUxMGsxeCBlbXUxMGsxeF90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX2VtdTEwazF4X3BjbSBlbXUxMGsxeF9wY21fdDsKKworc3RydWN0IHNuZF9lbXUxMGsxeF92b2ljZSB7CisJZW11MTBrMXhfdCAqZW11OworCWludCBudW1iZXI7CisJaW50IHVzZTsKKyAgCisJZW11MTBrMXhfcGNtX3QgKmVwY207Cit9OworCitzdHJ1Y3Qgc25kX2VtdTEwazF4X3BjbSB7CisJZW11MTBrMXhfdCAqZW11OworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwllbXUxMGsxeF92b2ljZV90ICp2b2ljZTsKKwl1bnNpZ25lZCBzaG9ydCBydW5uaW5nOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBzbmRfZW11MTBrMXggKmVtdTsKKwlzbmRfcmF3bWlkaV90ICpybWlkaTsKKwlzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtX2lucHV0OworCXNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICpzdWJzdHJlYW1fb3V0cHV0OworCXVuc2lnbmVkIGludCBtaWRpX21vZGU7CisJc3BpbmxvY2tfdCBpbnB1dF9sb2NrOworCXNwaW5sb2NrX3Qgb3V0cHV0X2xvY2s7CisJc3BpbmxvY2tfdCBvcGVuX2xvY2s7CisJaW50IHR4X2VuYWJsZSwgcnhfZW5hYmxlOworCWludCBwb3J0OworCWludCBpcHJfdHgsIGlwcl9yeDsKKwl2b2lkICgqaW50ZXJydXB0KShlbXUxMGsxeF90ICplbXUsIHVuc2lnbmVkIGludCBzdGF0dXMpOworfSBlbXUxMGsxeF9taWRpX3Q7CisKKy8vIGRlZmluaXRpb24gb2YgdGhlIGNoaXAtc3BlY2lmaWMgcmVjb3JkCitzdHJ1Y3Qgc25kX2VtdTEwazF4IHsKKwlzbmRfY2FyZF90ICpjYXJkOworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJc3RydWN0IHJlc291cmNlICpyZXNfcG9ydDsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgaW50IHJldmlzaW9uOwkJLyogY2hpcCByZXZpc2lvbiAqLworCXVuc2lnbmVkIGludCBzZXJpYWw7ICAgICAgICAgICAgLyogc2VyaWFsIG51bWJlciAqLworCXVuc2lnbmVkIHNob3J0IG1vZGVsOwkJLyogc3Vic3lzdGVtIGlkICovCisKKwlzcGlubG9ja190IGVtdV9sb2NrOworCXNwaW5sb2NrX3Qgdm9pY2VfbG9jazsKKworCWFjOTdfdCAqYWM5NzsKKwlzbmRfcGNtX3QgKnBjbTsKKworCWVtdTEwazF4X3ZvaWNlX3Qgdm9pY2VzWzNdOworCWVtdTEwazF4X3ZvaWNlX3QgY2FwdHVyZV92b2ljZTsKKwl1MzIgc3BkaWZfYml0c1szXTsgLy8gU1BESUYgb3V0IHNldHVwCisKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX2J1ZmZlcjsKKworCWVtdTEwazF4X21pZGlfdCBtaWRpOworfTsKKworLyogaGFyZHdhcmUgZGVmaW5pdGlvbiAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZW11MTBrMXhfcGxheWJhY2tfaHcgPSB7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgCisJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTIsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDMyKjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTYqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTgsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZW11MTBrMXhfY2FwdHVyZV9odyA9IHsKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCAKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMzIqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxNioxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9lbXUxMGsxeF9wdHJfcmVhZChlbXUxMGsxeF90ICogZW11LCAKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVnLCAKKwkJCQkJICB1bnNpZ25lZCBpbnQgY2huKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHJlZ3B0ciwgdmFsOworICAKKwlyZWdwdHIgPSAocmVnIDw8IDE2KSB8IGNobjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJb3V0bChyZWdwdHIsIGVtdS0+cG9ydCArIFBUUik7CisJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdTEwazF4X3QgKmVtdSwgCisJCQkJICAgdW5zaWduZWQgaW50IHJlZywgCisJCQkJICAgdW5zaWduZWQgaW50IGNobiwgCisJCQkJICAgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IHJlZ3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVncHRyID0gKHJlZyA8PCAxNikgfCBjaG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBQVFIpOworCW91dGwoZGF0YSwgZW11LT5wb3J0ICsgREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfaW50cl9lbmFibGUoZW11MTBrMXhfdCAqZW11LCB1bnNpZ25lZCBpbnQgaW50cmVuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBlbmFibGU7CisgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJZW5hYmxlID0gaW5sKGVtdS0+cG9ydCArIElOVEUpIHwgaW50cmVuYjsKKwlvdXRsKGVuYWJsZSwgZW11LT5wb3J0ICsgSU5URSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdTEwazF4X3QgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOworICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCWVuYWJsZSA9IGlubChlbXUtPnBvcnQgKyBJTlRFKSAmIH5pbnRyZW5iOworCW91dGwoZW5hYmxlLCBlbXUtPnBvcnQgKyBJTlRFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxeF9ncGlvX3dyaXRlKGVtdTEwazF4X3QgKmVtdSwgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwodmFsdWUsIGVtdS0+cG9ydCArIEdQSU8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazF4X3BjbV9mcmVlX3N1YnN0cmVhbShzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwllbXUxMGsxeF9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKyAgCisJaWYgKGVwY20pCisJCWtmcmVlKGVwY20pOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfcGNtX2ludGVycnVwdChlbXUxMGsxeF90ICplbXUsIGVtdTEwazF4X3ZvaWNlX3QgKnZvaWNlKQoreworCWVtdTEwazF4X3BjbV90ICplcGNtOworCisJaWYgKChlcGNtID0gdm9pY2UtPmVwY20pID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZXBjbS0+c3Vic3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKyNpZiAwCisJc25kX3ByaW50ayhLRVJOX0lORk8gIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKKwkJICAgZXBjbS0+c3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoZXBjbS0+c3Vic3RyZWFtKSwKKwkJICAgc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKGVwY20tPnN1YnN0cmVhbSksCisJCSAgIHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhlcGNtLT5zdWJzdHJlYW0pKTsKKyNlbmRpZgorCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoZXBjbS0+c3Vic3RyZWFtKTsKK30KKworLyogb3BlbiBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJZW11MTBrMXhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllbXUxMGsxeF9wY21fdCAqZXBjbTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUykpIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsIDY0KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKwllcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcGNtLT5lbXUgPSBjaGlwOworCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKyAgCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMXhfcGNtX2ZyZWVfc3Vic3RyZWFtOworICAKKwlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxeF9wbGF5YmFja19odzsKKworCXJldHVybiAwOworfQorCisvKiBjbG9zZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCisvKiBod19wYXJhbXMgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X3BjbV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMXhfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoISBlcGNtLT52b2ljZSkgeworCQllcGNtLT52b2ljZSA9ICZlcGNtLT5lbXUtPnZvaWNlc1tzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlXTsKKwkJZXBjbS0+dm9pY2UtPnVzZSA9IDE7CisJCWVwY20tPnZvaWNlLT5lcGNtID0gZXBjbTsKKwl9CisKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworLyogaHdfZnJlZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGNtX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazF4X3BjbV90ICplcGNtOworCisJaWYgKHJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkKKwllcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGVwY20tPnZvaWNlKSB7CisJCWVwY20tPnZvaWNlLT51c2UgPSAwOworCQllcGNtLT52b2ljZS0+ZXBjbSA9IE5VTEw7CisJCWVwY20tPnZvaWNlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCisvKiBwcmVwYXJlIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9wY21fcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJZW11MTBrMXhfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazF4X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCB2b2ljZSA9IGVwY20tPnZvaWNlLT5udW1iZXI7CisJdTMyICp0YWJsZV9iYXNlID0gKHUzMiAqKShlbXUtPmRtYV9idWZmZXIuYXJlYSsxMDI0KnZvaWNlKTsKKwl1MzIgcGVyaW9kX3NpemVfYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCWludCBpOworCQorCWZvcihpPTA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKKwkJKnRhYmxlX2Jhc2UrKz1ydW50aW1lLT5kbWFfYWRkcisoaSpwZXJpb2Rfc2l6ZV9ieXRlcyk7CisJCSp0YWJsZV9iYXNlKys9cGVyaW9kX3NpemVfYnl0ZXM8PDE2OworCX0KKworCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBQTEFZQkFDS19MSVNUX0FERFIsIHZvaWNlLCBlbXUtPmRtYV9idWZmZXIuYWRkcisxMDI0KnZvaWNlKTsKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfTElTVF9TSVpFLCB2b2ljZSwgKHJ1bnRpbWUtPnBlcmlvZHMgLSAxKSA8PCAxOSk7CisJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX0xJU1RfUFRSLCB2b2ljZSwgMCk7CisJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIFBMQVlCQUNLX1BPSU5URVIsIHZvaWNlLCAwKTsKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfVU5LTk9XTjEsIHZvaWNlLCAwKTsKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfVU5LTk9XTjIsIHZvaWNlLCAwKTsKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfRE1BX0FERFIsIHZvaWNlLCBydW50aW1lLT5kbWFfYWRkcik7CisKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgUExBWUJBQ0tfUEVSSU9EX1NJWkUsIHZvaWNlLCBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpPDwxNik7CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJpZ2dlciBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGNtX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICBpbnQgY21kKQoreworCWVtdTEwazF4X3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxeF9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgY2hhbm5lbCA9IGVwY20tPnZvaWNlLT5udW1iZXI7CisJaW50IHJlc3VsdCA9IDA7CisKKy8vCXNuZF9wcmludGsoS0VSTl9JTkZPICJ0cmlnZ2VyIC0gZW11MTBrMXggPSAweCV4LCBjbWQgPSAlaSwgcG9pbnRlciA9ICVkXG4iLCAoaW50KWVtdSwgY21kLCAoaW50KXN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSkpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZihydW50aW1lLT5wZXJpb2RzID09IDIpCisJCQlzbmRfZW11MTBrMXhfaW50cl9lbmFibGUoZW11LCAoSU5URV9DSF8wX0xPT1AgfCBJTlRFX0NIXzBfSEFMRl9MT09QKSA8PCBjaGFubmVsKTsKKwkJZWxzZQorCQkJc25kX2VtdTEwazF4X2ludHJfZW5hYmxlKGVtdSwgSU5URV9DSF8wX0xPT1AgPDwgY2hhbm5lbCk7CisJCWVwY20tPnJ1bm5pbmcgPSAxOworCQlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgVFJJR0dFUl9DSEFOTkVMLCAwLCBzbmRfZW11MTBrMXhfcHRyX3JlYWQoZW11LCBUUklHR0VSX0NIQU5ORUwsIDApfChUUklHR0VSX0NIQU5ORUxfMDw8Y2hhbm5lbCkpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWVwY20tPnJ1bm5pbmcgPSAwOworCQlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdSwgKElOVEVfQ0hfMF9MT09QIHwgSU5URV9DSF8wX0hBTEZfTE9PUCkgPDwgY2hhbm5lbCk7CisJCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBUUklHR0VSX0NIQU5ORUwsIDAsIHNuZF9lbXUxMGsxeF9wdHJfcmVhZChlbXUsIFRSSUdHRVJfQ0hBTk5FTCwgMCkgJiB+KFRSSUdHRVJfQ0hBTk5FTF8wPDxjaGFubmVsKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBwb2ludGVyIGNhbGxiYWNrICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9lbXUxMGsxeF9wY21fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJZW11MTBrMXhfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazF4X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBjaGFubmVsID0gZXBjbS0+dm9pY2UtPm51bWJlcjsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwdHIgPSAwLCBwdHIxID0gMCwgcHRyMj0gMCxwdHIzID0gMCxwdHI0ID0gMDsKKworCWlmICghZXBjbS0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlwdHIzID0gc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgUExBWUJBQ0tfTElTVF9QVFIsIGNoYW5uZWwpOworCXB0cjEgPSBzbmRfZW11MTBrMXhfcHRyX3JlYWQoZW11LCBQTEFZQkFDS19QT0lOVEVSLCBjaGFubmVsKTsKKwlwdHI0ID0gc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgUExBWUJBQ0tfTElTVF9QVFIsIGNoYW5uZWwpOworCisJaWYocHRyNCA9PSAwICYmIHB0cjEgPT0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKHB0cjMgIT0gcHRyNCkgCisJCXB0cjEgPSBzbmRfZW11MTBrMXhfcHRyX3JlYWQoZW11LCBQTEFZQkFDS19QT0lOVEVSLCBjaGFubmVsKTsKKwlwdHIyID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHB0cjEpOworCXB0cjIgKz0gKHB0cjQgPj4gMykgKiBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwlwdHIgPSBwdHIyOworCisJaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCisJcmV0dXJuIHB0cjsKK30KKworLyogb3BlcmF0b3JzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9lbXUxMGsxeF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9ICAgICAgIHNuZF9lbXUxMGsxeF9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gICBzbmRfZW11MTBrMXhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9ICAgICBzbmRfZW11MTBrMXhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPSAgICAgc25kX2VtdTEwazF4X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0gICAgIHNuZF9lbXUxMGsxeF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9ICAgICBzbmRfZW11MTBrMXhfcGNtX3BvaW50ZXIsCit9OworCisvKiBvcGVuX2NhcHR1cmUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X3BjbV9vcGVuX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWVtdTEwazF4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJZW11MTBrMXhfcGNtX3QgKmVwY207CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsIDY0KSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKwllcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVwY20tPmVtdSA9IGNoaXA7CisJZXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMXhfcGNtX2ZyZWVfc3Vic3RyZWFtOworCisJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMXhfY2FwdHVyZV9odzsKKworCXJldHVybiAwOworfQorCisvKiBjbG9zZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGNtX2Nsb3NlX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCisvKiBod19wYXJhbXMgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X3BjbV9od19wYXJhbXNfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJCSAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMXhfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoISBlcGNtLT52b2ljZSkgeworCQlpZiAoZXBjbS0+ZW11LT5jYXB0dXJlX3ZvaWNlLnVzZSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWVwY20tPnZvaWNlID0gJmVwY20tPmVtdS0+Y2FwdHVyZV92b2ljZTsKKwkJZXBjbS0+dm9pY2UtPmVwY20gPSBlcGNtOworCQllcGNtLT52b2ljZS0+dXNlID0gMTsKKwl9CisKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworLyogaHdfZnJlZSBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfZW11MTBrMXhfcGNtX2h3X2ZyZWVfY2FwdHVyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwllbXUxMGsxeF9wY21fdCAqZXBjbTsKKworCWlmIChydW50aW1lLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChlcGNtLT52b2ljZSkgeworCQllcGNtLT52b2ljZS0+dXNlID0gMDsKKwkJZXBjbS0+dm9pY2UtPmVwY20gPSBOVUxMOworCQllcGNtLT52b2ljZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKK30KKworLyogcHJlcGFyZSBjYXB0dXJlIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9wY21fcHJlcGFyZV9jYXB0dXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllbXUxMGsxeF90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgQ0FQVFVSRV9ETUFfQUREUiwgMCwgcnVudGltZS0+ZG1hX2FkZHIpOworCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBDQVBUVVJFX0JVRkZFUl9TSVpFLCAwLCBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+YnVmZmVyX3NpemUpPDwxNik7IC8vIGJ1ZmZlciBzaXplIGluIGJ5dGVzCisJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIENBUFRVUkVfUE9JTlRFUiwgMCwgMCk7CisJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIENBUFRVUkVfVU5LTk9XTiwgMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJpZ2dlcl9jYXB0dXJlIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9wY21fdHJpZ2dlcl9jYXB0dXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkJICAgIGludCBjbWQpCit7CisJZW11MTBrMXhfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazF4X3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXN1bHQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlzbmRfZW11MTBrMXhfaW50cl9lbmFibGUoZW11LCBJTlRFX0NBUF8wX0xPT1AgfCAKKwkJCQkJIElOVEVfQ0FQXzBfSEFMRl9MT09QKTsKKwkJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIFRSSUdHRVJfQ0hBTk5FTCwgMCwgc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgVFJJR0dFUl9DSEFOTkVMLCAwKXxUUklHR0VSX0NBUFRVUkUpOworCQllcGNtLT5ydW5uaW5nID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQllcGNtLT5ydW5uaW5nID0gMDsKKwkJc25kX2VtdTEwazF4X2ludHJfZGlzYWJsZShlbXUsIElOVEVfQ0FQXzBfTE9PUCB8IAorCQkJCQkgIElOVEVfQ0FQXzBfSEFMRl9MT09QKTsKKwkJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIFRSSUdHRVJfQ0hBTk5FTCwgMCwgc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgVFJJR0dFUl9DSEFOTkVMLCAwKSAmIH4oVFJJR0dFUl9DQVBUVVJFKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBwb2ludGVyX2NhcHR1cmUgY2FsbGJhY2sgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAorc25kX2VtdTEwazF4X3BjbV9wb2ludGVyX2NhcHR1cmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWVtdTEwazF4X3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxeF9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwdHI7CisKKwlpZiAoIWVwY20tPnJ1bm5pbmcpCisJCXJldHVybiAwOworCisJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHNuZF9lbXUxMGsxeF9wdHJfcmVhZChlbXUsIENBUFRVUkVfUE9JTlRFUiwgMCkpOworCWlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lbXUxMGsxeF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9ICAgICAgICBzbmRfZW11MTBrMXhfcGNtX29wZW5fY2FwdHVyZSwKKwkuY2xvc2UgPSAgICAgICBzbmRfZW11MTBrMXhfcGNtX2Nsb3NlX2NhcHR1cmUsCisJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9ICAgc25kX2VtdTEwazF4X3BjbV9od19wYXJhbXNfY2FwdHVyZSwKKwkuaHdfZnJlZSA9ICAgICBzbmRfZW11MTBrMXhfcGNtX2h3X2ZyZWVfY2FwdHVyZSwKKwkucHJlcGFyZSA9ICAgICBzbmRfZW11MTBrMXhfcGNtX3ByZXBhcmVfY2FwdHVyZSwKKwkudHJpZ2dlciA9ICAgICBzbmRfZW11MTBrMXhfcGNtX3RyaWdnZXJfY2FwdHVyZSwKKwkucG9pbnRlciA9ICAgICBzbmRfZW11MTBrMXhfcGNtX3BvaW50ZXJfY2FwdHVyZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfZW11MTBrMXhfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywKKwkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJZW11MTBrMXhfdCAqZW11ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgdmFsOworICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBlbXUtPnBvcnQgKyBBQzk3QUREUkVTUyk7CisJdmFsID0gaW53KGVtdS0+cG9ydCArIEFDOTdEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazF4X2FjOTdfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgICB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwllbXUxMGsxeF90ICplbXUgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgZW11LT5wb3J0ICsgQUM5N0FERFJFU1MpOworCW91dHcodmFsLCBlbXUtPnBvcnQgKyBBQzk3REFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9hYzk3KGVtdTEwazF4X3QgKmNoaXApCit7CisJYWM5N19idXNfdCAqcGJ1czsKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwlpbnQgZXJyOworCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCS53cml0ZSA9IHNuZF9lbXUxMGsxeF9hYzk3X3dyaXRlLAorCQkucmVhZCA9IHNuZF9lbXUxMGsxeF9hYzk3X3JlYWQsCisJfTsKKyAgCisJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2hpcC0+Y2FyZCwgMCwgJm9wcywgTlVMTCwgJnBidXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcGJ1cy0+bm9fdnJhID0gMTsgLyogd2UgZG9uJ3QgbmVlZCBWUkEgKi8KKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9OT19TUERJRjsKKwlyZXR1cm4gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3KTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMXhfZnJlZShlbXUxMGsxeF90ICpjaGlwKQoreworCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoY2hpcCwgVFJJR0dFUl9DSEFOTkVMLCAwLCAwKTsKKwkvLyBkaXNhYmxlIGludGVycnVwdHMKKwlvdXRsKDAsIGNoaXAtPnBvcnQgKyBJTlRFKTsKKwkvLyBkaXNhYmxlIGF1ZGlvCisJb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFLCBjaGlwLT5wb3J0ICsgSENGRyk7CisKKwkvLyByZWxlYXNlIHRoZSBpL28gcG9ydAorCWlmIChjaGlwLT5yZXNfcG9ydCkgeworCQlyZWxlYXNlX3Jlc291cmNlKGNoaXAtPnJlc19wb3J0KTsKKwkJa2ZyZWVfbm9jaGVjayhjaGlwLT5yZXNfcG9ydCk7CisJfQorCS8vIHJlbGVhc2UgdGhlIGlycQorCWlmIChjaGlwLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOworCisJLy8gcmVsZWFzZSB0aGUgRE1BCisJaWYgKGNoaXAtPmRtYV9idWZmZXIuYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmRtYV9idWZmZXIpOworCX0KKworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCisJLy8gcmVsZWFzZSB0aGUgZGF0YQorCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwllbXUxMGsxeF90ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfZW11MTBrMXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJZW11MTBrMXhfdCAqY2hpcCA9IGRldl9pZDsKKwllbXUxMGsxeF92b2ljZV90ICpwdm9pY2UgPSBjaGlwLT52b2ljZXM7CisJaW50IGk7CisJaW50IG1hc2s7CisKKwlzdGF0dXMgPSBpbmwoY2hpcC0+cG9ydCArIElQUik7CisKKwlpZihzdGF0dXMpIHsKKwkJLy8gY2FwdHVyZSBpbnRlcnJ1cHQKKwkJaWYoc3RhdHVzICYgKElQUl9DQVBfMF9MT09QIHwgSVBSX0NBUF8wX0hBTEZfTE9PUCkpIHsKKwkJCWVtdTEwazF4X3ZvaWNlX3QgKnB2b2ljZSA9ICZjaGlwLT5jYXB0dXJlX3ZvaWNlOworCQkJaWYocHZvaWNlLT51c2UpCisJCQkJc25kX2VtdTEwazF4X3BjbV9pbnRlcnJ1cHQoY2hpcCwgcHZvaWNlKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGNoaXAsIAorCQkJCQkJCSAgSU5URV9DQVBfMF9MT09QIHwKKwkJCQkJCQkgIElOVEVfQ0FQXzBfSEFMRl9MT09QKTsKKwkJfQorCQkKKwkJbWFzayA9IElQUl9DSF8wX0xPT1B8SVBSX0NIXzBfSEFMRl9MT09QOworCQlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmKHN0YXR1cyAmIG1hc2spIHsKKwkJCQlpZihwdm9pY2UtPnVzZSkKKwkJCQkJc25kX2VtdTEwazF4X3BjbV9pbnRlcnJ1cHQoY2hpcCwgcHZvaWNlKTsKKwkJCQllbHNlIAorCQkJCQlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGNoaXAsIG1hc2spOworCQkJfQorCQkJcHZvaWNlKys7CisJCQltYXNrIDw8PSAxOworCQl9CisJCQorCQlpZiAoc3RhdHVzICYgKElQUl9NSURJVFJBTlNCVUZFTVBUWXxJUFJfTUlESVJFQ1ZCVUZFTVBUWSkpIHsKKwkJCWlmIChjaGlwLT5taWRpLmludGVycnVwdCkKKwkJCQljaGlwLT5taWRpLmludGVycnVwdChjaGlwLCBzdGF0dXMpOworCQkJZWxzZQorCQkJCXNuZF9lbXUxMGsxeF9pbnRyX2Rpc2FibGUoY2hpcCwgSU5URV9NSURJVFhFTkFCTEV8SU5URV9NSURJUlhFTkFCTEUpOworCQl9CisJCQorCQkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGlmIG5lY2Vzc2FyeQorCQlpZihzdGF0dXMpCisJCQlvdXRsKHN0YXR1cywgY2hpcC0+cG9ydCtJUFIpOworCisvLwkJc25kX3ByaW50ayhLRVJOX0lORk8gImludGVycnVwdCAlMDh4XG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazF4X3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWVtdTEwazF4X3QgKmVtdSA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWVtdS0+cGNtID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VtdTEwazF4X3BjbShlbXUxMGsxeF90ICplbXUsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKnJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKwlpbnQgY2FwdHVyZSA9IDA7CisgIAorCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisJaWYgKGRldmljZSA9PSAwKQorCQljYXB0dXJlID0gMTsKKwkKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGVtdS0+Y2FyZCwgImVtdTEwazF4IiwgZGV2aWNlLCAxLCBjYXB0dXJlLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworICAKKwlwY20tPnByaXZhdGVfZGF0YSA9IGVtdTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxeF9wY21fZnJlZTsKKwkKKwlzd2l0Y2goZGV2aWNlKSB7CisJY2FzZSAwOgorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VtdTEwazF4X3BsYXliYWNrX29wcyk7CisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9lbXUxMGsxeF9jYXB0dXJlX29wcyk7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BzKTsKKwkJYnJlYWs7CisJfQorCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlwY20tPmRldl9zdWJjbGFzcyA9IFNORFJWX1BDTV9TVUJDTEFTU19HRU5FUklDX01JWDsKKwlzd2l0Y2goZGV2aWNlKSB7CisJY2FzZSAwOgorCQlzdHJjcHkocGNtLT5uYW1lLCAiRU1VMTBLMVggRnJvbnQiKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdHJjcHkocGNtLT5uYW1lLCAiRU1VMTBLMVggUmVhciIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXN0cmNweShwY20tPm5hbWUsICJFTVUxMEsxWCBDZW50ZXIvTEZFIik7CisJCWJyZWFrOworCX0KKwllbXUtPnBjbSA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLCAKKwkJCQkJICAgICAgMzIqMTAyNCwgMzIqMTAyNCk7CisgIAorCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lbXUxMGsxeF9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSBlbXUxMGsxeF90ICoqcmNoaXApCit7CisJZW11MTBrMXhfdCAqY2hpcDsKKwlpbnQgZXJyOworCWludCBjaDsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9IHNuZF9lbXUxMGsxeF9kZXZfZnJlZSwKKwl9OworICAKKwkqcmNoaXAgPSBOVUxMOworICAKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIDB4MGZmZmZmZmYpIDwgMCB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCAweDBmZmZmZmZmKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgdG8gc2V0IDI4Yml0IG1hc2sgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorICAKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisgIAorCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5lbXVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnZvaWNlX2xvY2spOworICAKKwljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKChjaGlwLT5yZXNfcG9ydCA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPnBvcnQsIDgsCisJCQkJCSAgICAgIkVNVTEwSzFYIikpID09IE5VTEwpIHsgCisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgYWxsb2NhdGUgdGhlIHBvcnQgMHglbHhcbiIsIGNoaXAtPnBvcnQpOworCQlzbmRfZW11MTBrMXhfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lbXUxMGsxeF9pbnRlcnJ1cHQsCisJCQlTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJFTVUxMEsxWCIsCisJCQkodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworICAKKwlpZihzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAorCQkJICAgICAgIDQgKiAxMDI0LCAmY2hpcC0+ZG1hX2J1ZmZlcikgPCAwKSB7CisJCXNuZF9lbXUxMGsxeF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCS8qIHJlYWQgcmV2aXNpb24gJiBzZXJpYWwgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgKGNoYXIgKikmY2hpcC0+cmV2aXNpb24pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmY2hpcC0+c2VyaWFsKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZjaGlwLT5tb2RlbCk7CisJc25kX3ByaW50ayhLRVJOX0lORk8gIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsIGNoaXAtPm1vZGVsLAorCQkgICBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+c2VyaWFsKTsKKworCW91dGwoMCwgY2hpcC0+cG9ydCArIElOVEUpOwkKKworCWZvcihjaCA9IDA7IGNoIDwgMzsgY2grKykgeworCQljaGlwLT52b2ljZXNbY2hdLmVtdSA9IGNoaXA7CisJCWNoaXAtPnZvaWNlc1tjaF0ubnVtYmVyID0gY2g7CisJfQorCisJLyoKKwkgKiAgSW5pdCB0byAweDAyMTA5MjA0IDoKKwkgKiAgQ2xvY2sgYWNjdXJhY3kgICAgPSAwICAgICAoMTAwMHBwbSkKKwkgKiAgU2FtcGxlIFJhdGUgICAgICAgPSAyICAgICAoNDhrSHopCisJICogIEF1ZGlvIENoYW5uZWwgICAgID0gMSAgICAgKExlZnQgb2YgMikKKwkgKiAgU291cmNlIE51bWJlciAgICAgPSAwICAgICAoVW5zcGVjaWZpZWQpCisJICogIEdlbmVyYXRpb24gU3RhdHVzID0gMSAgICAgKE9yaWdpbmFsIGZvciBDYXQgQ29kZSAxMikKKwkgKiAgQ2F0IENvZGUgICAgICAgICAgPSAxMiAgICAoRGlnaXRhbCBTaWduYWwgTWl4ZXIpCisJICogIE1vZGUgICAgICAgICAgICAgID0gMCAgICAgKE1vZGUgMCkKKwkgKiAgRW1waGFzaXMgICAgICAgICAgPSAwICAgICAoTm9uZSkKKwkgKiAgQ1AgICAgICAgICAgICAgICAgPSAxICAgICAoQ29weXJpZ2h0IHVuYXNzZXJ0ZWQpCisJICogIEFOICAgICAgICAgICAgICAgID0gMCAgICAgKEF1ZGlvIGRhdGEpCisJICogIFAgICAgICAgICAgICAgICAgID0gMCAgICAgKENvbnN1bWVyKQorCSAqLworCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoY2hpcCwgU1BDUzAsIDAsCisJCQkgICAgICAgY2hpcC0+c3BkaWZfYml0c1swXSA9IAorCQkJICAgICAgIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCSAgICAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8CisJCQkgICAgICAgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8CisJCQkgICAgICAgMHgwMDAwMDAwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKTsKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGNoaXAsIFNQQ1MxLCAwLAorCQkJICAgICAgIGNoaXAtPnNwZGlmX2JpdHNbMV0gPSAKKwkJCSAgICAgICBTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IFNQQ1NfU0FNUExFUkFURV80OCB8CisJCQkgICAgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfAorCQkJICAgICAgIFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfAorCQkJICAgICAgIDB4MDAwMDAwMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCk7CisJc25kX2VtdTEwazF4X3B0cl93cml0ZShjaGlwLCBTUENTMiwgMCwKKwkJCSAgICAgICBjaGlwLT5zcGRpZl9iaXRzWzJdID0gCisJCQkgICAgICAgU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAorCQkJICAgICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwKKwkJCSAgICAgICBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwKKwkJCSAgICAgICAweDAwMDAwMDAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpOworCisJc25kX2VtdTEwazF4X3B0cl93cml0ZShjaGlwLCBTUERJRl9TRUxFQ1QsIDAsIDB4NzAwKTsgLy8gZGlzYWJsZSBTUERJRgorCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoY2hpcCwgUk9VVElORywgMCwgMHgxMDAzRik7IC8vIHJvdXRpbmcKKwlzbmRfZW11MTBrMXhfZ3Bpb193cml0ZShjaGlwLCAweDEwODApOyAvLyBhbmFsb2cgbW9kZQorCisJb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFfEhDRkdfQVVESU9FTkFCTEUsIGNoaXAtPnBvcnQrSENGRyk7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwKKwkJCQkgIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCSpyY2hpcCA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxeF9wcm9jX3JlZ19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJZW11MTBrMXhfdCAqZW11ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlLHZhbHVlMSx2YWx1ZTI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJlZ2lzdGVyczpcblxuIik7CisJZm9yKGkgPSAwOyBpIDwgMHgyMDsgaSs9NCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQl2YWx1ZSA9IGlubChlbXUtPnBvcnQgKyBpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJSZWdpc3RlciAlMDJYOiAlMDhsWFxuIiwgaSwgdmFsdWUpOworCX0KKwlzbmRfaXByaW50ZihidWZmZXIsICJcblJlZ2lzdGVyc1xuXG4iKTsKKwlmb3IoaSA9IDA7IGkgPD0gMHg0ODsgaSsrKSB7CisJCXZhbHVlID0gc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgaSwgMCk7CisJCWlmKGkgPCAweDEwIHx8IChpID49IDB4MjAgJiYgaSA8IDB4NDApKSB7CisJCQl2YWx1ZTEgPSBzbmRfZW11MTBrMXhfcHRyX3JlYWQoZW11LCBpLCAxKTsKKwkJCXZhbHVlMiA9IHNuZF9lbXUxMGsxeF9wdHJfcmVhZChlbXUsIGksIDIpOworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyWDogJTA4bFggJTA4bFggJTA4bFhcbiIsIGksIHZhbHVlLCB2YWx1ZTEsIHZhbHVlMik7CisJCX0gZWxzZSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJYOiAlMDhsWFxuIiwgaSwgdmFsdWUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfcHJvY19yZWdfd3JpdGUoc25kX2luZm9fZW50cnlfdCAqZW50cnksIAorCQkJCQlzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWVtdTEwazF4X3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJY2hhciBsaW5lWzY0XTsKKwl1bnNpZ25lZCBpbnQgcmVnLCBjaGFubmVsX2lkICwgdmFsOworCisJd2hpbGUgKCFzbmRfaW5mb19nZXRfbGluZShidWZmZXIsIGxpbmUsIHNpemVvZihsaW5lKSkpIHsKKwkJaWYgKHNzY2FuZihsaW5lLCAiJXggJXggJXgiLCAmcmVnLCAmY2hhbm5lbF9pZCwgJnZhbCkgIT0gMykKKwkJCWNvbnRpbnVlOworCisJCWlmICgocmVnIDwgMHg0OSkgJiYgKHJlZyA+PTApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgCisJCSAgICAmJiAoY2hhbm5lbF9pZCA+PTApICYmIChjaGFubmVsX2lkIDw9IDIpICkKKwkJCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCByZWcsIGNoYW5uZWxfaWQsIHZhbCk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMXhfcHJvY19pbml0KGVtdTEwazF4X3QgKiBlbXUpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJCisJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJlbXUxMGsxeF9yZWdzIiwgJmVudHJ5KSkgeworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2VtdTEwazF4X3Byb2NfcmVnX3JlYWQpOworCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKKwkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9lbXUxMGsxeF9wcm9jX3JlZ193cml0ZTsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGVtdTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X3NoYXJlZF9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9zaGFyZWRfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCSBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazF4X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9lbXUxMGsxeF9wdHJfcmVhZChlbXUsIFNQRElGX1NFTEVDVCwgMCkgPT0gMHg3MDApID8gMCA6IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMXhfc2hhcmVkX3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllbXUxMGsxeF90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlID0gMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDsKKworCWlmICh2YWwpIHsKKwkJLy8gZW5hYmxlIHNwZGlmIG91dHB1dAorCQlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgU1BESUZfU0VMRUNULCAwLCAweDAwMCk7CisJCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBST1VUSU5HLCAwLCAweDcwMCk7CisJCXNuZF9lbXUxMGsxeF9ncGlvX3dyaXRlKGVtdSwgMHgxMDAwKTsKKwl9IGVsc2UgeworCQkvLyBkaXNhYmxlIHNwZGlmIG91dHB1dAorCQlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgU1BESUZfU0VMRUNULCAwLCAweDcwMCk7CisJCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBST1VUSU5HLCAwLCAweDEwMDNGKTsKKwkJc25kX2VtdTEwazF4X2dwaW9fd3JpdGUoZW11LCAweDEwODApOworCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxeF9zaGFyZWRfc3BkaWYgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJIkFuYWxvZy9EaWdpdGFsIE91dHB1dCBKYWNrIiwKKwkuaW5mbyA9CQlzbmRfZW11MTBrMXhfc2hhcmVkX3NwZGlmX2luZm8sCisJLmdldCA9CQlzbmRfZW11MTBrMXhfc2hhcmVkX3NwZGlmX2dldCwKKwkucHV0ID0JCXNuZF9lbXUxMGsxeF9zaGFyZWRfc3BkaWZfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMXhfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazF4X3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChlbXUtPnNwZGlmX2JpdHNbaWR4XSA+PiAwKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAoZW11LT5zcGRpZl9iaXRzW2lkeF0gPj4gOCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gKGVtdS0+c3BkaWZfYml0c1tpZHhdID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoZW11LT5zcGRpZl9iaXRzW2lkeF0gPj4gMjQpICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMXhfc3BkaWZfZ2V0X21hc2soc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllbXUxMGsxeF90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA8PCAwKSB8CisJCSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA8PCA4KSB8CisJCSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA8PCAxNikgfAorCQkodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPDwgMjQpOworCWNoYW5nZSA9IHZhbCAhPSBlbXUtPnNwZGlmX2JpdHNbaWR4XTsKKwlpZiAoY2hhbmdlKSB7CisJCXNuZF9lbXUxMGsxeF9wdHJfd3JpdGUoZW11LCBTUENTMCArIGlkeCwgMCwgdmFsKTsKKwkJZW11LT5zcGRpZl9iaXRzW2lkeF0gPSB2YWw7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazF4X3NwZGlmX21hc2tfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE1BU0spLAorCS5jb3VudCA9CTMsCisJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMGsxeF9zcGRpZl9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMXhfc3BkaWZfZ2V0X21hc2sKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazF4X3NwZGlmX2NvbnRyb2wgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJLmNvdW50ID0JMywKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazF4X3NwZGlmX2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9lbXUxMGsxeF9zcGRpZl9nZXQsCisJLnB1dCA9ICAgICAgICAgIHNuZF9lbXUxMGsxeF9zcGRpZl9wdXQKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lbXUxMGsxeF9taXhlcihlbXUxMGsxeF90ICplbXUpCit7CisJaW50IGVycjsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwlzbmRfY2FyZF90ICpjYXJkID0gZW11LT5jYXJkOworCisJaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMXhfc3BkaWZfbWFza19jb250cm9sLCBlbXUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxeF9zaGFyZWRfc3BkaWYsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwazF4X3NwZGlmX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRU1VMTBLMVhfTUlESV9NT0RFX0lOUFVUCSgxPDwwKQorI2RlZmluZSBFTVUxMEsxWF9NSURJX01PREVfT1VUUFVUCSgxPDwxKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbXB1NDAxX3JlYWQoZW11MTBrMXhfdCAqZW11LCBlbXUxMGsxeF9taWRpX3QgKm1wdSwgaW50IGlkeCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpc25kX2VtdTEwazF4X3B0cl9yZWFkKGVtdSwgbXB1LT5wb3J0ICsgaWR4LCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wdTQwMV93cml0ZShlbXUxMGsxeF90ICplbXUsIGVtdTEwazF4X21pZGlfdCAqbXB1LCBpbnQgZGF0YSwgaW50IGlkeCkKK3sKKwlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgbXB1LT5wb3J0ICsgaWR4LCAwLCBkYXRhKTsKK30KKworI2RlZmluZSBtcHU0MDFfd3JpdGVfZGF0YShlbXUsIG1wdSwgZGF0YSkJbXB1NDAxX3dyaXRlKGVtdSwgbXB1LCBkYXRhLCAwKQorI2RlZmluZSBtcHU0MDFfd3JpdGVfY21kKGVtdSwgbXB1LCBkYXRhKQltcHU0MDFfd3JpdGUoZW11LCBtcHUsIGRhdGEsIDEpCisjZGVmaW5lIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpCQltcHU0MDFfcmVhZChlbXUsIG1wdSwgMCkKKyNkZWZpbmUgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1wdSkJCW1wdTQwMV9yZWFkKGVtdSwgbXB1LCAxKQorCisjZGVmaW5lIG1wdTQwMV9pbnB1dF9hdmFpbChlbXUsbXB1KQkoIShtcHU0MDFfcmVhZF9zdGF0KGVtdSxtcHUpICYgMHg4MCkpCisjZGVmaW5lIG1wdTQwMV9vdXRwdXRfcmVhZHkoZW11LG1wdSkJKCEobXB1NDAxX3JlYWRfc3RhdChlbXUsbXB1KSAmIDB4NDApKQorCisjZGVmaW5lIE1QVTQwMV9SRVNFVAkJMHhmZgorI2RlZmluZSBNUFU0MDFfRU5URVJfVUFSVAkweDNmCisjZGVmaW5lIE1QVTQwMV9BQ0sJCTB4ZmUKKworc3RhdGljIHZvaWQgbXB1NDAxX2NsZWFyX3J4KGVtdTEwazF4X3QgKmVtdSwgZW11MTBrMXhfbWlkaV90ICptcHUpCit7CisJaW50IHRpbWVvdXQgPSAxMDAwMDA7CisJZm9yICg7IHRpbWVvdXQgPiAwICYmIG1wdTQwMV9pbnB1dF9hdmFpbChlbXUsIG1wdSk7IHRpbWVvdXQtLSkKKwkJbXB1NDAxX3JlYWRfZGF0YShlbXUsIG1wdSk7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCWlmICh0aW1lb3V0IDw9IDApCisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNtZDogY2xlYXIgcnggdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsIG1wdTQwMV9yZWFkX3N0YXQoZW11LCBtcHUpKTsKKyNlbmRpZgorfQorCisvKgorCisgKi8KKworc3RhdGljIHZvaWQgZG9fZW11MTBrMXhfbWlkaV9pbnRlcnJ1cHQoZW11MTBrMXhfdCAqZW11LCBlbXUxMGsxeF9taWRpX3QgKm1pZGksIHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJaWYgKG1pZGktPnJtaWRpID09IE5VTEwpIHsKKwkJc25kX2VtdTEwazF4X2ludHJfZGlzYWJsZShlbXUsIG1pZGktPnR4X2VuYWJsZSB8IG1pZGktPnJ4X2VuYWJsZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJm1pZGktPmlucHV0X2xvY2spOworCWlmICgoc3RhdHVzICYgbWlkaS0+aXByX3J4KSAmJiBtcHU0MDFfaW5wdXRfYXZhaWwoZW11LCBtaWRpKSkgeworCQlpZiAoIShtaWRpLT5taWRpX21vZGUgJiBFTVUxMEsxWF9NSURJX01PREVfSU5QVVQpKSB7CisJCQltcHU0MDFfY2xlYXJfcngoZW11LCBtaWRpKTsKKwkJfSBlbHNlIHsKKwkJCWJ5dGUgPSBtcHU0MDFfcmVhZF9kYXRhKGVtdSwgbWlkaSk7CisJCQlpZiAobWlkaS0+c3Vic3RyZWFtX2lucHV0KQorCQkJCXNuZF9yYXdtaWRpX3JlY2VpdmUobWlkaS0+c3Vic3RyZWFtX2lucHV0LCAmYnl0ZSwgMSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm1pZGktPmlucHV0X2xvY2spOworCisJc3Bpbl9sb2NrKCZtaWRpLT5vdXRwdXRfbG9jayk7CisJaWYgKChzdGF0dXMgJiBtaWRpLT5pcHJfdHgpICYmIG1wdTQwMV9vdXRwdXRfcmVhZHkoZW11LCBtaWRpKSkgeworCQlpZiAobWlkaS0+c3Vic3RyZWFtX291dHB1dCAmJgorCQkgICAgc25kX3Jhd21pZGlfdHJhbnNtaXQobWlkaS0+c3Vic3RyZWFtX291dHB1dCwgJmJ5dGUsIDEpID09IDEpIHsKKwkJCW1wdTQwMV93cml0ZV9kYXRhKGVtdSwgbWlkaSwgYnl0ZSk7CisJCX0gZWxzZSB7CisJCQlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+dHhfZW5hYmxlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbWlkaS0+b3V0cHV0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfbWlkaV9pbnRlcnJ1cHQoZW11MTBrMXhfdCAqZW11LCB1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCWRvX2VtdTEwazF4X21pZGlfaW50ZXJydXB0KGVtdSwgJmVtdS0+bWlkaSwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazF4X21pZGlfY21kKGVtdTEwazF4X3QgKiBlbXUsIGVtdTEwazF4X21pZGlfdCAqbWlkaSwgdW5zaWduZWQgY2hhciBjbWQsIGludCBhY2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGltZW91dCwgb2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaS0+aW5wdXRfbG9jaywgZmxhZ3MpOworCW1wdTQwMV93cml0ZV9kYXRhKGVtdSwgbWlkaSwgMHgwMCk7CisJLyogbXB1NDAxX2NsZWFyX3J4KGVtdSwgbWlkaSk7ICovCisKKwltcHU0MDFfd3JpdGVfY21kKGVtdSwgbWlkaSwgY21kKTsKKwlpZiAoYWNrKSB7CisJCW9rID0gMDsKKwkJdGltZW91dCA9IDEwMDAwOworCQl3aGlsZSAoIW9rICYmIHRpbWVvdXQtLSA+IDApIHsKKwkJCWlmIChtcHU0MDFfaW5wdXRfYXZhaWwoZW11LCBtaWRpKSkgeworCQkJCWlmIChtcHU0MDFfcmVhZF9kYXRhKGVtdSwgbWlkaSkgPT0gTVBVNDAxX0FDSykKKwkJCQkJb2sgPSAxOworCQkJfQorCQl9CisJCWlmICghb2sgJiYgbXB1NDAxX3JlYWRfZGF0YShlbXUsIG1pZGkpID09IE1QVTQwMV9BQ0spCisJCQlvayA9IDE7CisJfSBlbHNlIHsKKwkJb2sgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5pbnB1dF9sb2NrLCBmbGFncyk7CisJaWYgKCFvaykKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCisJCQkgICBjbWQsIGVtdS0+cG9ydCwKKwkJCSAgIG1wdTQwMV9yZWFkX3N0YXQoZW11LCBtaWRpKSwKKwkJCSAgIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X21pZGlfaW5wdXRfb3BlbihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxeF90ICplbXU7CisJZW11MTBrMXhfbWlkaV90ICptaWRpID0gKGVtdTEwazF4X21pZGlfdCAqKXN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWVtdSA9IG1pZGktPmVtdTsKKwlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuIC1FTlhJTyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCW1pZGktPm1pZGlfbW9kZSB8PSBFTVUxMEsxWF9NSURJX01PREVfSU5QVVQ7CisJbWlkaS0+c3Vic3RyZWFtX2lucHV0ID0gc3Vic3RyZWFtOworCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFYX01JRElfTU9ERV9PVVRQVVQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCQlzbmRfZW11MTBrMXhfbWlkaV9jbWQoZW11LCBtaWRpLCBNUFU0MDFfUkVTRVQsIDEpOworCQlzbmRfZW11MTBrMXhfbWlkaV9jbWQoZW11LCBtaWRpLCBNUFU0MDFfRU5URVJfVUFSVCwgMSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9taWRpX291dHB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazF4X3QgKmVtdTsKKwllbXUxMGsxeF9taWRpX3QgKm1pZGkgPSAoZW11MTBrMXhfbWlkaV90ICopc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbXUgPSBtaWRpLT5lbXU7CisJc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwltaWRpLT5taWRpX21vZGUgfD0gRU1VMTBLMVhfTUlESV9NT0RFX09VVFBVVDsKKwltaWRpLT5zdWJzdHJlYW1fb3V0cHV0ID0gc3Vic3RyZWFtOworCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFYX01JRElfTU9ERV9JTlBVVCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJCXNuZF9lbXUxMGsxeF9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMSk7CisJCXNuZF9lbXUxMGsxeF9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9FTlRFUl9VQVJULCAxKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazF4X21pZGlfaW5wdXRfY2xvc2Uoc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMXhfdCAqZW11OworCWVtdTEwazF4X21pZGlfdCAqbWlkaSA9IChlbXUxMGsxeF9taWRpX3QgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVtdSA9IG1pZGktPmVtdTsKKwlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuIC1FTlhJTyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCXNuZF9lbXUxMGsxeF9pbnRyX2Rpc2FibGUoZW11LCBtaWRpLT5yeF9lbmFibGUpOworCW1pZGktPm1pZGlfbW9kZSAmPSB+RU1VMTBLMVhfTUlESV9NT0RFX0lOUFVUOworCW1pZGktPnN1YnN0cmVhbV9pbnB1dCA9IE5VTEw7CisJaWYgKCEobWlkaS0+bWlkaV9tb2RlICYgRU1VMTBLMVhfTUlESV9NT0RFX09VVFBVVCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJCXNuZF9lbXUxMGsxeF9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxeF9taWRpX291dHB1dF9jbG9zZShzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxeF90ICplbXU7CisJZW11MTBrMXhfbWlkaV90ICptaWRpID0gKGVtdTEwazF4X21pZGlfdCAqKXN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZW11ID0gbWlkaS0+ZW11OworCXNuZF9hc3NlcnQoZW11LCByZXR1cm4gLUVOWElPKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJc25kX2VtdTEwazF4X2ludHJfZGlzYWJsZShlbXUsIG1pZGktPnR4X2VuYWJsZSk7CisJbWlkaS0+bWlkaV9tb2RlICY9IH5FTVUxMEsxWF9NSURJX01PREVfT1VUUFVUOworCW1pZGktPnN1YnN0cmVhbV9vdXRwdXQgPSBOVUxMOworCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFYX01JRElfTU9ERV9JTlBVVCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJCXNuZF9lbXUxMGsxeF9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfbWlkaV9pbnB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJZW11MTBrMXhfdCAqZW11OworCWVtdTEwazF4X21pZGlfdCAqbWlkaSA9IChlbXUxMGsxeF9taWRpX3QgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJZW11ID0gbWlkaS0+ZW11OworCXNuZF9hc3NlcnQoZW11LCByZXR1cm4pOworCisJaWYgKHVwKQorCQlzbmRfZW11MTBrMXhfaW50cl9lbmFibGUoZW11LCBtaWRpLT5yeF9lbmFibGUpOworCWVsc2UKKwkJc25kX2VtdTEwazF4X2ludHJfZGlzYWJsZShlbXUsIG1pZGktPnJ4X2VuYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxeF9taWRpX291dHB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJZW11MTBrMXhfdCAqZW11OworCWVtdTEwazF4X21pZGlfdCAqbWlkaSA9IChlbXUxMGsxeF9taWRpX3QgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVtdSA9IG1pZGktPmVtdTsKKwlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuKTsKKworCWlmICh1cCkgeworCQlpbnQgbWF4ID0gNDsKKwkJdW5zaWduZWQgY2hhciBieXRlOworCQorCQkvKiB0cnkgdG8gc2VuZCBzb21lIGFtb3VudCBvZiBieXRlcyBoZXJlIGJlZm9yZSBpbnRlcnJ1cHRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vdXRwdXRfbG9jaywgZmxhZ3MpOworCQl3aGlsZSAobWF4ID4gMCkgeworCQkJaWYgKG1wdTQwMV9vdXRwdXRfcmVhZHkoZW11LCBtaWRpKSkgeworCQkJCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFYX01JRElfTU9ERV9PVVRQVVQpIHx8CisJCQkJICAgIHNuZF9yYXdtaWRpX3RyYW5zbWl0KHN1YnN0cmVhbSwgJmJ5dGUsIDEpICE9IDEpIHsKKwkJCQkJLyogbm8gbW9yZSBkYXRhICovCisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm91dHB1dF9sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbXB1NDAxX3dyaXRlX2RhdGEoZW11LCBtaWRpLCBieXRlKTsKKwkJCQltYXgtLTsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3V0cHV0X2xvY2ssIGZsYWdzKTsKKwkJc25kX2VtdTEwazF4X2ludHJfZW5hYmxlKGVtdSwgbWlkaS0+dHhfZW5hYmxlKTsKKwl9IGVsc2UgeworCQlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+dHhfZW5hYmxlKTsKKwl9Cit9CisKKy8qCisKKyAqLworCitzdGF0aWMgc25kX3Jhd21pZGlfb3BzX3Qgc25kX2VtdTEwazF4X21pZGlfb3V0cHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfZW11MTBrMXhfbWlkaV9vdXRwdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZW11MTBrMXhfbWlkaV9vdXRwdXRfY2xvc2UsCisJLnRyaWdnZXIgPQlzbmRfZW11MTBrMXhfbWlkaV9vdXRwdXRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBzbmRfcmF3bWlkaV9vcHNfdCBzbmRfZW11MTBrMXhfbWlkaV9pbnB1dCA9Cit7CisJLm9wZW4gPQkJc25kX2VtdTEwazF4X21pZGlfaW5wdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZW11MTBrMXhfbWlkaV9pbnB1dF9jbG9zZSwKKwkudHJpZ2dlciA9CXNuZF9lbXUxMGsxeF9taWRpX2lucHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMXhfbWlkaV9mcmVlKHNuZF9yYXdtaWRpX3QgKnJtaWRpKQoreworCWVtdTEwazF4X21pZGlfdCAqbWlkaSA9IChlbXUxMGsxeF9taWRpX3QgKilybWlkaS0+cHJpdmF0ZV9kYXRhOworCW1pZGktPmludGVycnVwdCA9IE5VTEw7CisJbWlkaS0+cm1pZGkgPSBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxeF9taWRpX2luaXQoZW11MTBrMXhfdCAqZW11LCBlbXUxMGsxeF9taWRpX3QgKm1pZGksIGludCBkZXZpY2UsIGNoYXIgKm5hbWUpCit7CisJc25kX3Jhd21pZGlfdCAqcm1pZGk7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3Jhd21pZGlfbmV3KGVtdS0+Y2FyZCwgbmFtZSwgZGV2aWNlLCAxLCAxLCAmcm1pZGkpKSA8IDApCisJCXJldHVybiBlcnI7CisJbWlkaS0+ZW11ID0gZW11OworCXNwaW5fbG9ja19pbml0KCZtaWRpLT5vcGVuX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtaWRpLT5pbnB1dF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWlkaS0+b3V0cHV0X2xvY2spOworCXN0cmNweShybWlkaS0+bmFtZSwgbmFtZSk7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX2VtdTEwazF4X21pZGlfb3V0cHV0KTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwgJnNuZF9lbXUxMGsxeF9taWRpX2lucHV0KTsKKwlybWlkaS0+aW5mb19mbGFncyB8PSBTTkRSVl9SQVdNSURJX0lORk9fT1VUUFVUIHwKKwkgICAgICAgICAgICAgICAgICAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAorCSAgICAgICAgICAgICAgICAgICAgIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisJcm1pZGktPnByaXZhdGVfZGF0YSA9IG1pZGk7CisJcm1pZGktPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxeF9taWRpX2ZyZWU7CisJbWlkaS0+cm1pZGkgPSBybWlkaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VtdTEwazF4X21pZGkoZW11MTBrMXhfdCAqZW11KQoreworCWVtdTEwazF4X21pZGlfdCAqbWlkaSA9ICZlbXUtPm1pZGk7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gZW11MTBrMXhfbWlkaV9pbml0KGVtdSwgbWlkaSwgMCwgIkVNVTEwSzFYIE1QVS00MDEgKFVBUlQpIikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCW1pZGktPnR4X2VuYWJsZSA9IElOVEVfTUlESVRYRU5BQkxFOworCW1pZGktPnJ4X2VuYWJsZSA9IElOVEVfTUlESVJYRU5BQkxFOworCW1pZGktPnBvcnQgPSBNVURBVEE7CisJbWlkaS0+aXByX3R4ID0gSVBSX01JRElUUkFOU0JVRkVNUFRZOworCW1pZGktPmlwcl9yeCA9IElQUl9NSURJUkVDVkJVRkVNUFRZOworCW1pZGktPmludGVycnVwdCA9IHNuZF9lbXUxMGsxeF9taWRpX2ludGVycnVwdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VtdTEwazF4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwllbXUxMGsxeF90ICpjaGlwOworCWludCBlcnI7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoZXJyID0gc25kX2VtdTEwazF4X2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZW11MTBrMXhfcGNtKGNoaXAsIDAsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfZW11MTBrMXhfcGNtKGNoaXAsIDEsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfZW11MTBrMXhfcGNtKGNoaXAsIDIsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxeF9hYzk3KGNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxeF9taXhlcihjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCQorCWlmICgoZXJyID0gc25kX2VtdTEwazF4X21pZGkoY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9lbXUxMGsxeF9wcm9jX2luaXQoY2hpcCk7CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiRU1VMTBLMVgiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRGVsbCBTb3VuZCBCbGFzdGVyIExpdmUhIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4IGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+cG9ydCwgY2hpcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2VtdTEwazF4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCisvLyBQQ0kgSURzCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2VtdTEwazF4X2lkc1tdID0geworCXsgMHgxMTAyLCAweDAwMDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwJLyogRGVsbCBPRU0gdmVyc2lvbiAoRU1VMTBLMSkgKi8KKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2VtdTEwazF4X2lkcyk7CisKKy8vIHBjaV9kcml2ZXIgZGVmaW5pdGlvbgorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJFTVUxMEsxWCIsCisJLmlkX3RhYmxlID0gc25kX2VtdTEwazF4X2lkcywKKwkucHJvYmUgPSBzbmRfZW11MTBrMXhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9lbXUxMGsxeF9yZW1vdmUpLAorfTsKKworLy8gaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1vZHVsZQorc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2VtdTEwazF4X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcikpID4gMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvLyBjbGVhbiB1cCB0aGUgbW9kdWxlCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2VtdTEwazF4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9lbXUxMGsxeF9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2VtdTEwazF4X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZhMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpAQCAtMCwwICsxLDIzMjAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgUm91dGluZXMgZm9yIGVmZmVjdCBwcm9jZXNzb3IgRlg4MDEwCisgKgorICogIEJVR1M6CisgKiAgICAtLQorICoKKyAqICBUT0RPOgorICogICAgLS0KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKworI2lmIDAJCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2VzIC0gZGlnaXRhbCBvdXQgLT4gY2FwdHVyZSAqLworI2RlZmluZSBFTVUxMEsxX0NBUFRVUkVfRElHSVRBTF9PVVQKKyNlbmRpZgorI2lmIDAJCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2VzIC0gc2V0IFMvUERJRiB0byBBQzMgb3V0cHV0ICovCisjZGVmaW5lIEVNVTEwSzFfU0VUX0FDM19JRUM5NTgKKyNlbmRpZgorI2lmIDAJCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2VzIC0gZmVlZCB0aGUgZnJvbnQgc2lnbmFsIHRvIENlbnRlci9MRkUgb3V0cHV0cyAqLworI2RlZmluZSBFTVUxMEsxX0NFTlRFUl9MRkVfRlJPTV9GUk9OVAorI2VuZGlmCisKKy8qCisgKiAgVGFibGVzCisgKi8gCisKK3N0YXRpYyBjaGFyICpmeGJ1c2VzWzE2XSA9IHsKKwkvKiAweDAwICovICJQQ00gTGVmdCIsCisJLyogMHgwMSAqLyAiUENNIFJpZ2h0IiwKKwkvKiAweDAyICovICJQQ00gU3Vycm91bmQgTGVmdCIsCisJLyogMHgwMyAqLyAiUENNIFN1cnJvdW5kIFJpZ2h0IiwKKwkvKiAweDA0ICovICJNSURJIExlZnQiLAorCS8qIDB4MDUgKi8gIk1JREkgUmlnaHQiLAorCS8qIDB4MDYgKi8gIkNlbnRlciIsCisJLyogMHgwNyAqLyAiTEZFIiwKKwkvKiAweDA4ICovIE5VTEwsCisJLyogMHgwOSAqLyBOVUxMLAorCS8qIDB4MGEgKi8gTlVMTCwKKwkvKiAweDBiICovIE5VTEwsCisJLyogMHgwYyAqLyAiTUlESSBSZXZlcmIiLAorCS8qIDB4MGQgKi8gIk1JREkgQ2hvcnVzIiwKKwkvKiAweDBlICovIE5VTEwsCisJLyogMHgwZiAqLyBOVUxMCit9OworCitzdGF0aWMgY2hhciAqY3JlYXRpdmVfaW5zWzE2XSA9IHsKKwkvKiAweDAwICovICJBQzk3IExlZnQiLAorCS8qIDB4MDEgKi8gIkFDOTcgUmlnaHQiLAorCS8qIDB4MDIgKi8gIlRUTCBJRUM5NTggTGVmdCIsCisJLyogMHgwMyAqLyAiVFRMIElFQzk1OCBSaWdodCIsCisJLyogMHgwNCAqLyAiWm9vbSBWaWRlbyBMZWZ0IiwKKwkvKiAweDA1ICovICJab29tIFZpZGVvIFJpZ2h0IiwKKwkvKiAweDA2ICovICJPcHRpY2FsIElFQzk1OCBMZWZ0IiwKKwkvKiAweDA3ICovICJPcHRpY2FsIElFQzk1OCBSaWdodCIsCisJLyogMHgwOCAqLyAiTGluZS9NaWMgMSBMZWZ0IiwKKwkvKiAweDA5ICovICJMaW5lL01pYyAxIFJpZ2h0IiwKKwkvKiAweDBhICovICJDb2F4aWFsIElFQzk1OCBMZWZ0IiwKKwkvKiAweDBiICovICJDb2F4aWFsIElFQzk1OCBSaWdodCIsCisJLyogMHgwYyAqLyAiTGluZS9NaWMgMiBMZWZ0IiwKKwkvKiAweDBkICovICJMaW5lL01pYyAyIFJpZ2h0IiwKKwkvKiAweDBlICovIE5VTEwsCisJLyogMHgwZiAqLyBOVUxMCit9OworCitzdGF0aWMgY2hhciAqYXVkaWd5X2luc1sxNl0gPSB7CisJLyogMHgwMCAqLyAiQUM5NyBMZWZ0IiwKKwkvKiAweDAxICovICJBQzk3IFJpZ2h0IiwKKwkvKiAweDAyICovICJBdWRpZ3kgQ0QgTGVmdCIsCisJLyogMHgwMyAqLyAiQXVkaWd5IENEIFJpZ2h0IiwKKwkvKiAweDA0ICovICJPcHRpY2FsIElFQzk1OCBMZWZ0IiwKKwkvKiAweDA1ICovICJPcHRpY2FsIElFQzk1OCBSaWdodCIsCisJLyogMHgwNiAqLyBOVUxMLAorCS8qIDB4MDcgKi8gTlVMTCwKKwkvKiAweDA4ICovICJMaW5lL01pYyAyIExlZnQiLAorCS8qIDB4MDkgKi8gIkxpbmUvTWljIDIgUmlnaHQiLAorCS8qIDB4MGEgKi8gIlNQRElGIExlZnQiLAorCS8qIDB4MGIgKi8gIlNQRElGIFJpZ2h0IiwKKwkvKiAweDBjICovICJBdXgyIExlZnQiLAorCS8qIDB4MGQgKi8gIkF1eDIgUmlnaHQiLAorCS8qIDB4MGUgKi8gTlVMTCwKKwkvKiAweDBmICovIE5VTEwKK307CisKK3N0YXRpYyBjaGFyICpjcmVhdGl2ZV9vdXRzWzMyXSA9IHsKKwkvKiAweDAwICovICJBQzk3IExlZnQiLAorCS8qIDB4MDEgKi8gIkFDOTcgUmlnaHQiLAorCS8qIDB4MDIgKi8gIk9wdGljYWwgSUVDOTU4IExlZnQiLAorCS8qIDB4MDMgKi8gIk9wdGljYWwgSUVDOTU4IFJpZ2h0IiwKKwkvKiAweDA0ICovICJDZW50ZXIiLAorCS8qIDB4MDUgKi8gIkxGRSIsCisJLyogMHgwNiAqLyAiSGVhZHBob25lIExlZnQiLAorCS8qIDB4MDcgKi8gIkhlYWRwaG9uZSBSaWdodCIsCisJLyogMHgwOCAqLyAiU3Vycm91bmQgTGVmdCIsCisJLyogMHgwOSAqLyAiU3Vycm91bmQgUmlnaHQiLAorCS8qIDB4MGEgKi8gIlBDTSBDYXB0dXJlIExlZnQiLAorCS8qIDB4MGIgKi8gIlBDTSBDYXB0dXJlIFJpZ2h0IiwKKwkvKiAweDBjICovICJNSUMgQ2FwdHVyZSIsCisJLyogMHgwZCAqLyAiQUM5NyBTdXJyb3VuZCBMZWZ0IiwKKwkvKiAweDBlICovICJBQzk3IFN1cnJvdW5kIFJpZ2h0IiwKKwkvKiAweDBmICovIE5VTEwsCisJLyogMHgxMCAqLyBOVUxMLAorCS8qIDB4MTEgKi8gIkFuYWxvZyBDZW50ZXIiLAorCS8qIDB4MTIgKi8gIkFuYWxvZyBMRkUiLAorCS8qIDB4MTMgKi8gTlVMTCwKKwkvKiAweDE0ICovIE5VTEwsCisJLyogMHgxNSAqLyBOVUxMLAorCS8qIDB4MTYgKi8gTlVMTCwKKwkvKiAweDE3ICovIE5VTEwsCisJLyogMHgxOCAqLyBOVUxMLAorCS8qIDB4MTkgKi8gTlVMTCwKKwkvKiAweDFhICovIE5VTEwsCisJLyogMHgxYiAqLyBOVUxMLAorCS8qIDB4MWMgKi8gTlVMTCwKKwkvKiAweDFkICovIE5VTEwsCisJLyogMHgxZSAqLyBOVUxMLAorCS8qIDB4MWYgKi8gTlVMTCwKK307CisKK3N0YXRpYyBjaGFyICphdWRpZ3lfb3V0c1szMl0gPSB7CisJLyogMHgwMCAqLyAiRGlnaXRhbCBGcm9udCBMZWZ0IiwKKwkvKiAweDAxICovICJEaWdpdGFsIEZyb250IFJpZ2h0IiwKKwkvKiAweDAyICovICJEaWdpdGFsIENlbnRlciIsCisJLyogMHgwMyAqLyAiRGlnaXRhbCBMRUYiLAorCS8qIDB4MDQgKi8gIkhlYWRwaG9uZSBMZWZ0IiwKKwkvKiAweDA1ICovICJIZWFkcGhvbmUgUmlnaHQiLAorCS8qIDB4MDYgKi8gIkRpZ2l0YWwgUmVhciBMZWZ0IiwKKwkvKiAweDA3ICovICJEaWdpdGFsIFJlYXIgUmlnaHQiLAorCS8qIDB4MDggKi8gIkZyb250IExlZnQiLAorCS8qIDB4MDkgKi8gIkZyb250IFJpZ2h0IiwKKwkvKiAweDBhICovICJDZW50ZXIiLAorCS8qIDB4MGIgKi8gIkxGRSIsCisJLyogMHgwYyAqLyBOVUxMLAorCS8qIDB4MGQgKi8gTlVMTCwKKwkvKiAweDBlICovICJSZWFyIExlZnQiLAorCS8qIDB4MGYgKi8gIlJlYXIgUmlnaHQiLAorCS8qIDB4MTAgKi8gIkFDOTcgRnJvbnQgTGVmdCIsCisJLyogMHgxMSAqLyAiQUM5NyBGcm9udCBSaWdodCIsCisJLyogMHgxMiAqLyAiQURDIENhcHV0cmUgTGVmdCIsCisJLyogMHgxMyAqLyAiQURDIENhcHR1cmUgUmlnaHQiLAorCS8qIDB4MTQgKi8gTlVMTCwKKwkvKiAweDE1ICovIE5VTEwsCisJLyogMHgxNiAqLyBOVUxMLAorCS8qIDB4MTcgKi8gTlVMTCwKKwkvKiAweDE4ICovIE5VTEwsCisJLyogMHgxOSAqLyBOVUxMLAorCS8qIDB4MWEgKi8gTlVMTCwKKwkvKiAweDFiICovIE5VTEwsCisJLyogMHgxYyAqLyBOVUxMLAorCS8qIDB4MWQgKi8gTlVMTCwKKwkvKiAweDFlICovIE5VTEwsCisJLyogMHgxZiAqLyBOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiYXNzX3RhYmxlWzQxXVs1XSA9IHsKKwl7IDB4M2U0Zjg0NGYsIDB4ODRlZDRjYzMsIDB4M2NjNjk5MjcsIDB4N2IwMzU1M2EsIDB4YzRkYTg0ODYgfSwKKwl7IDB4M2U2OWExN2EsIDB4ODRjMjgwZmIsIDB4M2NkNzdjZDQsIDB4N2IyZjJhNmYsIDB4YzRiMDhkMWQgfSwKKwl7IDB4M2U4MmZmNDIsIDB4ODQ5OTkxZDUsIDB4M2NlNzQ2NmIsIDB4N2I1OTE3YzYsIDB4YzQ4ODYzZWUgfSwKKwl7IDB4M2U5YmFiM2MsIDB4ODQ3MjY3ZjAsIDB4M2NmNWZmZTgsIDB4N2I4MTM1NjAsIDB4YzQ2MWYyMmMgfSwKKwl7IDB4M2ViM2IyNzUsIDB4ODQ0Y2VkMjksIDB4M2QwM2IyOTUsIDB4N2JhNzlhMWMsIDB4YzQzZDIyM2IgfSwKKwl7IDB4M2VjYjIxNzQsIDB4ODQyOTBjOGIsIDB4M2QxMDY3MTQsIDB4N2JjYzViYTMsIDB4YzQxOWRmYTUgfSwKKwl7IDB4M2VlMjA0NGIsIDB4ODQwNmIyNDQsIDB4M2QxYzI1NjEsIDB4N2JlZjhlNzcsIDB4YzNmODE3MGYgfSwKKwl7IDB4M2VmODY2OTgsIDB4ODNlNWNiOTYsIDB4M2QyNmY0ZDgsIDB4N2MxMTQ2MDAsIDB4YzNkN2I2MjUgfSwKKwl7IDB4M2YwZTUzOTAsIDB4ODNjNjQ2YzksIDB4M2QzMGRjMzksIDB4N2MzMTk0OTgsIDB4YzNiOGFiOTcgfSwKKwl7IDB4M2YyM2Q2MGIsIDB4ODNhODEzMjEsIDB4M2QzOWUxYWYsIDB4N2M1MDhiOWMsIDB4YzM5YWU3MDQgfSwKKwl7IDB4M2YzOGY4ODQsIDB4ODM4YjIwZDIsIDB4M2Q0MjBhZDIsIDB4N2M2ZTNiNzUsIDB4YzM3ZTU4ZjEgfSwKKwl7IDB4M2Y0ZGM1MmMsIDB4ODM2ZjYwZWYsIDB4M2Q0OTVjYWIsIDB4N2M4YWIzYTYsIDB4YzM2MmYyYmUgfSwKKwl7IDB4M2Y2MjQ1ZTgsIDB4ODM1NGM1NjUsIDB4M2Q0ZmRiYjgsIDB4N2NhNjAyZDYsIDB4YzM0OGE2OWIgfSwKKwl7IDB4M2Y3Njg0NWYsIDB4ODMzYjQwZWMsIDB4M2Q1NThiZjAsIDB4N2NjMDM2ZGYsIDB4YzMyZjY3N2MgfSwKKwl7IDB4M2Y4YThhMDMsIDB4ODMyMmM2ZmIsIDB4M2Q1YTcwYzQsIDB4N2NkOTVjZDcsIDB4YzMxNzI5MGIgfSwKKwl7IDB4M2Y5ZTYwMTQsIDB4ODMwYjRiYzMsIDB4M2Q1ZThkMjUsIDB4N2NmMTgxMWEsIDB4YzJmZmRmYTUgfSwKKwl7IDB4M2ZiMjBmYWUsIDB4ODJmNGM0MjAsIDB4M2Q2MWUzN2YsIDB4N2QwOGFmNTYsIDB4YzJlOTgwNGEgfSwKKwl7IDB4M2ZjNWExY2MsIDB4ODJkZjI1OTIsIDB4M2Q2NDc1YzMsIDB4N2QxZWYyOTQsIDB4YzJkNDAwOTYgfSwKKwl7IDB4M2ZkOTFmNTUsIDB4ODJjYTY2MzIsIDB4M2Q2NjQ1NjQsIDB4N2QzNDU1NDEsIDB4YzJiZjU2YjkgfSwKKwl7IDB4M2ZlYzkxMjAsIDB4ODJiNjdjYWMsIDB4M2Q2NzUzNTYsIDB4N2Q0OGUxMzgsIDB4YzJhYjc5NmUgfSwKKwl7IDB4NDAwMDAwMDAsIDB4ODJhMzYwMzcsIDB4M2Q2N2EwMTIsIDB4N2Q1YzlmYzksIDB4YzI5ODVmZWUgfSwKKwl7IDB4NDAxMzc0YzcsIDB4ODI5MTA4OGEsIDB4M2Q2NzJiOTMsIDB4N2Q2Zjk5YzMsIDB4YzI4NjAxZjIgfSwKKwl7IDB4NDAyNmY4NTcsIDB4ODI3ZjZkZDcsIDB4M2Q2NWY1NTksIDB4N2Q4MWQ3N2MsIDB4YzI3NDU3YTMgfSwKKwl7IDB4NDAzYTkzOWYsIDB4ODI2ZTg4YzUsIDB4M2Q2M2ZjNjMsIDB4N2Q5MzYwZDQsIDB4YzI2MzU5OTYgfSwKKwl7IDB4NDA0ZTRmYWYsIDB4ODI1ZTUyNjYsIDB4M2Q2MTNmMzIsIDB4N2RhNDNkNDIsIDB4YzI1MzAwYzYgfSwKKwl7IDB4NDA2MjM1YmEsIDB4ODI0ZWM0MzQsIDB4M2Q1ZGJiYzMsIDB4N2RiNDczZDcsIDB4YzI0MzQ2OGUgfSwKKwl7IDB4NDA3NjRmMWYsIDB4ODIzZmQ4MGMsIDB4M2Q1OTZmOGYsIDB4N2RjNDBiNDQsIDB4YzIzNDI0YTIgfSwKKwl7IDB4NDA4YWE1NzYsIDB4ODIzMTg4MjQsIDB4M2Q1NDU3ODcsIDB4N2RkMzA5ZTIsIDB4YzIyNTk1MDkgfSwKKwl7IDB4NDA5ZjQyOTYsIDB4ODIyM2NmMGIsIDB4M2Q0ZTcwMTIsIDB4N2RlMTc1YjUsIDB4YzIxNzkyMTggfSwKKwl7IDB4NDBiNDMwYTAsIDB4ODIxNmE3YTEsIDB4M2Q0N2I1MDUsIDB4N2RlZjU0NzUsIDB4YzIwYTE2NzAgfSwKKwl7IDB4NDBjOTdhMGEsIDB4ODIwYTBkMTIsIDB4M2Q0MDIxYTEsIDB4N2RmY2FiOGQsIDB4YzFmZDFjZjUgfSwKKwl7IDB4NDBkZjI5YTYsIDB4ODFmZGZhZDYsIDB4M2QzN2IwOGQsIDB4N2UwOTgwMjgsIDB4YzFmMGEwY2EgfSwKKwl7IDB4NDBmNTRhYjEsIDB4ODFmMjZjYTksIDB4M2QyZTViZDEsIDB4N2UxNWQ3MmIsIDB4YzFlNDlkNTIgfSwKKwl7IDB4NDEwYmU4ZGEsIDB4ODFlNzVlODksIDB4M2QyNDFjY2UsIDB4N2UyMWI1NDQsIDB4YzFkOTBlMjQgfSwKKwl7IDB4NDEyMzEwNTEsIDB4ODFkY2NjYjMsIDB4M2QxOGVjMzcsIDB4N2UyZDFlZTYsIDB4YzFjZGVmMTAgfSwKKwl7IDB4NDEzYWNkZDAsIDB4ODFkMmIzOWUsIDB4M2QwY2MyMGEsIDB4N2UzODE4NGUsIDB4YzFjMzNjMTMgfSwKKwl7IDB4NDE1MzJlYTcsIDB4ODFjOTBmZmIsIDB4M2NmZjk1ODUsIDB4N2U0MmE1OGIsIDB4YzFiOGYxNWEgfSwKKwl7IDB4NDE2YzQwY2QsIDB4ODFiZmRlYjIsIDB4M2NmMTVkMjEsIDB4N2U0Y2NhN2MsIDB4YzFhZjBiM2YgfSwKKwl7IDB4NDE4NjEyZWEsIDB4ODFiNzFjZGMsIDB4M2NlMjBlODUsIDB4N2U1NjhhZDMsIDB4YzFhNTg2NDAgfSwKKwl7IDB4NDFhMGI0NjUsIDB4ODFhZWM3YzUsIDB4M2NkMTllN2MsIDB4N2U1ZmVhMWUsIDB4YzE5YzVmMDMgfSwKKwl7IDB4NDFiYzM1NzMsIDB4ODFhNmRjZWEsIDB4M2NjMDAwZTksIDB4N2U2OGViYzIsIDB4YzE5MzkyNTAgfQorfTsKKworc3RhdGljIGNvbnN0IHUzMiB0cmVibGVfdGFibGVbNDFdWzVdID0geworCXsgMHgwMTI1Y2JhOSwgMHhmZWQ1ZGViZCwgMHgwMDU5OWI2YywgMHgwZDI1MDZkYSwgMHhmYTg1YjM1NCB9LAorCXsgMHgwMTQyZjY3ZSwgMHhmZWIwMzE2MywgMHgwMDY2Y2QwZiwgMHgwZDE0YzY5ZCwgMHhmYTkxNDQ3MyB9LAorCXsgMHgwMTYzMjhiZCwgMHhmZTg2MDE1OCwgMHgwMDc1YjdmMiwgMHgwZDAzZWIyNywgMHhmYTlkMzJkMiB9LAorCXsgMHgwMTg2YjQzOCwgMHhmZTU2Yzk4MiwgMHgwMDg2OTIzNCwgMHgwY2YyNzA0OCwgMHhmYWE5N2ZjYSB9LAorCXsgMHgwMWFkZjM1OCwgMHhmZTIxZjVmZSwgMHgwMDk5OTg0MiwgMHgwY2UwNTFjMiwgMHhmYWI2MmNhNSB9LAorCXsgMHgwMWQ5NDlmYSwgMHhmZGU2ZTI4NywgMHgwMGFmMGQ4ZCwgMHgwY2NkOGI0YSwgMHhmYWMzM2FhNyB9LAorCXsgMHgwMjA5MjY2OSwgMHhmZGE0ZDhiZiwgMHgwMGM3M2Q0YywgMHgwY2JhMTg4NCwgMHhmYWQwYWIwNyB9LAorCXsgMHgwMjNlMDI2OCwgMHhmZDViMGU0YSwgMHgwMGUyN2I1NCwgMHgwY2E1ZjUwOSwgMHhmYWRlN2VmMiB9LAorCXsgMHgwMjc4NjQ1YywgMHhmZDA4YTJiMCwgMHgwMTAxMjUwOSwgMHgwYzkxMWM2MywgMHhmYWVjYjc4OCB9LAorCXsgMHgwMmI4ZTA5MSwgMHhmY2FjOWQxYSwgMHgwMTIzYTI2MiwgMHgwYzdiOGExNCwgMHhmYWZiNTVkZiB9LAorCXsgMHgwMzAwMWE5YSwgMHhmYzQ1ZTljZSwgMHgwMTRhNjcwOSwgMHgwYzY1Mzk4ZiwgMHhmYjBhNWFmZiB9LAorCXsgMHgwMzRlYzZkNywgMHhmYmQzNTc2YiwgMHgwMTc1ZjM5NywgMHgwYzRlMjY0MywgMHhmYjE5YzdlNCB9LAorCXsgMHgwM2E1YWMxNSwgMHhmYjUzOTNlZSwgMHgwMWE2ZDZlZCwgMHgwYzM2NGI5NCwgMHhmYjI5OWQ3YyB9LAorCXsgMHgwNDA1YTU2MiwgMHhmYWM1Mjk2OCwgMHgwMWRkYWZhZSwgMHgwYzFkYTRlMiwgMHhmYjM5ZGNhNSB9LAorCXsgMHgwNDZmYTNmZSwgMHhmYTI2N2E2NiwgMHgwMjFiMmRkZCwgMHgwYzA0MmQ4ZCwgMHhmYjRhODYzMSB9LAorCXsgMHgwNGU0YjE3ZiwgMHhmOTc1YmUwZiwgMHgwMjYwMTQ5ZiwgMHgwYmU5ZTBmMiwgMHhmYjViOWFlMCB9LAorCXsgMHgwNTY1ZjIyMCwgMHhmOGIwZmJlNSwgMHgwMmFkM2MyOSwgMHgwYmNlYmE3MywgMHhmYjZkMWI2MCB9LAorCXsgMHgwNWY0YTc0NSwgMHhmN2Q2MDcyMiwgMHgwMzAzOTNkNCwgMHgwYmIyYjU3OCwgMHhmYjdmMDg0ZCB9LAorCXsgMHgwNjkyMzIzNiwgMHhmNmUyNzliZCwgMHgwMzY0MjQ2NSwgMHgwYjk1Y2Q3NSwgMHhmYjkxNjIzMyB9LAorCXsgMHgwNzQwMTcxMywgMHhmNWQzYWVmOSwgMHgwM2QwMTI4MywgMHgwYjc3ZmRlZCwgMHhmYmE0Mjk4NCB9LAorCXsgMHgwODAwMDAwMCwgMHhmNGE2YmQ4OCwgMHgwNDQ4YTE2MSwgMHgwYjU5NDI3OCwgMHhmYmI3NWU5ZiB9LAorCXsgMHgwOGQzYzA5NywgMHhmMzU4NzEzMSwgMHgwNGNmMzVhNCwgMHgwYjM5OTZjOSwgMHhmYmNiMDFjYiB9LAorCXsgMHgwOWJkNTlhMiwgMHhmMWU1NDNmOSwgMHgwNTY1NTg4MCwgMHgwYjE4ZjZiMiwgMHhmYmRmMTMzMyB9LAorCXsgMHgwYWJlZmQwZiwgMHhmMDQ5NTZjYSwgMHgwNjBjYmIxMiwgMHgwYWY3NWUyYywgMHhmYmYzOTJlOCB9LAorCXsgMHgwYmRiMTIzZSwgMHhlZTgwNjk4NCwgMHgwNmM3MzlmZSwgMHgwYWQ0Yzk2MiwgMHhmYzA4ODBkZCB9LAorCXsgMHgwZDE0M2E5NCwgMHhlYzg1ZDI4NywgMHgwNzk2ZTE1MCwgMHgwYWIxMzRiMCwgMHhmYzFkZGNlNSB9LAorCXsgMHgwZTZkNTY2NCwgMHhlYTU0NzU5OCwgMHgwODdkZjBhMCwgMHgwYThjOWNiNiwgMHhmYzMzYTZhZCB9LAorCXsgMHgwZmU5OGEyYSwgMHhlN2U2YmEzNSwgMHgwOTdlZGY4MywgMHgwYTY2ZmU1YiwgMHhmYzQ5ZGRjMiB9LAorCXsgMHgxMThjNDQyMSwgMHhlNTM2ODEzYSwgMHgwYTljNjI0OCwgMHgwYTQwNTZkNywgMHhmYzYwODE4NSB9LAorCXsgMHgxMzU5NDIyZSwgMHhlMjNkMTllYiwgMHgwYmQ5NmVmYiwgMHgwYTE4YTNiZiwgMHhmYzc3OTEyYyB9LAorCXsgMHgxNTU0OTgyYiwgMHhkZWYzMzY0NSwgMHgwZDM5NDJiZCwgMHgwOWVmZTMxMiwgMHhmYzhmMGJjMSB9LAorCXsgMHgxNzgyYjY4YSwgMHhkYjUwZGViMSwgMHgwZWJmNjc2ZCwgMHgwOWM2MTMzZiwgMHhmY2E2ZjAxOSB9LAorCXsgMHgxOWU4NzE1ZCwgMHhkNzRkNjRmZCwgMHgxMDZmYjk5OSwgMHgwOTliMzMzNywgMHhmY2JmM2NkNiB9LAorCXsgMHgxYzhiMDdiOCwgMHhkMmRmNTZhYiwgMHgxMjRlNmVjOCwgMHgwOTZmNDI3NCwgMHhmY2Q3ZjA2MCB9LAorCXsgMHgxZjcwMmI2ZCwgMHhjZGZjNmU5MiwgMHgxNDYwMWMxMCwgMHgwOTQyNDEwYiwgMHhmY2YxMDhlNSB9LAorCXsgMHgyMjllMDkzMywgMHhjODk5ODVjZCwgMHgxNmE5YmNmYSwgMHgwOTE0MmZiNSwgMHhmZDBhODQ1MSB9LAorCXsgMHgyNjFiNTExOCwgMHhjMmFhODQwOSwgMHgxOTMwYmFiNiwgMHgwOGU1MGZkYywgMHhmZDI0NjA0ZCB9LAorCXsgMHgyOWVmM2Y1ZCwgMHhiYzIyNGYyOCwgMHgxYmZhZjM5NiwgMHgwOGI0ZTNhYSwgMHhmZDNlOWEzYiB9LAorCXsgMHgyZTIxYTU5YiwgMHhiNGYyYmE0NiwgMHgxZjBlYzJkNiwgMHgwODgzYWUxNSwgMHhmZDU5MmYzMyB9LAorCXsgMHgzMmJhZjQ0YiwgMHhhZDBjNzQyOSwgMHgyMjczMDhhMywgMHgwODUxNzJlYiwgMHhmZDc0MWJmZCB9LAorCXsgMHgzN2M0NDQ4YiwgMHhhNDVlZjUxZCwgMHgyNjJmMzI2NywgMHgwODFlMzZkYywgMHhmZDhmNWQxNCB9Cit9OworCitzdGF0aWMgY29uc3QgdTMyIGRiX3RhYmxlWzEwMV0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMTU3MWY4MiwgMHgwMTY3NGI0MSwgMHgwMTc4M2ExYiwgMHgwMTg5ZjU0MCwKKwkweDAxOWM4NjUxLCAweDAxYWZmNzYzLCAweDAxYzQ1MzA2LCAweDAxZDlhNDQ2LCAweDAxZWZmNmI4LAorCTB4MDIwNzU2N2EsIDB4MDIxZmQwM2QsIDB4MDIzOTcxNGMsIDB4MDI1NDQ3OTIsIDB4MDI3MDYxYTEsCisJMHgwMjhkY2ViYiwgMHgwMmFjOWVkYywgMHgwMmNjZTJiZiwgMHgwMmVlYWJlOCwgMHgwMzEyMGNiMCwKKwkweDAzMzcxODRlLCAweDAzNWRlMmRmLCAweDAzODY4MTczLCAweDAzYjEwYTE4LCAweDAzZGQ5M2U5LAorCTB4MDQwYzM3MTMsIDB4MDQzZDBjZWEsIDB4MDQ3MDJmZjMsIDB4MDRhNWJiZjIsIDB4MDRkZGNkZmIsCisJMHgwNTE4ODQ3ZiwgMHgwNTU1ZmY2MiwgMHgwNTk2NjAwNSwgMHgwNWQ5Yzk1ZCwgMHgwNjIwNjAwNSwKKwkweDA2NmE0YTUyLCAweDA2YjdiMDY3LCAweDA3MDhiYzRjLCAweDA3NWQ5YTAxLCAweDA3YjY3NzlkLAorCTB4MDgxMzg1NjEsIDB4MDg3NGY1ZDUsIDB4MDhkYWZkZTEsIDB4MDk0NWQ0ZWQsIDB4MDliNWI0ZmQsCisJMHgwYTJhZGFkMSwgMHgwYWE1ODYwNSwgMHgwYjI1ZjkzNiwgMHgwYmFjN2EyNCwgMHgwYzM5NTFkOCwKKwkweDBjY2NjY2NjLCAweDBkNjczYjE3LCAweDBlMDhmMDkzLCAweDBlYjI0NTEwLCAweDBmNjM5NDgxLAorCTB4MTAxZDNmMmQsIDB4MTBkZmE5ZTYsIDB4MTFhYjNlM2YsIDB4MTI4MDZhYzMsIDB4MTM1ZmEzMzMsCisJMHgxNDQ5NjBjNSwgMHgxNTNlMjI2NiwgMHgxNjNlNmNmZSwgMHgxNzRhY2JiNywgMHgxODYzZDA0ZCwKKwkweDE5OGExMzU3LCAweDFhYmUzNDlmLCAweDFjMDBkYjc3LCAweDFkNTJiNzEyLCAweDFlYjQ3ZWU2LAorCTB4MjAyNmYzMGYsIDB4MjFhYWRjYjYsIDB4MjM0MTBlN2UsIDB4MjRlYTY0ZjksIDB4MjZhN2M3MWQsCisJMHgyODdhMjZjNCwgMHgyYTYyODEyYywgMHgyYzYxZGY4NCwgMHgyZTc5NTc3OSwgMHgzMGFhMGJjZiwKKwkweDMyZjUyY2ZlLCAweDM1NWJmOWQ4LCAweDM3ZGZjMDMzLCAweDNhODFkZGE0LCAweDNkNDNjMDM4LAorCTB4NDAyNmU3M2MsIDB4NDMyY2U0MGYsIDB4NDY1NzVhZjgsIDB4NDlhODA0MGYsIDB4NGQyMGFjMmEsCisJMHg1MGMzMzVkMywgMHg1NDkxOWE1NywgMHg1ODhkZWFkMSwgMHg1Y2JhNTE0YSwgMHg2MTE5MTFlYSwKKwkweDY1YWM4YzJmLCAweDZhNzczYzM5LCAweDZmN2JiYzIzLCAweDc0YmNjNTZjLCAweDdhM2QzMjcyLAorCTB4N2ZmZmZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdTMyIG9ub2ZmX3RhYmxlWzJdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDEKK307CisKKy8qCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgbW1fc2VnbWVudF90IHNuZF9lbnRlcl91c2VyKHZvaWQpCit7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlyZXR1cm4gZnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbGVhdmVfdXNlcihtbV9zZWdtZW50X3QgZnMpCit7CisJc2V0X2ZzKGZzKTsKK30KKworLyoKKyAqICAgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2dwcl9jdGxfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKmN0bCA9IChzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmIChjdGwtPm1pbiA9PSAwICYmIGN0bC0+bWF4ID09IDEpCisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCWVsc2UKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gY3RsLT52Y291bnQ7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gY3RsLT5taW47CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gY3RsLT5tYXg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZ3ByX2N0bF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKmN0bCA9IChzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGN0bC0+dmNvdW50OyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gY3RsLT52YWx1ZVtpXTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZ3ByX2N0bF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKmN0bCA9IChzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBudmFsLCB2YWw7CisJdW5zaWduZWQgaW50IGksIGo7CisJaW50IGNoYW5nZSA9IDA7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3RsLT52Y291bnQ7IGkrKykgeworCQludmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCWlmIChudmFsIDwgY3RsLT5taW4pCisJCQludmFsID0gY3RsLT5taW47CisJCWlmIChudmFsID4gY3RsLT5tYXgpCisJCQludmFsID0gY3RsLT5tYXg7CisJCWlmIChudmFsICE9IGN0bC0+dmFsdWVbaV0pCisJCQljaGFuZ2UgPSAxOworCQl2YWwgPSBjdGwtPnZhbHVlW2ldID0gbnZhbDsKKwkJc3dpdGNoIChjdGwtPnRyYW5zbGF0aW9uKSB7CisJCWNhc2UgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fTk9ORToKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBjdGwtPmdwcltpXSwgMCwgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwOgorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgZW11LT5ncHJfYmFzZSArIGN0bC0+Z3ByW2ldLCAwLCBkYl90YWJsZVt2YWxdKTsKKwkJCWJyZWFrOworCQljYXNlIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX0JBU1M6CisJCQlzbmRfcnVudGltZV9jaGVjaygoY3RsLT5jb3VudCAlIDUpID09IDAgJiYgKGN0bC0+Y291bnQgLyA1KSA9PSBjdGwtPnZjb3VudCwgY2hhbmdlID0gLUVJTzsgZ290byBfX2Vycm9yKTsKKwkJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspCisJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgZW11LT5ncHJfYmFzZSArIGN0bC0+Z3ByW2ogKiBjdGwtPnZjb3VudCArIGldLCAwLCBiYXNzX3RhYmxlW3ZhbF1bal0pOworCQkJYnJlYWs7CisJCWNhc2UgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fVFJFQkxFOgorCQkJc25kX3J1bnRpbWVfY2hlY2soKGN0bC0+Y291bnQgJSA1KSA9PSAwICYmIChjdGwtPmNvdW50IC8gNSkgPT0gY3RsLT52Y291bnQsIGNoYW5nZSA9IC1FSU87IGdvdG8gX19lcnJvcik7CisJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKQorCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBjdGwtPmdwcltqICogY3RsLT52Y291bnQgKyBpXSwgMCwgdHJlYmxlX3RhYmxlW3ZhbF1bal0pOworCQkJYnJlYWs7CisJCWNhc2UgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fT05PRkY6CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgY3RsLT5ncHJbaV0sIDAsIG9ub2ZmX3RhYmxlW3ZhbF0pOworCQkJYnJlYWs7CisJCX0KKwl9CisgICAgICBfX2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogICBJbnRlcnJ1cHQgaGFuZGxlcgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX2Z4ODAxMF9pbnRlcnJ1cHQoZW11MTBrMV90ICplbXUpCit7CisJc25kX2VtdTEwazFfZng4MDEwX2lycV90ICppcnEsICpuaXJxOworCisJaXJxID0gZW11LT5meDgwMTAuaXJxX2hhbmRsZXJzOworCXdoaWxlIChpcnEpIHsKKwkJbmlycSA9IGlycS0+bmV4dDsJLyogaXJxIHB0ciBjYW4gYmUgcmVtb3ZlZCBmcm9tIGxpc3QgKi8KKwkJaWYgKHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgZW11LT5ncHJfYmFzZSArIGlycS0+Z3ByX3J1bm5pbmcsIDApICYgMHhmZmZmMDAwMCkgeworCQkJaWYgKGlycS0+aGFuZGxlcikKKwkJCQlpcnEtPmhhbmRsZXIoZW11LCBpcnEtPnByaXZhdGVfZGF0YSk7CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgaXJxLT5ncHJfcnVubmluZywgMCwgMSk7CisJCX0KKwkJaXJxID0gbmlycTsKKwl9Cit9CisKK2ludCBzbmRfZW11MTBrMV9meDgwMTBfcmVnaXN0ZXJfaXJxX2hhbmRsZXIoZW11MTBrMV90ICplbXUsCisJCQkJCQkgICBzbmRfZng4MDEwX2lycV9oYW5kbGVyX3QgKmhhbmRsZXIsCisJCQkJCQkgICB1bnNpZ25lZCBjaGFyIGdwcl9ydW5uaW5nLAorCQkJCQkJICAgdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJCQkJICAgc25kX2VtdTEwazFfZng4MDEwX2lycV90ICoqcl9pcnEpCit7CisJc25kX2VtdTEwazFfZng4MDEwX2lycV90ICppcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzbmRfcnVudGltZV9jaGVjayhlbXUsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfcnVudGltZV9jaGVjayhoYW5kbGVyLCByZXR1cm4gLUVJTlZBTCk7CisJaXJxID0ga21hbGxvYyhzaXplb2YoKmlycSksIEdGUF9BVE9NSUMpOworCWlmIChpcnEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaXJxLT5oYW5kbGVyID0gaGFuZGxlcjsKKwlpcnEtPmdwcl9ydW5uaW5nID0gZ3ByX3J1bm5pbmc7CisJaXJxLT5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CisJaXJxLT5uZXh0ID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5meDgwMTAuaXJxX2xvY2ssIGZsYWdzKTsKKwlpZiAoZW11LT5meDgwMTAuaXJxX2hhbmRsZXJzID09IE5VTEwpIHsKKwkJZW11LT5meDgwMTAuaXJxX2hhbmRsZXJzID0gaXJxOworCQllbXUtPmRzcF9pbnRlcnJ1cHQgPSBzbmRfZW11MTBrMV9meDgwMTBfaW50ZXJydXB0OworCQlzbmRfZW11MTBrMV9pbnRyX2VuYWJsZShlbXUsIElOVEVfRlhEU1BFTkFCTEUpOworCX0gZWxzZSB7CisJCWlycS0+bmV4dCA9IGVtdS0+Zng4MDEwLmlycV9oYW5kbGVyczsKKwkJZW11LT5meDgwMTAuaXJxX2hhbmRsZXJzID0gaXJxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmZ4ODAxMC5pcnFfbG9jaywgZmxhZ3MpOworCWlmIChyX2lycSkKKwkJKnJfaXJxID0gaXJxOworCXJldHVybiAwOworfQorCitpbnQgc25kX2VtdTEwazFfZng4MDEwX3VucmVnaXN0ZXJfaXJxX2hhbmRsZXIoZW11MTBrMV90ICplbXUsCisJCQkJCSAgICAgIHNuZF9lbXUxMGsxX2Z4ODAxMF9pcnFfdCAqaXJxKQoreworCXNuZF9lbXUxMGsxX2Z4ODAxMF9pcnFfdCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc25kX3J1bnRpbWVfY2hlY2soaXJxLCByZXR1cm4gLUVJTlZBTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+Zng4MDEwLmlycV9sb2NrLCBmbGFncyk7CisJaWYgKCh0bXAgPSBlbXUtPmZ4ODAxMC5pcnFfaGFuZGxlcnMpID09IGlycSkgeworCQllbXUtPmZ4ODAxMC5pcnFfaGFuZGxlcnMgPSB0bXAtPm5leHQ7CisJCWlmIChlbXUtPmZ4ODAxMC5pcnFfaGFuZGxlcnMgPT0gTlVMTCkgeworCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9GWERTUEVOQUJMRSk7CisJCQllbXUtPmRzcF9pbnRlcnJ1cHQgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHRtcCAmJiB0bXAtPm5leHQgIT0gaXJxKQorCQkJdG1wID0gdG1wLT5uZXh0OworCQlpZiAodG1wKQorCQkJdG1wLT5uZXh0ID0gdG1wLT5uZXh0LT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmZ4ODAxMC5pcnFfbG9jaywgZmxhZ3MpOworCWtmcmVlKGlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFTVUxMEsxIGVmZmVjdCBtYW5hZ2VyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfd3JpdGVfb3AoZW11MTBrMV9meDgwMTBfY29kZV90ICppY29kZSwgdW5zaWduZWQgaW50ICpwdHIsCisJCQkJIHUzMiBvcCwgdTMyIHIsIHUzMiBhLCB1MzIgeCwgdTMyIHkpCit7CisJdV9pbnQzMl90ICpjb2RlOworCXNuZF9hc3NlcnQoKnB0ciA8IDUxMiwgcmV0dXJuKTsKKwljb2RlID0gKHVfaW50MzJfdCAqKWljb2RlLT5jb2RlICsgKCpwdHIpICogMjsKKwlzZXRfYml0KCpwdHIsIGljb2RlLT5jb2RlX3ZhbGlkKTsKKwljb2RlWzBdID0gKCh4ICYgMHgzZmYpIDw8IDEwKSB8ICh5ICYgMHgzZmYpOworCWNvZGVbMV0gPSAoKG9wICYgMHgwZikgPDwgMjApIHwgKChyICYgMHgzZmYpIDw8IDEwKSB8IChhICYgMHgzZmYpOworCSgqcHRyKSsrOworfQorCisjZGVmaW5lIE9QKGljb2RlLCBwdHIsIG9wLCByLCBhLCB4LCB5KSBcCisJc25kX2VtdTEwazFfd3JpdGVfb3AoaWNvZGUsIHB0ciwgb3AsIHIsIGEsIHgsIHkpCisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX2F1ZGlneV93cml0ZV9vcChlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlLCB1bnNpZ25lZCBpbnQgKnB0ciwKKwkJCQkJdTMyIG9wLCB1MzIgciwgdTMyIGEsIHUzMiB4LCB1MzIgeSkKK3sKKwl1X2ludDMyX3QgKmNvZGU7CisJc25kX2Fzc2VydCgqcHRyIDwgMTAyNCwgcmV0dXJuKTsKKwljb2RlID0gKHVfaW50MzJfdCAqKWljb2RlLT5jb2RlICsgKCpwdHIpICogMjsKKwlzZXRfYml0KCpwdHIsIGljb2RlLT5jb2RlX3ZhbGlkKTsKKwljb2RlWzBdID0gKCh4ICYgMHg3ZmYpIDw8IDEyKSB8ICh5ICYgMHg3ZmYpOworCWNvZGVbMV0gPSAoKG9wICYgMHgwZikgPDwgMjQpIHwgKChyICYgMHg3ZmYpIDw8IDEyKSB8IChhICYgMHg3ZmYpOworCSgqcHRyKSsrOworfQorCisjZGVmaW5lIEFfT1AoaWNvZGUsIHB0ciwgb3AsIHIsIGEsIHgsIHkpIFwKKwlzbmRfZW11MTBrMV9hdWRpZ3lfd3JpdGVfb3AoaWNvZGUsIHB0ciwgb3AsIHIsIGEsIHgsIHkpCisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX2VmeF93cml0ZShlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IHBjLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlwYyArPSBlbXUtPmF1ZGlneSA/IEFfTUlDUk9DT0RFQkFTRSA6IE1JQ1JPQ09ERUJBU0U7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgcGMsIDAsIGRhdGEpOworfQorCit1bnNpZ25lZCBpbnQgc25kX2VtdTEwazFfZWZ4X3JlYWQoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCBwYykKK3sKKwlwYyArPSBlbXUtPmF1ZGlneSA/IEFfTUlDUk9DT0RFQkFTRSA6IE1JQ1JPQ09ERUJBU0U7CisJcmV0dXJuIHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgcGMsIDApOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2dwcl9wb2tlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCWludCBncHI7CisJdTMyIHZhbDsKKworCWZvciAoZ3ByID0gMDsgZ3ByIDwgKGVtdS0+YXVkaWd5ID8gMHgyMDAgOiAweDEwMCk7IGdwcisrKSB7CisJCWlmICghdGVzdF9iaXQoZ3ByLCBpY29kZS0+Z3ByX3ZhbGlkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZ2V0X3VzZXIodmFsLCAmaWNvZGUtPmdwcl9tYXBbZ3ByXSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgZW11LT5ncHJfYmFzZSArIGdwciwgMCwgdmFsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZ3ByX3BlZWsoZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGUpCit7CisJaW50IGdwcjsKKwl1MzIgdmFsOworCisJZm9yIChncHIgPSAwOyBncHIgPCAoZW11LT5hdWRpZ3kgPyAweDIwMCA6IDB4MTAwKTsgZ3ByKyspIHsKKwkJc2V0X2JpdChncHIsIGljb2RlLT5ncHJfdmFsaWQpOworCQl2YWwgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBncHIsIDApOworCQlpZiAocHV0X3VzZXIodmFsLCAmaWNvZGUtPmdwcl9tYXBbZ3ByXSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfdHJhbV9wb2tlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCWludCB0cmFtOworCXUzMiBhZGRyLCB2YWw7CisKKwlmb3IgKHRyYW0gPSAwOyB0cmFtIDwgKGVtdS0+YXVkaWd5ID8gMHgxMDAgOiAweGEwKTsgdHJhbSsrKSB7CisJCWlmICghdGVzdF9iaXQodHJhbSwgaWNvZGUtPnRyYW1fdmFsaWQpKQorCQkJY29udGludWU7CisJCWlmIChnZXRfdXNlcih2YWwsICZpY29kZS0+dHJhbV9kYXRhX21hcFt0cmFtXSkgfHwKKwkJICAgIGdldF91c2VyKGFkZHIsICZpY29kZS0+dHJhbV9hZGRyX21hcFt0cmFtXSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVEFOS01FTURBVEFSRUdCQVNFICsgdHJhbSwgMCwgdmFsKTsKKwkJaWYgKCFlbXUtPmF1ZGlneSkgeworCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVEFOS01FTUFERFJSRUdCQVNFICsgdHJhbSwgMCwgYWRkcik7CisJCX0gZWxzZSB7CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQU5LTUVNQUREUlJFR0JBU0UgKyB0cmFtLCAwLCBhZGRyIDw8IDEyKTsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfVEFOS01FTUNUTFJFR0JBU0UgKyB0cmFtLCAwLCBhZGRyID4+IDIwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV90cmFtX3BlZWsoZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGUpCit7CisJaW50IHRyYW07CisJdTMyIHZhbCwgYWRkcjsKKworCW1lbXNldChpY29kZS0+dHJhbV92YWxpZCwgMCwgc2l6ZW9mKGljb2RlLT50cmFtX3ZhbGlkKSk7CisJZm9yICh0cmFtID0gMDsgdHJhbSA8IChlbXUtPmF1ZGlneSA/IDB4MTAwIDogMHhhMCk7IHRyYW0rKykgeworCQlzZXRfYml0KHRyYW0sIGljb2RlLT50cmFtX3ZhbGlkKTsKKwkJdmFsID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBUQU5LTUVNREFUQVJFR0JBU0UgKyB0cmFtLCAwKTsKKwkJaWYgKCFlbXUtPmF1ZGlneSkgeworCQkJYWRkciA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgVEFOS01FTUFERFJSRUdCQVNFICsgdHJhbSwgMCk7CisJCX0gZWxzZSB7CisJCQlhZGRyID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBUQU5LTUVNQUREUlJFR0JBU0UgKyB0cmFtLCAwKSA+PiAxMjsKKwkJCWFkZHIgfD0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBBX1RBTktNRU1DVExSRUdCQVNFICsgdHJhbSwgMCkgPDwgMjA7CisJCX0KKwkJaWYgKHB1dF91c2VyKHZhbCwgJmljb2RlLT50cmFtX2RhdGFfbWFwW3RyYW1dKSB8fAorCQkgICAgcHV0X3VzZXIoYWRkciwgJmljb2RlLT50cmFtX2FkZHJfbWFwW3RyYW1dKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9jb2RlX3Bva2UoZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGUpCit7CisJdTMyIHBjLCBsbywgaGk7CisKKwlmb3IgKHBjID0gMDsgcGMgPCAoZW11LT5hdWRpZ3kgPyAyKjEwMjQgOiAyKjUxMik7IHBjICs9IDIpIHsKKwkJaWYgKCF0ZXN0X2JpdChwYyAvIDIsIGljb2RlLT5jb2RlX3ZhbGlkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZ2V0X3VzZXIobG8sICZpY29kZS0+Y29kZVtwYyArIDBdKSB8fAorCQkgICAgZ2V0X3VzZXIoaGksICZpY29kZS0+Y29kZVtwYyArIDFdKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzbmRfZW11MTBrMV9lZnhfd3JpdGUoZW11LCBwYyArIDAsIGxvKTsKKwkJc25kX2VtdTEwazFfZWZ4X3dyaXRlKGVtdSwgcGMgKyAxLCBoaSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NvZGVfcGVlayhlbXUxMGsxX3QgKmVtdSwgZW11MTBrMV9meDgwMTBfY29kZV90ICppY29kZSkKK3sKKwl1MzIgcGM7CisKKwltZW1zZXQoaWNvZGUtPmNvZGVfdmFsaWQsIDAsIHNpemVvZihpY29kZS0+Y29kZV92YWxpZCkpOworCWZvciAocGMgPSAwOyBwYyA8IChlbXUtPmF1ZGlneSA/IDIqMTAyNCA6IDIqNTEyKTsgcGMgKz0gMikgeworCQlzZXRfYml0KHBjIC8gMiwgaWNvZGUtPmNvZGVfdmFsaWQpOworCQlpZiAocHV0X3VzZXIoc25kX2VtdTEwazFfZWZ4X3JlYWQoZW11LCBwYyArIDApLCAmaWNvZGUtPmNvZGVbcGMgKyAwXSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHNuZF9lbXUxMGsxX2VmeF9yZWFkKGVtdSwgcGMgKyAxKSwgJmljb2RlLT5jb2RlW3BjICsgMV0pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2VtdTEwazFfZng4MDEwX2N0bF90ICpzbmRfZW11MTBrMV9sb29rX2Zvcl9jdGwoZW11MTBrMV90ICplbXUsIHNuZF9jdGxfZWxlbV9pZF90ICppZCkKK3sKKwlzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKmN0bDsKKwlzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2w7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwkKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZlbXUtPmZ4ODAxMC5ncHJfY3RsKSB7CisJCWN0bCA9IGVtdTEwazFfZ3ByX2N0bChsaXN0KTsKKwkJa2NvbnRyb2wgPSBjdGwtPmtjb250cm9sOworCQlpZiAoa2NvbnRyb2wtPmlkLmlmYWNlID09IGlkLT5pZmFjZSAmJgorCQkgICAgIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgaWQtPm5hbWUpICYmCisJCSAgICBrY29udHJvbC0+aWQuaW5kZXggPT0gaWQtPmluZGV4KQorCQkJcmV0dXJuIGN0bDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfdmVyaWZ5X2NvbnRyb2xzKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCXVuc2lnbmVkIGludCBpOworCXNuZF9jdGxfZWxlbV9pZF90IF9fdXNlciAqX2lkOworCXNuZF9jdGxfZWxlbV9pZF90IGlkOworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgX191c2VyICpfZ2N0bDsKKwllbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90ICpnY3RsOworCWludCBlcnI7CisJCisJZm9yIChpID0gMCwgX2lkID0gaWNvZGUtPmdwcl9kZWxfY29udHJvbHM7CisJICAgICBpIDwgaWNvZGUtPmdwcl9kZWxfY29udHJvbF9jb3VudDsgaSsrLCBfaWQrKykgeworCSAgICAgCWlmIChjb3B5X2Zyb21fdXNlcigmaWQsIF9pZCwgc2l6ZW9mKGlkKSkpCisJICAgICAJCXJldHVybiAtRUZBVUxUOworCQlpZiAoc25kX2VtdTEwazFfbG9va19mb3JfY3RsKGVtdSwgJmlkKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWdjdGwgPSBrbWFsbG9jKHNpemVvZigqZ2N0bCksIEdGUF9LRVJORUwpOworCWlmICghIGdjdGwpCisJCXJldHVybiAtRU5PTUVNOworCWVyciA9IDA7CisJZm9yIChpID0gMCwgX2djdGwgPSBpY29kZS0+Z3ByX2FkZF9jb250cm9sczsKKwkgICAgIGkgPCBpY29kZS0+Z3ByX2FkZF9jb250cm9sX2NvdW50OyBpKyssIF9nY3RsKyspIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGdjdGwsIF9nY3RsLCBzaXplb2YoKmdjdGwpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCQlpZiAoc25kX2VtdTEwazFfbG9va19mb3JfY3RsKGVtdSwgJmdjdGwtPmlkKSkKKwkJCWNvbnRpbnVlOworCQlkb3duX3JlYWQoJmVtdS0+Y2FyZC0+Y29udHJvbHNfcndzZW0pOworCQlpZiAoc25kX2N0bF9maW5kX2lkKGVtdS0+Y2FyZCwgJmdjdGwtPmlkKSAhPSBOVUxMKSB7CisJCQl1cF9yZWFkKCZlbXUtPmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwkJdXBfcmVhZCgmZW11LT5jYXJkLT5jb250cm9sc19yd3NlbSk7CisJCWlmIChnY3RsLT5pZC5pZmFjZSAhPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiAmJgorCQkgICAgZ2N0bC0+aWQuaWZhY2UgIT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBfX2Vycm9yOworCQl9CisJfQorCWZvciAoaSA9IDAsIF9nY3RsID0gaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzOworCSAgICAgaSA8IGljb2RlLT5ncHJfbGlzdF9jb250cm9sX2NvdW50OyBpKyssIF9nY3RsKyspIHsKKwkgICAgIAkvKiBGSVhNRTogd2UgbmVlZCB0byBjaGVjayB0aGUgV1JJVEUgYWNjZXNzICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihnY3RsLCBfZ2N0bCwgc2l6ZW9mKCpnY3RsKSkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwl9CisgX19lcnJvcjoKKwlrZnJlZShnY3RsKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9jdGxfcHJpdmF0ZV9mcmVlKHNuZF9rY29udHJvbF90ICprY3RsKQoreworCXNuZF9lbXUxMGsxX2Z4ODAxMF9jdGxfdCAqY3RsOworCQorCWN0bCA9IChzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKilrY3RsLT5wcml2YXRlX3ZhbHVlOworCWtjdGwtPnByaXZhdGVfdmFsdWUgPSAwOworCWxpc3RfZGVsKCZjdGwtPmxpc3QpOworCWtmcmVlKGN0bCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfYWRkX2NvbnRyb2xzKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgX191c2VyICpfZ2N0bDsKKwllbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90ICpnY3RsOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9jdGxfdCAqY3RsLCAqbmN0bDsKKwlzbmRfa2NvbnRyb2xfbmV3X3Qga25ldzsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsOworCWludCBlcnIgPSAwOworCisJdmFsID0gKHNuZF9jdGxfZWxlbV92YWx1ZV90ICopa21hbGxvYyhzaXplb2YoKnZhbCksIEdGUF9LRVJORUwpOworCWdjdGwgPSBrbWFsbG9jKHNpemVvZigqZ2N0bCksIEdGUF9LRVJORUwpOworCW5jdGwgPSBrbWFsbG9jKHNpemVvZigqbmN0bCksIEdGUF9LRVJORUwpOworCWlmICghdmFsIHx8ICFnY3RsIHx8ICFuY3RsKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gX19lcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwLCBfZ2N0bCA9IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xzOworCSAgICAgaSA8IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQ7IGkrKywgX2djdGwrKykgeworCQlpZiAoY29weV9mcm9tX3VzZXIoZ2N0bCwgX2djdGwsIHNpemVvZigqZ2N0bCkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBfX2Vycm9yOworCQl9CisJCXNuZF9ydW50aW1lX2NoZWNrKGdjdGwtPmlkLmlmYWNlID09IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSIHx8CisJCSAgICAgICAgICAgICAgICAgIGdjdGwtPmlkLmlmYWNlID09IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgZXJyID0gLUVJTlZBTDsgZ290byBfX2Vycm9yKTsKKwkJc25kX3J1bnRpbWVfY2hlY2soZ2N0bC0+aWQubmFtZVswXSAhPSAnXDAnLCBlcnIgPSAtRUlOVkFMOyBnb3RvIF9fZXJyb3IpOworCQljdGwgPSBzbmRfZW11MTBrMV9sb29rX2Zvcl9jdGwoZW11LCAmZ2N0bC0+aWQpOworCQltZW1zZXQoJmtuZXcsIDAsIHNpemVvZihrbmV3KSk7CisJCWtuZXcuaWZhY2UgPSBnY3RsLT5pZC5pZmFjZTsKKwkJa25ldy5uYW1lID0gZ2N0bC0+aWQubmFtZTsKKwkJa25ldy5pbmRleCA9IGdjdGwtPmlkLmluZGV4OworCQlrbmV3LmRldmljZSA9IGdjdGwtPmlkLmRldmljZTsKKwkJa25ldy5zdWJkZXZpY2UgPSBnY3RsLT5pZC5zdWJkZXZpY2U7CisJCWtuZXcuaW5mbyA9IHNuZF9lbXUxMGsxX2dwcl9jdGxfaW5mbzsKKwkJa25ldy5nZXQgPSBzbmRfZW11MTBrMV9ncHJfY3RsX2dldDsKKwkJa25ldy5wdXQgPSBzbmRfZW11MTBrMV9ncHJfY3RsX3B1dDsKKwkJbWVtc2V0KG5jdGwsIDAsIHNpemVvZigqbmN0bCkpOworCQluY3RsLT52Y291bnQgPSBnY3RsLT52Y291bnQ7CisJCW5jdGwtPmNvdW50ID0gZ2N0bC0+Y291bnQ7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCQluY3RsLT5ncHJbal0gPSBnY3RsLT5ncHJbal07CisJCQluY3RsLT52YWx1ZVtqXSA9IH5nY3RsLT52YWx1ZVtqXTsJLyogaW52ZXJ0ZWQsIHdlIHdhbnQgdG8gd3JpdGUgbmV3IHZhbHVlIGluIGdwcl9jdGxfcHV0KCkgKi8KKwkJCXZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtqXSA9IGdjdGwtPnZhbHVlW2pdOworCQl9CisJCW5jdGwtPm1pbiA9IGdjdGwtPm1pbjsKKwkJbmN0bC0+bWF4ID0gZ2N0bC0+bWF4OworCQluY3RsLT50cmFuc2xhdGlvbiA9IGdjdGwtPnRyYW5zbGF0aW9uOworCQlpZiAoY3RsID09IE5VTEwpIHsKKwkJCWN0bCA9IChzbmRfZW11MTBrMV9meDgwMTBfY3RsX3QgKilrbWFsbG9jKHNpemVvZigqY3RsKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoY3RsID09IE5VTEwpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gX19lcnJvcjsKKwkJCX0KKwkJCWtuZXcucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWN0bDsKKwkJCSpjdGwgPSAqbmN0bDsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoZW11LT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZrbmV3LCBlbXUpKSkgPCAwKSB7CisJCQkJa2ZyZWUoY3RsKTsKKwkJCQlnb3RvIF9fZXJyb3I7CisJCQl9CisJCQlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9jdGxfcHJpdmF0ZV9mcmVlOworCQkJY3RsLT5rY29udHJvbCA9IGtjdGw7CisJCQlsaXN0X2FkZF90YWlsKCZjdGwtPmxpc3QsICZlbXUtPmZ4ODAxMC5ncHJfY3RsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG92ZXJ3cml0ZSAqLworCQkJbmN0bC0+bGlzdCA9IGN0bC0+bGlzdDsKKwkJCW5jdGwtPmtjb250cm9sID0gY3RsLT5rY29udHJvbDsKKwkJCSpjdGwgPSAqbmN0bDsKKwkJCXNuZF9jdGxfbm90aWZ5KGVtdS0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmY3RsLT5rY29udHJvbC0+aWQpOworCQl9CisJCXNuZF9lbXUxMGsxX2dwcl9jdGxfcHV0KGN0bC0+a2NvbnRyb2wsIHZhbCk7CisJfQorICAgICAgX19lcnJvcjoKKwlrZnJlZShuY3RsKTsKKwlrZnJlZShnY3RsKTsKKwlrZnJlZSh2YWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZGVsX2NvbnRyb2xzKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCXVuc2lnbmVkIGludCBpOworCXNuZF9jdGxfZWxlbV9pZF90IGlkOworCXNuZF9jdGxfZWxlbV9pZF90IF9fdXNlciAqX2lkOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9jdGxfdCAqY3RsOworCXNuZF9jYXJkX3QgKmNhcmQgPSBlbXUtPmNhcmQ7CisJCisJZm9yIChpID0gMCwgX2lkID0gaWNvZGUtPmdwcl9kZWxfY29udHJvbHM7CisJICAgICBpIDwgaWNvZGUtPmdwcl9kZWxfY29udHJvbF9jb3VudDsgaSsrLCBfaWQrKykgeworCSAgICAgCXNuZF9ydW50aW1lX2NoZWNrKGNvcHlfZnJvbV91c2VyKCZpZCwgX2lkLCBzaXplb2YoaWQpKSA9PSAwLCByZXR1cm4gLUVGQVVMVCk7CisJCWRvd25fd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwkJY3RsID0gc25kX2VtdTEwazFfbG9va19mb3JfY3RsKGVtdSwgJmlkKTsKKwkJaWYgKGN0bCkKKwkJCXNuZF9jdGxfcmVtb3ZlKGNhcmQsIGN0bC0+a2NvbnRyb2wpOworCQl1cF93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9saXN0X2NvbnRyb2xzKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCXVuc2lnbmVkIGludCBpID0gMCwgajsKKwl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmdjdGw7CisJZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCBfX3VzZXIgKl9nY3RsOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9jdGxfdCAqY3RsOworCXNuZF9jdGxfZWxlbV9pZF90ICppZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJZ2N0bCA9IGttYWxsb2Moc2l6ZW9mKCpnY3RsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgZ2N0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlfZ2N0bCA9IGljb2RlLT5ncHJfbGlzdF9jb250cm9sczsJCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZW11LT5meDgwMTAuZ3ByX2N0bCkgeworCQljdGwgPSBlbXUxMGsxX2dwcl9jdGwobGlzdCk7CisJCXRvdGFsKys7CisJCWlmIChfZ2N0bCAmJiBpIDwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfY291bnQpIHsKKwkJCW1lbXNldChnY3RsLCAwLCBzaXplb2YoKmdjdGwpKTsKKwkJCWlkID0gJmN0bC0+a2NvbnRyb2wtPmlkOworCQkJZ2N0bC0+aWQuaWZhY2UgPSBpZC0+aWZhY2U7CisJCQlzdHJsY3B5KGdjdGwtPmlkLm5hbWUsIGlkLT5uYW1lLCBzaXplb2YoZ2N0bC0+aWQubmFtZSkpOworCQkJZ2N0bC0+aWQuaW5kZXggPSBpZC0+aW5kZXg7CisJCQlnY3RsLT5pZC5kZXZpY2UgPSBpZC0+ZGV2aWNlOworCQkJZ2N0bC0+aWQuc3ViZGV2aWNlID0gaWQtPnN1YmRldmljZTsKKwkJCWdjdGwtPnZjb3VudCA9IGN0bC0+dmNvdW50OworCQkJZ2N0bC0+Y291bnQgPSBjdGwtPmNvdW50OworCQkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCQlnY3RsLT5ncHJbal0gPSBjdGwtPmdwcltqXTsKKwkJCQlnY3RsLT52YWx1ZVtqXSA9IGN0bC0+dmFsdWVbal07CisJCQl9CisJCQlnY3RsLT5taW4gPSBjdGwtPm1pbjsKKwkJCWdjdGwtPm1heCA9IGN0bC0+bWF4OworCQkJZ2N0bC0+dHJhbnNsYXRpb24gPSBjdGwtPnRyYW5zbGF0aW9uOworCQkJaWYgKGNvcHlfdG9fdXNlcihfZ2N0bCwgZ2N0bCwgc2l6ZW9mKCpnY3RsKSkpIHsKKwkJCQlrZnJlZShnY3RsKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCV9nY3RsKys7CisJCQlpKys7CisJCX0KKwl9CisJaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfdG90YWwgPSB0b3RhbDsKKwlrZnJlZShnY3RsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9pY29kZV9wb2tlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlKQoreworCWludCBlcnIgPSAwOworCisJZG93bigmZW11LT5meDgwMTAubG9jayk7CisJaWYgKChlcnIgPSBzbmRfZW11MTBrMV92ZXJpZnlfY29udHJvbHMoZW11LCBpY29kZSkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCXN0cmxjcHkoZW11LT5meDgwMTAubmFtZSwgaWNvZGUtPm5hbWUsIHNpemVvZihlbXUtPmZ4ODAxMC5uYW1lKSk7CisJLyogc3RvcCBGWCBwcm9jZXNzb3IgLSB0aGlzIG1heSBiZSBkYW5nZXJvdXMsIGJ1dCBpdCdzIGJldHRlciB0byBtaXNzCisJICAgc29tZSBzYW1wbGVzIHRoYW4gZ2VuZXJhdGUgd3Jvbmcgb25lcyAtIFtqa10gKi8KKwlpZiAoZW11LT5hdWRpZ3kpCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgfCBBX0RCR19TSU5HTEVfU1RFUCk7CisJZWxzZQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyB8IEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQKTsKKwkvKiBvaywgZG8gdGhlIG1haW4gam9iICovCisJaWYgKChlcnIgPSBzbmRfZW11MTBrMV9kZWxfY29udHJvbHMoZW11LCBpY29kZSkpIDwgMCB8fAorCSAgICAoZXJyID0gc25kX2VtdTEwazFfZ3ByX3Bva2UoZW11LCBpY29kZSkpIDwgMCB8fAorCSAgICAoZXJyID0gc25kX2VtdTEwazFfdHJhbV9wb2tlKGVtdSwgaWNvZGUpKSA8IDAgfHwKKwkgICAgKGVyciA9IHNuZF9lbXUxMGsxX2NvZGVfcG9rZShlbXUsIGljb2RlKSkgPCAwIHx8CisJICAgIChlcnIgPSBzbmRfZW11MTBrMV9hZGRfY29udHJvbHMoZW11LCBpY29kZSkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCS8qIHN0YXJ0IEZYIHByb2Nlc3NvciB3aGVuIHRoZSBEU1AgY29kZSBpcyB1cGRhdGVkICovCisJaWYgKGVtdS0+YXVkaWd5KQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0RCRywgMCwgZW11LT5meDgwMTAuZGJnKTsKKwllbHNlCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERCRywgMCwgZW11LT5meDgwMTAuZGJnKTsKKyAgICAgIF9fZXJyb3I6CisJdXAoJmVtdS0+Zng4MDEwLmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfaWNvZGVfcGVlayhlbXUxMGsxX3QgKmVtdSwgZW11MTBrMV9meDgwMTBfY29kZV90ICppY29kZSkKK3sKKwlpbnQgZXJyOworCisJZG93bigmZW11LT5meDgwMTAubG9jayk7CisJc3RybGNweShpY29kZS0+bmFtZSwgZW11LT5meDgwMTAubmFtZSwgc2l6ZW9mKGljb2RlLT5uYW1lKSk7CisJLyogb2ssIGRvIHRoZSBtYWluIGpvYiAqLworCWVyciA9IHNuZF9lbXUxMGsxX2dwcl9wZWVrKGVtdSwgaWNvZGUpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gc25kX2VtdTEwazFfdHJhbV9wZWVrKGVtdSwgaWNvZGUpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gc25kX2VtdTEwazFfY29kZV9wZWVrKGVtdSwgaWNvZGUpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gc25kX2VtdTEwazFfbGlzdF9jb250cm9scyhlbXUsIGljb2RlKTsKKwl1cCgmZW11LT5meDgwMTAubG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9pcGNtX3Bva2UoZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX3BjbV90ICppcGNtKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnIgPSAwOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fdCAqcGNtOworCisJaWYgKGlwY20tPnN1YnN0cmVhbSA+PSBFTVUxMEsxX0ZYODAxMF9QQ01fQ09VTlQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpcGNtLT5jaGFubmVscyA+IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwY20gPSAmZW11LT5meDgwMTAucGNtW2lwY20tPnN1YnN0cmVhbV07CisJZG93bigmZW11LT5meDgwMTAubG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZW11LT5yZWdfbG9jayk7CisJaWYgKHBjbS0+b3BlbmVkKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBfX2Vycm9yOworCX0KKwlpZiAoaXBjbS0+Y2hhbm5lbHMgPT0gMCkgewkvKiByZW1vdmUgKi8KKwkJcGNtLT52YWxpZCA9IDA7CisJfSBlbHNlIHsKKwkJLyogRklYTUU6IHdlIG5lZWQgdG8gYWRkIHVuaXZlcnNhbCBjb2RlIHRvIHRoZSBQQ00gdHJhbnNmZXIgcm91dGluZSAqLworCQlpZiAoaXBjbS0+Y2hhbm5lbHMgIT0gMikgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCQlwY20tPnZhbGlkID0gMTsKKwkJcGNtLT5vcGVuZWQgPSAwOworCQlwY20tPmNoYW5uZWxzID0gaXBjbS0+Y2hhbm5lbHM7CisJCXBjbS0+dHJhbV9zdGFydCA9IGlwY20tPnRyYW1fc3RhcnQ7CisJCXBjbS0+YnVmZmVyX3NpemUgPSBpcGNtLT5idWZmZXJfc2l6ZTsKKwkJcGNtLT5ncHJfc2l6ZSA9IGlwY20tPmdwcl9zaXplOworCQlwY20tPmdwcl9jb3VudCA9IGlwY20tPmdwcl9jb3VudDsKKwkJcGNtLT5ncHJfdG1wY291bnQgPSBpcGNtLT5ncHJfdG1wY291bnQ7CisJCXBjbS0+Z3ByX3B0ciA9IGlwY20tPmdwcl9wdHI7CisJCXBjbS0+Z3ByX3RyaWdnZXIgPSBpcGNtLT5ncHJfdHJpZ2dlcjsKKwkJcGNtLT5ncHJfcnVubmluZyA9IGlwY20tPmdwcl9ydW5uaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgcGNtLT5jaGFubmVsczsgaSsrKQorCQkJcGNtLT5ldHJhbVtpXSA9IGlwY20tPmV0cmFtW2ldOworCX0KKyAgICAgIF9fZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwl1cCgmZW11LT5meDgwMTAubG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9pcGNtX3BlZWsoZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX3BjbV90ICppcGNtKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnIgPSAwOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fdCAqcGNtOworCisJaWYgKGlwY20tPnN1YnN0cmVhbSA+PSBFTVUxMEsxX0ZYODAxMF9QQ01fQ09VTlQpCisJCXJldHVybiAtRUlOVkFMOworCXBjbSA9ICZlbXUtPmZ4ODAxMC5wY21baXBjbS0+c3Vic3RyZWFtXTsKKwlkb3duKCZlbXUtPmZ4ODAxMC5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwlpcGNtLT5jaGFubmVscyA9IHBjbS0+Y2hhbm5lbHM7CisJaXBjbS0+dHJhbV9zdGFydCA9IHBjbS0+dHJhbV9zdGFydDsKKwlpcGNtLT5idWZmZXJfc2l6ZSA9IHBjbS0+YnVmZmVyX3NpemU7CisJaXBjbS0+Z3ByX3NpemUgPSBwY20tPmdwcl9zaXplOworCWlwY20tPmdwcl9wdHIgPSBwY20tPmdwcl9wdHI7CisJaXBjbS0+Z3ByX2NvdW50ID0gcGNtLT5ncHJfY291bnQ7CisJaXBjbS0+Z3ByX3RtcGNvdW50ID0gcGNtLT5ncHJfdG1wY291bnQ7CisJaXBjbS0+Z3ByX3RyaWdnZXIgPSBwY20tPmdwcl90cmlnZ2VyOworCWlwY20tPmdwcl9ydW5uaW5nID0gcGNtLT5ncHJfcnVubmluZzsKKwlmb3IgKGkgPSAwOyBpIDwgcGNtLT5jaGFubmVsczsgaSsrKQorCQlpcGNtLT5ldHJhbVtpXSA9IHBjbS0+ZXRyYW1baV07CisJaXBjbS0+cmVzMSA9IGlwY20tPnJlczIgPSAwOworCWlwY20tPnBhZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwl1cCgmZW11LT5meDgwMTAubG9jayk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBTTkRfRU1VMTBLMV9HUFJfQ09OVFJPTFMJNDEKKyNkZWZpbmUgU05EX0VNVTEwSzFfSU5QVVRTCQkxMAorI2RlZmluZSBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUwk4CisjZGVmaW5lIFNORF9FTVUxMEsxX0NBUFRVUkVfQ0hBTk5FTFMJNAorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2VtdTEwazFfaW5pdF9tb25vX2NvbnRyb2woZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCAqY3RsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZ3ByLCBpbnQgZGVmdmFsKQoreworCWN0bC0+aWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoY3RsLT5pZC5uYW1lLCBuYW1lKTsKKwljdGwtPnZjb3VudCA9IGN0bC0+Y291bnQgPSAxOworCWN0bC0+Z3ByWzBdID0gZ3ByICsgMDsgY3RsLT52YWx1ZVswXSA9IGRlZnZhbDsKKwljdGwtPm1pbiA9IDA7CisJY3RsLT5tYXggPSAxMDA7CisJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwOwkKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCAqY3RsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZ3ByLCBpbnQgZGVmdmFsKQoreworCWN0bC0+aWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoY3RsLT5pZC5uYW1lLCBuYW1lKTsKKwljdGwtPnZjb3VudCA9IGN0bC0+Y291bnQgPSAyOworCWN0bC0+Z3ByWzBdID0gZ3ByICsgMDsgY3RsLT52YWx1ZVswXSA9IGRlZnZhbDsKKwljdGwtPmdwclsxXSA9IGdwciArIDE7IGN0bC0+dmFsdWVbMV0gPSBkZWZ2YWw7CisJY3RsLT5taW4gPSAwOworCWN0bC0+bWF4ID0gMTAwOworCWN0bC0+dHJhbnNsYXRpb24gPSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UQUJMRTEwMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9lbXUxMGsxX2luaXRfbW9ub19vbm9mZl9jb250cm9sKGVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmN0bCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGdwciwgaW50IGRlZnZhbCkKK3sKKwljdGwtPmlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJc3RyY3B5KGN0bC0+aWQubmFtZSwgbmFtZSk7CisJY3RsLT52Y291bnQgPSBjdGwtPmNvdW50ID0gMTsKKwljdGwtPmdwclswXSA9IGdwciArIDA7IGN0bC0+dmFsdWVbMF0gPSBkZWZ2YWw7CisJY3RsLT5taW4gPSAwOworCWN0bC0+bWF4ID0gMTsKKwljdGwtPnRyYW5zbGF0aW9uID0gRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fT05PRkY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmN0bCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGdwciwgaW50IGRlZnZhbCkKK3sKKwljdGwtPmlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJc3RyY3B5KGN0bC0+aWQubmFtZSwgbmFtZSk7CisJY3RsLT52Y291bnQgPSBjdGwtPmNvdW50ID0gMjsKKwljdGwtPmdwclswXSA9IGdwciArIDA7IGN0bC0+dmFsdWVbMF0gPSBkZWZ2YWw7CisJY3RsLT5ncHJbMV0gPSBncHIgKyAxOyBjdGwtPnZhbHVlWzFdID0gZGVmdmFsOworCWN0bC0+bWluID0gMDsKKwljdGwtPm1heCA9IDE7CisJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX09OT0ZGOworfQorCisKKy8qCisgKiBpbml0aWFsIERTUCBjb25maWd1cmF0aW9uIGZvciBBdWRpZ3kKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBfc25kX2VtdTEwazFfYXVkaWd5X2luaXRfZWZ4KGVtdTEwazFfdCAqZW11KQoreworCWludCBlcnIsIGksIHosIGdwciwgbmN0bDsKKwljb25zdCBpbnQgcGxheWJhY2sgPSAxMDsKKwljb25zdCBpbnQgY2FwdHVyZSA9IHBsYXliYWNrICsgKFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICogMik7IC8qIHdlIHJlc2VydmUgMTAgdm9pY2VzICovCisJY29uc3QgaW50IHN0ZXJlb19taXggPSBjYXB0dXJlICsgMjsKKwljb25zdCBpbnQgdG1wID0gMHg4ODsKKwl1MzIgcHRyOworCWVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGUgPSBOVUxMOworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmNvbnRyb2xzID0gTlVMTCwgKmN0bDsKKwl1MzIgKmdwcl9tYXA7CisJbW1fc2VnbWVudF90IHNlZzsKKworCXNwaW5fbG9ja19pbml0KCZlbXUtPmZ4ODAxMC5pcnFfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmVtdS0+Zng4MDEwLmdwcl9jdGwpOworCisJaWYgKChpY29kZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCppY29kZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMIHx8CisJICAgIChpY29kZS0+Z3ByX21hcCA9ICh1X2ludDMyX3QgX191c2VyICopa2NhbGxvYyg1MTIgKyAyNTYgKyAyNTYgKyAyICogMTAyNCwgc2l6ZW9mKHVfaW50MzJfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMIHx8CisJICAgIChjb250cm9scyA9IGtjYWxsb2MoU05EX0VNVTEwSzFfR1BSX0NPTlRST0xTLCBzaXplb2YoKmNvbnRyb2xzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBfX2VycjsKKwl9CisJZ3ByX21hcCA9ICh1MzIgKilpY29kZS0+Z3ByX21hcDsKKworCWljb2RlLT50cmFtX2RhdGFfbWFwID0gaWNvZGUtPmdwcl9tYXAgKyA1MTI7CisJaWNvZGUtPnRyYW1fYWRkcl9tYXAgPSBpY29kZS0+dHJhbV9kYXRhX21hcCArIDI1NjsKKwlpY29kZS0+Y29kZSA9IGljb2RlLT50cmFtX2FkZHJfbWFwICsgMjU2OworCisJLyogY2xlYXIgZnJlZSBHUFJzICovCisJZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQorCQlzZXRfYml0KGksIGljb2RlLT5ncHJfdmFsaWQpOworCQkKKwkvKiBjbGVhciBUUkFNIGRhdGEgJiBhZGRyZXNzIGxpbmVzICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlzZXRfYml0KGksIGljb2RlLT50cmFtX3ZhbGlkKTsKKworCXN0cmNweShpY29kZS0+bmFtZSwgIkF1ZGlneSBEU1AgY29kZSBmb3IgQUxTQSIpOworCXB0ciA9IDA7CisJbmN0bCA9IDA7CisJZ3ByID0gc3RlcmVvX21peCArIDEwOworCisJLyogc3RvcCBGWCBwcm9jZXNzb3IgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0RCRywgMCwgKGVtdS0+Zng4MDEwLmRiZyA9IDApIHwgQV9EQkdfU0lOR0xFX1NURVApOworCisJLyogUENNIGZyb250IFBsYXliYWNrIFZvbHVtZSAoaW5kZXBlbmRlbnQgZnJvbSBzdGVyZW8gbWl4KSAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjayksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9GWEJVUyhGWEJVU19QQ01fTEVGVF9GUk9OVCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjaysxKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIrMSksIEFfRlhCVVMoRlhCVVNfUENNX1JJR0hUX0ZST05UKSk7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIlBDTSBGcm9udCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByICs9IDI7CisJCisJLyogUENNIFN1cnJvdW5kIFBsYXliYWNrIChpbmRlcGVuZGVudCBmcm9tIHN0ZXJlbyBtaXgpICovCisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzIpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfRlhCVVMoRlhCVVNfUENNX0xFRlRfUkVBUikpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjayszKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIrMSksIEFfRlhCVVMoRlhCVVNfUENNX1JJR0hUX1JFQVIpKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiUENNIFN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMTAwKTsKKwlncHIgKz0gMjsKKwkKKwkvKiBQQ00gU2lkZSBQbGF5YmFjayAoaW5kZXBlbmRlbnQgZnJvbSBzdGVyZW8gbWl4KSAqLworCWlmIChlbXUtPnNwazcxKSB7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjays2KSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIpLCBBX0ZYQlVTKEZYQlVTX1BDTV9MRUZUX1NJREUpKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzcpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwcisxKSwgQV9GWEJVUyhGWEJVU19QQ01fUklHSFRfU0lERSkpOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiUENNIFNpZGUgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAxMDApOworCQlncHIgKz0gMjsKKwl9CisKKwkvKiBQQ00gQ2VudGVyIFBsYXliYWNrIChpbmRlcGVuZGVudCBmcm9tIHN0ZXJlbyBtaXgpICovCisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzQpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfRlhCVVMoRlhCVVNfUENNX0NFTlRFUikpOworCXNuZF9lbXUxMGsxX2luaXRfbW9ub19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiUENNIENlbnRlciBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByKys7CisKKwkvKiBQQ00gTEZFIFBsYXliYWNrIChpbmRlcGVuZGVudCBmcm9tIHN0ZXJlbyBtaXgpICovCisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzUpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfRlhCVVMoRlhCVVNfUENNX0xGRSkpOworCXNuZF9lbXUxMGsxX2luaXRfbW9ub19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiUENNIExGRSBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByKys7CisJCisJLyoKKwkgKiBTdGVyZW8gTWl4CisJICovCisJLyogV2F2ZSAoUENNKSBQbGF5YmFjayBWb2x1bWUgKHdpbGwgYmUgcmVuYW1lZCBsYXRlcikgKi8KKwlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIoc3RlcmVvX21peCksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9GWEJVUyhGWEJVU19QQ01fTEVGVCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihzdGVyZW9fbWl4KzEpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwcisxKSwgQV9GWEJVUyhGWEJVU19QQ01fUklHSFQpKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiV2F2ZSBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByICs9IDI7CisKKwkvKiBTeW50aCBQbGF5YmFjayAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihzdGVyZW9fbWl4KzApLCBBX0dQUihzdGVyZW9fbWl4KzApLCBBX0dQUihncHIpLCBBX0ZYQlVTKEZYQlVTX01JRElfTEVGVCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihzdGVyZW9fbWl4KzEpLCBBX0dQUihzdGVyZW9fbWl4KzEpLCBBX0dQUihncHIrMSksIEFfRlhCVVMoRlhCVVNfTUlESV9SSUdIVCkpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJTeW50aCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByICs9IDI7CisKKwkvKiBXYXZlIChQQ00pIENhcHR1cmUgKi8KKwlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIoY2FwdHVyZSswKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIpLCBBX0ZYQlVTKEZYQlVTX1BDTV9MRUZUKSk7CisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKGNhcHR1cmUrMSksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKzEpLCBBX0ZYQlVTKEZYQlVTX1BDTV9SSUdIVCkpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJQQ00gQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCWdwciArPSAyOworCisJLyogU3ludGggQ2FwdHVyZSAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihjYXB0dXJlKzApLCBBX0dQUihjYXB0dXJlKzApLCBBX0dQUihncHIpLCBBX0ZYQlVTKEZYQlVTX01JRElfTEVGVCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihjYXB0dXJlKzEpLCBBX0dQUihjYXB0dXJlKzEpLCBBX0dQUihncHIrMSksIEFfRlhCVVMoRlhCVVNfTUlESV9SSUdIVCkpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJTeW50aCBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisKKwkvKgorCSAqIGlucHV0cworCSAqLworI2RlZmluZSBBX0FERF9WT0xVTUVfSU4odmFyLHZvbCxpbnB1dCkgXAorQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHZhciksIEFfR1BSKHZhciksIEFfR1BSKHZvbCksIEFfRVhUSU4oaW5wdXQpKQorCisJLyogQUMnOTcgUGxheWJhY2sgVm9sdW1lIC0gdXNlZCBvbmx5IGZvciBtaWMgKHJlbmFtZWQgbGF0ZXIpICovCisJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgsIGdwciwgQV9FWFRJTl9BQzk3X0wpOworCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4KzEsIGdwcisxLCBBX0VYVElOX0FDOTdfUik7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIkFNaWMgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwlncHIgKz0gMjsKKwkvKiBBQyc5NyBDYXB0dXJlIFZvbHVtZSAtIHVzZWQgb25seSBmb3IgbWljICovCisJQV9BRERfVk9MVU1FX0lOKGNhcHR1cmUsIGdwciwgQV9FWFRJTl9BQzk3X0wpOworCUFfQUREX1ZPTFVNRV9JTihjYXB0dXJlKzEsIGdwcisxLCBBX0VYVElOX0FDOTdfUik7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIk1pYyBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisKKwkvKiBtaWMgY2FwdHVyZSBidWZmZXIgKi8JCisJQV9PUChpY29kZSwgJnB0ciwgaUlOVEVSUCwgQV9FWFRPVVQoQV9FWFRPVVRfTUlDX0NBUCksIEFfRVhUSU4oQV9FWFRJTl9BQzk3X0wpLCAweGNkLCBBX0VYVElOKEFfRVhUSU5fQUM5N19SKSk7CisKKwkvKiBBdWRpZ3kgQ0QgUGxheWJhY2sgVm9sdW1lICovCisJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgsIGdwciwgQV9FWFRJTl9TUERJRl9DRF9MKTsKKwlBX0FERF9WT0xVTUVfSU4oc3RlcmVvX21peCsxLCBncHIrMSwgQV9FWFRJTl9TUERJRl9DRF9SKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLAorCQkJCQllbXUtPm5vX2FjOTcgPyAiQ0QgUGxheWJhY2sgVm9sdW1lIiA6ICJBdWRpZ3kgQ0QgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJZ3ByLCAwKTsKKwlncHIgKz0gMjsKKwkvKiBBdWRpZ3kgQ0QgQ2FwdHVyZSBWb2x1bWUgKi8KKwlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSwgZ3ByLCBBX0VYVElOX1NQRElGX0NEX0wpOworCUFfQUREX1ZPTFVNRV9JTihjYXB0dXJlKzEsIGdwcisxLCBBX0VYVElOX1NQRElGX0NEX1IpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sCisJCQkJCWVtdS0+bm9fYWM5NyA/ICJDRCBDYXB0dXJlIFZvbHVtZSIgOiAiQXVkaWd5IENEIENhcHR1cmUgVm9sdW1lIiwKKwkJCQkJZ3ByLCAwKTsKKwlncHIgKz0gMjsKKworIAkvKiBPcHRpY2FsIFNQRElGIFBsYXliYWNrIFZvbHVtZSAqLworCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4LCBncHIsIEFfRVhUSU5fT1BUX1NQRElGX0wpOworCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4KzEsIGdwcisxLCBBX0VYVElOX09QVF9TUERJRl9SKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiSUVDOTU4IE9wdGljYWwgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwlncHIgKz0gMjsKKwkvKiBPcHRpY2FsIFNQRElGIENhcHR1cmUgVm9sdW1lICovCisJQV9BRERfVk9MVU1FX0lOKGNhcHR1cmUsIGdwciwgQV9FWFRJTl9PUFRfU1BESUZfTCk7CisJQV9BRERfVk9MVU1FX0lOKGNhcHR1cmUrMSwgZ3ByKzEsIEFfRVhUSU5fT1BUX1NQRElGX1IpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJJRUM5NTggT3B0aWNhbCBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisKKwkvKiBMaW5lMiBQbGF5YmFjayBWb2x1bWUgKi8KKwlBX0FERF9WT0xVTUVfSU4oc3RlcmVvX21peCwgZ3ByLCBBX0VYVElOX0xJTkUyX0wpOworCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4KzEsIGdwcisxLCBBX0VYVElOX0xJTkUyX1IpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sCisJCQkJCWVtdS0+bm9fYWM5NyA/ICJMaW5lIFBsYXliYWNrIFZvbHVtZSIgOiAiTGluZTIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJZ3ByLCAwKTsKKwlncHIgKz0gMjsKKwkvKiBMaW5lMiBDYXB0dXJlIFZvbHVtZSAqLworCUFfQUREX1ZPTFVNRV9JTihjYXB0dXJlLCBncHIsIEFfRVhUSU5fTElORTJfTCk7CisJQV9BRERfVk9MVU1FX0lOKGNhcHR1cmUrMSwgZ3ByKzEsIEFfRVhUSU5fTElORTJfUik7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwKKwkJCQkJZW11LT5ub19hYzk3ID8gIkxpbmUgQ2FwdHVyZSBWb2x1bWUiIDogIkxpbmUyIENhcHR1cmUgVm9sdW1lIiwKKwkJCQkJZ3ByLCAwKTsKKwlncHIgKz0gMjsKKyAgICAgICAgCisJLyogUGhpbGlwcyBBREMgUGxheWJhY2sgVm9sdW1lICovCisJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgsIGdwciwgQV9FWFRJTl9BRENfTCk7CisJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgrMSwgZ3ByKzEsIEFfRVhUSU5fQURDX1IpOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJBbmFsb2cgTWl4IFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisJLyogUGhpbGlwcyBBREMgQ2FwdHVyZSBWb2x1bWUgKi8KKwlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSwgZ3ByLCBBX0VYVElOX0FEQ19MKTsKKwlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSsxLCBncHIrMSwgQV9FWFRJTl9BRENfUik7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIkFuYWxvZyBNaXggQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCWdwciArPSAyOworCisJLyogQXV4MiBQbGF5YmFjayBWb2x1bWUgKi8KKwlBX0FERF9WT0xVTUVfSU4oc3RlcmVvX21peCwgZ3ByLCBBX0VYVElOX0FVWDJfTCk7CisJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgrMSwgZ3ByKzEsIEFfRVhUSU5fQVVYMl9SKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLAorCQkJCQllbXUtPm5vX2FjOTcgPyAiQXV4IFBsYXliYWNrIFZvbHVtZSIgOiAiQXV4MiBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQlncHIsIDApOworCWdwciArPSAyOworCS8qIEF1eDIgQ2FwdHVyZSBWb2x1bWUgKi8KKwlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSwgZ3ByLCBBX0VYVElOX0FVWDJfTCk7CisJQV9BRERfVk9MVU1FX0lOKGNhcHR1cmUrMSwgZ3ByKzEsIEFfRVhUSU5fQVVYMl9SKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLAorCQkJCQllbXUtPm5vX2FjOTcgPyAiQXV4IENhcHR1cmUgVm9sdW1lIiA6ICJBdXgyIENhcHR1cmUgVm9sdW1lIiwKKwkJCQkJZ3ByLCAwKTsKKwlncHIgKz0gMjsKKwkKKwkvKiBTdGVyZW8gTWl4IEZyb250IFBsYXliYWNrIFZvbHVtZSAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjayksIEFfR1BSKHBsYXliYWNrKSwgQV9HUFIoZ3ByKSwgQV9HUFIoc3RlcmVvX21peCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjaysxKSwgQV9HUFIocGxheWJhY2srMSksIEFfR1BSKGdwcisxKSwgQV9HUFIoc3RlcmVvX21peCsxKSk7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMTAwKTsKKwlncHIgKz0gMjsKKwkKKwkvKiBTdGVyZW8gTWl4IFN1cnJvdW5kIFBsYXliYWNrICovCisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzIpLCBBX0dQUihwbGF5YmFjaysyKSwgQV9HUFIoZ3ByKSwgQV9HUFIoc3RlcmVvX21peCkpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjayszKSwgQV9HUFIocGxheWJhY2srMyksIEFfR1BSKGdwcisxKSwgQV9HUFIoc3RlcmVvX21peCsxKSk7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisKKwkvKiBTdGVyZW8gTWl4IENlbnRlciBQbGF5YmFjayAqLworCS8qIENlbnRlciA9IHN1YiA9IExlZnQvMiArIFJpZ2h0LzIgKi8KKwlBX09QKGljb2RlLCAmcHRyLCBpSU5URVJQLCBBX0dQUih0bXApLCBBX0dQUihzdGVyZW9fbWl4KSwgMHhjZCwgQV9HUFIoc3RlcmVvX21peCsxKSk7CisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzQpLCBBX0dQUihwbGF5YmFjays0KSwgQV9HUFIoZ3ByKSwgQV9HUFIodG1wKSk7CisJc25kX2VtdTEwazFfaW5pdF9tb25vX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwlncHIrKzsKKworCS8qIFN0ZXJlbyBNaXggTEZFIFBsYXliYWNrICovCisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzUpLCBBX0dQUihwbGF5YmFjays1KSwgQV9HUFIoZ3ByKSwgQV9HUFIodG1wKSk7CisJc25kX2VtdTEwazFfaW5pdF9tb25vX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJMRkUgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwlncHIrKzsKKwkKKwlpZiAoZW11LT5zcGs3MSkgeworCQkvKiBTdGVyZW8gTWl4IFNpZGUgUGxheWJhY2sgKi8KKwkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzYpLCBBX0dQUihwbGF5YmFjays2KSwgQV9HUFIoZ3ByKSwgQV9HUFIoc3RlcmVvX21peCkpOworCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIocGxheWJhY2srNyksIEFfR1BSKHBsYXliYWNrKzcpLCBBX0dQUihncHIrMSksIEFfR1BSKHN0ZXJlb19taXgrMSkpOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCQlncHIgKz0gMjsKKwl9CisKKwkvKgorCSAqIG91dHB1dHMKKwkgKi8KKyNkZWZpbmUgQV9QVVRfT1VUUFVUKG91dCxzcmMpIEFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVChvdXQpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCwgQV9HUFIoc3JjKSkKKyNkZWZpbmUgQV9QVVRfU1RFUkVPX09VVFBVVChvdXQxLG91dDIsc3JjKSBcCisJe0FfUFVUX09VVFBVVChvdXQxLHNyYyk7IEFfUFVUX09VVFBVVChvdXQyLHNyYysxKTt9CisKKyNkZWZpbmUgX0FfU1dJVENIKGljb2RlLCBwdHIsIGRzdCwgc3JjLCBzdykgXAorCUFfT1AoKGljb2RlKSwgcHRyLCBpTUFDSU5UMCwgZHN0LCBBX0NfMDAwMDAwMDAsIHNyYywgc3cpOworI2RlZmluZSBBX1NXSVRDSChpY29kZSwgcHRyLCBkc3QsIHNyYywgc3cpIFwKKwkJX0FfU1dJVENIKGljb2RlLCBwdHIsIEFfR1BSKGRzdCksIEFfR1BSKHNyYyksIEFfR1BSKHN3KSkKKyNkZWZpbmUgX0FfU1dJVENIX05FRyhpY29kZSwgcHRyLCBkc3QsIHNyYykgXAorCUFfT1AoKGljb2RlKSwgcHRyLCBpQU5EWE9SLCBkc3QsIHNyYywgQV9DXzAwMDAwMDAxLCBBX0NfMDAwMDAwMDEpOworI2RlZmluZSBBX1NXSVRDSF9ORUcoaWNvZGUsIHB0ciwgZHN0LCBzcmMpIFwKKwkJX0FfU1dJVENIX05FRyhpY29kZSwgcHRyLCBBX0dQUihkc3QpLCBBX0dQUihzcmMpKQorCisKKwkvKgorCSAqICBQcm9jZXNzIHRvbmUgY29udHJvbAorCSAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgMCksIEFfR1BSKHBsYXliYWNrICsgMCksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogbGVmdCAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgMSksIEFfR1BSKHBsYXliYWNrICsgMSksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogcmlnaHQgKi8KKwlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDIpLCBBX0dQUihwbGF5YmFjayArIDIpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7IC8qIHJlYXIgbGVmdCAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgMyksIEFfR1BSKHBsYXliYWNrICsgMyksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogcmVhciByaWdodCAqLworCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgNCksIEFfR1BSKHBsYXliYWNrICsgNCksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogY2VudGVyICovCisJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyA1KSwgQV9HUFIocGxheWJhY2sgKyA1KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOyAvKiBMRkUgKi8KKwlpZiAoZW11LT5zcGs3MSkgeworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDYpLCBBX0dQUihwbGF5YmFjayArIDYpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7IC8qIHNpZGUgbGVmdCAqLworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDcpLCBBX0dQUihwbGF5YmFjayArIDcpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7IC8qIHNpZGUgcmlnaHQgKi8KKwl9CisJCisKKwljdGwgPSAmY29udHJvbHNbbmN0bCArIDBdOworCWN0bC0+aWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoY3RsLT5pZC5uYW1lLCAiVG9uZSBDb250cm9sIC0gQmFzcyIpOworCWN0bC0+dmNvdW50ID0gMjsKKwljdGwtPmNvdW50ID0gMTA7CisJY3RsLT5taW4gPSAwOworCWN0bC0+bWF4ID0gNDA7CisJY3RsLT52YWx1ZVswXSA9IGN0bC0+dmFsdWVbMV0gPSAyMDsKKwljdGwtPnRyYW5zbGF0aW9uID0gRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fQkFTUzsKKwljdGwgPSAmY29udHJvbHNbbmN0bCArIDFdOworCWN0bC0+aWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoY3RsLT5pZC5uYW1lLCAiVG9uZSBDb250cm9sIC0gVHJlYmxlIik7CisJY3RsLT52Y291bnQgPSAyOworCWN0bC0+Y291bnQgPSAxMDsKKwljdGwtPm1pbiA9IDA7CisJY3RsLT5tYXggPSA0MDsKKwljdGwtPnZhbHVlWzBdID0gY3RsLT52YWx1ZVsxXSA9IDIwOworCWN0bC0+dHJhbnNsYXRpb24gPSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UUkVCTEU7CisKKyNkZWZpbmUgQkFTU19HUFIJMHg4YworI2RlZmluZSBUUkVCTEVfR1BSCTB4OTYKKworCWZvciAoeiA9IDA7IHogPCA1OyB6KyspIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWNvbnRyb2xzW25jdGwgKyAwXS5ncHJbeiAqIDIgKyBqXSA9IEJBU1NfR1BSICsgeiAqIDIgKyBqOworCQkJY29udHJvbHNbbmN0bCArIDFdLmdwclt6ICogMiArIGpdID0gVFJFQkxFX0dQUiArIHogKiAyICsgajsKKwkJfQorCX0KKwlmb3IgKHogPSAwOyB6IDwgNDsgeisrKSB7CQkvKiBmcm9udC9yZWFyL2NlbnRlci1sZmUvc2lkZSAqLworCQlpbnQgaiwgaywgbCwgZDsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewkvKiBsZWZ0L3JpZ2h0ICovCisJCQlrID0gMHhiMCArICh6ICogOCkgKyAoaiAqIDQpOworCQkJbCA9IDB4ZTAgKyAoeiAqIDgpICsgKGogKiA0KTsKKwkJCWQgPSBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiAqIDIgKyBqOworCisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGQpLCBBX0dQUihCQVNTX0dQUiArIDAgKyBqKSk7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEFfR1BSKGsrMSksIEFfR1BSKGspLCBBX0dQUihrKzEpLCBBX0dQUihCQVNTX0dQUiArIDQgKyBqKSk7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEFfR1BSKGspLCBBX0dQUihkKSwgQV9HUFIoayksIEFfR1BSKEJBU1NfR1BSICsgMiArIGopKTsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlNQUNNViwgQV9HUFIoayszKSwgQV9HUFIoaysyKSwgQV9HUFIoayszKSwgQV9HUFIoQkFTU19HUFIgKyA4ICsgaikpOworCQkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKGsrMiksIEFfR1BSX0FDQ1UsIEFfR1BSKGsrMiksIEFfR1BSKEJBU1NfR1BSICsgNiArIGopKTsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihrKzIpLCBBX0dQUihrKzIpLCBBX0dQUihrKzIpLCBBX0NfMDAwMDAwMDApOworCisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGsrMiksIEFfR1BSKFRSRUJMRV9HUFIgKyAwICsgaikpOworCQkJQV9PUChpY29kZSwgJnB0ciwgaU1BQ01WLCBBX0dQUihsKzEpLCBBX0dQUihsKSwgQV9HUFIobCsxKSwgQV9HUFIoVFJFQkxFX0dQUiArIDQgKyBqKSk7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEFfR1BSKGwpLCBBX0dQUihrKzIpLCBBX0dQUihsKSwgQV9HUFIoVFJFQkxFX0dQUiArIDIgKyBqKSk7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEFfR1BSKGwrMyksIEFfR1BSKGwrMiksIEFfR1BSKGwrMyksIEFfR1BSKFRSRUJMRV9HUFIgKyA4ICsgaikpOworCQkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKGwrMiksIEFfR1BSX0FDQ1UsIEFfR1BSKGwrMiksIEFfR1BSKFRSRUJMRV9HUFIgKyA2ICsgaikpOworCQkJQV9PUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEFfR1BSKGwrMiksIEFfQ18wMDAwMDAwMCwgQV9HUFIobCsyKSwgQV9DXzAwMDAwMDEwKTsKKworCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKGQpLCBBX0dQUihsKzIpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisKKwkJCWlmICh6ID09IDIpCS8qIGNlbnRlciAqLworCQkJCWJyZWFrOworCQl9CisJfQorCW5jdGwgKz0gMjsKKworI3VuZGVmIEJBU1NfR1BSCisjdW5kZWYgVFJFQkxFX0dQUgorCisJZm9yICh6ID0gMDsgeiA8IDg7IHorKykgeworCQlBX1NXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMCwgcGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIHosIGdwciArIDApOworCQlBX1NXSVRDSF9ORUcoaWNvZGUsICZwdHIsIHRtcCArIDEsIGdwciArIDApOworCQlBX1NXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMSwgcGxheWJhY2sgKyB6LCB0bXAgKyAxKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyB6KSwgQV9HUFIodG1wICsgMCksIEFfR1BSKHRtcCArIDEpLCBBX0NfMDAwMDAwMDApOworCX0KKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgbmN0bCsrLCAiVG9uZSBDb250cm9sIC0gU3dpdGNoIiwgZ3ByLCAwKTsKKwlncHIgKz0gMjsKKworCS8qIE1hc3RlciB2b2x1bWUgKHdpbGwgYmUgcmVuYW1lZCBsYXRlcikgKi8KKwlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIocGxheWJhY2srMCtTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9HUFIocGxheWJhY2srMCtTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUykpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjaysxK1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIpLCBBX0dQUihwbGF5YmFjaysxK1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSk7CisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzIrU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfR1BSKHBsYXliYWNrKzIrU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpKTsKKwlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIocGxheWJhY2srMytTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9HUFIocGxheWJhY2srMytTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUykpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjays0K1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIpLCBBX0dQUihwbGF5YmFjays0K1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSk7CisJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHBsYXliYWNrKzUrU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfR1BSKHBsYXliYWNrKzUrU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpKTsKKwlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIocGxheWJhY2srNitTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9HUFIocGxheWJhY2srNitTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUykpOworCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjays3K1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSwgQV9DXzAwMDAwMDAwLCBBX0dQUihncHIpLCBBX0dQUihwbGF5YmFjays3K1NORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKSk7CisJc25kX2VtdTEwazFfaW5pdF9tb25vX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJXYXZlIE1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCWdwciArPSAyOworCisJLyogYW5hbG9nIHNwZWFrZXJzICovCisJQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9BRlJPTlRfTCwgQV9FWFRPVVRfQUZST05UX1IsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOworCUFfUFVUX1NURVJFT19PVVRQVVQoQV9FWFRPVVRfQVJFQVJfTCwgQV9FWFRPVVRfQVJFQVJfUiwgcGxheWJhY2srMiArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsKKwlBX1BVVF9PVVRQVVQoQV9FWFRPVVRfQUNFTlRFUiwgcGxheWJhY2srNCArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsKKwlBX1BVVF9PVVRQVVQoQV9FWFRPVVRfQUxGRSwgcGxheWJhY2srNSArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsKKwlpZiAoZW11LT5zcGs3MSkKKwkJQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9BU0lERV9MLCBBX0VYVE9VVF9BU0lERV9SLCBwbGF5YmFjays2ICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOworCisJLyogaGVhZHBob25lICovCisJQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9IRUFEUEhPTkVfTCwgQV9FWFRPVVRfSEVBRFBIT05FX1IsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOworCisJLyogZGlnaXRhbCBvdXRwdXRzICovCisJLyogQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9GUk9OVF9MLCBBX0VYVE9VVF9GUk9OVF9SLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsgKi8KKworCS8qIElFQzk1OCBPcHRpY2FsIFJhdyBQbGF5YmFjayBTd2l0Y2ggKi8gCisJZ3ByX21hcFtncHIrK10gPSAwOworCWdwcl9tYXBbZ3ByKytdID0gMHgxMDA4OworCWdwcl9tYXBbZ3ByKytdID0gMHhmZmZmMDAwMDsKKwlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUih0bXAgKyAyKSwgQV9GWEJVUyhGWEJVU19QVF9MRUZUICsgeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaVNLSVAsIEFfR1BSX0NPTkQsIEFfR1BSX0NPTkQsIEFfR1BSKGdwciAtIDIpLCBBX0NfMDAwMDAwMDEpOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIodG1wICsgMiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDEwMDAwLCBBX0dQUih0bXAgKyAyKSk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBTkRYT1IsIEFfR1BSKHRtcCArIDIpLCBBX0dQUih0bXAgKyAyKSwgQV9HUFIoZ3ByIC0gMSksIEFfQ18wMDAwMDAwMCk7CisJCUFfU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAwLCB0bXAgKyAyLCBncHIgKyB6KTsKKwkJQV9TV0lUQ0hfTkVHKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBncHIgKyB6KTsKKwkJQV9TV0lUQ0goaWNvZGUsICZwdHIsIHRtcCArIDEsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyB6LCB0bXAgKyAxKTsKKwkJaWYgKCh6PT0xKSAmJiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+c3BkaWZfYnVnKSkgeworCQkJLyogRHVlIHRvIGEgU1BESUYgb3V0cHV0IGJ1ZyBvbiBzb21lIEF1ZGlneSBjYXJkcywgdGhpcyBjb2RlIGRlbGF5cyB0aGUgUmlnaHQgY2hhbm5lbCBieSAxIHNhbXBsZSAqLworCQkJc25kX3ByaW50aygiSW5zdGFsbGluZyBzcGRpZl9idWcgcGF0Y2g6ICVzXG4iLCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5uYW1lKTsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVChBX0VYVE9VVF9GUk9OVF9MICsgeiksIEFfR1BSKGdwciAtIDMpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMyksIEFfR1BSKHRtcCArIDApLCBBX0dQUih0bXAgKyAxKSwgQV9DXzAwMDAwMDAwKTsKKwkJfSBlbHNlIHsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVChBX0VYVE9VVF9GUk9OVF9MICsgeiksIEFfR1BSKHRtcCArIDApLCBBX0dQUih0bXAgKyAxKSwgQV9DXzAwMDAwMDAwKTsKKwkJfQorCX0KKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgbmN0bCsrLCAiSUVDOTU4IE9wdGljYWwgUmF3IFBsYXliYWNrIFN3aXRjaCIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisJCisJQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9SRUFSX0wsIEFfRVhUT1VUX1JFQVJfUiwgcGxheWJhY2srMiArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsKKwlBX1BVVF9PVVRQVVQoQV9FWFRPVVRfQ0VOVEVSLCBwbGF5YmFjays0ICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMpOworCUFfUFVUX09VVFBVVChBX0VYVE9VVF9MRkUsIHBsYXliYWNrKzUgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyk7CisKKwkvKiBBREMgYnVmZmVyICovCisjaWZkZWYgRU1VMTBLMV9DQVBUVVJFX0RJR0lUQUxfT1VUCisJQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9BRENfQ0FQX0wsIEFfRVhUT1VUX0FEQ19DQVBfUiwgcGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyk7CisjZWxzZQorCUFfUFVUX09VVFBVVChBX0VYVE9VVF9BRENfQ0FQX0wsIGNhcHR1cmUpOworCUFfUFVUX09VVFBVVChBX0VYVE9VVF9BRENfQ0FQX1IsIGNhcHR1cmUrMSk7CisjZW5kaWYKKworCS8qIEVGWCBjYXB0dXJlIC0gY2FwdHVyZSB0aGUgMTYgRVhUSU5zICovCisJZm9yICh6ID0gMDsgeiA8IDE2OyB6KyspIHsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRlhCVVMyKHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCwgQV9FWFRJTih6KSk7CisJfQorCQorCS8qCisJICogb2ssIHNldCB1cCBkb25lLi4KKwkgKi8KKworCWlmIChncHIgPiB0bXApIHsKKwkJc25kX0JVRygpOworCQllcnIgPSAtRUlPOworCQlnb3RvIF9fZXJyOworCX0KKwkvKiBjbGVhciByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gbWVtb3J5ICovCisJd2hpbGUgKHB0ciA8IDB4NDAwKQorCQlBX09QKGljb2RlLCAmcHRyLCAweDBmLCAweGMwLCAweGMwLCAweGNmLCAweGMwKTsKKworCXNlZyA9IHNuZF9lbnRlcl91c2VyKCk7CisJaWNvZGUtPmdwcl9hZGRfY29udHJvbF9jb3VudCA9IG5jdGw7CisJaWNvZGUtPmdwcl9hZGRfY29udHJvbHMgPSAoZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCBfX3VzZXIgKiljb250cm9sczsKKwllcnIgPSBzbmRfZW11MTBrMV9pY29kZV9wb2tlKGVtdSwgaWNvZGUpOworCXNuZF9sZWF2ZV91c2VyKHNlZyk7CisKKyBfX2VycjoKKwlrZnJlZShjb250cm9scyk7CisJaWYgKGljb2RlICE9IE5VTEwpIHsKKwkJa2ZyZWUoKHZvaWQgKilpY29kZS0+Z3ByX21hcCk7CisJCWtmcmVlKGljb2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogaW5pdGlhbCBEU1AgY29uZmlndXJhdGlvbiBmb3IgRW11MTBrMQorICovCisKKy8qIHdoZW4gdm9sdW1lID0gbWF4LCB0aGVuIGNvcHkgb25seSB0byBhdm9pZCB2b2x1bWUgbW9kaWZpY2F0aW9uICovCisvKiB3aXRoIGlNQUMwIChuZWdhdGl2ZSB2YWx1ZXMpICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgX3ZvbHVtZShlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlLCB1MzIgKnB0ciwgdTMyIGRzdCwgdTMyIHNyYywgdTMyIHZvbCkKK3sKKwlPUChpY29kZSwgcHRyLCBpTUFDMCwgZHN0LCBDXzAwMDAwMDAwLCBzcmMsIHZvbCk7CisJT1AoaWNvZGUsIHB0ciwgaUFORFhPUiwgQ18wMDAwMDAwMCwgdm9sLCBDX2ZmZmZmZmZmLCBDXzdmZmZmZmZmKTsKKwlPUChpY29kZSwgcHRyLCBpU0tJUCwgR1BSX0NPTkQsIEdQUl9DT05ELCBDQ19SRUdfTk9OWkVSTywgQ18wMDAwMDAwMSk7CisJT1AoaWNvZGUsIHB0ciwgaUFDQzMsIGRzdCwgc3JjLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKK30KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBfdm9sdW1lX2FkZChlbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlLCB1MzIgKnB0ciwgdTMyIGRzdCwgdTMyIHNyYywgdTMyIHZvbCkKK3sKKwlPUChpY29kZSwgcHRyLCBpQU5EWE9SLCBDXzAwMDAwMDAwLCB2b2wsIENfZmZmZmZmZmYsIENfN2ZmZmZmZmYpOworCU9QKGljb2RlLCBwdHIsIGlTS0lQLCBHUFJfQ09ORCwgR1BSX0NPTkQsIENDX1JFR19OT05aRVJPLCBDXzAwMDAwMDAyKTsKKwlPUChpY29kZSwgcHRyLCBpTUFDSU5UMCwgZHN0LCBkc3QsIHNyYywgQ18wMDAwMDAwMSk7CisJT1AoaWNvZGUsIHB0ciwgaVNLSVAsIENfMDAwMDAwMDAsIENfN2ZmZmZmZmYsIENfN2ZmZmZmZmYsIENfMDAwMDAwMDEpOworCU9QKGljb2RlLCBwdHIsIGlNQUMwLCBkc3QsIGRzdCwgc3JjLCB2b2wpOworfQorc3RhdGljIHZvaWQgX19kZXZpbml0IF92b2x1bWVfb3V0KGVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGUsIHUzMiAqcHRyLCB1MzIgZHN0LCB1MzIgc3JjLCB1MzIgdm9sKQoreworCU9QKGljb2RlLCBwdHIsIGlBTkRYT1IsIENfMDAwMDAwMDAsIHZvbCwgQ19mZmZmZmZmZiwgQ183ZmZmZmZmZik7CisJT1AoaWNvZGUsIHB0ciwgaVNLSVAsIEdQUl9DT05ELCBHUFJfQ09ORCwgQ0NfUkVHX05PTlpFUk8sIENfMDAwMDAwMDIpOworCU9QKGljb2RlLCBwdHIsIGlBQ0MzLCBkc3QsIHNyYywgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJT1AoaWNvZGUsIHB0ciwgaVNLSVAsIENfMDAwMDAwMDAsIENfN2ZmZmZmZmYsIENfN2ZmZmZmZmYsIENfMDAwMDAwMDEpOworCU9QKGljb2RlLCBwdHIsIGlNQUMwLCBkc3QsIENfMDAwMDAwMDAsIHNyYywgdm9sKTsKK30KKworI2RlZmluZSBWT0xVTUUoaWNvZGUsIHB0ciwgZHN0LCBzcmMsIHZvbCkgXAorCQlfdm9sdW1lKGljb2RlLCBwdHIsIEdQUihkc3QpLCBHUFIoc3JjKSwgR1BSKHZvbCkpCisjZGVmaW5lIFZPTFVNRV9JTihpY29kZSwgcHRyLCBkc3QsIHNyYywgdm9sKSBcCisJCV92b2x1bWUoaWNvZGUsIHB0ciwgR1BSKGRzdCksIEVYVElOKHNyYyksIEdQUih2b2wpKQorI2RlZmluZSBWT0xVTUVfQUREKGljb2RlLCBwdHIsIGRzdCwgc3JjLCB2b2wpIFwKKwkJX3ZvbHVtZV9hZGQoaWNvZGUsIHB0ciwgR1BSKGRzdCksIEdQUihzcmMpLCBHUFIodm9sKSkKKyNkZWZpbmUgVk9MVU1FX0FERElOKGljb2RlLCBwdHIsIGRzdCwgc3JjLCB2b2wpIFwKKwkJX3ZvbHVtZV9hZGQoaWNvZGUsIHB0ciwgR1BSKGRzdCksIEVYVElOKHNyYyksIEdQUih2b2wpKQorI2RlZmluZSBWT0xVTUVfT1VUKGljb2RlLCBwdHIsIGRzdCwgc3JjLCB2b2wpIFwKKwkJX3ZvbHVtZV9vdXQoaWNvZGUsIHB0ciwgRVhUT1VUKGRzdCksIEdQUihzcmMpLCBHUFIodm9sKSkKKyNkZWZpbmUgX1NXSVRDSChpY29kZSwgcHRyLCBkc3QsIHNyYywgc3cpIFwKKwlPUCgoaWNvZGUpLCBwdHIsIGlNQUNJTlQwLCBkc3QsIENfMDAwMDAwMDAsIHNyYywgc3cpOworI2RlZmluZSBTV0lUQ0goaWNvZGUsIHB0ciwgZHN0LCBzcmMsIHN3KSBcCisJCV9TV0lUQ0goaWNvZGUsIHB0ciwgR1BSKGRzdCksIEdQUihzcmMpLCBHUFIoc3cpKQorI2RlZmluZSBTV0lUQ0hfSU4oaWNvZGUsIHB0ciwgZHN0LCBzcmMsIHN3KSBcCisJCV9TV0lUQ0goaWNvZGUsIHB0ciwgR1BSKGRzdCksIEVYVElOKHNyYyksIEdQUihzdykpCisjZGVmaW5lIF9TV0lUQ0hfTkVHKGljb2RlLCBwdHIsIGRzdCwgc3JjKSBcCisJT1AoKGljb2RlKSwgcHRyLCBpQU5EWE9SLCBkc3QsIHNyYywgQ18wMDAwMDAwMSwgQ18wMDAwMDAwMSk7CisjZGVmaW5lIFNXSVRDSF9ORUcoaWNvZGUsIHB0ciwgZHN0LCBzcmMpIFwKKwkJX1NXSVRDSF9ORUcoaWNvZGUsIHB0ciwgR1BSKGRzdCksIEdQUihzcmMpKQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IF9zbmRfZW11MTBrMV9pbml0X2VmeChlbXUxMGsxX3QgKmVtdSkKK3sKKwlpbnQgZXJyLCBpLCB6LCBncHIsIHRtcCwgcGxheWJhY2ssIGNhcHR1cmU7CisJdTMyIHB0cjsKKwllbXUxMGsxX2Z4ODAxMF9jb2RlX3QgKmljb2RlOworCWVtdTEwazFfZng4MDEwX3BjbV90ICppcGNtID0gTlVMTDsKKwllbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90ICpjb250cm9scyA9IE5VTEwsICpjdGw7CisJdTMyICpncHJfbWFwOworCW1tX3NlZ21lbnRfdCBzZWc7CisKKwlzcGluX2xvY2tfaW5pdCgmZW11LT5meDgwMTAuaXJxX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZlbXUtPmZ4ODAxMC5ncHJfY3RsKTsKKworCWlmICgoaWNvZGUgPSBrY2FsbG9jKDEsIHNpemVvZigqaWNvZGUpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChpY29kZS0+Z3ByX21hcCA9ICh1X2ludDMyX3QgX191c2VyICopa2NhbGxvYygyNTYgKyAxNjAgKyAxNjAgKyAyICogNTEyLCBzaXplb2YodV9pbnQzMl90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwgfHwKKyAgICAgICAgICAgIChjb250cm9scyA9IGtjYWxsb2MoU05EX0VNVTEwSzFfR1BSX0NPTlRST0xTLCBzaXplb2YoZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMIHx8CisJICAgIChpcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmlwY20pLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIF9fZXJyOworCX0KKwlncHJfbWFwID0gKHUzMiAqKWljb2RlLT5ncHJfbWFwOworCisJaWNvZGUtPnRyYW1fZGF0YV9tYXAgPSBpY29kZS0+Z3ByX21hcCArIDI1NjsKKwlpY29kZS0+dHJhbV9hZGRyX21hcCA9IGljb2RlLT50cmFtX2RhdGFfbWFwICsgMTYwOworCWljb2RlLT5jb2RlID0gaWNvZGUtPnRyYW1fYWRkcl9tYXAgKyAxNjA7CisJCisJLyogY2xlYXIgZnJlZSBHUFJzICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlzZXRfYml0KGksIGljb2RlLT5ncHJfdmFsaWQpOworCisJLyogY2xlYXIgVFJBTSBkYXRhICYgYWRkcmVzcyBsaW5lcyAqLworCWZvciAoaSA9IDA7IGkgPCAxNjA7IGkrKykKKwkJc2V0X2JpdChpLCBpY29kZS0+dHJhbV92YWxpZCk7CisKKwlzdHJjcHkoaWNvZGUtPm5hbWUsICJTQiBMaXZlISBGWDgwMTAgY29kZSBmb3IgQUxTQSB2MS4yIGJ5IEphcm9zbGF2IEt5c2VsYSIpOworCXB0ciA9IDA7IGkgPSAwOworCS8qIHdlIGhhdmUgMTAgaW5wdXRzICovCisJcGxheWJhY2sgPSBTTkRfRU1VMTBLMV9JTlBVVFM7CisJLyogd2UgaGF2ZSA2IHBsYXliYWNrIGNoYW5uZWxzIGFuZCB0b25lIGNvbnRyb2wgZG91YmxlcyAqLworCWNhcHR1cmUgPSBwbGF5YmFjayArIChTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyAqIDIpOworCWdwciA9IGNhcHR1cmUgKyBTTkRfRU1VMTBLMV9DQVBUVVJFX0NIQU5ORUxTOworCXRtcCA9IDB4ODg7CS8qIHdlIG5lZWQgNCB0ZW1wb3JhcnkgR1BSICovCisJLyogZnJvbSAweDhjIHRvIDB4ZmYgaXMgdGhlIGFyZWEgZm9yIHRvbmUgY29udHJvbCAqLworCisJLyogc3RvcCBGWCBwcm9jZXNzb3IgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIChlbXUtPmZ4ODAxMC5kYmcgPSAwKSB8IEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQKTsKKworCS8qCisJICogIFByb2Nlc3MgRlggQnVzZXMKKwkgKi8KKwlPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEdQUigwKSwgQ18wMDAwMDAwMCwgRlhCVVMoRlhCVVNfUENNX0xFRlQpLCBDXzAwMDAwMDA0KTsKKwlPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEdQUigxKSwgQ18wMDAwMDAwMCwgRlhCVVMoRlhCVVNfUENNX1JJR0hUKSwgQ18wMDAwMDAwNCk7CisJT1AoaWNvZGUsICZwdHIsIGlNQUNJTlQwLCBHUFIoMiksIENfMDAwMDAwMDAsIEZYQlVTKEZYQlVTX01JRElfTEVGVCksIENfMDAwMDAwMDQpOworCU9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgR1BSKDMpLCBDXzAwMDAwMDAwLCBGWEJVUyhGWEJVU19NSURJX1JJR0hUKSwgQ18wMDAwMDAwNCk7CisJT1AoaWNvZGUsICZwdHIsIGlNQUNJTlQwLCBHUFIoNCksIENfMDAwMDAwMDAsIEZYQlVTKEZYQlVTX1BDTV9MRUZUX1JFQVIpLCBDXzAwMDAwMDA0KTsKKwlPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEdQUig1KSwgQ18wMDAwMDAwMCwgRlhCVVMoRlhCVVNfUENNX1JJR0hUX1JFQVIpLCBDXzAwMDAwMDA0KTsKKwlPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEdQUig2KSwgQ18wMDAwMDAwMCwgRlhCVVMoRlhCVVNfUENNX0NFTlRFUiksIENfMDAwMDAwMDQpOworCU9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgR1BSKDcpLCBDXzAwMDAwMDAwLCBGWEJVUyhGWEJVU19QQ01fTEZFKSwgQ18wMDAwMDAwNCk7CisJT1AoaWNvZGUsICZwdHIsIGlNQUNJTlQwLCBHUFIoOCksIENfMDAwMDAwMDAsIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOwkvKiBTL1BESUYgbGVmdCAqLworCU9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgR1BSKDkpLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsJLyogUy9QRElGIHJpZ2h0ICovCisKKwkvKiBSYXcgUy9QRElGIFBDTSAqLworCWlwY20tPnN1YnN0cmVhbSA9IDA7CisJaXBjbS0+Y2hhbm5lbHMgPSAyOworCWlwY20tPnRyYW1fc3RhcnQgPSAwOworCWlwY20tPmJ1ZmZlcl9zaXplID0gKDY0ICogMTAyNCkgLyAyOworCWlwY20tPmdwcl9zaXplID0gZ3ByKys7CisJaXBjbS0+Z3ByX3B0ciA9IGdwcisrOworCWlwY20tPmdwcl9jb3VudCA9IGdwcisrOworCWlwY20tPmdwcl90bXBjb3VudCA9IGdwcisrOworCWlwY20tPmdwcl90cmlnZ2VyID0gZ3ByKys7CisJaXBjbS0+Z3ByX3J1bm5pbmcgPSBncHIrKzsKKwlpcGNtLT5ldHJhbVswXSA9IDA7CisJaXBjbS0+ZXRyYW1bMV0gPSAxOworCisJZ3ByX21hcFtncHIgKyAwXSA9IDB4ZmZmZmYwMDA7CisJZ3ByX21hcFtncHIgKyAxXSA9IDB4ZmZmZjAwMDA7CisJZ3ByX21hcFtncHIgKyAyXSA9IDB4NzAwMDAwMDA7CisJZ3ByX21hcFtncHIgKyAzXSA9IDB4MDAwMDAwMDc7CisJZ3ByX21hcFtncHIgKyA0XSA9IDB4MDAxZiA8PCAxMTsKKwlncHJfbWFwW2dwciArIDVdID0gMHgwMDFjIDw8IDExOworCWdwcl9tYXBbZ3ByICsgNl0gPSAoMHgyMiAgLSAweDAxKSAtIDE7CS8qIHNraXAgYXQgMDEgdG8gMjIgKi8KKwlncHJfbWFwW2dwciArIDddID0gKDB4MjIgIC0gMHgwNikgLSAxOwkvKiBza2lwIGF0IDA2IHRvIDIyICovCisJZ3ByX21hcFtncHIgKyA4XSA9IDB4MjAwMDAwMCArICgyPDwxMSk7CisJZ3ByX21hcFtncHIgKyA5XSA9IDB4NDAwMDAwMCArICgyPDwxMSk7CisJZ3ByX21hcFtncHIgKyAxMF0gPSAxPDwxMTsKKwlncHJfbWFwW2dwciArIDExXSA9ICgweDI0IC0gMHgwYSkgLSAxOwkvKiBza2lwIGF0IDBhIHRvIDI0ICovCisJZ3ByX21hcFtncHIgKyAxMl0gPSAwOworCisJLyogaWYgdGhlIHRyaWdnZXIgZmxhZyBpcyBub3Qgc2V0LCBza2lwICovCisJLyogMDA6ICovIE9QKGljb2RlLCAmcHRyLCBpTUFDMCwgQ18wMDAwMDAwMCwgR1BSKGlwY20tPmdwcl90cmlnZ2VyKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJLyogMDE6ICovIE9QKGljb2RlLCAmcHRyLCBpU0tJUCwgR1BSX0NPTkQsIEdQUl9DT05ELCBDQ19SRUdfWkVSTywgR1BSKGdwciArIDYpKTsKKwkvKiBpZiB0aGUgcnVubmluZyBmbGFnIGlzIHNldCwgd2UncmUgcnVubmluZyAqLworCS8qIDAyOiAqLyBPUChpY29kZSwgJnB0ciwgaU1BQzAsIENfMDAwMDAwMDAsIEdQUihpcGNtLT5ncHJfcnVubmluZyksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCS8qIDAzOiAqLyBPUChpY29kZSwgJnB0ciwgaVNLSVAsIEdQUl9DT05ELCBHUFJfQ09ORCwgQ0NfUkVHX05PTlpFUk8sIENfMDAwMDAwMDQpOworCS8qIHdhaXQgdW50aWwgKChHUFJfREJBQz4+MTEpICYgMHgxZikgPT0gMHgxYykgKi8KKwkvKiAwNDogKi8gT1AoaWNvZGUsICZwdHIsIGlBTkRYT1IsIEdQUih0bXAgKyAwKSwgR1BSX0RCQUMsIEdQUihncHIgKyA0KSwgQ18wMDAwMDAwMCk7CisJLyogMDU6ICovIE9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgQ18wMDAwMDAwMCwgR1BSKHRtcCArIDApLCBDX2ZmZmZmZmZmLCBHUFIoZ3ByICsgNSkpOworCS8qIDA2OiAqLyBPUChpY29kZSwgJnB0ciwgaVNLSVAsIEdQUl9DT05ELCBHUFJfQ09ORCwgQ0NfUkVHX05PTlpFUk8sIEdQUihncHIgKyA3KSk7CisJLyogMDc6ICovIE9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKGdwciArIDEyKSwgQ18wMDAwMDAxMCwgQ18wMDAwMDAwMSwgQ18wMDAwMDAwMCk7CisKKwkvKiAwODogKi8gT1AoaWNvZGUsICZwdHIsIGlBTkRYT1IsIEdQUihpcGNtLT5ncHJfcnVubmluZyksIEdQUihpcGNtLT5ncHJfcnVubmluZyksIENfMDAwMDAwMDAsIENfMDAwMDAwMDEpOworCS8qIDA5OiAqLyBPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUihncHIgKyAxMiksIEdQUihncHIgKyAxMiksIENfZmZmZmZmZmYsIENfMDAwMDAwMDApOworCS8qIDBhOiAqLyBPUChpY29kZSwgJnB0ciwgaVNLSVAsIEdQUl9DT05ELCBHUFJfQ09ORCwgQ0NfUkVHX05PTlpFUk8sIEdQUihncHIgKyAxMSkpOworCS8qIDBiOiAqLyBPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUihncHIgKyAxMiksIENfMDAwMDAwMDEsIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCisJLyogMGM6ICovIE9QKGljb2RlLCAmcHRyLCBpQU5EWE9SLCBHUFIodG1wICsgMCksIEVUUkFNX0RBVEEoaXBjbS0+ZXRyYW1bMF0pLCBHUFIoZ3ByICsgMCksIENfMDAwMDAwMDApOworCS8qIDBkOiAqLyBPUChpY29kZSwgJnB0ciwgaUxPRywgR1BSKHRtcCArIDApLCBHUFIodG1wICsgMCksIEdQUihncHIgKyAzKSwgQ18wMDAwMDAwMCk7CisJLyogMGU6ICovIE9QKGljb2RlLCAmcHRyLCBpQU5EWE9SLCBHUFIoOCksIEdQUih0bXAgKyAwKSwgR1BSKGdwciArIDEpLCBHUFIoZ3ByICsgMikpOworCS8qIDBmOiAqLyBPUChpY29kZSwgJnB0ciwgaVNLSVAsIENfMDAwMDAwMDAsIEdQUl9DT05ELCBDQ19SRUdfTUlOVVMsIENfMDAwMDAwMDEpOworCS8qIDEwOiAqLyBPUChpY29kZSwgJnB0ciwgaUFORFhPUiwgR1BSKDgpLCBHUFIoOCksIEdQUihncHIgKyAxKSwgR1BSKGdwciArIDIpKTsKKworCS8qIDExOiAqLyBPUChpY29kZSwgJnB0ciwgaUFORFhPUiwgR1BSKHRtcCArIDApLCBFVFJBTV9EQVRBKGlwY20tPmV0cmFtWzFdKSwgR1BSKGdwciArIDApLCBDXzAwMDAwMDAwKTsKKwkvKiAxMjogKi8gT1AoaWNvZGUsICZwdHIsIGlMT0csIEdQUih0bXAgKyAwKSwgR1BSKHRtcCArIDApLCBHUFIoZ3ByICsgMyksIENfMDAwMDAwMDApOworCS8qIDEzOiAqLyBPUChpY29kZSwgJnB0ciwgaUFORFhPUiwgR1BSKDkpLCBHUFIodG1wICsgMCksIEdQUihncHIgKyAxKSwgR1BSKGdwciArIDIpKTsKKwkvKiAxNDogKi8gT1AoaWNvZGUsICZwdHIsIGlTS0lQLCBDXzAwMDAwMDAwLCBHUFJfQ09ORCwgQ0NfUkVHX01JTlVTLCBDXzAwMDAwMDAxKTsKKwkvKiAxNTogKi8gT1AoaWNvZGUsICZwdHIsIGlBTkRYT1IsIEdQUig5KSwgR1BSKDkpLCBHUFIoZ3ByICsgMSksIEdQUihncHIgKyAyKSk7CisKKwkvKiAxNjogKi8gT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIodG1wICsgMCksIEdQUihpcGNtLT5ncHJfcHRyKSwgQ18wMDAwMDAwMSwgQ18wMDAwMDAwMCk7CisJLyogMTc6ICovIE9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgQ18wMDAwMDAwMCwgR1BSKHRtcCArIDApLCBDX2ZmZmZmZmZmLCBHUFIoaXBjbS0+Z3ByX3NpemUpKTsKKwkvKiAxODogKi8gT1AoaWNvZGUsICZwdHIsIGlTS0lQLCBHUFJfQ09ORCwgR1BSX0NPTkQsIENDX1JFR19NSU5VUywgQ18wMDAwMDAwMSk7CisJLyogMTk6ICovIE9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKHRtcCArIDApLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKwkvKiAxYTogKi8gT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIoaXBjbS0+Z3ByX3B0ciksIEdQUih0bXAgKyAwKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJCisJLyogMWI6ICovIE9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKGlwY20tPmdwcl90bXBjb3VudCksIEdQUihpcGNtLT5ncHJfdG1wY291bnQpLCBDX2ZmZmZmZmZmLCBDXzAwMDAwMDAwKTsKKwkvKiAxYzogKi8gT1AoaWNvZGUsICZwdHIsIGlTS0lQLCBHUFJfQ09ORCwgR1BSX0NPTkQsIENDX1JFR19OT05aRVJPLCBDXzAwMDAwMDAyKTsKKwkvKiAxZDogKi8gT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIoaXBjbS0+Z3ByX3RtcGNvdW50KSwgR1BSKGlwY20tPmdwcl9jb3VudCksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCS8qIDFlOiAqLyBPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUl9JUlEsIENfODAwMDAwMDAsIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCS8qIDFmOiAqLyBPUChpY29kZSwgJnB0ciwgaUFORFhPUiwgR1BSKGlwY20tPmdwcl9ydW5uaW5nKSwgR1BSKGlwY20tPmdwcl9ydW5uaW5nKSwgQ18wMDAwMDAwMSwgQ18wMDAxMDAwMCk7CisKKwkvKiAyMDogKi8gT1AoaWNvZGUsICZwdHIsIGlBTkRYT1IsIEdQUihpcGNtLT5ncHJfcnVubmluZyksIEdQUihpcGNtLT5ncHJfcnVubmluZyksIENfMDAwMTAwMDAsIENfMDAwMDAwMDEpOworCS8qIDIxOiAqLyBPUChpY29kZSwgJnB0ciwgaVNLSVAsIENfMDAwMDAwMDAsIENfN2ZmZmZmZmYsIENfN2ZmZmZmZmYsIENfMDAwMDAwMDIpOworCisJLyogMjI6ICovIE9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMSwgRVRSQU1fQUREUihpcGNtLT5ldHJhbVswXSksIEdQUihncHIgKyA4KSwgR1BSX0RCQUMsIENfZmZmZmZmZmYpOworCS8qIDIzOiAqLyBPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDEsIEVUUkFNX0FERFIoaXBjbS0+ZXRyYW1bMV0pLCBHUFIoZ3ByICsgOSksIEdQUl9EQkFDLCBDX2ZmZmZmZmZmKTsKKworCS8qIDI0OiAqLworCWdwciArPSAxMzsKKworCS8qIFdhdmUgUGxheWJhY2sgVm9sdW1lICovCisJZm9yICh6ID0gMDsgeiA8IDI7IHorKykKKwkJVk9MVU1FKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIHosIHosIGdwciArIHopOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJXYXZlIFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMTAwKTsKKwlncHIgKz0gMjsKKworCS8qIFdhdmUgU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lICovCisJZm9yICh6ID0gMDsgeiA8IDI7IHorKykKKwkJVk9MVU1FKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIDIgKyB6LCB6LCBncHIgKyB6KTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiV2F2ZSBTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCWdwciArPSAyOworCQorCS8qIFdhdmUgQ2VudGVyL0xGRSBQbGF5YmFjayBWb2x1bWUgKi8KKwlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUih0bXAgKyAwKSwgRlhCVVMoRlhCVVNfUENNX0xFRlQpLCBGWEJVUyhGWEJVU19QQ01fUklHSFQpLCBDXzAwMDAwMDAwKTsKKwlPUChpY29kZSwgJnB0ciwgaU1BQ0lOVDAsIEdQUih0bXAgKyAwKSwgQ18wMDAwMDAwMCwgR1BSKHRtcCArIDApLCBDXzAwMDAwMDAyKTsKKwlWT0xVTUUoaWNvZGUsICZwdHIsIHBsYXliYWNrICsgNCwgdG1wICsgMCwgZ3ByKTsKKwlzbmRfZW11MTBrMV9pbml0X21vbm9fY29udHJvbChjb250cm9scyArIGkrKywgIldhdmUgQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIGdwcisrLCAwKTsKKwlWT0xVTUUoaWNvZGUsICZwdHIsIHBsYXliYWNrICsgNSwgdG1wICsgMCwgZ3ByKTsKKwlzbmRfZW11MTBrMV9pbml0X21vbm9fY29udHJvbChjb250cm9scyArIGkrKywgIldhdmUgTEZFIFBsYXliYWNrIFZvbHVtZSIsIGdwcisrLCAwKTsKKworCS8qIFdhdmUgQ2FwdHVyZSBWb2x1bWUgKyBTd2l0Y2ggKi8KKwlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCVNXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMCwgeiwgZ3ByICsgMiArIHopOworCQlWT0xVTUUoaWNvZGUsICZwdHIsIGNhcHR1cmUgKyB6LCB0bXAgKyAwLCBncHIgKyB6KTsKKwl9CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIldhdmUgQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJXYXZlIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJZ3ByICs9IDQ7CisKKwkvKiBTeW50aCBQbGF5YmFjayBWb2x1bWUgKi8KKwlmb3IgKHogPSAwOyB6IDwgMjsgeisrKQorCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIHosIDIgKyB6LCBncHIgKyB6KTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiU3ludGggUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAxMDApOworCWdwciArPSAyOworCisJLyogU3ludGggQ2FwdHVyZSBWb2x1bWUgKyBTd2l0Y2ggKi8KKwlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCVNXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMCwgMiArIHosIGdwciArIDIgKyB6KTsKKwkJVk9MVU1FX0FERChpY29kZSwgJnB0ciwgY2FwdHVyZSArIHosIHRtcCArIDAsIGdwciArIHopOworCX0KKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiU3ludGggQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJTeW50aCBDYXB0dXJlIFN3aXRjaCIsIGdwciArIDIsIDApOworCWdwciArPSA0OworCisJLyogU3Vycm91bmQgRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUgKHJlbmFtZWQgbGF0ZXIgd2l0aG91dCBEaWdpdGFsKSAqLworCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCVZPTFVNRV9BREQoaWNvZGUsICZwdHIsIHBsYXliYWNrICsgMiArIHosIDQgKyB6LCBncHIgKyB6KTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiU3Vycm91bmQgRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDEwMCk7CisJZ3ByICs9IDI7CisKKwkvKiBTdXJyb3VuZCBDYXB0dXJlIFZvbHVtZSArIFN3aXRjaCAqLworCWZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKwkJU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAwLCA0ICsgeiwgZ3ByICsgMiArIHopOworCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBjYXB0dXJlICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJfQorCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJTdXJyb3VuZCBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIlN1cnJvdW5kIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJZ3ByICs9IDQ7CisKKwkvKiBDZW50ZXIgUGxheWJhY2sgVm9sdW1lIChyZW5hbWVkIGxhdGVyIHdpdGhvdXQgRGlnaXRhbCkgKi8KKwlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIDQsIDYsIGdwcik7CisJc25kX2VtdTEwazFfaW5pdF9tb25vX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJDZW50ZXIgRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBncHIrKywgMTAwKTsKKworCS8qIExGRSBQbGF5YmFjayBWb2x1bWUgKyBTd2l0Y2ggKHJlbmFtZWQgbGF0ZXIgd2l0aG91dCBEaWdpdGFsKSAqLworCVZPTFVNRV9BREQoaWNvZGUsICZwdHIsIHBsYXliYWNrICsgNSwgNywgZ3ByKTsKKwlzbmRfZW11MTBrMV9pbml0X21vbm9fY29udHJvbChjb250cm9scyArIGkrKywgIkxGRSBEaWdpdGFsIFBsYXliYWNrIFZvbHVtZSIsIGdwcisrLCAxMDApOworCisJLyoKKwkgKiAgUHJvY2VzcyBpbnB1dHMKKwkgKi8KKworCWlmIChlbXUtPmZ4ODAxMC5leHRpbl9tYXNrICYgKCgxPDxFWFRJTl9BQzk3X0wpfCgxPDxFWFRJTl9BQzk3X1IpKSkgeworCQkvKiBBQyc5NyBQbGF5YmFjayBWb2x1bWUgKi8KKwkJVk9MVU1FX0FERElOKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIDAsIEVYVElOX0FDOTdfTCwgZ3ByKTsgZ3ByKys7CisJCVZPTFVNRV9BRERJTihpY29kZSwgJnB0ciwgcGxheWJhY2sgKyAxLCBFWFRJTl9BQzk3X1IsIGdwcik7IGdwcisrOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiQUM5NyBQbGF5YmFjayBWb2x1bWUiLCBncHItMiwgMCk7CisJCS8qIEFDJzk3IENhcHR1cmUgVm9sdW1lICovCisJCVZPTFVNRV9BRERJTihpY29kZSwgJnB0ciwgY2FwdHVyZSArIDAsIEVYVElOX0FDOTdfTCwgZ3ByKTsgZ3ByKys7CisJCVZPTFVNRV9BRERJTihpY29kZSwgJnB0ciwgY2FwdHVyZSArIDEsIEVYVElOX0FDOTdfUiwgZ3ByKTsgZ3ByKys7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJBQzk3IENhcHR1cmUgVm9sdW1lIiwgZ3ByLTIsIDEwMCk7CisJfQorCQorCWlmIChlbXUtPmZ4ODAxMC5leHRpbl9tYXNrICYgKCgxPDxFWFRJTl9TUERJRl9DRF9MKXwoMTw8RVhUSU5fU1BESUZfQ0RfUikpKSB7CisJCS8qIElFQzk1OCBUVEwgUGxheWJhY2sgVm9sdW1lICovCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCQlWT0xVTUVfQURESU4oaWNvZGUsICZwdHIsIHBsYXliYWNrICsgeiwgRVhUSU5fU1BESUZfQ0RfTCArIHosIGdwciArIHopOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IFRUTCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCQlncHIgKz0gMjsKKwkKKwkJLyogSUVDOTU4IFRUTCBDYXB0dXJlIFZvbHVtZSArIFN3aXRjaCAqLworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCQlTV0lUQ0hfSU4oaWNvZGUsICZwdHIsIHRtcCArIDAsIEVYVElOX1NQRElGX0NEX0wgKyB6LCBncHIgKyAyICsgeik7CisJCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBjYXB0dXJlICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJCX0KKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBUVEwgQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IFRUTCBDYXB0dXJlIFN3aXRjaCIsIGdwciArIDIsIDApOworCQlncHIgKz0gNDsKKwl9CisJCisJaWYgKGVtdS0+Zng4MDEwLmV4dGluX21hc2sgJiAoKDE8PEVYVElOX1pPT01fTCl8KDE8PEVYVElOX1pPT01fUikpKSB7CisJCS8qIFpvb20gVmlkZW8gUGxheWJhY2sgVm9sdW1lICovCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCQlWT0xVTUVfQURESU4oaWNvZGUsICZwdHIsIHBsYXliYWNrICsgeiwgRVhUSU5fWk9PTV9MICsgeiwgZ3ByICsgeik7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJab29tIFZpZGVvIFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMCk7CisJCWdwciArPSAyOworCQorCQkvKiBab29tIFZpZGVvIENhcHR1cmUgVm9sdW1lICsgU3dpdGNoICovCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKwkJCVNXSVRDSF9JTihpY29kZSwgJnB0ciwgdG1wICsgMCwgRVhUSU5fWk9PTV9MICsgeiwgZ3ByICsgMiArIHopOworCQkJVk9MVU1FX0FERChpY29kZSwgJnB0ciwgY2FwdHVyZSArIHosIHRtcCArIDAsIGdwciArIHopOworCQl9CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJab29tIFZpZGVvIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIlpvb20gVmlkZW8gQ2FwdHVyZSBTd2l0Y2giLCBncHIgKyAyLCAwKTsKKwkJZ3ByICs9IDQ7CisJfQorCQorCWlmIChlbXUtPmZ4ODAxMC5leHRpbl9tYXNrICYgKCgxPDxFWFRJTl9UT1NMSU5LX0wpfCgxPDxFWFRJTl9UT1NMSU5LX1IpKSkgeworCQkvKiBJRUM5NTggT3B0aWNhbCBQbGF5YmFjayBWb2x1bWUgKi8KKwkJZm9yICh6ID0gMDsgeiA8IDI7IHorKykKKwkJCVZPTFVNRV9BRERJTihpY29kZSwgJnB0ciwgcGxheWJhY2sgKyB6LCBFWFRJTl9UT1NMSU5LX0wgKyB6LCBncHIgKyB6KTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBMaXZlRHJpdmUgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJZ3ByICs9IDI7CisJCisJCS8qIElFQzk1OCBPcHRpY2FsIENhcHR1cmUgVm9sdW1lICovCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKwkJCVNXSVRDSF9JTihpY29kZSwgJnB0ciwgdG1wICsgMCwgRVhUSU5fVE9TTElOS19MICsgeiwgZ3ByICsgMiArIHopOworCQkJVk9MVU1FX0FERChpY29kZSwgJnB0ciwgY2FwdHVyZSArIHosIHRtcCArIDAsIGdwciArIHopOworCQl9CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJJRUM5NTggTGl2ZURyaXZlIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBMaXZlRHJpdmUgQ2FwdHVyZSBTd2l0Y2giLCBncHIgKyAyLCAwKTsKKwkJZ3ByICs9IDQ7CisJfQorCQorCWlmIChlbXUtPmZ4ODAxMC5leHRpbl9tYXNrICYgKCgxPDxFWFRJTl9MSU5FMV9MKXwoMTw8RVhUSU5fTElORTFfUikpKSB7CisJCS8qIExpbmUgTGl2ZURyaXZlIFBsYXliYWNrIFZvbHVtZSAqLworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKQorCQkJVk9MVU1FX0FERElOKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIHosIEVYVElOX0xJTkUxX0wgKyB6LCBncHIgKyB6KTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIkxpbmUgTGl2ZURyaXZlIFBsYXliYWNrIFZvbHVtZSIsIGdwciwgMCk7CisJCWdwciArPSAyOworCQorCQkvKiBMaW5lIExpdmVEcml2ZSBDYXB0dXJlIFZvbHVtZSArIFN3aXRjaCAqLworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCQlTV0lUQ0hfSU4oaWNvZGUsICZwdHIsIHRtcCArIDAsIEVYVElOX0xJTkUxX0wgKyB6LCBncHIgKyAyICsgeik7CisJCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBjYXB0dXJlICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJCX0KKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIkxpbmUgTGl2ZURyaXZlIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIkxpbmUgTGl2ZURyaXZlIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJCWdwciArPSA0OworCX0KKwkKKwlpZiAoZW11LT5meDgwMTAuZXh0aW5fbWFzayAmICgoMTw8RVhUSU5fQ09BWF9TUERJRl9MKXwoMTw8RVhUSU5fQ09BWF9TUERJRl9SKSkpIHsKKwkJLyogSUVDOTU4IENvYXggUGxheWJhY2sgVm9sdW1lICovCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCQlWT0xVTUVfQURESU4oaWNvZGUsICZwdHIsIHBsYXliYWNrICsgeiwgRVhUSU5fQ09BWF9TUERJRl9MICsgeiwgZ3ByICsgeik7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJJRUM5NTggQ29heGlhbCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCQlncHIgKz0gMjsKKwkKKwkJLyogSUVDOTU4IENvYXggQ2FwdHVyZSBWb2x1bWUgKyBTd2l0Y2ggKi8KKwkJZm9yICh6ID0gMDsgeiA8IDI7IHorKykgeworCQkJU1dJVENIX0lOKGljb2RlLCAmcHRyLCB0bXAgKyAwLCBFWFRJTl9DT0FYX1NQRElGX0wgKyB6LCBncHIgKyAyICsgeik7CisJCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBjYXB0dXJlICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJCX0KKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBDb2F4aWFsIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBDb2F4aWFsIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJCWdwciArPSA0OworCX0KKwkKKwlpZiAoZW11LT5meDgwMTAuZXh0aW5fbWFzayAmICgoMTw8RVhUSU5fTElORTJfTCl8KDE8PEVYVElOX0xJTkUyX1IpKSkgeworCQkvKiBMaW5lIExpdmVEcml2ZSBQbGF5YmFjayBWb2x1bWUgKi8KKwkJZm9yICh6ID0gMDsgeiA8IDI7IHorKykKKwkJCVZPTFVNRV9BRERJTihpY29kZSwgJnB0ciwgcGxheWJhY2sgKyB6LCBFWFRJTl9MSU5FMl9MICsgeiwgZ3ByICsgeik7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJMaW5lMiBMaXZlRHJpdmUgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJY29udHJvbHNbaS0xXS5pZC5pbmRleCA9IDE7CisJCWdwciArPSAyOworCQorCQkvKiBMaW5lIExpdmVEcml2ZSBDYXB0dXJlIFZvbHVtZSAqLworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCQlTV0lUQ0hfSU4oaWNvZGUsICZwdHIsIHRtcCArIDAsIEVYVElOX0xJTkUyX0wgKyB6LCBncHIgKyAyICsgeik7CisJCQlWT0xVTUVfQUREKGljb2RlLCAmcHRyLCBjYXB0dXJlICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJCX0KKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIkxpbmUyIExpdmVEcml2ZSBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJCWNvbnRyb2xzW2ktMV0uaWQuaW5kZXggPSAxOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiTGluZTIgTGl2ZURyaXZlIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJCWNvbnRyb2xzW2ktMV0uaWQuaW5kZXggPSAxOworCQlncHIgKz0gNDsKKwl9CisKKwkvKgorCSAqICBQcm9jZXNzIHRvbmUgY29udHJvbAorCSAqLworCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyAwKSwgR1BSKHBsYXliYWNrICsgMCksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOyAvKiBsZWZ0ICovCisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDEpLCBHUFIocGxheWJhY2sgKyAxKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7IC8qIHJpZ2h0ICovCisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDIpLCBHUFIocGxheWJhY2sgKyAyKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7IC8qIHJlYXIgbGVmdCAqLworCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyAzKSwgR1BSKHBsYXliYWNrICsgMyksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOyAvKiByZWFyIHJpZ2h0ICovCisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDQpLCBHUFIocGxheWJhY2sgKyA0KSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7IC8qIGNlbnRlciAqLworCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyA1KSwgR1BSKHBsYXliYWNrICsgNSksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOyAvKiBMRkUgKi8KKworCWN0bCA9ICZjb250cm9sc1tpICsgMF07CisJY3RsLT5pZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXN0cmNweShjdGwtPmlkLm5hbWUsICJUb25lIENvbnRyb2wgLSBCYXNzIik7CisJY3RsLT52Y291bnQgPSAyOworCWN0bC0+Y291bnQgPSAxMDsKKwljdGwtPm1pbiA9IDA7CisJY3RsLT5tYXggPSA0MDsKKwljdGwtPnZhbHVlWzBdID0gY3RsLT52YWx1ZVsxXSA9IDIwOworCWN0bC0+dHJhbnNsYXRpb24gPSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9CQVNTOworCWN0bCA9ICZjb250cm9sc1tpICsgMV07CisJY3RsLT5pZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXN0cmNweShjdGwtPmlkLm5hbWUsICJUb25lIENvbnRyb2wgLSBUcmVibGUiKTsKKwljdGwtPnZjb3VudCA9IDI7CisJY3RsLT5jb3VudCA9IDEwOworCWN0bC0+bWluID0gMDsKKwljdGwtPm1heCA9IDQwOworCWN0bC0+dmFsdWVbMF0gPSBjdGwtPnZhbHVlWzFdID0gMjA7CisJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RSRUJMRTsKKworI2RlZmluZSBCQVNTX0dQUgkweDhjCisjZGVmaW5lIFRSRUJMRV9HUFIJMHg5NgorCisJZm9yICh6ID0gMDsgeiA8IDU7IHorKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJY29udHJvbHNbaSArIDBdLmdwclt6ICogMiArIGpdID0gQkFTU19HUFIgKyB6ICogMiArIGo7CisJCQljb250cm9sc1tpICsgMV0uZ3ByW3ogKiAyICsgal0gPSBUUkVCTEVfR1BSICsgeiAqIDIgKyBqOworCQl9CisJfQorCWZvciAoeiA9IDA7IHogPCAzOyB6KyspIHsJCS8qIGZyb250L3JlYXIvY2VudGVyLWxmZSAqLworCQlpbnQgaiwgaywgbCwgZDsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewkvKiBsZWZ0L3JpZ2h0ICovCisJCQlrID0gMHhhMCArICh6ICogOCkgKyAoaiAqIDQpOworCQkJbCA9IDB4ZDAgKyAoeiAqIDgpICsgKGogKiA0KTsKKwkJCWQgPSBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiAqIDIgKyBqOworCisJCQlPUChpY29kZSwgJnB0ciwgaU1BQzAsIENfMDAwMDAwMDAsIENfMDAwMDAwMDAsIEdQUihkKSwgR1BSKEJBU1NfR1BSICsgMCArIGopKTsKKwkJCU9QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEdQUihrKzEpLCBHUFIoayksIEdQUihrKzEpLCBHUFIoQkFTU19HUFIgKyA0ICsgaikpOworCQkJT1AoaWNvZGUsICZwdHIsIGlNQUNNViwgR1BSKGspLCBHUFIoZCksIEdQUihrKSwgR1BSKEJBU1NfR1BSICsgMiArIGopKTsKKwkJCU9QKGljb2RlLCAmcHRyLCBpTUFDTVYsIEdQUihrKzMpLCBHUFIoaysyKSwgR1BSKGsrMyksIEdQUihCQVNTX0dQUiArIDggKyBqKSk7CisJCQlPUChpY29kZSwgJnB0ciwgaU1BQzAsIEdQUihrKzIpLCBHUFJfQUNDVSwgR1BSKGsrMiksIEdQUihCQVNTX0dQUiArIDYgKyBqKSk7CisJCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUihrKzIpLCBHUFIoaysyKSwgR1BSKGsrMiksIENfMDAwMDAwMDApOworCisJCQlPUChpY29kZSwgJnB0ciwgaU1BQzAsIENfMDAwMDAwMDAsIENfMDAwMDAwMDAsIEdQUihrKzIpLCBHUFIoVFJFQkxFX0dQUiArIDAgKyBqKSk7CisJCQlPUChpY29kZSwgJnB0ciwgaU1BQ01WLCBHUFIobCsxKSwgR1BSKGwpLCBHUFIobCsxKSwgR1BSKFRSRUJMRV9HUFIgKyA0ICsgaikpOworCQkJT1AoaWNvZGUsICZwdHIsIGlNQUNNViwgR1BSKGwpLCBHUFIoaysyKSwgR1BSKGwpLCBHUFIoVFJFQkxFX0dQUiArIDIgKyBqKSk7CisJCQlPUChpY29kZSwgJnB0ciwgaU1BQ01WLCBHUFIobCszKSwgR1BSKGwrMiksIEdQUihsKzMpLCBHUFIoVFJFQkxFX0dQUiArIDggKyBqKSk7CisJCQlPUChpY29kZSwgJnB0ciwgaU1BQzAsIEdQUihsKzIpLCBHUFJfQUNDVSwgR1BSKGwrMiksIEdQUihUUkVCTEVfR1BSICsgNiArIGopKTsKKwkJCU9QKGljb2RlLCAmcHRyLCBpTUFDSU5UMCwgR1BSKGwrMiksIENfMDAwMDAwMDAsIEdQUihsKzIpLCBDXzAwMDAwMDEwKTsKKworCQkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBHUFIoZCksIEdQUihsKzIpLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKworCQkJaWYgKHogPT0gMikJLyogY2VudGVyICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaSArPSAyOworCisjdW5kZWYgQkFTU19HUFIKKyN1bmRlZiBUUkVCTEVfR1BSCisKKwlmb3IgKHogPSAwOyB6IDwgNjsgeisrKSB7CisJCVNXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMCwgcGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIHosIGdwciArIDApOworCQlTV0lUQ0hfTkVHKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBncHIgKyAwKTsKKwkJU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBwbGF5YmFjayArIHosIHRtcCArIDEpOworCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiksIEdQUih0bXAgKyAwKSwgR1BSKHRtcCArIDEpLCBDXzAwMDAwMDAwKTsKKwl9CisJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIlRvbmUgQ29udHJvbCAtIFN3aXRjaCIsIGdwciwgMCk7CisJZ3ByICs9IDI7CisKKwkvKgorCSAqICBQcm9jZXNzIG91dHB1dHMKKwkgKi8KKwlpZiAoZW11LT5meDgwMTAuZXh0b3V0X21hc2sgJiAoKDE8PEVYVE9VVF9BQzk3X0wpfCgxPDxFWFRPVVRfQUM5N19SKSkpIHsKKwkJLyogQUMnOTcgUGxheWJhY2sgVm9sdW1lICovCisKKwkJZm9yICh6ID0gMDsgeiA8IDI7IHorKykKKwkJCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgRVhUT1VUKEVYVE9VVF9BQzk3X0wgKyB6KSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyB6KSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJfQorCisJaWYgKGVtdS0+Zng4MDEwLmV4dG91dF9tYXNrICYgKCgxPDxFWFRPVVRfVE9TTElOS19MKXwoMTw8RVhUT1VUX1RPU0xJTktfUikpKSB7CisJCS8qIElFQzk1OCBPcHRpY2FsIFJhdyBQbGF5YmFjayBTd2l0Y2ggKi8KKworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCQlTV0lUQ0goaWNvZGUsICZwdHIsIHRtcCArIDAsIDggKyB6LCBncHIgKyB6KTsKKwkJCVNXSVRDSF9ORUcoaWNvZGUsICZwdHIsIHRtcCArIDEsIGdwciArIHopOworCQkJU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiwgdG1wICsgMSk7CisJCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfVE9TTElOS19MICsgeiksIEdQUih0bXAgKyAwKSwgR1BSKHRtcCArIDEpLCBDXzAwMDAwMDAwKTsKKyNpZmRlZiBFTVUxMEsxX0NBUFRVUkVfRElHSVRBTF9PVVQKKwkgCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfQURDX0NBUF9MICsgeiksIEdQUih0bXAgKyAwKSwgR1BSKHRtcCArIDEpLCBDXzAwMDAwMDAwKTsKKyNlbmRpZgorCQl9CisKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBPcHRpY2FsIFJhdyBQbGF5YmFjayBTd2l0Y2giLCBncHIsIDApOworCQlncHIgKz0gMjsKKwl9CisKKwlpZiAoZW11LT5meDgwMTAuZXh0b3V0X21hc2sgJiAoKDE8PEVYVE9VVF9IRUFEUEhPTkVfTCl8KDE8PEVYVE9VVF9IRUFEUEhPTkVfUikpKSB7CisJCS8qIEhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUgKi8KKworCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKSB7CisJCQlTV0lUQ0goaWNvZGUsICZwdHIsIHRtcCArIDAsIHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyA0ICsgeiwgZ3ByICsgMiArIHopOworCQkJU1dJVENIX05FRyhpY29kZSwgJnB0ciwgdG1wICsgMSwgZ3ByICsgMiArIHopOworCQkJU1dJVENIKGljb2RlLCAmcHRyLCB0bXAgKyAxLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiwgdG1wICsgMSk7CisJCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEdQUih0bXAgKyAwKSwgR1BSKHRtcCArIDApLCBHUFIodG1wICsgMSksIENfMDAwMDAwMDApOworCQkJVk9MVU1FX09VVChpY29kZSwgJnB0ciwgRVhUT1VUX0hFQURQSE9ORV9MICsgeiwgdG1wICsgMCwgZ3ByICsgeik7CisJCX0KKworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIGdwciArIDAsIDApOworCQljb250cm9sc1tpLTFdLmlkLmluZGV4ID0gMTsJLyogQUMnOTcgY2FuIGhhdmUgYWxzbyBIZWFkcGhvbmUgY29udHJvbCAqLworCQlzbmRfZW11MTBrMV9pbml0X21vbm9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIkhlYWRwaG9uZSBDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJCWNvbnRyb2xzW2ktMV0uaWQuaW5kZXggPSAxOworCQlzbmRfZW11MTBrMV9pbml0X21vbm9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIkhlYWRwaG9uZSBMRkUgUGxheWJhY2sgU3dpdGNoIiwgZ3ByICsgMywgMCk7CisJCWNvbnRyb2xzW2ktMV0uaWQuaW5kZXggPSAxOworCisJCWdwciArPSA0OworCX0KKwkKKwlpZiAoZW11LT5meDgwMTAuZXh0b3V0X21hc2sgJiAoKDE8PEVYVE9VVF9SRUFSX0wpfCgxPDxFWFRPVVRfUkVBUl9SKSkpCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfUkVBUl9MICsgeiksIEdQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgMiArIHopLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKworCWlmIChlbXUtPmZ4ODAxMC5leHRvdXRfbWFzayAmICgoMTw8RVhUT1VUX0FDOTdfUkVBUl9MKXwoMTw8RVhUT1VUX0FDOTdfUkVBUl9SKSkpCisJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisJCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfQUM5N19SRUFSX0wgKyB6KSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyAyICsgeiksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCisJaWYgKGVtdS0+Zng4MDEwLmV4dG91dF9tYXNrICYgKDE8PEVYVE9VVF9BQzk3X0NFTlRFUikpIHsKKyNpZm5kZWYgRU1VMTBLMV9DRU5URVJfTEZFX0ZST01fRlJPTlQKKwkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBFWFRPVVQoRVhUT1VUX0FDOTdfQ0VOVEVSKSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyA0KSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgRVhUT1VUKEVYVE9VVF9BQ0VOVEVSKSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyA0KSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisjZWxzZQorCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfQUM5N19DRU5URVIpLCBHUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDApLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKwkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBFWFRPVVQoRVhUT1VUX0FDRU5URVIpLCBHUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIDApLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKyNlbmRpZgorCX0KKworCWlmIChlbXUtPmZ4ODAxMC5leHRvdXRfbWFzayAmICgxPDxFWFRPVVRfQUM5N19MRkUpKSB7CisjaWZuZGVmIEVNVTEwSzFfQ0VOVEVSX0xGRV9GUk9NX0ZST05UCisJCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgRVhUT1VUKEVYVE9VVF9BQzk3X0xGRSksIEdQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgNSksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfQUxGRSksIEdQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgNSksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworI2Vsc2UKKwkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBFWFRPVVQoRVhUT1VUX0FDOTdfTEZFKSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyAxKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisJCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgRVhUT1VUKEVYVE9VVF9BTEZFKSwgR1BSKHBsYXliYWNrICsgU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKyAxKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCk7CisjZW5kaWYKKwl9CisJCisjaWZuZGVmIEVNVTEwSzFfQ0FQVFVSRV9ESUdJVEFMX09VVAorCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCisgCQlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEVYVE9VVChFWFRPVVRfQURDX0NBUF9MICsgeiksIEdQUihjYXB0dXJlICsgeiksIENfMDAwMDAwMDAsIENfMDAwMDAwMDApOworI2VuZGlmCisJCisJaWYgKGVtdS0+Zng4MDEwLmV4dG91dF9tYXNrICYgKDE8PEVYVE9VVF9NSUNfQ0FQKSkKKwkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBFWFRPVVQoRVhUT1VUX01JQ19DQVApLCBHUFIoY2FwdHVyZSArIDIpLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKworCS8qIEVGWCBjYXB0dXJlIC0gY2FwdHVyZSB0aGUgMTYgRVhUSU5TICovCisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBGWEJVUzIoMTQpLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBFWFRJTigwKSk7CisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBGWEJVUzIoMTUpLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBFWFRJTigxKSk7CisJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBGWEJVUzIoMCksIENfMDAwMDAwMDAsIENfMDAwMDAwMDAsIEVYVElOKDIpKTsKKwlPUChpY29kZSwgJnB0ciwgaUFDQzMsIEZYQlVTMigzKSwgQ18wMDAwMDAwMCwgQ18wMDAwMDAwMCwgRVhUSU4oMykpOworCS8qIERvbnQgY29ubmVjdCBhbnl0aGluZyB0byBGWEJVUzIgMSBhbmQgMi4gIFRoZXNlIGFyZSBzaGFyZWQgd2l0aCAKKwkgKiBDZW50ZXIvTEZFIG9uIHRoZSBTQkxpdmUgNS4xLiAgVGhlIGtYIGRyaXZlciBvbmx5IGNoYW5nZXMgdGhlIAorCSAqIHJvdXRpbmcgd2hlbiBpdCBkZXRlY3RzIGFuIFNCTGl2ZSA1LjEuCisJICoKKwkgKiBTaW5jZSBvbmx5IDE0IG9mIHRoZSAxNiBFWFRJTnMgYXJlIHVzZWQsIHRoaXMgaXMgbm90IGEgYmlnIHByb2JsZW0uICAKKwkgKiBXZSByb3V0ZSBBQzk3TCBhbmQgUiB0byBGWCBjYXB0dXJlIDE0IGFuZCAxNSwgU1BESUYgQ0QgaW4gdG8gRlggY2FwdHVyZSAKKwkgKiAwIGFuZCAzLCB0aGVuIHRoZSByZXN0IG9mIHRoZSBFWFRJTnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgRlggY2FwdHVyZSAKKwkgKiBjaGFubmVsLgorCSAqLworCWZvciAoeiA9IDQ7IHogPCAxNDsgeisrKSB7CisJCU9QKGljb2RlLCAmcHRyLCBpQUNDMywgRlhCVVMyKHopLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBFWFRJTih6KSk7CisJfQorCisJaWYgKGdwciA+IHRtcCkgeworCQlzbmRfQlVHKCk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gX19lcnI7CisJfQorCWlmIChpID4gU05EX0VNVTEwSzFfR1BSX0NPTlRST0xTKSB7CisJCXNuZF9CVUcoKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBfX2VycjsKKwl9CisJCisJLyogY2xlYXIgcmVtYWluaW5nIGluc3RydWN0aW9uIG1lbW9yeSAqLworCXdoaWxlIChwdHIgPCAweDIwMCkKKwkJT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwLCBDXzAwMDAwMDAwKTsKKworCWlmICgoZXJyID0gc25kX2VtdTEwazFfZng4MDEwX3RyYW1fc2V0dXAoZW11LCBpcGNtLT5idWZmZXJfc2l6ZSkpIDwgMCkKKwkJZ290byBfX2VycjsKKwlzZWcgPSBzbmRfZW50ZXJfdXNlcigpOworCWljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQgPSBpOworCWljb2RlLT5ncHJfYWRkX2NvbnRyb2xzID0gKGVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgX191c2VyICopY29udHJvbHM7CisJZXJyID0gc25kX2VtdTEwazFfaWNvZGVfcG9rZShlbXUsIGljb2RlKTsKKwlzbmRfbGVhdmVfdXNlcihzZWcpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gc25kX2VtdTEwazFfaXBjbV9wb2tlKGVtdSwgaXBjbSk7CisgICAgICBfX2VycjoKKwlrZnJlZShpcGNtKTsKKwlrZnJlZShjb250cm9scyk7CisJaWYgKGljb2RlICE9IE5VTEwpIHsKKwkJa2ZyZWUoKHZvaWQgKilpY29kZS0+Z3ByX21hcCk7CisJCWtmcmVlKGljb2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9pbml0X2VmeChlbXUxMGsxX3QgKmVtdSkKK3sKKwlpZiAoZW11LT5hdWRpZ3kpCisJCXJldHVybiBfc25kX2VtdTEwazFfYXVkaWd5X2luaXRfZWZ4KGVtdSk7CisJZWxzZQorCQlyZXR1cm4gX3NuZF9lbXUxMGsxX2luaXRfZWZ4KGVtdSk7Cit9CisKK3ZvaWQgc25kX2VtdTEwazFfZnJlZV9lZngoZW11MTBrMV90ICplbXUpCit7CisJLyogc3RvcCBwcm9jZXNzb3IgKi8KKwlpZiAoZW11LT5hdWRpZ3kpCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgPSBBX0RCR19TSU5HTEVfU1RFUCk7CisJZWxzZQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyA9IEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQKTsKK30KKworI2lmIDAgLy8gRklYTUU6IHdobyB1c2UgdGhlbT8KK2ludCBzbmRfZW11MTBrMV9meDgwMTBfdG9uZV9jb250cm9sX2FjdGl2YXRlKGVtdTEwazFfdCAqZW11LCBpbnQgb3V0cHV0KQoreworCXNuZF9ydW50aW1lX2NoZWNrKG91dHB1dCA+PSAwICYmIG91dHB1dCA8IDYsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgMHg5NCArIG91dHB1dCwgMCwgMSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfZW11MTBrMV9meDgwMTBfdG9uZV9jb250cm9sX2RlYWN0aXZhdGUoZW11MTBrMV90ICplbXUsIGludCBvdXRwdXQpCit7CisJc25kX3J1bnRpbWVfY2hlY2sob3V0cHV0ID49IDAgJiYgb3V0cHV0IDwgNiwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVtdS0+Z3ByX2Jhc2UgKyAweDk0ICsgb3V0cHV0LCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgc25kX2VtdTEwazFfZng4MDEwX3RyYW1fc2V0dXAoZW11MTBrMV90ICplbXUsIHUzMiBzaXplKQoreworCXU4IHNpemVfcmVnID0gMDsKKworCS8qIHNpemUgaXMgaW4gc2FtcGxlcyAqLworCWlmIChzaXplICE9IDApIHsKKwkJc2l6ZSA9IChzaXplIC0gMSkgPj4gMTM7CisKKwkJd2hpbGUgKHNpemUpIHsKKwkJCXNpemUgPj49IDE7CisJCQlzaXplX3JlZysrOworCQl9CisJCXNpemUgPSAweDIwMDAgPDwgc2l6ZV9yZWc7CisJfQorCWlmICgoZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYnl0ZXMgLyAyKSA9PSBzaXplKQorCQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxKCZlbXUtPmVtdV9sb2NrKTsKKwlvdXRsKEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgaW5sKGVtdS0+cG9ydCArIEhDRkcpLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwlzcGluX3VubG9ja19pcnEoJmVtdS0+ZW11X2xvY2spOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRDQiwgMCwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVENCUywgMCwgMCk7CisJaWYgKGVtdS0+Zng4MDEwLmV0cmFtX3BhZ2VzLmFyZWEgIT0gTlVMTCkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmVtdS0+Zng4MDEwLmV0cmFtX3BhZ2VzKTsKKwkJZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYXJlYSA9IE5VTEw7CisJCWVtdS0+Zng4MDEwLmV0cmFtX3BhZ2VzLmJ5dGVzID0gMDsKKwl9CisKKwlpZiAoc2l6ZSA+IDApIHsKKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGVtdS0+cGNpKSwKKwkJCQkJc2l6ZSAqIDIsICZlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcykgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5hcmVhLCAwLCBzaXplICogMik7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRDQiwgMCwgZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYWRkcik7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRDQlMsIDAsIHNpemVfcmVnKTsKKwkJc3Bpbl9sb2NrX2lycSgmZW11LT5lbXVfbG9jayk7CisJCW91dGwoaW5sKGVtdS0+cG9ydCArIEhDRkcpICYgfkhDRkdfTE9DS1RBTktDQUNIRV9NQVNLLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZlbXUtPmVtdV9sb2NrKTsJCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX29wZW4oc25kX2h3ZGVwX3QgKiBodywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfc3RyaW5nKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBjaGFyICpudWxsLCBpbnQgaWR4KQoreworCWlmIChzcmMgPT0gTlVMTCkKKwkJc3ByaW50Zihkc3QsICIlcyAlMDJYIiwgbnVsbCwgaWR4KTsKKwllbHNlCisJCXN0cmNweShkc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX2luZm8oZW11MTBrMV90ICplbXUsIGVtdTEwazFfZng4MDEwX2luZm9fdCAqaW5mbykKK3sKKwljaGFyICoqZnhidXMsICoqZXh0aW4sICoqZXh0b3V0OworCXVuc2lnbmVkIHNob3J0IGZ4YnVzX21hc2ssIGV4dGluX21hc2ssIGV4dG91dF9tYXNrOworCWludCByZXM7CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlpbmZvLT5jYXJkID0gZW11LT5jYXJkX3R5cGU7CisJaW5mby0+aW50ZXJuYWxfdHJhbV9zaXplID0gZW11LT5meDgwMTAuaXRyYW1fc2l6ZTsKKwlpbmZvLT5leHRlcm5hbF90cmFtX3NpemUgPSBlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5ieXRlcyAvIDI7CisJZnhidXMgPSBmeGJ1c2VzOworCWV4dGluID0gZW11LT5hdWRpZ3kgPyBhdWRpZ3lfaW5zIDogY3JlYXRpdmVfaW5zOworCWV4dG91dCA9IGVtdS0+YXVkaWd5ID8gYXVkaWd5X291dHMgOiBjcmVhdGl2ZV9vdXRzOworCWZ4YnVzX21hc2sgPSBlbXUtPmZ4ODAxMC5meGJ1c19tYXNrOworCWV4dGluX21hc2sgPSBlbXUtPmZ4ODAxMC5leHRpbl9tYXNrOworCWV4dG91dF9tYXNrID0gZW11LT5meDgwMTAuZXh0b3V0X21hc2s7CisJZm9yIChyZXMgPSAwOyByZXMgPCAxNjsgcmVzKyssIGZ4YnVzKyssIGV4dGluKyssIGV4dG91dCsrKSB7CisJCWNvcHlfc3RyaW5nKGluZm8tPmZ4YnVzX25hbWVzW3Jlc10sIGZ4YnVzX21hc2sgJiAoMSA8PCByZXMpID8gKmZ4YnVzIDogTlVMTCwgIkZYQlVTIiwgcmVzKTsKKwkJY29weV9zdHJpbmcoaW5mby0+ZXh0aW5fbmFtZXNbcmVzXSwgZXh0aW5fbWFzayAmICgxIDw8IHJlcykgPyAqZXh0aW4gOiBOVUxMLCAiVW51c2VkIiwgcmVzKTsKKwkJY29weV9zdHJpbmcoaW5mby0+ZXh0b3V0X25hbWVzW3Jlc10sIGV4dG91dF9tYXNrICYgKDEgPDwgcmVzKSA/ICpleHRvdXQgOiBOVUxMLCAiVW51c2VkIiwgcmVzKTsKKwl9CisJZm9yIChyZXMgPSAxNjsgcmVzIDwgMzI7IHJlcysrLCBleHRvdXQrKykKKwkJY29weV9zdHJpbmcoaW5mby0+ZXh0b3V0X25hbWVzW3Jlc10sIGV4dG91dF9tYXNrICYgKDEgPDwgcmVzKSA/ICpleHRvdXQgOiBOVUxMLCAiVW51c2VkIiwgcmVzKTsKKwlpbmZvLT5ncHJfY29udHJvbHMgPSBlbXUtPmZ4ODAxMC5ncHJfY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX2lvY3RsKHNuZF9od2RlcF90ICogaHcsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwllbXUxMGsxX3QgKmVtdSA9IGh3LT5wcml2YXRlX2RhdGE7CisJZW11MTBrMV9meDgwMTBfaW5mb190ICppbmZvOworCWVtdTEwazFfZng4MDEwX2NvZGVfdCAqaWNvZGU7CisJZW11MTBrMV9meDgwMTBfcGNtX3QgKmlwY207CisJdW5zaWduZWQgaW50IGFkZHI7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJlczsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9JTkZPOgorCQlpbmZvID0gKGVtdTEwazFfZng4MDEwX2luZm9fdCAqKWttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mbykKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoKHJlcyA9IHNuZF9lbXUxMGsxX2Z4ODAxMF9pbmZvKGVtdSwgaW5mbykpIDwgMCkgeworCQkJa2ZyZWUoaW5mbyk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgaW5mbywgc2l6ZW9mKCppbmZvKSkpIHsKKwkJCWtmcmVlKGluZm8pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJa2ZyZWUoaW5mbyk7CisJCXJldHVybiAwOworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BPS0U6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWljb2RlID0gKGVtdTEwazFfZng4MDEwX2NvZGVfdCAqKWttYWxsb2Moc2l6ZW9mKCppY29kZSksIEdGUF9LRVJORUwpOworCQlpZiAoaWNvZGUgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoY29weV9mcm9tX3VzZXIoaWNvZGUsIGFyZ3AsIHNpemVvZigqaWNvZGUpKSkgeworCQkJa2ZyZWUoaWNvZGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzID0gc25kX2VtdTEwazFfaWNvZGVfcG9rZShlbXUsIGljb2RlKTsKKwkJa2ZyZWUoaWNvZGUpOworCQlyZXR1cm4gcmVzOworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BFRUs6CisJCWljb2RlID0gKGVtdTEwazFfZng4MDEwX2NvZGVfdCAqKWttYWxsb2Moc2l6ZW9mKCppY29kZSksIEdGUF9LRVJORUwpOworCQlpZiAoaWNvZGUgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoY29weV9mcm9tX3VzZXIoaWNvZGUsIGFyZ3AsIHNpemVvZigqaWNvZGUpKSkgeworCQkJa2ZyZWUoaWNvZGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzID0gc25kX2VtdTEwazFfaWNvZGVfcGVlayhlbXUsIGljb2RlKTsKKwkJaWYgKHJlcyA9PSAwICYmIGNvcHlfdG9fdXNlcihhcmdwLCBpY29kZSwgc2l6ZW9mKCppY29kZSkpKSB7CisJCQlrZnJlZShpY29kZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlrZnJlZShpY29kZSk7CisJCXJldHVybiByZXM7CisJY2FzZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QT0tFOgorCQlpcGNtID0gKGVtdTEwazFfZng4MDEwX3BjbV90ICopa21hbGxvYyhzaXplb2YoKmlwY20pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlwY20gPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoY29weV9mcm9tX3VzZXIoaXBjbSwgYXJncCwgc2l6ZW9mKCppcGNtKSkpIHsKKwkJCWtmcmVlKGlwY20pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzID0gc25kX2VtdTEwazFfaXBjbV9wb2tlKGVtdSwgaXBjbSk7CisJCWtmcmVlKGlwY20pOworCQlyZXR1cm4gcmVzOworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9QQ01fUEVFSzoKKwkJaXBjbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCppcGNtKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpcGNtID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGlwY20sIGFyZ3AsIHNpemVvZigqaXBjbSkpKSB7CisJCQlrZnJlZShpcGNtKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJlcyA9IHNuZF9lbXUxMGsxX2lwY21fcGVlayhlbXUsIGlwY20pOworCQlpZiAocmVzID09IDAgJiYgY29weV90b191c2VyKGFyZ3AsIGlwY20sIHNpemVvZigqaXBjbSkpKSB7CisJCQlrZnJlZShpcGNtKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtmcmVlKGlwY20pOworCQlyZXR1cm4gcmVzOworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1NFVFVQOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIoYWRkciwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlkb3duKCZlbXUtPmZ4ODAxMC5sb2NrKTsKKwkJcmVzID0gc25kX2VtdTEwazFfZng4MDEwX3RyYW1fc2V0dXAoZW11LCBhZGRyKTsKKwkJdXAoJmVtdS0+Zng4MDEwLmxvY2spOworCQlyZXR1cm4gcmVzOworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9TVE9QOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZW11LT5hdWRpZ3kpCisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0RCRywgMCwgZW11LT5meDgwMTAuZGJnIHw9IEFfREJHX1NJTkdMRV9TVEVQKTsKKwkJZWxzZQorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgfD0gRU1VMTBLMV9EQkdfU0lOR0xFX1NURVApOworCQlyZXR1cm4gMDsKKwljYXNlIFNORFJWX0VNVTEwSzFfSU9DVExfQ09OVElOVUU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChlbXUtPmF1ZGlneSkKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgPSAwKTsKKwkJZWxzZQorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgPSAwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1pFUk9fVFJBTV9DT1VOVEVSOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZW11LT5hdWRpZ3kpCisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0RCRywgMCwgZW11LT5meDgwMTAuZGJnIHwgQV9EQkdfWkMpOworCQllbHNlCisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyB8IEVNVTEwSzFfREJHX1pDKTsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKGVtdS0+YXVkaWd5KQorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9EQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyk7CisJCWVsc2UKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERCRywgMCwgZW11LT5meDgwMTAuZGJnKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NJTkdMRV9TVEVQOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZ2V0X3VzZXIoYWRkciwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoYWRkciA+IDB4MWZmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChlbXUtPmF1ZGlneSkKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgfD0gQV9EQkdfU0lOR0xFX1NURVAgfCBhZGRyKTsKKwkJZWxzZQorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgfD0gRU1VMTBLMV9EQkdfU0lOR0xFX1NURVAgfCBhZGRyKTsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKGVtdS0+YXVkaWd5KQorCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9EQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyB8PSBBX0RCR19TSU5HTEVfU1RFUCB8IEFfREJHX1NURVBfQUREUiB8IGFkZHIpOworCQllbHNlCisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyB8PSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUCB8IEVNVTEwSzFfREJHX1NURVAgfCBhZGRyKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0RCR19SRUFEOgorCQlpZiAoZW11LT5hdWRpZ3kpCisJCQlhZGRyID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBBX0RCRywgMCk7CisJCWVsc2UKKwkJCWFkZHIgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIERCRywgMCk7CisJCWlmIChwdXRfdXNlcihhZGRyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9meDgwMTBfcmVsZWFzZShzbmRfaHdkZXBfdCAqIGh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9meDgwMTBfbmV3KGVtdTEwazFfdCAqZW11LCBpbnQgZGV2aWNlLCBzbmRfaHdkZXBfdCAqKiByaHdkZXApCit7CisJc25kX2h3ZGVwX3QgKmh3OworCWludCBlcnI7CisJCisJaWYgKHJod2RlcCkKKwkJKnJod2RlcCA9IE5VTEw7CisJaWYgKChlcnIgPSBzbmRfaHdkZXBfbmV3KGVtdS0+Y2FyZCwgIkZYODAxMCIsIGRldmljZSwgJmh3KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN0cmNweShody0+bmFtZSwgIkVNVTEwSzEgKEZYODAxMCkiKTsKKwlody0+aWZhY2UgPSBTTkRSVl9IV0RFUF9JRkFDRV9FTVUxMEsxOworCWh3LT5vcHMub3BlbiA9IHNuZF9lbXUxMGsxX2Z4ODAxMF9vcGVuOworCWh3LT5vcHMuaW9jdGwgPSBzbmRfZW11MTBrMV9meDgwMTBfaW9jdGw7CisJaHctPm9wcy5yZWxlYXNlID0gc25kX2VtdTEwazFfZng4MDEwX3JlbGVhc2U7CisJaHctPnByaXZhdGVfZGF0YSA9IGVtdTsKKwlpZiAocmh3ZGVwKQorCQkqcmh3ZGVwID0gaHc7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ2NjNkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwpAQCAtMCwwICsxLDk1NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4sCisgKiAgICAgICAgICAgICAgICAgICBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcyAvIG1peGVyIHJvdXRpbmVzCisgKiAgTXVsdGljaGFubmVsIFBDTSBzdXBwb3J0IENvcHlyaWdodCAoYykgTGVlIFJldmVsbCA8cmxyZXZlbGxAam9lLWpvYi5jb20+CisgKgorICogIEJVR1M6CisgKiAgICAtLQorICoKKyAqICBUT0RPOgorICogICAgLS0KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisKKyNkZWZpbmUgQUM5N19JRF9TVEFDOTc1OAkweDgzODQ3NjU4CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChlbXUtPnNwZGlmX2JpdHNbaWR4XSA+PiAwKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAoZW11LT5zcGRpZl9iaXRzW2lkeF0gPj4gOCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gKGVtdS0+c3BkaWZfYml0c1tpZHhdID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoZW11LT5zcGRpZl9iaXRzW2lkeF0gPj4gMjQpICYgMHhmZjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc3BkaWZfZ2V0X21hc2soc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXVkaWd5X3NwZGlmX291dHB1dF9yYXRlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7IjQ0MTAwIiwgIjQ4MDAwIiwgIjk2MDAwIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfc3BkaWZfb3V0cHV0X3JhdGVfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJdG1wID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBBX1NQRElGX1NBTVBMRVJBVEUsIDApOworCXN3aXRjaCAodG1wICYgQV9TUERJRl9SQVRFX01BU0spIHsKKwljYXNlIEFfU1BESUZfNDQxMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOworCQlicmVhazsKKwljYXNlIEFfU1BESUZfNDgwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAxOworCQlicmVhazsKKwljYXNlIEFfU1BESUZfOTYwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfc3BkaWZfb3V0cHV0X3JhdGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHJlZywgdmFsLCB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKSB7CisJY2FzZSAwOgorCQl2YWwgPSBBX1NQRElGXzQ0MTAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXZhbCA9IEFfU1BESUZfNDgwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gQV9TUERJRl85NjAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gQV9TUERJRl80ODAwMDsKKwkJYnJlYWs7CisJfQorCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZWcgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CisJdG1wID0gcmVnICYgfkFfU1BESUZfUkFURV9NQVNLOworCXRtcCB8PSB2YWw7CisJaWYgKChjaGFuZ2UgPSAodG1wICE9IHJlZykpKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX1NQRElGX1NBTVBMRVJBVEUsIDAsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2F1ZGlneV9zcGRpZl9vdXRwdXRfcmF0ZSA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiQXVkaWd5IFNQRElGIE91dHB1dCBTYW1wbGUgUmF0ZSIsCisJLmNvdW50ID0JMSwKKwkuaW5mbyA9ICAgICAgICAgc25kX2F1ZGlneV9zcGRpZl9vdXRwdXRfcmF0ZV9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfYXVkaWd5X3NwZGlmX291dHB1dF9yYXRlX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2F1ZGlneV9zcGRpZl9vdXRwdXRfcmF0ZV9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc3BkaWZfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA8PCAwKSB8CisJICAgICAgKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdIDw8IDgpIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPDwgMTYpIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPDwgMjQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJY2hhbmdlID0gdmFsICE9IGVtdS0+c3BkaWZfYml0c1tpZHhdOworCWlmIChjaGFuZ2UpIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgU1BDUzAgKyBpZHgsIDAsIHZhbCk7CisJCWVtdS0+c3BkaWZfYml0c1tpZHhdID0gdmFsOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZW11MTBrMV9zcGRpZl9tYXNrX2NvbnRyb2wgPQoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxNQVNLKSwKKwkuY291bnQgPQk0LAorCS5pbmZvID0gICAgICAgICBzbmRfZW11MTBrMV9zcGRpZl9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMV9zcGRpZl9nZXRfbWFzaworfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZW11MTBrMV9zcGRpZl9jb250cm9sID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5jb3VudCA9CTQsCisJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMGsxX3NwZGlmX2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9lbXUxMGsxX3NwZGlmX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwazFfc3BkaWZfcHV0Cit9OworCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9lbXUxMGsxX2Z4cnQoZW11MTBrMV90ICplbXUsIGludCB2b2ljZSwgdW5zaWduZWQgY2hhciAqcm91dGUpCit7CisJaWYgKGVtdS0+YXVkaWd5KSB7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhSVDEsIHZvaWNlLAorCQkJCSAgICAgIHNuZF9lbXUxMGsxX2NvbXBvc2VfYXVkaWd5X2Z4cnQxKHJvdXRlKSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhSVDIsIHZvaWNlLAorCQkJCSAgICAgIHNuZF9lbXUxMGsxX2NvbXBvc2VfYXVkaWd5X2Z4cnQyKHJvdXRlKSk7CisJfSBlbHNlIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRlhSVCwgdm9pY2UsCisJCQkJICAgICAgc25kX2VtdTEwazFfY29tcG9zZV9zZW5kX3JvdXRpbmcocm91dGUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9lbXUxMGsxX3NlbmRfdm9sdW1lKGVtdTEwazFfdCAqZW11LCBpbnQgdm9pY2UsIHVuc2lnbmVkIGNoYXIgKnZvbHVtZSkKK3sKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQVFJYX0ZYU0VOREFNT1VOVF9BLCB2b2ljZSwgdm9sdW1lWzBdKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQVFJYX0ZYU0VOREFNT1VOVF9CLCB2b2ljZSwgdm9sdW1lWzFdKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQU1NUX0ZYU0VOREFNT1VOVF9DLCB2b2ljZSwgdm9sdW1lWzJdKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEU0xfRlhTRU5EQU1PVU5UX0QsIHZvaWNlLCB2b2x1bWVbM10pOworCWlmIChlbXUtPmF1ZGlneSkgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKCh1bnNpZ25lZCBpbnQpdm9sdW1lWzRdIDw8IDI0KSB8CisJCQkoKHVuc2lnbmVkIGludCl2b2x1bWVbNV0gPDwgMTYpIHwKKwkJCSgodW5zaWduZWQgaW50KXZvbHVtZVs2XSA8PCA4KSB8CisJCQkodW5zaWduZWQgaW50KXZvbHVtZVs3XTsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9TRU5EQU1PVU5UUywgdm9pY2UsIHZhbCk7CisJfQorfQorCisvKiBQQ00gc3RyZWFtIGNvbnRyb2xzICovCisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc2VuZF9yb3V0aW5nX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZW11LT5hdWRpZ3kgPyAzKjggOiAzKjQ7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBlbXUtPmF1ZGlneSA/IDB4M2YgOiAweDBmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3NlbmRfcm91dGluZ19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4ID0gJmVtdS0+cGNtX21peGVyW3NuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpXTsKKwlpbnQgdm9pY2UsIGlkeDsKKwlpbnQgbnVtX2VmeCA9IGVtdS0+YXVkaWd5ID8gOCA6IDQ7CisJaW50IG1hc2sgPSBlbXUtPmF1ZGlneSA/IDB4M2YgOiAweDBmOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCAzOyB2b2ljZSsrKQorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9lZng7IGlkeCsrKQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbKHZvaWNlICogbnVtX2VmeCkgKyBpZHhdID0gCisJCQkJbWl4LT5zZW5kX3JvdXRpbmdbdm9pY2VdW2lkeF0gJiBtYXNrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zZW5kX3JvdXRpbmdfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWVtdTEwazFfcGNtX21peGVyX3QgKm1peCA9ICZlbXUtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJaW50IGNoYW5nZSA9IDAsIHZvaWNlLCBpZHgsIHZhbDsKKwlpbnQgbnVtX2VmeCA9IGVtdS0+YXVkaWd5ID8gOCA6IDQ7CisJaW50IG1hc2sgPSBlbXUtPmF1ZGlneSA/IDB4M2YgOiAweDBmOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCAzOyB2b2ljZSsrKQorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9lZng7IGlkeCsrKSB7CisJCQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsodm9pY2UgKiBudW1fZWZ4KSArIGlkeF0gJiBtYXNrOworCQkJaWYgKG1peC0+c2VuZF9yb3V0aW5nW3ZvaWNlXVtpZHhdICE9IHZhbCkgeworCQkJCW1peC0+c2VuZF9yb3V0aW5nW3ZvaWNlXVtpZHhdID0gdmFsOworCQkJCWNoYW5nZSA9IDE7CisJCQl9CisJCX0JCisJaWYgKGNoYW5nZSAmJiBtaXgtPmVwY20pIHsKKwkJaWYgKG1peC0+ZXBjbS0+dm9pY2VzWzBdICYmIG1peC0+ZXBjbS0+dm9pY2VzWzFdKSB7CisJCQl1cGRhdGVfZW11MTBrMV9meHJ0KGVtdSwgbWl4LT5lcGNtLT52b2ljZXNbMF0tPm51bWJlciwKKwkJCQkJICAgICZtaXgtPnNlbmRfcm91dGluZ1sxXVswXSk7CisJCQl1cGRhdGVfZW11MTBrMV9meHJ0KGVtdSwgbWl4LT5lcGNtLT52b2ljZXNbMV0tPm51bWJlciwKKwkJCQkJICAgICZtaXgtPnNlbmRfcm91dGluZ1syXVswXSk7CisJCX0gZWxzZSBpZiAobWl4LT5lcGNtLT52b2ljZXNbMF0pIHsKKwkJCXVwZGF0ZV9lbXUxMGsxX2Z4cnQoZW11LCBtaXgtPmVwY20tPnZvaWNlc1swXS0+bnVtYmVyLAorCQkJCQkgICAgJm1peC0+c2VuZF9yb3V0aW5nWzBdWzBdKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZW11MTBrMV9zZW5kX3JvdXRpbmdfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiRU1VMTBLMSBQQ00gU2VuZCBSb3V0aW5nIiwKKwkuY291bnQgPQkzMiwKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazFfc2VuZF9yb3V0aW5nX2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9lbXUxMGsxX3NlbmRfcm91dGluZ19nZXQsCisJLnB1dCA9ICAgICAgICAgIHNuZF9lbXUxMGsxX3NlbmRfcm91dGluZ19wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc2VuZF92b2x1bWVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSBlbXUtPmF1ZGlneSA/IDMqOCA6IDMqNDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zZW5kX3ZvbHVtZV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXggPSAmZW11LT5wY21fbWl4ZXJbc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCldOworCWludCBpZHg7CisJaW50IG51bV9lZnggPSBlbXUtPmF1ZGlneSA/IDggOiA0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDMqbnVtX2VmeDsgaWR4KyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gPSBtaXgtPnNlbmRfdm9sdW1lW2lkeC9udW1fZWZ4XVtpZHglbnVtX2VmeF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3NlbmRfdm9sdW1lX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWVtdTEwazFfcGNtX21peGVyX3QgKm1peCA9ICZlbXUtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJaW50IGNoYW5nZSA9IDAsIGlkeCwgdmFsOworCWludCBudW1fZWZ4ID0gZW11LT5hdWRpZ3kgPyA4IDogNDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJZm9yIChpZHggPSAwOyBpZHggPCAzKm51bV9lZng7IGlkeCsrKSB7CisJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gJiAyNTU7CisJCWlmIChtaXgtPnNlbmRfdm9sdW1lW2lkeC9udW1fZWZ4XVtpZHglbnVtX2VmeF0gIT0gdmFsKSB7CisJCQltaXgtPnNlbmRfdm9sdW1lW2lkeC9udW1fZWZ4XVtpZHglbnVtX2VmeF0gPSB2YWw7CisJCQljaGFuZ2UgPSAxOworCQl9CisJfQorCWlmIChjaGFuZ2UgJiYgbWl4LT5lcGNtKSB7CisJCWlmIChtaXgtPmVwY20tPnZvaWNlc1swXSAmJiBtaXgtPmVwY20tPnZvaWNlc1sxXSkgeworCQkJdXBkYXRlX2VtdTEwazFfc2VuZF92b2x1bWUoZW11LCBtaXgtPmVwY20tPnZvaWNlc1swXS0+bnVtYmVyLAorCQkJCQkJICAgJm1peC0+c2VuZF92b2x1bWVbMV1bMF0pOworCQkJdXBkYXRlX2VtdTEwazFfc2VuZF92b2x1bWUoZW11LCBtaXgtPmVwY20tPnZvaWNlc1sxXS0+bnVtYmVyLAorCQkJCQkJICAgJm1peC0+c2VuZF92b2x1bWVbMl1bMF0pOworCQl9IGVsc2UgaWYgKG1peC0+ZXBjbS0+dm9pY2VzWzBdKSB7CisJCQl1cGRhdGVfZW11MTBrMV9zZW5kX3ZvbHVtZShlbXUsIG1peC0+ZXBjbS0+dm9pY2VzWzBdLT5udW1iZXIsCisJCQkJCQkgICAmbWl4LT5zZW5kX3ZvbHVtZVswXVswXSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazFfc2VuZF92b2x1bWVfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiRU1VMTBLMSBQQ00gU2VuZCBWb2x1bWUiLAorCS5jb3VudCA9CTMyLAorCS5pbmZvID0gICAgICAgICBzbmRfZW11MTBrMV9zZW5kX3ZvbHVtZV9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMV9zZW5kX3ZvbHVtZV9nZXQsCisJLnB1dCA9ICAgICAgICAgIHNuZF9lbXUxMGsxX3NlbmRfdm9sdW1lX3B1dAorfTsKKworc3RhdGljIGludCBzbmRfZW11MTBrMV9hdHRuX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMzsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4ZmZmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9hdHRuX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWVtdTEwazFfcGNtX21peGVyX3QgKm1peCA9ICZlbXUtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaWR4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDM7IGlkeCsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpZHhdID0gbWl4LT5hdHRuW2lkeF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2F0dG5fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWVtdTEwazFfcGNtX21peGVyX3QgKm1peCA9ICZlbXUtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJaW50IGNoYW5nZSA9IDAsIGlkeCwgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDM7IGlkeCsrKSB7CisJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gJiAweGZmZmY7CisJCWlmIChtaXgtPmF0dG5baWR4XSAhPSB2YWwpIHsKKwkJCW1peC0+YXR0bltpZHhdID0gdmFsOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKwlpZiAoY2hhbmdlICYmIG1peC0+ZXBjbSkgeworCQlpZiAobWl4LT5lcGNtLT52b2ljZXNbMF0gJiYgbWl4LT5lcGNtLT52b2ljZXNbMV0pIHsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFZURlRfVk9MVU1FVEFSR0VULCBtaXgtPmVwY20tPnZvaWNlc1swXS0+bnVtYmVyLCBtaXgtPmF0dG5bMV0pOworCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVlRGVF9WT0xVTUVUQVJHRVQsIG1peC0+ZXBjbS0+dm9pY2VzWzFdLT5udW1iZXIsIG1peC0+YXR0blsyXSk7CisJCX0gZWxzZSBpZiAobWl4LT5lcGNtLT52b2ljZXNbMF0pIHsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFZURlRfVk9MVU1FVEFSR0VULCBtaXgtPmVwY20tPnZvaWNlc1swXS0+bnVtYmVyLCBtaXgtPmF0dG5bMF0pOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxX2F0dG5fY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiRU1VMTBLMSBQQ00gVm9sdW1lIiwKKwkuY291bnQgPQkzMiwKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazFfYXR0bl9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMV9hdHRuX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwazFfYXR0bl9wdXQKK307CisKKy8qIE11dGljaGFubmVsIFBDTSBzdHJlYW0gY29udHJvbHMgKi8KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfc2VuZF9yb3V0aW5nX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZW11LT5hdWRpZ3kgPyA4IDogNDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IGVtdS0+YXVkaWd5ID8gMHgzZiA6IDB4MGY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZWZ4X3NlbmRfcm91dGluZ19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4ID0gJmVtdS0+ZWZ4X3BjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJaW50IGlkeDsKKwlpbnQgbnVtX2VmeCA9IGVtdS0+YXVkaWd5ID8gOCA6IDQ7CisJaW50IG1hc2sgPSBlbXUtPmF1ZGlneSA/IDB4M2YgOiAweDBmOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9lZng7IGlkeCsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpZHhdID0gCisJCQltaXgtPnNlbmRfcm91dGluZ1swXVtpZHhdICYgbWFzazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZWZ4X3NlbmRfcm91dGluZ19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4ID0gJmVtdS0+ZWZ4X3BjbV9taXhlcltjaF07CisJaW50IGNoYW5nZSA9IDAsIGlkeCwgdmFsOworCWludCBudW1fZWZ4ID0gZW11LT5hdWRpZ3kgPyA4IDogNDsKKwlpbnQgbWFzayA9IGVtdS0+YXVkaWd5ID8gMHgzZiA6IDB4MGY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2VmeDsgaWR4KyspIHsKKwkJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaWR4XSAmIG1hc2s7CisJCWlmIChtaXgtPnNlbmRfcm91dGluZ1swXVtpZHhdICE9IHZhbCkgeworCQkJbWl4LT5zZW5kX3JvdXRpbmdbMF1baWR4XSA9IHZhbDsKKwkJCWNoYW5nZSA9IDE7CisJCX0KKwl9CQorCisJaWYgKGNoYW5nZSAmJiBtaXgtPmVwY20pIHsKKwkJaWYgKG1peC0+ZXBjbS0+dm9pY2VzW2NoXSkgeworCQkJdXBkYXRlX2VtdTEwazFfZnhydChlbXUsIG1peC0+ZXBjbS0+dm9pY2VzW2NoXS0+bnVtYmVyLAorCQkJCQkmbWl4LT5zZW5kX3JvdXRpbmdbMF1bMF0pOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxX2VmeF9zZW5kX3JvdXRpbmdfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgIk11bHRpY2hhbm5lbCBQQ00gU2VuZCBSb3V0aW5nIiwKKwkuY291bnQgPQkxNiwKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazFfZWZ4X3NlbmRfcm91dGluZ19pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMV9lZnhfc2VuZF9yb3V0aW5nX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwazFfZWZ4X3NlbmRfcm91dGluZ19wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZWZ4X3NlbmRfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZW11LT5hdWRpZ3kgPyA4IDogNDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfc2VuZF92b2x1bWVfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4ID0gJmVtdS0+ZWZ4X3BjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJaW50IGlkeDsKKwlpbnQgbnVtX2VmeCA9IGVtdS0+YXVkaWd5ID8gOCA6IDQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2VmeDsgaWR4KyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gPSBtaXgtPnNlbmRfdm9sdW1lWzBdW2lkeF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2VmeF9zZW5kX3ZvbHVtZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2ggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXggPSAmZW11LT5lZnhfcGNtX21peGVyW2NoXTsKKwlpbnQgY2hhbmdlID0gMCwgaWR4LCB2YWw7CisJaW50IG51bV9lZnggPSBlbXUtPmF1ZGlneSA/IDggOiA0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9lZng7IGlkeCsrKSB7CisJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gJiAyNTU7CisJCWlmIChtaXgtPnNlbmRfdm9sdW1lWzBdW2lkeF0gIT0gdmFsKSB7CisJCQltaXgtPnNlbmRfdm9sdW1lWzBdW2lkeF0gPSB2YWw7CisJCQljaGFuZ2UgPSAxOworCQl9CisJfQorCWlmIChjaGFuZ2UgJiYgbWl4LT5lcGNtKSB7CisJCWlmIChtaXgtPmVwY20tPnZvaWNlc1tjaF0pIHsKKwkJCXVwZGF0ZV9lbXUxMGsxX3NlbmRfdm9sdW1lKGVtdSwgbWl4LT5lcGNtLT52b2ljZXNbY2hdLT5udW1iZXIsCisJCQkJCQkgICAmbWl4LT5zZW5kX3ZvbHVtZVswXVswXSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZW11MTBrMV9lZnhfc2VuZF92b2x1bWVfY29udHJvbCA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgIk11bHRpY2hhbm5lbCBQQ00gU2VuZCBWb2x1bWUiLAorCS5jb3VudCA9CTE2LAorCS5pbmZvID0gICAgICAgICBzbmRfZW11MTBrMV9lZnhfc2VuZF92b2x1bWVfaW5mbywKKwkuZ2V0ID0gICAgICAgICAgc25kX2VtdTEwazFfZWZ4X3NlbmRfdm9sdW1lX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwazFfZWZ4X3NlbmRfdm9sdW1lX3B1dAorfTsKKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfYXR0bl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweGZmZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZWZ4X2F0dG5fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4ID0gJmVtdS0+ZWZ4X3BjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtaXgtPmF0dG5bMF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2VmeF9hdHRuX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2ggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXggPSAmZW11LT5lZnhfcGNtX21peGVyW2NoXTsKKwlpbnQgY2hhbmdlID0gMCwgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4ZmZmZjsKKwlpZiAobWl4LT5hdHRuWzBdICE9IHZhbCkgeworCQltaXgtPmF0dG5bMF0gPSB2YWw7CisJCWNoYW5nZSA9IDE7CisJfQorCWlmIChjaGFuZ2UgJiYgbWl4LT5lcGNtKSB7CisJCWlmIChtaXgtPmVwY20tPnZvaWNlc1tjaF0pIHsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFZURlRfVk9MVU1FVEFSR0VULCBtaXgtPmVwY20tPnZvaWNlc1tjaF0tPm51bWJlciwgbWl4LT5hdHRuWzBdKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZW11MTBrMV9lZnhfYXR0bl9jb250cm9sID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAgICAgICAiTXVsdGljaGFubmVsIFBDTSBWb2x1bWUiLAorCS5jb3VudCA9CTE2LAorCS5pbmZvID0gICAgICAgICBzbmRfZW11MTBrMV9lZnhfYXR0bl9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTBrMV9lZnhfYXR0bl9nZXQsCisJLnB1dCA9ICAgICAgICAgIHNuZF9lbXUxMGsxX2VmeF9hdHRuX3B1dAorfTsKKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zaGFyZWRfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zaGFyZWRfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAoZW11LT5hdWRpZ3kpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpICYgQV9JT0NGR19HUE9VVDAgPyAxIDogMDsKKwllbHNlCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaW5sKGVtdS0+cG9ydCArIEhDRkcpICYgSENGR19HUE9VVDAgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9zaGFyZWRfc3BkaWZfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgcmVnLCB2YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChlbXUtPmF1ZGlneSkgeworCQlyZWcgPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gQV9JT0NGR19HUE9VVDAgOiAwOworCQljaGFuZ2UgPSAocmVnICYgQV9JT0NGR19HUE9VVDApICE9IHZhbDsKKwkJaWYgKGNoYW5nZSkgeworCQkJcmVnICY9IH5BX0lPQ0ZHX0dQT1VUMDsKKwkJCXJlZyB8PSB2YWw7CisJCQlvdXRsKHJlZyB8IHZhbCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCX0KKwl9CisJcmVnID0gaW5sKGVtdS0+cG9ydCArIEhDRkcpOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gSENGR19HUE9VVDAgOiAwOworCWNoYW5nZSB8PSAocmVnICYgSENGR19HUE9VVDApICE9IHZhbDsKKwlpZiAoY2hhbmdlKSB7CisJCXJlZyAmPSB+SENGR19HUE9VVDA7CisJCXJlZyB8PSB2YWw7CisJCW91dGwocmVnIHwgdmFsLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazFfc2hhcmVkX3NwZGlmIF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCSJTQiBMaXZlIEFuYWxvZy9EaWdpdGFsIE91dHB1dCBKYWNrIiwKKwkuaW5mbyA9CQlzbmRfZW11MTBrMV9zaGFyZWRfc3BkaWZfaW5mbywKKwkuZ2V0ID0JCXNuZF9lbXUxMGsxX3NoYXJlZF9zcGRpZl9nZXQsCisJLnB1dCA9CQlzbmRfZW11MTBrMV9zaGFyZWRfc3BkaWZfcHV0Cit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9hdWRpZ3lfc2hhcmVkX3NwZGlmIF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCSJBdWRpZ3kgQW5hbG9nL0RpZ2l0YWwgT3V0cHV0IEphY2siLAorCS5pbmZvID0JCXNuZF9lbXUxMGsxX3NoYXJlZF9zcGRpZl9pbmZvLAorCS5nZXQgPQkJc25kX2VtdTEwazFfc2hhcmVkX3NwZGlmX2dldCwKKwkucHV0ID0JCXNuZF9lbXUxMGsxX3NoYXJlZF9zcGRpZl9wdXQKK307CisKKy8qCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJZW11MTBrMV90ICplbXUgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJZW11LT5hYzk3ID0gTlVMTDsKK30KKworLyoKKyAqLworc3RhdGljIGludCByZW1vdmVfY3RsKHNuZF9jYXJkX3QgKmNhcmQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc25kX2N0bF9lbGVtX2lkX3QgaWQ7CisJbWVtc2V0KCZpZCwgMCwgc2l6ZW9mKGlkKSk7CisJc3RyY3B5KGlkLm5hbWUsIG5hbWUpOworCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJcmV0dXJuIHNuZF9jdGxfcmVtb3ZlX2lkKGNhcmQsICZpZCk7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfdCAqY3RsX2ZpbmQoc25kX2NhcmRfdCAqY2FyZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCBzaWQ7CisJbWVtc2V0KCZzaWQsIDAsIHNpemVvZihzaWQpKTsKKwlzdHJjcHkoc2lkLm5hbWUsIG5hbWUpOworCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCXJldHVybiBzbmRfY3RsX2ZpbmRfaWQoY2FyZCwgJnNpZCk7Cit9CisKK3N0YXRpYyBpbnQgcmVuYW1lX2N0bChzbmRfY2FyZF90ICpjYXJkLCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bCA9IGN0bF9maW5kKGNhcmQsIHNyYyk7CisJaWYgKGtjdGwpIHsKKwkJc3RyY3B5KGtjdGwtPmlkLm5hbWUsIGRzdCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9taXhlcihlbXUxMGsxX3QgKmVtdSkKK3sKKwlpbnQgZXJyLCBwY207CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJc25kX2NhcmRfdCAqY2FyZCA9IGVtdS0+Y2FyZDsKKwljaGFyICoqYzsKKwlzdGF0aWMgY2hhciAqZW11MTBrMV9yZW1vdmVfY3Rsc1tdID0geworCQkvKiBubyBBQzk3IG1vbm8sIHN1cnJvdW5kLCBjZW50ZXIvbGZlICovCisJCSJNYXN0ZXIgTW9ubyBQbGF5YmFjayBTd2l0Y2giLAorCQkiTWFzdGVyIE1vbm8gUGxheWJhY2sgVm9sdW1lIiwKKwkJIlBDTSBPdXQgUGF0aCAmIE11dGUiLAorCQkiTW9ubyBPdXRwdXQgU2VsZWN0IiwKKwkJIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsCisJCSJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLAorCQkiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCSJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJIkxGRSBQbGF5YmFjayBTd2l0Y2giLAorCQkiTEZFIFBsYXliYWNrIFZvbHVtZSIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjaGFyICplbXUxMGsxX3JlbmFtZV9jdGxzW10gPSB7CisJCSJTdXJyb3VuZCBEaWdpdGFsIFBsYXliYWNrIFZvbHVtZSIsICJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLAorCQkiQ2VudGVyIERpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIiwgIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCQkiTEZFIERpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIiwgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbW92ZV9jdGxzW10gPSB7CisJCS8qIE1hc3Rlci9QQ00gY29udHJvbHMgb24gYWM5NyBvZiBBdWRpZ3kgaGFzIG5vIGVmZmVjdCAqLworCQkiUENNIFBsYXliYWNrIFN3aXRjaCIsCisJCSJQQ00gUGxheWJhY2sgVm9sdW1lIiwKKwkJIk1hc3RlciBNb25vIFBsYXliYWNrIFN3aXRjaCIsCisJCSJNYXN0ZXIgTW9ubyBQbGF5YmFjayBWb2x1bWUiLAorCQkiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCSJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJIlBDTSBPdXQgUGF0aCAmIE11dGUiLAorCQkiTW9ubyBPdXRwdXQgU2VsZWN0IiwKKwkJLyogcmVtb3ZlIHVudXNlZCBBQzk3IGNhcHR1cmUgY29udHJvbHMgKi8KKwkJIkNhcHR1cmUgU291cmNlIiwKKwkJIkNhcHR1cmUgU3dpdGNoIiwKKwkJIkNhcHR1cmUgVm9sdW1lIiwKKwkJIk1pYyBTZWxlY3QiLAorCQkiVmlkZW8gUGxheWJhY2sgU3dpdGNoIiwKKwkJIlZpZGVvIFBsYXliYWNrIFZvbHVtZSIsCisJCSJNaWMgUGxheWJhY2sgU3dpdGNoIiwKKwkJIk1pYyBQbGF5YmFjayBWb2x1bWUiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbmFtZV9jdGxzW10gPSB7CisJCS8qIHVzZSBjb252ZW50aW9uYWwgbmFtZXMgKi8KKwkJIldhdmUgUGxheWJhY2sgVm9sdW1lIiwgIlBDTSBQbGF5YmFjayBWb2x1bWUiLAorCQkvKiAiV2F2ZSBDYXB0dXJlIFZvbHVtZSIsICJQQ00gQ2FwdHVyZSBWb2x1bWUiLCAqLworCQkiV2F2ZSBNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkiQU1pYyBQbGF5YmFjayBWb2x1bWUiLCAiTWljIFBsYXliYWNrIFZvbHVtZSIsCisJCU5VTEwKKwl9OworCisJaWYgKCFlbXUtPm5vX2FjOTcpIHsKKwkJYWM5N19idXNfdCAqcGJ1czsKKwkJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCQkud3JpdGUgPSBzbmRfZW11MTBrMV9hYzk3X3dyaXRlLAorCQkJLnJlYWQgPSBzbmRfZW11MTBrMV9hYzk3X3JlYWQsCisJCX07CisKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoZW11LT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXBidXMtPm5vX3ZyYSA9IDE7IC8qIHdlIGRvbid0IG5lZWQgVlJBICovCisJCQorCQltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJCWFjOTcucHJpdmF0ZV9kYXRhID0gZW11OworCQlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxX21peGVyX2ZyZWVfYWM5NzsKKwkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9OT19TUERJRjsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmVtdS0+YWM5NykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChlbXUtPmF1ZGlneSkgeworCQkJLyogc2V0IG1hc3RlciB2b2x1bWUgdG8gMCBkQiAqLworCQkJc25kX2FjOTdfd3JpdGUoZW11LT5hYzk3LCBBQzk3X01BU1RFUiwgMHgwMDAwKTsKKwkJCS8qIHNldCBjYXB0dXJlIHNvdXJjZSB0byBtaWMgKi8KKwkJCXNuZF9hYzk3X3dyaXRlKGVtdS0+YWM5NywgQUM5N19SRUNfU0VMLCAweDAwMDApOworCQkJYyA9IGF1ZGlneV9yZW1vdmVfY3RsczsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDcmVkaXRzIGZvciBjYXJkcyBiYXNlZCBvbiBTVEFDOTc1ODoKKwkJCSAqICAgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKwkJCSAqICAgVm9sdXNwYSA8dm9sdXNwYUBjb21oZW0uc2U+CisJCQkgKi8KKwkJCWlmIChlbXUtPmFjOTctPmlkID09IEFDOTdfSURfU1RBQzk3NTgpIHsKKwkJCQllbXUtPnJlYXJfYWM5NyA9IDE7CisJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFJ8QUM5N1NMT1RfTEZFfEFDOTdTTE9UX1JFQVJfTEVGVHxBQzk3U0xPVF9SRUFSX1JJR0hUKTsKKwkJCX0KKwkJCS8qIHJlbW92ZSB1bnVzZWQgQUM5NyBjb250cm9scyAqLworCQkJc25kX2FjOTdfd3JpdGUoZW11LT5hYzk3LCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMHgwMjAyKTsKKwkJCXNuZF9hYzk3X3dyaXRlKGVtdS0+YWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RFUiwgMHgwMjAyKTsKKwkJCWMgPSBlbXUxMGsxX3JlbW92ZV9jdGxzOworCQl9CisJCWZvciAoOyAqYzsgYysrKQorCQkJcmVtb3ZlX2N0bChjYXJkLCAqYyk7CisJfSBlbHNlIHsKKwkJaWYgKGVtdS0+QVBTKQorCQkJc3RyY3B5KGVtdS0+Y2FyZC0+bWl4ZXJuYW1lLCAiRU1VIEFQUyIpOworCQllbHNlIGlmIChlbXUtPmF1ZGlneSkKKwkJCXN0cmNweShlbXUtPmNhcmQtPm1peGVybmFtZSwgIlNCIEF1ZGlneSIpOworCQllbHNlCisJCQlzdHJjcHkoZW11LT5jYXJkLT5taXhlcm5hbWUsICJFbXUxMGsxIik7CisJfQorCisJaWYgKGVtdS0+YXVkaWd5KQorCQljID0gYXVkaWd5X3JlbmFtZV9jdGxzOworCWVsc2UKKwkJYyA9IGVtdTEwazFfcmVuYW1lX2N0bHM7CisJZm9yICg7ICpjOyBjICs9IDIpCisJCXJlbmFtZV9jdGwoY2FyZCwgY1swXSwgY1sxXSk7CisKKwlpZiAoKGtjdGwgPSBlbXUtPmN0bF9zZW5kX3JvdXRpbmcgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX3NlbmRfcm91dGluZ19jb250cm9sLCBlbXUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGtjdGwgPSBlbXUtPmN0bF9zZW5kX3ZvbHVtZSA9IHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwazFfc2VuZF92b2x1bWVfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCXJldHVybiBlcnI7CisJaWYgKChrY3RsID0gZW11LT5jdGxfYXR0biA9IHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwazFfYXR0bl9jb250cm9sLCBlbXUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJcmV0dXJuIGVycjsKKworCWlmICgoa2N0bCA9IGVtdS0+Y3RsX2VmeF9zZW5kX3JvdXRpbmcgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX2VmeF9zZW5kX3JvdXRpbmdfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCXJldHVybiBlcnI7CisJCisJaWYgKChrY3RsID0gZW11LT5jdGxfZWZ4X3NlbmRfdm9sdW1lID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9lZnhfc2VuZF92b2x1bWVfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCXJldHVybiBlcnI7CisJCisJaWYgKChrY3RsID0gZW11LT5jdGxfZWZ4X2F0dG4gPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX2VmeF9hdHRuX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorCQlyZXR1cm4gZXJyOworCisJLyogaW5pdGlhbGl6ZSB0aGUgcm91dGluZyBhbmQgdm9sdW1lIHRhYmxlIGZvciBlYWNoIHBjbSBwbGF5YmFjayBzdHJlYW0gKi8KKwlmb3IgKHBjbSA9IDA7IHBjbSA8IDMyOyBwY20rKykgeworCQllbXUxMGsxX3BjbV9taXhlcl90ICptaXg7CisJCWludCB2OworCQkKKwkJbWl4ID0gJmVtdS0+cGNtX21peGVyW3BjbV07CisJCW1peC0+ZXBjbSA9IE5VTEw7CisKKwkJZm9yICh2ID0gMDsgdiA8IDQ7IHYrKykKKwkJCW1peC0+c2VuZF9yb3V0aW5nWzBdW3ZdID0gCisJCQkJbWl4LT5zZW5kX3JvdXRpbmdbMV1bdl0gPSAKKwkJCQltaXgtPnNlbmRfcm91dGluZ1syXVt2XSA9IHY7CisJCQorCQltZW1zZXQoJm1peC0+c2VuZF92b2x1bWUsIDAsIHNpemVvZihtaXgtPnNlbmRfdm9sdW1lKSk7CisJCW1peC0+c2VuZF92b2x1bWVbMF1bMF0gPSBtaXgtPnNlbmRfdm9sdW1lWzBdWzFdID0KKwkJbWl4LT5zZW5kX3ZvbHVtZVsxXVswXSA9IG1peC0+c2VuZF92b2x1bWVbMl1bMV0gPSAyNTU7CisJCQorCQltaXgtPmF0dG5bMF0gPSBtaXgtPmF0dG5bMV0gPSBtaXgtPmF0dG5bMl0gPSAweGZmZmY7CisJfQorCQorCS8qIGluaXRpYWxpemUgdGhlIHJvdXRpbmcgYW5kIHZvbHVtZSB0YWJsZSBmb3IgdGhlIG11bHRpY2hhbm5lbCBwbGF5YmFjayBzdHJlYW0gKi8KKwlmb3IgKHBjbSA9IDA7IHBjbSA8IE5VTV9FRlhfUExBWUJBQ0s7IHBjbSsrKSB7CisJCWVtdTEwazFfcGNtX21peGVyX3QgKm1peDsKKwkJaW50IHY7CisJCQorCQltaXggPSAmZW11LT5lZnhfcGNtX21peGVyW3BjbV07CisJCW1peC0+ZXBjbSA9IE5VTEw7CisKKwkJbWl4LT5zZW5kX3JvdXRpbmdbMF1bMF0gPSBwY207CisJCW1peC0+c2VuZF9yb3V0aW5nWzBdWzFdID0gKHBjbSA9PSAwKSA/IDEgOiAwOworCQlmb3IgKHYgPSAwOyB2IDwgMjsgdisrKQorCQkJbWl4LT5zZW5kX3JvdXRpbmdbMF1bMit2XSA9IDEzK3Y7CisJCWlmIChlbXUtPmF1ZGlneSkKKwkJCWZvciAodiA9IDA7IHYgPCA0OyB2KyspCisJCQkJbWl4LT5zZW5kX3JvdXRpbmdbMF1bNCt2XSA9IDYwK3Y7CisJCQorCQltZW1zZXQoJm1peC0+c2VuZF92b2x1bWUsIDAsIHNpemVvZihtaXgtPnNlbmRfdm9sdW1lKSk7CisJCW1peC0+c2VuZF92b2x1bWVbMF1bMF0gID0gMjU1OworCQkKKwkJbWl4LT5hdHRuWzBdID0gMHhmZmZmOworCX0KKwkKKwlpZiAoISBlbXUtPkFQUykgeyAvKiBGSVhNRTogQVBTIGhhcyB0aGVzZSBjb250cm9scz8gKi8KKwkJLyogc2IgbGl2ZSEgYW5kIGF1ZGlneSAqLworCQlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX3NwZGlmX21hc2tfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwazFfc3BkaWZfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGVtdS0+YXVkaWd5KSB7CisJCWlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2F1ZGlneV9zaGFyZWRfc3BkaWYsIGVtdSkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9hdWRpZ3lfc3BkaWZfb3V0cHV0X3JhdGUsIGVtdSkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoISBlbXUtPkFQUykgeworCQkvKiBzYiBsaXZlISAqLworCQlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX3NoYXJlZF9zcGRpZiwgZW11KSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChlbXUtPmF1ZGlneSAmJiBlbXUtPnJldmlzaW9uID09IDQpIHsgLyogUDE2ViAqLworCQlpZiAoKGVyciA9IHNuZF9wMTZ2X21peGVyKGVtdSkpKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjU3NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBNUFUtNDAxIGluIFVBUlQgbW9kZQorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisKKyNkZWZpbmUgRU1VMTBLMV9NSURJX01PREVfSU5QVVQJCSgxPDwwKQorI2RlZmluZSBFTVUxMEsxX01JRElfTU9ERV9PVVRQVVQJKDE8PDEpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtcHU0MDFfcmVhZChlbXUxMGsxX3QgKmVtdSwgZW11MTBrMV9taWRpX3QgKm1wdSwgaW50IGlkeCkKK3sKKwlpZiAoZW11LT5hdWRpZ3kpCisJCXJldHVybiAodW5zaWduZWQgY2hhcilzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIG1wdS0+cG9ydCArIGlkeCwgMCk7CisJZWxzZQorCQlyZXR1cm4gaW5iKGVtdS0+cG9ydCArIG1wdS0+cG9ydCArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHU0MDFfd3JpdGUoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWlkaV90ICptcHUsIGludCBkYXRhLCBpbnQgaWR4KQoreworCWlmIChlbXUtPmF1ZGlneSkKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgbXB1LT5wb3J0ICsgaWR4LCAwLCBkYXRhKTsKKwllbHNlCisJCW91dGIoZGF0YSwgZW11LT5wb3J0ICsgbXB1LT5wb3J0ICsgaWR4KTsKK30KKworI2RlZmluZSBtcHU0MDFfd3JpdGVfZGF0YShlbXUsIG1wdSwgZGF0YSkJbXB1NDAxX3dyaXRlKGVtdSwgbXB1LCBkYXRhLCAwKQorI2RlZmluZSBtcHU0MDFfd3JpdGVfY21kKGVtdSwgbXB1LCBkYXRhKQltcHU0MDFfd3JpdGUoZW11LCBtcHUsIGRhdGEsIDEpCisjZGVmaW5lIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpCQltcHU0MDFfcmVhZChlbXUsIG1wdSwgMCkKKyNkZWZpbmUgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1wdSkJCW1wdTQwMV9yZWFkKGVtdSwgbXB1LCAxKQorCisjZGVmaW5lIG1wdTQwMV9pbnB1dF9hdmFpbChlbXUsbXB1KQkoIShtcHU0MDFfcmVhZF9zdGF0KGVtdSxtcHUpICYgMHg4MCkpCisjZGVmaW5lIG1wdTQwMV9vdXRwdXRfcmVhZHkoZW11LG1wdSkJKCEobXB1NDAxX3JlYWRfc3RhdChlbXUsbXB1KSAmIDB4NDApKQorCisjZGVmaW5lIE1QVTQwMV9SRVNFVAkJMHhmZgorI2RlZmluZSBNUFU0MDFfRU5URVJfVUFSVAkweDNmCisjZGVmaW5lIE1QVTQwMV9BQ0sJCTB4ZmUKKworc3RhdGljIHZvaWQgbXB1NDAxX2NsZWFyX3J4KGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX21pZGlfdCAqbXB1KQoreworCWludCB0aW1lb3V0ID0gMTAwMDAwOworCWZvciAoOyB0aW1lb3V0ID4gMCAmJiBtcHU0MDFfaW5wdXRfYXZhaWwoZW11LCBtcHUpOyB0aW1lb3V0LS0pCisJCW1wdTQwMV9yZWFkX2RhdGEoZW11LCBtcHUpOworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlpZiAodGltZW91dCA8PSAwKQorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IGNsZWFyIHJ4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CisjZW5kaWYKK30KKworLyoKKworICovCisKK3N0YXRpYyB2b2lkIGRvX2VtdTEwazFfbWlkaV9pbnRlcnJ1cHQoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWlkaV90ICptaWRpLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGNoYXIgYnl0ZTsKKworCWlmIChtaWRpLT5ybWlkaSA9PSBOVUxMKSB7CisJCXNuZF9lbXUxMGsxX2ludHJfZGlzYWJsZShlbXUsIG1pZGktPnR4X2VuYWJsZSB8IG1pZGktPnJ4X2VuYWJsZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJm1pZGktPmlucHV0X2xvY2spOworCWlmICgoc3RhdHVzICYgbWlkaS0+aXByX3J4KSAmJiBtcHU0MDFfaW5wdXRfYXZhaWwoZW11LCBtaWRpKSkgeworCQlpZiAoIShtaWRpLT5taWRpX21vZGUgJiBFTVUxMEsxX01JRElfTU9ERV9JTlBVVCkpIHsKKwkJCW1wdTQwMV9jbGVhcl9yeChlbXUsIG1pZGkpOworCQl9IGVsc2UgeworCQkJYnl0ZSA9IG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKTsKKwkJCWlmIChtaWRpLT5zdWJzdHJlYW1faW5wdXQpCisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZShtaWRpLT5zdWJzdHJlYW1faW5wdXQsICZieXRlLCAxKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbWlkaS0+aW5wdXRfbG9jayk7CisKKwlzcGluX2xvY2soJm1pZGktPm91dHB1dF9sb2NrKTsKKwlpZiAoKHN0YXR1cyAmIG1pZGktPmlwcl90eCkgJiYgbXB1NDAxX291dHB1dF9yZWFkeShlbXUsIG1pZGkpKSB7CisJCWlmIChtaWRpLT5zdWJzdHJlYW1fb3V0cHV0ICYmCisJCSAgICBzbmRfcmF3bWlkaV90cmFuc21pdChtaWRpLT5zdWJzdHJlYW1fb3V0cHV0LCAmYnl0ZSwgMSkgPT0gMSkgeworCQkJbXB1NDAxX3dyaXRlX2RhdGEoZW11LCBtaWRpLCBieXRlKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9lbXUxMGsxX2ludHJfZGlzYWJsZShlbXUsIG1pZGktPnR4X2VuYWJsZSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm1pZGktPm91dHB1dF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfbWlkaV9pbnRlcnJ1cHQoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisJZG9fZW11MTBrMV9taWRpX2ludGVycnVwdChlbXUsICZlbXUtPm1pZGksIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX21pZGlfaW50ZXJydXB0MihlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwlkb19lbXUxMGsxX21pZGlfaW50ZXJydXB0KGVtdSwgJmVtdS0+bWlkaTIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX21pZGlfY21kKGVtdTEwazFfdCAqIGVtdSwgZW11MTBrMV9taWRpX3QgKm1pZGksIHVuc2lnbmVkIGNoYXIgY21kLCBpbnQgYWNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWVvdXQsIG9rOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPmlucHV0X2xvY2ssIGZsYWdzKTsKKwltcHU0MDFfd3JpdGVfZGF0YShlbXUsIG1pZGksIDB4MDApOworCS8qIG1wdTQwMV9jbGVhcl9yeChlbXUsIG1pZGkpOyAqLworCisJbXB1NDAxX3dyaXRlX2NtZChlbXUsIG1pZGksIGNtZCk7CisJaWYgKGFjaykgeworCQlvayA9IDA7CisJCXRpbWVvdXQgPSAxMDAwMDsKKwkJd2hpbGUgKCFvayAmJiB0aW1lb3V0LS0gPiAwKSB7CisJCQlpZiAobXB1NDAxX2lucHV0X2F2YWlsKGVtdSwgbWlkaSkpIHsKKwkJCQlpZiAobXB1NDAxX3JlYWRfZGF0YShlbXUsIG1pZGkpID09IE1QVTQwMV9BQ0spCisJCQkJCW9rID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIW9rICYmIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKSA9PSBNUFU0MDFfQUNLKQorCQkJb2sgPSAxOworCX0gZWxzZSB7CisJCW9rID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+aW5wdXRfbG9jaywgZmxhZ3MpOworCWlmICghb2spCisJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pZGlfY21kOiAweCV4IGZhaWxlZCBhdCAweCVseCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAorCQkJICAgY21kLCBlbXUtPnBvcnQsCisJCQkgICBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbWlkaSksCisJCQkgICBtcHU0MDFfcmVhZF9kYXRhKGVtdSwgbWlkaSkpOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX21pZGlfaW5wdXRfb3BlbihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdTsKKwllbXUxMGsxX21pZGlfdCAqbWlkaSA9IChlbXUxMGsxX21pZGlfdCAqKXN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZW11ID0gbWlkaS0+ZW11OworCXNuZF9hc3NlcnQoZW11LCByZXR1cm4gLUVOWElPKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJbWlkaS0+bWlkaV9tb2RlIHw9IEVNVTEwSzFfTUlESV9NT0RFX0lOUFVUOworCW1pZGktPnN1YnN0cmVhbV9pbnB1dCA9IHN1YnN0cmVhbTsKKwlpZiAoIShtaWRpLT5taWRpX21vZGUgJiBFTVUxMEsxX01JRElfTU9ERV9PVVRQVVQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCQlzbmRfZW11MTBrMV9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMSk7CisJCXNuZF9lbXUxMGsxX21pZGlfY21kKGVtdSwgbWlkaSwgTVBVNDAxX0VOVEVSX1VBUlQsIDEpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9taWRpX291dHB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11OworCWVtdTEwazFfbWlkaV90ICptaWRpID0gKGVtdTEwazFfbWlkaV90ICopc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbXUgPSBtaWRpLT5lbXU7CisJc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwltaWRpLT5taWRpX21vZGUgfD0gRU1VMTBLMV9NSURJX01PREVfT1VUUFVUOworCW1pZGktPnN1YnN0cmVhbV9vdXRwdXQgPSBzdWJzdHJlYW07CisJaWYgKCEobWlkaS0+bWlkaV9tb2RlICYgRU1VMTBLMV9NSURJX01PREVfSU5QVVQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCQlzbmRfZW11MTBrMV9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMSk7CisJCXNuZF9lbXUxMGsxX21pZGlfY21kKGVtdSwgbWlkaSwgTVBVNDAxX0VOVEVSX1VBUlQsIDEpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9taWRpX2lucHV0X2Nsb3NlKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11OworCWVtdTEwazFfbWlkaV90ICptaWRpID0gKGVtdTEwazFfbWlkaV90ICopc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbXUgPSBtaWRpLT5lbXU7CisJc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBtaWRpLT5yeF9lbmFibGUpOworCW1pZGktPm1pZGlfbW9kZSAmPSB+RU1VMTBLMV9NSURJX01PREVfSU5QVVQ7CisJbWlkaS0+c3Vic3RyZWFtX2lucHV0ID0gTlVMTDsKKwlpZiAoIShtaWRpLT5taWRpX21vZGUgJiBFTVUxMEsxX01JRElfTU9ERV9PVVRQVVQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCQlzbmRfZW11MTBrMV9taWRpX2NtZChlbXUsIG1pZGksIE1QVTQwMV9SRVNFVCwgMCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX21pZGlfb3V0cHV0X2Nsb3NlKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11OworCWVtdTEwazFfbWlkaV90ICptaWRpID0gKGVtdTEwazFfbWlkaV90ICopc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbXUgPSBtaWRpLT5lbXU7CisJc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBtaWRpLT50eF9lbmFibGUpOworCW1pZGktPm1pZGlfbW9kZSAmPSB+RU1VMTBLMV9NSURJX01PREVfT1VUUFVUOworCW1pZGktPnN1YnN0cmVhbV9vdXRwdXQgPSBOVUxMOworCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFfTUlESV9NT0RFX0lOUFVUKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKKwkJc25kX2VtdTEwazFfbWlkaV9jbWQoZW11LCBtaWRpLCBNUFU0MDFfUkVTRVQsIDApOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfbWlkaV9pbnB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJZW11MTBrMV90ICplbXU7CisJZW11MTBrMV9taWRpX3QgKm1pZGkgPSAoZW11MTBrMV9taWRpX3QgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJZW11ID0gbWlkaS0+ZW11OworCXNuZF9hc3NlcnQoZW11LCByZXR1cm4pOworCisJaWYgKHVwKQorCQlzbmRfZW11MTBrMV9pbnRyX2VuYWJsZShlbXUsIG1pZGktPnJ4X2VuYWJsZSk7CisJZWxzZQorCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBtaWRpLT5yeF9lbmFibGUpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9taWRpX291dHB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJZW11MTBrMV90ICplbXU7CisJZW11MTBrMV9taWRpX3QgKm1pZGkgPSAoZW11MTBrMV9taWRpX3QgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVtdSA9IG1pZGktPmVtdTsKKwlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuKTsKKworCWlmICh1cCkgeworCQlpbnQgbWF4ID0gNDsKKwkJdW5zaWduZWQgY2hhciBieXRlOworCQorCQkvKiB0cnkgdG8gc2VuZCBzb21lIGFtb3VudCBvZiBieXRlcyBoZXJlIGJlZm9yZSBpbnRlcnJ1cHRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vdXRwdXRfbG9jaywgZmxhZ3MpOworCQl3aGlsZSAobWF4ID4gMCkgeworCQkJaWYgKG1wdTQwMV9vdXRwdXRfcmVhZHkoZW11LCBtaWRpKSkgeworCQkJCWlmICghKG1pZGktPm1pZGlfbW9kZSAmIEVNVTEwSzFfTUlESV9NT0RFX09VVFBVVCkgfHwKKwkJCQkgICAgc25kX3Jhd21pZGlfdHJhbnNtaXQoc3Vic3RyZWFtLCAmYnl0ZSwgMSkgIT0gMSkgeworCQkJCQkvKiBubyBtb3JlIGRhdGEgKi8KKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+b3V0cHV0X2xvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQltcHU0MDFfd3JpdGVfZGF0YShlbXUsIG1pZGksIGJ5dGUpOworCQkJCW1heC0tOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5vdXRwdXRfbG9jaywgZmxhZ3MpOworCQlzbmRfZW11MTBrMV9pbnRyX2VuYWJsZShlbXUsIG1pZGktPnR4X2VuYWJsZSk7CisJfSBlbHNlIHsKKwkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+dHhfZW5hYmxlKTsKKwl9Cit9CisKKy8qCisKKyAqLworCitzdGF0aWMgc25kX3Jhd21pZGlfb3BzX3Qgc25kX2VtdTEwazFfbWlkaV9vdXRwdXQgPQoreworCS5vcGVuID0JCXNuZF9lbXUxMGsxX21pZGlfb3V0cHV0X29wZW4sCisJLmNsb3NlID0Jc25kX2VtdTEwazFfbWlkaV9vdXRwdXRfY2xvc2UsCisJLnRyaWdnZXIgPQlzbmRfZW11MTBrMV9taWRpX291dHB1dF90cmlnZ2VyLAorfTsKKworc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9lbXUxMGsxX21pZGlfaW5wdXQgPQoreworCS5vcGVuID0JCXNuZF9lbXUxMGsxX21pZGlfaW5wdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZW11MTBrMV9taWRpX2lucHV0X2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX2VtdTEwazFfbWlkaV9pbnB1dF90cmlnZ2VyLAorfTsKKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfbWlkaV9mcmVlKHNuZF9yYXdtaWRpX3QgKnJtaWRpKQoreworCWVtdTEwazFfbWlkaV90ICptaWRpID0gKGVtdTEwazFfbWlkaV90ICopcm1pZGktPnByaXZhdGVfZGF0YTsKKwltaWRpLT5pbnRlcnJ1cHQgPSBOVUxMOworCW1pZGktPnJtaWRpID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9taWRpX2luaXQoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWlkaV90ICptaWRpLCBpbnQgZGV2aWNlLCBjaGFyICpuYW1lKQoreworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyhlbXUtPmNhcmQsIG5hbWUsIGRldmljZSwgMSwgMSwgJnJtaWRpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCW1pZGktPmVtdSA9IGVtdTsKKwlzcGluX2xvY2tfaW5pdCgmbWlkaS0+b3Blbl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWlkaS0+aW5wdXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1pZGktPm91dHB1dF9sb2NrKTsKKwlzdHJjcHkocm1pZGktPm5hbWUsIG5hbWUpOworCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVCwgJnNuZF9lbXUxMGsxX21pZGlfb3V0cHV0KTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwgJnNuZF9lbXUxMGsxX21pZGlfaW5wdXQpOworCXJtaWRpLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfAorCSAgICAgICAgICAgICAgICAgICAgIFNORFJWX1JBV01JRElfSU5GT19JTlBVVCB8CisJICAgICAgICAgICAgICAgICAgICAgU05EUlZfUkFXTUlESV9JTkZPX0RVUExFWDsKKwlybWlkaS0+cHJpdmF0ZV9kYXRhID0gbWlkaTsKKwlybWlkaS0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfbWlkaV9mcmVlOworCW1pZGktPnJtaWRpID0gcm1pZGk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2RldmluaXQgc25kX2VtdTEwazFfbWlkaShlbXUxMGsxX3QgKmVtdSkKK3sKKwllbXUxMGsxX21pZGlfdCAqbWlkaSA9ICZlbXUtPm1pZGk7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gZW11MTBrMV9taWRpX2luaXQoZW11LCBtaWRpLCAwLCAiRU1VMTBLMSBNUFUtNDAxIChVQVJUKSIpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwltaWRpLT50eF9lbmFibGUgPSBJTlRFX01JRElUWEVOQUJMRTsKKwltaWRpLT5yeF9lbmFibGUgPSBJTlRFX01JRElSWEVOQUJMRTsKKwltaWRpLT5wb3J0ID0gTVVEQVRBOworCW1pZGktPmlwcl90eCA9IElQUl9NSURJVFJBTlNCVUZFTVBUWTsKKwltaWRpLT5pcHJfcnggPSBJUFJfTUlESVJFQ1ZCVUZFTVBUWTsKKwltaWRpLT5pbnRlcnJ1cHQgPSBzbmRfZW11MTBrMV9taWRpX2ludGVycnVwdDsKKwlyZXR1cm4gMDsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9hdWRpZ3lfbWlkaShlbXUxMGsxX3QgKmVtdSkKK3sKKwllbXUxMGsxX21pZGlfdCAqbWlkaTsKKwlpbnQgZXJyOworCisJbWlkaSA9ICZlbXUtPm1pZGk7CisJaWYgKChlcnIgPSBlbXUxMGsxX21pZGlfaW5pdChlbXUsIG1pZGksIDAsICJBdWRpZ3kgTVBVLTQwMSAoVUFSVCkiKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbWlkaS0+dHhfZW5hYmxlID0gSU5URV9NSURJVFhFTkFCTEU7CisJbWlkaS0+cnhfZW5hYmxlID0gSU5URV9NSURJUlhFTkFCTEU7CisJbWlkaS0+cG9ydCA9IEFfTVVEQVRBMTsKKwltaWRpLT5pcHJfdHggPSBJUFJfTUlESVRSQU5TQlVGRU1QVFk7CisJbWlkaS0+aXByX3J4ID0gSVBSX01JRElSRUNWQlVGRU1QVFk7CisJbWlkaS0+aW50ZXJydXB0ID0gc25kX2VtdTEwazFfbWlkaV9pbnRlcnJ1cHQ7CisKKwltaWRpID0gJmVtdS0+bWlkaTI7CisJaWYgKChlcnIgPSBlbXUxMGsxX21pZGlfaW5pdChlbXUsIG1pZGksIDEsICJBdWRpZ3kgTVBVLTQwMSAjMiIpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwltaWRpLT50eF9lbmFibGUgPSBJTlRFX0FfTUlESVRYRU5BQkxFMjsKKwltaWRpLT5yeF9lbmFibGUgPSBJTlRFX0FfTUlESVJYRU5BQkxFMjsKKwltaWRpLT5wb3J0ID0gQV9NVURBVEEyOworCW1pZGktPmlwcl90eCA9IElQUl9BX01JRElUUkFOU0JVRkVNUFRZMjsKKwltaWRpLT5pcHJfcnggPSBJUFJfQV9NSURJUkVDVkJVRkVNUFRZMjsKKwltaWRpLT5pbnRlcnJ1cHQgPSBzbmRfZW11MTBrMV9taWRpX2ludGVycnVwdDI7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzJhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwpAQCAtMCwwICsxLDE3MjQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcyAvIFBDTSByb3V0aW5lcworICogIE11bHRpY2hhbm5lbCBQQ00gc3VwcG9ydCBDb3B5cmlnaHQgKGMpIExlZSBSZXZlbGwgPHJscmV2ZWxsQGpvZS1qb2IuY29tPgorICoKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvZW11MTBrMS5oPgorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wY21faW50ZXJydXB0KGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX3ZvaWNlX3QgKnZvaWNlKQoreworCWVtdTEwazFfcGNtX3QgKmVwY207CisKKwlpZiAoKGVwY20gPSB2b2ljZS0+ZXBjbSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChlcGNtLT5zdWJzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuOworI2lmIDAKKwlwcmludGsoIklSUTogcG9zaXRpb24gPSAweCV4LCBwZXJpb2QgPSAweCV4LCBzaXplID0gMHgleFxuIiwKKwkJCWVwY20tPnN1YnN0cmVhbS0+cnVudGltZS0+aHctPnBvaW50ZXIoZW11LCBlcGNtLT5zdWJzdHJlYW0pLAorCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKGVwY20tPnN1YnN0cmVhbSksCisJCQlzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSk7CisjZW5kaWYKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGVwY20tPnN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3BjbV9hYzk3YWRjX2ludGVycnVwdChlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKyNpZiAwCisJaWYgKHN0YXR1cyAmIElQUl9BRENCVUZIQUxGRlVMTCkgeworCQlpZiAoZW11LT5wY21fY2FwdHVyZV9zdWJzdHJlYW0tPnJ1bnRpbWUtPm1vZGUgPT0gU05EUlZfUENNX01PREVfRlJBTUUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChlbXUtPnBjbV9jYXB0dXJlX3N1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3BjbV9hYzk3bWljX2ludGVycnVwdChlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKyNpZiAwCisJaWYgKHN0YXR1cyAmIElQUl9NSUNCVUZIQUxGRlVMTCkgeworCQlpZiAoZW11LT5wY21fY2FwdHVyZV9taWNfc3Vic3RyZWFtLT5ydW50aW1lLT5tb2RlID09IFNORFJWX1BDTV9NT0RFX0ZSQU1FKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZgorCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoZW11LT5wY21fY2FwdHVyZV9taWNfc3Vic3RyZWFtKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX2VmeF9pbnRlcnJ1cHQoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisjaWYgMAorCWlmIChzdGF0dXMgJiBJUFJfRUZYQlVGSEFMRkZVTEwpIHsKKwkJaWYgKGVtdS0+cGNtX2NhcHR1cmVfZWZ4X3N1YnN0cmVhbS0+cnVudGltZS0+bW9kZSA9PSBTTkRSVl9QQ01fTU9ERV9GUkFNRSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGVtdS0+cGNtX2NhcHR1cmVfZWZ4X3N1YnN0cmVhbSk7Cit9CSAKKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcHRyOworCisJaWYgKCFlcGNtLT5ydW5uaW5nKQorCQlyZXR1cm4gMDsKKwlwdHIgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIENDQ0EsIGVwY20tPnZvaWNlc1swXS0+bnVtYmVyKSAmIDB4MDBmZmZmZmY7CisJcHRyICs9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCXB0ciAtPSBlcGNtLT5jY2NhX3N0YXJ0X2FkZHI7CisJcHRyICU9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9wY21fY2hhbm5lbF9hbGxvYyhlbXUxMGsxX3BjbV90ICogZXBjbSwgaW50IHZvaWNlcykKK3sKKwlpbnQgZXJyLCBpOworCisJaWYgKGVwY20tPnZvaWNlc1sxXSAhPSBOVUxMICYmIHZvaWNlcyA8IDIpIHsKKwkJc25kX2VtdTEwazFfdm9pY2VfZnJlZShlcGNtLT5lbXUsIGVwY20tPnZvaWNlc1sxXSk7CisJCWVwY20tPnZvaWNlc1sxXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCB2b2ljZXM7IGkrKykgeworCQlpZiAoZXBjbS0+dm9pY2VzW2ldID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gdm9pY2VzKQorCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVwY20tPnZvaWNlcyk7IGkrKykgeworCQlpZiAoZXBjbS0+dm9pY2VzW2ldKSB7CisJCQlzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVwY20tPmVtdSwgZXBjbS0+dm9pY2VzW2ldKTsKKwkJCWVwY20tPnZvaWNlc1tpXSA9IE5VTEw7CisJCX0KKwl9CisJZXJyID0gc25kX2VtdTEwazFfdm9pY2VfYWxsb2MoZXBjbS0+ZW11LAorCQkJCSAgICAgIGVwY20tPnR5cGUgPT0gUExBWUJBQ0tfRU1VVk9JQ0UgPyBFTVUxMEsxX1BDTSA6IEVNVTEwSzFfRUZYLAorCQkJCSAgICAgIHZvaWNlcywKKwkJCQkgICAgICAmZXBjbS0+dm9pY2VzWzBdKTsKKwkKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcGNtLT52b2ljZXNbMF0tPmVwY20gPSBlcGNtOworCWlmICh2b2ljZXMgPiAxKSB7CisJCWZvciAoaSA9IDE7IGkgPCB2b2ljZXM7IGkrKykgeworCQkJZXBjbS0+dm9pY2VzW2ldID0gJmVwY20tPmVtdS0+dm9pY2VzW2VwY20tPnZvaWNlc1swXS0+bnVtYmVyICsgaV07CisJCQllcGNtLT52b2ljZXNbaV0tPmVwY20gPSBlcGNtOworCQl9CisJfQorCWlmIChlcGNtLT5leHRyYSA9PSBOVUxMKSB7CisJCWVyciA9IHNuZF9lbXUxMGsxX3ZvaWNlX2FsbG9jKGVwY20tPmVtdSwKKwkJCQkJICAgICAgZXBjbS0+dHlwZSA9PSBQTEFZQkFDS19FTVVWT0lDRSA/IEVNVTEwSzFfUENNIDogRU1VMTBLMV9FRlgsCisJCQkJCSAgICAgIDEsCisJCQkJCSAgICAgICZlcGNtLT5leHRyYSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQkvLyBwcmludGsoInBjbV9jaGFubmVsX2FsbG9jOiBmYWlsZWQgZXh0cmE6IHZvaWNlcz0lZCwgZnJhbWU9JWRcbiIsIHZvaWNlcywgZnJhbWUpOworCQkJZm9yIChpID0gMDsgaSA8IHZvaWNlczsgaSsrKSB7CisJCQkJc25kX2VtdTEwazFfdm9pY2VfZnJlZShlcGNtLT5lbXUsIGVwY20tPnZvaWNlc1tpXSk7CisJCQkJZXBjbS0+dm9pY2VzW2ldID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZXBjbS0+ZXh0cmEtPmVwY20gPSBlcGNtOworCQllcGNtLT5leHRyYS0+aW50ZXJydXB0ID0gc25kX2VtdTEwazFfcGNtX2ludGVycnVwdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FwdHVyZV9wZXJpb2Rfc2l6ZXNbMzFdID0geworCTM4NCwJNDQ4LAk1MTIsCTY0MCwKKwkzODQqMiwJNDQ4KjIsCTUxMioyLAk2NDAqMiwKKwkzODQqNCwJNDQ4KjQsCTUxMio0LAk2NDAqNCwKKwkzODQqOCwJNDQ4KjgsCTUxMio4LAk2NDAqOCwKKwkzODQqMTYsCTQ0OCoxNiwJNTEyKjE2LAk2NDAqMTYsCisJMzg0KjMyLAk0NDgqMzIsCTUxMiozMiwJNjQwKjMyLAorCTM4NCo2NCwJNDQ4KjY0LAk1MTIqNjQsCTY0MCo2NCwKKwkzODQqMTI4LDQ0OCoxMjgsNTEyKjEyOAorfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfY2FwdHVyZV9wZXJpb2Rfc2l6ZXMgPSB7CisJLmNvdW50ID0gMzEsCisJLmxpc3QgPSBjYXB0dXJlX3BlcmlvZF9zaXplcywKKwkubWFzayA9IDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FwdHVyZV9yYXRlc1s4XSA9IHsKKwk4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfY2FwdHVyZV9yYXRlcyA9IHsKKwkuY291bnQgPSA4LAorCS5saXN0ID0gY2FwdHVyZV9yYXRlcywKKwkubWFzayA9IDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2VtdTEwazFfY2FwdHVyZV9yYXRlX3JlZyh1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDgwMDA6CXJldHVybiBBRENDUl9TQU1QTEVSQVRFXzg7CisJY2FzZSAxMTAyNToJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfMTE7CisJY2FzZSAxNjAwMDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfMTY7CisJY2FzZSAyMjA1MDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfMjI7CisJY2FzZSAyNDAwMDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfMjQ7CisJY2FzZSAzMjAwMDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfMzI7CisJY2FzZSA0NDEwMDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfNDQ7CisJY2FzZSA0ODAwMDoJcmV0dXJuIEFEQ0NSX1NBTVBMRVJBVEVfNDg7CisJZGVmYXVsdDoKKwkJCXNuZF9CVUcoKTsKKwkJCXJldHVybiBBRENDUl9TQU1QTEVSQVRFXzg7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9lbXUxMGsxX2F1ZGlneV9jYXB0dXJlX3JhdGVfcmVnKHVuc2lnbmVkIGludCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoJcmV0dXJuIEFfQURDQ1JfU0FNUExFUkFURV84OworCWNhc2UgMTEwMjU6CXJldHVybiBBX0FEQ0NSX1NBTVBMRVJBVEVfMTE7CisJY2FzZSAxMjAwMDoJcmV0dXJuIEFfQURDQ1JfU0FNUExFUkFURV8xMjsgLyogcmVhbGx5IHN1cHBvcnRlZD8gKi8KKwljYXNlIDE2MDAwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV8xNjsKKwljYXNlIDIyMDUwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV8yMjsKKwljYXNlIDI0MDAwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV8yNDsKKwljYXNlIDMyMDAwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV8zMjsKKwljYXNlIDQ0MTAwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV80NDsKKwljYXNlIDQ4MDAwOglyZXR1cm4gQURDQ1JfU0FNUExFUkFURV80ODsKKwlkZWZhdWx0OgorCQkJc25kX0JVRygpOworCQkJcmV0dXJuIEFfQURDQ1JfU0FNUExFUkFURV84OworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX2NhbGNfcGl0Y2hfdGFyZ2V0KHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGludCBwaXRjaF90YXJnZXQ7CisKKwlwaXRjaF90YXJnZXQgPSAocmF0ZSA8PCA4KSAvIDM3NTsKKwlwaXRjaF90YXJnZXQgPSAocGl0Y2hfdGFyZ2V0ID4+IDEpICsgKHBpdGNoX3RhcmdldCAmIDEpOworCXJldHVybiBwaXRjaF90YXJnZXQ7Cit9CisKKyNkZWZpbmUgUElUQ0hfNDgwMDAgMHgwMDAwNDAwMAorI2RlZmluZSBQSVRDSF85NjAwMCAweDAwMDA4MDAwCisjZGVmaW5lIFBJVENIXzg1MDAwIDB4MDAwMDcxNTUKKyNkZWZpbmUgUElUQ0hfODA3MjYgMHgwMDAwNmJhMgorI2RlZmluZSBQSVRDSF82Nzg4MiAweDAwMDA1YTgyCisjZGVmaW5lIFBJVENIXzU3MDgxIDB4MDAwMDRjMWMKKworc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20odW5zaWduZWQgaW50IHBpdGNoX3RhcmdldCkKK3sKKwlpZiAocGl0Y2hfdGFyZ2V0ID09IFBJVENIXzQ4MDAwKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMDsKKwllbHNlIGlmIChwaXRjaF90YXJnZXQgPCBQSVRDSF80ODAwMCkKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzE7CisJZWxzZSBpZiAocGl0Y2hfdGFyZ2V0ID49IFBJVENIXzk2MDAwKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMDsKKwllbHNlIGlmIChwaXRjaF90YXJnZXQgPj0gUElUQ0hfODUwMDApCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV82OworCWVsc2UgaWYgKHBpdGNoX3RhcmdldCA+PSBQSVRDSF84MDcyNikKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzU7CisJZWxzZSBpZiAocGl0Y2hfdGFyZ2V0ID49IFBJVENIXzY3ODgyKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNDsKKwllbHNlIGlmIChwaXRjaF90YXJnZXQgPj0gUElUQ0hfNTcwODEpCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8zOworCWVsc2UgIAorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMjsKK30KKworLyoKKyAqIGNhbGN1bGF0ZSBjYWNoZSBpbnZhbGlkYXRlIHNpemUgCisgKgorICogc3RlcmVvOiBjaGFubmVsIGlzIHN0ZXJlbworICogd18xNjogdXNpbmcgMTZiaXQgc2FtcGxlcworICoKKyAqIHJldHVybnM6IGNhY2hlIGludmFsaWRhdGUgc2l6ZSBpbiBzYW1wbGVzCisgKi8KK3N0YXRpYyBpbnQgaW5saW5lIGVtdTEwazFfY2NpcyhpbnQgc3RlcmVvLCBpbnQgd18xNikKK3sKKwlpZiAod18xNikgeworCQlyZXR1cm4gc3RlcmVvID8gMjQgOiAyNjsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3RlcmVvID8gMjQqMiA6IDI2KjI7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wY21faW5pdF92b2ljZShlbXUxMGsxX3QgKmVtdSwKKwkJCQkgICAgICAgaW50IG1hc3RlciwgaW50IGV4dHJhLAorCQkJCSAgICAgICBlbXUxMGsxX3ZvaWNlX3QgKmV2b2ljZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2FkZHIsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBlbmRfYWRkciwKKwkJCQkgICAgICAgZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4KQoreworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSA9IGV2b2ljZS0+ZXBjbS0+c3Vic3RyZWFtOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXVuc2lnbmVkIGludCBzaWxlbnRfcGFnZSwgdG1wOworCWludCB2b2ljZSwgc3RlcmVvLCB3XzE2OworCXVuc2lnbmVkIGNoYXIgYXR0biwgc2VuZF9hbW91bnRbOF07CisJdW5zaWduZWQgY2hhciBzZW5kX3JvdXRpbmdbOF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfdGFyZ2V0OworCXVuc2lnbmVkIGludCBjY2lzOworCisJdm9pY2UgPSBldm9pY2UtPm51bWJlcjsKKwlzdGVyZW8gPSBydW50aW1lLT5jaGFubmVscyA9PSAyOworCXdfMTYgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2OworCisJaWYgKCFleHRyYSAmJiBzdGVyZW8pIHsKKwkJc3RhcnRfYWRkciA+Pj0gMTsKKwkJZW5kX2FkZHIgPj49IDE7CisJfQorCWlmICh3XzE2KSB7CisJCXN0YXJ0X2FkZHIgPj49IDE7CisJCWVuZF9hZGRyID4+PSAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkvKiB2b2x1bWUgcGFyYW1ldGVycyAqLworCWlmIChleHRyYSkgeworCQlhdHRuID0gMDsKKwkJbWVtc2V0KHNlbmRfcm91dGluZywgMCwgc2l6ZW9mKHNlbmRfcm91dGluZykpOworCQlzZW5kX3JvdXRpbmdbMF0gPSAwOworCQlzZW5kX3JvdXRpbmdbMV0gPSAxOworCQlzZW5kX3JvdXRpbmdbMl0gPSAyOworCQlzZW5kX3JvdXRpbmdbM10gPSAzOworCQltZW1zZXQoc2VuZF9hbW91bnQsIDAsIHNpemVvZihzZW5kX2Ftb3VudCkpOworCX0gZWxzZSB7CisJCS8qIG1vbm8sIGxlZnQsIHJpZ2h0IChtYXN0ZXIgdm9pY2UgPSBsZWZ0KSAqLworCQl0bXAgPSBzdGVyZW8gPyAobWFzdGVyID8gMSA6IDIpIDogMDsKKwkJbWVtY3B5KHNlbmRfcm91dGluZywgJm1peC0+c2VuZF9yb3V0aW5nW3RtcF1bMF0sIDgpOworCQltZW1jcHkoc2VuZF9hbW91bnQsICZtaXgtPnNlbmRfdm9sdW1lW3RtcF1bMF0sIDgpOworCX0KKworCWNjaXMgPSBlbXUxMGsxX2NjaXMoc3RlcmVvLCB3XzE2KTsKKwkKKwlpZiAobWFzdGVyKSB7CisJCWV2b2ljZS0+ZXBjbS0+Y2NjYV9zdGFydF9hZGRyID0gc3RhcnRfYWRkciArIGNjaXM7CisJCWlmIChleHRyYSkgeworCQkJc3RhcnRfYWRkciArPSBjY2lzOworCQkJZW5kX2FkZHIgKz0gY2NpczsKKwkJfQorCQlpZiAoc3RlcmVvICYmICFleHRyYSkgeworCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ1BGLCB2b2ljZSwgQ1BGX1NURVJFT19NQVNLKTsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENQRiwgKHZvaWNlICsgMSksIENQRl9TVEVSRU9fTUFTSyk7CisJCX0gZWxzZSB7CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDUEYsIHZvaWNlLCAwKTsKKwkJfQorCX0KKworCS8vIHNldHVwIHJvdXRpbmcKKwlpZiAoZW11LT5hdWRpZ3kpIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFJUMSwgdm9pY2UsCisJCQkJICAgICAgc25kX2VtdTEwazFfY29tcG9zZV9hdWRpZ3lfZnhydDEoc2VuZF9yb3V0aW5nKSk7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhSVDIsIHZvaWNlLAorCQkJCSAgICAgIHNuZF9lbXUxMGsxX2NvbXBvc2VfYXVkaWd5X2Z4cnQyKHNlbmRfcm91dGluZykpOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX1NFTkRBTU9VTlRTLCB2b2ljZSwKKwkJCQkgICAgICAoKHVuc2lnbmVkIGludClzZW5kX2Ftb3VudFs0XSA8PCAyNCkgfAorCQkJCSAgICAgICgodW5zaWduZWQgaW50KXNlbmRfYW1vdW50WzVdIDw8IDE2KSB8CisJCQkJICAgICAgKCh1bnNpZ25lZCBpbnQpc2VuZF9hbW91bnRbNl0gPDwgOCkgfAorCQkJCSAgICAgICh1bnNpZ25lZCBpbnQpc2VuZF9hbW91bnRbN10pOworCX0gZWxzZQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFJULCB2b2ljZSwKKwkJCQkgICAgICBzbmRfZW11MTBrMV9jb21wb3NlX3NlbmRfcm91dGluZyhzZW5kX3JvdXRpbmcpKTsKKwkvLyBTdG9wIENBCisJLy8gQXNzdW1wdGlvbiB0aGF0IFBUIGlzIGFscmVhZHkgMCBzbyBubyBoYXJtIG92ZXJ3cml0aW5nCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRSWCwgdm9pY2UsIChzZW5kX2Ftb3VudFswXSA8PCA4KSB8IHNlbmRfYW1vdW50WzFdKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEU0wsIHZvaWNlLCBlbmRfYWRkciB8IChzZW5kX2Ftb3VudFszXSA8PCAyNCkpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBTU1QsIHZvaWNlLCBzdGFydF9hZGRyIHwgKHNlbmRfYW1vdW50WzJdIDw8IDI0KSk7CisJcGl0Y2hfdGFyZ2V0ID0gZW11MTBrMV9jYWxjX3BpdGNoX3RhcmdldChydW50aW1lLT5yYXRlKTsKKwlpZiAoZXh0cmEpCisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDQ0EsIHZvaWNlLCBzdGFydF9hZGRyIHwKKwkJCSAgICAgIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShwaXRjaF90YXJnZXQpIHwKKwkJCSAgICAgICh3XzE2ID8gMCA6IENDQ0FfOEJJVFNFTEVDVCkpOworCWVsc2UKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NDQSwgdm9pY2UsIChzdGFydF9hZGRyICsgY2NpcykgfAorCQkJICAgICAgZW11MTBrMV9zZWxlY3RfaW50ZXJwcm9tKHBpdGNoX3RhcmdldCkgfAorCQkJICAgICAgKHdfMTYgPyAwIDogQ0NDQV84QklUU0VMRUNUKSk7CisJLy8gQ2xlYXIgZmlsdGVyIGRlbGF5IG1lbW9yeQorCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFoxLCB2b2ljZSwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgWjIsIHZvaWNlLCAwKTsKKwkvLyBpbnZhbGlkYXRlIG1hcHMKKwlzaWxlbnRfcGFnZSA9ICgodW5zaWduZWQgaW50KWVtdS0+c2lsZW50X3BhZ2UuYWRkciA8PCAxKSB8IE1BUF9QVElfTUFTSzsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNQVBBLCB2b2ljZSwgc2lsZW50X3BhZ2UpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIE1BUEIsIHZvaWNlLCBzaWxlbnRfcGFnZSk7CisJLy8gbW9kdWxhdGlvbiBlbnZlbG9wZQorCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENWQ0YsIHZvaWNlLCAweGZmZmYpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFZURlQsIHZvaWNlLCAweGZmZmYpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFUS0hMRE0sIHZvaWNlLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQ1lTVVNNLCB2b2ljZSwgMHgwMDdmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBMRk9WQUwxLCB2b2ljZSwgMHg4MDAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBMRk9WQUwyLCB2b2ljZSwgMHg4MDAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGTU1PRCwgdm9pY2UsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRSRU1GUlEsIHZvaWNlLCAwKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGTTJGUlEyLCB2b2ljZSwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRU5WVkFMLCB2b2ljZSwgMHg4MDAwKTsKKwkvLyB2b2x1bWUgZW52ZWxvcGUKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBVEtITERWLCB2b2ljZSwgMHg3ZjdmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBFTlZWT0wsIHZvaWNlLCAweDAwMDApOworCS8vIGZpbHRlciBlbnZlbG9wZQorCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBFRkVfRklMVEVSQU1PVU5ULCB2b2ljZSwgMHg3Zik7CisJLy8gcGl0Y2ggZW52ZWxvcGUKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQRUZFX1BJVENIQU1PVU5ULCB2b2ljZSwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfcGxheWJhY2tfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCSAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxX3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX3BjbV9jaGFubmVsX2FsbG9jKGVwY20sIHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChlcnIgPiAwKSB7CS8qIGNoYW5nZSAqLworCQlzbmRfdXRpbF9tZW1ibGtfdCAqbWVtYmxrOworCQlpZiAoZXBjbS0+bWVtYmxrICE9IE5VTEwpCisJCQlzbmRfZW11MTBrMV9mcmVlX3BhZ2VzKGVtdSwgZXBjbS0+bWVtYmxrKTsKKwkJbWVtYmxrID0gc25kX2VtdTEwazFfYWxsb2NfcGFnZXMoZW11LCBzdWJzdHJlYW0pOworCQlpZiAoKGVwY20tPm1lbWJsayA9IG1lbWJsaykgPT0gTlVMTCB8fCAoKGVtdTEwazFfbWVtYmxrX3QgKiltZW1ibGspLT5tYXBwZWRfcGFnZSA8IDApIHsKKwkJCWVwY20tPnN0YXJ0X2FkZHIgPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZXBjbS0+c3RhcnRfYWRkciA9ICgoZW11MTBrMV9tZW1ibGtfdCAqKW1lbWJsayktPm1hcHBlZF9wYWdlIDw8IFBBR0VfU0hJRlQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3BsYXliYWNrX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxX3BjbV90ICplcGNtOworCisJaWYgKHJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChlcGNtLT5leHRyYSkgeworCQlzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVwY20tPmVtdSwgZXBjbS0+ZXh0cmEpOworCQllcGNtLT5leHRyYSA9IE5VTEw7CisJfQorCWlmIChlcGNtLT52b2ljZXNbMV0pIHsKKwkJc25kX2VtdTEwazFfdm9pY2VfZnJlZShlcGNtLT5lbXUsIGVwY20tPnZvaWNlc1sxXSk7CisJCWVwY20tPnZvaWNlc1sxXSA9IE5VTEw7CisJfQorCWlmIChlcGNtLT52b2ljZXNbMF0pIHsKKwkJc25kX2VtdTEwazFfdm9pY2VfZnJlZShlcGNtLT5lbXUsIGVwY20tPnZvaWNlc1swXSk7CisJCWVwY20tPnZvaWNlc1swXSA9IE5VTEw7CisJfQorCWlmIChlcGNtLT5tZW1ibGspIHsKKwkJc25kX2VtdTEwazFfZnJlZV9wYWdlcyhlbXUsIGVwY20tPm1lbWJsayk7CisJCWVwY20tPm1lbWJsayA9IE5VTEw7CisJCWVwY20tPnN0YXJ0X2FkZHIgPSAwOworCX0KKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxX3BjbV90ICplcGNtOworCWludCBpOworCisJaWYgKHJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChlcGNtLT5leHRyYSkgeworCQlzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVwY20tPmVtdSwgZXBjbS0+ZXh0cmEpOworCQllcGNtLT5leHRyYSA9IE5VTEw7CisJfQorCWZvciAoaT0wOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CisJCWlmIChlcGNtLT52b2ljZXNbaV0pIHsKKwkJCXNuZF9lbXUxMGsxX3ZvaWNlX2ZyZWUoZXBjbS0+ZW11LCBlcGNtLT52b2ljZXNbaV0pOworCQkJZXBjbS0+dm9pY2VzW2ldID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoZXBjbS0+bWVtYmxrKSB7CisJCXNuZF9lbXUxMGsxX2ZyZWVfcGFnZXMoZW11LCBlcGNtLT5tZW1ibGspOworCQllcGNtLT5tZW1ibGsgPSBOVUxMOworCQllcGNtLT5zdGFydF9hZGRyID0gMDsKKwl9CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllbXUxMGsxX3BjbV90ICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBzdGFydF9hZGRyLCBlbmRfYWRkcjsKKworCXN0YXJ0X2FkZHIgPSBlcGNtLT5zdGFydF9hZGRyOworCWVuZF9hZGRyID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDIpIHsKKwkJc3RhcnRfYWRkciA+Pj0gMTsKKwkJZW5kX2FkZHIgPj49IDE7CisJfQorCWVuZF9hZGRyICs9IHN0YXJ0X2FkZHI7CisJc25kX2VtdTEwazFfcGNtX2luaXRfdm9pY2UoZW11LCAxLCAxLCBlcGNtLT5leHRyYSwKKwkJCQkgICBzdGFydF9hZGRyLCBlbmRfYWRkciwgTlVMTCk7CisJc3RhcnRfYWRkciA9IGVwY20tPnN0YXJ0X2FkZHI7CisJZW5kX2FkZHIgPSBlcGNtLT5zdGFydF9hZGRyICsgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJc25kX2VtdTEwazFfcGNtX2luaXRfdm9pY2UoZW11LCAxLCAwLCBlcGNtLT52b2ljZXNbMF0sCisJCQkJICAgc3RhcnRfYWRkciwgZW5kX2FkZHIsCisJCQkJICAgJmVtdS0+cGNtX21peGVyW3N1YnN0cmVhbS0+bnVtYmVyXSk7CisJaWYgKGVwY20tPnZvaWNlc1sxXSkKKwkJc25kX2VtdTEwazFfcGNtX2luaXRfdm9pY2UoZW11LCAwLCAwLCBlcGNtLT52b2ljZXNbMV0sCisJCQkJCSAgIHN0YXJ0X2FkZHIsIGVuZF9hZGRyLAorCQkJCQkgICAmZW11LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FkZHIsIGVuZF9hZGRyOworCXVuc2lnbmVkIGludCBjaGFubmVsX3NpemU7CisJaW50IGk7CisKKwlzdGFydF9hZGRyID0gZXBjbS0+c3RhcnRfYWRkcjsKKwllbmRfYWRkciA9IGVwY20tPnN0YXJ0X2FkZHIgKyBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKworCS8qCisJICogdGhlIGtYIGRyaXZlciBsZWF2ZXMgc29tZSBzcGFjZSBiZXR3ZWVuIHZvaWNlcworCSAqLworCWNoYW5uZWxfc2l6ZSA9ICggZW5kX2FkZHIgLSBzdGFydF9hZGRyICkgLyBOVU1fRUZYX1BMQVlCQUNLOworCisJc25kX2VtdTEwazFfcGNtX2luaXRfdm9pY2UoZW11LCAxLCAxLCBlcGNtLT5leHRyYSwKKwkJCQkgICBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgKGNoYW5uZWxfc2l6ZSAvIDIpLCBOVUxMKTsKKworCS8qIG9ubHkgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXN0ZXIgdm9pY2UgaXMgd2UgdXNlIGl0IGZvciB0aGUgcG9pbnRlciAqLworCXNuZF9lbXUxMGsxX3BjbV9pbml0X3ZvaWNlKGVtdSwgMSwgMCwgZXBjbS0+dm9pY2VzWzBdLAorCQkJCSAgIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBjaGFubmVsX3NpemUsCisJCQkJICAgJmVtdS0+ZWZ4X3BjbV9taXhlclswXSk7CisKKwlzdGFydF9hZGRyICs9IGNoYW5uZWxfc2l6ZTsKKwlmb3IgKGkgPSAxOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CisJCXNuZF9lbXUxMGsxX3BjbV9pbml0X3ZvaWNlKGVtdSwgMCwgMCwgZXBjbS0+dm9pY2VzW2ldLAorCQkJCQkgICBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgY2hhbm5lbF9zaXplLAorCQkJCQkgICAmZW11LT5lZnhfcGNtX21peGVyW2ldKTsKKwkJc3RhcnRfYWRkciArPSBjaGFubmVsX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19OT05JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1BBVVNFKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCU5VTV9FRlhfUExBWUJBQ0ssCisJLmNoYW5uZWxzX21heCA9CQlOVU1fRUZYX1BMQVlCQUNLLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDY0KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoNjQqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTIsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIGludCBzbmRfZW11MTBrMV9jYXB0dXJlX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9jYXB0dXJlX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGlkeDsKKworCS8qIHplcm9pbmcgdGhlIGJ1ZmZlciBzaXplIHdpbGwgc3RvcCBjYXB0dXJlICovCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgZXBjbS0+Y2FwdHVyZV9ic19yZWcsIDAsIDApOworCXN3aXRjaCAoZXBjbS0+dHlwZSkgeworCWNhc2UgQ0FQVFVSRV9BQzk3QURDOgorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBRENDUiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgQ0FQVFVSRV9FRlg6CisJCWlmIChlbXUtPmF1ZGlneSkgeworCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMSwgMCwgMCk7CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0ZYV0MyLCAwLCAwKTsKKwkJfSBlbHNlCisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFdDLCAwLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQkKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlcGNtLT5jYXB0dXJlX2JhX3JlZywgMCwgcnVudGltZS0+ZG1hX2FkZHIpOworCWVwY20tPmNhcHR1cmVfYnVmc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWVwY20tPmNhcHR1cmVfYnNfdmFsID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDMxOyBpZHgrKykgeworCQlpZiAoY2FwdHVyZV9wZXJpb2Rfc2l6ZXNbaWR4XSA9PSBlcGNtLT5jYXB0dXJlX2J1ZnNpemUpIHsKKwkJCWVwY20tPmNhcHR1cmVfYnNfdmFsID0gaWR4ICsgMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcGNtLT5jYXB0dXJlX2JzX3ZhbCA9PSAwKSB7CisJCXNuZF9CVUcoKTsKKwkJZXBjbS0+Y2FwdHVyZV9ic192YWwrKzsKKwl9CisJaWYgKGVwY20tPnR5cGUgPT0gQ0FQVFVSRV9BQzk3QURDKSB7CisJCWVwY20tPmNhcHR1cmVfY3JfdmFsID0gZW11LT5hdWRpZ3kgPyBBX0FEQ0NSX0xDSEFORU5BQkxFIDogQURDQ1JfTENIQU5FTkFCTEU7CisJCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCQllcGNtLT5jYXB0dXJlX2NyX3ZhbCB8PSBlbXUtPmF1ZGlneSA/IEFfQURDQ1JfUkNIQU5FTkFCTEUgOiBBRENDUl9SQ0hBTkVOQUJMRTsKKwkJZXBjbS0+Y2FwdHVyZV9jcl92YWwgfD0gZW11LT5hdWRpZ3kgPworCQkJc25kX2VtdTEwazFfYXVkaWd5X2NhcHR1cmVfcmF0ZV9yZWcocnVudGltZS0+cmF0ZSkgOgorCQkJc25kX2VtdTEwazFfY2FwdHVyZV9yYXRlX3JlZyhydW50aW1lLT5yYXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3BsYXliYWNrX2ludmFsaWRhdGVfY2FjaGUoZW11MTBrMV90ICplbXUsIGludCBleHRyYSwgZW11MTBrMV92b2ljZV90ICpldm9pY2UpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IHZvaWNlLCBzdGVyZW8sIGksIGNjaXMsIGNyYSA9IDY0LCBjcywgc2FtcGxlOworCisJaWYgKGV2b2ljZSA9PSBOVUxMKQorCQlyZXR1cm47CisJcnVudGltZSA9IGV2b2ljZS0+ZXBjbS0+c3Vic3RyZWFtLT5ydW50aW1lOworCXZvaWNlID0gZXZvaWNlLT5udW1iZXI7CisJc3RlcmVvID0gKCFleHRyYSAmJiBydW50aW1lLT5jaGFubmVscyA9PSAyKTsKKwlzYW1wbGUgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2ID8gMCA6IDB4ODA4MDgwODA7CisJY2NpcyA9IGVtdTEwazFfY2NpcyhzdGVyZW8sIHNhbXBsZSA9PSAwKTsKKwkvLyBzZXQgY3MgdG8gMiAqIG51bWJlciBvZiBjYWNoZSByZWdpc3RlcnMgYmVzaWRlIHRoZSBpbnZhbGlkYXRlZAorCWNzID0gKHNhbXBsZSA9PSAwKSA/ICgzMi1jY2lzKSA6ICg2NC1jY2lzKzEpID4+IDE7CisJaWYgKGNzID4gMTYpIGNzID0gMTY7CisJZm9yIChpID0gMDsgaSA8IGNzOyBpKyspIHsKKwkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0QwICsgaSwgdm9pY2UsIHNhbXBsZSk7CisJCWlmIChzdGVyZW8pIHsKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENEMCArIGksIHZvaWNlICsgMSwgc2FtcGxlKTsKKwkJfQorCX0KKwkvLyByZXNldCBjYWNoZQorCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZSwgY3JhKTsKKwlpZiAoc3RlcmVvKSB7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSArIDEsIDApOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlICsgMSwgY3JhKTsKKwl9CisJLy8gZmlsbCBjYWNoZQorCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSwgY2Npcyk7CisJaWYgKHN0ZXJlbykgeworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UrMSwgY2Npcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wbGF5YmFja19wcmVwYXJlX3ZvaWNlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX3ZvaWNlX3QgKmV2b2ljZSwKKwkJCQkJICAgICAgIGludCBtYXN0ZXIsIGludCBleHRyYSwKKwkJCQkJICAgICAgIGVtdTEwazFfcGNtX21peGVyX3QgKm1peCkKK3sKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IGF0dG4sIHZhdHRuOworCXVuc2lnbmVkIGludCB2b2ljZSwgdG1wOworCisJaWYgKGV2b2ljZSA9PSBOVUxMKQkvKiBza2lwIHNlY29uZCB2b2ljZSBmb3IgbW9ubyAqLworCQlyZXR1cm47CisJc3Vic3RyZWFtID0gZXZvaWNlLT5lcGNtLT5zdWJzdHJlYW07CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl2b2ljZSA9IGV2b2ljZS0+bnVtYmVyOworCisJYXR0biA9IGV4dHJhID8gMCA6IDB4MDBmZjsKKwl0bXAgPSBydW50aW1lLT5jaGFubmVscyA9PSAyID8gKG1hc3RlciA/IDEgOiAyKSA6IDA7CisJdmF0dG4gPSBtaXggIT0gTlVMTCA/IChtaXgtPmF0dG5bdG1wXSA8PCAxNikgOiAwOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIElGQVROLCB2b2ljZSwgYXR0bik7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVlRGVCwgdm9pY2UsIHZhdHRuIHwgMHhmZmZmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDVkNGLCB2b2ljZSwgdmF0dG4gfCAweGZmZmYpOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERDWVNVU1YsIHZvaWNlLCAweDdmN2YpOworCXNuZF9lbXUxMGsxX3ZvaWNlX2NsZWFyX2xvb3Bfc3RvcChlbXUsIHZvaWNlKTsKK30JCisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3BsYXliYWNrX3RyaWdnZXJfdm9pY2UoZW11MTBrMV90ICplbXUsIGVtdTEwazFfdm9pY2VfdCAqZXZvaWNlLCBpbnQgbWFzdGVyLCBpbnQgZXh0cmEpCit7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lOworCXVuc2lnbmVkIGludCB2b2ljZSwgcGl0Y2gsIHBpdGNoX3RhcmdldDsKKworCWlmIChldm9pY2UgPT0gTlVMTCkJLyogc2tpcCBzZWNvbmQgdm9pY2UgZm9yIG1vbm8gKi8KKwkJcmV0dXJuOworCXN1YnN0cmVhbSA9IGV2b2ljZS0+ZXBjbS0+c3Vic3RyZWFtOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdm9pY2UgPSBldm9pY2UtPm51bWJlcjsKKworCXBpdGNoID0gc25kX2VtdTEwazFfcmF0ZV90b19waXRjaChydW50aW1lLT5yYXRlKSA+PiA4OworCXBpdGNoX3RhcmdldCA9IGVtdTEwazFfY2FsY19waXRjaF90YXJnZXQocnVudGltZS0+cmF0ZSk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRSWF9QSVRDSFRBUkdFVCwgdm9pY2UsIHBpdGNoX3RhcmdldCk7CisJaWYgKG1hc3RlciB8fCBldm9pY2UtPmVwY20tPnR5cGUgPT0gUExBWUJBQ0tfRUZYKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDUEZfQ1VSUkVOVFBJVENILCB2b2ljZSwgcGl0Y2hfdGFyZ2V0KTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBJUCwgdm9pY2UsIHBpdGNoKTsKKwlpZiAoZXh0cmEpCisJCXNuZF9lbXUxMGsxX3ZvaWNlX2ludHJfZW5hYmxlKGVtdSwgdm9pY2UpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wbGF5YmFja19zdG9wX3ZvaWNlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX3ZvaWNlX3QgKmV2b2ljZSkKK3sKKwl1bnNpZ25lZCBpbnQgdm9pY2U7CisKKwlpZiAoZXZvaWNlID09IE5VTEwpCisJCXJldHVybjsKKwl2b2ljZSA9IGV2b2ljZS0+bnVtYmVyOworCXNuZF9lbXUxMGsxX3ZvaWNlX2ludHJfZGlzYWJsZShlbXUsIHZvaWNlKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQVFJYX1BJVENIVEFSR0VULCB2b2ljZSwgMCk7CisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ1BGX0NVUlJFTlRQSVRDSCwgdm9pY2UsIDApOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIElGQVROLCB2b2ljZSwgMHhmZmZmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBWVEZULCB2b2ljZSwgMHhmZmZmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDVkNGLCB2b2ljZSwgMHhmZmZmKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBJUCwgdm9pY2UsIDApOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgICAgIGludCBjbWQpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXg7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvLyBwcmludGsoInRyaWdnZXIgLSBlbXUxMGsxID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlaVxuIiwgKGludCllbXUsIGNtZCwgc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSk7CisJc3Bpbl9sb2NrKCZlbXUtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX2ludmFsaWRhdGVfY2FjaGUoZW11LCAxLCBlcGNtLT5leHRyYSk7CS8qIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwkJc25kX2VtdTEwazFfcGxheWJhY2tfaW52YWxpZGF0ZV9jYWNoZShlbXUsIDAsIGVwY20tPnZvaWNlc1swXSk7CisJCS8qIGZvbGxvdyB0aHJ1ICovCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQltaXggPSAmZW11LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCQlzbmRfZW11MTBrMV9wbGF5YmFja19wcmVwYXJlX3ZvaWNlKGVtdSwgZXBjbS0+dm9pY2VzWzBdLCAxLCAwLCBtaXgpOworCQlzbmRfZW11MTBrMV9wbGF5YmFja19wcmVwYXJlX3ZvaWNlKGVtdSwgZXBjbS0+dm9pY2VzWzFdLCAwLCAwLCBtaXgpOworCQlzbmRfZW11MTBrMV9wbGF5YmFja19wcmVwYXJlX3ZvaWNlKGVtdSwgZXBjbS0+ZXh0cmEsIDEsIDEsIE5VTEwpOworCQlzbmRfZW11MTBrMV9wbGF5YmFja190cmlnZ2VyX3ZvaWNlKGVtdSwgZXBjbS0+dm9pY2VzWzBdLCAxLCAwKTsKKwkJc25kX2VtdTEwazFfcGxheWJhY2tfdHJpZ2dlcl92b2ljZShlbXUsIGVwY20tPnZvaWNlc1sxXSwgMCwgMCk7CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3RyaWdnZXJfdm9pY2UoZW11LCBlcGNtLT5leHRyYSwgMSwgMSk7CisJCWVwY20tPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQllcGNtLT5ydW5uaW5nID0gMDsKKwkJc25kX2VtdTEwazFfcGxheWJhY2tfc3RvcF92b2ljZShlbXUsIGVwY20tPnZvaWNlc1swXSk7CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3N0b3Bfdm9pY2UoZW11LCBlcGNtLT52b2ljZXNbMV0pOworCQlzbmRfZW11MTBrMV9wbGF5YmFja19zdG9wX3ZvaWNlKGVtdSwgZXBjbS0+ZXh0cmEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmVtdS0+cmVnX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgICAgIGludCBjbWQpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXNwaW5fbG9jaygmZW11LT5yZWdfbG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQkvLyBobW0gdGhpcyBzaG91bGQgY2F1c2UgZnVsbCBhbmQgaGFsZiBmdWxsIGludGVycnVwdCB0byBiZSByYWlzZWQ/ICAKKwkJb3V0bChlcGNtLT5jYXB0dXJlX2lwciwgZW11LT5wb3J0ICsgSVBSKTsKKwkJc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11LCBlcGNtLT5jYXB0dXJlX2ludGUpOworCQkvLyBwcmludGsoImFkY2NyID0gMHgleCwgYWRjYnMgPSAweCV4XG4iLCBlcGNtLT5hZGNjciwgZXBjbS0+YWRjYnMpOworCQlzd2l0Y2ggKGVwY20tPnR5cGUpIHsKKwkJY2FzZSBDQVBUVVJFX0FDOTdBREM6CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBRENDUiwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FQVFVSRV9FRlg6CisJCQlpZiAoZW11LT5hdWRpZ3kpIHsKKwkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0ZYV0MxLCAwLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbCk7CisJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMiwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwyKTsKKwkJCX0gZWxzZQorCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZYV0MsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkKKwkJCWJyZWFrOworCQl9CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVwY20tPmNhcHR1cmVfYnNfcmVnLCAwLCBlcGNtLT5jYXB0dXJlX2JzX3ZhbCk7CisJCWVwY20tPnJ1bm5pbmcgPSAxOworCQllcGNtLT5maXJzdF9wdHIgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWVwY20tPnJ1bm5pbmcgPSAwOworCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBlcGNtLT5jYXB0dXJlX2ludGUpOworCQlvdXRsKGVwY20tPmNhcHR1cmVfaXByLCBlbXUtPnBvcnQgKyBJUFIpOworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlcGNtLT5jYXB0dXJlX2JzX3JlZywgMCwgMCk7CisJCXN3aXRjaCAoZXBjbS0+dHlwZSkgeworCQljYXNlIENBUFRVUkVfQUM5N0FEQzoKKwkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFEQ0NSLCAwLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIENBUFRVUkVfRUZYOgorCQkJaWYgKGVtdS0+YXVkaWd5KSB7CisJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMSwgMCwgMCk7CisJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMiwgMCwgMCk7CisJCQl9IGVsc2UKKwkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFdDLCAwLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2soJmVtdS0+cmVnX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZW11MTBrMV9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcHRyOworCisJaWYgKCFlcGNtLT5ydW5uaW5nKQorCQlyZXR1cm4gMDsKKwlwdHIgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIENDQ0EsIGVwY20tPnZvaWNlc1swXS0+bnVtYmVyKSAmIDB4MDBmZmZmZmY7CisjaWYgMAkvKiBQZXJleCdzIGNvZGUgKi8KKwlwdHIgKz0gcnVudGltZS0+YnVmZmVyX3NpemU7CisJcHRyIC09IGVwY20tPmNjY2Ffc3RhcnRfYWRkcjsKKwlwdHIgJT0gcnVudGltZS0+YnVmZmVyX3NpemU7CisjZWxzZQkvKiBFTVUxMEsxIE9wZW4gU291cmNlIGNvZGUgZnJvbSBDcmVhdGl2ZSAqLworCWlmIChwdHIgPCBlcGNtLT5jY2NhX3N0YXJ0X2FkZHIpCisJCXB0ciArPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIGVwY20tPmNjY2Ffc3RhcnRfYWRkcjsKKwllbHNlIHsKKwkJcHRyIC09IGVwY20tPmNjY2Ffc3RhcnRfYWRkcjsKKwkJaWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKwl9CisjZW5kaWYKKwkvLyBwcmludGsoInB0ciA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgcGVyaW9kX3NpemUgPSAweCV4XG4iLCBwdHIsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJcmV0dXJuIHB0cjsKK30KKworCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja190cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgICAgICBpbnQgY21kKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzcGluX2xvY2soJmVtdS0+cmVnX2xvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJLy8gcHJlcGFyZSB2b2ljZXMKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgewkKKwkJCXNuZF9lbXUxMGsxX3BsYXliYWNrX2ludmFsaWRhdGVfY2FjaGUoZW11LCAwLCBlcGNtLT52b2ljZXNbaV0pOworCQl9CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX2ludmFsaWRhdGVfY2FjaGUoZW11LCAxLCBlcGNtLT5leHRyYSk7CisKKwkJLyogZm9sbG93IHRocnUgKi8KKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3ByZXBhcmVfdm9pY2UoZW11LCBlcGNtLT5leHRyYSwgMSwgMSwgTlVMTCk7CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3ByZXBhcmVfdm9pY2UoZW11LCBlcGNtLT52b2ljZXNbMF0sIDAsIDAsCisJCQkJCQkgICAmZW11LT5lZnhfcGNtX21peGVyWzBdKTsKKwkJZm9yIChpID0gMTsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykKKwkJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3ByZXBhcmVfdm9pY2UoZW11LCBlcGNtLT52b2ljZXNbaV0sIDAsIDAsCisJCQkJCQkJICAgJmVtdS0+ZWZ4X3BjbV9taXhlcltpXSk7CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3RyaWdnZXJfdm9pY2UoZW11LCBlcGNtLT52b2ljZXNbMF0sIDAsIDApOworCQlzbmRfZW11MTBrMV9wbGF5YmFja190cmlnZ2VyX3ZvaWNlKGVtdSwgZXBjbS0+ZXh0cmEsIDEsIDEpOworCQlmb3IgKGkgPSAxOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKQorCQkJc25kX2VtdTEwazFfcGxheWJhY2tfdHJpZ2dlcl92b2ljZShlbXUsIGVwY20tPnZvaWNlc1tpXSwgMCwgMCk7CisJCWVwY20tPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQllcGNtLT5ydW5uaW5nID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgewkKKwkJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3N0b3Bfdm9pY2UoZW11LCBlcGNtLT52b2ljZXNbaV0pOworCQl9CisJCXNuZF9lbXUxMGsxX3BsYXliYWNrX3N0b3Bfdm9pY2UoZW11LCBlcGNtLT5leHRyYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmZW11LT5yZWdfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2VtdTEwazFfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcHRyOworCisJaWYgKCFlcGNtLT5ydW5uaW5nKQorCQlyZXR1cm4gMDsKKwlpZiAoZXBjbS0+Zmlyc3RfcHRyKSB7CisJCXVkZWxheSg1MCk7CS8vIGhhY2ssIGl0IHRha2VzIGF3aGlsZSB1bnRpbCBjYXB0dXJlIGlzIHN0YXJ0ZWQKKwkJZXBjbS0+Zmlyc3RfcHRyID0gMDsKKwl9CisJcHRyID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBlcGNtLT5jYXB0dXJlX2lkeF9yZWcsIDApICYgMHgwMDAwZmZmZjsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHB0cik7Cit9CisKKy8qCisgKiAgUGxheWJhY2sgc3VwcG9ydCBkZXZpY2UgZGVzY3JpcHRpb24KKyAqLworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9lbXUxMGsxX3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1BBVVNFKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk5NjAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisvKgorICogIENhcHR1cmUgc3VwcG9ydCBkZXZpY2UgZGVzY3JpcHRpb24KKyAqLworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9lbXUxMGsxX2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJODAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSg2NCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTM4NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg2NCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisvKgorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wY21fbWl4ZXJfbm90aWZ5MShlbXUxMGsxX3QgKmVtdSwgc25kX2tjb250cm9sX3QgKmtjdGwsIGludCBpZHgsIGludCBhY3RpdmF0ZSkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCBpZDsKKworCXNuZF9ydW50aW1lX2NoZWNrKGtjdGwgIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoYWN0aXZhdGUpCisJCWtjdGwtPnZkW2lkeF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJZWxzZQorCQlrY3RsLT52ZFtpZHhdLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJc25kX2N0bF9ub3RpZnkoZW11LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLAorCQkgICAgICAgc25kX2N0bF9idWlsZF9pb2ZmKCZpZCwga2N0bCwgaWR4KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3BjbV9taXhlcl9ub3RpZnkoZW11MTBrMV90ICplbXUsIGludCBpZHgsIGludCBhY3RpdmF0ZSkKK3sKKwlzbmRfZW11MTBrMV9wY21fbWl4ZXJfbm90aWZ5MShlbXUsIGVtdS0+Y3RsX3NlbmRfcm91dGluZywgaWR4LCBhY3RpdmF0ZSk7CisJc25kX2VtdTEwazFfcGNtX21peGVyX25vdGlmeTEoZW11LCBlbXUtPmN0bF9zZW5kX3ZvbHVtZSwgaWR4LCBhY3RpdmF0ZSk7CisJc25kX2VtdTEwazFfcGNtX21peGVyX25vdGlmeTEoZW11LCBlbXUtPmN0bF9hdHRuLCBpZHgsIGFjdGl2YXRlKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX2VmeF9taXhlcl9ub3RpZnkoZW11MTBrMV90ICplbXUsIGludCBpZHgsIGludCBhY3RpdmF0ZSkKK3sKKwlzbmRfZW11MTBrMV9wY21fbWl4ZXJfbm90aWZ5MShlbXUsIGVtdS0+Y3RsX2VmeF9zZW5kX3JvdXRpbmcsIGlkeCwgYWN0aXZhdGUpOworCXNuZF9lbXUxMGsxX3BjbV9taXhlcl9ub3RpZnkxKGVtdSwgZW11LT5jdGxfZWZ4X3NlbmRfdm9sdW1lLCBpZHgsIGFjdGl2YXRlKTsKKwlzbmRfZW11MTBrMV9wY21fbWl4ZXJfbm90aWZ5MShlbXUsIGVtdS0+Y3RsX2VmeF9hdHRuLCBpZHgsIGFjdGl2YXRlKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX2ZyZWVfc3Vic3RyZWFtKHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCWVtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlrZnJlZShlcGNtKTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXg7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgeworCQltaXggPSAmZW11LT5lZnhfcGNtX21peGVyW2ldOworCQltaXgtPmVwY20gPSBOVUxMOworCQlzbmRfZW11MTBrMV9wY21fZWZ4X21peGVyX25vdGlmeShlbXUsIGksIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWVtdTEwazFfcGNtX3QgKmVwY207CisJZW11MTBrMV9wY21fbWl4ZXJfdCAqbWl4OworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBpOworCisJZXBjbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCplcGNtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVwY20gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXBjbS0+ZW11ID0gZW11OworCWVwY20tPnR5cGUgPSBQTEFZQkFDS19FRlg7CisJZXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCQorCWVtdS0+cGNtX3BsYXliYWNrX2VmeF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOworCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxX3BjbV9mcmVlX3N1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFjazsKKwkKKwlmb3IgKGk9MDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgeworCQltaXggPSAmZW11LT5lZnhfcGNtX21peGVyW2ldOworCQltaXgtPnNlbmRfcm91dGluZ1swXVswXSA9IGk7CisJCW1lbXNldCgmbWl4LT5zZW5kX3ZvbHVtZSwgMCwgc2l6ZW9mKG1peC0+c2VuZF92b2x1bWUpKTsKKwkJbWl4LT5zZW5kX3ZvbHVtZVswXVswXSA9IDI1NTsKKwkJbWl4LT5hdHRuWzBdID0gMHhmZmZmOworCQltaXgtPmVwY20gPSBlcGNtOworCQlzbmRfZW11MTBrMV9wY21fZWZ4X21peGVyX25vdGlmeShlbXUsIGksIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJZW11MTBrMV9wY21fdCAqZXBjbTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXg7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGksIGVycjsKKworCWVwY20gPSBrY2FsbG9jKDEsIHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOworCWlmIChlcGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWVwY20tPmVtdSA9IGVtdTsKKwllcGNtLT50eXBlID0gUExBWUJBQ0tfRU1VVk9JQ0U7CisJZXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGVwY207CisJcnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfcGNtX2ZyZWVfc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2VtdTEwazFfcGxheWJhY2s7CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUykpIDwgMCkgeworCQlrZnJlZShlcGNtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIDI1NiwgVUlOVF9NQVgpKSA8IDApIHsKKwkJa2ZyZWUoZXBjbSk7CisJCXJldHVybiBlcnI7CisJfQorCW1peCA9ICZlbXUtPnBjbV9taXhlcltzdWJzdHJlYW0tPm51bWJlcl07CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbWl4LT5zZW5kX3JvdXRpbmdbMF1baV0gPSBtaXgtPnNlbmRfcm91dGluZ1sxXVtpXSA9IG1peC0+c2VuZF9yb3V0aW5nWzJdW2ldID0gaTsKKwltZW1zZXQoJm1peC0+c2VuZF92b2x1bWUsIDAsIHNpemVvZihtaXgtPnNlbmRfdm9sdW1lKSk7CisJbWl4LT5zZW5kX3ZvbHVtZVswXVswXSA9IG1peC0+c2VuZF92b2x1bWVbMF1bMV0gPQorCW1peC0+c2VuZF92b2x1bWVbMV1bMF0gPSBtaXgtPnNlbmRfdm9sdW1lWzJdWzFdID0gMjU1OworCW1peC0+YXR0blswXSA9IG1peC0+YXR0blsxXSA9IG1peC0+YXR0blsyXSA9IDB4ZmZmZjsKKwltaXgtPmVwY20gPSBlcGNtOworCXNuZF9lbXUxMGsxX3BjbV9taXhlcl9ub3RpZnkoZW11LCBzdWJzdHJlYW0tPm51bWJlciwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllbXUxMGsxX3BjbV9taXhlcl90ICptaXggPSAmZW11LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCisJbWl4LT5lcGNtID0gTlVMTDsKKwlzbmRfZW11MTBrMV9wY21fbWl4ZXJfbm90aWZ5KGVtdSwgc3Vic3RyZWFtLT5udW1iZXIsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVtdTEwazFfcGNtX3QgKmVwY207CisKKwllcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcGNtLT5lbXUgPSBlbXU7CisJZXBjbS0+dHlwZSA9IENBUFRVUkVfQUM5N0FEQzsKKwllcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJZXBjbS0+Y2FwdHVyZV9pcHIgPSBJUFJfQURDQlVGRlVMTHxJUFJfQURDQlVGSEFMRkZVTEw7CisJZXBjbS0+Y2FwdHVyZV9pbnRlID0gSU5URV9BRENCVUZFTkFCTEU7CisJZXBjbS0+Y2FwdHVyZV9iYV9yZWcgPSBBRENCQTsKKwllcGNtLT5jYXB0dXJlX2JzX3JlZyA9IEFEQ0JTOworCWVwY20tPmNhcHR1cmVfaWR4X3JlZyA9IGVtdS0+YXVkaWd5ID8gQV9BRENJRFggOiBBRENJRFg7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9wY21fZnJlZV9zdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMV9jYXB0dXJlOworCWVtdS0+Y2FwdHVyZV9pbnRlcnJ1cHQgPSBzbmRfZW11MTBrMV9wY21fYWM5N2FkY19pbnRlcnJ1cHQ7CisJZW11LT5wY21fY2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgJmh3X2NvbnN0cmFpbnRzX2NhcHR1cmVfcGVyaW9kX3NpemVzKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX2NhcHR1cmVfcmF0ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWVtdS0+Y2FwdHVyZV9pbnRlcnJ1cHQgPSBOVUxMOworCWVtdS0+cGNtX2NhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9jYXB0dXJlX21pY19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJZW11MTBrMV9wY21fdCAqZXBjbTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWVwY20gPSBrY2FsbG9jKDEsIHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOworCWlmIChlcGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWVwY20tPmVtdSA9IGVtdTsKKwllcGNtLT50eXBlID0gQ0FQVFVSRV9BQzk3TUlDOworCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwllcGNtLT5jYXB0dXJlX2lwciA9IElQUl9NSUNCVUZGVUxMfElQUl9NSUNCVUZIQUxGRlVMTDsKKwllcGNtLT5jYXB0dXJlX2ludGUgPSBJTlRFX01JQ0JVRkVOQUJMRTsKKwllcGNtLT5jYXB0dXJlX2JhX3JlZyA9IE1JQ0JBOworCWVwY20tPmNhcHR1cmVfYnNfcmVnID0gTUlDQlM7CisJZXBjbS0+Y2FwdHVyZV9pZHhfcmVnID0gZW11LT5hdWRpZ3kgPyBBX01JQ0lEWCA6IE1JQ0lEWDsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGVwY207CisJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9wY21fZnJlZV9zdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMV9jYXB0dXJlOworCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMDsKKwlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gODAwMDsKKwlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSAxOworCWVtdS0+Y2FwdHVyZV9taWNfaW50ZXJydXB0ID0gc25kX2VtdTEwazFfcGNtX2FjOTdtaWNfaW50ZXJydXB0OworCWVtdS0+cGNtX2NhcHR1cmVfbWljX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfY2FwdHVyZV9wZXJpb2Rfc2l6ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwllbXUtPmNhcHR1cmVfaW50ZXJydXB0ID0gTlVMTDsKKwllbXUtPnBjbV9jYXB0dXJlX21pY19zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllbXUxMGsxX3BjbV90ICplcGNtOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBuZWZ4ID0gZW11LT5hdWRpZ3kgPyA2NCA6IDMyOworCWludCBpZHg7CisKKwllcGNtID0ga2NhbGxvYygxLCBzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcGNtLT5lbXUgPSBlbXU7CisJZXBjbS0+dHlwZSA9IENBUFRVUkVfRUZYOworCWVwY20tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwllcGNtLT5jYXB0dXJlX2lwciA9IElQUl9FRlhCVUZGVUxMfElQUl9FRlhCVUZIQUxGRlVMTDsKKwllcGNtLT5jYXB0dXJlX2ludGUgPSBJTlRFX0VGWEJVRkVOQUJMRTsKKwllcGNtLT5jYXB0dXJlX2JhX3JlZyA9IEZYQkE7CisJZXBjbS0+Y2FwdHVyZV9ic19yZWcgPSBGWEJTOworCWVwY20tPmNhcHR1cmVfaWR4X3JlZyA9IEZYSURYOworCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxX3BjbV9mcmVlX3N1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxX2NhcHR1cmU7CisJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gNDgwMDA7CisJc3Bpbl9sb2NrX2lycSgmZW11LT5yZWdfbG9jayk7CisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG5lZng7IGlkeCsrKSB7CisJCWlmIChlbXUtPmVmeF92b2ljZXNfbWFza1tpZHgvMzJdICYgKDEgPDwgKGlkeCUzMikpKSB7CisJCQlydW50aW1lLT5ody5jaGFubmVsc19taW4rKzsKKwkJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCsrOworCQl9CisJfQorCWVwY20tPmNhcHR1cmVfY3JfdmFsID0gZW11LT5lZnhfdm9pY2VzX21hc2tbMF07CisJZXBjbS0+Y2FwdHVyZV9jcl92YWwyID0gZW11LT5lZnhfdm9pY2VzX21hc2tbMV07CisJc3Bpbl91bmxvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwllbXUtPmNhcHR1cmVfZWZ4X2ludGVycnVwdCA9IHNuZF9lbXUxMGsxX3BjbV9lZnhfaW50ZXJydXB0OworCWVtdS0+cGNtX2NhcHR1cmVfZWZ4X3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfY2FwdHVyZV9wZXJpb2Rfc2l6ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwllbXUtPmNhcHR1cmVfaW50ZXJydXB0ID0gTlVMTDsKKwllbXUtPnBjbV9jYXB0dXJlX2VmeF9zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfZW11MTBrMV9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0JCXNuZF9lbXUxMGsxX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9lbXUxMGsxX3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfZW11MTBrMV9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9lbXUxMGsxX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2VtdTEwazFfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfZW11MTBrMV9wbGF5YmFja19wb2ludGVyLAorCS5wYWdlID0JCQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2VtdTEwazFfY2FwdHVyZV9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX2h3X2ZyZWUsCisJLnByZXBhcmUgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9wcmVwYXJlLAorCS50cmlnZ2VyID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX3BvaW50ZXIsCit9OworCisvKiBFRlggcGxheWJhY2sgKi8KK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX2VtdTEwazFfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0JCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19wb2ludGVyLAorCS5wYWdlID0JCQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJZW11MTBrMV90ICplbXUgPSBwY20tPnByaXZhdGVfZGF0YTsKKwllbXUtPnBjbSA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK2ludCBfX2RldmluaXQgc25kX2VtdTEwazFfcGNtKGVtdTEwazFfdCAqIGVtdSwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhlbXUtPmNhcmQsICJlbXUxMGsxIiwgZGV2aWNlLCAzMiwgMSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gZW11OworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfcGNtX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VtdTEwazFfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfZW11MTBrMV9jYXB0dXJlX29wcyk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+ZGV2X3N1YmNsYXNzID0gU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYOworCXN0cmNweShwY20tPm5hbWUsICJBREMgQ2FwdHVyZS9TdGFuZGFyZCBQQ00gUGxheWJhY2siKTsKKwllbXUtPnBjbSA9IHBjbTsKKworCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCisJCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMoc3Vic3RyZWFtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkKKwkJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMoc3Vic3RyZWFtLCBTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCitpbnQgX19kZXZpbml0IHNuZF9lbXUxMGsxX3BjbV9tdWx0aShlbXUxMGsxX3QgKiBlbXUsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoZW11LT5jYXJkLCAiZW11MTBrMSIsIGRldmljZSwgMSwgMCwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gZW11OworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfcGNtX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX29wcyk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+ZGV2X3N1YmNsYXNzID0gU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYOworCXN0cmNweShwY20tPm5hbWUsICJNdWx0aWNoYW5uZWwgUGxheWJhY2siKTsKKwllbXUtPnBjbSA9IHBjbTsKKworCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCisJCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMoc3Vic3RyZWFtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX29wcyA9IHsKKwkub3BlbiA9CQkJc25kX2VtdTEwazFfY2FwdHVyZV9taWNfb3BlbiwKKwkuY2xvc2UgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9taWNfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9wb2ludGVyLAorfTsKKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX21pY19mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWVtdTEwazFfdCAqZW11ID0gcGNtLT5wcml2YXRlX2RhdGE7CisJZW11LT5wY21fbWljID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9wY21fbWljKGVtdTEwazFfdCAqIGVtdSwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGVtdS0+Y2FyZCwgImVtdTEwazEgbWljIiwgZGV2aWNlLCAwLCAxLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBlbXU7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9wY21fbWljX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfZW11MTBrMV9jYXB0dXJlX21pY19vcHMpOworCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiTWljIENhcHR1cmUiKTsKKwllbXUtPnBjbV9taWMgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGVtdS0+cGNpKSwgNjQqMTAyNCwgNjQqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfcGNtX2VmeF92b2ljZXNfbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBuZWZ4ID0gZW11LT5hdWRpZ3kgPyA2NCA6IDMyOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IG5lZng7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IG5lZnggPSBlbXUtPmF1ZGlneSA/IDY0IDogMzI7CisJaW50IGlkeDsKKwkKKwlzcGluX2xvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG5lZng7IGlkeCsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpZHhdID0gKGVtdS0+ZWZ4X3ZvaWNlc19tYXNrW2lkeCAvIDMyXSAmICgxIDw8IChpZHggJSAzMikpKSA/IDEgOiAwOworCXNwaW5fdW5sb2NrX2lycSgmZW11LT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfcGNtX2VmeF92b2ljZXNfbWFza19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbnZhbFsyXSwgYml0czsKKwlpbnQgbmVmeCA9IGVtdS0+YXVkaWd5ID8gNjQgOiAzMjsKKwlpbnQgbmVmeGIgPSBlbXUtPmF1ZGlneSA/IDcgOiA2OworCWludCBjaGFuZ2UsIGlkeDsKKwkKKwludmFsWzBdID0gbnZhbFsxXSA9IDA7CisJZm9yIChpZHggPSAwLCBiaXRzID0gMDsgaWR4IDwgbmVmeDsgaWR4KyspCisJCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpZHhdKSB7CisJCQludmFsW2lkeCAvIDMyXSB8PSAxIDw8IChpZHggJSAzMik7CisJCQliaXRzKys7CisJCX0KKwkJCisJZm9yIChpZHggPSAwOyBpZHggPCBuZWZ4YjsgaWR4KyspCisJCWlmICgxIDw8IGlkeCA9PSBiaXRzKQorCQkJYnJlYWs7CisJCisJaWYgKGlkeCA+PSBuZWZ4YikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSAobnZhbFswXSAhPSBlbXUtPmVmeF92b2ljZXNfbWFza1swXSkgfHwKKwkJKG52YWxbMV0gIT0gZW11LT5lZnhfdm9pY2VzX21hc2tbMV0pOworCWVtdS0+ZWZ4X3ZvaWNlc19tYXNrWzBdID0gbnZhbFswXTsKKwllbXUtPmVmeF92b2ljZXNfbWFza1sxXSA9IG52YWxbMV07CisJc3Bpbl91bmxvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2sgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gIkNhcHR1cmVkIEZYODAxMCBPdXRwdXRzIiwKKwkuaW5mbyA9IHNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2tfaW5mbywKKwkuZ2V0ID0gc25kX2VtdTEwazFfcGNtX2VmeF92b2ljZXNfbWFza19nZXQsCisJLnB1dCA9IHNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2tfcHV0Cit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfZW11MTBrMV9jYXB0dXJlX2VmeF9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X29wZW4sCisJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2VtdTEwazFfY2FwdHVyZV90cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfcG9pbnRlciwKK307CisKKworLyogRUZYIHBsYXliYWNrICovCisKKyNkZWZpbmUgSU5JVElBTF9UUkFNX1NISUZUICAgICAxNAorI2RlZmluZSBJTklUSUFMX1RSQU1fUE9TKHNpemUpICgoKChzaXplKSAvIDIpIC0gSU5JVElBTF9UUkFNX1NISUZUKSAtIDEpCisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19pcnEoZW11MTBrMV90ICplbXUsIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0gPSBwcml2YXRlX2RhdGE7CisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfdHJhbV9wb2tlMSh1bnNpZ25lZCBzaG9ydCAqZHN0X2xlZnQsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCAqZHN0X3JpZ2h0LAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgKnNyYywKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB0cmFtX3NoaWZ0KQoreworCS8vIHByaW50aygidHJhbV9wb2tlMTogZHN0X2xlZnQgPSAweCVwLCBkc3RfcmlnaHQgPSAweCVwLCBzcmMgPSAweCVwLCBjb3VudCA9IDB4JXhcbiIsIGRzdF9sZWZ0LCBkc3RfcmlnaHQsIHNyYywgY291bnQpOworCWlmICgodHJhbV9zaGlmdCAmIDEpID09IDApIHsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCSpkc3RfbGVmdC0tID0gKnNyYysrOworCQkJKmRzdF9yaWdodC0tID0gKnNyYysrOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCSpkc3RfcmlnaHQtLSA9ICpzcmMrKzsKKwkJCSpkc3RfbGVmdC0tID0gKnNyYysrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmeDgwMTBfcGJfdHJhbnNfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJIHNuZF9wY21faW5kaXJlY3RfdCAqcmVjLCBzaXplX3QgYnl0ZXMpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX2VtdTEwazFfZng4MDEwX3BjbV90ICpwY20gPSAmZW11LT5meDgwMTAucGNtW3N1YnN0cmVhbS0+bnVtYmVyXTsKKwl1bnNpZ25lZCBpbnQgdHJhbV9zaXplID0gcGNtLT5idWZmZXJfc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCAqc3JjID0gKHVuc2lnbmVkIHNob3J0ICopKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgKyByZWMtPnN3X2RhdGEpOworCXVuc2lnbmVkIGludCBmcmFtZXMgPSBieXRlcyA+PiAyLCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgdHJhbV9wb3MgPSBwY20tPnRyYW1fcG9zOworCXVuc2lnbmVkIGludCB0cmFtX3NoaWZ0ID0gcGNtLT50cmFtX3NoaWZ0OworCisJd2hpbGUgKGZyYW1lcyA+IHRyYW1fcG9zKSB7CisJCWNvdW50ID0gdHJhbV9wb3MgKyAxOworCQlzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfdHJhbV9wb2tlMSgodW5zaWduZWQgc2hvcnQgKillbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5hcmVhICsgdHJhbV9wb3MsCisJCQkJCQkgICAgICAgKHVuc2lnbmVkIHNob3J0ICopZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYXJlYSArIHRyYW1fcG9zICsgdHJhbV9zaXplIC8gMiwKKwkJCQkJCSAgICAgICBzcmMsIGNvdW50LCB0cmFtX3NoaWZ0KTsKKwkJc3JjICs9IGNvdW50ICogMjsKKwkJZnJhbWVzIC09IGNvdW50OworCQl0cmFtX3BvcyA9ICh0cmFtX3NpemUgLyAyKSAtIDE7CisJCXRyYW1fc2hpZnQrKzsKKwl9CisJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3RyYW1fcG9rZTEoKHVuc2lnbmVkIHNob3J0ICopZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYXJlYSArIHRyYW1fcG9zLAorCQkJCQkgICAgICAgKHVuc2lnbmVkIHNob3J0ICopZW11LT5meDgwMTAuZXRyYW1fcGFnZXMuYXJlYSArIHRyYW1fcG9zICsgdHJhbV9zaXplIC8gMiwKKwkJCQkJICAgICAgIHNyYywgZnJhbWVzLCB0cmFtX3NoaWZ0KTsKKwl0cmFtX3BvcyAtPSBmcmFtZXM7CisJcGNtLT50cmFtX3BvcyA9IHRyYW1fcG9zOworCXBjbS0+dHJhbV9zaGlmdCA9IHRyYW1fc2hpZnQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3RyYW5zZmVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfZW11MTBrMV9meDgwMTBfcGNtX3QgKnBjbSA9ICZlbXUtPmZ4ODAxMC5wY21bc3Vic3RyZWFtLT5udW1iZXJdOworCisJc25kX3BjbV9pbmRpcmVjdF9wbGF5YmFja190cmFuc2ZlcihzdWJzdHJlYW0sICZwY20tPnBjbV9yZWMsIGZ4ODAxMF9wYl90cmFuc19jb3B5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fdCAqcGNtID0gJmVtdS0+Zng4MDEwLnBjbVtzdWJzdHJlYW0tPm51bWJlcl07CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGNtLT5jaGFubmVsczsgaSsrKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQU5LTUVNQUREUlJFR0JBU0UgKyAweDgwICsgcGNtLT5ldHJhbVtpXSwgMCwgMCk7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX2VtdTEwazFfZng4MDEwX3BjbV90ICpwY20gPSAmZW11LT5meDgwMTAucGNtW3N1YnN0cmVhbS0+bnVtYmVyXTsKKwl1bnNpZ25lZCBpbnQgaTsKKwkKKwkvLyBwcmludGsoInByZXBhcmU6IGV0cmFtX3BhZ2VzID0gMHglcCwgZG1hX2FyZWEgPSAweCV4LCBidWZmZXJfc2l6ZSA9IDB4JXggKDB4JXgpXG4iLCBlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcywgcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5idWZmZXJfc2l6ZSA8PCAyKTsKKwltZW1zZXQoJnBjbS0+cGNtX3JlYywgMCwgc2l6ZW9mKHBjbS0+cGNtX3JlYykpOworCXBjbS0+cGNtX3JlYy5od19idWZmZXJfc2l6ZSA9IHBjbS0+YnVmZmVyX3NpemUgKiAyOyAvKiBieXRlIHNpemUgKi8KKwlwY20tPnBjbV9yZWMuc3dfYnVmZmVyX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwY20tPnRyYW1fcG9zID0gSU5JVElBTF9UUkFNX1BPUyhwY20tPmJ1ZmZlcl9zaXplKTsKKwlwY20tPnRyYW1fc2hpZnQgPSAwOworCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBwY20tPmdwcl9ydW5uaW5nLCAwLCAwKTsJLyogcmVzZXQgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfdHJpZ2dlciwgMCwgMCk7CS8qIHJlc2V0ICovCisJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgZW11LT5ncHJfYmFzZSArIHBjbS0+Z3ByX3NpemUsIDAsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfcHRyLCAwLCAwKTsJCS8qIHJlc2V0IHB0ciBudW1iZXIgKi8KKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfY291bnQsIDAsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfdG1wY291bnQsIDAsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGNtLT5jaGFubmVsczsgaSsrKQorCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQU5LTUVNQUREUlJFR0JBU0UgKyAweDgwICsgcGNtLT5ldHJhbVtpXSwgMCwgKFRBTktNRU1BRERSUkVHX1JFQUR8VEFOS01FTUFERFJSRUdfQUxJR04pICsgaSAqIChydW50aW1lLT5idWZmZXJfc2l6ZSAvIHBjbS0+Y2hhbm5lbHMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWVtdTEwazFfdCAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fdCAqcGNtID0gJmVtdS0+Zng4MDEwLnBjbVtzdWJzdHJlYW0tPm51bWJlcl07CisJaW50IHJlc3VsdCA9IDA7CisKKwlzcGluX2xvY2soJmVtdS0+cmVnX2xvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJLyogZm9sbG93IHRocnUgKi8KKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisjaWZkZWYgRU1VMTBLMV9TRVRfQUMzX0lFQzk1OAorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBiaXRzOworCQkJYml0cyA9IFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCSAgICAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8CisJCQkgICAgICAgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUIHwgU1BDU19OT1RBVURJT0RBVEE7CisJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBTUENTMCArIGksIDAsIGJpdHMpOworCQl9CisJfQorI2VuZGlmCisJCXJlc3VsdCA9IHNuZF9lbXUxMGsxX2Z4ODAxMF9yZWdpc3Rlcl9pcnFfaGFuZGxlcihlbXUsIHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19pcnEsIHBjbS0+Z3ByX3J1bm5pbmcsIHN1YnN0cmVhbSwgJnBjbS0+aXJxKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIF9fZXJyOworCQlzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfdHJhbnNmZXIoc3Vic3RyZWFtKTsJLyogcm9sbCB0aGUgYmFsbCAqLworCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfdHJpZ2dlciwgMCwgMSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXNuZF9lbXUxMGsxX2Z4ODAxMF91bnJlZ2lzdGVyX2lycV9oYW5kbGVyKGVtdSwgcGNtLT5pcnEpOyBwY20tPmlycSA9IE5VTEw7CisJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBwY20tPmdwcl90cmlnZ2VyLCAwLCAwKTsKKwkJcGNtLT50cmFtX3BvcyA9IElOSVRJQUxfVFJBTV9QT1MocGNtLT5idWZmZXJfc2l6ZSk7CisJCXBjbS0+dHJhbV9zaGlmdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKyAgICAgIF9fZXJyOgorCXNwaW5fdW5sb2NrKCZlbXUtPnJlZ19sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfZW11MTBrMV9meDgwMTBfcGNtX3QgKnBjbSA9ICZlbXUtPmZ4ODAxMC5wY21bc3Vic3RyZWFtLT5udW1iZXJdOworCXNpemVfdCBwdHI7IC8qIGJ5dGUgcG9pbnRlciAqLworCisJaWYgKCFzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIGVtdS0+Z3ByX2Jhc2UgKyBwY20tPmdwcl90cmlnZ2VyLCAwKSkKKwkJcmV0dXJuIDA7CisJcHRyID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBlbXUtPmdwcl9iYXNlICsgcGNtLT5ncHJfcHRyLCAwKSA8PCAyOworCXJldHVybiBzbmRfcGNtX2luZGlyZWN0X3BsYXliYWNrX3BvaW50ZXIoc3Vic3RyZWFtLCAmcGNtLT5wY21fcmVjLCBwdHIpOworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgKi8gU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkxLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTEwMjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfZW11MTBrMV9meDgwMTBfcGNtX3QgKnBjbSA9ICZlbXUtPmZ4ODAxMC5wY21bc3Vic3RyZWFtLT5udW1iZXJdOworCisJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2s7CisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gcGNtLT5jaGFubmVsczsKKwlydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4ID0gKHBjbS0+YnVmZmVyX3NpemUgKiAyKSAvIDI7CisJc3Bpbl9sb2NrX2lycSgmZW11LT5yZWdfbG9jayk7CisJaWYgKHBjbS0+dmFsaWQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnEoJmVtdS0+cmVnX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcGNtLT5vcGVuZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmZW11LT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX2VtdTEwazFfZng4MDEwX3BjbV90ICpwY20gPSAmZW11LT5meDgwMTAucGNtW3N1YnN0cmVhbS0+bnVtYmVyXTsKKworCXNwaW5fbG9ja19pcnEoJmVtdS0+cmVnX2xvY2spOworCXBjbS0+b3BlbmVkID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmVtdS0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCQlzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX2h3X2ZyZWUsCisJLnByZXBhcmUgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3BvaW50ZXIsCisJLmFjayA9CQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX3RyYW5zZmVyLAorfTsKKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcGNtX2VmeF9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWVtdTEwazFfdCAqZW11ID0gcGNtLT5wcml2YXRlX2RhdGE7CisJZW11LT5wY21fZWZ4ID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9wY21fZWZ4KGVtdTEwazFfdCAqIGVtdSwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGVtdS0+Y2FyZCwgImVtdTEwazEgZWZ4IiwgZGV2aWNlLCA4LCAxLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBlbXU7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9wY21fZWZ4X2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2VtdTEwazFfY2FwdHVyZV9lZnhfb3BzKTsKKworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIk11bHRpY2hhbm5lbCBDYXB0dXJlL1BUIFBsYXliYWNrIik7CisJZW11LT5wY21fZWZ4ID0gcGNtOworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKworCS8qIEVGWCBjYXB0dXJlIC0gcmVjb3JkIHRoZSAiRlhCVVMyIiBjaGFubmVscywgYnkgZGVmYXVsdCB3ZSBjb25uZWN0IHRoZSBFWFRJTnMgCisJICogdG8gdGhlc2UKKwkgKi8JCisJCisJLyogZW11LT5lZnhfdm9pY2VzX21hc2tbMF0gPSBGWFdDX0RFRkFVTFRST1VURV9DIHwgRlhXQ19ERUZBVUxUUk9VVEVfQTsgKi8KKwlpZiAoZW11LT5hdWRpZ3kpIHsKKwkJZW11LT5lZnhfdm9pY2VzX21hc2tbMF0gPSAwOworCQllbXUtPmVmeF92b2ljZXNfbWFza1sxXSA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCQllbXUtPmVmeF92b2ljZXNfbWFza1swXSA9IDB4ZmZmZjAwMDA7CisJCWVtdS0+ZWZ4X3ZvaWNlc19tYXNrWzFdID0gMDsKKwl9CisJc25kX2N0bF9hZGQoZW11LT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2ssIGVtdSkpOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShlbXUtPnBjaSksIDY0KjEwMjQsIDY0KjEwMjQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MGQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzIC8gcHJvYyBpbnRlcmZhY2Ugcm91dGluZXMKKyAqCisgKiAgQlVHUzoKKyAqICAgIC0tCisgKgorICogIFRPRE86CisgKiAgICAtLQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcHJvY19zcGRpZl9zdGF0dXMoZW11MTBrMV90ICogZW11LAorCQkJCQkgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyLAorCQkJCQkgIGNoYXIgKnRpdGxlLAorCQkJCQkgIGludCBzdGF0dXNfcmVnLAorCQkJCQkgIGludCByYXRlX3JlZykKK3sKKwlzdGF0aWMgY2hhciAqY2xrYWNjeVs0XSA9IHsgIjEwMDBwcG0iLCAiNTBwcG0iLCAidmFyaWFibGUiLCAidW5rbm93biIgfTsKKwlzdGF0aWMgaW50IHNhbXBsZXJhdGVbMTZdID0geyA0NDEwMCwgMSwgNDgwMDAsIDMyMDAwLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisJc3RhdGljIGNoYXIgKmNoYW5uZWxbMTZdID0geyAidW5zcGVjIiwgImxlZnQiLCAicmlnaHQiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsICIxMiIsICIxMyIsICIxNCIsICIxNSIgfTsKKwlzdGF0aWMgY2hhciAqZW1waGFzaXNbOF0gPSB7ICJub25lIiwgIjUwLzE1IHVzZWMgMiBjaGFubmVsIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiB9OworCXVuc2lnbmVkIGludCBzdGF0dXMsIHJhdGUgPSAwOworCQorCXN0YXR1cyA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgc3RhdHVzX3JlZywgMCk7CisJaWYgKHJhdGVfcmVnID4gMCkKKwkJcmF0ZSA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgcmF0ZV9yZWcsIDApOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4lc1xuIiwgdGl0bGUpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiUHJvZmVzc2lvbmFsIE1vZGUgICAgIDogJXNcbiIsIChzdGF0dXMgJiBTUENTX1BST0ZFU1NJT05BTCkgPyAieWVzIiA6ICJubyIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk5vdCBBdWRpbyBEYXRhICAgICAgICA6ICVzXG4iLCAoc3RhdHVzICYgU1BDU19OT1RBVURJT0RBVEEpID8gInllcyIgOiAibm8iKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDb3B5cmlnaHQgICAgICAgICAgICAgOiAlc1xuIiwgKHN0YXR1cyAmIFNQQ1NfQ09QWVJJR0hUKSA/ICJ5ZXMiIDogIm5vIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRW1waGFzaXMgICAgICAgICAgICAgIDogJXNcbiIsIGVtcGhhc2lzWyhzdGF0dXMgJiBTUENTX0VNUEhBU0lTTUFTSykgPj4gM10pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1vZGUgICAgICAgICAgICAgICAgICA6ICVpXG4iLCAoc3RhdHVzICYgU1BDU19NT0RFTUFTSykgPj4gNik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiQ2F0ZWdvcnkgQ29kZSAgICAgICAgIDogMHgleFxuIiwgKHN0YXR1cyAmIFNQQ1NfQ0FURUdPUllDT0RFTUFTSykgPj4gOCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiR2VuZXJhdGlvbiBTdGF0dXMgICAgIDogJXNcbiIsIHN0YXR1cyAmIFNQQ1NfR0VORVJBVElPTlNUQVRVUyA/ICJvcmlnaW5hbCIgOiAiY29weSIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNvdXJjZSBNYXNrICAgICAgICAgICA6ICVpXG4iLCAoc3RhdHVzICYgU1BDU19TT1VSQ0VOVU1NQVNLKSA+PiAxNik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiQ2hhbm5lbCBOdW1iZXIgICAgICAgIDogJXNcbiIsIGNoYW5uZWxbKHN0YXR1cyAmIFNQQ1NfQ0hBTk5FTE5VTU1BU0spID4+IDIwXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiU2FtcGxlIFJhdGUgICAgICAgICAgIDogJWlIelxuIiwgc2FtcGxlcmF0ZVsoc3RhdHVzICYgU1BDU19TQU1QTEVSQVRFTUFTSykgPj4gMjRdKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDbG9jayBBY2N1cmFjeSAgICAgICAgOiAlc1xuIiwgY2xrYWNjeVsoc3RhdHVzICYgU1BDU19DTEtBQ0NZTUFTSykgPj4gMjhdKTsKKworCWlmIChyYXRlX3JlZyA+IDApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUy9QRElGIExvY2tlZCAgICAgICAgIDogJXNcbiIsIHJhdGUgJiBTUkNTX1NQRElGTE9DS0VEID8gIm9uIiA6ICJvZmYiKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUmF0ZSBMb2NrZWQgICAgICAgICAgIDogJXNcbiIsIHJhdGUgJiBTUkNTX1JBVEVMT0NLRUQgPyAib24iIDogIm9mZiIpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJFc3RpbWF0ZWQgU2FtcGxlIFJhdGUgOiAweCV4XG4iLCByYXRlICYgU1JDU19FU1RTQU1QTEVSQVRFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXUxMGsxX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwkvKiBGSVhNRSAtIG91dHB1dCBuYW1lcyBhcmUgaW4gZW11ZnguYyB0b28gKi8KKwlzdGF0aWMgY2hhciAqY3JlYXRpdmVfb3V0c1szMl0gPSB7CisJCS8qIDAwICovICJBQzk3IExlZnQiLAorCQkvKiAwMSAqLyAiQUM5NyBSaWdodCIsCisJCS8qIDAyICovICJPcHRpY2FsIElFQzk1OCBMZWZ0IiwKKwkJLyogMDMgKi8gIk9wdGljYWwgSUVDOTU4IFJpZ2h0IiwKKwkJLyogMDQgKi8gIkNlbnRlciIsCisJCS8qIDA1ICovICJMRkUiLAorCQkvKiAwNiAqLyAiSGVhZHBob25lIExlZnQiLAorCQkvKiAwNyAqLyAiSGVhZHBob25lIFJpZ2h0IiwKKwkJLyogMDggKi8gIlN1cnJvdW5kIExlZnQiLAorCQkvKiAwOSAqLyAiU3Vycm91bmQgUmlnaHQiLAorCQkvKiAxMCAqLyAiUENNIENhcHR1cmUgTGVmdCIsCisJCS8qIDExICovICJQQ00gQ2FwdHVyZSBSaWdodCIsCisJCS8qIDEyICovICJNSUMgQ2FwdHVyZSIsCisJCS8qIDEzICovICJBQzk3IFN1cnJvdW5kIExlZnQiLAorCQkvKiAxNCAqLyAiQUM5NyBTdXJyb3VuZCBSaWdodCIsCisJCS8qIDE1ICovICI/Pz8iLAorCQkvKiAxNiAqLyAiPz8/IiwKKwkJLyogMTcgKi8gIkFuYWxvZyBDZW50ZXIiLAorCQkvKiAxOCAqLyAiQW5hbG9nIExGRSIsCisJCS8qIDE5ICovICI/Pz8iLAorCQkvKiAyMCAqLyAiPz8/IiwKKwkJLyogMjEgKi8gIj8/PyIsCisJCS8qIDIyICovICI/Pz8iLAorCQkvKiAyMyAqLyAiPz8/IiwKKwkJLyogMjQgKi8gIj8/PyIsCisJCS8qIDI1ICovICI/Pz8iLAorCQkvKiAyNiAqLyAiPz8/IiwKKwkJLyogMjcgKi8gIj8/PyIsCisJCS8qIDI4ICovICI/Pz8iLAorCQkvKiAyOSAqLyAiPz8/IiwKKwkJLyogMzAgKi8gIj8/PyIsCisJCS8qIDMxICovICI/Pz8iCisJfTsKKworCXN0YXRpYyBjaGFyICphdWRpZ3lfb3V0c1s2NF0gPSB7CisJCS8qIDAwICovICJEaWdpdGFsIEZyb250IExlZnQiLAorCQkvKiAwMSAqLyAiRGlnaXRhbCBGcm9udCBSaWdodCIsCisJCS8qIDAyICovICJEaWdpdGFsIENlbnRlciIsCisJCS8qIDAzICovICJEaWdpdGFsIExFRiIsCisJCS8qIDA0ICovICJIZWFkcGhvbmUgTGVmdCIsCisJCS8qIDA1ICovICJIZWFkcGhvbmUgUmlnaHQiLAorCQkvKiAwNiAqLyAiRGlnaXRhbCBSZWFyIExlZnQiLAorCQkvKiAwNyAqLyAiRGlnaXRhbCBSZWFyIFJpZ2h0IiwKKwkJLyogMDggKi8gIkZyb250IExlZnQiLAorCQkvKiAwOSAqLyAiRnJvbnQgUmlnaHQiLAorCQkvKiAxMCAqLyAiQ2VudGVyIiwKKwkJLyogMTEgKi8gIkxGRSIsCisJCS8qIDEyICovICI/Pz8iLAorCQkvKiAxMyAqLyAiPz8/IiwKKwkJLyogMTQgKi8gIlJlYXIgTGVmdCIsCisJCS8qIDE1ICovICJSZWFyIFJpZ2h0IiwKKwkJLyogMTYgKi8gIkFDOTcgRnJvbnQgTGVmdCIsCisJCS8qIDE3ICovICJBQzk3IEZyb250IFJpZ2h0IiwKKwkJLyogMTggKi8gIkFEQyBDYXB1dHJlIExlZnQiLAorCQkvKiAxOSAqLyAiQURDIENhcHR1cmUgUmlnaHQiLAorCQkvKiAyMCAqLyAiPz8/IiwKKwkJLyogMjEgKi8gIj8/PyIsCisJCS8qIDIyICovICI/Pz8iLAorCQkvKiAyMyAqLyAiPz8/IiwKKwkJLyogMjQgKi8gIj8/PyIsCisJCS8qIDI1ICovICI/Pz8iLAorCQkvKiAyNiAqLyAiPz8/IiwKKwkJLyogMjcgKi8gIj8/PyIsCisJCS8qIDI4ICovICI/Pz8iLAorCQkvKiAyOSAqLyAiPz8/IiwKKwkJLyogMzAgKi8gIj8/PyIsCisJCS8qIDMxICovICI/Pz8iLAorCQkvKiAzMiAqLyAiRlhCVVMyXzAiLAorCQkvKiAzMyAqLyAiRlhCVVMyXzEiLAorCQkvKiAzNCAqLyAiRlhCVVMyXzIiLAorCQkvKiAzNSAqLyAiRlhCVVMyXzMiLAorCQkvKiAzNiAqLyAiRlhCVVMyXzQiLAorCQkvKiAzNyAqLyAiRlhCVVMyXzUiLAorCQkvKiAzOCAqLyAiRlhCVVMyXzYiLAorCQkvKiAzOSAqLyAiRlhCVVMyXzciLAorCQkvKiA0MCAqLyAiRlhCVVMyXzgiLAorCQkvKiA0MSAqLyAiRlhCVVMyXzkiLAorCQkvKiA0MiAqLyAiRlhCVVMyXzEwIiwKKwkJLyogNDMgKi8gIkZYQlVTMl8xMSIsCisJCS8qIDQ0ICovICJGWEJVUzJfMTIiLAorCQkvKiA0NSAqLyAiRlhCVVMyXzEzIiwKKwkJLyogNDYgKi8gIkZYQlVTMl8xNCIsCisJCS8qIDQ3ICovICJGWEJVUzJfMTUiLAorCQkvKiA0OCAqLyAiRlhCVVMyXzE2IiwKKwkJLyogNDkgKi8gIkZYQlVTMl8xNyIsCisJCS8qIDUwICovICJGWEJVUzJfMTgiLAorCQkvKiA1MSAqLyAiRlhCVVMyXzE5IiwKKwkJLyogNTIgKi8gIkZYQlVTMl8yMCIsCisJCS8qIDUzICovICJGWEJVUzJfMjEiLAorCQkvKiA1NCAqLyAiRlhCVVMyXzIyIiwKKwkJLyogNTUgKi8gIkZYQlVTMl8yMyIsCisJCS8qIDU2ICovICJGWEJVUzJfMjQiLAorCQkvKiA1NyAqLyAiRlhCVVMyXzI1IiwKKwkJLyogNTggKi8gIkZYQlVTMl8yNiIsCisJCS8qIDU5ICovICJGWEJVUzJfMjciLAorCQkvKiA2MCAqLyAiRlhCVVMyXzI4IiwKKwkJLyogNjEgKi8gIkZYQlVTMl8yOSIsCisJCS8qIDYyICovICJGWEJVUzJfMzAiLAorCQkvKiA2MyAqLyAiRlhCVVMyXzMxIgorCX07CisKKwllbXUxMGsxX3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHZhbCwgdmFsMTsKKwlpbnQgbmVmeCA9IGVtdS0+YXVkaWd5ID8gNjQgOiAzMjsKKwljaGFyICoqb3V0cHV0cyA9IGVtdS0+YXVkaWd5ID8gYXVkaWd5X291dHMgOiBjcmVhdGl2ZV9vdXRzOworCWludCBpZHg7CisJCisJc25kX2lwcmludGYoYnVmZmVyLCAiRU1VMTBLMVxuXG4iKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDYXJkICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJICAgIGVtdS0+YXVkaWd5ID8gIkF1ZGlneSIgOiAoZW11LT5BUFMgPyAiRU1VIEFQUyIgOiAiQ3JlYXRpdmUiKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiSW50ZXJuYWwgVFJBTSAod29yZHMpIDogMHgleFxuIiwgZW11LT5meDgwMTAuaXRyYW1fc2l6ZSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRXh0ZXJuYWwgVFJBTSAod29yZHMpIDogMHgleFxuIiwgKGludCllbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcy5ieXRlcyAvIDIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRWZmZWN0IFNlbmQgUm91dGluZyAgIDpcbiIpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTlVNX0c7IGlkeCsrKSB7CisJCXZhbCA9IGVtdS0+YXVkaWd5ID8KKwkJCXNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9GWFJUMSwgaWR4KSA6CisJCQlzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEZYUlQsIGlkeCk7CisJCXZhbDEgPSBlbXUtPmF1ZGlneSA/CisJCQlzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfRlhSVDIsIGlkeCkgOgorCQkJMDsKKwkJaWYgKGVtdS0+YXVkaWd5KSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJDaCVpOiBBPSVpLCBCPSVpLCBDPSVpLCBEPSVpLCAiLAorCQkJCWlkeCwKKwkJCQl2YWwgJiAweDNmLAorCQkJCSh2YWwgPj4gOCkgJiAweDNmLAorCQkJCSh2YWwgPj4gMTYpICYgMHgzZiwKKwkJCQkodmFsID4+IDI0KSAmIDB4M2YpOworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiRT0laSwgRj0laSwgRz0laSwgSD0laVxuIiwKKwkJCQl2YWwxICYgMHgzZiwKKwkJCQkodmFsMSA+PiA4KSAmIDB4M2YsCisJCQkJKHZhbDEgPj4gMTYpICYgMHgzZiwKKwkJCQkodmFsMSA+PiAyNCkgJiAweDNmKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNoJWk6IEE9JWksIEI9JWksIEM9JWksIEQ9JWlcbiIsCisJCQkJaWR4LAorCQkJCSh2YWwgPj4gMTYpICYgMHgwZiwKKwkJCQkodmFsID4+IDIwKSAmIDB4MGYsCisJCQkJKHZhbCA+PiAyNCkgJiAweDBmLAorCQkJCSh2YWwgPj4gMjgpICYgMHgwZik7CisJCX0KKwl9CisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5DYXB0dXJlZCBGWCBPdXRwdXRzICAgOlxuIik7CisJZm9yIChpZHggPSAwOyBpZHggPCBuZWZ4OyBpZHgrKykgeworCQlpZiAoZW11LT5lZnhfdm9pY2VzX21hc2tbaWR4LzMyXSAmICgxIDw8IChpZHglMzIpKSkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgT3V0cHV0ICUwMmkgWyVzXVxuIiwgaWR4LCBvdXRwdXRzW2lkeF0pOworCX0KKwlzbmRfaXByaW50ZihidWZmZXIsICJcbkFsbCBGWCBPdXRwdXRzICAgICAgICA6XG4iKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IChlbXUtPmF1ZGlneSA/IDY0IDogMzIpOyBpZHgrKykKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBPdXRwdXQgJTAyaSBbJXNdXG4iLCBpZHgsIG91dHB1dHNbaWR4XSk7CisJc25kX2VtdTEwazFfcHJvY19zcGRpZl9zdGF0dXMoZW11LCBidWZmZXIsICJTL1BESUYgT3V0cHV0IDAiLCBTUENTMCwgLTEpOworCXNuZF9lbXUxMGsxX3Byb2Nfc3BkaWZfc3RhdHVzKGVtdSwgYnVmZmVyLCAiUy9QRElGIE91dHB1dCAxIiwgU1BDUzEsIC0xKTsKKwlzbmRfZW11MTBrMV9wcm9jX3NwZGlmX3N0YXR1cyhlbXUsIGJ1ZmZlciwgIlMvUERJRiBPdXRwdXQgMi8zIiwgU1BDUzIsIC0xKTsKKwlzbmRfZW11MTBrMV9wcm9jX3NwZGlmX3N0YXR1cyhlbXUsIGJ1ZmZlciwgIkNELVJPTSBTL1BESUYiLCBDRENTLCBDRFNSQ1MpOworCXNuZF9lbXUxMGsxX3Byb2Nfc3BkaWZfc3RhdHVzKGVtdSwgYnVmZmVyLCAiR2VuZXJhbCBwdXJwb3NlIFMvUERJRiIsIEdQU0NTLCBHUFNSQ1MpOworCXZhbCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgWlZTUkNTLCAwKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcblpvb21lZCBWaWRlb1xuIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiUmF0ZSBMb2NrZWQgICAgICAgICAgIDogJXNcbiIsIHZhbCAmIFNSQ1NfUkFURUxPQ0tFRCA/ICJvbiIgOiAib2ZmIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRXN0aW1hdGVkIFNhbXBsZSBSYXRlIDogMHgleFxuIiwgdmFsICYgU1JDU19FU1RTQU1QTEVSQVRFKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VtdTEwazFfcHJvY19hY29kZV9yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgICAgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCXUzMiBwYzsKKwllbXUxMGsxX3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJGWDgwMTAgSW5zdHJ1Y3Rpb24gTGlzdCAnJXMnXG4iLCBlbXUtPmZ4ODAxMC5uYW1lKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIENvZGUgZHVtcCAgICAgIDpcbiIpOworCWZvciAocGMgPSAwOyBwYyA8IChlbXUtPmF1ZGlneSA/IDEwMjQgOiA1MTIpOyBwYysrKSB7CisJCXUzMiBsb3csIGhpZ2g7CisJCQkKKwkJbG93ID0gc25kX2VtdTEwazFfZWZ4X3JlYWQoZW11LCBwYyAqIDIpOworCQloaWdoID0gc25kX2VtdTEwazFfZWZ4X3JlYWQoZW11LCBwYyAqIDIgKyAxKTsKKwkJaWYgKGVtdS0+YXVkaWd5KQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICAgIE9QKDB4JTAyeCwgMHglMDN4LCAweCUwM3gsIDB4JTAzeCwgMHglMDN4KSAvKiAweCUwNHg6IDB4JTA4eCUwOHggKi9cbiIsCisJCQkJICAgIChoaWdoID4+IDI0KSAmIDB4MGYsCisJCQkJICAgIChoaWdoID4+IDEyKSAmIDB4N2ZmLAorCQkJCSAgICAoaGlnaCA+PiAwKSAmIDB4N2ZmLAorCQkJCSAgICAobG93ID4+IDEyKSAmIDB4N2ZmLAorCQkJCSAgICAobG93ID4+IDApICYgMHg3ZmYsCisJCQkJICAgIHBjLAorCQkJCSAgICBoaWdoLCBsb3cpOworCQllbHNlCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgICAgT1AoMHglMDJ4LCAweCUwM3gsIDB4JTAzeCwgMHglMDN4LCAweCUwM3gpIC8qIDB4JTA0eDogMHglMDh4JTA4eCAqL1xuIiwKKwkJCQkgICAgKGhpZ2ggPj4gMjApICYgMHgwZiwKKwkJCQkgICAgKGhpZ2ggPj4gMTApICYgMHgzZmYsCisJCQkJICAgIChoaWdoID4+IDApICYgMHgzZmYsCisJCQkJICAgIChsb3cgPj4gMTApICYgMHgzZmYsCisJCQkJICAgIChsb3cgPj4gMCkgJiAweDNmZiwKKwkJCQkgICAgcGMsCisJCQkJICAgIGhpZ2gsIGxvdyk7CisJfQorfQorCisjZGVmaW5lIFRPVEFMX1NJWkVfR1BSCQkoMHgxMDAqNCkKKyNkZWZpbmUgQV9UT1RBTF9TSVpFX0dQUgkoMHgyMDAqNCkKKyNkZWZpbmUgVE9UQUxfU0laRV9UQU5LTUVNX0RBVEEJKDB4YTAqNCkKKyNkZWZpbmUgVE9UQUxfU0laRV9UQU5LTUVNX0FERFIgKDB4YTAqNCkKKyNkZWZpbmUgQV9UT1RBTF9TSVpFX1RBTktNRU1fREFUQSAoMHgxMDAqNCkKKyNkZWZpbmUgQV9UT1RBTF9TSVpFX1RBTktNRU1fQUREUiAoMHgxMDAqNCkKKyNkZWZpbmUgVE9UQUxfU0laRV9DT0RFCQkoMHgyMDAqOCkKKyNkZWZpbmUgQV9UT1RBTF9TSVpFX0NPREUJKDB4NDAwKjgpCisKK3N0YXRpYyBsb25nIHNuZF9lbXUxMGsxX2Z4ODAxMF9yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCB2b2lkICpmaWxlX3ByaXZhdGVfZGF0YSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgcG9zKQoreworCWxvbmcgc2l6ZTsKKwllbXUxMGsxX3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgdHJhbV9hZGRyID0gMDsKKwkKKwlpZiAoIXN0cmNtcChlbnRyeS0+bmFtZSwgImZ4ODAxMF90cmFtX2FkZHIiKSkgeworCQlvZmZzZXQgPSBUQU5LTUVNQUREUlJFR0JBU0U7CisJCXRyYW1fYWRkciA9IDE7CisJfSBlbHNlIGlmICghc3RyY21wKGVudHJ5LT5uYW1lLCAiZng4MDEwX3RyYW1fZGF0YSIpKSB7CisJCW9mZnNldCA9IFRBTktNRU1EQVRBUkVHQkFTRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoZW50cnktPm5hbWUsICJmeDgwMTBfY29kZSIpKSB7CisJCW9mZnNldCA9IGVtdS0+YXVkaWd5ID8gQV9NSUNST0NPREVCQVNFIDogTUlDUk9DT0RFQkFTRTsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSBlbXUtPmF1ZGlneSA/IEFfRlhHUFJFR0JBU0UgOiBGWEdQUkVHQkFTRTsKKwl9CisJc2l6ZSA9IGNvdW50OworCWlmIChwb3MgKyBzaXplID4gZW50cnktPnNpemUpCisJCXNpemUgPSAobG9uZyllbnRyeS0+c2l6ZSAtIHBvczsKKwlpZiAoc2l6ZSA+IDApIHsKKwkJdW5zaWduZWQgaW50ICp0bXA7CisJCWxvbmcgcmVzOworCQl1bnNpZ25lZCBpbnQgaWR4OworCQlpZiAoKHRtcCA9IGttYWxsb2Moc2l6ZSArIDgsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgKChwb3MgJiAzKSArIHNpemUgKyAzKSA+PiAyOyBpZHgrKykKKwkJCWlmICh0cmFtX2FkZHIgJiYgZW11LT5hdWRpZ3kpIHsKKwkJCQl0bXBbaWR4XSA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgb2Zmc2V0ICsgaWR4ICsgKHBvcyA+PiAyKSwgMCkgPj4gMTE7CisJCQkJdG1wW2lkeF0gfD0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCAweDEwMCArIGlkeCArIChwb3MgPj4gMiksIDApIDw8IDIwOworCQkJfSBlbHNlIAorCQkJCXRtcFtpZHhdID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBvZmZzZXQgKyBpZHggKyAocG9zID4+IDIpLCAwKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICgoY2hhciAqKXRtcCkgKyAocG9zICYgMyksIHNpemUpKQorCQkJcmVzID0gLUVGQVVMVDsKKwkJZWxzZSB7CisJCQlyZXMgPSBzaXplOworCQl9CisJCWtmcmVlKHRtcCk7CisJCXJldHVybiByZXM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11MTBrMV9wcm9jX3ZvaWNlc19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWVtdTEwazFfdCAqZW11ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwllbXUxMGsxX3ZvaWNlX3QgKnZvaWNlOworCWludCBpZHg7CisJCisJc25kX2lwcmludGYoYnVmZmVyLCAiY2hcdHVzZVx0cGNtXHRlZnhcdHN5bnRoXHRtaWRpXG4iKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9HOyBpZHgrKykgeworCQl2b2ljZSA9ICZlbXUtPnZvaWNlc1tpZHhdOworCQlzbmRfaXByaW50ZihidWZmZXIsICIlaVx0JWlcdCVpXHQlaVx0JWlcdCVpXG4iLAorCQkJaWR4LAorCQkJdm9pY2UtPnVzZSwKKwkJCXZvaWNlLT5wY20sCisJCQl2b2ljZS0+ZWZ4LAorCQkJdm9pY2UtPnN5bnRoLAorCQkJdm9pY2UtPm1pZGkpOworCX0KK30KKworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyB2b2lkIHNuZF9lbXVfcHJvY19pb19yZWdfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwKKwkJCQkgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWVtdTEwazFfdCAqZW11ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiSU8gUmVnaXN0ZXJzOlxuXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCAweDQwOyBpKz00KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXZhbHVlID0gaW5sKGVtdS0+cG9ydCArIGkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMlg6ICUwOGxYXG4iLCBpLCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfaW9fcmVnX3dyaXRlKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwllbXUxMGsxX3QgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGxpbmVbNjRdOworCXUzMiByZWcsIHZhbDsKKwl3aGlsZSAoIXNuZF9pbmZvX2dldF9saW5lKGJ1ZmZlciwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgeworCQlpZiAoc3NjYW5mKGxpbmUsICIleCAleCIsICZyZWcsICZ2YWwpICE9IDIpCisJCQljb250aW51ZTsKKwkJaWYgKChyZWcgPCAweDQwKSAmJiAocmVnID49MCkgJiYgKHZhbCA8PSAweGZmZmZmZmZmKSApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCQlvdXRsKHZhbCwgZW11LT5wb3J0ICsgKHJlZyAmIDB4ZmZmZmZmZmMpKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfcHRyX3JlYWQoZW11MTBrMV90ICogZW11LAorCQkJCSB1bnNpZ25lZCBpbnQgaW9iYXNlLAorCQkJCSB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCSB1bnNpZ25lZCBpbnQgY2huKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHJlZ3B0ciwgdmFsOworCisJcmVncHRyID0gKHJlZyA8PCAxNikgfCBjaG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBpb2Jhc2UgKyBQVFIpOworCXZhbCA9IGlubChlbXUtPnBvcnQgKyBpb2Jhc2UgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgc25kX3B0cl93cml0ZShlbXUxMGsxX3QgKmVtdSwKKwkJCSAgdW5zaWduZWQgaW50IGlvYmFzZSwKKwkJCSAgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgdW5zaWduZWQgaW50IGNobiwKKwkJCSAgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IHJlZ3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVncHRyID0gKHJlZyA8PCAxNikgfCBjaG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBpb2Jhc2UgKyBQVFIpOworCW91dGwoZGF0YSwgZW11LT5wb3J0ICsgaW9iYXNlICsgREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNuZF9lbXVfcHJvY19wdHJfcmVnX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksCisJCQkJICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGludCBpb2Jhc2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCB2b2ljZXMpCit7CisJZW11MTBrMV90ICplbXUgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IGksajsKKwlpZiAob2Zmc2V0K2xlbmd0aCA+IDB4ODApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgdmFsdWVzIG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybjsKKwl9CisJc25kX2lwcmludGYoYnVmZmVyLCAiUmVnaXN0ZXJzIDB4JXhcbiIsIGlvYmFzZSk7CisJZm9yKGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQrbGVuZ3RoOyBpKyspIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyWDogIixpKTsKKwkJZm9yIChqID0gMDsgaiA8IHZvaWNlczsgaisrKSB7CisJCQlpZihpb2Jhc2UgPT0gMCkKKyAgICAgICAgICAgICAgICAJCXZhbHVlID0gc25kX3B0cl9yZWFkKGVtdSwgMCwgaSwgaik7CisJCQllbHNlCisgICAgICAgICAgICAgICAgCQl2YWx1ZSA9IHNuZF9wdHJfcmVhZChlbXUsIDB4MjAsIGksIGopOworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTA4bFggIiwgdmFsdWUpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfcHRyX3JlZ193cml0ZShzbmRfaW5mb19lbnRyeV90ICplbnRyeSwKKwkJCQkgICAgICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGludCBpb2Jhc2UpCit7CisJZW11MTBrMV90ICplbXUgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgbGluZVs2NF07CisJdW5zaWduZWQgaW50IHJlZywgY2hhbm5lbF9pZCAsIHZhbDsKKwl3aGlsZSAoIXNuZF9pbmZvX2dldF9saW5lKGJ1ZmZlciwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgeworCQlpZiAoc3NjYW5mKGxpbmUsICIleCAleCAleCIsICZyZWcsICZjaGFubmVsX2lkLCAmdmFsKSAhPSAzKQorCQkJY29udGludWU7CisJCWlmICgocmVnIDwgMHg4MCkgJiYgKHJlZyA+PTApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgJiYgKGNoYW5uZWxfaWQgPj0wKSAmJiAoY2hhbm5lbF9pZCA8PSAzKSApCisJCQlzbmRfcHRyX3dyaXRlKGVtdSwgaW9iYXNlLCByZWcsIGNoYW5uZWxfaWQsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfcHRyX3JlZ193cml0ZTAwKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LAorCQkJCQkgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUoZW50cnksIGJ1ZmZlciwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXVfcHJvY19wdHJfcmVnX3dyaXRlMjAoc25kX2luZm9fZW50cnlfdCAqZW50cnksCisJCQkJCSBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlzbmRfZW11X3Byb2NfcHRyX3JlZ193cml0ZShlbnRyeSwgYnVmZmVyLCAweDIwKTsKK30KKwkKKworc3RhdGljIHZvaWQgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDAwYShzbmRfaW5mb19lbnRyeV90ICplbnRyeSwKKwkJCQkJIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCXNuZF9lbXVfcHJvY19wdHJfcmVnX3JlYWQoZW50cnksIGJ1ZmZlciwgMCwgMCwgMHg0MCwgNjQpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMDBiKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LAorCQkJCQkgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZChlbnRyeSwgYnVmZmVyLCAwLCAweDQwLCAweDQwLCA2NCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lbXVfcHJvY19wdHJfcmVnX3JlYWQyMGEoc25kX2luZm9fZW50cnlfdCAqZW50cnksCisJCQkJCSBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkKGVudHJ5LCBidWZmZXIsIDB4MjAsIDAsIDB4NDAsIDQpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMjBiKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LAorCQkJCQkgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZChlbnRyeSwgYnVmZmVyLCAweDIwLCAweDQwLCAweDQwLCA0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyBzbmRfZW11MTBrMV9wcm9jX29wc19meDgwMTAgPSB7CisJLnJlYWQgPSBzbmRfZW11MTBrMV9meDgwMTBfcmVhZCwKK307CisKK2ludCBfX2RldmluaXQgc25kX2VtdTEwazFfcHJvY19pbml0KGVtdTEwazFfdCAqIGVtdSkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiaW9fcmVncyIsICZlbnRyeSkpIHsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDEwMjQsIHNuZF9lbXVfcHJvY19pb19yZWdfcmVhZCk7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX2lvX3JlZ193cml0ZTsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MwMGEiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDAwYSk7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUwMDsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MwMGIiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDAwYik7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUwMDsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MyMGEiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDIwYSk7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUyMDsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MyMGIiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDIwYik7CisJCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUyMDsKKwl9CisjZW5kaWYKKwkKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJlbXUxMGsxIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDIwNDgsIHNuZF9lbXUxMGsxX3Byb2NfcmVhZCk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJ2b2ljZXMiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMjA0OCwgc25kX2VtdTEwazFfcHJvY192b2ljZXNfcmVhZCk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJmeDgwMTBfZ3ByIiwgJmVudHJ5KSkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gZW11OworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIC8qfCBTX0lXVVNSKi87CisJCWVudHJ5LT5zaXplID0gZW11LT5hdWRpZ3kgPyBBX1RPVEFMX1NJWkVfR1BSIDogVE9UQUxfU0laRV9HUFI7CisJCWVudHJ5LT5jLm9wcyA9ICZzbmRfZW11MTBrMV9wcm9jX29wc19meDgwMTA7CisJfQorCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImZ4ODAxMF90cmFtX2RhdGEiLCAmZW50cnkpKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBlbXU7CisJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gLyp8IFNfSVdVU1IqLzsKKwkJZW50cnktPnNpemUgPSBlbXUtPmF1ZGlneSA/IEFfVE9UQUxfU0laRV9UQU5LTUVNX0RBVEEgOiBUT1RBTF9TSVpFX1RBTktNRU1fREFUQSA7CisJCWVudHJ5LT5jLm9wcyA9ICZzbmRfZW11MTBrMV9wcm9jX29wc19meDgwMTA7CisJfQorCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImZ4ODAxMF90cmFtX2FkZHIiLCAmZW50cnkpKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBlbXU7CisJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gLyp8IFNfSVdVU1IqLzsKKwkJZW50cnktPnNpemUgPSBlbXUtPmF1ZGlneSA/IEFfVE9UQUxfU0laRV9UQU5LTUVNX0FERFIgOiBUT1RBTF9TSVpFX1RBTktNRU1fQUREUiA7CisJCWVudHJ5LT5jLm9wcyA9ICZzbmRfZW11MTBrMV9wcm9jX29wc19meDgwMTA7CisJfQorCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImZ4ODAxMF9jb2RlIiwgJmVudHJ5KSkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gZW11OworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIC8qfCBTX0lXVVNSKi87CisJCWVudHJ5LT5zaXplID0gZW11LT5hdWRpZ3kgPyBBX1RPVEFMX1NJWkVfQ09ERSA6IFRPVEFMX1NJWkVfQ09ERTsKKwkJZW50cnktPmMub3BzID0gJnNuZF9lbXUxMGsxX3Byb2Nfb3BzX2Z4ODAxMDsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiZng4MDEwX2Fjb2RlIiwgJmVudHJ5KSkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOworCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gZW11OworCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIC8qfCBTX0lXVVNSKi87CisJCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gMTI4KjEwMjQ7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9lbXUxMGsxX3Byb2NfYWNvZGVfcmVhZDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9pby5jIGIvc291bmQvcGNpL2VtdTEwazEvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQzYWUwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvaW8uYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzCisgKgorICogIEJVR1M6CisgKiAgICAtLQorICoKKyAqICBUT0RPOgorICogICAgLS0KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKwordW5zaWduZWQgaW50IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdTEwazFfdCAqIGVtdSwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGNobikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZWdwdHIsIHZhbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCW1hc2sgPSBlbXUtPmF1ZGlneSA/IEFfUFRSX0FERFJFU1NfTUFTSyA6IFBUUl9BRERSRVNTX01BU0s7CisJcmVncHRyID0gKChyZWcgPDwgMTYpICYgbWFzaykgfCAoY2huICYgUFRSX0NIQU5ORUxOVU1fTUFTSyk7CisKKwlpZiAocmVnICYgMHhmZjAwMDAwMCkgeworCQl1bnNpZ25lZCBjaGFyIHNpemUsIG9mZnNldDsKKwkJCisJCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7CisJCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKKwkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBQVFIpOworCQl2YWwgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJCisJCXJldHVybiAodmFsICYgbWFzaykgPj4gb2Zmc2V0OworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBQVFIpOworCQl2YWwgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CisKK3ZvaWQgc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgY2huLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVncHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwltYXNrID0gZW11LT5hdWRpZ3kgPyBBX1BUUl9BRERSRVNTX01BU0sgOiBQVFJfQUREUkVTU19NQVNLOworCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIG1hc2spIHwgKGNobiAmIFBUUl9DSEFOTkVMTlVNX01BU0spOworCisJaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKKwkJdW5zaWduZWQgY2hhciBzaXplLCBvZmZzZXQ7CisKKwkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKKwkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOworCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OworCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJb3V0bChyZWdwdHIsIGVtdS0+cG9ydCArIFBUUik7CisJCWRhdGEgfD0gaW5sKGVtdS0+cG9ydCArIERBVEEpICYgfm1hc2s7CisJCW91dGwoZGF0YSwgZW11LT5wb3J0ICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsJCQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyBQVFIpOworCQlvdXRsKGRhdGEsIGVtdS0+cG9ydCArIERBVEEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJfQorfQorCit1bnNpZ25lZCBpbnQgc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUxMGsxX3QgKiBlbXUsIAorCQkJCQkgIHVuc2lnbmVkIGludCByZWcsIAorCQkJCQkgIHVuc2lnbmVkIGludCBjaG4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmVncHRyLCB2YWw7CisgIAorCXJlZ3B0ciA9IChyZWcgPDwgMTYpIHwgY2huOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlvdXRsKHJlZ3B0ciwgZW11LT5wb3J0ICsgMHgyMCArIFBUUik7CisJdmFsID0gaW5sKGVtdS0+cG9ydCArIDB4MjAgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUxMGsxX3QgKmVtdSwgCisJCQkJICAgdW5zaWduZWQgaW50IHJlZywgCisJCQkJICAgdW5zaWduZWQgaW50IGNobiwgCisJCQkJICAgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IHJlZ3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVncHRyID0gKHJlZyA8PCAxNikgfCBjaG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGwocmVncHRyLCBlbXUtPnBvcnQgKyAweDIwICsgUFRSKTsKKwlvdXRsKGRhdGEsIGVtdS0+cG9ydCArIDB4MjAgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCBpbnRyZW5iKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGVuYWJsZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJZW5hYmxlID0gaW5sKGVtdS0+cG9ydCArIElOVEUpIHwgaW50cmVuYjsKKwlvdXRsKGVuYWJsZSwgZW11LT5wb3J0ICsgSU5URSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHNuZF9lbXUxMGsxX2ludHJfZGlzYWJsZShlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwllbmFibGUgPSBpbmwoZW11LT5wb3J0ICsgSU5URSkgJiB+aW50cmVuYjsKKwlvdXRsKGVuYWJsZSwgZW11LT5wb3J0ICsgSU5URSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHNuZF9lbXUxMGsxX3ZvaWNlX2ludHJfZW5hYmxlKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkvKiB2b2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpIHsKKwkJb3V0bChDTElFSCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgfD0gMSA8PCAodm9pY2VudW0gLSAzMik7CisJfSBlbHNlIHsKKwkJb3V0bChDTElFTCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgfD0gMSA8PCB2b2ljZW51bTsKKwl9CisJb3V0bCh2YWwsIGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzbmRfZW11MTBrMV92b2ljZV9pbnRyX2Rpc2FibGUoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCB2b2ljZW51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCS8qIHZvaWNlIGludGVycnVwdCAqLworCWlmICh2b2ljZW51bSA+PSAzMikgeworCQlvdXRsKENMSUVIIDw8IDE2LCBlbXUtPnBvcnQgKyBQVFIpOworCQl2YWwgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXZhbCAmPSB+KDEgPDwgKHZvaWNlbnVtIC0gMzIpKTsKKwl9IGVsc2UgeworCQlvdXRsKENMSUVMIDw8IDE2LCBlbXUtPnBvcnQgKyBQVFIpOworCQl2YWwgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXZhbCAmPSB+KDEgPDwgdm9pY2VudW0pOworCX0KKwlvdXRsKHZhbCwgZW11LT5wb3J0ICsgREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHNuZF9lbXUxMGsxX3ZvaWNlX2ludHJfYWNrKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJLyogdm9pY2UgaW50ZXJydXB0ICovCisJaWYgKHZvaWNlbnVtID49IDMyKSB7CisJCW91dGwoQ0xJUEggPDwgMTYsIGVtdS0+cG9ydCArIFBUUik7CisJCXZvaWNlbnVtID0gMSA8PCAodm9pY2VudW0gLSAzMik7CisJfSBlbHNlIHsKKwkJb3V0bChDTElQTCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdm9pY2VudW0gPSAxIDw8IHZvaWNlbnVtOworCX0KKwlvdXRsKHZvaWNlbnVtLCBlbXUtPnBvcnQgKyBEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc25kX2VtdTEwazFfdm9pY2VfaGFsZl9sb29wX2ludHJfZW5hYmxlKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkvKiB2b2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpIHsKKwkJb3V0bChITElFSCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgfD0gMSA8PCAodm9pY2VudW0gLSAzMik7CisJfSBlbHNlIHsKKwkJb3V0bChITElFTCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgfD0gMSA8PCB2b2ljZW51bTsKKwl9CisJb3V0bCh2YWwsIGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzbmRfZW11MTBrMV92b2ljZV9oYWxmX2xvb3BfaW50cl9kaXNhYmxlKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkvKiB2b2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpIHsKKwkJb3V0bChITElFSCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgJj0gfigxIDw8ICh2b2ljZW51bSAtIDMyKSk7CisJfSBlbHNlIHsKKwkJb3V0bChITElFTCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdmFsID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQl2YWwgJj0gfigxIDw8IHZvaWNlbnVtKTsKKwl9CisJb3V0bCh2YWwsIGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzbmRfZW11MTBrMV92b2ljZV9oYWxmX2xvb3BfaW50cl9hY2soZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCB2b2ljZW51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkvKiB2b2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpIHsKKwkJb3V0bChITElQSCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJdm9pY2VudW0gPSAxIDw8ICh2b2ljZW51bSAtIDMyKTsKKwl9IGVsc2UgeworCQlvdXRsKEhMSVBMIDw8IDE2LCBlbXUtPnBvcnQgKyBQVFIpOworCQl2b2ljZW51bSA9IDEgPDwgdm9pY2VudW07CisJfQorCW91dGwodm9pY2VudW0sIGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzbmRfZW11MTBrMV92b2ljZV9zZXRfbG9vcF9zdG9wKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc29sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkvKiB2b2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpIHsKKwkJb3V0bChTT0xFSCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJc29sID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQlzb2wgfD0gMSA8PCAodm9pY2VudW0gLSAzMik7CisJfSBlbHNlIHsKKwkJb3V0bChTT0xFTCA8PCAxNiwgZW11LT5wb3J0ICsgUFRSKTsKKwkJc29sID0gaW5sKGVtdS0+cG9ydCArIERBVEEpOworCQlzb2wgfD0gMSA8PCB2b2ljZW51bTsKKwl9CisJb3V0bChzb2wsIGVtdS0+cG9ydCArIERBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzbmRfZW11MTBrMV92b2ljZV9jbGVhcl9sb29wX3N0b3AoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCB2b2ljZW51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCS8qIHZvaWNlIGludGVycnVwdCAqLworCWlmICh2b2ljZW51bSA+PSAzMikgeworCQlvdXRsKFNPTEVIIDw8IDE2LCBlbXUtPnBvcnQgKyBQVFIpOworCQlzb2wgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXNvbCAmPSB+KDEgPDwgKHZvaWNlbnVtIC0gMzIpKTsKKwl9IGVsc2UgeworCQlvdXRsKFNPTEVMIDw8IDE2LCBlbXUtPnBvcnQgKyBQVFIpOworCQlzb2wgPSBpbmwoZW11LT5wb3J0ICsgREFUQSk7CisJCXNvbCAmPSB+KDEgPDwgdm9pY2VudW0pOworCX0KKwlvdXRsKHNvbCwgZW11LT5wb3J0ICsgREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHNuZF9lbXUxMGsxX3dhaXQoZW11MTBrMV90ICplbXUsIHVuc2lnbmVkIGludCB3YWl0KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNvdW50OworCXVuc2lnbmVkIGludCBuZXd0aW1lID0gMCwgY3VydGltZTsKKworCWN1cnRpbWUgPSBpbmwoZW11LT5wb3J0ICsgV0MpID4+IDY7CisJd2hpbGUgKHdhaXQtLSA+IDApIHsKKwkJY291bnQgPSAwOworCQl3aGlsZSAoY291bnQrKyA8IDE2Mzg0KSB7CisJCQluZXd0aW1lID0gaW5sKGVtdS0+cG9ydCArIFdDKSA+PiA2OworCQkJaWYgKG5ld3RpbWUgIT0gY3VydGltZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoY291bnQgPj0gMTYzODQpCisJCQlicmVhazsKKwkJY3VydGltZSA9IG5ld3RpbWU7CisJfQorfQorCit1bnNpZ25lZCBzaG9ydCBzbmRfZW11MTBrMV9hYzk3X3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJZW11MTBrMV90ICplbXUgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBlbXUtPnBvcnQgKyBBQzk3QUREUkVTUyk7CisJdmFsID0gaW53KGVtdS0+cG9ydCArIEFDOTdEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBzbmRfZW11MTBrMV9hYzk3X3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCBkYXRhKQoreworCWVtdTEwazFfdCAqZW11ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBlbXUtPnBvcnQgKyBBQzk3QUREUkVTUyk7CisJb3V0dyhkYXRhLCBlbXUtPnBvcnQgKyBBQzk3REFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogIGNvbnZlcnQgcmF0ZSB0byBwaXRjaAorICovCisKK3Vuc2lnbmVkIGludCBzbmRfZW11MTBrMV9yYXRlX3RvX3BpdGNoKHVuc2lnbmVkIGludCByYXRlKQoreworCXN0YXRpYyB1MzIgbG9nTWFnVGFibGVbMTI4XSA9IHsKKwkJMHgwMDAwMCwgMHgwMmRmYywgMHgwNWI5ZSwgMHgwODhlNiwgMHgwYjVkNiwgMHgwZTI2ZiwgMHgxMGViMywgMHgxM2FhMiwKKwkJMHgxNjYzZiwgMHgxOTE4YSwgMHgxYmM4NCwgMHgxZTcyZSwgMHgyMTE4YiwgMHgyM2I5YSwgMHgyNjU1ZCwgMHgyOGVkNSwKKwkJMHgyYjgwMywgMHgyZTBlOCwgMHgzMDk4NSwgMHgzMzFkYiwgMHgzNTllYiwgMHgzODFiNiwgMHgzYTkzZCwgMHgzZDA4MSwKKwkJMHgzZjc4MiwgMHg0MWU0MiwgMHg0NDRjMSwgMHg0NmIwMSwgMHg0OTEwMSwgMHg0YjZjNCwgMHg0ZGM0OSwgMHg1MDE5MSwKKwkJMHg1MjY5ZSwgMHg1NGI2ZiwgMHg1NzAwNiwgMHg1OTQ2MywgMHg1Yjg4OCwgMHg1ZGM3NCwgMHg2MDAyOSwgMHg2MjNhNywKKwkJMHg2NDZlZSwgMHg2NmEwMCwgMHg2OGNkZCwgMHg2YWY4NiwgMHg2ZDFmYSwgMHg2ZjQzYywgMHg3MTY0YiwgMHg3MzgyOSwKKwkJMHg3NTlkNCwgMHg3N2I0ZiwgMHg3OWM5YSwgMHg3YmRiNSwgMHg3ZGVhMSwgMHg3ZmY1ZSwgMHg4MWZlZCwgMHg4NDA0ZSwKKwkJMHg4NjA4MiwgMHg4ODA4OSwgMHg4YTA2NCwgMHg4YzAxNCwgMHg4ZGY5OCwgMHg4ZmVmMSwgMHg5MWUyMCwgMHg5M2QyNiwKKwkJMHg5NWMwMSwgMHg5N2FiNCwgMHg5OTkzZSwgMHg5Yjc5ZiwgMHg5ZDVkOSwgMHg5ZjNlYywgMHhhMTFkOCwgMHhhMmY5ZCwKKwkJMHhhNGQzYywgMHhhNmFiNSwgMHhhODgwOCwgMHhhYTUzNywgMHhhYzI0MSwgMHhhZGYyNiwgMHhhZmJlNywgMHhiMTg4NSwKKwkJMHhiMzUwMCwgMHhiNTE1NywgMHhiNmQ4YywgMHhiODk5ZiwgMHhiYTU4ZiwgMHhiYzE1ZSwgMHhiZGQwYywgMHhiZjg5OSwKKwkJMHhjMTQwNCwgMHhjMmY1MCwgMHhjNGE3YiwgMHhjNjU4NywgMHhjODA3MywgMHhjOWIzZiwgMHhjYjVlZCwgMHhjZDA3YywKKwkJMHhjZWFlYywgMHhkMDUzZiwgMHhkMWY3MywgMHhkMzk4YSwgMHhkNTM4NCwgMHhkNmQ2MCwgMHhkODcyMCwgMHhkYTBjMywKKwkJMHhkYmE0YSwgMHhkZDNiNCwgMHhkZWQwMywgMHhlMDYzNiwgMHhlMWY0ZSwgMHhlMzg0YSwgMHhlNTEyYywgMHhlNjlmMywKKwkJMHhlODI5ZiwgMHhlOWIzMSwgMHhlYjNhOSwgMHhlY2MwOCwgMHhlZTQ0YywgMHhlZmM3OCwgMHhmMTQ4YSwgMHhmMmM4MywKKwkJMHhmNDQ2MywgMHhmNWMyYSwgMHhmNzNkYSwgMHhmOGI3MSwgMHhmYTJmMCwgMHhmYmE1NywgMHhmZDFhNywgMHhmZThkZgorCX07CisJc3RhdGljIGNoYXIgbG9nU2xvcGVUYWJsZVsxMjhdID0geworCQkweDVjLCAweDVjLCAweDViLCAweDVhLCAweDVhLCAweDU5LCAweDU4LCAweDU4LAorCQkweDU3LCAweDU2LCAweDU2LCAweDU1LCAweDU1LCAweDU0LCAweDUzLCAweDUzLAorCQkweDUyLCAweDUyLCAweDUxLCAweDUxLCAweDUwLCAweDUwLCAweDRmLCAweDRmLAorCQkweDRlLCAweDRkLCAweDRkLCAweDRkLCAweDRjLCAweDRjLCAweDRiLCAweDRiLAorCQkweDRhLCAweDRhLCAweDQ5LCAweDQ5LCAweDQ4LCAweDQ4LCAweDQ3LCAweDQ3LAorCQkweDQ3LCAweDQ2LCAweDQ2LCAweDQ1LCAweDQ1LCAweDQ1LCAweDQ0LCAweDQ0LAorCQkweDQzLCAweDQzLCAweDQzLCAweDQyLCAweDQyLCAweDQyLCAweDQxLCAweDQxLAorCQkweDQxLCAweDQwLCAweDQwLCAweDQwLCAweDNmLCAweDNmLCAweDNmLCAweDNlLAorCQkweDNlLCAweDNlLCAweDNkLCAweDNkLCAweDNkLCAweDNjLCAweDNjLCAweDNjLAorCQkweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNhLCAweDNhLCAweDNhLCAweDM5LAorCQkweDM5LCAweDM5LCAweDM5LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM3LAorCQkweDM3LCAweDM3LCAweDM3LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM1LAorCQkweDM1LCAweDM1LCAweDM1LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LAorCQkweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDMyLCAweDMyLCAweDMyLCAweDMyLAorCQkweDMyLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMwLCAweDMwLAorCQkweDMwLCAweDMwLCAweDMwLCAweDJmLCAweDJmLCAweDJmLCAweDJmLCAweDJmCisJfTsKKwlpbnQgaTsKKworCWlmIChyYXRlID09IDApCisJCXJldHVybiAwOwkvKiBCYWlsIG91dCBpZiBubyBsZWFkaW5nICIxIiAqLworCXJhdGUgKj0gMTExODU7CQkvKiBTY2FsZSA0ODAwMCB0byAweDIwMDAyMzgwICovCisJZm9yIChpID0gMzE7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKHJhdGUgJiAweDgwMDAwMDAwKSB7CS8qIERldGVjdCBsZWFkaW5nICIxIiAqLworCQkJcmV0dXJuICgoKHVuc2lnbmVkIGludCkgKGkgLSAxNSkgPDwgMjApICsKKwkJCSAgICAgICBsb2dNYWdUYWJsZVsweDdmICYgKHJhdGUgPj4gMjQpXSArCisJCQkJCSgweDdmICYgKHJhdGUgPj4gMTcpKSAqCisJCQkJCWxvZ1Nsb3BlVGFibGVbMHg3ZiAmIChyYXRlID4+IDI0KV0pOworCQl9CisJCXJhdGUgPDw9IDE7CisJfQorCisJcmV0dXJuIDA7CQkvKiBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCAqLworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWE3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pcnEuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBSb3V0aW5lcyBmb3IgSVJRIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcworICoKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisKK2lycXJldHVybl90IHNuZF9lbXUxMGsxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWVtdTEwazFfdCAqZW11ID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIHN0YXR1czIsIG9yaWdfc3RhdHVzLCBvcmlnX3N0YXR1czI7CisJaW50IGhhbmRsZWQgPSAwOworCisJd2hpbGUgKChzdGF0dXMgPSBpbmwoZW11LT5wb3J0ICsgSVBSKSkgIT0gMCkgeworCQkvLyBwcmludGsoImlycSAtIHN0YXR1cyA9IDB4JXhcbiIsIHN0YXR1cyk7CisJCW9yaWdfc3RhdHVzID0gc3RhdHVzOworCQloYW5kbGVkID0gMTsKKwkJaWYgKHN0YXR1cyAmIElQUl9QQ0lFUlJPUikgeworCQkJc25kX3ByaW50aygiaW50ZXJydXB0OiBQQ0kgZXJyb3JcbiIpOworCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9QQ0lFUlJPUkVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfklQUl9QQ0lFUlJPUjsKKwkJfQorCQlpZiAoc3RhdHVzICYgKElQUl9WT0xJTkNSfElQUl9WT0xERUNSfElQUl9NVVRFKSkgeworCQkJaWYgKGVtdS0+aHd2b2xfaW50ZXJydXB0KQorCQkJCWVtdS0+aHd2b2xfaW50ZXJydXB0KGVtdSwgc3RhdHVzKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX1ZPTElOQ1JFTkFCTEV8SU5URV9WT0xERUNSRU5BQkxFfElOVEVfTVVURUVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfihJUFJfVk9MSU5DUnxJUFJfVk9MREVDUnxJUFJfTVVURSk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIElQUl9DSEFOTkVMTE9PUCkgeworCQkJaW50IHZvaWNlOworCQkJaW50IHZvaWNlX21heCA9IHN0YXR1cyAmIElQUl9DSEFOTkVMTlVNQkVSTUFTSzsKKwkJCXUzMiB2YWw7CisJCQllbXUxMGsxX3ZvaWNlX3QgKnB2b2ljZSA9IGVtdS0+dm9pY2VzOworCisJCQl2YWwgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIENMSVBMLCAwKTsKKwkJCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8PSB2b2ljZV9tYXg7IHZvaWNlKyspIHsKKwkJCQlpZiAodm9pY2UgPT0gMHgyMCkKKwkJCQkJdmFsID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBDTElQSCwgMCk7CisJCQkJaWYgKHZhbCAmIDEpIHsKKwkJCQkJaWYgKHB2b2ljZS0+dXNlICYmIHB2b2ljZS0+aW50ZXJydXB0ICE9IE5VTEwpIHsKKwkJCQkJCXB2b2ljZS0+aW50ZXJydXB0KGVtdSwgcHZvaWNlKTsKKwkJCQkJCXNuZF9lbXUxMGsxX3ZvaWNlX2ludHJfYWNrKGVtdSwgdm9pY2UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc25kX2VtdTEwazFfdm9pY2VfaW50cl9kaXNhYmxlKGVtdSwgdm9pY2UpOworCQkJCQl9CisJCQkJfQorCQkJCXZhbCA+Pj0gMTsKKwkJCQlwdm9pY2UrKzsKKwkJCX0KKwkJCXZhbCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgSExJUEwsIDApOworCQkJZm9yICh2b2ljZSA9IDA7IHZvaWNlIDw9IHZvaWNlX21heDsgdm9pY2UrKykgeworCQkJCWlmICh2b2ljZSA9PSAweDIwKQorCQkJCQl2YWwgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEhMSVBILCAwKTsKKwkJCQlpZiAodmFsICYgMSkgeworCQkJCQlpZiAocHZvaWNlLT51c2UgJiYgcHZvaWNlLT5pbnRlcnJ1cHQgIT0gTlVMTCkgeworCQkJCQkJcHZvaWNlLT5pbnRlcnJ1cHQoZW11LCBwdm9pY2UpOworCQkJCQkJc25kX2VtdTEwazFfdm9pY2VfaGFsZl9sb29wX2ludHJfYWNrKGVtdSwgdm9pY2UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc25kX2VtdTEwazFfdm9pY2VfaGFsZl9sb29wX2ludHJfZGlzYWJsZShlbXUsIHZvaWNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl2YWwgPj49IDE7CisJCQkJcHZvaWNlKys7CisJCQl9CisJCQlzdGF0dXMgJj0gfklQUl9DSEFOTkVMTE9PUDsKKwkJfQorCQlzdGF0dXMgJj0gfklQUl9DSEFOTkVMTlVNQkVSTUFTSzsKKwkJaWYgKHN0YXR1cyAmIChJUFJfQURDQlVGRlVMTHxJUFJfQURDQlVGSEFMRkZVTEwpKSB7CisJCQlpZiAoZW11LT5jYXB0dXJlX2ludGVycnVwdCkKKwkJCQllbXUtPmNhcHR1cmVfaW50ZXJydXB0KGVtdSwgc3RhdHVzKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX0FEQ0JVRkVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfihJUFJfQURDQlVGRlVMTHxJUFJfQURDQlVGSEFMRkZVTEwpOworCQl9CisJCWlmIChzdGF0dXMgJiAoSVBSX01JQ0JVRkZVTEx8SVBSX01JQ0JVRkhBTEZGVUxMKSkgeworCQkJaWYgKGVtdS0+Y2FwdHVyZV9taWNfaW50ZXJydXB0KQorCQkJCWVtdS0+Y2FwdHVyZV9taWNfaW50ZXJydXB0KGVtdSwgc3RhdHVzKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX01JQ0JVRkVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfihJUFJfTUlDQlVGRlVMTHxJUFJfTUlDQlVGSEFMRkZVTEwpOworCQl9CisJCWlmIChzdGF0dXMgJiAoSVBSX0VGWEJVRkZVTEx8SVBSX0VGWEJVRkhBTEZGVUxMKSkgeworCQkJaWYgKGVtdS0+Y2FwdHVyZV9lZnhfaW50ZXJydXB0KQorCQkJCWVtdS0+Y2FwdHVyZV9lZnhfaW50ZXJydXB0KGVtdSwgc3RhdHVzKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX0VGWEJVRkVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfihJUFJfRUZYQlVGRlVMTHxJUFJfRUZYQlVGSEFMRkZVTEwpOworCQl9CisJCWlmIChzdGF0dXMgJiAoSVBSX01JRElUUkFOU0JVRkVNUFRZfElQUl9NSURJUkVDVkJVRkVNUFRZKSkgeworCQkJaWYgKGVtdS0+bWlkaS5pbnRlcnJ1cHQpCisJCQkJZW11LT5taWRpLmludGVycnVwdChlbXUsIHN0YXR1cyk7CisJCQllbHNlCisJCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9NSURJVFhFTkFCTEV8SU5URV9NSURJUlhFTkFCTEUpOworCQkJc3RhdHVzICY9IH4oSVBSX01JRElUUkFOU0JVRkVNUFRZfElQUl9NSURJUkVDVkJVRkVNUFRZKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgKElQUl9BX01JRElUUkFOU0JVRkVNUFRZMnxJUFJfQV9NSURJUkVDVkJVRkVNUFRZMikpIHsKKwkJCWlmIChlbXUtPm1pZGkyLmludGVycnVwdCkKKwkJCQllbXUtPm1pZGkyLmludGVycnVwdChlbXUsIHN0YXR1cyk7CisJCQllbHNlCisJCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9BX01JRElUWEVOQUJMRTJ8SU5URV9BX01JRElSWEVOQUJMRTIpOworCQkJc3RhdHVzICY9IH4oSVBSX0FfTUlESVRSQU5TQlVGRU1QVFkyfElQUl9BX01JRElSRUNWQlVGRU1QVFkyKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgSVBSX0lOVEVSVkFMVElNRVIpIHsKKwkJCWlmIChlbXUtPnRpbWVyKQorCQkJCXNuZF90aW1lcl9pbnRlcnJ1cHQoZW11LT50aW1lciwgZW11LT50aW1lci0+c3RpY2tzKTsKKwkJCWVsc2UKKwkJCQlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOworCQkJc3RhdHVzICY9IH5JUFJfSU5URVJWQUxUSU1FUjsKKwkJfQorCQlpZiAoc3RhdHVzICYgKElQUl9HUFNQRElGU1RBVFVTQ0hBTkdFfElQUl9DRFJPTVNUQVRVU0NIQU5HRSkpIHsKKwkJCWlmIChlbXUtPnNwZGlmX2ludGVycnVwdCkKKwkJCQllbXUtPnNwZGlmX2ludGVycnVwdChlbXUsIHN0YXR1cyk7CisJCQllbHNlCisJCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9HUFNQRElGRU5BQkxFfElOVEVfQ0RTUERJRkVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfihJUFJfR1BTUERJRlNUQVRVU0NIQU5HRXxJUFJfQ0RST01TVEFUVVNDSEFOR0UpOworCQl9CisJCWlmIChzdGF0dXMgJiBJUFJfRlhEU1ApIHsKKwkJCWlmIChlbXUtPmRzcF9pbnRlcnJ1cHQpCisJCQkJZW11LT5kc3BfaW50ZXJydXB0KGVtdSk7CisJCQllbHNlCisJCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9GWERTUEVOQUJMRSk7CisJCQlzdGF0dXMgJj0gfklQUl9GWERTUDsKKwkJfQorCQlpZiAoc3RhdHVzKSB7CisJCQl1bnNpZ25lZCBpbnQgYml0czsKKwkJCS8vc25kX3ByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5oYW5kbGVkIGludGVycnVwdDogMHglMDh4XG4iLCBzdGF0dXMpOworCQkJLy9tYWtlIHN1cmUgYW55IGludGVycnVwdHMgd2UgZG9uJ3QgaGFuZGxlIGFyZSBkaXNhYmxlZDoKKwkJCWJpdHMgPSBJTlRFX0ZYRFNQRU5BQkxFIHwKKwkJCQlJTlRFX1BDSUVSUk9SRU5BQkxFIHwKKwkJCQlJTlRFX1ZPTElOQ1JFTkFCTEUgfAorCQkJCUlOVEVfVk9MREVDUkVOQUJMRSB8CisJCQkJSU5URV9NVVRFRU5BQkxFIHwKKwkJCQlJTlRFX01JQ0JVRkVOQUJMRSB8CisJCQkJSU5URV9BRENCVUZFTkFCTEUgfAorCQkJCUlOVEVfRUZYQlVGRU5BQkxFIHwKKwkJCQlJTlRFX0dQU1BESUZFTkFCTEUgfAorCQkJCUlOVEVfQ0RTUERJRkVOQUJMRSB8CisJCQkJSU5URV9JTlRFUlZBTFRJTUVSRU5CIHwKKwkJCQlJTlRFX01JRElUWEVOQUJMRSB8CisJCQkJSU5URV9NSURJUlhFTkFCTEU7CisJCQlpZiAoZW11LT5hdWRpZ3kpCisJCQkJYml0cyB8PSBJTlRFX0FfTUlESVRYRU5BQkxFMiB8IElOVEVfQV9NSURJUlhFTkFCTEUyOworCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgYml0cyk7CisJCX0KKwkJb3V0bChvcmlnX3N0YXR1cywgZW11LT5wb3J0ICsgSVBSKTsgLyogYWNrIGFsbCAqLworCX0KKwlpZiAoZW11LT5hdWRpZ3kgJiYgZW11LT5yZXZpc2lvbiA9PSA0KSB7IC8qIFAxNlYgKi8JCisJCXdoaWxlICgoc3RhdHVzMiA9IGlubChlbXUtPnBvcnQgKyBJUFIyKSkgIT0gMCkgeworCQkJdTMyIG1hc2sgPSBJTlRFMl9QTEFZQkFDS19DSF8wX0xPT1A7ICAvKiBGdWxsIExvb3AgKi8KKwkJCWVtdTEwazFfdm9pY2VfdCAqcHZvaWNlID0gJihlbXUtPnAxNnZfdm9pY2VzWzBdKTsKKwkJCW9yaWdfc3RhdHVzMiA9IHN0YXR1czI7CisJCQlpZihzdGF0dXMyICYgbWFzaykgeworCQkJCWlmKHB2b2ljZS0+dXNlKSB7CisJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHZvaWNlLT5lcGNtLT5zdWJzdHJlYW0pOworCQkJCX0gZWxzZSB7IAorCQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwMTZ2OiBzdGF0dXM6IDB4JTA4eCwgbWFzaz0weCUwOHgsIHB2b2ljZT0lcCwgdXNlPSVkXG4iLCBzdGF0dXMyLCBtYXNrLCBwdm9pY2UsIHB2b2ljZS0+dXNlKTsKKwkJCQl9CisJCQl9CisJCQlvdXRsKG9yaWdfc3RhdHVzMiwgZW11LT5wb3J0ICsgSVBSMik7IC8qIGFjayBhbGwgKi8KKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1OTVmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jCkBAIC0wLDAgKzEsNTY0IEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgYnkgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBFTVUxMEsxIG1lbW9yeSBwYWdlIGFsbG9jYXRpb24gKFBUQiBhcmVhKQorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKworLyogcGFnZSBhcmd1bWVudHMgb2YgdGhlc2UgdHdvIG1hY3JvcyBhcmUgRW11IHBhZ2UgKDQwOTYgYnl0ZXMpLCBub3QgbGlrZQorICogYWxpZ25lZCBwYWdlcyBpbiBvdGhlcnMKKyAqLworI2RlZmluZSBfX3NldF9wdGJfZW50cnkoZW11LHBhZ2UsYWRkcikgXAorCSgoKHUzMiAqKShlbXUpLT5wdGJfcGFnZXMuYXJlYSlbcGFnZV0gPSBjcHVfdG9fbGUzMigoKGFkZHIpIDw8IDEpIHwgKHBhZ2UpKSkKKworI2RlZmluZSBVTklUX1BBR0VTCQkoUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkUpCisjZGVmaW5lIE1BWF9BTElHTl9QQUdFUwkJKE1BWFBBR0VTIC8gVU5JVF9QQUdFUykKKy8qIGdldCBhbGlnbmVkIHBhZ2UgZnJvbSBvZmZzZXQgYWRkcmVzcyAqLworI2RlZmluZSBnZXRfYWxpZ25lZF9wYWdlKG9mZnNldCkJKChvZmZzZXQpID4+IFBBR0VfU0hJRlQpCisvKiBnZXQgb2Zmc2V0IGFkZHJlc3MgZnJvbSBhbGlnbmVkIHBhZ2UgKi8KKyNkZWZpbmUgYWxpZ25lZF9wYWdlX29mZnNldChwYWdlKQkoKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCisKKyNpZiBQQUdFX1NJWkUgPT0gNDA5NgorLyogcGFnZSBzaXplID09IEVNVVBBR0VTSVpFICovCisvKiBmaWxsIFBUQiBlbnRyaWUocykgY29ycmVzcG9uZGluZyB0byBwYWdlIHdpdGggYWRkciAqLworI2RlZmluZSBzZXRfcHRiX2VudHJ5KGVtdSxwYWdlLGFkZHIpCV9fc2V0X3B0Yl9lbnRyeShlbXUscGFnZSxhZGRyKQorLyogZmlsbCBQVEIgZW50cmllKHMpIGNvcnJlc3BvbmRpbmcgdG8gcGFnZSB3aXRoIHNpbGVuY2UgcG9pbnRlciAqLworI2RlZmluZSBzZXRfc2lsZW50X3B0YihlbXUscGFnZSkJX19zZXRfcHRiX2VudHJ5KGVtdSxwYWdlLGVtdS0+c2lsZW50X3BhZ2UuYWRkcikKKyNlbHNlCisvKiBmaWxsIFBUQiBlbnRyaWVzIC0tIHdlIG5lZWQgdG8gZmlsbCBVTklUX1BBR0VTIGVudHJpZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRiX2VudHJ5KGVtdTEwazFfdCAqZW11LCBpbnQgcGFnZSwgZG1hX2FkZHJfdCBhZGRyKQoreworCWludCBpOworCXBhZ2UgKj0gVU5JVF9QQUdFUzsKKwlmb3IgKGkgPSAwOyBpIDwgVU5JVF9QQUdFUzsgaSsrLCBwYWdlKyspIHsKKwkJX19zZXRfcHRiX2VudHJ5KGVtdSwgcGFnZSwgYWRkcik7CisJCWFkZHIgKz0gRU1VUEFHRVNJWkU7CisJfQorfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9zaWxlbnRfcHRiKGVtdTEwazFfdCAqZW11LCBpbnQgcGFnZSkKK3sKKwlpbnQgaTsKKwlwYWdlICo9IFVOSVRfUEFHRVM7CisJZm9yIChpID0gMDsgaSA8IFVOSVRfUEFHRVM7IGkrKywgcGFnZSsrKQorCQkvKiBkbyBub3QgaW5jcmVtZW50IHB0ciAqLworCQlfX3NldF9wdGJfZW50cnkoZW11LCBwYWdlLCBlbXUtPnNpbGVudF9wYWdlLmFkZHIpOworfQorI2VuZGlmIC8qIFBBR0VfU0laRSAqLworCisKKy8qCisgKi8KK3N0YXRpYyBpbnQgc3ludGhfYWxsb2NfcGFnZXMoZW11MTBrMV90ICpodywgZW11MTBrMV9tZW1ibGtfdCAqYmxrKTsKK3N0YXRpYyBpbnQgc3ludGhfZnJlZV9wYWdlcyhlbXUxMGsxX3QgKmh3LCBlbXUxMGsxX21lbWJsa190ICpibGspOworCisjZGVmaW5lIGdldF9lbXUxMGsxX21lbWJsayhsLG1lbWJlcikJbGlzdF9lbnRyeShsLCBlbXUxMGsxX21lbWJsa190LCBtZW1iZXIpCisKKworLyogaW5pdGlhbGl6ZSBlbXUxMGsxIHBhcnQgKi8KK3N0YXRpYyB2b2lkIGVtdTEwazFfbWVtYmxrX2luaXQoZW11MTBrMV9tZW1ibGtfdCAqYmxrKQoreworCWJsay0+bWFwcGVkX3BhZ2UgPSAtMTsKKwlJTklUX0xJU1RfSEVBRCgmYmxrLT5tYXBwZWRfbGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmJsay0+bWFwcGVkX29yZGVyX2xpbmspOworCWJsay0+bWFwX2xvY2tlZCA9IDA7CisKKwlibGstPmZpcnN0X3BhZ2UgPSBnZXRfYWxpZ25lZF9wYWdlKGJsay0+bWVtLm9mZnNldCk7CisJYmxrLT5sYXN0X3BhZ2UgPSBnZXRfYWxpZ25lZF9wYWdlKGJsay0+bWVtLm9mZnNldCArIGJsay0+bWVtLnNpemUgLSAxKTsKKwlibGstPnBhZ2VzID0gYmxrLT5sYXN0X3BhZ2UgLSBibGstPmZpcnN0X3BhZ2UgKyAxOworfQorCisvKgorICogc2VhcmNoIGVtcHR5IHJlZ2lvbiBvbiBQVEIgd2l0aCB0aGUgZ2l2ZW4gc2l6ZQorICoKKyAqIGlmIGFuIGVtcHR5IHJlZ2lvbiBpcyBmb3VuZCwgcmV0dXJuIHRoZSBwYWdlIGFuZCBzdG9yZSB0aGUgbmV4dCBtYXBwZWQgYmxvY2sKKyAqIGluIG5leHRwCisgKiBpZiBub3QgZm91bmQsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX2VtcHR5X21hcF9hcmVhKGVtdTEwazFfdCAqZW11LCBpbnQgbnBhZ2VzLCBzdHJ1Y3QgbGlzdF9oZWFkICoqbmV4dHApCit7CisJaW50IHBhZ2UgPSAwLCBmb3VuZF9wYWdlID0gLUVOT01FTTsKKwlpbnQgbWF4X3NpemUgPSBucGFnZXM7CisJaW50IHNpemU7CisJc3RydWN0IGxpc3RfaGVhZCAqY2FuZGlkYXRlID0gJmVtdS0+bWFwcGVkX2xpbmtfaGVhZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoIChwb3MsICZlbXUtPm1hcHBlZF9saW5rX2hlYWQpIHsKKwkJZW11MTBrMV9tZW1ibGtfdCAqYmxrID0gZ2V0X2VtdTEwazFfbWVtYmxrKHBvcywgbWFwcGVkX2xpbmspOworCQlzbmRfYXNzZXJ0KGJsay0+bWFwcGVkX3BhZ2UgPj0gMCwgY29udGludWUpOworCQlzaXplID0gYmxrLT5tYXBwZWRfcGFnZSAtIHBhZ2U7CisJCWlmIChzaXplID09IG5wYWdlcykgeworCQkJKm5leHRwID0gcG9zOworCQkJcmV0dXJuIHBhZ2U7CisJCX0KKwkJZWxzZSBpZiAoc2l6ZSA+IG1heF9zaXplKSB7CisJCQkvKiB3ZSBsb29rIGZvciB0aGUgbWF4aW11bSBlbXB0eSBob2xlICovCisJCQltYXhfc2l6ZSA9IHNpemU7CisJCQljYW5kaWRhdGUgPSBwb3M7CisJCQlmb3VuZF9wYWdlID0gcGFnZTsKKwkJfQorCQlwYWdlID0gYmxrLT5tYXBwZWRfcGFnZSArIGJsay0+cGFnZXM7CisJfQorCXNpemUgPSBNQVhfQUxJR05fUEFHRVMgLSBwYWdlOworCWlmIChzaXplID49IG1heF9zaXplKSB7CisJCSpuZXh0cCA9IHBvczsKKwkJcmV0dXJuIHBhZ2U7CisJfQorCSpuZXh0cCA9IGNhbmRpZGF0ZTsKKwlyZXR1cm4gZm91bmRfcGFnZTsKK30KKworLyoKKyAqIG1hcCBhIG1lbW9yeSBibG9jayBvbnRvIGVtdTEwazEncyBQVEIKKyAqCisgKiBjYWxsIHdpdGggbWVtYmxrX2xvY2sgaGVsZAorICovCitzdGF0aWMgaW50IG1hcF9tZW1ibGsoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWVtYmxrX3QgKmJsaykKK3sKKwlpbnQgcGFnZSwgcGc7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKworCXBhZ2UgPSBzZWFyY2hfZW1wdHlfbWFwX2FyZWEoZW11LCBibGstPnBhZ2VzLCAmbmV4dCk7CisJaWYgKHBhZ2UgPCAwKSAvKiBub3QgZm91bmQgKi8KKwkJcmV0dXJuIHBhZ2U7CisJLyogaW5zZXJ0IHRoaXMgYmxvY2sgaW4gdGhlIHByb3BlciBwb3NpdGlvbiBvZiBtYXBwZWQgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJmJsay0+bWFwcGVkX2xpbmssIG5leHQpOworCS8qIGFwcGVuZCB0aGlzIGFzIGEgbmV3ZXN0IGJsb2NrIGluIG9yZGVyIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZibGstPm1hcHBlZF9vcmRlcl9saW5rLCAmZW11LT5tYXBwZWRfb3JkZXJfbGlua19oZWFkKTsKKwlibGstPm1hcHBlZF9wYWdlID0gcGFnZTsKKwkvKiBmaWxsIFBUQiAqLworCWZvciAocGcgPSBibGstPmZpcnN0X3BhZ2U7IHBnIDw9IGJsay0+bGFzdF9wYWdlOyBwZysrKSB7CisJCXNldF9wdGJfZW50cnkoZW11LCBwYWdlLCBlbXUtPnBhZ2VfYWRkcl90YWJsZVtwZ10pOworCQlwYWdlKys7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogdW5tYXAgdGhlIGJsb2NrCisgKiByZXR1cm4gdGhlIHNpemUgb2YgcmVzdWx0YW50IGVtcHR5IHBhZ2VzCisgKgorICogY2FsbCB3aXRoIG1lbWJsa19sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCB1bm1hcF9tZW1ibGsoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWVtYmxrX3QgKmJsaykKK3sKKwlpbnQgc3RhcnRfcGFnZSwgZW5kX3BhZ2UsIG1wYWdlLCBwZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWVtdTEwazFfbWVtYmxrX3QgKnE7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGV4cGVjdGVkIHNpemUgb2YgZW1wdHkgcmVnaW9uICovCisJaWYgKChwID0gYmxrLT5tYXBwZWRfbGluay5wcmV2KSAhPSAmZW11LT5tYXBwZWRfbGlua19oZWFkKSB7CisJCXEgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWFwcGVkX2xpbmspOworCQlzdGFydF9wYWdlID0gcS0+bWFwcGVkX3BhZ2UgKyBxLT5wYWdlczsKKwl9IGVsc2UKKwkJc3RhcnRfcGFnZSA9IDA7CisJaWYgKChwID0gYmxrLT5tYXBwZWRfbGluay5uZXh0KSAhPSAmZW11LT5tYXBwZWRfbGlua19oZWFkKSB7CisJCXEgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWFwcGVkX2xpbmspOworCQllbmRfcGFnZSA9IHEtPm1hcHBlZF9wYWdlOworCX0gZWxzZQorCQllbmRfcGFnZSA9IE1BWF9BTElHTl9QQUdFUzsKKworCS8qIHJlbW92ZSBsaW5rcyAqLworCWxpc3RfZGVsKCZibGstPm1hcHBlZF9saW5rKTsKKwlsaXN0X2RlbCgmYmxrLT5tYXBwZWRfb3JkZXJfbGluayk7CisJLyogY2xlYXIgUFRCICovCisJbXBhZ2UgPSBibGstPm1hcHBlZF9wYWdlOworCWZvciAocGcgPSBibGstPmZpcnN0X3BhZ2U7IHBnIDw9IGJsay0+bGFzdF9wYWdlOyBwZysrKSB7CisJCXNldF9zaWxlbnRfcHRiKGVtdSwgbXBhZ2UpOworCQltcGFnZSsrOworCX0KKwlibGstPm1hcHBlZF9wYWdlID0gLTE7CisJcmV0dXJuIGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsgLyogcmV0dXJuIHRoZSBuZXcgZW1wdHkgc2l6ZSAqLworfQorCisvKgorICogc2VhcmNoIGVtcHR5IHBhZ2VzIHdpdGggdGhlIGdpdmVuIHNpemUsIGFuZCBjcmVhdGUgYSBtZW1vcnkgYmxvY2sKKyAqCisgKiB1bmxpa2Ugc3ludGhfYWxsb2MgdGhlIG1lbW9yeSBibG9jayBpcyBhbGlnbmVkIHRvIHRoZSBwYWdlIHN0YXJ0CisgKi8KK3N0YXRpYyBlbXUxMGsxX21lbWJsa190ICoKK3NlYXJjaF9lbXB0eShlbXUxMGsxX3QgKmVtdSwgaW50IHNpemUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwllbXUxMGsxX21lbWJsa190ICpibGs7CisJaW50IHBhZ2UsIHBzaXplOworCisJcHNpemUgPSBnZXRfYWxpZ25lZF9wYWdlKHNpemUgKyBQQUdFX1NJWkUgLTEpOworCXBhZ2UgPSAwOworCWxpc3RfZm9yX2VhY2gocCwgJmVtdS0+bWVtaGRyLT5ibG9jaykgeworCQlibGsgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWVtLmxpc3QpOworCQlpZiAocGFnZSArIHBzaXplIDw9IGJsay0+Zmlyc3RfcGFnZSkKKwkJCWdvdG8gX19mb3VuZF9wYWdlczsKKwkJcGFnZSA9IGJsay0+bGFzdF9wYWdlICsgMTsKKwl9CisJaWYgKHBhZ2UgKyBwc2l6ZSA+IGVtdS0+bWF4X2NhY2hlX3BhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKworX19mb3VuZF9wYWdlczoKKwkvKiBjcmVhdGUgYSBuZXcgbWVtb3J5IGJsb2NrICovCisJYmxrID0gKGVtdTEwazFfbWVtYmxrX3QgKilfX3NuZF91dGlsX21lbWJsa19uZXcoZW11LT5tZW1oZHIsIHBzaXplIDw8IFBBR0VfU0hJRlQsIHAtPnByZXYpOworCWlmIChibGsgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYmxrLT5tZW0ub2Zmc2V0ID0gYWxpZ25lZF9wYWdlX29mZnNldChwYWdlKTsgLyogc2V0IGFsaWduZWQgb2Zmc2V0ICovCisJZW11MTBrMV9tZW1ibGtfaW5pdChibGspOworCXJldHVybiBibGs7Cit9CisKKworLyoKKyAqIGNoZWNrIGlmIHRoZSBnaXZlbiBwb2ludGVyIGlzIHZhbGlkIGZvciBwYWdlcworICovCitzdGF0aWMgaW50IGlzX3ZhbGlkX3BhZ2UoZW11MTBrMV90ICplbXUsIGRtYV9hZGRyX3QgYWRkcikKK3sKKwlpZiAoYWRkciAmIH5lbXUtPmRtYV9tYXNrKSB7CisJCXNuZF9wcmludGsoIm1heCBtZW1vcnkgc2l6ZSBpcyAweCVseCAoYWRkciA9IDB4JWx4KSEhXG4iLCBlbXUtPmRtYV9tYXNrLCAodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhZGRyICYgKEVNVVBBR0VTSVpFLTEpKSB7CisJCXNuZF9wcmludGsoInBhZ2UgaXMgbm90IGFsaWduZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBtYXAgdGhlIGdpdmVuIG1lbW9yeSBibG9jayBvbiBQVEIuCisgKiBpZiB0aGUgYmxvY2sgaXMgYWxyZWFkeSBtYXBwZWQsIHVwZGF0ZSB0aGUgbGluayBvcmRlci4KKyAqIGlmIG5vIGVtcHR5IHBhZ2VzIGFyZSBmb3VuZCwgdHJpZXMgdG8gcmVsZWFzZSB1bnNlZCBtZW1vcnkgYmxvY2tzCisgKiBhbmQgcmV0cnkgdGhlIG1hcHBpbmcuCisgKi8KK2ludCBzbmRfZW11MTBrMV9tZW1ibGtfbWFwKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX21lbWJsa190ICpibGspCit7CisJaW50IGVycjsKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dHA7CisJZW11MTBrMV9tZW1ibGtfdCAqZGVsZXRlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+bWVtYmxrX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmxrLT5tYXBwZWRfcGFnZSA+PSAwKSB7CisJCS8qIHVwZGF0ZSBvcmRlciBsaW5rICovCisJCWxpc3RfZGVsKCZibGstPm1hcHBlZF9vcmRlcl9saW5rKTsKKwkJbGlzdF9hZGRfdGFpbCgmYmxrLT5tYXBwZWRfb3JkZXJfbGluaywgJmVtdS0+bWFwcGVkX29yZGVyX2xpbmtfaGVhZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+bWVtYmxrX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoZXJyID0gbWFwX21lbWJsayhlbXUsIGJsaykpIDwgMCkgeworCQkvKiBubyBlbm91Z2ggcGFnZSAtIHRyeSB0byB1bm1hcCBzb21lIGJsb2NrcyAqLworCQkvKiBzdGFydGluZyBmcm9tIHRoZSBvbGRlc3QgYmxvY2sgKi8KKwkJcCA9IGVtdS0+bWFwcGVkX29yZGVyX2xpbmtfaGVhZC5uZXh0OworCQlmb3IgKDsgcCAhPSAmZW11LT5tYXBwZWRfb3JkZXJfbGlua19oZWFkOyBwID0gbmV4dHApIHsKKwkJCW5leHRwID0gcC0+bmV4dDsKKwkJCWRlbGV0ZWQgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWFwcGVkX29yZGVyX2xpbmspOworCQkJaWYgKGRlbGV0ZWQtPm1hcF9sb2NrZWQpCisJCQkJY29udGludWU7CisJCQlzaXplID0gdW5tYXBfbWVtYmxrKGVtdSwgZGVsZXRlZCk7CisJCQlpZiAoc2l6ZSA+PSBibGstPnBhZ2VzKSB7CisJCQkJLyogb2sgdGhlIGVtcHR5IHJlZ2lvbiBpcyBlbm91Z2ggbGFyZ2UgKi8KKwkJCQllcnIgPSBtYXBfbWVtYmxrKGVtdSwgYmxrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPm1lbWJsa19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHBhZ2UgYWxsb2NhdGlvbiBmb3IgRE1BCisgKi8KK3NuZF91dGlsX21lbWJsa190ICoKK3NuZF9lbXUxMGsxX2FsbG9jX3BhZ2VzKGVtdTEwazFfdCAqZW11LCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKKwlzbmRfdXRpbF9tZW1oZHJfdCAqaGRyOworCWVtdTEwazFfbWVtYmxrX3QgKmJsazsKKwlpbnQgcGFnZSwgZXJyLCBpZHg7CisKKwlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuIE5VTEwpOworCXNuZF9hc3NlcnQocnVudGltZS0+ZG1hX2J5dGVzID4gMCAmJiBydW50aW1lLT5kbWFfYnl0ZXMgPCBNQVhQQUdFUyAqIEVNVVBBR0VTSVpFLCByZXR1cm4gTlVMTCk7CisJaGRyID0gZW11LT5tZW1oZHI7CisJc25kX2Fzc2VydChoZHIsIHJldHVybiBOVUxMKTsKKworCWRvd24oJmhkci0+YmxvY2tfbXV0ZXgpOworCWJsayA9IHNlYXJjaF9lbXB0eShlbXUsIHJ1bnRpbWUtPmRtYV9ieXRlcyk7CisJaWYgKGJsayA9PSBOVUxMKSB7CisJCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIGZpbGwgYnVmZmVyIGFkZHJlc3NlcyBidXQgcG9pbnRlcnMgYXJlIG5vdCBzdG9yZWQgc28gdGhhdAorCSAqIHNuZF9mcmVlX3BjaV9wYWdlKCkgaXMgbm90IGNhbGxlZCBpbiBpbiBzeW50aF9mcmVlKCkKKwkgKi8KKwlpZHggPSAwOworCWZvciAocGFnZSA9IGJsay0+Zmlyc3RfcGFnZTsgcGFnZSA8PSBibGstPmxhc3RfcGFnZTsgcGFnZSsrLCBpZHgrKykgeworCQlkbWFfYWRkcl90IGFkZHI7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCQlpZiAoaWR4ID49IHNnYnVmLT5wYWdlcykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJlbXU6IHBhZ2VzIG92ZXJmbG93ISAoJWQtJWQpIGZvciAlZFxuIiwKKwkJCSAgICAgICBibGstPmZpcnN0X3BhZ2UsIGJsay0+bGFzdF9wYWdlLCBzZ2J1Zi0+cGFnZXMpOworCQkJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKyNlbmRpZgorCQlhZGRyID0gc2didWYtPnRhYmxlW2lkeF0uYWRkcjsKKwkJaWYgKCEgaXNfdmFsaWRfcGFnZShlbXUsIGFkZHIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImVtdTogZmFpbHVyZSBwYWdlID0gJWRcbiIsIGlkeCk7CisJCQl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQllbXUtPnBhZ2VfYWRkcl90YWJsZVtwYWdlXSA9IGFkZHI7CisJCWVtdS0+cGFnZV9wdHJfdGFibGVbcGFnZV0gPSBOVUxMOworCX0KKworCS8qIHNldCBQVEIgZW50cmllcyAqLworCWJsay0+bWFwX2xvY2tlZCA9IDE7IC8qIGRvIG5vdCB1bm1hcCB0aGlzIGJsb2NrISAqLworCWVyciA9IHNuZF9lbXUxMGsxX21lbWJsa19tYXAoZW11LCBibGspOworCWlmIChlcnIgPCAwKSB7CisJCV9fc25kX3V0aWxfbWVtX2ZyZWUoaGRyLCAoc25kX3V0aWxfbWVtYmxrX3QgKilibGspOworCQl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KKwl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJcmV0dXJuIChzbmRfdXRpbF9tZW1ibGtfdCAqKWJsazsKK30KKworCisvKgorICogcmVsZWFzZSBETUEgYnVmZmVyIGZyb20gcGFnZSB0YWJsZQorICovCitpbnQgc25kX2VtdTEwazFfZnJlZV9wYWdlcyhlbXUxMGsxX3QgKmVtdSwgc25kX3V0aWxfbWVtYmxrX3QgKmJsaykKK3sKKwlzbmRfYXNzZXJ0KGVtdSAmJiBibGssIHJldHVybiAtRUlOVkFMKTsKKwlyZXR1cm4gc25kX2VtdTEwazFfc3ludGhfZnJlZShlbXUsIGJsayk7Cit9CisKKworLyoKKyAqIG1lbW9yeSBhbGxvY2F0aW9uIHVzaW5nIG11bHRpcGxlIHBhZ2VzIChmb3Igc3ludGgpCisgKiBVbmxpa2UgdGhlIERNQSBhbGxvY2F0aW9uIGFib3ZlLCBub24tY29udGlndW91cyBwYWdlcyBhcmUgYXNzaW5lZC4KKyAqLworCisvKgorICogYWxsb2NhdGUgYSBzeW50aCBzYW1wbGUgYXJlYQorICovCitzbmRfdXRpbF9tZW1ibGtfdCAqCitzbmRfZW11MTBrMV9zeW50aF9hbGxvYyhlbXUxMGsxX3QgKmh3LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwllbXUxMGsxX21lbWJsa190ICpibGs7CisJc25kX3V0aWxfbWVtaGRyX3QgKmhkciA9IGh3LT5tZW1oZHI7IAorCisJZG93bigmaGRyLT5ibG9ja19tdXRleCk7CisJYmxrID0gKGVtdTEwazFfbWVtYmxrX3QgKilfX3NuZF91dGlsX21lbV9hbGxvYyhoZHIsIHNpemUpOworCWlmIChibGsgPT0gTlVMTCkgeworCQl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3ludGhfYWxsb2NfcGFnZXMoaHcsIGJsaykpIHsKKwkJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIChzbmRfdXRpbF9tZW1ibGtfdCAqKWJsayk7CisJCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNuZF9lbXUxMGsxX21lbWJsa19tYXAoaHcsIGJsayk7CisJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCXJldHVybiAoc25kX3V0aWxfbWVtYmxrX3QgKilibGs7Cit9CisKKworLyoKKyAqIGZyZWUgYSBzeW50aCBzYW1wbGUgYXJlYQorICovCitpbnQKK3NuZF9lbXUxMGsxX3N5bnRoX2ZyZWUoZW11MTBrMV90ICplbXUsIHNuZF91dGlsX21lbWJsa190ICptZW1ibGspCit7CisJc25kX3V0aWxfbWVtaGRyX3QgKmhkciA9IGVtdS0+bWVtaGRyOyAKKwllbXUxMGsxX21lbWJsa190ICpibGsgPSAoZW11MTBrMV9tZW1ibGtfdCAqKW1lbWJsazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bigmaGRyLT5ibG9ja19tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+bWVtYmxrX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmxrLT5tYXBwZWRfcGFnZSA+PSAwKQorCQl1bm1hcF9tZW1ibGsoZW11LCBibGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+bWVtYmxrX2xvY2ssIGZsYWdzKTsKKwlzeW50aF9mcmVlX3BhZ2VzKGVtdSwgYmxrKTsKKwkgX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIG1lbWJsayk7CisJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCXJldHVybiAwOworfQorCisKKy8qIGNoZWNrIG5ldyBhbGxvY2F0aW9uIHJhbmdlICovCitzdGF0aWMgdm9pZCBnZXRfc2luZ2xlX3BhZ2VfcmFuZ2Uoc25kX3V0aWxfbWVtaGRyX3QgKmhkciwgZW11MTBrMV9tZW1ibGtfdCAqYmxrLCBpbnQgKmZpcnN0X3BhZ2VfcmV0LCBpbnQgKmxhc3RfcGFnZV9yZXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwllbXUxMGsxX21lbWJsa190ICpxOworCWludCBmaXJzdF9wYWdlLCBsYXN0X3BhZ2U7CisJZmlyc3RfcGFnZSA9IGJsay0+Zmlyc3RfcGFnZTsKKwlpZiAoKHAgPSBibGstPm1lbS5saXN0LnByZXYpICE9ICZoZHItPmJsb2NrKSB7CisJCXEgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWVtLmxpc3QpOworCQlpZiAocS0+bGFzdF9wYWdlID09IGZpcnN0X3BhZ2UpCisJCQlmaXJzdF9wYWdlKys7ICAvKiBmaXJzdCBwYWdlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCX0KKwlsYXN0X3BhZ2UgPSBibGstPmxhc3RfcGFnZTsKKwlpZiAoKHAgPSBibGstPm1lbS5saXN0Lm5leHQpICE9ICZoZHItPmJsb2NrKSB7CisJCXEgPSBnZXRfZW11MTBrMV9tZW1ibGsocCwgbWVtLmxpc3QpOworCQlpZiAocS0+Zmlyc3RfcGFnZSA9PSBsYXN0X3BhZ2UpCisJCQlsYXN0X3BhZ2UtLTsgLyogbGFzdCBwYWdlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCX0KKwkqZmlyc3RfcGFnZV9yZXQgPSBmaXJzdF9wYWdlOworCSpsYXN0X3BhZ2VfcmV0ID0gbGFzdF9wYWdlOworfQorCisvKgorICogYWxsb2NhdGUga2VybmVsIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgc3ludGhfYWxsb2NfcGFnZXMoZW11MTBrMV90ICplbXUsIGVtdTEwazFfbWVtYmxrX3QgKmJsaykKK3sKKwlpbnQgcGFnZSwgZmlyc3RfcGFnZSwgbGFzdF9wYWdlOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWFiOworCisJZW11MTBrMV9tZW1ibGtfaW5pdChibGspOworCWdldF9zaW5nbGVfcGFnZV9yYW5nZShlbXUtPm1lbWhkciwgYmxrLCAmZmlyc3RfcGFnZSwgJmxhc3RfcGFnZSk7CisJLyogYWxsb2NhdGUga2VybmVsIHBhZ2VzICovCisJZm9yIChwYWdlID0gZmlyc3RfcGFnZTsgcGFnZSA8PSBsYXN0X3BhZ2U7IHBhZ2UrKykgeworCQlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLAorCQkJCQlQQUdFX1NJWkUsICZkbWFiKSA8IDApCisJCQlnb3RvIF9fZmFpbDsKKwkJaWYgKCEgaXNfdmFsaWRfcGFnZShlbXUsIGRtYWIuYWRkcikpIHsKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmZG1hYik7CisJCQlnb3RvIF9fZmFpbDsKKwkJfQorCQllbXUtPnBhZ2VfYWRkcl90YWJsZVtwYWdlXSA9IGRtYWIuYWRkcjsKKwkJZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXSA9IGRtYWIuYXJlYTsKKwl9CisJcmV0dXJuIDA7CisKK19fZmFpbDoKKwkvKiByZWxlYXNlIGFsbG9jYXRlZCBwYWdlcyAqLworCWxhc3RfcGFnZSA9IHBhZ2UgLSAxOworCWZvciAocGFnZSA9IGZpcnN0X3BhZ2U7IHBhZ2UgPD0gbGFzdF9wYWdlOyBwYWdlKyspIHsKKwkJZG1hYi5hcmVhID0gZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXTsKKwkJZG1hYi5hZGRyID0gZW11LT5wYWdlX2FkZHJfdGFibGVbcGFnZV07CisJCWRtYWIuYnl0ZXMgPSBQQUdFX1NJWkU7CisJCXNuZF9kbWFfZnJlZV9wYWdlcygmZG1hYik7CisJCWVtdS0+cGFnZV9hZGRyX3RhYmxlW3BhZ2VdID0gMDsKKwkJZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXSA9IE5VTEw7CisJfQorCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBmcmVlIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgc3ludGhfZnJlZV9wYWdlcyhlbXUxMGsxX3QgKmVtdSwgZW11MTBrMV9tZW1ibGtfdCAqYmxrKQoreworCWludCBwYWdlLCBmaXJzdF9wYWdlLCBsYXN0X3BhZ2U7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYWI7CisKKwlnZXRfc2luZ2xlX3BhZ2VfcmFuZ2UoZW11LT5tZW1oZHIsIGJsaywgJmZpcnN0X3BhZ2UsICZsYXN0X3BhZ2UpOworCWRtYWIuZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJZG1hYi5kZXYuZGV2ID0gc25kX2RtYV9wY2lfZGF0YShlbXUtPnBjaSk7CisJZm9yIChwYWdlID0gZmlyc3RfcGFnZTsgcGFnZSA8PSBsYXN0X3BhZ2U7IHBhZ2UrKykgeworCQlpZiAoZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRtYWIuYXJlYSA9IGVtdS0+cGFnZV9wdHJfdGFibGVbcGFnZV07CisJCWRtYWIuYWRkciA9IGVtdS0+cGFnZV9hZGRyX3RhYmxlW3BhZ2VdOworCQlkbWFiLmJ5dGVzID0gUEFHRV9TSVpFOworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmRtYWIpOworCQllbXUtPnBhZ2VfYWRkcl90YWJsZVtwYWdlXSA9IDA7CisJCWVtdS0+cGFnZV9wdHJfdGFibGVbcGFnZV0gPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxjdWxhdGUgYnVmZmVyIHBvaW50ZXIgZnJvbSBvZmZzZXQgYWRkcmVzcyAqLworaW5saW5lIHN0YXRpYyB2b2lkICpvZmZzZXRfcHRyKGVtdTEwazFfdCAqZW11LCBpbnQgcGFnZSwgaW50IG9mZnNldCkKK3sKKwljaGFyICpwdHI7CisJc25kX2Fzc2VydChwYWdlID49IDAgJiYgcGFnZSA8IGVtdS0+bWF4X2NhY2hlX3BhZ2VzLCByZXR1cm4gTlVMTCk7CisJcHRyID0gZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXTsKKwlpZiAoISBwdHIpIHsKKwkJcHJpbnRrKCJlbXUxMGsxOiBhY2Nlc3MgdG8gTlVMTCBwdHI6IHBhZ2UgPSAlZFxuIiwgcGFnZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwdHIgKz0gb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCXJldHVybiAodm9pZCopcHRyOworfQorCisvKgorICogYnplcm8oYmxrICsgb2Zmc2V0LCBzaXplKQorICovCitpbnQgc25kX2VtdTEwazFfc3ludGhfYnplcm8oZW11MTBrMV90ICplbXUsIHNuZF91dGlsX21lbWJsa190ICpibGssIGludCBvZmZzZXQsIGludCBzaXplKQoreworCWludCBwYWdlLCBuZXh0b2ZzLCBlbmRfb2Zmc2V0LCB0ZW1wLCB0ZW1wMTsKKwl2b2lkICpwdHI7CisJZW11MTBrMV9tZW1ibGtfdCAqcCA9IChlbXUxMGsxX21lbWJsa190ICopYmxrOworCisJb2Zmc2V0ICs9IGJsay0+b2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCWVuZF9vZmZzZXQgPSBvZmZzZXQgKyBzaXplOworCXBhZ2UgPSBnZXRfYWxpZ25lZF9wYWdlKG9mZnNldCk7CisJZG8geworCQluZXh0b2ZzID0gYWxpZ25lZF9wYWdlX29mZnNldChwYWdlICsgMSk7CisJCXRlbXAgPSBuZXh0b2ZzIC0gb2Zmc2V0OworCQl0ZW1wMSA9IGVuZF9vZmZzZXQgLSBvZmZzZXQ7CisJCWlmICh0ZW1wMSA8IHRlbXApCisJCQl0ZW1wID0gdGVtcDE7CisJCXB0ciA9IG9mZnNldF9wdHIoZW11LCBwYWdlICsgcC0+Zmlyc3RfcGFnZSwgb2Zmc2V0KTsKKwkJaWYgKHB0cikKKwkJCW1lbXNldChwdHIsIDAsIHRlbXApOworCQlvZmZzZXQgPSBuZXh0b2ZzOworCQlwYWdlKys7CisJfSB3aGlsZSAob2Zmc2V0IDwgZW5kX29mZnNldCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb3B5X2Zyb21fdXNlcihibGsgKyBvZmZzZXQsIGRhdGEsIHNpemUpCisgKi8KK2ludCBzbmRfZW11MTBrMV9zeW50aF9jb3B5X2Zyb21fdXNlcihlbXUxMGsxX3QgKmVtdSwgc25kX3V0aWxfbWVtYmxrX3QgKmJsaywgaW50IG9mZnNldCwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIGludCBzaXplKQoreworCWludCBwYWdlLCBuZXh0b2ZzLCBlbmRfb2Zmc2V0LCB0ZW1wLCB0ZW1wMTsKKwl2b2lkICpwdHI7CisJZW11MTBrMV9tZW1ibGtfdCAqcCA9IChlbXUxMGsxX21lbWJsa190ICopYmxrOworCisJb2Zmc2V0ICs9IGJsay0+b2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCWVuZF9vZmZzZXQgPSBvZmZzZXQgKyBzaXplOworCXBhZ2UgPSBnZXRfYWxpZ25lZF9wYWdlKG9mZnNldCk7CisJZG8geworCQluZXh0b2ZzID0gYWxpZ25lZF9wYWdlX29mZnNldChwYWdlICsgMSk7CisJCXRlbXAgPSBuZXh0b2ZzIC0gb2Zmc2V0OworCQl0ZW1wMSA9IGVuZF9vZmZzZXQgLSBvZmZzZXQ7CisJCWlmICh0ZW1wMSA8IHRlbXApCisJCQl0ZW1wID0gdGVtcDE7CisJCXB0ciA9IG9mZnNldF9wdHIoZW11LCBwYWdlICsgcC0+Zmlyc3RfcGFnZSwgb2Zmc2V0KTsKKwkJaWYgKHB0ciAmJiBjb3B5X2Zyb21fdXNlcihwdHIsIGRhdGEsIHRlbXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mZnNldCA9IG5leHRvZnM7CisJCWRhdGEgKz0gdGVtcDsKKwkJcGFnZSsrOworCX0gd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2NiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrPgorICogIERyaXZlciBwMTZ2IGNoaXBzCisgKiAgVmVyc2lvbjogMC4yMgorICoKKyAqICBGRUFUVVJFUyBjdXJyZW50bHkgc3VwcG9ydGVkOgorICogICAgT3V0cHV0IGZpeGVkIGF0IFMzMl9MRSwgMiBjaGFubmVsIHRvIGh3OjAsMAorICogICAgUmF0ZXM6IDQ0LjEsIDQ4LCA5NiwgMTkyLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgMC44CisgKiAgICBVc2Ugc2VwYXJhdGUgY2FyZCBiYXNlZCBidWZmZXIgZm9yIHBlcmlvZHMgdGFibGUuCisgKiAgMC45CisgKiAgICBVc2UgMiBjaGFubmVsIG91dHB1dCBzdHJlYW1zIGluc3RlYWQgb2YgOCBjaGFubmVsLgorICogICAgICAgKDggY2hhbm5lbCBvdXRwdXQgc3RyZWFtcyBtaWdodCBiZSBnb29kIGZvciBBU0lPIHR5cGUgb3V0cHV0KQorICogICAgQ29ycmVjdGVkIHNwZWFrZXIgb3V0cHV0LCBzbyBGcm9udCAtPiBGcm9udCBldGMuCisgKiAgMC4xMAorICogICAgRml4ZWQgbWlzc2VkIGludGVycnVwdHMuCisgKiAgMC4xMQorICogICAgQWRkIFNvdW5kIGNhcmQgbW9kZWwgbnVtYmVyIGFuZCBuYW1lcy4KKyAqICAgIEFkZCBBbmFsb2cgdm9sdW1lIGNvbnRyb2xzLgorICogIDAuMTIKKyAqICAgIENvcnJlY3RlZCBwbGF5YmFjayBpbnRlcnJ1cHRzLiBOb3cgaW50ZXJydXB0IHBlciBwZXJpb2QsIGluc3RlYWQgb2YgaGFsZiBwZXJpb2QuCisgKiAgMC4xMworICogICAgVXNlIHNpbmdsZSB0cmlnZ2VyIGZvciBtdWx0aWNoYW5uZWwuCisgKiAgMC4xNAorICogICAgTWljIGNhcHR1cmUgbm93IHdvcmtzIGF0IGZpeGVkOiBTMzJfTEUsIDk2MDAwSHosIFN0ZXJlby4KKyAqICAwLjE1CisgKiAgICBGb3JjZSBidWZmZXJfc2l6ZSAvIHBlcmlvZF9zaXplID09IElOVEVHRVIuCisgKiAgMC4xNgorICogICAgVXBkYXRlIHAxNnYuYyB0byB3b3JrIHdpdGggY2hhbmdlZCBhbHNhIGFwaS4KKyAqICAwLjE3CisgKiAgICBVcGRhdGUgcDE2di5jIHRvIHdvcmsgd2l0aCBjaGFuZ2VkIGFsc2EgYXBpLiBSZW1vdmVkIGJvb3RfZGV2cy4KKyAqICAwLjE4CisgKiAgICBNZXJnaW5nIHdpdGggc25kLWVtdTEwazEgZHJpdmVyLgorICogIDAuMTkKKyAqICAgIE9uZSBzdGVyZW8gY2hhbm5lbCBhdCAyNGJpdCBub3cgd29ya3MuCisgKiAgMC4yMAorICogICAgQWRkZWQgYmV0dGVyIHJlZ2lzdGVyIGRlZmluZXMuCisgKiAgMC4yMQorICogICAgSW50ZWdyYXRlZCB3aXRoIHNuZC1lbXUxMGsxIGRyaXZlci4KKyAqICAwLjIyCisgKiAgICBSZW1vdmVkICNpZiAwIC4uLiAjZW5kaWYKKyAqCisgKgorICogIEJVR1M6CisgKiAgICBTb21lIHN0YWJpbGl0eSBwcm9ibGVtcyB3aGVuIHVubG9hZGluZyB0aGUgc25kLXAxNnYga2VybmVsIG1vZHVsZS4KKyAqICAgIC0tCisgKgorICogIFRPRE86CisgKiAgICBTUERJRiBvdXQuCisgKiAgICBGaW5kIG91dCBob3cgdG8gY2hhbmdlIGNhcHR1cmUgc2FtcGxlIHJhdGVzLiBFLmcuIFRvIHJlY29yZCBTUERJRiBhdCA0ODAwMEh6LgorICogICAgQ3VycmVudGx5IGNhcHR1cmUgZml4ZWQgYXQgNDgwMDBIei4KKyAqCisgKiAgICAtLQorICogIEdFTkVSQUwgSU5GTzoKKyAqICAgIE1vZGVsOiBTQjAyNDAKKyAqICAgIFAxNlYgQ2hpcDogQ0EwMTUxLURCUworICogICAgQXVkaWd5IDIgQ2hpcDogQ0EwMTAyLUlBVAorICogICAgQUM5NyBDb2RlYzogU1RBQyA5NzIxCisgKiAgICBBREM6IFBoaWxpcHMgMTM2MVQgKFN0ZXJlbyAyNGJpdCkKKyAqICAgIERBQzogQ1M0MzgyLUsgKDgtY2hhbm5lbCwgMjRiaXQsIDE5MktoeikKKyAqCisgKiAgVGhpcyBjb2RlIHdhcyBpbml0YWxseSBiYXNlZCBvbiBjb2RlIGZyb20gQUxTQSdzIGVtdTEwazF4LmMgd2hpY2ggaXM6CisgKiAgQ29weXJpZ2h0IChjKSBieSBGcmFuY2lzY28gTW9yYWVzIDxmbW9yYWVzQG5jLnJyLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKyNpbmNsdWRlICJwMTZ2LmgiCisKKyNkZWZpbmUgU0VUX0NIQU5ORUwgMCAgLyogVGVzdGluZyBjaGFubmVsIG91dHB1dHMgMD1Gcm9udCwgMT1DZW50ZXIvTEZFLCAyPVVua25vd24sIDM9UmVhciAqLworI2RlZmluZSBQQ01fRlJPTlRfQ0hBTk5FTCAwCisjZGVmaW5lIFBDTV9SRUFSX0NIQU5ORUwgMQorI2RlZmluZSBQQ01fQ0VOVEVSX0xGRV9DSEFOTkVMIDIKKyNkZWZpbmUgUENNX1VOS05PV05fQ0hBTk5FTCAzCisjZGVmaW5lIENPTlRST0xfRlJPTlRfQ0hBTk5FTCAwCisjZGVmaW5lIENPTlRST0xfUkVBUl9DSEFOTkVMIDMKKyNkZWZpbmUgQ09OVFJPTF9DRU5URVJfTEZFX0NIQU5ORUwgMQorI2RlZmluZSBDT05UUk9MX1VOS05PV05fQ0hBTk5FTCAyCisKKy8qIENhcmQgSURzOgorICogQ2xhc3MgMDQwMTogMTEwMjowMDA0IChyZXYgMDQpIFN1YnN5c3RlbTogMTEwMjoyMDAyIC0+IEF1ZGlneTIgWlMgNy4xIE1vZGVsOlNCMDM1MAorICogQ2xhc3MgMDQwMTogMTEwMjowMDA0IChyZXYgMDQpIFN1YnN5c3RlbTogMTEwMjoxMDA3IC0+IEF1ZGlneTIgNi4xICAgIE1vZGVsOlNCMDI0MAorICogQ2xhc3MgMDQwMTogMTEwMjowMDA0IChyZXYgMDQpIFN1YnN5c3RlbTogMTEwMjoxMDAyIC0+IEF1ZGlneTIgUGxhdGludW0gIE1vZGVsOlNCIG1zYjAyNDAyMzAwMDkyNjYKKyAqIENsYXNzIDA0MDE6IDExMDI6MDAwNCAocmV2IDA0KSBTdWJzeXN0ZW06IDExMDI6MjAwNyAtPiBBdWRpZ3k0IFBybyBNb2RlbDpTQjAzODAgTTFTQjAzODA0NzIwMDE5MDFFCisgKgorICovCisKKyAvKiBoYXJkd2FyZSBkZWZpbml0aW9uICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9wMTZ2X3BsYXliYWNrX2h3ID0geworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsIC8qIE9ubHkgc3VwcG9ydHMgMjQtYml0IHNhbXBsZXMgcGFkZGVkIHRvIDMyIGJpdHMuICovCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzE5MjAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKKwkucmF0ZV9tYXggPQkJMTkyMDAwLAorCS5jaGFubmVsc19taW4gPQkJOCwgCisJLmNoYW5uZWxzX21heCA9CQk4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDMyKjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTYqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTgsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHZvaWQgc25kX3AxNnZfcGNtX2ZyZWVfc3Vic3RyZWFtKHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCXNuZF9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKyAgCisJaWYgKGVwY20pIHsKKyAgICAgICAgCS8vc25kX3ByaW50aygiZXBjbSBmcmVlOiAlcFxuIiwgZXBjbSk7CisJCWtmcmVlKGVwY20pOworCX0KK30KKworLyogb3Blbl9wbGF5YmFjayBjYWxsYmFjayAqLworc3RhdGljIGludCBzbmRfcDE2dl9wY21fb3Blbl9wbGF5YmFja19jaGFubmVsKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNoYW5uZWxfaWQpCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisgICAgICAgIGVtdTEwazFfdm9pY2VfdCAqY2hhbm5lbCA9ICYoZW11LT5wMTZ2X3ZvaWNlc1tjaGFubmVsX2lkXSk7CisJZW11MTBrMV9wY21fdCAqZXBjbTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJZXBjbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCplcGNtKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIC8vc25kX3ByaW50aygiZXBjbSBrY2FsbG9jOiAlcFxuIiwgZXBjbSk7CisKKwlpZiAoZXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcGNtLT5lbXUgPSBlbXU7CisJZXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworICAgICAgICAvL3NuZF9wcmludGsoImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLCBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlLCBjaGFubmVsX2lkKTsKKyAgCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfcDE2dl9wY21fZnJlZV9zdWJzdHJlYW07CisgIAorCXJ1bnRpbWUtPmh3ID0gc25kX3AxNnZfcGxheWJhY2tfaHc7CisKKyAgICAgICAgY2hhbm5lbC0+ZW11ID0gZW11OworICAgICAgICBjaGFubmVsLT5udW1iZXIgPSBjaGFubmVsX2lkOworCisgICAgICAgIGNoYW5uZWwtPnVzZT0xOworCS8vc25kX3ByaW50aygicDE2djogb3BlbiBjaGFubmVsX2lkPSVkLCBjaGFubmVsPSVwLCB1c2U9MHgleFxuIiwgY2hhbm5lbF9pZCwgY2hhbm5lbCwgY2hhbm5lbC0+dXNlKTsKKyAgICAgICAgLy9wcmludGsoIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIixjaGFubmVsX2lkLCBjaGlwLCBjaGFubmVsKTsKKyAgICAgICAgLy9jaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfcDE2dl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7CisgICAgICAgIGNoYW5uZWwtPmVwY209ZXBjbTsKKwlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyogY2xvc2UgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2Nsb3NlX3BsYXliYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwkvL3NuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworICAgICAgICAvL2VtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisgICAgICAgIGVtdS0+cDE2dl92b2ljZXNbc3Vic3RyZWFtLT5wY20tPmRldmljZSAtIGVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0XS51c2U9MDsKKy8qIEZJWE1FOiBtYXliZSB6ZXJvIG90aGVycyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250KHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3AxNnZfcGNtX29wZW5fcGxheWJhY2tfY2hhbm5lbChzdWJzdHJlYW0sIFBDTV9GUk9OVF9DSEFOTkVMKTsKK30KKworLyogaHdfcGFyYW1zIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9od19wYXJhbXNfcGxheWJhY2soc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJaW50IHJlc3VsdDsKKyAgICAgICAgLy9zbmRfcHJpbnRrKCJod19wYXJhbXMgYWxsb2M6IHN1YnN0cmVhbT0lcFxuIiwgc3Vic3RyZWFtKTsKKwlyZXN1bHQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworICAgICAgICAvL3NuZF9wcmludGsoImh3X3BhcmFtcyBhbGxvYzogcmVzdWx0PSVkXG4iLCByZXN1bHQpOworCS8vZHVtcF9zdGFjaygpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGh3X2ZyZWUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2h3X2ZyZWVfcGxheWJhY2soc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWludCByZXN1bHQ7CisgICAgICAgIC8vc25kX3ByaW50aygiaHdfcGFyYW1zIGZyZWU6IHN1YnN0cmVhbT0lcFxuIiwgc3Vic3RyZWFtKTsKKwlyZXN1bHQgPSBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisgICAgICAgIC8vc25kX3ByaW50aygiaHdfcGFyYW1zIGZyZWU6IHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKKwkvL2R1bXBfc3RhY2soKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBwcmVwYXJlIHBsYXliYWNrIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9wcmVwYXJlX3BsYXliYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwkvL2VtdTEwazFfcGNtX3QgKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGNoYW5uZWwgPSBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIC0gZW11LT5wMTZ2X2RldmljZV9vZmZzZXQ7CisJdTMyICp0YWJsZV9iYXNlID0gKHUzMiAqKShlbXUtPnAxNnZfYnVmZmVyLmFyZWErKDgqMTYqY2hhbm5lbCkpOworCXUzMiBwZXJpb2Rfc2l6ZV9ieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJaW50IGk7CisJdTMyIHRtcDsKKwkKKyAgICAgICAgLy9zbmRfcHJpbnRrKCJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCBmb3JtYXQ9MHgleCwgY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCBwZXJpb2RzPSV1LCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsY2hhbm5lbCwgcnVudGltZS0+cmF0ZSwgcnVudGltZS0+Zm9ybWF0LCBydW50aW1lLT5jaGFubmVscywgcnVudGltZS0+YnVmZmVyX3NpemUsIHJ1bnRpbWUtPnBlcmlvZF9zaXplLCBydW50aW1lLT5wZXJpb2RzLCBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgMSkpOworICAgICAgICAvL3NuZF9wcmludGsoImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIixydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2FyZWEsIHRhYmxlX2Jhc2UpOworCS8vc25kX3ByaW50aygiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsZW11LT5wMTZ2X2J1ZmZlci5hZGRyLCBlbXUtPnAxNnZfYnVmZmVyLmFyZWEsIGVtdS0+cDE2dl9idWZmZXIuYnl0ZXMpOworCXRtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9TUERJRl9TQU1QTEVSQVRFLCBjaGFubmVsKTsKKyAgICAgICAgc3dpdGNoIChydW50aW1lLT5yYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkgIHNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgY2hhbm5lbCwgKHRtcCAmIH4weGUwMDApIHwgMHg4MDAwKTsgLyogRklYTUU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGNhcHR1cmUgcmF0ZSBhcyB3ZWxsISAqLworCSAgYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkgIHNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgY2hhbm5lbCwgKHRtcCAmIH4weGUwMDApIHwgMHgwMDAwKTsgLyogRklYTUU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGNhcHR1cmUgcmF0ZSBhcyB3ZWxsISAqLworCSAgYnJlYWs7CisJY2FzZSA5NjAwMDoKKwkgIHNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgY2hhbm5lbCwgKHRtcCAmIH4weGUwMDApIHwgMHg0MDAwKTsgLyogRklYTUU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGNhcHR1cmUgcmF0ZSBhcyB3ZWxsISAqLworCSAgYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJICBzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX1NQRElGX1NBTVBMRVJBVEUsIGNoYW5uZWwsICh0bXAgJiB+MHhlMDAwKSB8IDB4MjAwMCk7IC8qIEZJWE1FOiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjYXB0dXJlIHJhdGUgYXMgd2VsbCEgKi8KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX1NQRElGX1NBTVBMRVJBVEUsIGNoYW5uZWwsIDB4MDAwMCk7IC8qIEZJWE1FOiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjYXB0dXJlIHJhdGUgYXMgd2VsbCEgKi8KKwkgIGJyZWFrOworCX0KKwkvKiBGSVhNRTogQ2hlY2sgZW11LT5idWZmZXIuc2l6ZSBiZWZvcmUgYWN0dWFsbHkgd3JpdGluZyB0byBpdC4gKi8KKyAgICAgICAgZm9yKGk9MDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgeworCQl0YWJsZV9iYXNlW2kqMl09cnVudGltZS0+ZG1hX2FkZHIrKGkqcGVyaW9kX3NpemVfYnl0ZXMpOworCQl0YWJsZV9iYXNlWyhpKjIpKzFdPXBlcmlvZF9zaXplX2J5dGVzPDwxNjsKKwl9CisgCisJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBQTEFZQkFDS19MSVNUX0FERFIsIGNoYW5uZWwsIGVtdS0+cDE2dl9idWZmZXIuYWRkcisoOCoxNipjaGFubmVsKSk7CisJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBQTEFZQkFDS19MSVNUX1NJWkUsIGNoYW5uZWwsIChydW50aW1lLT5wZXJpb2RzIC0gMSkgPDwgMTkpOworCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgUExBWUJBQ0tfTElTVF9QVFIsIGNoYW5uZWwsIDApOworCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgUExBWUJBQ0tfRE1BX0FERFIsIGNoYW5uZWwsIHJ1bnRpbWUtPmRtYV9hZGRyKTsKKwlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIFBMQVlCQUNLX1BFUklPRF9TSVpFLCBjaGFubmVsLCBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpPDwxNik7IC8vIGJ1ZmZlciBzaXplIGluIGJ5dGVzCisJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBQTEFZQkFDS19QT0lOVEVSLCBjaGFubmVsLCAwKTsKKwlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIDB4MDcsIGNoYW5uZWwsIDB4MCk7CisJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCAweDA4LCBjaGFubmVsLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfcDE2dl9pbnRyX2VuYWJsZShlbXUxMGsxX3QgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwllbmFibGUgPSBpbmwoZW11LT5wb3J0ICsgSU5URTIpIHwgaW50cmVuYjsKKwlvdXRsKGVuYWJsZSwgZW11LT5wb3J0ICsgSU5URTIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX3AxNnZfaW50cl9kaXNhYmxlKGVtdTEwazFfdCAqZW11LCB1bnNpZ25lZCBpbnQgaW50cmVuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBkaXNhYmxlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwlkaXNhYmxlID0gaW5sKGVtdS0+cG9ydCArIElOVEUyKSAmICh+aW50cmVuYik7CisJb3V0bChkaXNhYmxlLCBlbXUtPnBvcnQgKyBJTlRFMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworfQorCisvKiB0cmlnZ2VyX3BsYXliYWNrIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV90cmlnZ2VyX3BsYXliYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICAgaW50IGNtZCkKK3sKKwllbXUxMGsxX3QgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZTsKKwllbXUxMGsxX3BjbV90ICplcGNtOworCWludCBjaGFubmVsOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKyAgICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqczsKKwl1MzIgYmFzaWMgPSAwOworCXUzMiBpbnRlID0gMDsKKwlpbnQgcnVubmluZz0wOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlydW5uaW5nPTE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwlkZWZhdWx0OgorCQlydW5uaW5nPTA7CisJCWJyZWFrOworCX0KKyAgICAgICAgc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgeworICAgICAgICAgICAgICAgIHMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlydW50aW1lID0gcy0+cnVudGltZTsKKwkJZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwkJY2hhbm5lbCA9IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UtZW11LT5wMTZ2X2RldmljZV9vZmZzZXQ7CisJCS8vc25kX3ByaW50aygicDE2diBjaGFubmVsPSVkXG4iLGNoYW5uZWwpOworCQllcGNtLT5ydW5uaW5nID0gcnVubmluZzsKKwkJYmFzaWMgfD0gKDB4MTw8Y2hhbm5lbCk7CisJCWludGUgfD0gKElOVEUyX1BMQVlCQUNLX0NIXzBfTE9PUDw8Y2hhbm5lbCk7CisgICAgICAgICAgICAgICAgc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKyAgICAgICAgfQorCS8vc25kX3ByaW50aygiYmFzaWM9MHgleCwgaW50ZT0weCV4XG4iLGJhc2ljLCBpbnRlKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJc25kX3AxNnZfaW50cl9lbmFibGUoZW11LCBpbnRlKTsKKwkJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBCQVNJQ19JTlRFUlJVUFQsIDAsIHNuZF9lbXUxMGsxX3B0cjIwX3JlYWQoZW11LCBCQVNJQ19JTlRFUlJVUFQsIDApfCAoYmFzaWMpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIEJBU0lDX0lOVEVSUlVQVCwgMCwgc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIEJBU0lDX0lOVEVSUlVQVCwgMCkgJiB+KGJhc2ljKSk7CisJCXNuZF9wMTZ2X2ludHJfZGlzYWJsZShlbXUsIGludGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogcG9pbnRlcl9wbGF5YmFjayBjYWxsYmFjayAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfcDE2dl9wY21fcG9pbnRlcl9wbGF5YmFjayhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJZW11MTBrMV90ICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZW11MTBrMV9wY21fdCAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwdHIsIHB0cjEsIHB0cjIscHRyMyxwdHI0ID0gMDsKKwlpbnQgY2hhbm5lbCA9IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UgLSBlbXUtPnAxNnZfZGV2aWNlX29mZnNldDsKKwlpZiAoIWVwY20tPnJ1bm5pbmcpCisJCXJldHVybiAwOworCisJcHRyMyA9IHNuZF9lbXUxMGsxX3B0cjIwX3JlYWQoZW11LCBQTEFZQkFDS19MSVNUX1BUUiwgY2hhbm5lbCk7CisJcHRyMSA9IHNuZF9lbXUxMGsxX3B0cjIwX3JlYWQoZW11LCBQTEFZQkFDS19QT0lOVEVSLCBjaGFubmVsKTsKKwlwdHI0ID0gc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIFBMQVlCQUNLX0xJU1RfUFRSLCBjaGFubmVsKTsKKwlpZiAocHRyMyAhPSBwdHI0KSBwdHIxID0gc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIFBMQVlCQUNLX1BPSU5URVIsIGNoYW5uZWwpOworCXB0cjIgPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyMSk7CisJcHRyMis9IChwdHI0ID4+IDMpICogcnVudGltZS0+cGVyaW9kX3NpemU7CisJcHRyPXB0cjI7CisgICAgICAgIGlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKworCXJldHVybiBwdHI7Cit9CisKKy8qIG9wZXJhdG9ycyAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3AxNnZfcGxheWJhY2tfZnJvbnRfb3BzID0geworCS5vcGVuID0gICAgICAgIHNuZF9wMTZ2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250LAorCS5jbG9zZSA9ICAgICAgIHNuZF9wMTZ2X3BjbV9jbG9zZV9wbGF5YmFjaywKKwkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gICBzbmRfcDE2dl9wY21faHdfcGFyYW1zX3BsYXliYWNrLAorCS5od19mcmVlID0gICAgIHNuZF9wMTZ2X3BjbV9od19mcmVlX3BsYXliYWNrLAorCS5wcmVwYXJlID0gICAgIHNuZF9wMTZ2X3BjbV9wcmVwYXJlX3BsYXliYWNrLAorCS50cmlnZ2VyID0gICAgIHNuZF9wMTZ2X3BjbV90cmlnZ2VyX3BsYXliYWNrLAorCS5wb2ludGVyID0gICAgIHNuZF9wMTZ2X3BjbV9wb2ludGVyX3BsYXliYWNrLAorfTsKKworaW50IHNuZF9wMTZ2X2ZyZWUoZW11MTBrMV90ICpjaGlwKQoreworCS8vIHJlbGVhc2UgdGhlIGRhdGEKKwlpZiAoY2hpcC0+cDE2dl9idWZmZXIuYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPnAxNnZfYnVmZmVyKTsKKwkJLy9zbmRfcHJpbnRrKCJwZXJpb2QgbGFibGVzIGZyZWU6ICVwXG4iLCAmY2hpcC0+cDE2dl9idWZmZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3AxNnZfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJZW11MTBrMV90ICplbXUgPSBwY20tPnByaXZhdGVfZGF0YTsKKwkvL3NuZF9wcmludGsoInNuZF9wMTZ2X3BjbV9mcmVlIHBjbTogY2FsbGVkXG4iKTsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKKwllbXUtPnBjbSA9IE5VTEw7Cit9CisKK2ludCBzbmRfcDE2dl9wY20oZW11MTBrMV90ICplbXUsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKnJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCWludCBlcnI7CisgICAgICAgIGludCBjYXB0dXJlPTA7CisgIAorCS8vc25kX3ByaW50aygic25kX3AxNnZfcGNtIGNhbGxlZC4gZGV2aWNlPSVkXG4iLCBkZXZpY2UpOworCWVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0ID0gZGV2aWNlOworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisgICAgICAgIC8vaWYgKGRldmljZSA9PSAwKSBjYXB0dXJlPTE7IAorCWlmICgoZXJyID0gc25kX3BjbV9uZXcoZW11LT5jYXJkLCAicDE2diIsIGRldmljZSwgMSwgY2FwdHVyZSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKyAgCisJcGNtLT5wcml2YXRlX2RhdGEgPSBlbXU7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfcDE2dl9wY21fZnJlZTsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfcDE2dl9wbGF5YmFja19mcm9udF9vcHMpOworCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlwY20tPmRldl9zdWJjbGFzcyA9IFNORFJWX1BDTV9TVUJDTEFTU19HRU5FUklDX01JWDsKKwlzdHJjcHkocGNtLT5uYW1lLCAicDE2diIpOworCWVtdS0+cGNtID0gcGNtOworCisJZm9yKHN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07IAorCSAgICBzdWJzdHJlYW07IAorCSAgICBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpIHsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlcyhzdWJzdHJlYW0sIAorCQkJCQkJCSBTTkRSVl9ETUFfVFlQRV9ERVYsIAorCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGVtdS0+cGNpKSwgCisJCQkJCQkJIDY0KjEwMjQsIDY0KjEwMjQpKSA8IDApIC8qIEZJWE1FOiAzMioxMDI0IGZvciBzb3VuZCBidWZmZXIsIGJldHdlZW4gMzJhbmQ2NCBmb3IgUGVyaW9kcyB0YWJsZS4gKi8KKwkJCXJldHVybiBlcnI7CisJCS8vc25kX3ByaW50aygicHJlYWxsb2NhdGUgcGxheWJhY2sgc3Vic3RyZWFtOiBlcnI9JWRcbiIsIGVycik7CisJfQorCisJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW07IAorCSAgICAgIHN1YnN0cmVhbTsgCisJICAgICAgc3Vic3RyZWFtID0gc3Vic3RyZWFtLT5uZXh0KSB7CisgCQlpZiAoKGVyciA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzKHN1YnN0cmVhbSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNORFJWX0RNQV9UWVBFX0RFViwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9kbWFfcGNpX2RhdGEoZW11LT5wY2kpLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQqMTAyNCwgNjQqMTAyNCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCS8vc25kX3ByaW50aygicHJlYWxsb2NhdGUgY2FwdHVyZSBzdWJzdHJlYW06IGVycj0lZFxuIiwgZXJyKTsKKwl9CisgIAorCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3AxNnZfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisgICAgICAgIHVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworICAgICAgICB1aW5mby0+Y291bnQgPSAyOworICAgICAgICB1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworICAgICAgICB1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyNTU7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wsIGludCByZWcsIGludCBoaWdoX2xvdykKK3sKKyAgICAgICAgZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHUzMiB2YWx1ZTsKKworICAgICAgICB2YWx1ZSA9IHNuZF9lbXUxMGsxX3B0cjIwX3JlYWQoZW11LCByZWcsIGhpZ2hfbG93KTsKKwlpZiAoaGlnaF9sb3cgPT0gMSkgeworICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweGZmIC0gKCh2YWx1ZSA+PiAyNCkgJiAweGZmKTsgLyogTGVmdCAqLworICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAweGZmIC0gKCh2YWx1ZSA+PiAxNikgJiAweGZmKTsgLyogUmlnaHQgKi8KKwl9IGVsc2UgeworICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweGZmIC0gKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpOyAvKiBMZWZ0ICovCisgICAgICAgIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDB4ZmYgLSAoKHZhbHVlID4+IDApICYgMHhmZik7IC8qIFJpZ2h0ICovCisJfQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfZ2V0X3NwZGlmX2Zyb250KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBoaWdoX2xvdyA9IDA7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjc7CisgICAgICAgIHJldHVybiBzbmRfcDE2dl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBoaWdoX2xvdyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3AxNnZfdm9sdW1lX2dldF9zcGRpZl9jZW50ZXJfbGZlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBoaWdoX2xvdyA9IDE7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjc7CisgICAgICAgIHJldHVybiBzbmRfcDE2dl92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBoaWdoX2xvdyk7Cit9CitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9nZXRfc3BkaWZfdW5rbm93bihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgaGlnaF9sb3cgPSAwOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUVfTUlYRVI4OworICAgICAgICByZXR1cm4gc25kX3AxNnZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgaGlnaF9sb3cpOworfQorc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfZ2V0X3NwZGlmX3JlYXIoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMTsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSODsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfZ2V0X2FuYWxvZ19mcm9udChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgaGlnaF9sb3cgPSAwOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUVfTUlYRVI5OworICAgICAgICByZXR1cm4gc25kX3AxNnZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgaGlnaF9sb3cpOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9nZXRfYW5hbG9nX2NlbnRlcl9sZmUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMTsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSOTsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KK3N0YXRpYyBpbnQgc25kX3AxNnZfdm9sdW1lX2dldF9hbmFsb2dfcmVhcihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgaGlnaF9sb3cgPSAxOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUVfTUlYRVIxMDsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9nZXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfZ2V0X2FuYWxvZ191bmtub3duKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBoaWdoX2xvdyA9IDA7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjEwOworICAgICAgICByZXR1cm4gc25kX3AxNnZfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgaGlnaF9sb3cpOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wsIGludCByZWcsIGludCBoaWdoX2xvdykKK3sKKyAgICAgICAgZW11MTBrMV90ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHUzMiB2YWx1ZTsKKyAgICAgICAgdmFsdWUgPSBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKGVtdSwgcmVnLCAwKTsKKyAgICAgICAgLy92YWx1ZSA9IHZhbHVlICYgMHhmZmZmOworCWlmIChoaWdoX2xvdyA9PSAxKSB7CisJCXZhbHVlICY9IDB4ZmZmZjsKKwkgICAgICAgIHZhbHVlID0gdmFsdWUgfCAoKDB4ZmYgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgPDwgMjQpIHwgKCgweGZmIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIDw8IDE2KTsKKwl9IGVsc2UgeworCQl2YWx1ZSAmPSAweGZmZmYwMDAwOworICAgICAgICAJdmFsdWUgPSB2YWx1ZSB8ICgoMHhmZiAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSA8PCA4KSB8ICgoMHhmZiAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKSApOworCX0KKyAgICAgICAgCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgcmVnLCAwLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9wdXRfc3BkaWZfZnJvbnQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSNzsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfcHV0X3NwZGlmX2NlbnRlcl9sZmUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMTsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSNzsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfcHV0X3NwZGlmX3Vua25vd24oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSODsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfcHV0X3NwZGlmX3JlYXIoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMTsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSODsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfcHV0X2FuYWxvZ19mcm9udChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpbnQgaGlnaF9sb3cgPSAwOworCWludCByZWcgPSBQTEFZQkFDS19WT0xVTUVfTUlYRVI5OworICAgICAgICByZXR1cm4gc25kX3AxNnZfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgaGlnaF9sb3cpOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9wdXRfYW5hbG9nX2NlbnRlcl9sZmUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMTsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSOTsKKyAgICAgICAgcmV0dXJuIHNuZF9wMTZ2X3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sLCByZWcsIGhpZ2hfbG93KTsKK30KKworc3RhdGljIGludCBzbmRfcDE2dl92b2x1bWVfcHV0X2FuYWxvZ19yZWFyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWludCBoaWdoX2xvdyA9IDE7CisJaW50IHJlZyA9IFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjEwOworICAgICAgICByZXR1cm4gc25kX3AxNnZfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIHJlZywgaGlnaF9sb3cpOworfQorCitzdGF0aWMgaW50IHNuZF9wMTZ2X3ZvbHVtZV9wdXRfYW5hbG9nX3Vua25vd24oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IGhpZ2hfbG93ID0gMDsKKwlpbnQgcmVnID0gUExBWUJBQ0tfVk9MVU1FX01JWEVSMTA7CisgICAgICAgIHJldHVybiBzbmRfcDE2dl92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCwgcmVnLCBoaWdoX2xvdyk7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3AxNnZfdm9sdW1lX2NvbnRyb2xfYW5hbG9nX2Zyb250ID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIEFuYWxvZyBGcm9udCBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX3AxNnZfdm9sdW1lX2luZm8sCisgICAgICAgIC5nZXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfZ2V0X2FuYWxvZ19mcm9udCwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9wdXRfYW5hbG9nX2Zyb250Cit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ19jZW50ZXJfbGZlID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIEFuYWxvZyBDZW50ZXIvTEZFIFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfcDE2dl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9nZXRfYW5hbG9nX2NlbnRlcl9sZmUsCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfcHV0X2FuYWxvZ19jZW50ZXJfbGZlCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ191bmtub3duID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIEFuYWxvZyBVbmtub3duIFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfcDE2dl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9nZXRfYW5hbG9nX3Vua25vd24sCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfcHV0X2FuYWxvZ191bmtub3duCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ19yZWFyID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIEFuYWxvZyBSZWFyIFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfcDE2dl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9nZXRfYW5hbG9nX3JlYXIsCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfcHV0X2FuYWxvZ19yZWFyCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX3NwZGlmX2Zyb250ID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIFNQRElGIEZyb250IFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfcDE2dl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9nZXRfc3BkaWZfZnJvbnQsCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfcHV0X3NwZGlmX2Zyb250Cit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX3NwZGlmX2NlbnRlcl9sZmUgPQoreworICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgICAgIC5uYW1lID0gICAgICAgICAiSEQgU1BESUYgQ2VudGVyL0xGRSBWb2x1bWUiLAorICAgICAgICAuaW5mbyA9ICAgICAgICAgc25kX3AxNnZfdm9sdW1lX2luZm8sCisgICAgICAgIC5nZXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfZ2V0X3NwZGlmX2NlbnRlcl9sZmUsCisgICAgICAgIC5wdXQgPSAgICAgICAgICBzbmRfcDE2dl92b2x1bWVfcHV0X3NwZGlmX2NlbnRlcl9sZmUKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3AxNnZfdm9sdW1lX2NvbnRyb2xfc3BkaWZfdW5rbm93biA9Cit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJIRCBTUERJRiBVbmtub3duIFZvbHVtZSIsCisgICAgICAgIC5pbmZvID0gICAgICAgICBzbmRfcDE2dl92b2x1bWVfaW5mbywKKyAgICAgICAgLmdldCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9nZXRfc3BkaWZfdW5rbm93biwKKyAgICAgICAgLnB1dCA9ICAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9wdXRfc3BkaWZfdW5rbm93bgorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfcDE2dl92b2x1bWVfY29udHJvbF9zcGRpZl9yZWFyID0KK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAubmFtZSA9ICAgICAgICAgIkhEIFNQRElGIFJlYXIgVm9sdW1lIiwKKyAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9wMTZ2X3ZvbHVtZV9pbmZvLAorICAgICAgICAuZ2V0ID0gICAgICAgICAgc25kX3AxNnZfdm9sdW1lX2dldF9zcGRpZl9yZWFyLAorICAgICAgICAucHV0ID0gICAgICAgICAgc25kX3AxNnZfdm9sdW1lX3B1dF9zcGRpZl9yZWFyCit9OworCitpbnQgc25kX3AxNnZfbWl4ZXIoZW11MTBrMV90ICplbXUpCit7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHNuZF9rY29udHJvbF90ICprY3RsOworICAgICAgICBzbmRfY2FyZF90ICpjYXJkID0gZW11LT5jYXJkOworICAgICAgICBpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX2FuYWxvZ19mcm9udCwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcDE2dl92b2x1bWVfY29udHJvbF9hbmFsb2dfcmVhciwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcDE2dl92b2x1bWVfY29udHJvbF9hbmFsb2dfY2VudGVyX2xmZSwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcDE2dl92b2x1bWVfY29udHJvbF9hbmFsb2dfdW5rbm93biwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcDE2dl92b2x1bWVfY29udHJvbF9zcGRpZl9mcm9udCwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcDE2dl92b2x1bWVfY29udHJvbF9zcGRpZl9yZWFyLCBlbXUpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9wMTZ2X3ZvbHVtZV9jb250cm9sX3NwZGlmX2NlbnRlcl9sZmUsIGVtdSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGlmICgoa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3AxNnZfdm9sdW1lX2NvbnRyb2xfc3BkaWZfdW5rbm93biwgZW11KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuaCBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTMyMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5oCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICBEcml2ZXIgcDE2diBjaGlwcworICogIFZlcnNpb246IDAuMjEKKyAqCisgKiAgRkVBVFVSRVMgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAqICAgIE91dHB1dCBmaXhlZCBhdCBTMzJfTEUsIDIgY2hhbm5lbCB0byBodzowLDAKKyAqICAgIFJhdGVzOiA0NC4xLCA0OCwgOTYsIDE5Mi4KKyAqCisgKiAgQ2hhbmdlbG9nOgorICogIDAuOAorICogICAgVXNlIHNlcGFyYXRlIGNhcmQgYmFzZWQgYnVmZmVyIGZvciBwZXJpb2RzIHRhYmxlLgorICogIDAuOQorICogICAgVXNlIDIgY2hhbm5lbCBvdXRwdXQgc3RyZWFtcyBpbnN0ZWFkIG9mIDggY2hhbm5lbC4KKyAqICAgICAgICg4IGNoYW5uZWwgb3V0cHV0IHN0cmVhbXMgbWlnaHQgYmUgZ29vZCBmb3IgQVNJTyB0eXBlIG91dHB1dCkKKyAqICAgIENvcnJlY3RlZCBzcGVha2VyIG91dHB1dCwgc28gRnJvbnQgLT4gRnJvbnQgZXRjLgorICogIDAuMTAKKyAqICAgIEZpeGVkIG1pc3NlZCBpbnRlcnJ1cHRzLgorICogIDAuMTEKKyAqICAgIEFkZCBTb3VuZCBjYXJkIG1vZGVsIG51bWJlciBhbmQgbmFtZXMuCisgKiAgICBBZGQgQW5hbG9nIHZvbHVtZSBjb250cm9scy4KKyAqICAwLjEyCisgKiAgICBDb3JyZWN0ZWQgcGxheWJhY2sgaW50ZXJydXB0cy4gTm93IGludGVycnVwdCBwZXIgcGVyaW9kLCBpbnN0ZWFkIG9mIGhhbGYgcGVyaW9kLgorICogIDAuMTMKKyAqICAgIFVzZSBzaW5nbGUgdHJpZ2dlciBmb3IgbXVsdGljaGFubmVsLgorICogIDAuMTQKKyAqICAgIE1pYyBjYXB0dXJlIG5vdyB3b3JrcyBhdCBmaXhlZDogUzMyX0xFLCA5NjAwMEh6LCBTdGVyZW8uCisgKiAgMC4xNQorICogICAgRm9yY2UgYnVmZmVyX3NpemUgLyBwZXJpb2Rfc2l6ZSA9PSBJTlRFR0VSLgorICogIDAuMTYKKyAqICAgIFVwZGF0ZSBwMTZ2LmMgdG8gd29yayB3aXRoIGNoYW5nZWQgYWxzYSBhcGkuCisgKiAgMC4xNworICogICAgVXBkYXRlIHAxNnYuYyB0byB3b3JrIHdpdGggY2hhbmdlZCBhbHNhIGFwaS4gUmVtb3ZlZCBib290X2RldnMuCisgKiAgMC4xOAorICogICAgTWVyZ2luZyB3aXRoIHNuZC1lbXUxMGsxIGRyaXZlci4KKyAqICAwLjE5CisgKiAgICBPbmUgc3RlcmVvIGNoYW5uZWwgYXQgMjRiaXQgbm93IHdvcmtzLgorICogIDAuMjAKKyAqICAgIEFkZGVkIGJldHRlciByZWdpc3RlciBkZWZpbmVzLgorICogIDAuMjEKKyAqICAgIFNwbGl0IGZyb20gcDE2di5jCisgKgorICoKKyAqICBCVUdTOgorICogICAgU29tZSBzdGFiaWxpdHkgcHJvYmxlbXMgd2hlbiB1bmxvYWRpbmcgdGhlIHNuZC1wMTZ2IGtlcm5lbCBtb2R1bGUuCisgKiAgICAtLQorICoKKyAqICBUT0RPOgorICogICAgU1BESUYgb3V0LgorICogICAgRmluZCBvdXQgaG93IHRvIGNoYW5nZSBjYXB0dXJlIHNhbXBsZSByYXRlcy4gRS5nLiBUbyByZWNvcmQgU1BESUYgYXQgNDgwMDBIei4KKyAqICAgIEN1cnJlbnRseSBjYXB0dXJlIGZpeGVkIGF0IDQ4MDAwSHouCisgKgorICogICAgLS0KKyAqICBHRU5FUkFMIElORk86CisgKiAgICBNb2RlbDogU0IwMjQwCisgKiAgICBQMTZWIENoaXA6IENBMDE1MS1EQlMKKyAqICAgIEF1ZGlneSAyIENoaXA6IENBMDEwMi1JQVQKKyAqICAgIEFDOTcgQ29kZWM6IFNUQUMgOTcyMQorICogICAgQURDOiBQaGlsaXBzIDEzNjFUIChTdGVyZW8gMjRiaXQpCisgKiAgICBEQUM6IENTNDM4Mi1LICg4LWNoYW5uZWwsIDI0Yml0LCAxOTJLaHopCisgKgorICogIFRoaXMgY29kZSB3YXMgaW5pdGFsbHkgYmFzZWQgb24gY29kZSBmcm9tIEFMU0EncyBlbXUxMGsxeC5jIHdoaWNoIGlzOgorICogIENvcHlyaWdodCAoYykgYnkgRnJhbmNpc2NvIE1vcmFlcyA8Zm1vcmFlc0BuYy5yci5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBdWRpZ3kyIFAxNlYgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBQVFIyIGFuZCBEQVRBMiByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiBUaGUgc2FtcGxlIHJhdGUgb2YgdGhlIFNQRElGIG91dHB1dHMgaXMgc2V0IGJ5IG1vZGlmeWluZyBhIHJlZ2lzdGVyIGluIHRoZSBFTVUxMEsyIFBUUiByZWdpc3RlciBBX1NQRElGX1NBTVBMRVJBVEUuCisgKiBUaGUgc2FtcGxlIHJhdGUgaXMgYWxzbyBjb250cm9sbGVkIGJ5IHRoZSBzYW1lIHJlZ2lzdGVycyB0aGF0IGNvbnRyb2wgdGhlIHJhdGUgb2YgdGhlIEVNVTEwSzIgc2FtcGxlIHJhdGUgY29udmVydGVycy4KKyAqLworCisvKiBJbml0YWxseSBhbGwgcmVnaXN0ZXJzIGZyb20gMHgwMCB0byAweDNmIGhhdmUgemVybyBjb250ZW50cy4gKi8KKyNkZWZpbmUgUExBWUJBQ0tfTElTVF9BRERSCTB4MDAJCS8qIEJhc2UgRE1BIGFkZHJlc3Mgb2YgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIGVhY2ggcGVyaW9kL3NpemUgKi8KKwkJCQkJCS8qIE9uZSBsaXN0IGVudHJ5OiA0IGJ5dGVzIGZvciBETUEgYWRkcmVzcywgCisJCQkJCQkgKiA0IGJ5dGVzIGZvciBwZXJpb2Rfc2l6ZSA8PCAxNi4KKwkJCQkJCSAqIE9uZSBsaXN0IGVudHJ5IGlzIDggYnl0ZXMgbG9uZy4KKwkJCQkJCSAqIE9uZSBsaXN0IGVudHJ5IGZvciBlYWNoIHBlcmlvZCBpbiB0aGUgYnVmZmVyLgorCQkJCQkJICovCisjZGVmaW5lIFBMQVlCQUNLX0xJU1RfU0laRQkweDAxCQkvKiBTaXplIG9mIGxpc3QgaW4gYnl0ZXMgPDwgMTYuIEUuZy4gOCBwZXJpb2RzIC0+IDB4MDAzODAwMDAgICovCisjZGVmaW5lIFBMQVlCQUNLX0xJU1RfUFRSCTB4MDIJCS8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcGVyaW9kIGJlaW5nIHBsYXllZCAqLworI2RlZmluZSBQTEFZQkFDS19VTktOT1dOMwkweDAzCQkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBQTEFZQkFDS19ETUFfQUREUgkweDA0CQkvKiBQbGF5YmFjayBETUEgYWRkcmVzc3MgKi8KKyNkZWZpbmUgUExBWUJBQ0tfUEVSSU9EX1NJWkUJMHgwNQkJLyogUGxheWJhY2sgcGVyaW9kIHNpemUuIHdpbjIwMDAgdXNlcyAweDA0MDAwMDAwICovCisjZGVmaW5lIFBMQVlCQUNLX1BPSU5URVIJMHgwNgkJLyogUGxheWJhY2sgcGVyaW9kIHBvaW50ZXIuIFVzZWQgd2l0aCBQTEFZQkFDS19MSVNUX1BUUiB0byBkZXRlcm1pbmUgYnVmZmVyIHBvc2l0aW9uIGN1cnJlbnRseSBpbiBEQUMgKi8KKyNkZWZpbmUgUExBWUJBQ0tfRklGT19FTkRfQUREUkVTUwkweDA3CQkvKiBQbGF5YmFjayBGSUZPIGVuZCBhZGRyZXNzICovCisjZGVmaW5lIFBMQVlCQUNLX0ZJRk9fUE9JTlRFUgkweDA4CQkvKiBQbGF5YmFjayBGSUZPIHBvaW50ZXIgYW5kIG51bWJlciBvZiB2YWxpZCBzb3VuZCBzYW1wbGVzIGluIGNhY2hlICovCisjZGVmaW5lIFBMQVlCQUNLX1VOS05PV045CTB4MDkJCS8qIE5vdCB1c2VkICovCisjZGVmaW5lIENBUFRVUkVfRE1BX0FERFIJMHgxMAkJLyogQ2FwdHVyZSBETUEgYWRkcmVzcyAqLworI2RlZmluZSBDQVBUVVJFX0JVRkZFUl9TSVpFCTB4MTEJCS8qIENhcHR1cmUgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgQ0FQVFVSRV9QT0lOVEVSCQkweDEyCQkvKiBDYXB0dXJlIGJ1ZmZlciBwb2ludGVyLiBTYW1wbGUgY3VycmVudGx5IGluIEFEQyAqLworI2RlZmluZSBDQVBUVVJFX0ZJRk9fUE9JTlRFUgkweDEzCQkvKiBDYXB0dXJlIEZJRk8gcG9pbnRlciBhbmQgbnVtYmVyIG9mIHZhbGlkIHNvdW5kIHNhbXBsZXMgaW4gY2FjaGUgKi8KKyNkZWZpbmUgQ0FQVFVSRV9QMTZWX1ZPTFVNRTEJMHgxNAkJLyogTG93OiBDYXB0dXJlIHZvbHVtZSAweFhYWFgzMDMwICovCisjZGVmaW5lIENBUFRVUkVfUDE2Vl9WT0xVTUUyCTB4MTUJCS8qIEhpZ2g6SGFzIG5vIGVmZmVjdCBvbiBjYXB0dXJlIHZvbHVtZSAqLworI2RlZmluZSBDQVBUVVJFX1AxNlZfU09VUkNFICAgICAweDE2ICAgICAgICAgICAgLyogUDE2ViBzb3VyY2Ugc2VsZWN0LiBTZXQgdG8gMHgwNzAwRTRFNSBmb3IgQUM5NyBDQVBUVVJFICovCisJCQkJCQkvKiBbMDoxXSBDYXB0dXJlIGlucHV0IDAgY2hhbm5lbCBzZWxlY3QuIDAgPSBDYXB0dXJlIG91dHB1dCAwLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gQ2FwdHVyZSBvdXRwdXQgMS4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IENhcHR1cmUgb3V0cHV0IDIuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSBDYXB0dXJlIG91dHB1dCAzLgorCQkJCQkJICogWzM6Ml0gQ2FwdHVyZSBpbnB1dCAxIGNoYW5uZWwgc2VsZWN0LiAwID0gQ2FwdHVyZSBvdXRwdXQgMC4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IENhcHR1cmUgb3V0cHV0IDEuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBDYXB0dXJlIG91dHB1dCAyLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gQ2FwdHVyZSBvdXRwdXQgMy4KKwkJCQkJCSAqIFs1OjRdIENhcHR1cmUgaW5wdXQgMiBjaGFubmVsIHNlbGVjdC4gMCA9IENhcHR1cmUgb3V0cHV0IDAuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBDYXB0dXJlIG91dHB1dCAxLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gQ2FwdHVyZSBvdXRwdXQgMi4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IENhcHR1cmUgb3V0cHV0IDMuCisJCQkJCQkgKiBbNzo2XSBDYXB0dXJlIGlucHV0IDMgY2hhbm5lbCBzZWxlY3QuIDAgPSBDYXB0dXJlIG91dHB1dCAwLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gQ2FwdHVyZSBvdXRwdXQgMS4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IENhcHR1cmUgb3V0cHV0IDIuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSBDYXB0dXJlIG91dHB1dCAzLgorCQkJCQkJICogWzk6OF0gUGxheWJhY2sgaW5wdXQgMCBjaGFubmVsIHNlbGVjdC4gMCA9IFBsYXkgb3V0cHV0IDAuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUGxheSBvdXRwdXQgMS4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBQbGF5IG91dHB1dCAyLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IFBsYXkgb3V0cHV0IDMuCisJCQkJCQkgKiBbMTE6MTBdIFBsYXliYWNrIGlucHV0IDEgY2hhbm5lbCBzZWxlY3QuIDAgPSBQbGF5IG91dHB1dCAwLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUGxheSBvdXRwdXQgMS4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IFBsYXkgb3V0cHV0IDIuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSBQbGF5IG91dHB1dCAzLgorCQkJCQkJICogWzEzOjEyXSBQbGF5YmFjayBpbnB1dCAyIGNoYW5uZWwgc2VsZWN0LiAwID0gUGxheSBvdXRwdXQgMC4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFBsYXkgb3V0cHV0IDEuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBQbGF5IG91dHB1dCAyLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gUGxheSBvdXRwdXQgMy4KKwkJCQkJCSAqIFsxNToxNF0gUGxheWJhY2sgaW5wdXQgMyBjaGFubmVsIHNlbGVjdC4gMCA9IFBsYXkgb3V0cHV0IDAuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBQbGF5IG91dHB1dCAxLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gUGxheSBvdXRwdXQgMi4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IFBsYXkgb3V0cHV0IDMuCisJCQkJCQkgKiBbMTk6MTZdIFBsYXliYWNrIG1peGVyIG91dHB1dCBlbmFibGUuIDEgYml0IHBlciBjaGFubmVsLgorCQkJCQkJICogWzIzOjIwXSBDYXB0dXJlIG1peGVyIG91dHB1dCBlbmFibGUuIDEgYml0IHBlciBjaGFubmVsLgorCQkJCQkJICogWzI2OjI0XSBGWCBlbmdpbmUgY2hhbm5lbCBjYXB0dXJlIDAgPSAweDYwLTB4NjcuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IDB4NjgtMHg2Zi4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gMHg3MC0weDc3LgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSAweDc4LTB4N2YuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDB4ODAtMHg4Ny4KKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ID0gMHg4OC0weDhmLgorCQkJCQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgPSAweDkwLTB4OTcuCisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyA9IDB4OTgtMHg5Zi4KKwkJCQkJCSAqIFszMToyN10gTm90IHVzZWQuCisJCQkJCQkgKi8KKworCQkJCQkJLyogMHgxID0gY2FwdHVyZSBvbi4KKwkJCQkJCSAqIDB4MTAwID0gY2FwdHVyZSBvZmYuCisJCQkJCQkgKiAweDIwMCA9IGNhcHR1cmUgb2ZmLgorCQkJCQkJICogMHgxMDAwID0gY2FwdHVyZSBvZmYuCisJCQkJCQkgKi8KKyNkZWZpbmUgQ0FQVFVSRV9SQVRFX1NUQVRVUwkJMHgxNwkJLyogQ2FwdHVyZSBzYW1wbGUgcmF0ZS4gUmVhZCBvbmx5ICovCisJCQkJCQkvKiBbMTU6MF0gTm90IHVzZWQuCisJCQkJCQkgKiBbMTg6MTZdIENoYW5uZWwgMCBEZXRlY3RlZCBzYW1wbGUgcmF0ZS4gMCAtIDQ0LjFraHoKKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSA0OCBraHoKKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSA5NiBraHoKKwkJCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSAxOTIga2h6CisJCQkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IC0gdW5kZWZpbmVkIHJhdGUuCisJCQkJCQkgKiBbMTldIENoYW5uZWwgMC4gMSAtIFZhbGlkLCAwIC0gTm90IFZhbGlkLgorCQkJCQkJICogWzIyOjIwXSBDaGFubmVsIDEgRGV0ZWN0ZWQgc2FtcGxlIHJhdGUuIAorCQkJCQkJICogWzIzXSBDaGFubmVsIDEuIDEgLSBWYWxpZCwgMCAtIE5vdCBWYWxpZC4KKwkJCQkJCSAqIFsyNjoyNF0gQ2hhbm5lbCAyIERldGVjdGVkIHNhbXBsZSByYXRlLiAKKwkJCQkJCSAqIFsyN10gQ2hhbm5lbCAyLiAxIC0gVmFsaWQsIDAgLSBOb3QgVmFsaWQuCisJCQkJCQkgKiBbMzA6MjhdIENoYW5uZWwgMyBEZXRlY3RlZCBzYW1wbGUgcmF0ZS4gCisJCQkJCQkgKiBbMzFdIENoYW5uZWwgMy4gMSAtIFZhbGlkLCAwIC0gTm90IFZhbGlkLgorCQkJCQkJICovCisvKiAweDE4IC0gMHgxZiB1bnVzZWQgKi8KKyNkZWZpbmUgUExBWUJBQ0tfTEFTVF9TQU1QTEUgICAgMHgyMAkJLyogVGhlIHNhbXBsZSBjdXJyZW50bHkgYmVpbmcgcGxheWVkLiBSZWFkIG9ubHkgKi8KKy8qIDB4MjEgLSAweDNmIHVudXNlZCAqLworI2RlZmluZSBCQVNJQ19JTlRFUlJVUFQgICAgICAgICAweDQwCQkvKiBVc2VkIGJ5IGJvdGggcGxheWJhY2sgYW5kIGNhcHR1cmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJCQkJCS8qIFBsYXliYWNrICgweDE8PGNoYW5uZWxfaWQpIERvbid0IHRvdWNoIGhpZ2ggMTZiaXRzLiAqLworCQkJCQkJLyogQ2FwdHVyZSAgKDB4MTAwPDxjaGFubmVsX2lkKS4gbm90IHRlc3RlZCAqLworCQkJCQkJLyogU3RhcnQgUGxheWJhY2sgWzM6MF0gKG9uZSBiaXQgcGVyIGNoYW5uZWwpCisJCQkJCQkgKiBTdGFydCBDYXB0dXJlIFsxMTo4XSAob25lIGJpdCBwZXIgY2hhbm5lbCkKKwkJCQkJCSAqIFJlY29yZCBzb3VyY2Ugc2VsZWN0IGZvciBjaGFubmVsIDAgWzE4OjE2XQorCQkJCQkJICogUmVjb3JkIHNvdXJjZSBzZWxlY3QgZm9yIGNoYW5uZWwgMSBbMjI6MjBdCisJCQkJCQkgKiBSZWNvcmQgc291cmNlIHNlbGVjdCBmb3IgY2hhbm5lbCAyIFsyNjoyNF0KKwkJCQkJCSAqIFJlY29yZCBzb3VyY2Ugc2VsZWN0IGZvciBjaGFubmVsIDMgWzMwOjI4XQorCQkJCQkJICogMCAtIFNQRElGIGNoYW5uZWwuCisJCQkJCQkgKiAxIC0gSTJTIGNoYW5uZWwuCisJCQkJCQkgKiAyIC0gU1JDNDggY2hhbm5lbC4KKwkJCQkJCSAqIDMgLSBTUkNNdWx0aV9TUERJRiBjaGFubmVsLgorCQkJCQkJICogNCAtIFNSQ011bHRpX0kyUyBjaGFubmVsLgorCQkJCQkJICogNSAtIFNQRElGIGNoYW5uZWwuCisJCQkJCQkgKiA2IC0gZnhlbmdpbmUgY2FwdHVyZS4KKwkJCQkJCSAqIDcgLSBBQzk3IGNhcHR1cmUuCisJCQkJCQkgKi8KKwkJCQkJCS8qIERlZmF1bHQgNDExMTAwMDAuCisJCQkJCQkgKiBXcml0aW5nIDB4ZmZmZmZmZmYgaGFuZ3MgdGhlIFBDLgorCQkJCQkJICogV3JpdGluZyAweGZmZmYwMDAwIC0+IDc3NzcwMDAwIHNvIGl0IG11c3QgYmUgc29tZSBzb3J0IG9mIHJvdXRlLgorCQkJCQkJICogYml0IDB4MSBzdGFydHMgRE1BIHBsYXliYWNrIG9uIGNoYW5uZWxfaWQgMAorCQkJCQkJICovCisvKiAweDQxLDQyIHRha2UgdmFsdWVzIGZyb20gMCAtIDB4ZmZmZmZmZmYsIGJ1dCBoYXZlIG5vIGVmZmVjdCBvbiBwbGF5YmFjayAqLworLyogMHg0MywweDQ4IGRvIG5vdCByZW1lbWJlciBzZXR0aW5ncyAqLworLyogMHg0MS00NSB1bnVzZWQgKi8KKyNkZWZpbmUgV0FURVJNQVJLICAgICAgICAgICAgMHg0NgkJLyogVGVzdCBiaXQgdG8gaW5kaWNhdGUgY2FjaGUgbGV2ZWwgdXNhZ2UgKi8KKwkJCQkJCS8qIFZhbHVlcyBpdCBjYW4gaGF2ZSB3aGlsZSBwbGF5aW5nIG9uIGNoYW5uZWwgMC4gCisJCQkJCQkgKiAwMDAwZjAwMCwgMDAwMGYwMDQsIDAwMDBmMDA4LCAwMDAwZjAwYy4KKwkJCQkJCSAqIFJlYWRvbmx5LgorCQkJCQkJICovCisvKiAweDQ3LTB4NGYgdW51c2VkICovCisvKiAweDUwLTB4NWYgQ2FwdHVyZSBjYWNoZSBkYXRhICovCisjZGVmaW5lIFNSQ1NlbAkJCTB4NjAgICAgICAgICAgICAvKiBTUkNTZWwuIERlZmF1bHQgMHg0LiBCeXBhc3MgUDE2ViAweDE0ICovCisJCQkJCQkvKiBbMF0gMCA9IDEwSzIgYXVkaW8sIDEgPSBTUkM0OCBtaXhlciBvdXRwdXQuCisJCQkJCQkgKiBbMl0gMCA9IDEwSzIgYXVkaW8sIDEgPSBTUkNNdWx0aSBTUERJRiBtaXhlciBvdXRwdXQuCisJCQkJCQkgKiBbNF0gMCA9IDEwSzIgYXVkaW8sIDEgPSBTUkNNdWx0aSBJMlMgbWl4ZXIgb3V0cHV0LgorCQkJCQkJICovCisJCQkJCQkvKiBTUkM0OCBjb252ZXJ0cyBzYW1wbGVzIHJhdGVzIDQ0LjEsIDQ4LCA5NiwgMTkyIHRvIDQ4IGtoei4gKi8KKwkJCQkJCS8qIFNSQ011bHRpIGNvbnZlcnRzIDQ4a2h6IHNhbXBsZXMgcmF0ZXMgdG8gNDQuMSwgNDgsIDk2LCAxOTIgdG8gNDguICovCisJCQkJCQkvKiBTUkM0OCBhbmQgU1JDTVVMVEkgc2FtcGxlIHJhdGUgc2VsZWN0IGFuZCBvdXRwdXQgc2VsZWN0LiAqLworCQkJCQkJLyogMHhmZmZmZmZmZiAtPiAweEMwMDAwMDE1CisJCQkJCQkgKiAweFhYWFhYWFg0ID0gRW5hYmxlIEZyb250IExlZnQvUmlnaHQKKwkJCQkJCSAqIEVuYWJsZSBQQ01zCisJCQkJCQkgKi8KKworLyogMHg2MSAtPiAweDZjIGFyZSBWb2x1bWUgY29udHJvbHMgKi8KKyNkZWZpbmUgUExBWUJBQ0tfVk9MVU1FX01JWEVSMSAgMHg2MQkJLyogU1JDNDggTG93IHRvIG1peGVyIGlucHV0IHZvbHVtZSBjb250cm9sLiAqLworI2RlZmluZSBQTEFZQkFDS19WT0xVTUVfTUlYRVIyICAweDYyCQkvKiBTUkM0OCBIaWdoIHRvIG1peGVyIGlucHV0IHZvbHVtZSBjb250cm9sLiAqLworI2RlZmluZSBQTEFZQkFDS19WT0xVTUVfTUlYRVIzICAweDYzCQkvKiBTUkNNVUxUSSBTUERJRiBMb3cgdG8gbWl4ZXIgaW5wdXQgdm9sdW1lIGNvbnRyb2wuICovCisjZGVmaW5lIFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjQgIDB4NjQJCS8qIFNSQ01VTFRJIFNQRElGIEhpZ2ggdG8gbWl4ZXIgaW5wdXQgdm9sdW1lIGNvbnRyb2wuICovCisjZGVmaW5lIFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjUgIDB4NjUJCS8qIFNSQ01VTFRJIEkyUyBMb3cgdG8gbWl4ZXIgaW5wdXQgdm9sdW1lIGNvbnRyb2wuICovCisjZGVmaW5lIFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjYgIDB4NjYJCS8qIFNSQ01VTFRJIEkyUyBIaWdoIHRvIG1peGVyIGlucHV0IHZvbHVtZSBjb250cm9sLiAqLworI2RlZmluZSBQTEFZQkFDS19WT0xVTUVfTUlYRVI3ICAweDY3CQkvKiBQMTZWIExvdyB0byBTUkNNVUxUSSBTUERJRiBtaXhlciBpbnB1dCB2b2x1bWUgY29udHJvbC4gKi8KKyNkZWZpbmUgUExBWUJBQ0tfVk9MVU1FX01JWEVSOCAgMHg2OAkJLyogUDE2ViBIaWdoIHRvIFNSQ01VTFRJIFNQRElGIG1peGVyIGlucHV0IHZvbHVtZSBjb250cm9sLiAqLworI2RlZmluZSBQTEFZQkFDS19WT0xVTUVfTUlYRVI5ICAweDY5CQkvKiBQMTZWIExvdyB0byBTUkNNVUxUSSBJMlMgbWl4ZXIgaW5wdXQgdm9sdW1lIGNvbnRyb2wuICovCisJCQkJCQkvKiAweFhYWFgzMDMwID0gUENNMCBWb2x1bWUgKEZyb250KS4KKwkJCQkJCSAqIDB4MzAzMFhYWFggPSBQQ00xIFZvbHVtZSAoQ2VudGVyKQorCQkJCQkJICovCisjZGVmaW5lIFBMQVlCQUNLX1ZPTFVNRV9NSVhFUjEwICAweDZhCQkvKiBQMTZWIEhpZ2ggdG8gU1JDTVVMVEkgSTJTIG1peGVyIGlucHV0IHZvbHVtZSBjb250cm9sLiAqLworCQkJCQkJLyogMHgzMDMwWFhYWCA9IFBDTTMgVm9sdW1lIChSZWFyKS4gKi8KKyNkZWZpbmUgUExBWUJBQ0tfVk9MVU1FX01JWEVSMTEgIDB4NmIJCS8qIEUxMEsyIExvdyB0byBTUkM0OCBtaXhlciBpbnB1dCB2b2x1bWUgY29udHJvbC4gKi8KKyNkZWZpbmUgUExBWUJBQ0tfVk9MVU1FX01JWEVSMTIgMHg2YwkJLyogRTEwSzIgSGlnaCB0byBTUkM0OCBtaXhlciBpbnB1dCB2b2x1bWUgY29udHJvbC4gKi8KKworI2RlZmluZSBTUkM0OF9FTkFCTEUgICAgICAgICAgICAweDZkICAgICAgICAgICAgLyogU1JDNDggaW5wdXQgYXVkaW8gZW5hYmxlICovCisJCQkJCQkvKiBTUkM0OCBjb252ZXJ0cyBzYW1wbGVzIHJhdGVzIDQ0LjEsIDQ4LCA5NiwgMTkyIHRvIDQ4IGtoei4gKi8KKwkJCQkJCS8qIFsyMzoxNl0gVGhlIGNvcnJlc3BvbmRpbmcgUDE2ViBjaGFubmVsIHRvIFNSQzQ4IGVuYWJsZWQgaWYgPT0gMS4KKwkJCQkJCSAqIFszMToyNF0gVGhlIGNvcnJlc3BvbmRpbmcgRTEwSzIgY2hhbm5lbCB0byBTUkM0OCBlbmFibGVkLgorCQkJCQkJICovCisjZGVmaW5lIFNSQ01VTFRJX0VOQUJMRSAgICAgICAgIDB4NmUgICAgICAgICAgICAvKiBTUkNNdWx0aSBpbnB1dCBhdWRpbyBlbmFibGUuIERlZmF1bHQgMHhmZmZmZmZmZiAqLworCQkJCQkJLyogU1JDTXVsdGkgY29udmVydHMgNDhraHogc2FtcGxlcyByYXRlcyB0byA0NC4xLCA0OCwgOTYsIDE5MiB0byA0OC4gKi8KKwkJCQkJCS8qIFs3OjBdIFRoZSBjb3JyZXNwb25kaW5nIFAxNlYgY2hhbm5lbCB0byBTUkNNdWx0aV9JMlMgZW5hYmxlZCBpZiA9PSAxLgorCQkJCQkJICogWzE1OjhdIFRoZSBjb3JyZXNwb25kaW5nIEUxMEsyIGNoYW5uZWwgdG8gU1JDTXVsdGkgSTJTIGVuYWJsZWQuCisJCQkJCQkgKiBbMjM6MTZdIFRoZSBjb3JyZXNwb25kaW5nIFAxNlYgY2hhbm5lbCB0byBTUkNNdWx0aSBTUERJRiBlbmFibGVkLgorCQkJCQkJICogWzMxOjI0XSBUaGUgY29ycmVzcG9uZGluZyBFMTBLMiBjaGFubmVsIHRvIFNSQ011bHRpIFNQRElGIGVuYWJsZWQuCisJCQkJCQkgKi8KKwkJCQkJCS8qIEJ5cGFzcyBQMTZWIDB4ZmYwMGZmMDAgCisJCQkJCQkgKiBCaXRtYXAuIDAgPSBPZmYsIDEgPSBPbi4KKwkJCQkJCSAqIFAxNlYgcGxheWJhY2sgb3V0cHV0czoKKwkJCQkJCSAqIDB4WFhYWFhYWDEgPSBQQ00wIExlZnQuIChGcm9udCkKKwkJCQkJCSAqIDB4WFhYWFhYWDIgPSBQQ00wIFJpZ2h0LgorCQkJCQkJICogMHhYWFhYWFhYNCA9IFBDTTEgTGVmdC4gKENlbnRlci9MRkUpCisJCQkJCQkgKiAweFhYWFhYWFg4ID0gUENNMSBSaWdodC4KKwkJCQkJCSAqIDB4WFhYWFhYMVggPSBQQ00yIExlZnQuIChVbmtub3duKQorCQkJCQkJICogMHhYWFhYWFgyWCA9IFBDTTIgUmlnaHQuCisJCQkJCQkgKiAweFhYWFhYWDRYID0gUENNMyBMZWZ0LiAoUmVhcikKKwkJCQkJCSAqIDB4WFhYWFhYOFggPSBQQ00zIFJpZ2h0LgorCQkJCQkJICovCisjZGVmaW5lIEFVRElPX09VVF9FTkFCTEUgICAgICAgIDB4NmYgICAgICAgICAgICAvKiBEZWZhdWx0OiAwMDAxMDBGRiAqLworCQkJCQkJLyogWzM6MF0gRG9lcyBzb21ldGhpbmcsIGJ1dCBub3QgZG9jdW1lbnRlZC4gUHJvYmFibHkgY2FwdHVyZSBlbmFibGUuCisJCQkJCQkgKiBbNzo0XSBQbGF5YmFjayBjaGFubmVscyBlbmFibGUuIG5vdCBkb2N1bWVudGVkLgorCQkJCQkJICogWzE2XSBBQzk3IG91dHB1dCBlbmFibGUgaWYgPT0gMQorCQkJCQkJICogWzMwXSAwID0gU1JDTXVsdGlfSTJTIGlucHV0IGZyb20gZnhlbmdpbmUgMHg2OC0weDZmLgorCQkJCQkJICogICAgICAxID0gU1JDTXVsdGlfSTJTIGlucHV0IGZyb20gU1JDNDggb3V0cHV0LgorCQkJCQkJICogWzMxXSAwID0gU1JDTXVsdGlfU1BESUYgaW5wdXQgZnJvbSBmeGVuZ2luZSAweDYwLTB4NjcuCisJCQkJCQkgKiAgICAgIDEgPSBTUkNNdWx0aV9TUERJRiBpbnB1dCBmcm9tIFNSQzQ4IG91dHB1dC4KKwkJCQkJCSAqLworCQkJCQkJLyogMHhmZmZmZmZmZiAtPiBDMDAxMDBGRiAqLworCQkJCQkJLyogMCAtPiBOb3QgcGxheWJhY2sgc291bmQsIGlycSBzdGlsbCBydW5uaW5nICovCisJCQkJCQkvKiAweFhYWFhYWDEwID0gUENNMCBMZWZ0L1JpZ2h0IE9uLiAoRnJvbnQpCisJCQkJCQkgKiAweFhYWFhYWDIwID0gUENNMSBMZWZ0L1JpZ2h0IE9uLiAoQ2VudGVyL0xGRSkKKwkJCQkJCSAqIDB4WFhYWFhYNDAgPSBQQ00yIExlZnQvUmlnaHQgT24uIChVbmtub3duKQorCQkJCQkJICogMHhYWFhYWFg4MCA9IFBDTTMgTGVmdC9SaWdodCBPbi4gKFJlYXIpCisJCQkJCQkgKi8KKyNkZWZpbmUgUExBWUJBQ0tfU1BESUZfU0VMRUNUICAgICAweDcwICAgICAgICAgIC8qIERlZmF1bHQ6IDEyMDMwRjAwICovCisJCQkJCQkvKiAweGZmZmZmZmZmIC0+IDNGRjMwRkZGICovCisJCQkJCQkvKiAweDAwMDAwMDAxIHBhdXNlcyBzdHJlYW0vaXJxIGZhaWwuICovCisJCQkJCQkvKiBBbGwgb3RoZXIgYml0cyBkbyBub3QgZWZmZWN0IHBsYXliYWNrICovCisjZGVmaW5lIFBMQVlCQUNLX1NQRElGX1NSQ19TRUxFQ1QgMHg3MSAgICAgICAgICAvKiBEZWZhdWx0OiAwMDAwRTRFNCAqLworCQkJCQkJLyogMHhmZmZmZmZmZiAtPiBGMzNGRkZGRiAqLworCQkJCQkJLyogQWxsIGJpdHMgZG8gbm90IGVmZmVjdCBwbGF5YmFjayAqLworI2RlZmluZSBQTEFZQkFDS19TUERJRl9VU0VSX0RBVEEwIDB4NzIJCS8qIFNQRElGIG91dCB1c2VyIGRhdGEgMCAqLworI2RlZmluZSBQTEFZQkFDS19TUERJRl9VU0VSX0RBVEExIDB4NzMJCS8qIFNQRElGIG91dCB1c2VyIGRhdGEgMSAqLworLyogMHg3NC0weDc1IHVua25vd24gKi8KKyNkZWZpbmUgQ0FQVFVSRV9TUERJRl9DT05UUk9MCTB4NzYJCS8qIFNQRElGIGluIGNvbnRyb2wgc2V0dGluZyAqLworI2RlZmluZSBDQVBUVVJFX1NQRElGX1NUQVRVUwkweDc3CQkvKiBTUERJRiBpbiBzdGF0dXMgKi8KKyNkZWZpbmUgQ0FQVVJFX1NQRElGX1VTRVJfREFUQTAgMHg3OAkJLyogU1BESUYgaW4gdXNlciBkYXRhIDAgKi8KKyNkZWZpbmUgQ0FQVVJFX1NQRElGX1VTRVJfREFUQTEgMHg3OQkJLyogU1BESUYgaW4gdXNlciBkYXRhIDEgKi8KKyNkZWZpbmUgQ0FQVVJFX1NQRElGX1VTRVJfREFUQTIgMHg3YQkJLyogU1BESUYgaW4gdXNlciBkYXRhIDIgKi8KKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvdGltZXIuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlMzY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3RpbWVyLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IExlZSBSZXZlbGwgPHJscmV2ZWxsQGpvZS1qb2IuY29tPgorICogICAgICAgICAgICAgICAgICAgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcworICoKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfdGltZXJfc3RhcnQoc25kX3RpbWVyX3QgKnRpbWVyKQoreworCWVtdTEwazFfdCAqZW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGRlbGF5OworCisJZW11ID0gc25kX3RpbWVyX2NoaXAodGltZXIpOworCWRlbGF5ID0gdGltZXItPnN0aWNrcyAtIDE7CisJaWYgKGRlbGF5IDwgNSApIC8qIG1pbmltdW0gdGltZSBpcyA1IHRpY2tzICovCisJCWRlbGF5ID0gNTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF9lbXUxMGsxX2ludHJfZW5hYmxlKGVtdSwgSU5URV9JTlRFUlZBTFRJTUVSRU5CKTsKKwlvdXR3KGRlbGF5ICYgVElNRVJfUkFURV9NQVNLLCBlbXUtPnBvcnQgKyBUSU1FUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3RpbWVyX3N0b3Aoc25kX3RpbWVyX3QgKnRpbWVyKQoreworCWVtdTEwazFfdCAqZW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbXUgPSBzbmRfdGltZXJfY2hpcCh0aW1lcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTBrMV90aW1lcl9wcmVjaXNlX3Jlc29sdXRpb24oc25kX3RpbWVyX3QgKnRpbWVyLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbnVtLCB1bnNpZ25lZCBsb25nICpkZW4pCit7CisJKm51bSA9IDE7CisJKmRlbiA9IDQ4MDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IF9zbmRfdGltZXJfaGFyZHdhcmUgc25kX2VtdTEwazFfdGltZXJfaHcgPSB7CisJLmZsYWdzID0gU05EUlZfVElNRVJfSFdfQVVUTywKKwkucmVzb2x1dGlvbiA9IDIwODMzLCAvKiAxIHNhbXBsZSBAIDQ4S0haID0gMjAuODMzLi4udXMgKi8KKwkudGlja3MgPSAxMDI0LAorCS5zdGFydCA9IHNuZF9lbXUxMGsxX3RpbWVyX3N0YXJ0LAorCS5zdG9wID0gc25kX2VtdTEwazFfdGltZXJfc3RvcCwKKwkucHJlY2lzZV9yZXNvbHV0aW9uID0gc25kX2VtdTEwazFfdGltZXJfcHJlY2lzZV9yZXNvbHV0aW9uLAorfTsKKworaW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV90aW1lcihlbXUxMGsxX3QgKmVtdSwgaW50IGRldmljZSkKK3sKKwlzbmRfdGltZXJfdCAqdGltZXIgPSBOVUxMOworCXNuZF90aW1lcl9pZF90IHRpZDsKKwlpbnQgZXJyOworCisJdGlkLmRldl9jbGFzcyA9IFNORFJWX1RJTUVSX0NMQVNTX0NBUkQ7CisJdGlkLmRldl9zY2xhc3MgPSBTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORTsKKwl0aWQuY2FyZCA9IGVtdS0+Y2FyZC0+bnVtYmVyOworCXRpZC5kZXZpY2UgPSBkZXZpY2U7CisJdGlkLnN1YmRldmljZSA9IDA7CisJaWYgKChlcnIgPSBzbmRfdGltZXJfbmV3KGVtdS0+Y2FyZCwgIkVNVTEwSzEiLCAmdGlkLCAmdGltZXIpKSA+PSAwKSB7CisJCXN0cmNweSh0aW1lci0+bmFtZSwgIkVNVTEwSzEgdGltZXIiKTsKKwkJdGltZXItPnByaXZhdGVfZGF0YSA9IGVtdTsKKwkJdGltZXItPmh3ID0gc25kX2VtdTEwazFfdGltZXJfaHc7CisJfQorCWVtdS0+dGltZXIgPSB0aW1lcjsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1MWQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgICAgICAgICAgICAgICAgICBMZWUgUmV2ZWxsIDxybHJldmVsbEBqb2Utam9iLmNvbT4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzIC0gdm9pY2UgbWFuYWdlcgorICoKKyAqICBSZXdyb3RlIHZvaWNlIGFsbG9jYXRvciBmb3IgbXVsdGljaGFubmVsIHN1cHBvcnQgLSBybHJldmVsbCAxMi8yMDA0CisgKiAKKyAqICBCVUdTOgorICogICAgLS0KKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisKKy8qIFByZXZpb3VzbHkgdGhlIHZvaWNlIGFsbG9jYXRvciBzdGFydGVkIGF0IDAgZXZlcnkgdGltZS4gIFRoZSBuZXcgdm9pY2UgCisgKiBhbGxvY2F0b3IgdXNlcyBhIHJvdW5kIHJvYmluIHNjaGVtZS4gIFRoZSBuZXh0IGZyZWUgdm9pY2UgaXMgdHJhY2tlZCBpbiAKKyAqIHRoZSBjYXJkIHJlY29yZCBhbmQgZWFjaCBhbGxvY2F0aW9uIGJlZ2lucyB3aGVyZSB0aGUgbGFzdCBsZWZ0IG9mZi4gIFRoZSAKKyAqIGhhcmR3YXJlIHJlcXVpcmVzIHN0ZXJlbyBpbnRlcmxlYXZlZCB2b2ljZXMgYmUgYWxpZ25lZCB0byBhbiBldmVuL29kZCAKKyAqIGJvdW5kYXJ5LiAgRm9yIG11bHRpY2hhbm5lbCB2b2ljZSBhbGxvY2F0aW9uIHdlIGVuc3VyZSB0aGFuIHRoZSBibG9jayBvZiAKKyAqIHZvaWNlcyBkb2VzIG5vdCBjcm9zcyB0aGUgMzIgdm9pY2UgYm91bmRhcnkuICBUaGlzIHNpbXBsaWZpZXMgdGhlIAorICogbXVsdGljaGFubmVsIHN1cHBvcnQgYW5kIGVuc3VyZXMgd2UgY2FuIHVzZSBhIHNpbmdsZSB3cml0ZSB0byB0aGUgCisgKiAoc2V0fGNsZWFyKV9sb29wX3N0b3AgcmVnaXN0ZXJzLiAgT3RoZXJ3aXNlIChmb3IgZXhhbXBsZSkgdGhlIHZvaWNlcyB3b3VsZCAKKyAqIGdldCBvdXQgb2Ygc3luYyB3aGVuIHBhdXNpbmcvcmVzdW1pbmcgYSBzdHJlYW0uCisgKgkJCQkJCQktLXJscmV2ZWxsCisgKi8KKworc3RhdGljIGludCB2b2ljZV9hbGxvYyhlbXUxMGsxX3QgKmVtdSwgZW11MTBrMV92b2ljZV90eXBlX3QgdHlwZSwgaW50IG51bWJlciwgZW11MTBrMV92b2ljZV90ICoqcnZvaWNlKQoreworCWVtdTEwazFfdm9pY2VfdCAqdm9pY2U7CisJaW50IGksIGosIGssIGZpcnN0X3ZvaWNlLCBsYXN0X3ZvaWNlLCBza2lwOworCisJKnJ2b2ljZSA9IE5VTEw7CisJZmlyc3Rfdm9pY2UgPSBsYXN0X3ZvaWNlID0gMDsKKwlmb3IgKGkgPSBlbXUtPm5leHRfZnJlZV92b2ljZSwgaiA9IDA7IGogPCBOVU1fRyA7IGkgKz0gbnVtYmVyLCBqICs9IG51bWJlcikgeworCQkvLyBwcmludGsoImkgJWQgaiAlZCBuZXh0IGZyZWUgJWQhXG4iLCBpLCBqLCBlbXUtPm5leHRfZnJlZV92b2ljZSk7CisJCWkgJT0gTlVNX0c7CisKKwkJLyogc3RlcmVvIHZvaWNlcyBtdXN0IGJlIGV2ZW4vb2RkICovCisJCWlmICgobnVtYmVyID09IDIpICYmIChpICUgMikpIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCQkKKwkJc2tpcCA9IDA7CisJCWZvciAoayA9IDA7IGsgPCBudW1iZXI7IGsrKykgeworCQkJdm9pY2UgPSAmZW11LT52b2ljZXNbKGkraykgJSBOVU1fR107CisJCQlpZiAodm9pY2UtPnVzZSkgeworCQkJCXNraXAgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghc2tpcCkgeworCQkJLy8gcHJpbnRrKCJhbGxvY2F0ZWQgdm9pY2UgJWRcbiIsIGkpOworCQkJZmlyc3Rfdm9pY2UgPSBpOworCQkJbGFzdF92b2ljZSA9IChpICsgbnVtYmVyKSAlIE5VTV9HOworCQkJZW11LT5uZXh0X2ZyZWVfdm9pY2UgPSBsYXN0X3ZvaWNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKGZpcnN0X3ZvaWNlID09IGxhc3Rfdm9pY2UpCisJCXJldHVybiAtRU5PTUVNOworCQorCWZvciAoaT0wOyBpIDwgbnVtYmVyOyBpKyspIHsKKwkJdm9pY2UgPSAmZW11LT52b2ljZXNbKGZpcnN0X3ZvaWNlICsgaSkgJSBOVU1fR107CisJCS8vIHByaW50aygidm9pY2UgYWxsb2MgLSAlaSwgJWkgb2YgJWlcbiIsIHZvaWNlLT5udW1iZXIsIGlkeC1maXJzdF92b2ljZSsxLCBudW1iZXIpOworCQl2b2ljZS0+dXNlID0gMTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRU1VMTBLMV9QQ006CisJCQl2b2ljZS0+cGNtID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEVNVTEwSzFfU1lOVEg6CisJCQl2b2ljZS0+c3ludGggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRU1VMTBLMV9NSURJOgorCQkJdm9pY2UtPm1pZGkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRU1VMTBLMV9FRlg6CisJCQl2b2ljZS0+ZWZ4ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCSpydm9pY2UgPSAmZW11LT52b2ljZXNbZmlyc3Rfdm9pY2VdOworCXJldHVybiAwOworfQorCitpbnQgc25kX2VtdTEwazFfdm9pY2VfYWxsb2MoZW11MTBrMV90ICplbXUsIGVtdTEwazFfdm9pY2VfdHlwZV90IHR5cGUsIGludCBudW1iZXIsIGVtdTEwazFfdm9pY2VfdCAqKnJ2b2ljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlzbmRfYXNzZXJ0KHJ2b2ljZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydChudW1iZXIsIHJldHVybiAtRUlOVkFMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKDs7KSB7CisJCXJlc3VsdCA9IHZvaWNlX2FsbG9jKGVtdSwgdHlwZSwgbnVtYmVyLCBydm9pY2UpOworCQlpZiAocmVzdWx0ID09IDAgfHwgdHlwZSA9PSBFTVUxMEsxX1NZTlRIIHx8IHR5cGUgPT0gRU1VMTBLMV9NSURJKQorCQkJYnJlYWs7CisKKwkJLyogZnJlZSBhIHZvaWNlIGZyb20gc3ludGggKi8KKwkJaWYgKGVtdS0+Z2V0X3N5bnRoX3ZvaWNlKSB7CisJCQlyZXN1bHQgPSBlbXUtPmdldF9zeW50aF92b2ljZShlbXUpOworCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJZW11MTBrMV92b2ljZV90ICpwdm9pY2UgPSAmZW11LT52b2ljZXNbcmVzdWx0XTsKKwkJCQlwdm9pY2UtPmludGVycnVwdCA9IE5VTEw7CisJCQkJcHZvaWNlLT51c2UgPSBwdm9pY2UtPnBjbSA9IHB2b2ljZS0+c3ludGggPSBwdm9pY2UtPm1pZGkgPSBwdm9pY2UtPmVmeCA9IDA7CisJCQkJcHZvaWNlLT5lcGNtID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVtdTEwazFfdCAqZW11LCBlbXUxMGsxX3ZvaWNlX3QgKnB2b2ljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwlwdm9pY2UtPmludGVycnVwdCA9IE5VTEw7CisJcHZvaWNlLT51c2UgPSBwdm9pY2UtPnBjbSA9IHB2b2ljZS0+c3ludGggPSBwdm9pY2UtPm1pZGkgPSBwdm9pY2UtPmVmeCA9IDA7CisJcHZvaWNlLT5lcGNtID0gTlVMTDsKKwlzbmRfZW11MTBrMV92b2ljZV9pbml0KGVtdSwgcHZvaWNlLT5udW1iZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+dm9pY2VfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxMDM5OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTAsMCArMSwyNDEzIEBACisvKgorICogIERyaXZlciBmb3IgRW5zb25pcSBFUzEzNzAvRVMxMzcxIEF1ZGlvUENJIHNvdW5kY2FyZAorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiwKKyAqCQkgICAgIFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgorI2lmZGVmIENISVAxMzcxCisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzb3VuZC9hazQ1MzFfY29kZWMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorCisjaWZuZGVmIENISVAxMzcxCisjdW5kZWYgQ0hJUDEzNzAKKyNkZWZpbmUgQ0hJUDEzNzAKKyNlbmRpZgorCisjaWZkZWYgQ0hJUDEzNzAKKyNkZWZpbmUgRFJJVkVSX05BTUUgIkVOUzEzNzAiCisjZWxzZQorI2RlZmluZSBEUklWRVJfTkFNRSAiRU5TMTM3MSIKKyNlbmRpZgorCisKK01PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4sIFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBDSElQMTM3MAorTU9EVUxFX0RFU0NSSVBUSU9OKCJFbnNvbmlxIEF1ZGlvUENJIEVTMTM3MCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7RW5zb25pcSxBdWRpb1BDSS05NyBFUzEzNzB9LCIKKwkgICAgICAgICJ7Q3JlYXRpdmUgTGFicyxTQiBQQ0k2NC8xMjggKEVTMTM3MCl9fSIpOworI2VuZGlmCisjaWZkZWYgQ0hJUDEzNzEKK01PRFVMRV9ERVNDUklQVElPTigiRW5zb25pcS9DcmVhdGl2ZSBBdWRpb1BDSSBFUzEzNzErIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tFbnNvbmlxLEF1ZGlvUENJIEVTMTM3MS83M30sIgorCQkie0Vuc29uaXEsQXVkaW9QQ0kgRVMxMzczfSwiCisJCSJ7Q3JlYXRpdmUgTGFicyxFY3RpdmEgRVYxOTM4fSwiCisJCSJ7Q3JlYXRpdmUgTGFicyxTQiBQQ0k2NC8xMjggKEVTMTM3MS83Myl9LCIKKwkJIntDcmVhdGl2ZSBMYWJzLFZpYnJhIFBDSTEyOH0sIgorCQkie0VjdGl2YSxFVjE5Mzh9fSIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQorI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLCisjZW5kaWYKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgc3dpdGNoZXMgKi8KKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisjaWZkZWYgQ0hJUDEzNzEKK3N0YXRpYyBpbnQgam95c3RpY2tfcG9ydFtTTkRSVl9DQVJEU107CisjZWxzZQorc3RhdGljIGludCBqb3lzdGlja1tTTkRSVl9DQVJEU107CisjZW5kaWYKKyNlbmRpZgorCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEVuc29uaXEgQXVkaW9QQ0kgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBFbnNvbmlxIEF1ZGlvUENJIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgRW5zb25pcSBBdWRpb1BDSSBzb3VuZGNhcmQuIik7CisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworI2lmZGVmIENISVAxMzcxCittb2R1bGVfcGFyYW1fYXJyYXkoam95c3RpY2tfcG9ydCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moam95c3RpY2tfcG9ydCwgIkpveXN0aWNrIHBvcnQgYWRkcmVzcy4iKTsKKyNlbHNlCittb2R1bGVfcGFyYW1fYXJyYXkoam95c3RpY2ssIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhqb3lzdGljaywgIkVuYWJsZSBqb3lzdGljay4iKTsKKyNlbmRpZgorI2VuZGlmIC8qIFNVUFBPUlRfSk9ZU1RJQ0sgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAgICAgMHg1ODgwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxCTB4MTM3MQorI2VuZGlmCisKKy8qIEVTMTM3MSBjaGlwIElEICovCisvKiBUaGlzIGlzIGEgbGl0dGxlIGNvbmZ1c2luZyBiZWNhdXNlIGFsbCBFUzEzNzEgY29tcGF0aWJsZSBjaGlwcyBoYXZlIHRoZQorICAgc2FtZSBERVZJQ0VfSUQsIHRoZSBvbmx5IHRoaW5nIGRpZmZlcmVudGlhdGluZyB0aGVtIGlzIHRoZSBSRVZfSUQgZmllbGQuCisgICBUaGlzIGlzIG9ubHkgc2lnbmlmaWNhbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZlYXR1cmVzIG9uIHRoZSBsYXRlciBwYXJ0cy4KKyAgIFllcywgSSBrbm93IGl0J3Mgc3R1cGlkIGFuZCB3aHkgZGlkbid0IHdlIHVzZSB0aGUgc3ViIElEcz8KKyovCisjZGVmaW5lIEVTMTM3MVJFVl9FUzEzNzNfQSAgMHgwNAorI2RlZmluZSBFUzEzNzFSRVZfRVMxMzczX0IgIDB4MDYKKyNkZWZpbmUgRVMxMzcxUkVWX0NUNTg4MF9BICAweDA3CisjZGVmaW5lIENUNTg4MFJFVl9DVDU4ODBfQyAgMHgwMgorI2RlZmluZSBDVDU4ODBSRVZfQ1Q1ODgwX0QgIDB4MDMJLyogPz8/IC1qayAqLworI2RlZmluZSBDVDU4ODBSRVZfQ1Q1ODgwX0UgIDB4MDQJLyogbXcgKi8KKyNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3MV9CICAweDA5CisjZGVmaW5lIEVWMTkzOFJFVl9FVjE5MzhfQSAgMHgwMAorI2RlZmluZSBFUzEzNzFSRVZfRVMxMzczXzggIDB4MDgKKworLyoKKyAqIERpcmVjdCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIEVTX1JFRyhlbnNvbmlxLCB4KSAoKGVuc29uaXEpLT5wb3J0ICsgRVNfUkVHXyMjeCkKKworI2RlZmluZSBFU19SRUdfQ09OVFJPTAkweDAwCS8qIFIvVzogSW50ZXJydXB0L0NoaXAgc2VsZWN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU18xMzcwX0FEQ19TVE9QCSgxPDwzMSkJCS8qIGRpc2FibGUgY2FwdHVyZSBidWZmZXIgdHJhbnNmZXJzICovCisjZGVmaW5lICAgRVNfMTM3MF9YQ1RMMSAJKDE8PDMwKQkJLyogZ2VuZXJhbCBwdXJwb3NlIG91dHB1dCBiaXQgKi8KKyNkZWZpbmUgICBFU18xMzczX0JZUEFTU19QMQkoMTw8MzEpCQkvKiBieXBhc3MgU1JDIGZvciBQQjEgKi8KKyNkZWZpbmUgICBFU18xMzczX0JZUEFTU19QMgkoMTw8MzApCQkvKiBieXBhc3MgU1JDIGZvciBQQjIgKi8KKyNkZWZpbmUgICBFU18xMzczX0JZUEFTU19SCSgxPDwyOSkJCS8qIGJ5cGFzcyBTUkMgZm9yIFJFQyAqLworI2RlZmluZSAgIEVTXzEzNzNfVEVTVF9CSVQJKDE8PDI4KQkJLyogc2hvdWxkIGJlIHNldCB0byAwIGZvciBub3JtYWwgb3BlcmF0aW9uICovCisjZGVmaW5lICAgRVNfMTM3M19SRUNFTl9CCSgxPDwyNykJCS8qIG1peCByZWNvcmQgd2l0aCBwbGF5YmFjayBmb3IgSTJTL1NQRElGIG91dCAqLworI2RlZmluZSAgIEVTXzEzNzNfU1BESUZfVEhSVQkoMTw8MjYpCQkvKiAwID0gU1BESUYgdGhydSBtb2RlLCAxID0gU1BESUYgPT0gZGlnIG91dCAqLworI2RlZmluZSAgIEVTXzEzNzFfSk9ZX0FTRUwobykJKCgobykmMHgwMyk8PDI0KS8qIGpveXN0aWNrIHBvcnQgbWFwcGluZyAqLworI2RlZmluZSAgIEVTXzEzNzFfSk9ZX0FTRUxNCSgweDAzPDwyNCkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU18xMzcxX0pPWV9BU0VMSShpKSAgKCgoaSk+PjI0KSYweDAzKQorI2RlZmluZSAgIEVTXzEzNzFfR1BJT19JTihpKQkoKChpKT4+MjApJjB4MGYpLyogR1BJTyBpbiBbMzowXSBwaW5zIC0gUi9PICovCisjZGVmaW5lICAgRVNfMTM3MF9QQ0xLRElWTyhvKQkoKChvKSYweDFmZmYpPDwxNikvKiBjbG9jayBkaXZpZGUgcmF0aW8gZm9yIERBQzIgKi8KKyNkZWZpbmUgICBFU18xMzcwX1BDTEtESVZNCSgoMHgxZmZmKTw8MTYpCS8qIG1hc2sgZm9yIGFib3ZlICovCisjZGVmaW5lICAgRVNfMTM3MF9QQ0xLRElWSShpKQkoKChpKT4+MTYpJjB4MWZmZikvKiBjbG9jayBkaXZpZGUgcmF0aW8gZm9yIERBQzIgKi8KKyNkZWZpbmUgICBFU18xMzcxX0dQSU9fT1VUKG8pCSgoKG8pJjB4MGYpPDwxNikvKiBHUElPIG91dCBbMzowXSBwaW5zIC0gVy9SICovCisjZGVmaW5lICAgRVNfMTM3MV9HUElPX09VVE0gICAgICgweDBmPDwxNikJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19NU0ZNVFNFTAkJKDE8PDE1KQkJLyogTVBFRyBzZXJpYWwgZGF0YSBmb3JtYXQ7IDAgPSBTT05ZLCAxID0gSTJTICovCisjZGVmaW5lICAgRVNfMTM3MF9NX1NCQgkJKDE8PDE0KQkJLyogY2xvY2sgc291cmNlIGZvciBEQUMgLSAwID0gY2xvY2sgZ2VuZXJhdG9yOyAxID0gTVBFRyBjbG9ja3MgKi8KKyNkZWZpbmUgICBFU18xMzcxX1NZTkNfUkVTCSgxPDwxNCkJCS8qIFdhcm0gQUM5NyByZXNldCAqLworI2RlZmluZSAgIEVTXzEzNzBfV1RTUlNFTChvKQkoKChvKSYweDAzKTw8MTIpLyogZml4ZWQgZnJlcXVlbmN5IGNsb2NrIGZvciBEQUMxICovCisjZGVmaW5lICAgRVNfMTM3MF9XVFNSU0VMTQkoMHgwMzw8MTIpCS8qIG1hc2sgZm9yIGFib3ZlICovCisjZGVmaW5lICAgRVNfMTM3MV9BRENfU1RPUAkoMTw8MTMpCQkvKiBkaXNhYmxlIENDQiB0cmFuc2ZlciBjYXB0dXJlIGluZm9ybWF0aW9uICovCisjZGVmaW5lICAgRVNfMTM3MV9QV1JfSU5UUk0JKDE8PDEyKQkJLyogcG93ZXIgbGV2ZWwgY2hhbmdlIGludGVycnVwdHMgZW5hYmxlICovCisjZGVmaW5lICAgRVNfMTM3MF9EQUNfU1lOQwkoMTw8MTEpCQkvKiBEQUMncyBhcmUgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgICBFU18xMzcxX01fQ0IJCSgxPDwxMSkJCS8qIGNhcHR1cmUgY2xvY2sgc291cmNlOyAwID0gQUMnOTcgQURDOyAxID0gSTJTICovCisjZGVmaW5lICAgRVNfQ0NCX0lOVFJNCQkoMTw8MTApCQkvKiBDQ0Igdm9pY2UgaW50ZXJydXB0cyBlbmFibGUgKi8KKyNkZWZpbmUgICBFU18xMzcwX01fQ0IJCSgxPDw5KQkJLyogY2FwdHVyZSBjbG9jayBzb3VyY2U7IDAgPSBBREM7IDEgPSBNUEVHICovCisjZGVmaW5lICAgRVNfMTM3MF9YQ1RMMAkJKDE8PDgpCQkvKiBnZW5lcmFwIHB1cnBvc2Ugb3V0cHV0IGJpdCAqLworI2RlZmluZSAgIEVTXzEzNzFfUERMRVYobykJKCgobykmMHgwMyk8PDgpCS8qIGN1cnJlbnQgcG93ZXIgZG93biBsZXZlbCAqLworI2RlZmluZSAgIEVTXzEzNzFfUERMRVZNCSgweDAzPDw4KQkvKiBtYXNrIGZvciBhYm92ZSAqLworI2RlZmluZSAgIEVTX0JSRVEJCSgxPDw3KQkJLyogbWVtb3J5IGJ1cyByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSAgIEVTX0RBQzFfRU4JCSgxPDw2KQkJLyogREFDMSBwbGF5YmFjayBjaGFubmVsIGVuYWJsZSAqLworI2RlZmluZSAgIEVTX0RBQzJfRU4JCSgxPDw1KQkJLyogREFDMiBwbGF5YmFjayBjaGFubmVsIGVuYWJsZSAqLworI2RlZmluZSAgIEVTX0FEQ19FTgkJKDE8PDQpCQkvKiBBREMgY2FwdHVyZSBjaGFubmVsIGVuYWJsZSAqLworI2RlZmluZSAgIEVTX1VBUlRfRU4JCSgxPDwzKQkJLyogVUFSVCBlbmFibGUgKi8KKyNkZWZpbmUgICBFU19KWVNUS19FTgkJKDE8PDIpCQkvKiBKb3lzdGljayBtb2R1bGUgZW5hYmxlICovCisjZGVmaW5lICAgRVNfMTM3MF9DRENfRU4JKDE8PDEpCQkvKiBDb2RlYyBpbnRlcmZhY2UgZW5hYmxlICovCisjZGVmaW5lICAgRVNfMTM3MV9YVEFMQ0tESVMJKDE8PDEpCQkvKiBYdGFsIGNsb2NrIGRpc2FibGUgKi8KKyNkZWZpbmUgICBFU18xMzcwX1NFUlJfRElTQUJMRQkoMTw8MCkJCS8qIFBDSSBzZXJyIHNpZ25hbCBkaXNhYmxlICovCisjZGVmaW5lICAgRVNfMTM3MV9QQ0lDTEtESVMgICAgICgxPDwwKQkJLyogUENJIGNsb2NrIGRpc2FibGUgKi8KKyNkZWZpbmUgRVNfUkVHX1NUQVRVUwkweDA0CS8qIFIvTzogSW50ZXJydXB0L0NoaXAgc2VsZWN0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgIEVTX0lOVFIgICAgICAgICAgICAgICAoMTw8MzEpCQkvKiBJbnRlcnJ1cHQgaXMgcGVuZGluZyAqLworI2RlZmluZSAgIEVTXzEzNzFfU1RfQUM5N19SU1QJKDE8PDI5KQkJLyogQ1Q1ODgwIEFDJzk3IFJlc2V0IGJpdCAqLworI2RlZmluZSAgIEVTXzEzNzNfUkVBUl9CSVQyNwkoMTw8MjcpCQkvKiByZWFyIGJpdHM6IDAwMCAtIGZyb250LCAwMTAgLSBtaXJyb3IsIDEwMSAtIHNlcGFyYXRlICovCisjZGVmaW5lICAgRVNfMTM3M19SRUFSX0JJVDI2CSgxPDwyNikKKyNkZWZpbmUgICBFU18xMzczX1JFQVJfQklUMjQJKDE8PDI0KQorI2RlZmluZSAgIEVTXzEzNzNfR1BJT19JTlRfRU4obykoKChvKSYweDBmKTw8MjApLyogR1BJTyBbMzowXSBwaW5zIC0gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIEVTXzEzNzNfU1BESUZfRU4JKDE8PDE4KQkJLyogU1BESUYgZW5hYmxlICovCisjZGVmaW5lICAgRVNfMTM3M19TUERJRl9URVNUCSgxPDwxNykJCS8qIFNQRElGIHRlc3QgKi8KKyNkZWZpbmUgICBFU18xMzcxX1RFU1QgICAgICAgICAgKDE8PDE2KQkJLyogdGVzdCBBU0lDICovCisjZGVmaW5lICAgRVNfMTM3M19HUElPX0lOVChpKQkoKChpKSYweDBmKT4+MTIpLyogR1BJTyBbMzowXSBwaW5zIC0gaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgICBFU18xMzcwX0NTVEFUCQkoMTw8MTApCQkvKiBDT0RFQyBpcyBidXN5IG9yIHJlZ2lzdGVyIHdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MF9DQlVTWSAgICAgICAgICgxPDw5KQkJLyogQ09ERUMgaXMgYnVzeSAqLworI2RlZmluZSAgIEVTXzEzNzBfQ1dSSVAJCSgxPDw4KQkJLyogQ09ERUMgcmVnaXN0ZXIgd3JpdGUgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgICBFU18xMzcxX1NZTkNfRVJSCSgxPDw4KQkJLyogQ09ERUMgc3luY2hyb25pemF0aW9uIGVycm9yIG9jY3VycmVkICovCisjZGVmaW5lICAgRVNfMTM3MV9WQyhpKSAgICAgICAgICgoKGkpPj42KSYweDAzKQkvKiB2b2ljZSBjb2RlIGZyb20gQ0NCIG1vZHVsZSAqLworI2RlZmluZSAgIEVTXzEzNzBfVkMoaSkJCSgoKGkpPj41KSYweDAzKQkvKiB2b2ljZSBjb2RlIGZyb20gQ0NCIG1vZHVsZSAqLworI2RlZmluZSAgIEVTXzEzNzFfTVBXUiAgICAgICAgICAoMTw8NSkJCS8qIHBvd2VyIGxldmVsIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lICAgRVNfTUNDQgkJKDE8PDQpCQkvKiBDQ0IgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgICBFU19VQVJUCQkoMTw8MykJCS8qIFVBUlQgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgICBFU19EQUMxCQkoMTw8MikJCS8qIERBQzEgY2hhbm5lbCBpbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSAgIEVTX0RBQzIJCSgxPDwxKQkJLyogREFDMiBjaGFubmVsIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lICAgRVNfQURDCQkoMTw8MCkJCS8qIEFEQyBjaGFubmVsIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lIEVTX1JFR19VQVJUX0RBVEEgMHgwOAkvKiBSL1c6IFVBUlQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBFU19SRUdfVUFSVF9TVEFUVVMgMHgwOQkvKiBSL086IFVBUlQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICAgRVNfUlhJTlQJCSgxPDw3KQkJLyogUlggaW50ZXJydXB0IG9jY3VycmVkICovCisjZGVmaW5lICAgRVNfVFhJTlQJCSgxPDwyKQkJLyogVFggaW50ZXJydXB0IG9jY3VycmVkICovCisjZGVmaW5lICAgRVNfVFhSRFkJCSgxPDwxKQkJLyogdHJhbnNtaXR0ZXIgcmVhZHkgKi8KKyNkZWZpbmUgICBFU19SWFJEWQkJKDE8PDApCQkvKiByZWNlaXZlciByZWFkeSAqLworI2RlZmluZSBFU19SRUdfVUFSVF9DT05UUk9MIDB4MDkJLyogVy9POiBVQVJUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU19SWElOVEVOCQkoMTw8NykJCS8qIFJYIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICBFU19UWElOVEVOTyhvKQkoKChvKSYweDAzKTw8NSkJLyogVFggaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIEVTX1RYSU5URU5NCQkoMHgwMzw8NSkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19UWElOVEVOSShpKQkoKChpKT4+NSkmMHgwMykKKyNkZWZpbmUgICBFU19DTlRSTChvKQkJKCgobykmMHgwMyk8PDApCS8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBFU19DTlRSTE0JCSgweDAzPDwwKQkvKiBtYXNrIGZvciBhYm92ZSAqLworI2RlZmluZSBFU19SRUdfVUFSVF9SRVMJMHgwYQkvKiBSL1c6IFVBUlQgcmVzZXJ2ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU19URVNUX01PREUJCSgxPDwwKQkJLyogdGVzdCBtb2RlIGVuYWJsZWQgKi8KKyNkZWZpbmUgRVNfUkVHX01FTV9QQUdFCTB4MGMJLyogUi9XOiBNZW1vcnkgcGFnZSByZWdpc3RlciAqLworI2RlZmluZSAgIEVTX01FTV9QQUdFTyhvKQkoKChvKSYweDBmKTw8MCkJLyogbWVtb3J5IHBhZ2Ugc2VsZWN0IC0gb3V0ICovCisjZGVmaW5lICAgRVNfTUVNX1BBR0VNCQkoMHgwZjw8MCkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19NRU1fUEFHRUkoaSkJKCgoaSk+PjApJjB4MGYpIC8qIG1lbW9yeSBwYWdlIHNlbGVjdCAtIGluICovCisjZGVmaW5lIEVTX1JFR18xMzcwX0NPREVDIDB4MTAJLyogVy9POiBDb2RlYyB3cml0ZSByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MF9DT0RFQ19XUklURShhLGQpICgoKChhKSYweGZmKTw8OCl8KCgoZCkmMHhmZik8PDApKQorI2RlZmluZSBFU19SRUdfMTM3MV9DT0RFQyAweDE0CS8qIFcvUjogQ29kZWMgUmVhZC9Xcml0ZSByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MV9DT0RFQ19SRFkJICAgKDE8PDMxKQkvKiBjb2RlYyByZWFkeSAqLworI2RlZmluZSAgIEVTXzEzNzFfQ09ERUNfV0lQCSAgICgxPDwzMCkJLyogY29kZWMgcmVnaXN0ZXIgYWNjZXNzIGluIHByb2dyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MV9DT0RFQ19QSVJECSAgICgxPDwyMykJLyogY29kZWMgcmVhZC93cml0ZSBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU18xMzcxX0NPREVDX1dSSVRFKGEsZCkgKCgoKGEpJjB4N2YpPDwxNil8KCgoZCkmMHhmZmZmKTw8MCkpCisjZGVmaW5lICAgRVNfMTM3MV9DT0RFQ19SRUFEUyhhKSAgICgoKChhKSYweDdmKTw8MTYpfEVTXzEzNzFfQ09ERUNfUElSRCkKKyNkZWZpbmUgICBFU18xMzcxX0NPREVDX1JFQUQoaSkgICAgKCgoaSk+PjApJjB4ZmZmZikKKworI2RlZmluZSBFU19SRUdfMTM3MV9TTVBSQVRFIDB4MTAJLyogVy9SOiBDb2RlYyByYXRlIGNvbnZlcnRlciBpbnRlcmZhY2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU18xMzcxX1NSQ19SQU1fQUREUk8obykgKCgobykmMHg3Zik8PDI1KS8qIGFkZHJlc3Mgb2YgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciAqLworI2RlZmluZSAgIEVTXzEzNzFfU1JDX1JBTV9BRERSTQkgICAoMHg3Zjw8MjUpCS8qIG1hc2sgZm9yIGFib3ZlICovCisjZGVmaW5lICAgRVNfMTM3MV9TUkNfUkFNX0FERFJJKGkpICgoKGkpPj4yNSkmMHg3ZikvKiBhZGRyZXNzIG9mIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgKi8KKyNkZWZpbmUgICBFU18xMzcxX1NSQ19SQU1fV0UJICAgKDE8PDI0KQkvKiBSL1c6IHJlYWQvd3JpdGUgY29udHJvbCBmb3Igc2FtcGxlIHJhdGUgY29udmVydGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9TUkNfUkFNX0JVU1kgICAgICgxPDwyMykJLyogUi9POiBzYW1wbGUgcmF0ZSBtZW1vcnkgaXMgYnVzeSAqLworI2RlZmluZSAgIEVTXzEzNzFfU1JDX0RJU0FCTEUgICAgICAoMTw8MjIpCS8qIHNhbXBsZSByYXRlIGNvbnZlcnRlciBkaXNhYmxlICovCisjZGVmaW5lICAgRVNfMTM3MV9ESVNfUDEJICAgKDE8PDIxKQkvKiBwbGF5YmFjayBjaGFubmVsIDEgYWNjdW11bGF0b3IgdXBkYXRlIGRpc2FibGUgKi8KKyNkZWZpbmUgICBFU18xMzcxX0RJU19QMgkgICAoMTw8MjApCS8qIHBsYXliYWNrIGNoYW5uZWwgMSBhY2N1bXVsYXRvciB1cGRhdGUgZGlzYWJsZSAqLworI2RlZmluZSAgIEVTXzEzNzFfRElTX1IxCSAgICgxPDwxOSkJLyogY2FwdHVyZSBjaGFubmVsIGFjY3VtdWxhdG9yIHVwZGF0ZSBkaXNhYmxlICovCisjZGVmaW5lICAgRVNfMTM3MV9TUkNfUkFNX0RBVEFPKG8pICgoKG8pJjB4ZmZmZik8PDApLyogY3VycmVudCB2YWx1ZSBvZiB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9TUkNfUkFNX0RBVEFNCSAgICgweGZmZmY8PDApCS8qIG1hc2sgZm9yIGFib3ZlICovCisjZGVmaW5lICAgRVNfMTM3MV9TUkNfUkFNX0RBVEFJKGkpICgoKGkpPj4wKSYweGZmZmYpLyogY3VycmVudCB2YWx1ZSBvZiB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyICovCisKKyNkZWZpbmUgRVNfUkVHXzEzNzFfTEVHQUNZIDB4MTgJLyogVy9SOiBMZWdhY3kgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBFU18xMzcxX0pGQVNUCQkoMTw8MzEpCQkvKiBmYXN0IGpveXN0aWNrIHRpbWluZyAqLworI2RlZmluZSAgIEVTXzEzNzFfSElCCQkoMTw8MzApCQkvKiBob3N0IGludGVycnVwdCBibG9ja2luZyBlbmFibGUgKi8KKyNkZWZpbmUgICBFU18xMzcxX1ZTQgkJKDE8PDI5KQkJLyogU0I7IDAgPSBhZGRyIDB4MjIweEgsIDEgPSAweDIyRnhIICovCisjZGVmaW5lICAgRVNfMTM3MV9WTVBVTyhvKQkoKChvKSYweDAzKTw8MjcpLyogYmFzZSByZWdpc3RlciBhZGRyZXNzOyAwID0gMHgzMjB4SDsgMSA9IDB4MzMweEg7IDIgPSAweDM0MHhIOyAzID0gMHgzNTB4SCAqLworI2RlZmluZSAgIEVTXzEzNzFfVk1QVU0JCSgweDAzPDwyNykJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU18xMzcxX1ZNUFVJKGkpCSgoKGkpPj4yNykmMHgwMykvKiBiYXNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgICBFU18xMzcxX1ZDRENPKG8pCSgoKG8pJjB4MDMpPDwyNSkvKiBDT0RFQzsgMCA9IDB4NTMweEg7IDEgPSB1bmRlZmluZWQ7IDIgPSAweGU4MHhIOyAzID0gMHhGNDB4SCAqLworI2RlZmluZSAgIEVTXzEzNzFfVkNEQ00JCSgweDAzPDwyNSkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU18xMzcxX1ZDRENJKGkpCSgoKGkpPj4yNSkmMHgwMykvKiBDT0RFQyBhZGRyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MV9GSVJRCQkoMTw8MjQpCQkvKiBmb3JjZSBhbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBFU18xMzcxX1NETUFDQVAJKDE8PDIzKQkJLyogZW5hYmxlIGV2ZW50IGNhcHR1cmUgZm9yIHNsYXZlIERNQSBjb250cm9sbGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9TUElDQVAJKDE8PDIyKQkJLyogZW5hYmxlIGV2ZW50IGNhcHR1cmUgZm9yIHNsYXZlIElSUSBjb250cm9sbGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9NRE1BQ0FQCSgxPDwyMSkJCS8qIGVuYWJsZSBldmVudCBjYXB0dXJlIGZvciBtYXN0ZXIgRE1BIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgICBFU18xMzcxX01QSUNBUAkoMTw8MjApCQkvKiBlbmFibGUgZXZlbnQgY2FwdHVyZSBmb3IgbWFzdGVyIElSUSBjb250cm9sbGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9BRENBUAkJKDE8PDE5KQkJLyogZW5hYmxlIGV2ZW50IGNhcHR1cmUgZm9yIEFETElCIHJlZ2lzdGVyOyAweDM4OHhIICovCisjZGVmaW5lICAgRVNfMTM3MV9TVkNBUAkJKDE8PDE4KQkJLyogZW5hYmxlIGV2ZW50IGNhcHR1cmUgZm9yIFNCIHJlZ2lzdGVycyAqLworI2RlZmluZSAgIEVTXzEzNzFfQ0RDQ0FQCSgxPDwxNykJCS8qIGVuYWJsZSBldmVudCBjYXB0dXJlIGZvciBDT0RFQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgICBFU18xMzcxX0JBQ0FQCQkoMTw8MTYpCQkvKiBlbmFibGUgZXZlbnQgY2FwdHVyZSBmb3IgU291bmRTY2FwZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgICBFU18xMzcxX0VYSShpKQkoKChpKT4+OCkmMHgwNykJLyogZXZlbnQgbnVtYmVyICovCisjZGVmaW5lICAgRVNfMTM3MV9BSShpKQkJKCgoaSk+PjMpJjB4MWYpCS8qIGV2ZW50IHNpZ25pZmljYW50IEkvTyBhZGRyZXNzICovCisjZGVmaW5lICAgRVNfMTM3MV9XUgkJKDE8PDIpCS8qIGV2ZW50IGNhcHR1cmU7IDAgPSByZWFkOyAxID0gd3JpdGUgKi8KKyNkZWZpbmUgICBFU18xMzcxX0xFR0lOVAkoMTw8MCkJLyogaW50ZXJydXB0IGZvciBsZWdhY3kgZXZlbnRzOyAwID0gaW50ZXJydXB0IGRpZCBvY2N1ciAqLworCisjZGVmaW5lIEVTX1JFR19DSEFOTkVMX1NUQVRVUyAweDFjIC8qIFIvVzogZmlyc3QgMzItYml0cyBmcm9tIFMvUERJRiBjaGFubmVsIHN0YXR1cyBibG9jaywgZXMxMzczICovCisKKyNkZWZpbmUgRVNfUkVHX1NFUklBTAkweDIwCS8qIFIvVzogU2VyaWFsIGludGVyZmFjZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICAgRVNfMTM3MV9EQUNfVEVTVAkoMTw8MjIpCQkvKiBEQUMgdGVzdCBtb2RlIGVuYWJsZSAqLworI2RlZmluZSAgIEVTX1AyX0VORF9JTkNPKG8pCSgoKG8pJjB4MDcpPDwxOSkvKiBiaW5hcnkgb2Zmc2V0IHZhbHVlIHRvIGluY3JlbWVudCAvIGxvb3AgZW5kICovCisjZGVmaW5lICAgRVNfUDJfRU5EX0lOQ00JKDB4MDc8PDE5KQkvKiBtYXNrIGZvciBhYm92ZSAqLworI2RlZmluZSAgIEVTX1AyX0VORF9JTkNJKGkpCSgoKGkpPj4xNikmMHgwNykvKiBiaW5hcnkgb2Zmc2V0IHZhbHVlIHRvIGluY3JlbWVudCAvIGxvb3AgZW5kICovCisjZGVmaW5lICAgRVNfUDJfU1RfSU5DTyhvKQkoKChvKSYweDA3KTw8MTYpLyogYmluYXJ5IG9mZnNldCB2YWx1ZSB0byBpbmNyZW1lbnQgLyBzdGFydCAqLworI2RlZmluZSAgIEVTX1AyX1NUX0lOQ00JCSgweDA3PDwxNikJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19QMl9TVF9JTkNJKGkpCSgoKGkpPDwxNikmMHgwNykvKiBiaW5hcnkgb2Zmc2V0IHZhbHVlIHRvIGluY3JlbWVudCAvIHN0YXJ0ICovCisjZGVmaW5lICAgRVNfUjFfTE9PUF9TRUwJKDE8PDE1KQkJLyogQURDOyAwIC0gbG9vcCBtb2RlOyAxID0gc3RvcCBtb2RlICovCisjZGVmaW5lICAgRVNfUDJfTE9PUF9TRUwJKDE8PDE0KQkJLyogREFDMjsgMCAtIGxvb3AgbW9kZTsgMSA9IHN0b3AgbW9kZSAqLworI2RlZmluZSAgIEVTX1AxX0xPT1BfU0VMCSgxPDwxMykJCS8qIERBQzE7IDAgLSBsb29wIG1vZGU7IDEgPSBzdG9wIG1vZGUgKi8KKyNkZWZpbmUgICBFU19QMl9QQVVTRQkJKDE8PDEyKQkJLyogREFDMjsgMCAtIHBsYXkgbW9kZTsgMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgICBFU19QMV9QQVVTRQkJKDE8PDExKQkJLyogREFDMTsgMCAtIHBsYXkgbW9kZTsgMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgICBFU19SMV9JTlRfRU4JCSgxPDwxMCkJCS8qIEFEQyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICAgRVNfUDJfSU5UX0VOCQkoMTw8OSkJCS8qIERBQzIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIEVTX1AxX0lOVF9FTgkJKDE8PDgpCQkvKiBEQUMxIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICBFU19QMV9TQ1RfUkxECQkoMTw8NykJCS8qIGZvcmNlIHNhbXBsZSBjb3VudGVyIHJlbG9hZCBmb3IgREFDMSAqLworI2RlZmluZSAgIEVTX1AyX0RBQ19TRU4JCSgxPDw2KQkJLyogd2hlbiBzdG9wIG1vZGU6IDAgLSBEQUMyIHBsYXkgYmFjayB6ZXJvczsgMSA9IERBQzIgcGxheSBiYWNrIGxhc3Qgc2FtcGxlICovCisjZGVmaW5lICAgRVNfUjFfTU9ERU8obykJKCgobykmMHgwMyk8PDQpCS8qIEFEQyBtb2RlOyAwID0gOC1iaXQgbW9ubzsgMSA9IDgtYml0IHN0ZXJlbzsgMiA9IDE2LWJpdCBtb25vOyAzID0gMTYtYml0IHN0ZXJlbyAqLworI2RlZmluZSAgIEVTX1IxX01PREVNCQkoMHgwMzw8NCkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19SMV9NT0RFSShpKQkoKChpKT4+NCkmMHgwMykKKyNkZWZpbmUgICBFU19QMl9NT0RFTyhvKQkoKChvKSYweDAzKTw8MikJLyogREFDMiBtb2RlOyAtLSAnJyAtLSAqLworI2RlZmluZSAgIEVTX1AyX01PREVNCQkoMHgwMzw8MikJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19QMl9NT0RFSShpKQkoKChpKT4+MikmMHgwMykKKyNkZWZpbmUgICBFU19QMV9NT0RFTyhvKQkoKChvKSYweDAzKTw8MCkJLyogREFDMSBtb2RlOyAtLSAnJyAtLSAqLworI2RlZmluZSAgIEVTX1AxX01PREVNCQkoMHgwMzw8MCkJLyogbWFzayBmb3IgYWJvdmUgKi8KKyNkZWZpbmUgICBFU19QMV9NT0RFSShpKQkoKChpKT4+MCkmMHgwMykKKworI2RlZmluZSBFU19SRUdfREFDMV9DT1VOVCAweDI0CS8qIFIvVzogREFDMSBzYW1wbGUgY291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNfUkVHX0RBQzJfQ09VTlQgMHgyOAkvKiBSL1c6IERBQzIgc2FtcGxlIGNvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIEVTX1JFR19BRENfQ09VTlQgIDB4MmMJLyogUi9XOiBBREMgc2FtcGxlIGNvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lICAgRVNfUkVHX0NVUlJfQ09VTlQoaSkgICgoKGkpPj4xNikmMHhmZmZmKQorI2RlZmluZSAgIEVTX1JFR19DT1VOVE8obykJKCgobykmMHhmZmZmKTw8MCkKKyNkZWZpbmUgICBFU19SRUdfQ09VTlRNCQkoMHhmZmZmPDwwKQorI2RlZmluZSAgIEVTX1JFR19DT1VOVEkoaSkJKCgoaSk+PjApJjB4ZmZmZikKKworI2RlZmluZSBFU19SRUdfREFDMV9GUkFNRSAweDMwCS8qIFIvVzogUEFHRSAweDBjOyBEQUMxIGZyYW1lIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVNfUkVHX0RBQzFfU0laRSAgMHgzNAkvKiBSL1c6IFBBR0UgMHgwYzsgREFDMSBmcmFtZSBzaXplICovCisjZGVmaW5lIEVTX1JFR19EQUMyX0ZSQU1FIDB4MzgJLyogUi9XOiBQQUdFIDB4MGM7IERBQzIgZnJhbWUgYWRkcmVzcyAqLworI2RlZmluZSBFU19SRUdfREFDMl9TSVpFICAweDNjCS8qIFIvVzogUEFHRSAweDBjOyBEQUMyIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUgRVNfUkVHX0FEQ19GUkFNRSAgMHgzMAkvKiBSL1c6IFBBR0UgMHgwZDsgQURDIGZyYW1lIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVNfUkVHX0FEQ19TSVpFCSAgMHgzNAkvKiBSL1c6IFBBR0UgMHgwZDsgQURDIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUgICBFU19SRUdfRkNVUlJfQ09VTlRPKG8pICgoKG8pJjB4ZmZmZik8PDE2KQorI2RlZmluZSAgIEVTX1JFR19GQ1VSUl9DT1VOVE0gICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lICAgRVNfUkVHX0ZDVVJSX0NPVU5USShpKSAoKChpKT4+MTQpJjB4M2ZmZmMpCisjZGVmaW5lICAgRVNfUkVHX0ZTSVpFTyhvKQkgKCgobykmMHhmZmZmKTw8MCkKKyNkZWZpbmUgICBFU19SRUdfRlNJWkVNCQkgKDB4ZmZmZjw8MCkKKyNkZWZpbmUgICBFU19SRUdfRlNJWkVJKGkpCSAoKChpKT4+MCkmMHhmZmZmKQorI2RlZmluZSBFU19SRUdfUEhBTlRPTV9GUkFNRSAweDM4IC8qIFIvVzogUEFHRSAweDBkOiBwaGFudG9tIGZyYW1lIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVNfUkVHX1BIQU5UT01fQ09VTlQgMHgzYyAvKiBSL1c6IFBBR0UgMHgwZDogcGhhbnRvbSBmcmFtZSBjb3VudCAqLworCisjZGVmaW5lIEVTX1JFR19VQVJUX0ZJRk8gIDB4MzAJLyogUi9XOiBQQUdFIDB4MGU7IFVBUlQgRklGTyByZWdpc3RlciAqLworI2RlZmluZSAgIEVTX1JFR19VRl9WQUxJRAkgKDE8PDgpCisjZGVmaW5lICAgRVNfUkVHX1VGX0JZVEVPKG8pCSAoKChvKSYweGZmKTw8MCkKKyNkZWZpbmUgICBFU19SRUdfVUZfQllURU0JICgweGZmPDwwKQorI2RlZmluZSAgIEVTX1JFR19VRl9CWVRFSShpKQkgKCgoaSk+PjApJjB4ZmYpCisKKworLyoKKyAqICBQYWdlcworICovCisKKyNkZWZpbmUgRVNfUEFHRV9EQUMJMHgwYworI2RlZmluZSBFU19QQUdFX0FEQwkweDBkCisjZGVmaW5lIEVTX1BBR0VfVUFSVAkweDBlCisjZGVmaW5lIEVTX1BBR0VfVUFSVDEJMHgwZgorCisvKgorICogIFNhbXBsZSByYXRlIGNvbnZlcnRlciBhZGRyZXNzZXMKKyAqLworCisjZGVmaW5lIEVTX1NNUFJFR19EQUMxCQkweDcwCisjZGVmaW5lIEVTX1NNUFJFR19EQUMyCQkweDc0CisjZGVmaW5lIEVTX1NNUFJFR19BREMJCTB4NzgKKyNkZWZpbmUgRVNfU01QUkVHX1ZPTF9BREMJMHg2YworI2RlZmluZSBFU19TTVBSRUdfVk9MX0RBQzEJMHg3YworI2RlZmluZSBFU19TTVBSRUdfVk9MX0RBQzIJMHg3ZQorI2RlZmluZSBFU19TTVBSRUdfVFJVTkNfTgkweDAwCisjZGVmaW5lIEVTX1NNUFJFR19JTlRfUkVHUwkweDAxCisjZGVmaW5lIEVTX1NNUFJFR19BQ0NVTV9GUkFDCTB4MDIKKyNkZWZpbmUgRVNfU01QUkVHX1ZGUkVRX0ZSQUMJMHgwMworCisvKgorICogIFNvbWUgY29udGFudHMKKyAqLworCisjZGVmaW5lIEVTXzEzNzBfU1JDTE9DSwkgICAxNDExMjAwCisjZGVmaW5lIEVTXzEzNzBfU1JUT0RJVih4KSAoRVNfMTM3MF9TUkNMT0NLLyh4KS0yKQorCisvKgorICogIE9wZW4gbW9kZXMKKyAqLworCisjZGVmaW5lIEVTX01PREVfUExBWTEJMHgwMDAxCisjZGVmaW5lIEVTX01PREVfUExBWTIJMHgwMDAyCisjZGVmaW5lIEVTX01PREVfQ0FQVFVSRQkweDAwMDQKKworI2RlZmluZSBFU19NT0RFX09VVFBVVAkweDAwMDEJLyogZm9yIE1JREkgKi8KKyNkZWZpbmUgRVNfTU9ERV9JTlBVVAkweDAwMDIJLyogZm9yIE1JREkgKi8KKworLyoKKworICovCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfZW5zb25pcSBlbnNvbmlxX3Q7CisKK3N0cnVjdCBfc25kX2Vuc29uaXEgeworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBzcmNfbXV0ZXg7CisKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBwbGF5YmFjazFzaXplOworCXVuc2lnbmVkIGxvbmcgcGxheWJhY2syc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGNhcHR1cmUzc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwl1bnNpZ25lZCBpbnQgdWFydG07CS8qIFVBUlQgbW9kZSAqLworCisJdW5zaWduZWQgaW50IGN0cmw7CS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2N0cmw7CS8qIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IGNzc3I7CS8qIGNvbnRyb2wgc3RhdHVzIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IHVhcnRjOwkvKiB1YXJ0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmV2OwkvKiBjaGlwIHJldmlzaW9uICovCisKKwl1bmlvbiB7CisjaWZkZWYgQ0hJUDEzNzEKKwkJc3RydWN0IHsKKwkJCWFjOTdfdCAqYWM5NzsKKwkJfSBlczEzNzE7CisjZWxzZQorCQlzdHJ1Y3QgeworCQkJaW50IHBjbGtkaXZfbG9jazsKKwkJCWFrNDUzMV90ICphazQ1MzE7CisJCX0gZXMxMzcwOworI2VuZGlmCisJfSB1OworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwl1bnNpZ25lZCBzaG9ydCBzdWJzeXN0ZW1fdmVuZG9yX2lkOworCXVuc2lnbmVkIHNob3J0IHN1YnN5c3RlbV9kZXZpY2VfaWQ7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfcGNtX3QgKnBjbTE7CS8qIERBQzEvQURDIFBDTSAqLworCXNuZF9wY21fdCAqcGNtMjsJLyogREFDMiBQQ00gKi8KKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpwbGF5YmFjazFfc3Vic3RyZWFtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrMl9zdWJzdHJlYW07CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqY2FwdHVyZV9zdWJzdHJlYW07CisJdW5zaWduZWQgaW50IHAxX2RtYV9zaXplOworCXVuc2lnbmVkIGludCBwMl9kbWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY19kbWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcDFfcGVyaW9kX3NpemU7CisJdW5zaWduZWQgaW50IHAyX3BlcmlvZF9zaXplOworCXVuc2lnbmVkIGludCBjX3BlcmlvZF9zaXplOworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCXNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICptaWRpX2lucHV0OworCXNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICptaWRpX291dHB1dDsKKworCXVuc2lnbmVkIGludCBzcGRpZjsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfZGVmYXVsdDsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfc3RyZWFtOworCisjaWZkZWYgQ0hJUDEzNzAKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX2J1ZzsKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisjZW5kaWYKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfYXVkaW9wY2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2F1ZGlvcGNpX2lkc1tdID0geworI2lmZGVmIENISVAxMzcwCisJeyAweDEyNzQsIDB4NTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwJLyogRVMxMzcwICovCisjZW5kaWYKKyNpZmRlZiBDSElQMTM3MQorCXsgMHgxMjc0LCAweDEzNzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCS8qIEVTMTM3MSAqLworCXsgMHgxMjc0LCAweDU4ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCS8qIEVTMTM3MyAtIENUNTg4MCAqLworCXsgMHgxMTAyLCAweDg5MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCS8qIEVjdGl2YSBFVjE5MzggKi8KKyNlbmRpZgorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9hdWRpb3BjaV9pZHMpOworCisvKgorICogIGNvbnN0YW50cworICovCisKKyNkZWZpbmUgUE9MTF9DT1VOVAkweGEwMDAKKworI2lmZGVmIENISVAxMzcwCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9lczEzNzBfZml4ZWRfcmF0ZXNbXSA9CisJezU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDB9Oworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3Qgc25kX2VzMTM3MF9od19jb25zdHJhaW50c19yYXRlcyA9IHsKKwkuY291bnQgPSA0LCAKKwkubGlzdCA9IHNuZF9lczEzNzBfZml4ZWRfcmF0ZXMsCisJLm1hc2sgPSAwLAorfTsKK3N0YXRpYyByYXRudW1fdCBlczEzNzBfY2xvY2sgPSB7CisJLm51bSA9IEVTXzEzNzBfU1JDTE9DSywKKwkuZGVuX21pbiA9IDI5LCAKKwkuZGVuX21heCA9IDM1MywKKwkuZGVuX3N0ZXAgPSAxLAorfTsKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtc190IHNuZF9lczEzNzBfaHdfY29uc3RyYWludHNfY2xvY2sgPSB7CisJLm5yYXRzID0gMSwKKwkucmF0cyA9ICZlczEzNzBfY2xvY2ssCit9OworI2Vsc2UKK3N0YXRpYyByYXRkZW5fdCBlczEzNzFfZGFjX2Nsb2NrID0geworCS5udW1fbWluID0gMzAwMCAqICgxIDw8IDE1KSwKKwkubnVtX21heCA9IDQ4MDAwICogKDEgPDwgMTUpLAorCS5udW1fc3RlcCA9IDMwMDAsCisJLmRlbiA9IDEgPDwgMTUsCit9Oworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zX3Qgc25kX2VzMTM3MV9od19jb25zdHJhaW50c19kYWNfY2xvY2sgPSB7CisJLm5yYXRzID0gMSwKKwkucmF0cyA9ICZlczEzNzFfZGFjX2Nsb2NrLAorfTsKK3N0YXRpYyByYXRudW1fdCBlczEzNzFfYWRjX2Nsb2NrID0geworCS5udW0gPSA0ODAwMCA8PCAxNSwKKwkuZGVuX21pbiA9IDMyNzY4LCAKKwkuZGVuX21heCA9IDM5MzIxNiwKKwkuZGVuX3N0ZXAgPSAxLAorfTsKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtc190IHNuZF9lczEzNzFfaHdfY29uc3RyYWludHNfYWRjX2Nsb2NrID0geworCS5ucmF0cyA9IDEsCisJLnJhdHMgPSAmZXMxMzcxX2FkY19jbG9jaywKK307CisjZW5kaWYKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc25kX2Vuc29uaXFfc2FtcGxlX3NoaWZ0W10gPQorCXswLCAxLCAxLCAyfTsKKworLyoKKyAqICBjb21tb24gSS9PIHJvdXRpbmVzCisgKi8KKworI2lmZGVmIENISVAxMzcxCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxX3QgKiBlbnNvbmlxKQoreworCXVuc2lnbmVkIGludCB0LCByID0gMDsKKworCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJciA9IGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJCWlmICgociAmIEVTXzEzNzFfU1JDX1JBTV9CVVNZKSA9PSAwKQorCQkJcmV0dXJuIHI7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlzbmRfcHJpbnRrKCJ3YWl0IHNvdXJjZSByZWFkeSB0aW1lb3V0IDB4JWx4IFsweCV4XVxuIiwgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSksIHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9lczEzNzFfc3JjX3JlYWQoZW5zb25pcV90ICogZW5zb25pcSwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIGludCB0ZW1wLCBpLCBvcmlnLCByOworCisJLyogd2FpdCBmb3IgcmVhZHkgKi8KKwl0ZW1wID0gb3JpZyA9IHNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSk7CisKKwkvKiBleHBvc2UgdGhlIFNSQyBzdGF0ZSBiaXRzICovCisJciA9IHRlbXAgJiAoRVNfMTM3MV9TUkNfRElTQUJMRSB8IEVTXzEzNzFfRElTX1AxIHwKKwkJICAgIEVTXzEzNzFfRElTX1AyIHwgRVNfMTM3MV9ESVNfUjEpOworCXIgfD0gRVNfMTM3MV9TUkNfUkFNX0FERFJPKHJlZykgfCAweDEwMDAwOworCW91dGwociwgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSkpOworCisJLyogbm93LCB3YWl0IGZvciBidXN5IGFuZCB0aGUgY29ycmVjdCB0aW1lIHRvIHJlYWQgKi8KKwl0ZW1wID0gc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKTsKKwkKKwlpZiAoKHRlbXAgJiAweDAwODcwMDAwKSAhPSAweDAwMDEwMDAwKSB7CisJCS8qIHdhaXQgZm9yIHRoZSByaWdodCBzdGF0ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKSB7CisJCQl0ZW1wID0gaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKTsKKwkJCWlmICgodGVtcCAmIDB4MDA4NzAwMDApID09IDB4MDAwMTAwMDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBoaWRlIHRoZSBzdGF0ZSBiaXRzICovCQorCXIgPSBvcmlnICYgKEVTXzEzNzFfU1JDX0RJU0FCTEUgfCBFU18xMzcxX0RJU19QMSB8CisJCSAgIEVTXzEzNzFfRElTX1AyIHwgRVNfMTM3MV9ESVNfUjEpOworCXIgfD0gRVNfMTM3MV9TUkNfUkFNX0FERFJPKHJlZyk7CisJb3V0bChyLCBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXFfdCAqIGVuc29uaXEsCisJCQkJIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcjsKKworCXIgPSBzbmRfZXMxMzcxX3dhaXRfc3JjX3JlYWR5KGVuc29uaXEpICYKKwkgICAgKEVTXzEzNzFfU1JDX0RJU0FCTEUgfCBFU18xMzcxX0RJU19QMSB8CisJICAgICBFU18xMzcxX0RJU19QMiB8IEVTXzEzNzFfRElTX1IxKTsKKwlyIHw9IEVTXzEzNzFfU1JDX1JBTV9BRERSTyhyZWcpIHwgRVNfMTM3MV9TUkNfUkFNX0RBVEFPKGRhdGEpOworCW91dGwociB8IEVTXzEzNzFfU1JDX1JBTV9XRSwgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSkpOworfQorCisjZW5kaWYgLyogQ0hJUDEzNzEgKi8KKworI2lmZGVmIENISVAxMzcwCisKK3N0YXRpYyB2b2lkIHNuZF9lczEzNzBfY29kZWNfd3JpdGUoYWs0NTMxX3QgKmFrNDUzMSwKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBhazQ1MzEtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lID0gamlmZmllcyArIEhaIC8gMTA7CisKKyNpZiAwCisJcHJpbnRrKCJDT0RFQyBXUklURTogcmVnID0gMHgleCwgdmFsID0gMHgleCAoMHgleCksIGNyZWcgPSAweCV4XG4iLCByZWcsIHZhbCwgRVNfMTM3MF9DT0RFQ19XUklURShyZWcsIHZhbCksIEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CisjZW5kaWYKKwlkbyB7CisJCWlmICghKGlubChFU19SRUcoZW5zb25pcSwgU1RBVFVTKSkgJiBFU18xMzcwX0NTVEFUKSkgeworCQkJb3V0dyhFU18xMzcwX0NPREVDX1dSSVRFKHJlZywgdmFsKSwgRVNfUkVHKGVuc29uaXEsIDEzNzBfQ09ERUMpKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZSAodGltZV9hZnRlcihlbmRfdGltZSwgamlmZmllcykpOworCXNuZF9wcmludGsoImNvZGVjIHdyaXRlIHRpbWVvdXQsIHN0YXR1cyA9IDB4JXhcbiIsIGlubChFU19SRUcoZW5zb25pcSwgU1RBVFVTKSkpOworfQorCisjZW5kaWYgLyogQ0hJUDEzNzAgKi8KKworI2lmZGVmIENISVAxMzcxCisKK3N0YXRpYyB2b2lkIHNuZF9lczEzNzFfY29kZWNfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdCwgeDsKKworCWRvd24oJmVuc29uaXEtPnNyY19tdXRleCk7CisJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykgeworCQlpZiAoIShpbmwoRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpKSAmIEVTXzEzNzFfQ09ERUNfV0lQKSkgeworCQkJLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBmb3IgbGF0dGVyICovCisJCQl4ID0gc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKTsKKwkJCW91dGwoKHggJiAoRVNfMTM3MV9TUkNfRElTQUJMRSB8IEVTXzEzNzFfRElTX1AxIHwKKwkJCSAgICAgICAgICAgRVNfMTM3MV9ESVNfUDIgfCBFU18xMzcxX0RJU19SMSkpIHwgMHgwMDAxMDAwMCwKKwkJCSAgICAgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSkpOworCQkJLyogd2FpdCBmb3Igbm90IGJ1c3kgKHN0YXRlIDApIGZpcnN0IHRvIGF2b2lkCisJCQkgICB0cmFuc2l0aW9uIHN0YXRlcyAqLworCQkJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykgeworCQkJCWlmICgoaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKSAmIDB4MDA4NzAwMDApID09IDB4MDAwMDAwMDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJLyogd2FpdCBmb3IgYSBTQUZFIHRpbWUgdG8gd3JpdGUgYWRkci9kYXRhIGFuZCB0aGVuIGRvIGl0LCBkYW1taXQgKi8KKwkJCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJCQlpZiAoKGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSkgJiAweDAwODcwMDAwKSA9PSAweDAwMDEwMDAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCW91dGwoRVNfMTM3MV9DT0RFQ19XUklURShyZWcsIHZhbCksIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSk7CisJCQkvKiByZXN0b3JlIFNSQyByZWcgKi8KKwkJCXNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSk7CisJCQlvdXRsKHgsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKTsKKwkJCXVwKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCQkJcmV0dXJuOworCQl9CisJfQorCXVwKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCXNuZF9wcmludGsoImNvZGVjIHdyaXRlIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLCBFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQyksIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9lczEzNzFfY29kZWNfcmVhZChhYzk3X3QgKmFjOTcsCisJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB0LCB4LCBmYWlsID0gMDsKKworICAgICAgX19hZ2FpbjoKKwlkb3duKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJaWYgKCEoaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSkgJiBFU18xMzcxX0NPREVDX1dJUCkpIHsKKwkJCS8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGxhdHRlciAqLworCQkJeCA9IHNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSk7CisJCQlvdXRsKCh4ICYgKEVTXzEzNzFfU1JDX0RJU0FCTEUgfCBFU18xMzcxX0RJU19QMSB8CisJCQkgICAgICAgICAgIEVTXzEzNzFfRElTX1AyIHwgRVNfMTM3MV9ESVNfUjEpKSB8IDB4MDAwMTAwMDAsCisJCQkgICAgIEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKTsKKwkJCS8qIHdhaXQgZm9yIG5vdCBidXN5IChzdGF0ZSAwKSBmaXJzdCB0byBhdm9pZAorCQkJICAgdHJhbnNpdGlvbiBzdGF0ZXMgKi8KKwkJCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJCQlpZiAoKGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSkgJiAweDAwODcwMDAwKSA9PSAweDAwMDAwMDAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCS8qIHdhaXQgZm9yIGEgU0FGRSB0aW1lIHRvIHdyaXRlIGFkZHIvZGF0YSBhbmQgdGhlbiBkbyBpdCwgZGFtbWl0ICovCisJCQlmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKSB7CisJCQkJaWYgKChpbmwoRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSkpICYgMHgwMDg3MDAwMCkgPT0gMHgwMDAxMDAwMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlvdXRsKEVTXzEzNzFfQ09ERUNfUkVBRFMocmVnKSwgRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpKTsKKwkJCS8qIHJlc3RvcmUgU1JDIHJlZyAqLworCQkJc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKTsKKwkJCW91dGwoeCwgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSkpOworCQkJLyogd2FpdCBmb3IgV0lQIGFnYWluICovCisJCQlmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKSB7CisJCQkJaWYgKCEoaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSkgJiBFU18xMzcxX0NPREVDX1dJUCkpCisJCQkJCWJyZWFrOwkJCisJCQl9CisJCQkvKiBub3cgd2FpdCBmb3IgdGhlIHN0aW5raW4nIGRhdGEgKFJEWSkgKi8KKwkJCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJCQlpZiAoKHggPSBpbmwoRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpKSkgJiBFU18xMzcxX0NPREVDX1JEWSkgeworCQkJCQl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKKwkJCQkJcmV0dXJuIEVTXzEzNzFfQ09ERUNfUkVBRCh4KTsKKwkJCQl9CisJCQl9CisJCQl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKKwkJCWlmICgrK2ZhaWwgPiAxMCkgeworCQkJCXNuZF9wcmludGsoImNvZGVjIHJlYWQgdGltZW91dCAoZmluYWwpIGF0IDB4JWx4LCByZWcgPSAweCV4IFsweCV4XVxuIiwgRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpLCByZWcsIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWdvdG8gX19hZ2FpbjsKKwkJfQorCX0KKwl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKKwlzbmRfcHJpbnRrKCJlczEzNzE6IGNvZGVjIHJlYWQgdGltZW91dCBhdCAweCVseCBbMHgleF1cbiIsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSwgaW5sKEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfZXMxMzcxX2FkY19yYXRlKGVuc29uaXFfdCAqIGVuc29uaXEsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGludCBuLCB0cnVuY20sIGZyZXEsIHJlc3VsdDsKKworCWRvd24oJmVuc29uaXEtPnNyY19tdXRleCk7CisJbiA9IHJhdGUgLyAzMDAwOworCWlmICgoMSA8PCBuKSAmICgoMSA8PCAxNSkgfCAoMSA8PCAxMykgfCAoMSA8PCAxMSkgfCAoMSA8PCA5KSkpCisJCW4tLTsKKwl0cnVuY20gPSAoMjEgKiBuIC0gMSkgfCAxOworCWZyZXEgPSAoKDQ4MDAwVUwgPDwgMTUpIC8gcmF0ZSkgKiBuOworCXJlc3VsdCA9ICg0ODAwMFVMIDw8IDE1KSAvIChmcmVxIC8gbik7CisJaWYgKHJhdGUgPj0gMjQwMDApIHsKKwkJaWYgKHRydW5jbSA+IDIzOSkKKwkJCXRydW5jbSA9IDIzOTsKKwkJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX0FEQyArIEVTX1NNUFJFR19UUlVOQ19OLAorCQkJCSgoKDIzOSAtIHRydW5jbSkgPj4gMSkgPDwgOSkgfCAobiA8PCA0KSk7CisJfSBlbHNlIHsKKwkJaWYgKHRydW5jbSA+IDExOSkKKwkJCXRydW5jbSA9IDExOTsKKwkJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX0FEQyArIEVTX1NNUFJFR19UUlVOQ19OLAorCQkJCTB4ODAwMCB8ICgoKDExOSAtIHRydW5jbSkgPj4gMSkgPDwgOSkgfCAobiA8PCA0KSk7CisJfQorCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19BREMgKyBFU19TTVBSRUdfSU5UX1JFR1MsCisJCQkgICAgIChzbmRfZXMxMzcxX3NyY19yZWFkKGVuc29uaXEsIEVTX1NNUFJFR19BREMgKyBFU19TTVBSRUdfSU5UX1JFR1MpICYgMHgwMGZmKSB8CisJCQkJICAgICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfQURDICsgRVNfU01QUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19WT0xfQURDLCBuIDw8IDgpOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19WT0xfQURDICsgMSwgbiA8PCA4KTsKKwl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTM3MV9kYWMxX3JhdGUoZW5zb25pcV90ICogZW5zb25pcSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGZyZXEsIHI7CisKKwlkb3duKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCWZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMTUwMCkgLyAzMDAwOworCXIgPSAoc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKSAmIChFU18xMzcxX1NSQ19ESVNBQkxFIHwgRVNfMTM3MV9ESVNfUDIgfCBFU18xMzcxX0RJU19SMSkpIHwgRVNfMTM3MV9ESVNfUDE7CisJb3V0bChyLCBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX0RBQzEgKyBFU19TTVBSRUdfSU5UX1JFR1MsCisJCQkgICAgIChzbmRfZXMxMzcxX3NyY19yZWFkKGVuc29uaXEsIEVTX1NNUFJFR19EQUMxICsgRVNfU01QUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAorCQkJICAgICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfREFDMSArIEVTX1NNUFJFR19WRlJFUV9GUkFDLCBmcmVxICYgMHg3ZmZmKTsKKwlyID0gKHNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSkgJiAoRVNfMTM3MV9TUkNfRElTQUJMRSB8IEVTXzEzNzFfRElTX1AyIHwgRVNfMTM3MV9ESVNfUjEpKTsKKwlvdXRsKHIsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKTsKKwl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTM3MV9kYWMyX3JhdGUoZW5zb25pcV90ICogZW5zb25pcSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGZyZXEsIHI7CisKKwlkb3duKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCWZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMTUwMCkgLyAzMDAwOworCXIgPSAoc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKSAmIChFU18xMzcxX1NSQ19ESVNBQkxFIHwgRVNfMTM3MV9ESVNfUDEgfCBFU18xMzcxX0RJU19SMSkpIHwgRVNfMTM3MV9ESVNfUDI7CisJb3V0bChyLCBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX0RBQzIgKyBFU19TTVBSRUdfSU5UX1JFR1MsCisJCQkgICAgIChzbmRfZXMxMzcxX3NyY19yZWFkKGVuc29uaXEsIEVTX1NNUFJFR19EQUMyICsgRVNfU01QUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAorCQkJICAgICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfREFDMiArIEVTX1NNUFJFR19WRlJFUV9GUkFDLCBmcmVxICYgMHg3ZmZmKTsKKwlyID0gKHNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSkgJiAoRVNfMTM3MV9TUkNfRElTQUJMRSB8IEVTXzEzNzFfRElTX1AxIHwgRVNfMTM3MV9ESVNfUjEpKTsKKwlvdXRsKHIsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX1NNUFJBVEUpKTsKKwl1cCgmZW5zb25pcS0+c3JjX211dGV4KTsKK30KKworI2VuZGlmIC8qIENISVAxMzcxICovCisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwl7CisJCXVuc2lnbmVkIGludCB3aGF0ID0gMDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CisJCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJCWlmIChzID09IGVuc29uaXEtPnBsYXliYWNrMV9zdWJzdHJlYW0pIHsKKwkJCQl3aGF0IHw9IEVTX1AxX1BBVVNFOworCQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CisJCQl9IGVsc2UgaWYgKHMgPT0gZW5zb25pcS0+cGxheWJhY2syX3N1YnN0cmVhbSkgeworCQkJCXdoYXQgfD0gRVNfUDJfUEFVU0U7CisJCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJCX0gZWxzZSBpZiAocyA9PSBlbnNvbmlxLT5jYXB0dXJlX3N1YnN0cmVhbSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzcGluX2xvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwkJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIKQorCQkJZW5zb25pcS0+c2N0cmwgfD0gd2hhdDsKKwkJZWxzZQorCQkJZW5zb25pcS0+c2N0cmwgJj0gfndoYXQ7CisJCW91dGwoZW5zb25pcS0+c2N0cmwsIEVTX1JFRyhlbnNvbmlxLCBTRVJJQUwpKTsKKwkJc3Bpbl91bmxvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCXsKKwkJdW5zaWduZWQgaW50IHdoYXQgPSAwOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCXNuZF9wY21fc3Vic3RyZWFtX3QgKnM7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKKwkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQkJaWYgKHMgPT0gZW5zb25pcS0+cGxheWJhY2sxX3N1YnN0cmVhbSkgeworCQkJCXdoYXQgfD0gRVNfREFDMV9FTjsKKwkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOworCQkJfSBlbHNlIGlmIChzID09IGVuc29uaXEtPnBsYXliYWNrMl9zdWJzdHJlYW0pIHsKKwkJCQl3aGF0IHw9IEVTX0RBQzJfRU47CisJCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJCX0gZWxzZSBpZiAocyA9PSBlbnNvbmlxLT5jYXB0dXJlX3N1YnN0cmVhbSkgeworCQkJCXdoYXQgfD0gRVNfQURDX0VOOworCQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CisJCQl9CisJCX0KKwkJc3Bpbl9sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpCisJCQllbnNvbmlxLT5jdHJsIHw9IHdoYXQ7CisJCWVsc2UKKwkJCWVuc29uaXEtPmN0cmwgJj0gfndoYXQ7CisJCW91dGwoZW5zb25pcS0+Y3RybCwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKKwkJc3Bpbl91bmxvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBQQ00gcGFydAorICovCisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfcGxheWJhY2sxX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IG1vZGUgPSAwOworCisJZW5zb25pcS0+cDFfZG1hX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwllbnNvbmlxLT5wMV9wZXJpb2Rfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQltb2RlIHw9IDB4MDI7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID4gMSkKKwkJbW9kZSB8PSAweDAxOworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwllbnNvbmlxLT5jdHJsICY9IH5FU19EQUMxX0VOOworI2lmZGVmIENISVAxMzcxCisJLyogNDhrIGRvZXNuJ3QgbmVlZCBTUkMgKGl0IGJyZWFrcyBBQzMtcGFzc3RocnUpICovCisJaWYgKHJ1bnRpbWUtPnJhdGUgPT0gNDgwMDApCisJCWVuc29uaXEtPmN0cmwgfD0gRVNfMTM3M19CWVBBU1NfUDE7CisJZWxzZQorCQllbnNvbmlxLT5jdHJsICY9IH5FU18xMzczX0JZUEFTU19QMTsKKyNlbmRpZgorCW91dGwoZW5zb25pcS0+Y3RybCwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKKwlvdXRsKEVTX01FTV9QQUdFTyhFU19QQUdFX0RBQyksIEVTX1JFRyhlbnNvbmlxLCBNRU1fUEFHRSkpOworCW91dGwocnVudGltZS0+ZG1hX2FkZHIsIEVTX1JFRyhlbnNvbmlxLCBEQUMxX0ZSQU1FKSk7CisJb3V0bCgoZW5zb25pcS0+cDFfZG1hX3NpemUgPj4gMikgLSAxLCBFU19SRUcoZW5zb25pcSwgREFDMV9TSVpFKSk7CisJZW5zb25pcS0+c2N0cmwgJj0gfihFU19QMV9MT09QX1NFTCB8IEVTX1AxX1BBVVNFIHwgRVNfUDFfU0NUX1JMRCB8IEVTX1AxX01PREVNKTsKKwllbnNvbmlxLT5zY3RybCB8PSBFU19QMV9JTlRfRU4gfCBFU19QMV9NT0RFTyhtb2RlKTsKKwlvdXRsKGVuc29uaXEtPnNjdHJsLCBFU19SRUcoZW5zb25pcSwgU0VSSUFMKSk7CisJb3V0bCgoZW5zb25pcS0+cDFfcGVyaW9kX3NpemUgPj4gc25kX2Vuc29uaXFfc2FtcGxlX3NoaWZ0W21vZGVdKSAtIDEsIEVTX1JFRyhlbnNvbmlxLCBEQUMxX0NPVU5UKSk7CisjaWZkZWYgQ0hJUDEzNzAKKwllbnNvbmlxLT5jdHJsICY9IH5FU18xMzcwX1dUU1JTRUxNOworCXN3aXRjaCAocnVudGltZS0+cmF0ZSkgeworCWNhc2UgNTUxMjogZW5zb25pcS0+Y3RybCB8PSBFU18xMzcwX1dUU1JTRUwoMCk7IGJyZWFrOworCWNhc2UgMTEwMjU6IGVuc29uaXEtPmN0cmwgfD0gRVNfMTM3MF9XVFNSU0VMKDEpOyBicmVhazsKKwljYXNlIDIyMDUwOiBlbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzBfV1RTUlNFTCgyKTsgYnJlYWs7CisJY2FzZSA0NDEwMDogZW5zb25pcS0+Y3RybCB8PSBFU18xMzcwX1dUU1JTRUwoMyk7IGJyZWFrOworCWRlZmF1bHQ6IHNuZF9CVUcoKTsKKwl9CisjZW5kaWYKKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisjaWZuZGVmIENISVAxMzcwCisJc25kX2VzMTM3MV9kYWMxX3JhdGUoZW5zb25pcSwgcnVudGltZS0+cmF0ZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9wbGF5YmFjazJfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IDA7CisKKwllbnNvbmlxLT5wMl9kbWFfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWVuc29uaXEtPnAyX3BlcmlvZF9zaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJaWYgKHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYpCisJCW1vZGUgfD0gMHgwMjsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKQorCQltb2RlIHw9IDB4MDE7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWVuc29uaXEtPmN0cmwgJj0gfkVTX0RBQzJfRU47CisJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCW91dGwoRVNfTUVNX1BBR0VPKEVTX1BBR0VfREFDKSwgRVNfUkVHKGVuc29uaXEsIE1FTV9QQUdFKSk7CisJb3V0bChydW50aW1lLT5kbWFfYWRkciwgRVNfUkVHKGVuc29uaXEsIERBQzJfRlJBTUUpKTsKKwlvdXRsKChlbnNvbmlxLT5wMl9kbWFfc2l6ZSA+PiAyKSAtIDEsIEVTX1JFRyhlbnNvbmlxLCBEQUMyX1NJWkUpKTsKKwllbnNvbmlxLT5zY3RybCAmPSB+KEVTX1AyX0xPT1BfU0VMIHwgRVNfUDJfUEFVU0UgfCBFU19QMl9EQUNfU0VOIHwKKwkJCSAgICBFU19QMl9FTkRfSU5DTSB8IEVTX1AyX1NUX0lOQ00gfCBFU19QMl9NT0RFTSk7CisJZW5zb25pcS0+c2N0cmwgfD0gRVNfUDJfSU5UX0VOIHwgRVNfUDJfTU9ERU8obW9kZSkgfAorCQkJICBFU19QMl9FTkRfSU5DTyhtb2RlICYgMiA/IDIgOiAxKSB8IEVTX1AyX1NUX0lOQ08oMCk7CisJb3V0bChlbnNvbmlxLT5zY3RybCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOworCW91dGwoKGVuc29uaXEtPnAyX3BlcmlvZF9zaXplID4+IHNuZF9lbnNvbmlxX3NhbXBsZV9zaGlmdFttb2RlXSkgLSAxLCBFU19SRUcoZW5zb25pcSwgREFDMl9DT1VOVCkpOworI2lmZGVmIENISVAxMzcwCisJaWYgKCEoZW5zb25pcS0+dS5lczEzNzAucGNsa2Rpdl9sb2NrICYgRVNfTU9ERV9DQVBUVVJFKSkgeworCQllbnNvbmlxLT5jdHJsICY9IH5FU18xMzcwX1BDTEtESVZNOworCQllbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzBfUENMS0RJVk8oRVNfMTM3MF9TUlRPRElWKHJ1bnRpbWUtPnJhdGUpKTsKKwkJZW5zb25pcS0+dS5lczEzNzAucGNsa2Rpdl9sb2NrIHw9IEVTX01PREVfUExBWTI7CisJfQorI2VuZGlmCisJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCXNwaW5fdW5sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworI2lmbmRlZiBDSElQMTM3MAorCXNuZF9lczEzNzFfZGFjMl9yYXRlKGVuc29uaXEsIHJ1bnRpbWUtPnJhdGUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXVuc2lnbmVkIGludCBtb2RlID0gMDsKKworCWVuc29uaXEtPmNfZG1hX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwllbnNvbmlxLT5jX3BlcmlvZF9zaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJaWYgKHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYpCisJCW1vZGUgfD0gMHgwMjsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKQorCQltb2RlIHw9IDB4MDE7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWVuc29uaXEtPmN0cmwgJj0gfkVTX0FEQ19FTjsKKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJb3V0bChFU19NRU1fUEFHRU8oRVNfUEFHRV9BREMpLCBFU19SRUcoZW5zb25pcSwgTUVNX1BBR0UpKTsKKwlvdXRsKHJ1bnRpbWUtPmRtYV9hZGRyLCBFU19SRUcoZW5zb25pcSwgQURDX0ZSQU1FKSk7CisJb3V0bCgoZW5zb25pcS0+Y19kbWFfc2l6ZSA+PiAyKSAtIDEsIEVTX1JFRyhlbnNvbmlxLCBBRENfU0laRSkpOworCWVuc29uaXEtPnNjdHJsICY9IH4oRVNfUjFfTE9PUF9TRUwgfCBFU19SMV9NT0RFTSk7CisJZW5zb25pcS0+c2N0cmwgfD0gRVNfUjFfSU5UX0VOIHwgRVNfUjFfTU9ERU8obW9kZSk7CisJb3V0bChlbnNvbmlxLT5zY3RybCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOworCW91dGwoKGVuc29uaXEtPmNfcGVyaW9kX3NpemUgPj4gc25kX2Vuc29uaXFfc2FtcGxlX3NoaWZ0W21vZGVdKSAtIDEsIEVTX1JFRyhlbnNvbmlxLCBBRENfQ09VTlQpKTsKKyNpZmRlZiBDSElQMTM3MAorCWlmICghKGVuc29uaXEtPnUuZXMxMzcwLnBjbGtkaXZfbG9jayAmIEVTX01PREVfUExBWTIpKSB7CisJCWVuc29uaXEtPmN0cmwgJj0gfkVTXzEzNzBfUENMS0RJVk07CisJCWVuc29uaXEtPmN0cmwgfD0gRVNfMTM3MF9QQ0xLRElWTyhFU18xMzcwX1NSVE9ESVYocnVudGltZS0+cmF0ZSkpOworCQllbnNvbmlxLT51LmVzMTM3MC5wY2xrZGl2X2xvY2sgfD0gRVNfTU9ERV9DQVBUVVJFOworCX0KKyNlbmRpZgorCW91dGwoZW5zb25pcS0+Y3RybCwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKyNpZm5kZWYgQ0hJUDEzNzAKKwlzbmRfZXMxMzcxX2FkY19yYXRlKGVuc29uaXEsIHJ1bnRpbWUtPnJhdGUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZW5zb25pcV9wbGF5YmFjazFfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCisJc3Bpbl9sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJaWYgKGlubChFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpICYgRVNfREFDMV9FTikgeworCQlvdXRsKEVTX01FTV9QQUdFTyhFU19QQUdFX0RBQyksIEVTX1JFRyhlbnNvbmlxLCBNRU1fUEFHRSkpOworCQlwdHIgPSBFU19SRUdfRkNVUlJfQ09VTlRJKGlubChFU19SRUcoZW5zb25pcSwgREFDMV9TSVpFKSkpOworCQlwdHIgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworCX0gZWxzZSB7CisJCXB0ciA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lbnNvbmlxX3BsYXliYWNrMl9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisKKwlzcGluX2xvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlpZiAoaW5sKEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSkgJiBFU19EQUMyX0VOKSB7CisJCW91dGwoRVNfTUVNX1BBR0VPKEVTX1BBR0VfREFDKSwgRVNfUkVHKGVuc29uaXEsIE1FTV9QQUdFKSk7CisJCXB0ciA9IEVTX1JFR19GQ1VSUl9DT1VOVEkoaW5sKEVTX1JFRyhlbnNvbmlxLCBEQUMyX1NJWkUpKSk7CisJCXB0ciA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7CisJfSBlbHNlIHsKKwkJcHRyID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2Vuc29uaXFfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisKKwlzcGluX2xvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlpZiAoaW5sKEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSkgJiBFU19BRENfRU4pIHsKKwkJb3V0bChFU19NRU1fUEFHRU8oRVNfUEFHRV9BREMpLCBFU19SRUcoZW5zb25pcSwgTUVNX1BBR0UpKTsKKwkJcHRyID0gRVNfUkVHX0ZDVVJSX0NPVU5USShpbmwoRVNfUkVHKGVuc29uaXEsIEFEQ19TSVpFKSkpOworCQlwdHIgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworCX0gZWxzZSB7CisJCXB0ciA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZW5zb25pcV9wbGF5YmFjazEgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0KKyNpZm5kZWYgQ0hJUDEzNzAKKwkJCQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKyNlbHNlCisJCQkJKFNORFJWX1BDTV9SQVRFX0tOT1QgfCAJLyogNTUxMkh6IHJhdGUgKi8KKwkJCQkgU05EUlZfUENNX1JBVEVfMTEwMjUgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IAorCQkJCSBTTkRSVl9QQ01fUkFURV80NDEwMCksCisjZW5kaWYKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZW5zb25pcV9wbGF5YmFjazIgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgU05EUlZfUENNX0lORk9fUEFVU0UgfCAKKwkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZW5zb25pcV9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfcGxheWJhY2sxX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwllbnNvbmlxLT5tb2RlIHw9IEVTX01PREVfUExBWTE7CisJZW5zb25pcS0+cGxheWJhY2sxX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9lbnNvbmlxX3BsYXliYWNrMTsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWlmIChlbnNvbmlxLT5zcGRpZiAmJiBlbnNvbmlxLT5wbGF5YmFjazJfc3Vic3RyZWFtID09IE5VTEwpCisJCWVuc29uaXEtPnNwZGlmX3N0cmVhbSA9IGVuc29uaXEtPnNwZGlmX2RlZmF1bHQ7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgICAmc25kX2VzMTM3MF9od19jb25zdHJhaW50c19yYXRlcyk7CisjZWxzZQorCXNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSAgICAgICZzbmRfZXMxMzcxX2h3X2NvbnN0cmFpbnRzX2RhY19jbG9jayk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9wbGF5YmFjazJfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWVuc29uaXEtPm1vZGUgfD0gRVNfTU9ERV9QTEFZMjsKKwllbnNvbmlxLT5wbGF5YmFjazJfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2Vuc29uaXFfcGxheWJhY2syOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJaWYgKGVuc29uaXEtPnNwZGlmICYmIGVuc29uaXEtPnBsYXliYWNrMV9zdWJzdHJlYW0gPT0gTlVMTCkKKwkJZW5zb25pcS0+c3BkaWZfc3RyZWFtID0gZW5zb25pcS0+c3BkaWZfZGVmYXVsdDsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKyNpZmRlZiBDSElQMTM3MAorCXNuZF9wY21faHdfY29uc3RyYWludF9yYXRudW1zKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSAgICAgICZzbmRfZXMxMzcwX2h3X2NvbnN0cmFpbnRzX2Nsb2NrKTsKKyNlbHNlCisJc25kX3BjbV9od19jb25zdHJhaW50X3JhdGRlbnMocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgICAgJnNuZF9lczEzNzFfaHdfY29uc3RyYWludHNfZGFjX2Nsb2NrKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWVuc29uaXEtPm1vZGUgfD0gRVNfTU9ERV9DQVBUVVJFOworCWVuc29uaXEtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2Vuc29uaXFfY2FwdHVyZTsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtcyhydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgICAgICAmc25kX2VzMTM3MF9od19jb25zdHJhaW50c19jbG9jayk7CisjZWxzZQorCXNuZF9wY21faHdfY29uc3RyYWludF9yYXRudW1zKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSAgICAgICZzbmRfZXMxMzcxX2h3X2NvbnN0cmFpbnRzX2FkY19jbG9jayk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9wbGF5YmFjazFfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwllbnNvbmlxLT5wbGF5YmFjazFfc3Vic3RyZWFtID0gTlVMTDsKKwllbnNvbmlxLT5tb2RlICY9IH5FU19NT0RFX1BMQVkxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX3BsYXliYWNrMl9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWVuc29uaXEtPnBsYXliYWNrMl9zdWJzdHJlYW0gPSBOVUxMOworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKyNpZmRlZiBDSElQMTM3MAorCWVuc29uaXEtPnUuZXMxMzcwLnBjbGtkaXZfbG9jayAmPSB+RVNfTU9ERV9QTEFZMjsKKyNlbmRpZgorCWVuc29uaXEtPm1vZGUgJj0gfkVTX01PREVfUExBWTI7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWVuc29uaXEtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisjaWZkZWYgQ0hJUDEzNzAKKwllbnNvbmlxLT51LmVzMTM3MC5wY2xrZGl2X2xvY2sgJj0gfkVTX01PREVfQ0FQVFVSRTsKKyNlbmRpZgorCWVuc29uaXEtPm1vZGUgJj0gfkVTX01PREVfQ0FQVFVSRTsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2Vuc29uaXFfcGxheWJhY2sxX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfZW5zb25pcV9wbGF5YmFjazFfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZW5zb25pcV9wbGF5YmFjazFfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9lbnNvbmlxX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9lbnNvbmlxX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfZW5zb25pcV9wbGF5YmFjazFfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9lbnNvbmlxX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfZW5zb25pcV9wbGF5YmFjazFfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lbnNvbmlxX3BsYXliYWNrMl9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2Vuc29uaXFfcGxheWJhY2syX29wZW4sCisJLmNsb3NlID0Jc25kX2Vuc29uaXFfcGxheWJhY2syX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfZW5zb25pcV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfZW5zb25pcV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2Vuc29uaXFfcGxheWJhY2syX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfZW5zb25pcV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2Vuc29uaXFfcGxheWJhY2syX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfZW5zb25pcV9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfZW5zb25pcV9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2Vuc29uaXFfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2Vuc29uaXFfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2Vuc29uaXFfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9lbnNvbmlxX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9lbnNvbmlxX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfZW5zb25pcV9jYXB0dXJlX3BvaW50ZXIsCit9OworCitzdGF0aWMgdm9pZCBzbmRfZW5zb25pcV9wY21fZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBwY20tPnByaXZhdGVfZGF0YTsKKwllbnNvbmlxLT5wY20xID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2Vuc29uaXFfcGNtKGVuc29uaXFfdCAqIGVuc29uaXEsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworI2lmZGVmIENISVAxMzcwCisJZXJyID0gc25kX3BjbV9uZXcoZW5zb25pcS0+Y2FyZCwgIkVTMTM3MC8xIiwgZGV2aWNlLCAxLCAxLCAmcGNtKTsKKyNlbHNlCisJZXJyID0gc25kX3BjbV9uZXcoZW5zb25pcS0+Y2FyZCwgIkVTMTM3MS8xIiwgZGV2aWNlLCAxLCAxLCAmcGNtKTsKKyNlbmRpZgorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2Vuc29uaXFfcGxheWJhY2syX29wcyk7CisjZWxzZQorCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfZW5zb25pcV9wbGF5YmFjazFfb3BzKTsKKyNlbmRpZgorCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9lbnNvbmlxX2NhcHR1cmVfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gZW5zb25pcTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9lbnNvbmlxX3BjbV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisjaWZkZWYgQ0hJUDEzNzAKKwlzdHJjcHkocGNtLT5uYW1lLCAiRVMxMzcwIERBQzIvQURDIik7CisjZWxzZQorCXN0cmNweShwY20tPm5hbWUsICJFUzEzNzEgREFDMi9BREMiKTsKKyNlbmRpZgorCWVuc29uaXEtPnBjbTEgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGVuc29uaXEtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2Vuc29uaXFfcGNtX2ZyZWUyKHNuZF9wY21fdCAqcGNtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWVuc29uaXEtPnBjbTIgPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZW5zb25pcV9wY20yKGVuc29uaXFfdCAqIGVuc29uaXEsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworI2lmZGVmIENISVAxMzcwCisJZXJyID0gc25kX3BjbV9uZXcoZW5zb25pcS0+Y2FyZCwgIkVTMTM3MC8yIiwgZGV2aWNlLCAxLCAwLCAmcGNtKTsKKyNlbHNlCisJZXJyID0gc25kX3BjbV9uZXcoZW5zb25pcS0+Y2FyZCwgIkVTMTM3MS8yIiwgZGV2aWNlLCAxLCAwLCAmcGNtKTsKKyNlbmRpZgorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2Vuc29uaXFfcGxheWJhY2sxX29wcyk7CisjZWxzZQorCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfZW5zb25pcV9wbGF5YmFjazJfb3BzKTsKKyNlbmRpZgorCXBjbS0+cHJpdmF0ZV9kYXRhID0gZW5zb25pcTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9lbnNvbmlxX3BjbV9mcmVlMjsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworI2lmZGVmIENISVAxMzcwCisJc3RyY3B5KHBjbS0+bmFtZSwgIkVTMTM3MCBEQUMxIik7CisjZWxzZQorCXN0cmNweShwY20tPm5hbWUsICJFUzEzNzEgREFDMSIpOworI2VuZGlmCisJZW5zb25pcS0+cGNtMiA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoZW5zb25pcS0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworCXJldHVybiAwOworfQorCisvKgorICogIE1peGVyIHNlY3Rpb24KKyAqLworCisvKgorICogRU5TMTM3MSBtaXhlciAoaW5jbHVkaW5nIFNQRElGIGludGVyZmFjZSkKKyAqLworI2lmZGVmIENISVAxMzcxCitzdGF0aWMgaW50IHNuZF9lbnMxMzczX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbnMxMzczX3NwZGlmX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChlbnNvbmlxLT5zcGRpZl9kZWZhdWx0ID4+IDApICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChlbnNvbmlxLT5zcGRpZl9kZWZhdWx0ID4+IDgpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IChlbnNvbmlxLT5zcGRpZl9kZWZhdWx0ID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoZW5zb25pcS0+c3BkaWZfZGVmYXVsdCA+PiAyNCkgJiAweGZmOworCXNwaW5fdW5sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbnMxMzczX3NwZGlmX2RlZmF1bHRfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKworCXZhbCA9ICgodTMyKXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkgICAgICAoKHUzMil1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA8PCA4KSB8CisJICAgICAgKCh1MzIpdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPDwgMTYpIHwKKwkgICAgICAoKHUzMil1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWNoYW5nZSA9IGVuc29uaXEtPnNwZGlmX2RlZmF1bHQgIT0gdmFsOworCWVuc29uaXEtPnNwZGlmX2RlZmF1bHQgPSB2YWw7CisJaWYgKGNoYW5nZSAmJiBlbnNvbmlxLT5wbGF5YmFjazFfc3Vic3RyZWFtID09IE5VTEwgJiYgZW5zb25pcS0+cGxheWJhY2syX3N1YnN0cmVhbSA9PSBOVUxMKQorCQlvdXRsKHZhbCwgRVNfUkVHKGVuc29uaXEsIENIQU5ORUxfU1RBVFVTKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfZW5zMTM3M19zcGRpZl9tYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zMTM3M19zcGRpZl9zdHJlYW1fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChlbnNvbmlxLT5zcGRpZl9zdHJlYW0gPj4gMCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gKGVuc29uaXEtPnNwZGlmX3N0cmVhbSA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAoZW5zb25pcS0+c3BkaWZfc3RyZWFtID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoZW5zb25pcS0+c3BkaWZfc3RyZWFtID4+IDI0KSAmIDB4ZmY7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VuczEzNzNfc3BkaWZfc3RyZWFtX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKworCXZhbCA9ICgodTMyKXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkgICAgICAoKHUzMil1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA8PCA4KSB8CisJICAgICAgKCh1MzIpdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPDwgMTYpIHwKKwkgICAgICAoKHUzMil1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWNoYW5nZSA9IGVuc29uaXEtPnNwZGlmX3N0cmVhbSAhPSB2YWw7CisJZW5zb25pcS0+c3BkaWZfc3RyZWFtID0gdmFsOworCWlmIChjaGFuZ2UgJiYgKGVuc29uaXEtPnBsYXliYWNrMV9zdWJzdHJlYW0gIT0gTlVMTCB8fCBlbnNvbmlxLT5wbGF5YmFjazJfc3Vic3RyZWFtICE9IE5VTEwpKQorCQlvdXRsKHZhbCwgRVNfUkVHKGVuc29uaXEsIENIQU5ORUxfU1RBVFVTKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBFUzEzNzFfU1BESUYoeG5hbWUpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmZvID0gc25kX2VzMTM3MV9zcGRpZl9pbmZvLCBcCisgIC5nZXQgPSBzbmRfZXMxMzcxX3NwZGlmX2dldCwgLnB1dCA9IHNuZF9lczEzNzFfc3BkaWZfcHV0IH0KKworc3RhdGljIGludCBzbmRfZXMxMzcxX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisgICAgICAgIHVpbmZvLT5jb3VudCA9IDE7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczEzNzFfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVuc29uaXEtPmN0cmwgJiBFU18xMzczX1NQRElGX1RIUlUgPyAxIDogMDsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxMzcxX3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbnZhbDEsIG52YWwyOworCWludCBjaGFuZ2U7CisJCisJbnZhbDEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IEVTXzEzNzNfU1BESUZfVEhSVSA6IDA7CisJbnZhbDIgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IEVTXzEzNzNfU1BESUZfRU4gOiAwOworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSAoZW5zb25pcS0+Y3RybCAmIEVTXzEzNzNfU1BESUZfVEhSVSkgIT0gbnZhbDE7CisJZW5zb25pcS0+Y3RybCAmPSB+RVNfMTM3M19TUERJRl9USFJVOworCWVuc29uaXEtPmN0cmwgfD0gbnZhbDE7CisJZW5zb25pcS0+Y3NzciAmPSB+RVNfMTM3M19TUERJRl9FTjsKKwllbnNvbmlxLT5jc3NyIHw9IG52YWwyOworCW91dGwoZW5zb25pcS0+Y3RybCwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKKwlvdXRsKGVuc29uaXEtPmNzc3IsIEVTX1JFRyhlbnNvbmlxLCBTVEFUVVMpKTsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisKKy8qIHNwZGlmIGNvbnRyb2xzICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lczEzNzFfbWl4ZXJfc3BkaWZbXSBfX2RldmluaXRkYXRhID0geworCUVTMTM3MV9TUERJRigiSUVDOTU4IFBsYXliYWNrIFN3aXRjaCIpLAorCXsKKwkJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJCS5pbmZvID0JCXNuZF9lbnMxMzczX3NwZGlmX2luZm8sCisJCS5nZXQgPQkJc25kX2VuczEzNzNfc3BkaWZfZGVmYXVsdF9nZXQsCisJCS5wdXQgPQkJc25kX2VuczEzNzNfc3BkaWZfZGVmYXVsdF9wdXQsCisJfSwKKwl7CisJCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTUFTSyksCisJCS5pbmZvID0JCXNuZF9lbnMxMzczX3NwZGlmX2luZm8sCisJCS5nZXQgPQkJc25kX2VuczEzNzNfc3BkaWZfbWFza19nZXQKKwl9LAorCXsKKwkJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUENNX1NUUkVBTSksCisJCS5pbmZvID0JCXNuZF9lbnMxMzczX3NwZGlmX2luZm8sCisJCS5nZXQgPQkJc25kX2VuczEzNzNfc3BkaWZfc3RyZWFtX2dldCwKKwkJLnB1dCA9CQlzbmRfZW5zMTM3M19zcGRpZl9zdHJlYW1fcHV0CisJfSwKK307CisKKworc3RhdGljIGludCBzbmRfZXMxMzczX3JlYXJfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworICAgICAgICB1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKyAgICAgICAgdWluZm8tPmNvdW50ID0gMTsKKyAgICAgICAgdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKyAgICAgICAgdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTM3M19yZWFyX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgdmFsID0gMDsKKwkKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJaWYgKChlbnNvbmlxLT5jc3NyICYgKEVTXzEzNzNfUkVBUl9CSVQyN3xFU18xMzczX1JFQVJfQklUMjZ8RVNfMTM3M19SRUFSX0JJVDI0KSkgPT0gRVNfMTM3M19SRUFSX0JJVDI2KQorCSAgICAJdmFsID0gMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHZhbDsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxMzczX3JlYXJfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBudmFsMTsKKwlpbnQgY2hhbmdlOworCQorCW52YWwxID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyBFU18xMzczX1JFQVJfQklUMjYgOiAoRVNfMTM3M19SRUFSX0JJVDI3fEVTXzEzNzNfUkVBUl9CSVQyNCk7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWNoYW5nZSA9IChlbnNvbmlxLT5jc3NyICYgKEVTXzEzNzNfUkVBUl9CSVQyN3xFU18xMzczX1JFQVJfQklUMjZ8RVNfMTM3M19SRUFSX0JJVDI0KSkgIT0gbnZhbDE7CisJZW5zb25pcS0+Y3NzciAmPSB+KEVTXzEzNzNfUkVBUl9CSVQyN3xFU18xMzczX1JFQVJfQklUMjZ8RVNfMTM3M19SRUFSX0JJVDI0KTsKKwllbnNvbmlxLT5jc3NyIHw9IG52YWwxOworCW91dGwoZW5zb25pcS0+Y3NzciwgRVNfUkVHKGVuc29uaXEsIFNUQVRVUykpOworCXNwaW5fdW5sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VuczEzNzNfcmVhciBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9CQkiQUM5NyAyY2gtPjRjaCBDb3B5IFN3aXRjaCIsCisJLmluZm8gPQkJc25kX2VzMTM3M19yZWFyX2luZm8sCisJLmdldCA9CQlzbmRfZXMxMzczX3JlYXJfZ2V0LAorCS5wdXQgPQkJc25kX2VzMTM3M19yZWFyX3B1dCwKK307CisKK3N0YXRpYyBpbnQgc25kX2VzMTM3M19saW5lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxMzczX2xpbmVfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCB2YWwgPSAwOworCQorCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlpZiAoKGVuc29uaXEtPmN0cmwgJiBFU18xMzcxX0dQSU9fT1VUTSkgPj0gNCkKKwkgICAgCXZhbCA9IDE7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTM3M19saW5lX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlZDsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKwkKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJY3RybCA9IGVuc29uaXEtPmN0cmw7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQllbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzFfR1BJT19PVVQoNCk7CS8qIHN3aXRjaCBsaW5lLWluIC0+IHJlYXIgb3V0ICovCisJZWxzZQorCQllbnNvbmlxLT5jdHJsICY9IH5FU18xMzcxX0dQSU9fT1VUKDQpOworCWNoYW5nZWQgPSAoY3RybCAhPSBlbnNvbmlxLT5jdHJsKTsKKwlpZiAoY2hhbmdlZCkKKwkJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCXNwaW5fdW5sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbnMxMzczX2xpbmUgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJIkxpbmUgSW4tPlJlYXIgT3V0IFN3aXRjaCIsCisJLmluZm8gPQkJc25kX2VzMTM3M19saW5lX2luZm8sCisJLmdldCA9CQlzbmRfZXMxMzczX2xpbmVfZ2V0LAorCS5wdXQgPQkJc25kX2VzMTM3M19saW5lX3B1dCwKK307CisKK3N0YXRpYyB2b2lkIHNuZF9lbnNvbmlxX21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWVuc29uaXEtPnUuZXMxMzcxLmFjOTcgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCB2aWQ7CQkvKiB2ZW5kb3IgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBkaWQ7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBjaGFyIHJldjsJCS8qIHJldmlzaW9uICovCit9IGVzMTM3MV9zcGRpZl9wcmVzZW50W10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9DIH0sCisJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfRCB9LAorCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0UgfSwKKwl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxLCAucmV2ID0gRVMxMzcxUkVWX0NUNTg4MF9BIH0sCisJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSwgLnJldiA9IEVTMTM3MVJFVl9FUzEzNzNfOCB9LAorCXsgLnZpZCA9IFBDSV9BTllfSUQsIC5kaWQgPSBQQ0lfQU5ZX0lEIH0KK307CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfMTM3MV9taXhlcihlbnNvbmlxX3QgKiBlbnNvbmlxKQoreworCXNuZF9jYXJkX3QgKmNhcmQgPSBlbnNvbmlxLT5jYXJkOworCWFjOTdfYnVzX3QgKnBidXM7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGVyciwgaWR4OworCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCS53cml0ZSA9IHNuZF9lczEzNzFfY29kZWNfd3JpdGUsCisJCS5yZWFkID0gc25kX2VzMTM3MV9jb2RlY19yZWFkLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnByaXZhdGVfZGF0YSA9IGVuc29uaXE7CisJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfZW5zb25pcV9taXhlcl9mcmVlX2FjOTc7CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9BVURJTzsKKwlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmZW5zb25pcS0+dS5lczEzNzEuYWM5NykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlmb3IgKGlkeCA9IDA7IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0udmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKKwkJaWYgKGVuc29uaXEtPnBjaS0+dmVuZG9yID09IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0udmlkICYmCisJCSAgICBlbnNvbmlxLT5wY2ktPmRldmljZSA9PSBlczEzNzFfc3BkaWZfcHJlc2VudFtpZHhdLmRpZCAmJgorCQkgICAgZW5zb25pcS0+cmV2ID09IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0ucmV2KSB7CisJCSAgICAJc25kX2tjb250cm9sX3QgKmtjdGw7CisJCQlpbnQgaSwgaW5kZXggPSAwOyAKKworCQkJZW5zb25pcS0+c3BkaWZfZGVmYXVsdCA9IGVuc29uaXEtPnNwZGlmX3N0cmVhbSA9IFNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRjsKKwkJCW91dGwoZW5zb25pcS0+c3BkaWZfZGVmYXVsdCwgRVNfUkVHKGVuc29uaXEsIENIQU5ORUxfU1RBVFVTKSk7CisKKwkJICAgIAlpZiAoZW5zb25pcS0+dS5lczEzNzEuYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikKKwkJCSAgICAJaW5kZXgrKzsKKworCQkJZm9yIChpID0gMDsgaSA8IChpbnQpQVJSQVlfU0laRShzbmRfZXMxMzcxX21peGVyX3NwZGlmKTsgaSsrKSB7CisJCQkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VzMTM3MV9taXhlcl9zcGRpZltpXSwgZW5zb25pcSk7CisJCQkJaWYgKCEga2N0bCkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJa2N0bC0+aWQuaW5kZXggPSBpbmRleDsKKwkJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWlmIChlbnNvbmlxLT51LmVzMTM3MS5hYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NEQUMpIHsKKwkJLyogbWlycm9yIHJlYXIgdG8gZnJvbnQgc3BlYWtlcnMgKi8KKwkJZW5zb25pcS0+Y3NzciAmPSB+KEVTXzEzNzNfUkVBUl9CSVQyN3xFU18xMzczX1JFQVJfQklUMjQpOworCQllbnNvbmlxLT5jc3NyIHw9IEVTXzEzNzNfUkVBUl9CSVQyNjsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW5zMTM3M19yZWFyLCBlbnNvbmlxKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKCgoZW5zb25pcS0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9PSAweDEyNzQpICYmCisJICAgIChlbnNvbmlxLT5zdWJzeXN0ZW1fZGV2aWNlX2lkID09IDB4MjAwMCkpIHx8IC8qIEdBLTdEWFIgKi8KKwkgICAgKChlbnNvbmlxLT5zdWJzeXN0ZW1fdmVuZG9yX2lkID09IDB4MTQ1OCkgJiYKKwkgICAgKGVuc29uaXEtPnN1YnN5c3RlbV9kZXZpY2VfaWQgPT0gMHhhMDAwKSkpIHsgLyogR0EtOElFWFAgKi8KKwkJIGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VuczEzNzNfbGluZSwgZW5zb25pcSkpOworCQkgaWYgKGVyciA8IDApCisJCQkgcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENISVAxMzcxICovCisKKy8qIGdlbmVyaWMgY29udHJvbCBjYWxsYmFja3MgZm9yIGVuczEzNzAgKi8KKyNpZmRlZiBDSElQMTM3MAorI2RlZmluZSBFTlNPTklRX0NPTlRST0woeG5hbWUsIG1hc2spIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfZW5zb25pcV9jb250cm9sX2luZm8sIFwKKyAgLmdldCA9IHNuZF9lbnNvbmlxX2NvbnRyb2xfZ2V0LCAucHV0ID0gc25kX2Vuc29uaXFfY29udHJvbF9wdXQsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBtYXNrIH0KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9jb250cm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisgICAgICAgIHVpbmZvLT5jb3VudCA9IDE7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX2NvbnRyb2xfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBtYXNrID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJCisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZW5zb25pcS0+Y3RybCAmIG1hc2sgPyAxIDogMDsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9jb250cm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCBudmFsOworCWludCBjaGFuZ2U7CisJCisJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gbWFzayA6IDA7CisJc3Bpbl9sb2NrX2lycSgmZW5zb25pcS0+cmVnX2xvY2spOworCWNoYW5nZSA9IChlbnNvbmlxLT5jdHJsICYgbWFzaykgIT0gbnZhbDsKKwllbnNvbmlxLT5jdHJsICY9IH5tYXNrOworCWVuc29uaXEtPmN0cmwgfD0gbnZhbDsKKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIEVOUzEzNzAgbWl4ZXIKKyAqLworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lczEzNzBfY29udHJvbHNbMl0gX19kZXZpbml0ZGF0YSA9IHsKK0VOU09OSVFfQ09OVFJPTCgiUENNIDAgT3V0cHV0IGFsc28gb24gTGluZS1JbiBKYWNrIiwgRVNfMTM3MF9YQ1RMMCksCitFTlNPTklRX0NPTlRST0woIk1pYyArNVYgYmlhcyIsIEVTXzEzNzBfWENUTDEpCit9OworCisjZGVmaW5lIEVTMTM3MF9DT05UUk9MUyBBUlJBWV9TSVpFKHNuZF9lczEzNzBfY29udHJvbHMpCisKK3N0YXRpYyB2b2lkIHNuZF9lbnNvbmlxX21peGVyX2ZyZWVfYWs0NTMxKGFrNDUzMV90ICphazQ1MzEpCit7CisJZW5zb25pcV90ICplbnNvbmlxID0gYWs0NTMxLT5wcml2YXRlX2RhdGE7CisJZW5zb25pcS0+dS5lczEzNzAuYWs0NTMxID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2Vuc29uaXFfMTM3MF9taXhlcihlbnNvbmlxX3QgKiBlbnNvbmlxKQoreworCXNuZF9jYXJkX3QgKmNhcmQgPSBlbnNvbmlxLT5jYXJkOworCWFrNDUzMV90IGFrNDUzMTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisKKwkvKiB0cnkgcmVzZXQgQUs0NTMxICovCisJb3V0dyhFU18xMzcwX0NPREVDX1dSSVRFKEFLNDUzMV9SRVNFVCwgMHgwMiksIEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CisJaW53KEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CisJdWRlbGF5KDEwMCk7CisJb3V0dyhFU18xMzcwX0NPREVDX1dSSVRFKEFLNDUzMV9SRVNFVCwgMHgwMyksIEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CisJaW53KEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CisJdWRlbGF5KDEwMCk7CisKKwltZW1zZXQoJmFrNDUzMSwgMCwgc2l6ZW9mKGFrNDUzMSkpOworCWFrNDUzMS53cml0ZSA9IHNuZF9lczEzNzBfY29kZWNfd3JpdGU7CisJYWs0NTMxLnByaXZhdGVfZGF0YSA9IGVuc29uaXE7CisJYWs0NTMxLnByaXZhdGVfZnJlZSA9IHNuZF9lbnNvbmlxX21peGVyX2ZyZWVfYWs0NTMxOworCWlmICgoZXJyID0gc25kX2FrNDUzMV9taXhlcihjYXJkLCAmYWs0NTMxLCAmZW5zb25pcS0+dS5lczEzNzAuYWs0NTMxKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWZvciAoaWR4ID0gMDsgaWR4IDwgRVMxMzcwX0NPTlRST0xTOyBpZHgrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lczEzNzBfY29udHJvbHNbaWR4XSwgZW5zb25pcSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ0hJUDEzNzAgKi8KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKworI2lmZGVmIENISVAxMzcxCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZW5zb25pcV9nZXRfam95c3RpY2tfcG9ydChpbnQgZGV2KQoreworCXN3aXRjaCAoam95c3RpY2tfcG9ydFtkZXZdKSB7CisJY2FzZSAwOiAvKiBkaXNhYmxlZCAqLworCWNhc2UgMTogLyogYXV0by1kZXRlY3QgKi8KKwljYXNlIDB4MjAwOgorCWNhc2UgMHgyMDg6CisJY2FzZSAweDIxMDoKKwljYXNlIDB4MjE4OgorCQlyZXR1cm4gam95c3RpY2tfcG9ydFtkZXZdOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJlbnMxMzcxOiBpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4Iiwgam95c3RpY2tfcG9ydFtkZXZdKTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGludCBkZXYpCit7CisJcmV0dXJuIGpveXN0aWNrW2Rldl0gPyAweDIwMCA6IDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2Vuc29uaXFfY3JlYXRlX2dhbWVwb3J0KGVuc29uaXFfdCAqZW5zb25pcSwgaW50IGRldikKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCWludCBpb19wb3J0OworCisJaW9fcG9ydCA9IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGRldik7CisKKwlzd2l0Y2ggKGlvX3BvcnQpIHsKKwljYXNlIDA6CisJCXJldHVybiAtRU5PU1lTOworCisJY2FzZSAxOiAvKiBhdXRvX2RldGVjdCAqLworCQlmb3IgKGlvX3BvcnQgPSAweDIwMDsgaW9fcG9ydCA8PSAweDIxODsgaW9fcG9ydCArPSA4KQorCQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDgsICJlbnMxMzd4OiBnYW1lcG9ydCIpKQorCQkJCWJyZWFrOworCQlpZiAoaW9fcG9ydCA+IDB4MjE4KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbnMxMzd4OiBubyBnYW1lcG9ydCBwb3J0cyBhdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgOCwgImVuczEzN3g6IGdhbWVwb3J0IikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVuczEzN3g6IGdhbWVwb3J0IGlvIHBvcnQgMHglI3ggaW4gdXNlXG4iLCBpb19wb3J0KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYnJlYWs7CisJfQorCisJZW5zb25pcS0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW5zMTM3eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCA4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFUzEzN3giKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGVuc29uaXEtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmZW5zb25pcS0+cGNpLT5kZXYpOworCWdwLT5pbyA9IGlvX3BvcnQ7CisKKwllbnNvbmlxLT5jdHJsIHw9IEVTX0pZU1RLX0VOOworI2lmZGVmIENISVAxMzcxCisJZW5zb25pcS0+Y3RybCAmPSB+RVNfMTM3MV9KT1lfQVNFTE07CisJZW5zb25pcS0+Y3RybCB8PSBFU18xMzcxX0pPWV9BU0VMKChpb19wb3J0IC0gMHgyMDApIC8gOCk7CisjZW5kaWYKKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGVuc29uaXEtPmdhbWVwb3J0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW5zb25pcV9mcmVlX2dhbWVwb3J0KGVuc29uaXFfdCAqZW5zb25pcSkKK3sKKwlpZiAoZW5zb25pcS0+Z2FtZXBvcnQpIHsKKwkJaW50IHBvcnQgPSBlbnNvbmlxLT5nYW1lcG9ydC0+aW87CisKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGVuc29uaXEtPmdhbWVwb3J0KTsKKwkJZW5zb25pcS0+Z2FtZXBvcnQgPSBOVUxMOworCQllbnNvbmlxLT5jdHJsICY9IH5FU19KWVNUS19FTjsKKwkJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCA4KTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX2Vuc29uaXFfY3JlYXRlX2dhbWVwb3J0KGVuc29uaXFfdCAqZW5zb25pcSwgbG9uZyBwb3J0KSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2Vuc29uaXFfZnJlZV9nYW1lcG9ydChlbnNvbmlxX3QgKmVuc29uaXEpIHsgfQorI2VuZGlmIC8qIFNVUFBPUlRfSk9ZU1RJQ0sgKi8KKworLyoKKworICovCisKK3N0YXRpYyB2b2lkIHNuZF9lbnNvbmlxX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfaXByaW50ZihidWZmZXIsICJFbnNvbmlxIEF1ZGlvUENJIEVTMTM3MFxuXG4iKTsKKyNlbHNlCisJc25kX2lwcmludGYoYnVmZmVyLCAiRW5zb25pcSBBdWRpb1BDSSBFUzEzNzFcblxuIik7CisjZW5kaWYKKwlzbmRfaXByaW50ZihidWZmZXIsICJKb3lzdGljayBlbmFibGUgIDogJXNcbiIsIGVuc29uaXEtPmN0cmwgJiBFU19KWVNUS19FTiA/ICJvbiIgOiAib2ZmIik7CisjaWZkZWYgQ0hJUDEzNzAKKwlzbmRfaXByaW50ZihidWZmZXIsICJNSUMgKzVWIGJpYXMgICAgIDogJXNcbiIsIGVuc29uaXEtPmN0cmwgJiBFU18xMzcwX1hDVEwxID8gIm9uIiA6ICJvZmYiKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJMaW5lIEluIHRvIEFPVVQgIDogJXNcbiIsIGVuc29uaXEtPmN0cmwgJiBFU18xMzcwX1hDVEwwID8gIm9uIiA6ICJvZmYiKTsKKyNlbHNlCisJc25kX2lwcmludGYoYnVmZmVyLCAiSm95c3RpY2sgcG9ydCAgICA6IDB4JXhcbiIsIChFU18xMzcxX0pPWV9BU0VMSShlbnNvbmlxLT5jdHJsKSAqIDgpICsgMHgyMDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfZW5zb25pcV9wcm9jX2luaXQoZW5zb25pcV90ICogZW5zb25pcSkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVuc29uaXEtPmNhcmQsICJhdWRpb3BjaSIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW5zb25pcSwgMTAyNCwgc25kX2Vuc29uaXFfcHJvY19yZWFkKTsKK30KKworLyoKKworICovCisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxX3QgKmVuc29uaXEpCit7CisJc25kX2Vuc29uaXFfZnJlZV9nYW1lcG9ydChlbnNvbmlxKTsKKwlpZiAoZW5zb25pcS0+aXJxIDwgMCkKKwkJZ290byBfX2h3X2VuZDsKKyNpZmRlZiBDSElQMTM3MAorCW91dGwoRVNfMTM3MF9TRVJSX0RJU0FCTEUsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CS8qIHN3aXRjaCBldmVyeXRoaW5nIG9mZiAqLworCW91dGwoMCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOwkvKiBjbGVhciBzZXJpYWwgaW50ZXJmYWNlICovCisjZWxzZQorCW91dGwoMCwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsJLyogc3dpdGNoIGV2ZXJ5dGhpbmcgb2ZmICovCisJb3V0bCgwLCBFU19SRUcoZW5zb25pcSwgU0VSSUFMKSk7CS8qIGNsZWFyIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNlbmRpZgorCXN5bmNocm9uaXplX2lycShlbnNvbmlxLT5pcnEpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZW5zb25pcS0+cGNpLCAzKTsKKyAgICAgIF9faHdfZW5kOgorI2lmZGVmIENISVAxMzcwCisJaWYgKGVuc29uaXEtPmRtYV9idWcuYXJlYSkKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZlbnNvbmlxLT5kbWFfYnVnKTsKKyNlbmRpZgorCWlmIChlbnNvbmlxLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoZW5zb25pcS0+aXJxLCAodm9pZCAqKWVuc29uaXEpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZW5zb25pcS0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZW5zb25pcS0+cGNpKTsKKwlrZnJlZShlbnNvbmlxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfZW5zb25pcV9mcmVlKGVuc29uaXEpOworfQorCisjaWZkZWYgQ0hJUDEzNzEKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHN2aWQ7CQkvKiBzdWJzeXN0ZW0gdmVuZG9yIElEICovCisJdW5zaWduZWQgc2hvcnQgc2RpZDsJCS8qIHN1YnN5c3RlbSBkZXZpY2UgSUQgKi8KK30gZXMxMzcxX2FtcGxpZmllcl9oYWNrW10gPSB7CisJeyAuc3ZpZCA9IDB4MTA3YiwgLnNkaWQgPSAweDIxNTAgfSwJLyogR2F0ZXdheSBTb2xvIDIxNTAgKi8KKwl7IC5zdmlkID0gMHgxM2JkLCAuc2RpZCA9IDB4MTAwYyB9LAkvKiBFVjE5Mzggb24gTWViaXVzIFBDLU1KMTAwViAqLworCXsgLnN2aWQgPSAweDExMDIsIC5zZGlkID0gMHg1OTM4IH0sCS8qIFRhcmdhIFh0ZW5kZXIzMDAgKi8KKwl7IC5zdmlkID0gMHgxMTAyLCAuc2RpZCA9IDB4ODkzOCB9LAkvKiBJUEMgVG9wbm90ZSBHIG5vdGVib29rICovCisJeyAuc3ZpZCA9IFBDSV9BTllfSUQsIC5zZGlkID0gUENJX0FOWV9JRCB9Cit9Oworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgdmlkOwkJLyogdmVuZG9yIElEICovCisJdW5zaWduZWQgc2hvcnQgZGlkOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgY2hhciByZXY7CQkvKiByZXZpc2lvbiAqLworfSBlczEzNzFfYWM5N19yZXNldF9oYWNrW10gPSB7CisJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfQyB9LAorCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0QgfSwKKwl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9FIH0sCisJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSwgLnJldiA9IEVTMTM3MVJFVl9DVDU4ODBfQSB9LAorCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEsIC5yZXYgPSBFUzEzNzFSRVZfRVMxMzczXzggfSwKKwl7IC52aWQgPSBQQ0lfQU5ZX0lELCAuZGlkID0gUENJX0FOWV9JRCB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lbnNvbmlxX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICBlbnNvbmlxX3QgKiogcmVuc29uaXEpCit7CisJZW5zb25pcV90ICplbnNvbmlxOworCXVuc2lnbmVkIHNob3J0IGNtZHc7CisJdW5zaWduZWQgY2hhciBjbWRiOworI2lmZGVmIENISVAxMzcxCisJaW50IGlkeDsKKyNlbmRpZgorCWludCBlcnI7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfZW5zb25pcV9kZXZfZnJlZSwKKwl9OworCisJKnJlbnNvbmlxID0gTlVMTDsKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllbnNvbmlxID0ga2NhbGxvYygxLCBzaXplb2YoKmVuc29uaXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW5zb25pcSA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlpbml0X01VVEVYKCZlbnNvbmlxLT5zcmNfbXV0ZXgpOworCWVuc29uaXEtPmNhcmQgPSBjYXJkOworCWVuc29uaXEtPnBjaSA9IHBjaTsKKwllbnNvbmlxLT5pcnEgPSAtMTsKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCAiRW5zb25pcSBBdWRpb1BDSSIpKSA8IDApIHsKKwkJa2ZyZWUoZW5zb25pcSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwllbnNvbmlxLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXVkaW9wY2lfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJFbnNvbmlxIEF1ZGlvUENJIiwgKHZvaWQgKillbnNvbmlxKSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZW5zb25pcS0+aXJxID0gcGNpLT5pcnE7CisjaWZkZWYgQ0hJUDEzNzAKKwlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwKKwkJCQkxNiwgJmVuc29uaXEtPmRtYV9idWcpIDwgMCkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHBoYW50b20gYXJlYSAtIGRtYV9idWdcbiIpOworCQlzbmRfZW5zb25pcV9mcmVlKGVuc29uaXEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyNlbmRpZgorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT05fSUQsICZjbWRiKTsKKwllbnNvbmlxLT5yZXYgPSBjbWRiOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZjbWR3KTsKKwllbnNvbmlxLT5zdWJzeXN0ZW1fdmVuZG9yX2lkID0gY21kdzsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZjbWR3KTsKKwllbnNvbmlxLT5zdWJzeXN0ZW1fZGV2aWNlX2lkID0gY21kdzsKKyNpZmRlZiBDSElQMTM3MAorI2lmIDAKKwllbnNvbmlxLT5jdHJsID0gRVNfMTM3MF9DRENfRU4gfCBFU18xMzcwX1NFUlJfRElTQUJMRSB8IEVTXzEzNzBfUENMS0RJVk8oRVNfMTM3MF9TUlRPRElWKDgwMDApKTsKKyNlbHNlCS8qIGdldCBtaWNyb3Bob25lIHdvcmtpbmcgKi8KKwllbnNvbmlxLT5jdHJsID0gRVNfMTM3MF9DRENfRU4gfCBFU18xMzcwX1BDTEtESVZPKEVTXzEzNzBfU1JUT0RJVig4MDAwKSk7CisjZW5kaWYKKwllbnNvbmlxLT5zY3RybCA9IDA7CisJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJb3V0bChlbnNvbmlxLT5zY3RybCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOworCW91dGwoRVNfTUVNX1BBR0VPKEVTX1BBR0VfQURDKSwgRVNfUkVHKGVuc29uaXEsIE1FTV9QQUdFKSk7CisJb3V0bChlbnNvbmlxLT5kbWFfYnVnLmFkZHIsIEVTX1JFRyhlbnNvbmlxLCBQSEFOVE9NX0ZSQU1FKSk7CisJb3V0bCgwLCBFU19SRUcoZW5zb25pcSwgUEhBTlRPTV9DT1VOVCkpOworI2Vsc2UKKwllbnNvbmlxLT5jdHJsID0gMDsKKwllbnNvbmlxLT5zY3RybCA9IDA7CisJZW5zb25pcS0+Y3NzciA9IDA7CisJZm9yIChpZHggPSAwOyBlczEzNzFfYW1wbGlmaWVyX2hhY2tbaWR4XS5zdmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKKwkJaWYgKGVuc29uaXEtPnN1YnN5c3RlbV92ZW5kb3JfaWQgPT0gZXMxMzcxX2FtcGxpZmllcl9oYWNrW2lkeF0uc3ZpZCAmJgorCQkgICAgZW5zb25pcS0+c3Vic3lzdGVtX2RldmljZV9pZCA9PSBlczEzNzFfYW1wbGlmaWVyX2hhY2tbaWR4XS5zZGlkKSB7CisJCQllbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzFfR1BJT19PVVQoMSk7CS8qIHR1cm4gYW1wbGlmaWVyIG9uICovCisJCQlicmVhazsKKwkJfQorCS8qIGluaXRpYWxpemUgdGhlIGNoaXBzICovCisJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCW91dGwoZW5zb25pcS0+c2N0cmwsIEVTX1JFRyhlbnNvbmlxLCBTRVJJQUwpKTsKKwlvdXRsKDAsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0xFR0FDWSkpOworCWZvciAoaWR4ID0gMDsgZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnZpZCAhPSAodW5zaWduZWQgc2hvcnQpUENJX0FOWV9JRDsgaWR4KyspCisJCWlmIChwY2ktPnZlbmRvciA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0udmlkICYmCisJCSAgICBwY2ktPmRldmljZSA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0uZGlkICYmCisJCSAgICBlbnNvbmlxLT5yZXYgPT0gZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnJldikgeworCQkgICAgICAgIHVuc2lnbmVkIGxvbmcgdG1vOworCQkJc2lnbmVkIGxvbmcgdG1vMjsKKworCQkJZW5zb25pcS0+Y3NzciB8PSBFU18xMzcxX1NUX0FDOTdfUlNUOworCQkJb3V0bChlbnNvbmlxLT5jc3NyLCBFU19SRUcoZW5zb25pcSwgU1RBVFVTKSk7CisJCQkvKiBuZWVkIHRvIGRlbGF5IGFyb3VuZCAyMG1zKGJsZWVjaCkgdG8gZ2l2ZQorCQkJc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJCQl0bW8gPSBqaWZmaWVzICsgKEhaIC8gNTApICsgMTsKKwkJCXdoaWxlICgxKSB7CisJCQkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCQkJaWYgKHRtbzIgPD0gMCkKKwkJCQkJYnJlYWs7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCS8qIEFDJzk3IHdhcm0gcmVzZXQgdG8gc3RhcnQgdGhlIGJpdGNsayAqLworCW91dGwoZW5zb25pcS0+Y3RybCB8IEVTXzEzNzFfU1lOQ19SRVMsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJaW5sKEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJdWRlbGF5KDIwKTsKKwlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJLyogSW5pdCB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyICovCisJc25kX2VzMTM3MV93YWl0X3NyY19yZWFkeShlbnNvbmlxKTsJCisJb3V0bChFU18xMzcxX1NSQ19ESVNBQkxFLCBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJZm9yIChpZHggPSAwOyBpZHggPCAweDgwOyBpZHgrKykKKwkJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgaWR4LCAwKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfREFDMSArIEVTX1NNUFJFR19UUlVOQ19OLCAxNiA8PCA0KTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfREFDMSArIEVTX1NNUFJFR19JTlRfUkVHUywgMTYgPDwgMTApOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19EQUMyICsgRVNfU01QUkVHX1RSVU5DX04sIDE2IDw8IDQpOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19EQUMyICsgRVNfU01QUkVHX0lOVF9SRUdTLCAxNiA8PCAxMCk7CisJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX1ZPTF9BREMsIDEgPDwgMTIpOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19WT0xfQURDICsgMSwgMSA8PCAxMik7CisJc25kX2VzMTM3MV9zcmNfd3JpdGUoZW5zb25pcSwgRVNfU01QUkVHX1ZPTF9EQUMxLCAxIDw8IDEyKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfVk9MX0RBQzEgKyAxLCAxIDw8IDEyKTsKKwlzbmRfZXMxMzcxX3NyY193cml0ZShlbnNvbmlxLCBFU19TTVBSRUdfVk9MX0RBQzIsIDEgPDwgMTIpOworCXNuZF9lczEzNzFfc3JjX3dyaXRlKGVuc29uaXEsIEVTX1NNUFJFR19WT0xfREFDMiArIDEsIDEgPDwgMTIpOworCXNuZF9lczEzNzFfYWRjX3JhdGUoZW5zb25pcSwgMjIwNTApOworCXNuZF9lczEzNzFfZGFjMV9yYXRlKGVuc29uaXEsIDIyMDUwKTsKKwlzbmRfZXMxMzcxX2RhYzJfcmF0ZShlbnNvbmlxLCAyMjA1MCk7CisJLyogV0FSTklORzoKKwkgKiBlbmFibGluZyB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIHdpdGhvdXQgcHJvcGVybHkgcHJvZ3JhbW1pbmcKKwkgKiBpdHMgcGFyYW1ldGVycyBjYXVzZXMgdGhlIGNoaXAgdG8gbG9jayB1cCAodGhlIFNSQyBidXN5IGJpdCB3aWxsCisJICogYmUgc3R1Y2sgaGlnaCwgYW5kIEkndmUgZm91bmQgbm8gd2F5IHRvIHJlY3RpZnkgdGhpcyBvdGhlciB0aGFuCisJICogcG93ZXIgY3ljbGUpIC0gVGhvbWFzIFNhaWxlcgorCSAqLworCXNuZF9lczEzNzFfd2FpdF9zcmNfcmVhZHkoZW5zb25pcSk7CisJb3V0bCgwLCBFU19SRUcoZW5zb25pcSwgMTM3MV9TTVBSQVRFKSk7CisJLyogdHJ5IHJlc2V0IGNvZGVjIGRpcmVjdGx5ICovCisJb3V0bChFU18xMzcxX0NPREVDX1dSSVRFKDAsIDApLCBFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpOworI2VuZGlmCisJb3V0YihlbnNvbmlxLT51YXJ0YyA9IDB4MDAsIEVTX1JFRyhlbnNvbmlxLCBVQVJUX0NPTlRST0wpKTsKKwlvdXRiKDB4MDAsIEVTX1JFRyhlbnNvbmlxLCBVQVJUX1JFUykpOworCW91dGwoZW5zb25pcS0+Y3NzciwgRVNfUkVHKGVuc29uaXEsIFNUQVRVUykpOworCXN5bmNocm9uaXplX2lycShlbnNvbmlxLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGVuc29uaXEsICZvcHMpKSA8IDApIHsKKwkJc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfZW5zb25pcV9wcm9jX2luaXQoZW5zb25pcSk7CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcmVuc29uaXEgPSBlbnNvbmlxOworCXJldHVybiAwOworfQorCisvKgorICogIE1JREkgc2VjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9lbnNvbmlxX21pZGlfaW50ZXJydXB0KGVuc29uaXFfdCAqIGVuc29uaXEpCit7CisJc25kX3Jhd21pZGlfdCAqIHJtaWRpID0gZW5zb25pcS0+cm1pZGk7CisJdW5zaWduZWQgY2hhciBzdGF0dXMsIG1hc2ssIGJ5dGU7CisKKwlpZiAocm1pZGkgPT0gTlVMTCkKKwkJcmV0dXJuOworCS8qIGRvIFJ4IGF0IGZpcnN0ICovCisJc3Bpbl9sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJbWFzayA9IGVuc29uaXEtPnVhcnRtICYgRVNfTU9ERV9JTlBVVCA/IEVTX1JYUkRZIDogMDsKKwl3aGlsZSAobWFzaykgeworCQlzdGF0dXMgPSBpbmIoRVNfUkVHKGVuc29uaXEsIFVBUlRfU1RBVFVTKSk7CisJCWlmICgoc3RhdHVzICYgbWFzaykgPT0gMCkKKwkJCWJyZWFrOworCQlieXRlID0gaW5iKEVTX1JFRyhlbnNvbmlxLCBVQVJUX0RBVEEpKTsKKwkJc25kX3Jhd21pZGlfcmVjZWl2ZShlbnNvbmlxLT5taWRpX2lucHV0LCAmYnl0ZSwgMSk7CisJfQorCXNwaW5fdW5sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisKKwkvKiBkbyBUeCBhdCBzZWNvbmQgKi8KKwlzcGluX2xvY2soJmVuc29uaXEtPnJlZ19sb2NrKTsKKwltYXNrID0gZW5zb25pcS0+dWFydG0gJiBFU19NT0RFX09VVFBVVCA/IEVTX1RYUkRZIDogMDsKKwl3aGlsZSAobWFzaykgeworCQlzdGF0dXMgPSBpbmIoRVNfUkVHKGVuc29uaXEsIFVBUlRfU1RBVFVTKSk7CisJCWlmICgoc3RhdHVzICYgbWFzaykgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXQoZW5zb25pcS0+bWlkaV9vdXRwdXQsICZieXRlLCAxKSAhPSAxKSB7CisJCQllbnNvbmlxLT51YXJ0YyAmPSB+RVNfVFhJTlRFTk07CisJCQlvdXRiKGVuc29uaXEtPnVhcnRjLCBFU19SRUcoZW5zb25pcSwgVUFSVF9DT05UUk9MKSk7CisJCQltYXNrICY9IH5FU19UWFJEWTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoYnl0ZSwgRVNfUkVHKGVuc29uaXEsIFVBUlRfREFUQSkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfbWlkaV9pbnB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwllbnNvbmlxLT51YXJ0bSB8PSBFU19NT0RFX0lOUFVUOworCWVuc29uaXEtPm1pZGlfaW5wdXQgPSBzdWJzdHJlYW07CisJaWYgKCEoZW5zb25pcS0+dWFydG0gJiBFU19NT0RFX09VVFBVVCkpIHsKKwkJb3V0YihFU19DTlRSTCgzKSwgRVNfUkVHKGVuc29uaXEsIFVBUlRfQ09OVFJPTCkpOworCQlvdXRiKGVuc29uaXEtPnVhcnRjID0gMCwgRVNfUkVHKGVuc29uaXEsIFVBUlRfQ09OVFJPTCkpOworCQlvdXRsKGVuc29uaXEtPmN0cmwgfD0gRVNfVUFSVF9FTiwgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfbWlkaV9pbnB1dF9jbG9zZShzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJaWYgKCEoZW5zb25pcS0+dWFydG0gJiBFU19NT0RFX09VVFBVVCkpIHsKKwkJb3V0YihlbnNvbmlxLT51YXJ0YyA9IDAsIEVTX1JFRyhlbnNvbmlxLCBVQVJUX0NPTlRST0wpKTsKKwkJb3V0bChlbnNvbmlxLT5jdHJsICY9IH5FU19VQVJUX0VOLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCX0gZWxzZSB7CisJCW91dGIoZW5zb25pcS0+dWFydGMgJj0gfkVTX1JYSU5URU4sIEVTX1JFRyhlbnNvbmlxLCBVQVJUX0NPTlRST0wpKTsKKwl9CisJZW5zb25pcS0+bWlkaV9pbnB1dCA9IE5VTEw7CisJZW5zb25pcS0+dWFydG0gJj0gfkVTX01PREVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2Vuc29uaXFfbWlkaV9vdXRwdXRfb3BlbihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJZW5zb25pcS0+dWFydG0gfD0gRVNfTU9ERV9PVVRQVVQ7CisJZW5zb25pcS0+bWlkaV9vdXRwdXQgPSBzdWJzdHJlYW07CisJaWYgKCEoZW5zb25pcS0+dWFydG0gJiBFU19NT0RFX0lOUFVUKSkgeworCQlvdXRiKEVTX0NOVFJMKDMpLCBFU19SRUcoZW5zb25pcSwgVUFSVF9DT05UUk9MKSk7CisJCW91dGIoZW5zb25pcS0+dWFydGMgPSAwLCBFU19SRUcoZW5zb25pcSwgVUFSVF9DT05UUk9MKSk7CisJCW91dGwoZW5zb25pcS0+Y3RybCB8PSBFU19VQVJUX0VOLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW5zb25pcV9taWRpX291dHB1dF9jbG9zZShzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZlbnNvbmlxLT5yZWdfbG9jayk7CisJaWYgKCEoZW5zb25pcS0+dWFydG0gJiBFU19NT0RFX0lOUFVUKSkgeworCQlvdXRiKGVuc29uaXEtPnVhcnRjID0gMCwgRVNfUkVHKGVuc29uaXEsIFVBUlRfQ09OVFJPTCkpOworCQlvdXRsKGVuc29uaXEtPmN0cmwgJj0gfkVTX1VBUlRfRU4sIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CisJfSBlbHNlIHsKKwkJb3V0YihlbnNvbmlxLT51YXJ0YyAmPSB+RVNfVFhJTlRFTk0sIEVTX1JFRyhlbnNvbmlxLCBVQVJUX0NPTlRST0wpKTsKKwl9CisJZW5zb25pcS0+bWlkaV9vdXRwdXQgPSBOVUxMOworCWVuc29uaXEtPnVhcnRtICY9IH5FU19NT0RFX09VVFBVVDsKKwlzcGluX3VubG9ja19pcnEoJmVuc29uaXEtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2Vuc29uaXFfbWlkaV9pbnB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJaW50IGlkeDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbnNvbmlxLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICh1cCkgeworCQlpZiAoKGVuc29uaXEtPnVhcnRjICYgRVNfUlhJTlRFTikgPT0gMCkgeworCQkJLyogZW1wdHkgaW5wdXQgRklGTyAqLworCQkJZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCisJCQkJaW5iKEVTX1JFRyhlbnNvbmlxLCBVQVJUX0RBVEEpKTsKKwkJCWVuc29uaXEtPnVhcnRjIHw9IEVTX1JYSU5URU47CisJCQlvdXRiKGVuc29uaXEtPnVhcnRjLCBFU19SRUcoZW5zb25pcSwgVUFSVF9DT05UUk9MKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5zb25pcS0+dWFydGMgJiBFU19SWElOVEVOKSB7CisJCQllbnNvbmlxLT51YXJ0YyAmPSB+RVNfUlhJTlRFTjsKKwkJCW91dGIoZW5zb25pcS0+dWFydGMsIEVTX1JFRyhlbnNvbmlxLCBVQVJUX0NPTlRST0wpKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbnNvbmlxLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZW5zb25pcV9taWRpX291dHB1dF90cmlnZ2VyKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgdXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbnNvbmlxX3QgKmVuc29uaXEgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuc29uaXEtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHVwKSB7CisJCWlmIChFU19UWElOVEVOSShlbnNvbmlxLT51YXJ0YykgPT0gMCkgeworCQkJZW5zb25pcS0+dWFydGMgfD0gRVNfVFhJTlRFTk8oMSk7CisJCQkvKiBmaWxsIFVBUlQgRklGTyBidWZmZXIgYXQgZmlyc3QsIGFuZCB0dXJuIFR4IGludGVycnVwdHMgb25seSBpZiBuZWNlc3NhcnkgKi8KKwkJCXdoaWxlIChFU19UWElOVEVOSShlbnNvbmlxLT51YXJ0YykgPT0gMSAmJgorCQkJICAgICAgIChpbmIoRVNfUkVHKGVuc29uaXEsIFVBUlRfU1RBVFVTKSkgJiBFU19UWFJEWSkpIHsKKwkJCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXQoc3Vic3RyZWFtLCAmYnl0ZSwgMSkgIT0gMSkgeworCQkJCQllbnNvbmlxLT51YXJ0YyAmPSB+RVNfVFhJTlRFTk07CisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0YihieXRlLCBFU19SRUcoZW5zb25pcSwgVUFSVF9EQVRBKSk7CisJCQkJfQorCQkJfQorCQkJb3V0YihlbnNvbmlxLT51YXJ0YywgRVNfUkVHKGVuc29uaXEsIFVBUlRfQ09OVFJPTCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEVTX1RYSU5URU5JKGVuc29uaXEtPnVhcnRjKSA9PSAxKSB7CisJCQllbnNvbmlxLT51YXJ0YyAmPSB+RVNfVFhJTlRFTk07CisJCQlvdXRiKGVuc29uaXEtPnVhcnRjLCBFU19SRUcoZW5zb25pcSwgVUFSVF9DT05UUk9MKSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5zb25pcS0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9lbnNvbmlxX21pZGlfb3V0cHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfZW5zb25pcV9taWRpX291dHB1dF9vcGVuLAorCS5jbG9zZSA9CXNuZF9lbnNvbmlxX21pZGlfb3V0cHV0X2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX2Vuc29uaXFfbWlkaV9vdXRwdXRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBzbmRfcmF3bWlkaV9vcHNfdCBzbmRfZW5zb25pcV9taWRpX2lucHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfZW5zb25pcV9taWRpX2lucHV0X29wZW4sCisJLmNsb3NlID0Jc25kX2Vuc29uaXFfbWlkaV9pbnB1dF9jbG9zZSwKKwkudHJpZ2dlciA9CXNuZF9lbnNvbmlxX21pZGlfaW5wdXRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lbnNvbmlxX21pZGkoZW5zb25pcV90ICogZW5zb25pcSwgaW50IGRldmljZSwgc25kX3Jhd21pZGlfdCAqKnJyYXdtaWRpKQoreworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCWludCBlcnI7CisKKwlpZiAocnJhd21pZGkpCisJCSpycmF3bWlkaSA9IE5VTEw7CisJaWYgKChlcnIgPSBzbmRfcmF3bWlkaV9uZXcoZW5zb25pcS0+Y2FyZCwgIkVTMTM3MC8xIiwgZGV2aWNlLCAxLCAxLCAmcm1pZGkpKSA8IDApCisJCXJldHVybiBlcnI7CisjaWZkZWYgQ0hJUDEzNzAKKwlzdHJjcHkocm1pZGktPm5hbWUsICJFUzEzNzAiKTsKKyNlbHNlCisJc3RyY3B5KHJtaWRpLT5uYW1lLCAiRVMxMzcxIik7CisjZW5kaWYKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsICZzbmRfZW5zb25pcV9taWRpX291dHB1dCk7CisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZzbmRfZW5zb25pcV9taWRpX2lucHV0KTsKKwlybWlkaS0+aW5mb19mbGFncyB8PSBTTkRSVl9SQVdNSURJX0lORk9fT1VUUFVUIHwgU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUIHwgU05EUlZfUkFXTUlESV9JTkZPX0RVUExFWDsKKwlybWlkaS0+cHJpdmF0ZV9kYXRhID0gZW5zb25pcTsKKwllbnNvbmlxLT5ybWlkaSA9IHJtaWRpOworCWlmIChycmF3bWlkaSkKKwkJKnJyYXdtaWRpID0gcm1pZGk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgSW50ZXJydXB0IGhhbmRsZXIKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2F1ZGlvcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWVuc29uaXFfdCAqZW5zb25pcSA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBzY3RybDsKKworCWlmIChlbnNvbmlxID09IE5VTEwpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXN0YXR1cyA9IGlubChFU19SRUcoZW5zb25pcSwgU1RBVFVTKSk7CisJaWYgKCEoc3RhdHVzICYgRVNfSU5UUikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmZW5zb25pcS0+cmVnX2xvY2spOworCXNjdHJsID0gZW5zb25pcS0+c2N0cmw7CisJaWYgKHN0YXR1cyAmIEVTX0RBQzEpCisJCXNjdHJsICY9IH5FU19QMV9JTlRfRU47CisJaWYgKHN0YXR1cyAmIEVTX0RBQzIpCisJCXNjdHJsICY9IH5FU19QMl9JTlRfRU47CisJaWYgKHN0YXR1cyAmIEVTX0FEQykKKwkJc2N0cmwgJj0gfkVTX1IxX0lOVF9FTjsKKwlvdXRsKHNjdHJsLCBFU19SRUcoZW5zb25pcSwgU0VSSUFMKSk7CisJb3V0bChlbnNvbmlxLT5zY3RybCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOworCXNwaW5fdW5sb2NrKCZlbnNvbmlxLT5yZWdfbG9jayk7CisKKwlpZiAoc3RhdHVzICYgRVNfVUFSVCkKKwkJc25kX2Vuc29uaXFfbWlkaV9pbnRlcnJ1cHQoZW5zb25pcSk7CisJaWYgKChzdGF0dXMgJiBFU19EQUMyKSAmJiBlbnNvbmlxLT5wbGF5YmFjazJfc3Vic3RyZWFtKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGVuc29uaXEtPnBsYXliYWNrMl9zdWJzdHJlYW0pOworCWlmICgoc3RhdHVzICYgRVNfQURDKSAmJiBlbnNvbmlxLT5jYXB0dXJlX3N1YnN0cmVhbSkKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChlbnNvbmlxLT5jYXB0dXJlX3N1YnN0cmVhbSk7CisJaWYgKChzdGF0dXMgJiBFU19EQUMxKSAmJiBlbnNvbmlxLT5wbGF5YmFjazFfc3Vic3RyZWFtKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGVuc29uaXEtPnBsYXliYWNrMV9zdWJzdHJlYW0pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2F1ZGlvcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwllbnNvbmlxX3QgKmVuc29uaXE7CisJaW50IGVyciwgcGNtX2RldnNbMl07CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoZXJyID0gc25kX2Vuc29uaXFfY3JlYXRlKGNhcmQsIHBjaSwgJmVuc29uaXEpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY21fZGV2c1swXSA9IDA7IHBjbV9kZXZzWzFdID0gMTsKKyNpZmRlZiBDSElQMTM3MAorCWlmICgoZXJyID0gc25kX2Vuc29uaXFfMTM3MF9taXhlcihlbnNvbmlxKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisjaWZkZWYgQ0hJUDEzNzEKKwlpZiAoKGVyciA9IHNuZF9lbnNvbmlxXzEzNzFfbWl4ZXIoZW5zb25pcSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCWlmICgoZXJyID0gc25kX2Vuc29uaXFfcGNtKGVuc29uaXEsIDAsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfZW5zb25pcV9wY20yKGVuc29uaXEsIDEsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfZW5zb25pcV9taWRpKGVuc29uaXEsIDAsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfZW5zb25pcV9jcmVhdGVfZ2FtZXBvcnQoZW5zb25pcSwgZGV2KTsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsIERSSVZFUl9OQU1FKTsKKworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJFbnNvbmlxIEF1ZGlvUENJIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzICVzIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsCisJCWNhcmQtPmRyaXZlciwKKwkJZW5zb25pcS0+cG9ydCwKKwkJZW5zb25pcS0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2F1ZGlvcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0gc25kX2F1ZGlvcGNpX2lkcywKKwkucHJvYmUgPSBzbmRfYXVkaW9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hdWRpb3BjaV9yZW1vdmUpLAorfTsKKwkKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9lbnMxMzd4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2VuczEzN3hfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2VuczEzN3hfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9lbnMxMzd4X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MS5jIGIvc291bmQvcGNpL2VuczEzNzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBkYTBhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VuczEzNzEuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgQ0hJUDEzNzEKKyNpbmNsdWRlICJlbnMxMzcwLmMiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjYThhZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMCwwICsxLDE3NzMgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBFU1MgU29sby0xIChFUzE5MzgsIEVTMTk0NiwgRVMxOTY5KSBzb3VuZGNhcmQKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9taXIgS291dGVrIDxtaXJpQHB1bmtuZXQuY3o+LAorICogICAgICAgICAgICAgICAgICAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiwKKyAqICAgICAgICAgICAgICAgICAgIFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4sCisgKiAgICAgICAgICAgICAgICAgICBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+LAorICogICAgICAgICAgICAgICAgICAgTWFya3VzIEdydWJlciA8Z3J1YmVyQGVpa29uLnR1bS5kZT4KKyAqIAorICogUmV3cml0dGVuIGZyb20gc29uaWN2aWJlcy5jIHNvdXJjZS4KKyAqCisgKiAgVE9ETzoKKyAqICAgIFJld3JpdGUgYmV0dGVyIHNwaW5sb2NrcworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgIE5PVEVTOgorICAtIENhcHR1cmUgZGF0YSBpcyB3cml0dGVuIHVuYWxpZ25lZCBzdGFydGluZyBmcm9tIGRtYV9iYXNlICsgMSBzbyBJIG5lZWQgdG8KKyAgICBkaXNhYmxlIG1tYXAgYW5kIHRvIGFkZCBhIGNvcHkgY2FsbGJhY2suCisgIC0gQWZ0ZXIgc2V2ZXJhbCBjeWNsZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIHdoaWxlIDogOyBkbyBhcmVjb3JkIC1kMSAtZiBjZCAtdCByYXcgfCBhcGxheSAtZiBjZCA7IGRvbmUKKyAgICBhICJwbGF5YmFjayB3cml0ZSBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPykiIG1heSBoYXBwZW4uCisgICAgVGhpcyBpcyBkdWUgdG8gcGxheWJhY2sgaW50ZXJydXB0cyBub3QgZ2VuZXJhdGVkLgorICAgIEkgc3VzcGVjdCBhIHRpbWluZyBpc3N1ZS4KKyAgLSBTb21ldGltZXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGludm9rZWQgd3JvbmdseSBkdXJpbmcgcGxheWJhY2suCisgICAgVGhpcyBnZW5lcmF0ZXMgc29tZSBoYXJtbGVzcyAiVW5leHBlY3RlZCBod19wb2ludGVyOiB3cm9uZyBpbnRlcnJ1cHQKKyAgICBhY2tub3dsZWRnZSIuCisgICAgSSd2ZSBzZWVuIHRoYXQgdXNpbmcgc21hbGwgcGVyaW9kIHNpemVzLgorICAgIFJlcHJvZHVjaWJsZSB3aXRoOgorICAgIG1wZzEyMyB0ZXN0Lm1wMyAmCisgICAgaGRwYXJtIC10IC1UIC9kZXYvaGRhCisqLworCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvb3BsMy5oPgorI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvbWlyIEtvdXRlayA8bWlyaUBwdW5rbmV0LmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgU29sby0xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tFU1MsRVMxOTM4fSwiCisgICAgICAgICAgICAgICAgIntFU1MsRVMxOTQ2fSwiCisgICAgICAgICAgICAgICAgIntFU1MsRVMxOTY5fSwiCisJCSJ7VGVycmFUZWMsMTI4aSBQQ0l9fSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0VTUworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VTUwkJMHgxMjVkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfRVMxOTM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTMTkzOAkweDE5NjkKKyNlbmRpZgorCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBFU1MgU29sby0xIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgRVNTIFNvbG8tMSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEVTUyBTb2xvLTEgc291bmRjYXJkLiIpOworCisjZGVmaW5lIFNMSU9fUkVHKGNoaXAsIHgpICgoY2hpcCktPmlvX3BvcnQgKyBFU1NJT19SRUdfIyN4KQorCisjZGVmaW5lIFNMRE1fUkVHKGNoaXAsIHgpICgoY2hpcCktPmRkbWFfcG9ydCArIEVTU0RNX1JFR18jI3gpCisKKyNkZWZpbmUgU0xTQl9SRUcoY2hpcCwgeCkgKChjaGlwKS0+c2JfcG9ydCArIEVTU1NCX1JFR18jI3gpCisKKyNkZWZpbmUgU0xfUENJX0xFR0FDWUNPTlRST0wJCTB4NDAKKyNkZWZpbmUgU0xfUENJX0NPTkZJRwkJCTB4NTAKKyNkZWZpbmUgU0xfUENJX0RETUFDT05UUk9MCQkweDYwCisKKyNkZWZpbmUgRVNTSU9fUkVHX0FVRElPMkRNQUFERFIJCTAKKyNkZWZpbmUgRVNTSU9fUkVHX0FVRElPMkRNQUNPVU5UCTQKKyNkZWZpbmUgRVNTSU9fUkVHX0FVRElPMk1PREUJCTYKKyNkZWZpbmUgRVNTSU9fUkVHX0lSUUNPTlRST0wJCTcKKworI2RlZmluZSBFU1NETV9SRUdfRE1BQUREUgkJMHgwMAorI2RlZmluZSBFU1NETV9SRUdfRE1BQ09VTlQJCTB4MDQKKyNkZWZpbmUgRVNTRE1fUkVHX0RNQUNPTU1BTkQJCTB4MDgKKyNkZWZpbmUgRVNTRE1fUkVHX0RNQVNUQVRVUwkJMHgwOAorI2RlZmluZSBFU1NETV9SRUdfRE1BTU9ERQkJMHgwYgorI2RlZmluZSBFU1NETV9SRUdfRE1BQ0xFQVIJCTB4MGQKKyNkZWZpbmUgRVNTRE1fUkVHX0RNQU1BU0sJCTB4MGYKKworI2RlZmluZSBFU1NTQl9SRUdfRk1MT1dBRERSCQkweDAwCisjZGVmaW5lIEVTU1NCX1JFR19GTUhJR0hBRERSCQkweDAyCisjZGVmaW5lIEVTU1NCX1JFR19NSVhFUkFERFIJCTB4MDQKKyNkZWZpbmUgRVNTU0JfUkVHX01JWEVSREFUQQkJMHgwNQorCisjZGVmaW5lIEVTU1NCX0lSRUdfQVVESU8xCQkweDE0CisjZGVmaW5lIEVTU1NCX0lSRUdfTUlDTUlYCQkweDFhCisjZGVmaW5lIEVTU1NCX0lSRUdfUkVDU1JDCQkweDFjCisjZGVmaW5lIEVTU1NCX0lSRUdfTUFTVEVSCQkweDMyCisjZGVmaW5lIEVTU1NCX0lSRUdfRk0JCQkweDM2CisjZGVmaW5lIEVTU1NCX0lSRUdfQVVYQUNECQkweDM4CisjZGVmaW5lIEVTU1NCX0lSRUdfQVVYQgkJCTB4M2EKKyNkZWZpbmUgRVNTU0JfSVJFR19QQ1NQRUFLRVIJCTB4M2MKKyNkZWZpbmUgRVNTU0JfSVJFR19MSU5FCQkJMHgzZQorI2RlZmluZSBFU1NTQl9JUkVHX1NQQVRDT05UUk9MCQkweDUwCisjZGVmaW5lIEVTU1NCX0lSRUdfU1BBVExFVkVMCQkweDUyCisjZGVmaW5lIEVTU1NCX0lSRUdfTUFTVEVSX0xFRlQJCTB4NjAKKyNkZWZpbmUgRVNTU0JfSVJFR19NQVNURVJfUklHSFQJCTB4NjIKKyNkZWZpbmUgRVNTU0JfSVJFR19NUFU0MDFDT05UUk9MCTB4NjQKKyNkZWZpbmUgRVNTU0JfSVJFR19NSUNNSVhSRUNPUkQJCTB4NjgKKyNkZWZpbmUgRVNTU0JfSVJFR19BVURJTzJSRUNPUkQJCTB4NjkKKyNkZWZpbmUgRVNTU0JfSVJFR19BVVhBQ0RSRUNPUkQJCTB4NmEKKyNkZWZpbmUgRVNTU0JfSVJFR19GTVJFQ09SRAkJMHg2YgorI2RlZmluZSBFU1NTQl9JUkVHX0FVWEJSRUNPUkQJCTB4NmMKKyNkZWZpbmUgRVNTU0JfSVJFR19NT05PCQkJMHg2ZAorI2RlZmluZSBFU1NTQl9JUkVHX0xJTkVSRUNPUkQJCTB4NmUKKyNkZWZpbmUgRVNTU0JfSVJFR19NT05PUkVDT1JECQkweDZmCisjZGVmaW5lIEVTU1NCX0lSRUdfQVVESU8yU0FNUExFCQkweDcwCisjZGVmaW5lIEVTU1NCX0lSRUdfQVVESU8yTU9ERQkJMHg3MQorI2RlZmluZSBFU1NTQl9JUkVHX0FVRElPMkZJTFRFUgkJMHg3MgorI2RlZmluZSBFU1NTQl9JUkVHX0FVRElPMlRDT1VOVEwJMHg3NAorI2RlZmluZSBFU1NTQl9JUkVHX0FVRElPMlRDT1VOVEgJMHg3NgorI2RlZmluZSBFU1NTQl9JUkVHX0FVRElPMkNPTlRST0wxCTB4NzgKKyNkZWZpbmUgRVNTU0JfSVJFR19BVURJTzJDT05UUk9MMgkweDdhCisjZGVmaW5lIEVTU1NCX0lSRUdfQVVESU8yCQkweDdjCisKKyNkZWZpbmUgRVNTU0JfUkVHX1JFU0VUCQkJMHgwNgorCisjZGVmaW5lIEVTU1NCX1JFR19SRUFEREFUQQkJMHgwYQorI2RlZmluZSBFU1NTQl9SRUdfV1JJVEVEQVRBCQkweDBjCisjZGVmaW5lIEVTU1NCX1JFR19SRUFEU1RBVFVTCQkweDBjCisKKyNkZWZpbmUgRVNTU0JfUkVHX1NUQVRVUwkJMHgwZQorCisjZGVmaW5lIEVTU19DTURfRVhUU0FNUExFUkFURQkJMHhhMQorI2RlZmluZSBFU1NfQ01EX0ZJTFRFUkRJVgkJMHhhMgorI2RlZmluZSBFU1NfQ01EX0RNQUNOVFJFTE9BREwJCTB4YTQKKyNkZWZpbmUgRVNTX0NNRF9ETUFDTlRSRUxPQURICQkweGE1CisjZGVmaW5lIEVTU19DTURfQU5BTE9HQ09OVFJPTAkJMHhhOAorI2RlZmluZSBFU1NfQ01EX0lSUUNPTlRST0wJCTB4YjEKKyNkZWZpbmUgRVNTX0NNRF9EUlFDT05UUk9MCQkweGIyCisjZGVmaW5lIEVTU19DTURfUkVDTEVWRUwJCTB4YjQKKyNkZWZpbmUgRVNTX0NNRF9TRVRGT1JNQVQJCTB4YjYKKyNkZWZpbmUgRVNTX0NNRF9TRVRGT1JNQVQyCQkweGI3CisjZGVmaW5lIEVTU19DTURfRE1BQ09OVFJPTAkJMHhiOAorI2RlZmluZSBFU1NfQ01EX0RNQVRZUEUJCQkweGI5CisjZGVmaW5lIEVTU19DTURfT0ZGU0VUTEVGVAkJMHhiYQkKKyNkZWZpbmUgRVNTX0NNRF9PRkZTRVRSSUdIVAkJMHhiYgorI2RlZmluZSBFU1NfQ01EX1JFQURSRUcJCQkweGMwCisjZGVmaW5lIEVTU19DTURfRU5BQkxFRVhUCQkweGM2CisjZGVmaW5lIEVTU19DTURfUEFVU0VETUEJCTB4ZDAKKyNkZWZpbmUgRVNTX0NNRF9FTkFCTEVBVURJTzEJCTB4ZDEKKyNkZWZpbmUgRVNTX0NNRF9TVE9QQVVESU8xCQkweGQzCisjZGVmaW5lIEVTU19DTURfQVVESU8xU1RBVFVTCQkweGQ4CisjZGVmaW5lIEVTU19DTURfQ09OVERNQQkJCTB4ZDQKKyNkZWZpbmUgRVNTX0NNRF9URVNUSVJRCQkJMHhmMgorCisjZGVmaW5lIEVTU19SRUNTUkNfTUlDCQkwCisjZGVmaW5lIEVTU19SRUNTUkNfQVVYQUNECTIKKyNkZWZpbmUgRVNTX1JFQ1NSQ19BVVhCCQk1CisjZGVmaW5lIEVTU19SRUNTUkNfTElORQkJNgorI2RlZmluZSBFU1NfUkVDU1JDX05PTkUJCTcKKworI2RlZmluZSBEQUMxIDB4MDEKKyNkZWZpbmUgQURDMSAweDAyCisjZGVmaW5lIERBQzIgMHgwNAorCisvKgorCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9lczE5MzggZXMxOTM4X3Q7CisKKyNkZWZpbmUgU0FWRURfUkVHX1NJWkUJMzIgLyogbWF4LiBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHNhdmUgKi8KKworc3RydWN0IF9zbmRfZXMxOTM4IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBpb19wb3J0OworCXVuc2lnbmVkIGxvbmcgc2JfcG9ydDsKKwl1bnNpZ25lZCBsb25nIHZjX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBtcHVfcG9ydDsKKwl1bnNpZ25lZCBsb25nIGdhbWVfcG9ydDsKKwl1bnNpZ25lZCBsb25nIGRkbWFfcG9ydDsKKworCXVuc2lnbmVkIGNoYXIgaXJxbWFzazsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCisJc25kX2tjb250cm9sX3QgKmh3X3ZvbHVtZTsKKwlzbmRfa2NvbnRyb2xfdCAqaHdfc3dpdGNoOworCXNuZF9rY29udHJvbF90ICptYXN0ZXJfdm9sdW1lOworCXNuZF9rY29udHJvbF90ICptYXN0ZXJfc3dpdGNoOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfY2FyZF90ICpjYXJkOworCXNuZF9wY21fdCAqcGNtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKmNhcHR1cmVfc3Vic3RyZWFtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrMV9zdWJzdHJlYW07CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqcGxheWJhY2syX3N1YnN0cmVhbTsKKwlzbmRfa21peGVyX3QgKm1peGVyOworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCisJdW5zaWduZWQgaW50IGRtYTFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZG1hMl9zaXplOworCXVuc2lnbmVkIGludCBkbWExX3N0YXJ0OworCXVuc2lnbmVkIGludCBkbWEyX3N0YXJ0OworCXVuc2lnbmVkIGludCBkbWExX3NoaWZ0OworCXVuc2lnbmVkIGludCBkbWEyX3NoaWZ0OworCXVuc2lnbmVkIGludCBhY3RpdmU7CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXNwaW5sb2NrX3QgbWl4ZXJfbG9jazsKKyAgICAgICAgc25kX2luZm9fZW50cnlfdCAqcHJvY19lbnRyeTsKKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BNCisJdW5zaWduZWQgY2hhciBzYXZlZF9yZWdzW1NBVkVEX1JFR19TSVpFXTsKKyNlbmRpZgorfTsKKworc3RhdGljIGlycXJldHVybl90IHNuZF9lczE5MzhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2VzMTkzOF9pZHNbXSA9IHsKKyAgICAgICAgeyAweDEyNWQsIDB4MTk2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwgICAvKiBTb2xvLTEgKi8KKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfZXMxOTM4X2lkcyk7CisKKyNkZWZpbmUgUkVTRVRfTE9PUF9USU1FT1VUCTB4MTAwMDAKKyNkZWZpbmUgV1JJVEVfTE9PUF9USU1FT1VUCTB4MTAwMDAKKyNkZWZpbmUgR0VUX0xPT1BfVElNRU9VVAkweDAxMDAwCisKKyN1bmRlZiBSRUdfREVCVUcKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcml0ZSB0byBhIG1peGVyIHJlZ2lzdGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBzbmRfZXMxOTM4X21peGVyX3dyaXRlKGVzMTkzOF90ICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkFERFIpKTsKKwlvdXRiKHZhbCwgU0xTQl9SRUcoY2hpcCwgTUlYRVJEQVRBKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOworI2lmZGVmIFJFR19ERUJVRworCXNuZF9wcmludGsoIk1peGVyIHJlZyAlMDJ4IHNldCB0byAlMDJ4XG4iLCByZWcsIHZhbCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlYWQgZnJvbSBhIG1peGVyIHJlZ2lzdGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHNuZF9lczE5MzhfbWl4ZXJfcmVhZChlczE5MzhfdCAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcpCit7CisJaW50IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkFERFIpKTsKKwlkYXRhID0gaW5iKFNMU0JfUkVHKGNoaXAsIE1JWEVSREFUQSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBSRUdfREVCVUcKKwlzbmRfcHJpbnRrKCJNaXhlciByZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCBkYXRhKTsKKyNlbmRpZgorCXJldHVybiBkYXRhOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGUgdG8gc29tZSBiaXRzIG9mIGEgbWl4ZXIgcmVnaXN0ZXIgKHJldHVybiBvbGQgdmFsdWUpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHNuZF9lczE5MzhfbWl4ZXJfYml0cyhlczE5MzhfdCAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG9sZCwgbmV3LCBvdmFsOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5taXhlcl9sb2NrLCBmbGFncyk7CisJb3V0YihyZWcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSQUREUikpOworCW9sZCA9IGluYihTTFNCX1JFRyhjaGlwLCBNSVhFUkRBVEEpKTsKKwlvdmFsID0gb2xkICYgbWFzazsKKwlpZiAodmFsICE9IG92YWwpIHsKKwkJbmV3ID0gKG9sZCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwkJb3V0YihuZXcsIFNMU0JfUkVHKGNoaXAsIE1JWEVSREFUQSkpOworI2lmZGVmIFJFR19ERUJVRworCQlzbmRfcHJpbnRrKCJNaXhlciByZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsIHJlZywgb2xkLCBuZXcpOworI2VuZGlmCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gb3ZhbDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGNvbW1hbmQgdG8gQ29udHJvbGxlciBSZWdpc3RlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5Mzhfd3JpdGVfY21kKGVzMTkzOF90ICpjaGlwLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHY7CisJZm9yIChpID0gMDsgaSA8IFdSSVRFX0xPT1BfVElNRU9VVDsgaSsrKSB7CisJCWlmICghKHYgPSBpbmIoU0xTQl9SRUcoY2hpcCwgUkVBRFNUQVRVUykpICYgMHg4MCkpIHsKKwkJCW91dGIoY21kLCBTTFNCX1JFRyhjaGlwLCBXUklURURBVEEpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlwcmludGsoInNuZF9lczE5Mzhfd3JpdGVfY21kIHRpbWVvdXQgKDB4MDIleC8weDAyJXgpXG4iLCBjbWQsIHYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVhZCB0aGUgUmVhZCBEYXRhIEJ1ZmZlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBzbmRfZXMxOTM4X2dldF9ieXRlKGVzMTkzOF90ICpjaGlwKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgdjsKKwlmb3IgKGkgPSBHRVRfTE9PUF9USU1FT1VUOyBpOyBpLS0pCisJCWlmICgodiA9IGluYihTTFNCX1JFRyhjaGlwLCBTVEFUVVMpKSkgJiAweDgwKQorCQkJcmV0dXJuIGluYihTTFNCX1JFRyhjaGlwLCBSRUFEREFUQSkpOworCXNuZF9wcmludGsoImdldF9ieXRlIHRpbWVvdXQ6IHN0YXR1cyAweDAyJXhcbiIsIHYpOworCXJldHVybiAtRU5PREVWOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGUgdmFsdWUgY21kIHJlZ2lzdGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBzbmRfZXMxOTM4X3dyaXRlKGVzMTkzOF90ICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfZXMxOTM4X3dyaXRlX2NtZChjaGlwLCByZWcpOworCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBSRUdfREVCVUcKKwlzbmRfcHJpbnRrKCJSZWcgJTAyeCBzZXQgdG8gJTAyeFxuIiwgcmVnLCB2YWwpOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWFkIGRhdGEgZnJvbSBjbWQgcmVnaXN0ZXIgYW5kIHJldHVybiBpdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX2VzMTkzOF9yZWFkKGVzMTkzOF90ICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIEVTU19DTURfUkVBRFJFRyk7CisJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKKwl2YWwgPSBzbmRfZXMxOTM4X2dldF9ieXRlKGNoaXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisjaWZkZWYgUkVHX0RFQlVHCisJc25kX3ByaW50aygiUmVnICUwMnggbm93IGlzICUwMnhcbiIsIHJlZywgdmFsKTsKKyNlbmRpZgorCXJldHVybiB2YWw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcml0ZSBkYXRhIHRvIGNtZCByZWdpc3RlciBhbmQgcmV0dXJuIG9sZCB2YWx1ZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBzbmRfZXMxOTM4X2JpdHMoZXMxOTM4X3QgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBvbGQsIG5ldywgb3ZhbDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfZXMxOTM4X3dyaXRlX2NtZChjaGlwLCBFU1NfQ01EX1JFQURSRUcpOworCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIHJlZyk7CisJb2xkID0gc25kX2VzMTkzOF9nZXRfYnl0ZShjaGlwKTsKKwlvdmFsID0gb2xkICYgbWFzazsKKwlpZiAodmFsICE9IG92YWwpIHsKKwkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgcmVnKTsKKwkJbmV3ID0gKG9sZCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwkJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgbmV3KTsKKyNpZmRlZiBSRUdfREVCVUcKKwkJc25kX3ByaW50aygiUmVnICUwMnggd2FzICUwMngsIHNldCB0byAlMDJ4XG4iLCByZWcsIG9sZCwgbmV3KTsKKyNlbmRpZgorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBvdmFsOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVzZXQgdGhlIGNoaXAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfcmVzZXQoZXMxOTM4X3QgKmNoaXApCit7CisJaW50IGk7CisKKwlvdXRiKDMsIFNMU0JfUkVHKGNoaXAsIFJFU0VUKSk7CisJaW5iKFNMU0JfUkVHKGNoaXAsIFJFU0VUKSk7CisJb3V0YigwLCBTTFNCX1JFRyhjaGlwLCBSRVNFVCkpOworCWZvciAoaSA9IDA7IGkgPCBSRVNFVF9MT09QX1RJTUVPVVQ7IGkrKykgeworCQlpZiAoaW5iKFNMU0JfUkVHKGNoaXAsIFNUQVRVUykpICYgMHg4MCkgeworCQkJaWYgKGluYihTTFNCX1JFRyhjaGlwLCBSRUFEREFUQSkpID09IDB4YWEpCisJCQkJZ290byBfX25leHQ7CisJCX0KKwl9CisJc25kX3ByaW50aygiRVNTIFNvbG8tMSByZXNldCBmYWlsZWRcbiIpOworCisgICAgIF9fbmV4dDoKKwlzbmRfZXMxOTM4X3dyaXRlX2NtZChjaGlwLCBFU1NfQ01EX0VOQUJMRUVYVCk7CisKKwkvKiBEZW1hbmQgdHJhbnNmZXIgRE1BOiA0IGJ5dGVzIHBlciBETUEgcmVxdWVzdCAqLworCXNuZF9lczE5Mzhfd3JpdGUoY2hpcCwgRVNTX0NNRF9ETUFUWVBFLCAyKTsKKworCS8qIENoYW5nZSBiZWhhdmlvdXIgb2YgcmVnaXN0ZXIgQTEKKwkgICA0eCBvdmVyc2FtcGxpbmcKKwkgICAybmQgY2hhbm5lbCBEQUMgYXN5bmNocm9ub3VzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCBFU1NTQl9JUkVHX0FVRElPMk1PREUsIDB4MzIpOworCS8qIGVuYWJsZS9zZWxlY3QgRE1BIGNoYW5uZWwgYW5kIElSUSBjaGFubmVsICovCisJc25kX2VzMTkzOF9iaXRzKGNoaXAsIEVTU19DTURfSVJRQ09OVFJPTCwgMHhmMCwgMHg1MCk7CisJc25kX2VzMTkzOF9iaXRzKGNoaXAsIEVTU19DTURfRFJRQ09OVFJPTCwgMHhmMCwgMHg1MCk7CisJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgRVNTX0NNRF9FTkFCTEVBVURJTzEpOworCS8qIFNldCBzcGF0aWFsaXplciBwYXJhbWV0ZXJzIHRvIHJlY29tbWVuZGVkIHZhbHVlcyAqLworCXNuZF9lczE5MzhfbWl4ZXJfd3JpdGUoY2hpcCwgMHg1NCwgMHg4Zik7CisJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCAweDU2LCAweDk1KTsKKwlzbmRfZXMxOTM4X21peGVyX3dyaXRlKGNoaXAsIDB4NTgsIDB4OTQpOworCXNuZF9lczE5MzhfbWl4ZXJfd3JpdGUoY2hpcCwgMHg1YSwgMHg4MCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXNldCB0aGUgRklGT3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfcmVzZXRfZmlmbyhlczE5MzhfdCAqY2hpcCkKK3sKKwlvdXRiKDIsIFNMU0JfUkVHKGNoaXAsIFJFU0VUKSk7CisJb3V0YigwLCBTTFNCX1JFRyhjaGlwLCBSRVNFVCkpOworfQorCitzdGF0aWMgcmF0bnVtX3QgY2xvY2tzWzJdID0geworCXsKKwkJLm51bSA9IDc5MzgwMCwKKwkJLmRlbl9taW4gPSAxLAorCQkuZGVuX21heCA9IDEyOCwKKwkJLmRlbl9zdGVwID0gMSwKKwl9LAorCXsKKwkJLm51bSA9IDc2ODAwMCwKKwkJLmRlbl9taW4gPSAxLAorCQkuZGVuX21heCA9IDEyOCwKKwkJLmRlbl9zdGVwID0gMSwKKwl9Cit9OworCitzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X3JhdG51bXNfdCBod19jb25zdHJhaW50c19jbG9ja3MgPSB7CisJLm5yYXRzID0gMiwKKwkucmF0cyA9IGNsb2NrcywKK307CisKKworc3RhdGljIHZvaWQgc25kX2VzMTkzOF9yYXRlX3NldChlczE5MzhfdCAqY2hpcCwgCisJCQkJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCWludCBtb2RlKQoreworCXVuc2lnbmVkIGludCBiaXRzLCBkaXYwOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWlmIChydW50aW1lLT5yYXRlX251bSA9PSBjbG9ja3NbMF0ubnVtKQorCQliaXRzID0gMTI4IC0gcnVudGltZS0+cmF0ZV9kZW47CisJZWxzZQorCQliaXRzID0gMjU2IC0gcnVudGltZS0+cmF0ZV9kZW47CisKKwkvKiBzZXQgZmlsdGVyIHJlZ2lzdGVyICovCisJZGl2MCA9IDI1NiAtIDcxNjAwMDAqMjAvKDgqODIqcnVudGltZS0+cmF0ZSk7CisJCQorCWlmIChtb2RlID09IERBQzIpIHsKKwkJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCAweDcwLCBiaXRzKTsKKwkJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCAweDcyLCBkaXYwKTsKKwl9IGVsc2UgeworCQlzbmRfZXMxOTM4X3dyaXRlKGNoaXAsIDB4QTEsIGJpdHMpOworCQlzbmRfZXMxOTM4X3dyaXRlKGNoaXAsIDB4QTIsIGRpdjApOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbmZpZ3VyZSBTb2xvMSBidWlsdGluIERNQSBDb250cm9sbGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfcGxheWJhY2sxX3NldGRtYShlczE5MzhfdCAqY2hpcCkKK3sKKwlvdXRiKDB4MDAsIFNMSU9fUkVHKGNoaXAsIEFVRElPMk1PREUpKTsKKwlvdXRsKGNoaXAtPmRtYTJfc3RhcnQsIFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUFERFIpKTsKKwlvdXR3KDAsIFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUNPVU5UKSk7CisJb3V0dyhjaGlwLT5kbWEyX3NpemUsIFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUNPVU5UKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfcGxheWJhY2syX3NldGRtYShlczE5MzhfdCAqY2hpcCkKK3sKKwkvKiBFbmFibGUgRE1BIGNvbnRyb2xsZXIgKi8KKwlvdXRiKDB4YzQsIFNMRE1fUkVHKGNoaXAsIERNQUNPTU1BTkQpKTsKKwkvKiAxLiBNYXN0ZXIgcmVzZXQgKi8KKwlvdXRiKDAsIFNMRE1fUkVHKGNoaXAsIERNQUNMRUFSKSk7CisJLyogMi4gTWFzayBETUEgKi8KKwlvdXRiKDEsIFNMRE1fUkVHKGNoaXAsIERNQU1BU0spKTsKKwlvdXRiKDB4MTgsIFNMRE1fUkVHKGNoaXAsIERNQU1PREUpKTsKKwlvdXRsKGNoaXAtPmRtYTFfc3RhcnQsIFNMRE1fUkVHKGNoaXAsIERNQUFERFIpKTsKKwlvdXR3KGNoaXAtPmRtYTFfc2l6ZSAtIDEsIFNMRE1fUkVHKGNoaXAsIERNQUNPVU5UKSk7CisJLyogMy4gVW5tYXNrIERNQSAqLworCW91dGIoMCwgU0xETV9SRUcoY2hpcCwgRE1BTUFTSykpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZXMxOTM4X2NhcHR1cmVfc2V0ZG1hKGVzMTkzOF90ICpjaGlwKQoreworCS8qIEVuYWJsZSBETUEgY29udHJvbGxlciAqLworCW91dGIoMHhjNCwgU0xETV9SRUcoY2hpcCwgRE1BQ09NTUFORCkpOworCS8qIDEuIE1hc3RlciByZXNldCAqLworCW91dGIoMCwgU0xETV9SRUcoY2hpcCwgRE1BQ0xFQVIpKTsKKwkvKiAyLiBNYXNrIERNQSAqLworCW91dGIoMSwgU0xETV9SRUcoY2hpcCwgRE1BTUFTSykpOworCW91dGIoMHgxNCwgU0xETV9SRUcoY2hpcCwgRE1BTU9ERSkpOworCW91dGwoY2hpcC0+ZG1hMV9zdGFydCwgU0xETV9SRUcoY2hpcCwgRE1BQUREUikpOworCW91dHcoY2hpcC0+ZG1hMV9zaXplIC0gMSwgU0xETV9SRUcoY2hpcCwgRE1BQ09VTlQpKTsKKwkvKiAzLiBVbm1hc2sgRE1BICovCisJb3V0YigwLCBTTERNX1JFRyhjaGlwLCBETUFNQVNLKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiBQQ00gcGFydCAqKioKKyAqLworCitzdGF0aWMgaW50IHNuZF9lczE5MzhfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgICAgaW50IGNtZCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgdmFsOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJdmFsID0gMHgwZjsKKwkJY2hpcC0+YWN0aXZlIHw9IEFEQzE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJdmFsID0gMHgwMDsKKwkJY2hpcC0+YWN0aXZlICY9IH5BREMxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX0RNQUNPTlRST0wsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9wbGF5YmFjazFfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCQlpbnQgY21kKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJLyogQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uIHRoaXMgc2hvdWxkIGJlOgorCQkgICAweDEzIGJ1dCB0aGF0IHZhbHVlIG1heSByYW5kb21seSBzd2FwIHN0ZXJlbyBjaGFubmVscyAqLworICAgICAgICAgICAgICAgIHNuZF9lczE5MzhfbWl4ZXJfd3JpdGUoY2hpcCwgRVNTU0JfSVJFR19BVURJTzJDT05UUk9MMSwgMHg5Mik7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKwkJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCBFU1NTQl9JUkVHX0FVRElPMkNPTlRST0wxLCAweDkzKTsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIHR3byBzdGFnZSBpbml0IGdpdmVzIHRoZSBGSUZPIC0+IERBQyBjb25uZWN0aW9uIHRpbWUgdG8KKyAgICAgICAgICAgICAgICAgKiBzZXR0bGUgYmVmb3JlIGZpcnN0IGRhdGEgZnJvbSBETUEgZmxvd3MgaW4uICBUaGlzIHNob3VsZCBlbnN1cmUKKyAgICAgICAgICAgICAgICAgKiBubyBzd2FwcGluZyBvZiBzdGVyZW8gY2hhbm5lbHMuICBSZXBvcnQgYSBidWcgaWYgb3RoZXJ3aXNlIDotKSAqLworCQlvdXRiKDB4MGEsIFNMSU9fUkVHKGNoaXAsIEFVRElPMk1PREUpKTsKKwkJY2hpcC0+YWN0aXZlIHw9IERBQzI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJb3V0YigwLCBTTElPX1JFRyhjaGlwLCBBVURJTzJNT0RFKSk7CisJCXNuZF9lczE5MzhfbWl4ZXJfd3JpdGUoY2hpcCwgRVNTU0JfSVJFR19BVURJTzJDT05UUk9MMSwgMCk7CisJCWNoaXAtPmFjdGl2ZSAmPSB+REFDMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcGxheWJhY2syX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJaW50IGNtZCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgdmFsOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJdmFsID0gNTsKKwkJY2hpcC0+YWN0aXZlIHw9IERBQzE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJdmFsID0gMDsKKwkJY2hpcC0+YWN0aXZlICY9IH5EQUMxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX0RNQUNPTlRST0wsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9wbGF5YmFja190cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICAgICAgaW50IGNtZCkKK3sKKwlzd2l0Y2ggKHN1YnN0cmVhbS0+bnVtYmVyKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gc25kX2VzMTkzOF9wbGF5YmFjazFfdHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CisJY2FzZSAxOgorCQlyZXR1cm4gc25kX2VzMTkzOF9wbGF5YmFjazJfdHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CisJfQorCXNuZF9CVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpcnN0IGNoYW5uZWwgZm9yIEV4dGVuZGVkIE1vZGUgQXVkaW8gMSBBREMgT3BlcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHNuZF9lczE5MzhfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IHUsIGlzOCwgbW9ubzsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCisJY2hpcC0+ZG1hMV9zaXplID0gc2l6ZTsKKwljaGlwLT5kbWExX3N0YXJ0ID0gcnVudGltZS0+ZG1hX2FkZHI7CisKKwltb25vID0gKHJ1bnRpbWUtPmNoYW5uZWxzID4gMSkgPyAwIDogMTsKKwlpczggPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2ID8gMCA6IDE7CisJdSA9IHNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkKHJ1bnRpbWUtPmZvcm1hdCk7CisKKwljaGlwLT5kbWExX3NoaWZ0ID0gMiAtIG1vbm8gLSBpczg7CisKKwlzbmRfZXMxOTM4X3Jlc2V0X2ZpZm8oY2hpcCk7CisJCisJLyogcHJvZ3JhbSB0eXBlICovCisJc25kX2VzMTkzOF9iaXRzKGNoaXAsIEVTU19DTURfQU5BTE9HQ09OVFJPTCwgMHgwMywgKG1vbm8gPyAyIDogMSkpOworCisJLyogc2V0IGNsb2NrIGFuZCBjb3VudGVycyAqLworICAgICAgICBzbmRfZXMxOTM4X3JhdGVfc2V0KGNoaXAsIHN1YnN0cmVhbSwgQURDMSk7CisKKwljb3VudCA9IDB4MTAwMDAgLSBjb3VudDsKKwlzbmRfZXMxOTM4X3dyaXRlKGNoaXAsIEVTU19DTURfRE1BQ05UUkVMT0FETCwgY291bnQgJiAweGZmKTsKKwlzbmRfZXMxOTM4X3dyaXRlKGNoaXAsIEVTU19DTURfRE1BQ05UUkVMT0FESCwgY291bnQgPj4gOCk7CisKKwkvKiBpbml0aWFsaXplIGFuZCBjb25maWd1cmUgQURDICovCisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX1NFVEZPUk1BVDIsIHUgPyAweDUxIDogMHg3MSk7CisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX1NFVEZPUk1BVDIsIDB4OTAgfCAKKwkJICAgICAgICh1ID8gMHgwMCA6IDB4MjApIHwgCisJCSAgICAgICAoaXM4ID8gMHgwMCA6IDB4MDQpIHwgCisJCSAgICAgICAobW9ubyA/IDB4NDAgOiAweDA4KSk7CisKKwkvLwlzbmRfZXMxOTM4X3Jlc2V0X2ZpZm8oY2hpcCk7CQorCisJLyogMTEuIGNvbmZpZ3VyZSBzeXN0ZW0gaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIERNQSBjb250cm9sbGVyICovCisJc25kX2VzMTkzOF9jYXB0dXJlX3NldGRtYShjaGlwKTsKKworCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2Vjb25kIEF1ZGlvIGNoYW5uZWwgREFDIE9wZXJhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9wbGF5YmFjazFfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCB1LCBpczgsIG1vbm87CisJdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKworCWNoaXAtPmRtYTJfc2l6ZSA9IHNpemU7CisJY2hpcC0+ZG1hMl9zdGFydCA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCisJbW9ubyA9IChydW50aW1lLT5jaGFubmVscyA+IDEpID8gMCA6IDE7CisJaXM4ID0gc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNiA/IDAgOiAxOworCXUgPSBzbmRfcGNtX2Zvcm1hdF91bnNpZ25lZChydW50aW1lLT5mb3JtYXQpOworCisJY2hpcC0+ZG1hMl9zaGlmdCA9IDIgLSBtb25vIC0gaXM4OworCisgICAgICAgIHNuZF9lczE5MzhfcmVzZXRfZmlmbyhjaGlwKTsKKworCS8qIHNldCBjbG9jayBhbmQgY291bnRlcnMgKi8KKyAgICAgICAgc25kX2VzMTkzOF9yYXRlX3NldChjaGlwLCBzdWJzdHJlYW0sIERBQzIpOworCisJY291bnQgPj49IDE7CisJY291bnQgPSAweDEwMDAwIC0gY291bnQ7CisJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCBFU1NTQl9JUkVHX0FVRElPMlRDT1VOVEwsIGNvdW50ICYgMHhmZik7CisJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCBFU1NTQl9JUkVHX0FVRElPMlRDT1VOVEgsIGNvdW50ID4+IDgpOworCisJLyogaW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIEF1ZGlvIDIgREFDICovCisJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCBFU1NTQl9JUkVHX0FVRElPMkNPTlRST0wyLCAweDQwIHwgKHUgPyAwIDogNCkgfCAobW9ubyA/IDAgOiAyKSB8IChpczggPyAwIDogMSkpOworCisJLyogcHJvZ3JhbSBETUEgKi8KKwlzbmRfZXMxOTM4X3BsYXliYWNrMV9zZXRkbWEoY2hpcCk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9wbGF5YmFjazJfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCB1LCBpczgsIG1vbm87CisJdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKworCWNoaXAtPmRtYTFfc2l6ZSA9IHNpemU7CisJY2hpcC0+ZG1hMV9zdGFydCA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCisJbW9ubyA9IChydW50aW1lLT5jaGFubmVscyA+IDEpID8gMCA6IDE7CisJaXM4ID0gc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNiA/IDAgOiAxOworCXUgPSBzbmRfcGNtX2Zvcm1hdF91bnNpZ25lZChydW50aW1lLT5mb3JtYXQpOworCisJY2hpcC0+ZG1hMV9zaGlmdCA9IDIgLSBtb25vIC0gaXM4OworCisJY291bnQgPSAweDEwMDAwIC0gY291bnQ7CisgCisJLyogcmVzZXQgKi8KKwlzbmRfZXMxOTM4X3Jlc2V0X2ZpZm8oY2hpcCk7CisJCisJc25kX2VzMTkzOF9iaXRzKGNoaXAsIEVTU19DTURfQU5BTE9HQ09OVFJPTCwgMHgwMywgKG1vbm8gPyAyIDogMSkpOworCisJLyogc2V0IGNsb2NrIGFuZCBjb3VudGVycyAqLworICAgICAgICBzbmRfZXMxOTM4X3JhdGVfc2V0KGNoaXAsIHN1YnN0cmVhbSwgREFDMSk7CisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX0RNQUNOVFJFTE9BREwsIGNvdW50ICYgMHhmZik7CisJc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX0RNQUNOVFJFTE9BREgsIGNvdW50ID4+IDgpOworCisJLyogaW5pdGlhbGl6ZWQgYW5kIGNvbmZpZ3VyZSBEQUMgKi8KKyAgICAgICAgc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX1NFVEZPUk1BVCwgdSA/IDB4ODAgOiAweDAwKTsKKyAgICAgICAgc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX1NFVEZPUk1BVCwgdSA/IDB4NTEgOiAweDcxKTsKKyAgICAgICAgc25kX2VzMTkzOF93cml0ZShjaGlwLCBFU1NfQ01EX1NFVEZPUk1BVDIsIAorCQkJIDB4OTAgfCAobW9ubyA/IDB4NDAgOiAweDA4KSB8CisJCQkgKGlzOCA/IDB4MDAgOiAweDA0KSB8ICh1ID8gMHgwMCA6IDB4MjApKTsKKworCS8qIHByb2dyYW0gRE1BICovCisJc25kX2VzMTkzOF9wbGF5YmFjazJfc2V0ZG1hKGNoaXApOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3dpdGNoIChzdWJzdHJlYW0tPm51bWJlcikgeworCWNhc2UgMDoKKwkJcmV0dXJuIHNuZF9lczE5MzhfcGxheWJhY2sxX3ByZXBhcmUoc3Vic3RyZWFtKTsKKwljYXNlIDE6CisJCXJldHVybiBzbmRfZXMxOTM4X3BsYXliYWNrMl9wcmVwYXJlKHN1YnN0cmVhbSk7CisJfQorCXNuZF9CVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lczE5MzhfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjsKKwlzaXplX3Qgb2xkLCBuZXc7CisjaWYgMQorCS8qIFRoaXMgc3R1ZmYgaXMgKm5lZWRlZCosIGRvbid0IGFzayB3aHkgLSBBQiAqLworCW9sZCA9IGludyhTTERNX1JFRyhjaGlwLCBETUFDT1VOVCkpOworCXdoaWxlICgobmV3ID0gaW53KFNMRE1fUkVHKGNoaXAsIERNQUNPVU5UKSkpICE9IG9sZCkKKwkJb2xkID0gbmV3OworCXB0ciA9IGNoaXAtPmRtYTFfc2l6ZSAtIDEgLSBuZXc7CisjZWxzZQorCXB0ciA9IGlubChTTERNX1JFRyhjaGlwLCBETUFBRERSKSkgLSBjaGlwLT5kbWExX3N0YXJ0OworI2VuZGlmCisJcmV0dXJuIHB0ciA+PiBjaGlwLT5kbWExX3NoaWZ0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2VzMTkzOF9wbGF5YmFjazFfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisjaWYgMQorCXB0ciA9IGNoaXAtPmRtYTJfc2l6ZSAtIGludyhTTElPX1JFRyhjaGlwLCBBVURJTzJETUFDT1VOVCkpOworI2Vsc2UKKwlwdHIgPSBpbmwoU0xJT19SRUcoY2hpcCwgQVVESU8yRE1BQUREUikpIC0gY2hpcC0+ZG1hMl9zdGFydDsKKyNlbmRpZgorCXJldHVybiBwdHIgPj4gY2hpcC0+ZG1hMl9zaGlmdDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lczE5MzhfcGxheWJhY2syX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCXNpemVfdCBvbGQsIG5ldzsKKyNpZiAxCisJLyogVGhpcyBzdHVmZiBpcyAqbmVlZGVkKiwgZG9uJ3QgYXNrIHdoeSAtIEFCICovCisJb2xkID0gaW53KFNMRE1fUkVHKGNoaXAsIERNQUNPVU5UKSk7CisJd2hpbGUgKChuZXcgPSBpbncoU0xETV9SRUcoY2hpcCwgRE1BQ09VTlQpKSkgIT0gb2xkKQorCQlvbGQgPSBuZXc7CisJcHRyID0gY2hpcC0+ZG1hMV9zaXplIC0gMSAtIG5ldzsKKyNlbHNlCisJcHRyID0gaW5sKFNMRE1fUkVHKGNoaXAsIERNQUFERFIpKSAtIGNoaXAtPmRtYTFfc3RhcnQ7CisjZW5kaWYKKwlyZXR1cm4gcHRyID4+IGNoaXAtPmRtYTFfc2hpZnQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZXMxOTM4X3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN3aXRjaCAoc3Vic3RyZWFtLT5udW1iZXIpIHsKKwljYXNlIDA6CisJCXJldHVybiBzbmRfZXMxOTM4X3BsYXliYWNrMV9wb2ludGVyKHN1YnN0cmVhbSk7CisJY2FzZSAxOgorCQlyZXR1cm4gc25kX2VzMTkzOF9wbGF5YmFjazJfcG9pbnRlcihzdWJzdHJlYW0pOworCX0KKwlzbmRfQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9jYXB0dXJlX2NvcHkoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgIGludCBjaGFubmVsLAorCQkJCSAgIHNuZF9wY21fdWZyYW1lc190IHBvcywKKwkJCQkgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCSAgIHNuZF9wY21fdWZyYW1lc190IGNvdW50KQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXBvcyA8PD0gY2hpcC0+ZG1hMV9zaGlmdDsKKwljb3VudCA8PD0gY2hpcC0+ZG1hMV9zaGlmdDsKKwlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IGNoaXAtPmRtYTFfc2l6ZSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChwb3MgKyBjb3VudCA8IGNoaXAtPmRtYTFfc2l6ZSkgeworCQlpZiAoY29weV90b191c2VyKGRzdCwgcnVudGltZS0+ZG1hX2FyZWEgKyBwb3MgKyAxLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpZiAoY29weV90b191c2VyKGRzdCwgcnVudGltZS0+ZG1hX2FyZWEgKyBwb3MgKyAxLCBjb3VudCAtIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihydW50aW1lLT5kbWFfYXJlYVswXSwgKCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWRzdCkgKyBjb3VudCAtIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogYnVmZmVyIG1hbmFnZW1lbnQKKyAqLworc3RhdGljIGludCBzbmRfZXMxOTM4X3BjbV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQorCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcGNtX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEF1ZGlvMSBDYXB0dXJlIChBREMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2VzMTkzOF9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNjAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKyAgICAgICAgLmJ1ZmZlcl9ieXRlc19tYXggPQkweDgwMDAsICAgICAgIC8qIERNQSBjb250cm9sbGVyIHNjcmV3cyBvbiBoaWdoZXIgdmFsdWVzICovCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CTB4ODAwMCwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTI1NiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBdWRpbzIgUGxheWJhY2sgKERBQykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2VzMTkzOF9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTYwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisgICAgICAgIC5idWZmZXJfYnl0ZXNfbWF4ID0JMHg4MDAwLCAgICAgICAvKiBETUEgY29udHJvbGxlciBzY3Jld3Mgb24gaGlnaGVyIHZhbHVlcyAqLworCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkweDgwMDAsCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkyNTYsCit9OworCitzdGF0aWMgaW50IHNuZF9lczE5MzhfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoY2hpcC0+cGxheWJhY2syX3N1YnN0cmVhbSkKKwkJcmV0dXJuIC1FQUdBSU47CisJY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfZXMxOTM4X2NhcHR1cmU7CisJc25kX3BjbV9od19jb25zdHJhaW50X3JhdG51bXMocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgICAgJmh3X2NvbnN0cmFpbnRzX2Nsb2Nrcyk7CisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAwLCAweGZmMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc3dpdGNoIChzdWJzdHJlYW0tPm51bWJlcikgeworCWNhc2UgMDoKKwkJY2hpcC0+cGxheWJhY2sxX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJY2hpcC0+cGxheWJhY2syX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcnVudGltZS0+aHcgPSBzbmRfZXMxOTM4X3BsYXliYWNrOworCXNuZF9wY21faHdfY29uc3RyYWludF9yYXRudW1zKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSAgICAgICZod19jb25zdHJhaW50c19jbG9ja3MpOworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgMCwgMHhmZjAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzd2l0Y2ggKHN1YnN0cmVhbS0+bnVtYmVyKSB7CisJY2FzZSAwOgorCQljaGlwLT5wbGF5YmFjazFfc3Vic3RyZWFtID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljaGlwLT5wbGF5YmFjazJfc3Vic3RyZWFtID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lczE5MzhfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9lczE5MzhfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZXMxOTM4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfZXMxOTM4X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfZXMxOTM4X3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2VzMTkzOF9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2VzMTkzOF9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2VzMTkzOF9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2VzMTkzOF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfZXMxOTM4X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZXMxOTM4X2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9lczE5MzhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9lczE5MzhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfZXMxOTM4X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9lczE5MzhfY2FwdHVyZV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2VzMTkzOF9jYXB0dXJlX3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX2VzMTkzOF9jYXB0dXJlX2NvcHksCit9OworCitzdGF0aWMgdm9pZCBzbmRfZXMxOTM4X2ZyZWVfcGNtKHNuZF9wY21fdCAqcGNtKQoreworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZXMxOTM4X25ld19wY20oZXMxOTM4X3QgKmNoaXAsIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgImVzLTE5MzgtMTk0NiIsIGRldmljZSwgMiwgMSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VzMTkzOF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9lczE5MzhfY2FwdHVyZV9vcHMpOworCQorCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9lczE5MzhfZnJlZV9wY207CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiRVNTIFNvbG8tMSIpOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KTsKKworCWNoaXAtPnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAgICAgICAgICAgICAgICAgICAgICAgKioqIE1peGVyIHBhcnQgKioqCisgKi8KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2luZm9fbXV4KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s4XSA9IHsKKwkJIk1pYyIsICJNaWMgTWFzdGVyIiwgIkNEIiwgIkFPVVQiLAorCQkiTWljMSIsICJNaXgiLCAiTGluZSIsICJNYXN0ZXIiCisJfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA4OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gNykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDc7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2dldF9tdXgoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc25kX2VzMTkzOF9taXhlcl9yZWFkKGNoaXAsIDB4MWMpICYgMHgwNzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X3B1dF9tdXgoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJCisJaWYgKHZhbCA+IDcpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzbmRfZXMxOTM4X21peGVyX2JpdHMoY2hpcCwgMHgxYywgMHgwNywgdmFsKSAhPSB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9pbmZvX3NwYXRpYWxpemVyX2VuYWJsZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2dldF9zcGF0aWFsaXplcl9lbmFibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHZhbCA9IHNuZF9lczE5MzhfbWl4ZXJfcmVhZChjaGlwLCAweDUwKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEhKHZhbCAmIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcHV0X3NwYXRpYWxpemVyX2VuYWJsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgb3ZhbCwgbnZhbDsKKwlpbnQgY2hhbmdlOworCW52YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDB4MGMgOiAweDA0OworCW92YWwgPSBzbmRfZXMxOTM4X21peGVyX3JlYWQoY2hpcCwgMHg1MCkgJiAweDBjOworCWNoYW5nZSA9IG52YWwgIT0gb3ZhbDsKKwlpZiAoY2hhbmdlKSB7CisJCXNuZF9lczE5MzhfbWl4ZXJfd3JpdGUoY2hpcCwgMHg1MCwgbnZhbCAmIH4weDA0KTsKKwkJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCAweDUwLCBudmFsKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2luZm9faHdfdm9sdW1lKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA2MzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X2dldF9od192b2x1bWUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNuZF9lczE5MzhfbWl4ZXJfcmVhZChjaGlwLCAweDYxKSAmIDB4M2Y7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBzbmRfZXMxOTM4X21peGVyX3JlYWQoY2hpcCwgMHg2MykgJiAweDNmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfaW5mb19od19zd2l0Y2goc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9nZXRfaHdfc3dpdGNoKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhKHNuZF9lczE5MzhfbWl4ZXJfcmVhZChjaGlwLCAweDYxKSAmIDB4NDApOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gIShzbmRfZXMxOTM4X21peGVyX3JlYWQoY2hpcCwgMHg2MykgJiAweDQwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTkzOF9od3ZfZnJlZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wpCit7CisJZXMxOTM4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJY2hpcC0+bWFzdGVyX3ZvbHVtZSA9IE5VTEw7CisJY2hpcC0+bWFzdGVyX3N3aXRjaCA9IE5VTEw7CisJY2hpcC0+aHdfdm9sdW1lID0gTlVMTDsKKwljaGlwLT5od19zd2l0Y2ggPSBOVUxMOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcmVnX2JpdHMoZXMxOTM4X3QgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJaWYgKHJlZyA8IDB4YTApCisJCXJldHVybiBzbmRfZXMxOTM4X21peGVyX2JpdHMoY2hpcCwgcmVnLCBtYXNrLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIHNuZF9lczE5MzhfYml0cyhjaGlwLCByZWcsIG1hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTkzOF9yZWdfcmVhZChlczE5MzhfdCAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcpCit7CisJaWYgKHJlZyA8IDB4YTApCisJCXJldHVybiBzbmRfZXMxOTM4X21peGVyX3JlYWQoY2hpcCwgcmVnKTsKKwllbHNlCisJCXJldHVybiBzbmRfZXMxOTM4X3JlYWQoY2hpcCwgcmVnKTsKK30KKworI2RlZmluZSBFUzE5MzhfU0lOR0xFKHhuYW1lLCB4aW5kZXgsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2VzMTkzOF9pbmZvX3NpbmdsZSwgXAorICAuZ2V0ID0gc25kX2VzMTkzOF9nZXRfc2luZ2xlLCAucHV0ID0gc25kX2VzMTkzOF9wdXRfc2luZ2xlLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gcmVnIHwgKHNoaWZ0IDw8IDgpIHwgKG1hc2sgPDwgMTYpIHwgKGludmVydCA8PCAyNCkgfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfaW5mb19zaW5nbGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKworCXVpbmZvLT50eXBlID0gbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfZ2V0X3NpbmdsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKKwlpbnQgdmFsOworCQorCXZhbCA9IHNuZF9lczE5MzhfcmVnX3JlYWQoY2hpcCwgcmVnKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKKwlpZiAoaW52ZXJ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTM4X3B1dF9zaW5nbGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwllczE5MzhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJdW5zaWduZWQgY2hhciB2YWw7CisJCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwltYXNrIDw8PSBzaGlmdDsKKwl2YWwgPDw9IHNoaWZ0OworCXJldHVybiBzbmRfZXMxOTM4X3JlZ19iaXRzKGNoaXAsIHJlZywgbWFzaywgdmFsKSAhPSB2YWw7Cit9CisKKyNkZWZpbmUgRVMxOTM4X0RPVUJMRSh4bmFtZSwgeGluZGV4LCBsZWZ0X3JlZywgcmlnaHRfcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfZXMxOTM4X2luZm9fZG91YmxlLCBcCisgIC5nZXQgPSBzbmRfZXMxOTM4X2dldF9kb3VibGUsIC5wdXQgPSBzbmRfZXMxOTM4X3B1dF9kb3VibGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBsZWZ0X3JlZyB8IChyaWdodF9yZWcgPDwgOCkgfCAoc2hpZnRfbGVmdCA8PCAxNikgfCAoc2hpZnRfcmlnaHQgPDwgMTkpIHwgKG1hc2sgPDwgMjQpIHwgKGludmVydCA8PCAyMikgfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfaW5mb19kb3VibGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKKworCXVpbmZvLT50eXBlID0gbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfZ2V0X2RvdWJsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCXVuc2lnbmVkIGNoYXIgbGVmdCwgcmlnaHQ7CisJCisJbGVmdCA9IHNuZF9lczE5MzhfcmVnX3JlYWQoY2hpcCwgbGVmdF9yZWcpOworCWlmIChsZWZ0X3JlZyAhPSByaWdodF9yZWcpCisJCXJpZ2h0ID0gc25kX2VzMTkzOF9yZWdfcmVhZChjaGlwLCByaWdodF9yZWcpOworCWVsc2UKKwkJcmlnaHQgPSBsZWZ0OworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGxlZnQgPj4gc2hpZnRfbGVmdCkgJiBtYXNrOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gKHJpZ2h0ID4+IHNoaWZ0X3JpZ2h0KSAmIG1hc2s7CisJaWYgKGludmVydCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBtYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfcHV0X2RvdWJsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWVzMTkzOF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgY2hhciB2YWwxLCB2YWwyLCBtYXNrMSwgbWFzazI7CisJCisJdmFsMSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKKwl2YWwyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdmFsMSA9IG1hc2sgLSB2YWwxOworCQl2YWwyID0gbWFzayAtIHZhbDI7CisJfQorCXZhbDEgPDw9IHNoaWZ0X2xlZnQ7CisJdmFsMiA8PD0gc2hpZnRfcmlnaHQ7CisJbWFzazEgPSBtYXNrIDw8IHNoaWZ0X2xlZnQ7CisJbWFzazIgPSBtYXNrIDw8IHNoaWZ0X3JpZ2h0OworCWlmIChsZWZ0X3JlZyAhPSByaWdodF9yZWcpIHsKKwkJY2hhbmdlID0gMDsKKwkJaWYgKHNuZF9lczE5MzhfcmVnX2JpdHMoY2hpcCwgbGVmdF9yZWcsIG1hc2sxLCB2YWwxKSAhPSB2YWwxKQorCQkJY2hhbmdlID0gMTsKKwkJaWYgKHNuZF9lczE5MzhfcmVnX2JpdHMoY2hpcCwgcmlnaHRfcmVnLCBtYXNrMiwgdmFsMikgIT0gdmFsMikKKwkJCWNoYW5nZSA9IDE7CisJfSBlbHNlIHsKKwkJY2hhbmdlID0gKHNuZF9lczE5MzhfcmVnX2JpdHMoY2hpcCwgbGVmdF9yZWcsIG1hc2sxIHwgbWFzazIsIAorCQkJCQkgICAgICB2YWwxIHwgdmFsMikgIT0gKHZhbDEgfCB2YWwyKSk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VzMTkzOF9jb250cm9sc1tdID0geworRVMxOTM4X0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDB4NjAsIDB4NjIsIDAsIDAsIDYzLCAwKSwKK0VTMTkzOF9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAwLCAweDYwLCAweDYyLCA2LCA2LCAxLCAxKSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJIYXJkd2FyZSBNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmluZm8gPSBzbmRfZXMxOTM4X2luZm9faHdfdm9sdW1lLAorCS5nZXQgPSBzbmRfZXMxOTM4X2dldF9od192b2x1bWUsCit9LAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkhhcmR3YXJlIE1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaW5mbyA9IHNuZF9lczE5MzhfaW5mb19od19zd2l0Y2gsCisJLmdldCA9IHNuZF9lczE5MzhfZ2V0X2h3X3N3aXRjaCwKK30sCitFUzE5MzhfU0lOR0xFKCJIYXJkd2FyZSBWb2x1bWUgU3BsaXQiLCAwLCAweDY0LCA3LCAxLCAwKSwKK0VTMTkzOF9ET1VCTEUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMCwgMHgzZSwgMHgzZSwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMCwgMHgzOCwgMHgzOCwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiRk0gUGxheWJhY2sgVm9sdW1lIiwgMCwgMHgzNiwgMHgzNiwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAwLCAweDZkLCAweDZkLCA0LCAwLCAxNSwgMCksCitFUzE5MzhfRE9VQkxFKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMCwgMHgxYSwgMHgxYSwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDAsIDB4M2EsIDB4M2EsIDQsIDAsIDE1LCAwKSwKK0VTMTkzOF9ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgMCwgMHhiNCwgMHhiNCwgNCwgMCwgMTUsIDApLAorRVMxOTM4X1NJTkdMRSgiUEMgU3BlYWtlciBWb2x1bWUiLCAwLCAweDNjLCAwLCA3LCAwKSwKK0VTMTkzOF9TSU5HTEUoIlJlY29yZCBNb25pdG9yIiwgMCwgMHhhOCwgMywgMSwgMCksCitFUzE5MzhfU0lOR0xFKCJDYXB0dXJlIFN3aXRjaCIsIDAsIDB4MWMsIDQsIDEsIDEpLAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkuaW5mbyA9IHNuZF9lczE5MzhfaW5mb19tdXgsCisJLmdldCA9IHNuZF9lczE5MzhfZ2V0X211eCwKKwkucHV0ID0gc25kX2VzMTkzOF9wdXRfbXV4LAorfSwKK0VTMTkzOF9ET1VCTEUoIk1vbm8gSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMCwgMHg2ZCwgMHg2ZCwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiUENNIENhcHR1cmUgVm9sdW1lIiwgMCwgMHg2OSwgMHg2OSwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMCwgMHg2OCwgMHg2OCwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiTGluZSBDYXB0dXJlIFZvbHVtZSIsIDAsIDB4NmUsIDB4NmUsIDQsIDAsIDE1LCAwKSwKK0VTMTkzOF9ET1VCTEUoIkZNIENhcHR1cmUgVm9sdW1lIiwgMCwgMHg2YiwgMHg2YiwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiTW9ubyBDYXB0dXJlIFZvbHVtZSIsIDAsIDB4NmYsIDB4NmYsIDQsIDAsIDE1LCAwKSwKK0VTMTkzOF9ET1VCTEUoIkNEIENhcHR1cmUgVm9sdW1lIiwgMCwgMHg2YSwgMHg2YSwgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiQXV4IENhcHR1cmUgVm9sdW1lIiwgMCwgMHg2YywgMHg2YywgNCwgMCwgMTUsIDApLAorRVMxOTM4X0RPVUJMRSgiUENNIFBsYXliYWNrIFZvbHVtZSIsIDAsIDB4N2MsIDB4N2MsIDQsIDAsIDE1LCAwKSwKK0VTMTkzOF9ET1VCTEUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAxLCAweDE0LCAweDE0LCA0LCAwLCAxNSwgMCksCitFUzE5MzhfU0lOR0xFKCIzRCBDb250cm9sIC0gTGV2ZWwiLCAwLCAweDUyLCAwLCA2MywgMCksCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiM0QgQ29udHJvbCAtIFN3aXRjaCIsCisJLmluZm8gPSBzbmRfZXMxOTM4X2luZm9fc3BhdGlhbGl6ZXJfZW5hYmxlLAorCS5nZXQgPSBzbmRfZXMxOTM4X2dldF9zcGF0aWFsaXplcl9lbmFibGUsCisJLnB1dCA9IHNuZF9lczE5MzhfcHV0X3NwYXRpYWxpemVyX2VuYWJsZSwKK30sCitFUzE5MzhfU0lOR0xFKCJNaWMgQm9vc3QgKCsyNmRCKSIsIDAsIDB4N2QsIDMsIDEsIDApCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNoaXAgLSB1c2VkIGJ5IHJlc3VtZSBjYWxsYmFjaywgdG9vCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfY2hpcF9pbml0KGVzMTkzOF90ICpjaGlwKQoreworCS8qIHJlc2V0IGNoaXAgKi8KKwlzbmRfZXMxOTM4X3Jlc2V0KGNoaXApOworCisJLyogY29uZmlndXJlIG5hdGl2ZSBtb2RlICovCisKKwkvKiBlbmFibGUgYnVzIG1hc3RlciAqLworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisKKwkvKiBkaXNhYmxlIGxlZ2FjeSBhdWRpbyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIFNMX1BDSV9MRUdBQ1lDT05UUk9MLCAweDgwNWYpOworCisJLyogc2V0IERETUEgYmFzZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIFNMX1BDSV9ERE1BQ09OVFJPTCwgY2hpcC0+ZGRtYV9wb3J0IHwgMSk7CisKKwkvKiBzZXQgRE1BL0lSUSBwb2xpY3kgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNoaXAtPnBjaSwgU0xfUENJX0NPTkZJRywgMCk7CisKKwkvKiBlbmFibGUgQXVkaW8gMSwgQXVkaW8gMiwgTVBVNDAxIElSUSBhbmQgSFcgdm9sdW1lIElSUSovCisJb3V0YigweGYwLCBTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7CisKKwkvKiByZXNldCBETUEgKi8KKwlvdXRiKDAsIFNMRE1fUkVHKGNoaXAsIERNQUNMRUFSKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBQTSBzdXBwb3J0CisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2F2ZWRfcmVnc1tTQVZFRF9SRUdfU0laRSsxXSA9IHsKKwkweDE0LCAweDFhLCAweDFjLCAweDNhLCAweDNjLCAweDNlLCAweDM2LCAweDM4LAorCTB4NTAsIDB4NTIsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjgsCisJMHg2OSwgMHg2YSwgMHg2YiwgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3YywgMHg3ZCwKKwkweGE4LCAweGI0LAorfTsKKworCitzdGF0aWMgaW50IGVzMTkzOF9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwllczE5MzhfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpzLCAqZDsKKworCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKKworCS8qIHNhdmUgbWl4ZXItcmVsYXRlZCByZWdpc3RlcnMgKi8KKwlmb3IgKHMgPSBzYXZlZF9yZWdzLCBkID0gY2hpcC0+c2F2ZWRfcmVnczsgKnM7IHMrKywgZCsrKQorCQkqZCA9IHNuZF9lczE5MzhfcmVnX3JlYWQoY2hpcCwgKnMpOworCisJb3V0YigweDAwLCBTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7IC8qIGRpc2FibGUgaXJxcyAqLworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMxOTM4X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWVzMTkzOF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgKnMsICpkOworCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlzbmRfZXMxOTM4X2NoaXBfaW5pdChjaGlwKTsKKworCS8qIHJlc3RvcmUgbWl4ZXItcmVsYXRlZCByZWdpc3RlcnMgKi8KKwlmb3IgKHMgPSBzYXZlZF9yZWdzLCBkID0gY2hpcC0+c2F2ZWRfcmVnczsgKnM7IHMrKywgZCsrKSB7CisJCWlmICgqcyA8IDB4YTApCisJCQlzbmRfZXMxOTM4X21peGVyX3dyaXRlKGNoaXAsICpzLCAqZCk7CisJCWVsc2UKKwkJCXNuZF9lczE5Mzhfd3JpdGUoY2hpcCwgKnMsICpkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE5MzhfY3JlYXRlX2dhbWVwb3J0KGVzMTkzOF90ICpjaGlwKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFUzE5MzgiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmY2hpcC0+cGNpLT5kZXYpOworCWdwLT5pbyA9IGNoaXAtPmdhbWVfcG9ydDsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lczE5MzhfZnJlZV9nYW1lcG9ydChlczE5MzhfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Z2FtZXBvcnQpIHsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNoaXAtPmdhbWVwb3J0KTsKKwkJY2hpcC0+Z2FtZXBvcnQgPSBOVUxMOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzbmRfZXMxOTM4X2NyZWF0ZV9nYW1lcG9ydChlczE5MzhfdCAqY2hpcCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9lczE5MzhfZnJlZV9nYW1lcG9ydChlczE5MzhfdCAqY2hpcCkgeyB9CisjZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLworCitzdGF0aWMgaW50IHNuZF9lczE5MzhfZnJlZShlczE5MzhfdCAqY2hpcCkKK3sKKwkvKiBkaXNhYmxlIGlycXMgKi8KKwlvdXRiKDB4MDAsIFNMSU9fUkVHKGNoaXAsIElSUUNPTlRST0wpKTsKKwlpZiAoY2hpcC0+cm1pZGkpCisJCXNuZF9lczE5MzhfbWl4ZXJfYml0cyhjaGlwLCBFU1NTQl9JUkVHX01QVTQwMUNPTlRST0wsIDB4NDAsIDApOworCisJc25kX2VzMTkzOF9mcmVlX2dhbWVwb3J0KGNoaXApOworCisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5MzhfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJZXMxOTM4X3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfZXMxOTM4X2ZyZWUoY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE5MzhfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqIHBjaSwKKwkJCQkgICAgZXMxOTM4X3QgKiogcmNoaXApCit7CisJZXMxOTM4X3QgKmNoaXA7CisJaW50IGVycjsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF9lczE5MzhfZGV2X2ZyZWUsCisJfTsKKworCSpyY2hpcCA9IE5VTEw7CisKKwkvKiBlbmFibGUgUENJIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworICAgICAgICAvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI0IGJpdHMgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIDB4MDBmZmZmZmYpIDwgMCB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCAweDAwZmZmZmZmKSA8IDApIHsKKyAgICAgICAgICAgICAgICBzbmRfcHJpbnRrKCJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5taXhlcl9sb2NrKTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIkVTUyBTb2xvLTEiKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+aW9fcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWNoaXAtPnNiX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwljaGlwLT52Y19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJY2hpcC0+bXB1X3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAzKTsKKwljaGlwLT5nYW1lX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCA0KTsKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5MzhfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJFUzE5MzgiLCAodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfZXMxOTM4X2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworI2lmZGVmIEVTMTkzOF9EREVCVUcKKwlzbmRfcHJpbnRrKCJjcmVhdGU6IGlvOiAweCVseCwgc2I6IDB4JWx4LCB2YzogMHglbHgsIG1wdTogMHglbHgsIGdhbWU6IDB4JWx4XG4iLAorCQkgICBjaGlwLT5pb19wb3J0LCBjaGlwLT5zYl9wb3J0LCBjaGlwLT52Y19wb3J0LCBjaGlwLT5tcHVfcG9ydCwgY2hpcC0+Z2FtZV9wb3J0KTsKKyNlbmRpZgorCisJY2hpcC0+ZGRtYV9wb3J0ID0gY2hpcC0+dmNfcG9ydCArIDB4MDA7CQkvKiBmaXggZnJvbSBUaG9tYXMgU2FpbGVyICovCisKKwlzbmRfZXMxOTM4X2NoaXBfaW5pdChjaGlwKTsKKworCXNuZF9jYXJkX3NldF9wbV9jYWxsYmFjayhjYXJkLCBlczE5Mzhfc3VzcGVuZCwgZXMxOTM4X3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgeworCQlzbmRfZXMxOTM4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJKnJjaGlwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVycnVwdCBoYW5kbGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90IHNuZF9lczE5MzhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZXMxOTM4X3QgKmNoaXAgPSBkZXZfaWQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXMsIGF1ZGlvc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCXN0YXR1cyA9IGluYihTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7CisjaWYgMAorCXByaW50aygiRXMxOTM4ZGVidWcgLSBpbnRlcnJ1cHQgc3RhdHVzOiA9MHgleFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQorCS8qIEFVRElPIDEgKi8KKwlpZiAoc3RhdHVzICYgMHgxMCkgeworI2lmIDAKKyAgICAgICAgICAgICAgICBwcmludGsoIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIGludGVycnVwdFxuIik7CisJCXByaW50aygiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgY291bnQ6ICV1XG4iLCBpbncoU0xETV9SRUcoY2hpcCwgRE1BQ09VTlQpKSk7CisJCXByaW50aygiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDEgRE1BQyBETUEgYmFzZTogJXVcbiIsIGlubChTTERNX1JFRyhjaGlwLCBETUFBRERSKSkpOworCQlwcmludGsoIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIERNQUMgRE1BIHN0YXR1czogMHgleFxuIiwgaW5sKFNMRE1fUkVHKGNoaXAsIERNQVNUQVRVUykpKTsKKyNlbmRpZgorCQkvKiBjbGVhciBpcnEgKi8KKwkJaGFuZGxlZCA9IDE7CisJCWF1ZGlvc3RhdHVzID0gaW5iKFNMU0JfUkVHKGNoaXAsIFNUQVRVUykpOworCQlpZiAoY2hpcC0+YWN0aXZlICYgQURDMSkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pOworCQllbHNlIGlmIChjaGlwLT5hY3RpdmUgJiBEQUMxKQorCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5wbGF5YmFjazJfc3Vic3RyZWFtKTsKKwl9CisJCisJLyogQVVESU8gMiAqLworCWlmIChzdGF0dXMgJiAweDIwKSB7CisjaWYgMAorICAgICAgICAgICAgICAgIHByaW50aygiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDIgaW50ZXJydXB0XG4iKTsKKwkJcHJpbnRrKCJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBETUFDIERNQSBjb3VudDogJXVcbiIsIGludyhTTElPX1JFRyhjaGlwLCBBVURJTzJETUFDT1VOVCkpKTsKKwkJcHJpbnRrKCJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBETUFDIERNQSBiYXNlOiAldVxuIiwgaW5sKFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUFERFIpKSk7CisKKyNlbmRpZgorCQkvKiBjbGVhciBpcnEgKi8KKwkJaGFuZGxlZCA9IDE7CisJCXNuZF9lczE5MzhfbWl4ZXJfYml0cyhjaGlwLCBFU1NTQl9JUkVHX0FVRElPMkNPTlRST0wyLCAweDgwLCAwKTsKKwkJaWYgKGNoaXAtPmFjdGl2ZSAmIERBQzIpCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnBsYXliYWNrMV9zdWJzdHJlYW0pOworCX0KKworCS8qIEhhcmR3YXJlIHZvbHVtZSAqLworCWlmIChzdGF0dXMgJiAweDQwKSB7CisJCWludCBzcGxpdCA9IHNuZF9lczE5MzhfbWl4ZXJfcmVhZChjaGlwLCAweDY0KSAmIDB4ODA7CisJCWhhbmRsZWQgPSAxOworCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmNoaXAtPmh3X3N3aXRjaC0+aWQpOworCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmNoaXAtPmh3X3ZvbHVtZS0+aWQpOworCQlpZiAoIXNwbGl0KSB7CisJCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmNoaXAtPm1hc3Rlcl9zd2l0Y2gtPmlkKTsKKwkJCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmY2hpcC0+bWFzdGVyX3ZvbHVtZS0+aWQpOworCQl9CisJCS8qIGFjayBpbnRlcnJ1cHQgKi8KKwkJc25kX2VzMTkzOF9taXhlcl93cml0ZShjaGlwLCAweDY2LCAweDAwKTsKKwl9CisKKwkvKiBNUFU0MDEgKi8KKwlpZiAoc3RhdHVzICYgMHg4MCkgeworCQkvLyB0aGUgZm9sbG93aW5nIGxpbmUgaXMgZXZpbCEgSXQgc3dpdGNoZXMgb2ZmIE1JREkgaW50ZXJydXB0IGhhbmRsaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnRlcnJ1cHQgcmVjZWl2ZWQuCisJCS8vIHJlcGxhY2luZyB0aGUgbGFzdCAwIGJ5IDB4NDAgd29ya3MgZm9yIEVTUy1Tb2xvMSwgYnV0IGp1c3QgZG9pbmcgbm90aGluZyB3b3JrcyBhcyB3ZWxsIQorCQkvLyBhbmRyZWFzQGZseWluZy1zbmFpbC5kZQorCQkvLyBzbmRfZXMxOTM4X21peGVyX2JpdHMoY2hpcCwgRVNTU0JfSVJFR19NUFU0MDFDT05UUk9MLCAweDQwLCAwKTsgLyogYWNrPyAqLworCQlpZiAoY2hpcC0+cm1pZGkpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIGNoaXAtPnJtaWRpLT5wcml2YXRlX2RhdGEsIHJlZ3MpOworCQl9CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjZGVmaW5lIEVTMTkzOF9ETUFfU0laRSA2NAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZXMxOTM4X21peGVyKGVzMTkzOF90ICpjaGlwKQoreworCXNuZF9jYXJkX3QgKmNhcmQ7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJY2FyZCA9IGNoaXAtPmNhcmQ7CisKKwlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiRVNTIFNvbG8tMSIpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9lczE5MzhfY29udHJvbHMpOyBpZHgrKykgeworCQlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VzMTkzOF9jb250cm9sc1tpZHhdLCBjaGlwKTsKKwkJc3dpdGNoIChpZHgpIHsKKwkJCWNhc2UgMDoKKwkJCQljaGlwLT5tYXN0ZXJfdm9sdW1lID0ga2N0bDsKKwkJCQlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfZXMxOTM4X2h3dl9mcmVlOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWNoaXAtPm1hc3Rlcl9zd2l0Y2ggPSBrY3RsOworCQkJCWtjdGwtPnByaXZhdGVfZnJlZSA9IHNuZF9lczE5MzhfaHd2X2ZyZWU7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJY2hpcC0+aHdfdm9sdW1lID0ga2N0bDsKKwkJCQlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfZXMxOTM4X2h3dl9mcmVlOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWNoaXAtPmh3X3N3aXRjaCA9IGtjdGw7CisJCQkJa2N0bC0+cHJpdmF0ZV9mcmVlID0gc25kX2VzMTkzOF9od3ZfZnJlZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisgICAgICAgCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE5MzhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJZXMxOTM4X3QgKmNoaXA7CisJb3BsM190ICpvcGwzOworCWludCBpZHgsIGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaWR4ID0gMDsgaWR4IDwgNTsgaWR4KyspIHsKKwkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIGlkeCkgPT0gMCB8fAorCQkgICAgIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCBpZHgpICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJICAgIAlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkgICAgCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCWlmICgoZXJyID0gc25kX2VzMTkzOF9jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJFUzE5MzgiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRVNTIEVTMTkzOCAoU29sby0xKSIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyByZXYgJWksIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwKKwkJY2hpcC0+cmV2aXNpb24sCisJCWNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9lczE5MzhfbmV3X3BjbShjaGlwLCAwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX2VzMTkzOF9taXhlcihjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChzbmRfb3BsM19jcmVhdGUoY2FyZCwKKwkJCSAgICBTTFNCX1JFRyhjaGlwLCBGTUxPV0FERFIpLAorCQkJICAgIFNMU0JfUkVHKGNoaXAsIEZNSElHSEFERFIpLAorCQkJICAgIE9QTDNfSFdfT1BMMywgMSwgJm9wbDMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogT1BMMyBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsCisJCQkgICBTTFNCX1JFRyhjaGlwLCBGTUxPV0FERFIpKTsKKwl9IGVsc2UgeworCSAgICAgICAgaWYgKChlcnIgPSBzbmRfb3BsM190aW1lcl9uZXcob3BsMywgMCwgMSkpIDwgMCkgeworCSAgICAgICAgICAgICAgICBzbmRfY2FyZF9mcmVlKGNhcmQpOworCSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCQl9CisJICAgICAgICBpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CisJICAgICAgICAgICAgICAgIHNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJCX0KKwl9CisJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKKwkJCQljaGlwLT5tcHVfcG9ydCwgMSwgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogdW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMVxuIik7CisJfSBlbHNlIHsKKwkJLy8gdGhpcyBsaW5lIGlzIHZpdGFsIGZvciBNSURJIGludGVycnVwdCBoYW5kbGluZyBvbiBlc3Mtc29sbzEKKwkJLy8gYW5kcmVhc0BmbHlpbmctc25haWwuZGUKKwkJc25kX2VzMTkzOF9taXhlcl9iaXRzKGNoaXAsIEVTU1NCX0lSRUdfTVBVNDAxQ09OVFJPTCwgMHg0MCwgMHg0MCk7CisJfQorCisJc25kX2VzMTkzOF9jcmVhdGVfZ2FtZXBvcnQoY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9lczE5MzhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiRVNTIEVTMTkzOCAoU29sby0xKSIsCisJLmlkX3RhYmxlID0gc25kX2VzMTkzOF9pZHMsCisJLnByb2JlID0gc25kX2VzMTkzOF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2VzMTkzOF9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfZXMxOTM4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2VzMTkzOF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfZXMxOTM4X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfZXMxOTM4X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNjNmZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtMCwwICsxLDI4MDcgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBFU1MgTWFlc3RybyAxLzIvMkUgU291bmQgQ2FyZCAoc3RhcnRlZCAyMS44Ljk5KQorICogIENvcHlyaWdodCAoYykgYnkgTWF0emUgQnJhdW4gPE1hdHplQnJhdW5AZ214LmRlPi4KKyAqICAgICAgICAgICAgICAgICAgIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgCisgKiAgTW9zdCBvZiB0aGUgZHJpdmVyIGNvZGUgY29tZXMgZnJvbSBaYWNoIEJyb3duKHphYkByZWRoYXQuY29tKQorICoJQWxhbiBDb3ggT1NTIERyaXZlcgorICogIFJld3JpdHRlZCBmcm9tIGNhcmQtZXMxOTM4LmMgc291cmNlLgorICoKKyAqICBUT0RPOgorICogICBQZXJoYXBzIFN5bnRoCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqCisgKiAgTm90ZXMgZnJvbSBaYWNoIEJyb3duIGFib3V0IHRoZSBkcml2ZXIgY29kZQorICoKKyAqICBIYXJkd2FyZSBEZXNjcmlwdGlvbgorICoKKyAqCUEgd29ya2luZyBNYWVzdHJvIHNldHVwIGNvbnRhaW5zIHRoZSBNYWVzdHJvIGNoaXAgd2lyZWQgdG8gYSAKKyAqCWNvZGVjIG9yIDIuICBJbiB0aGUgTWFlc3RybyB3ZSBoYXZlIHRoZSBBUFVzLCB0aGUgQVNTUCwgYW5kIHRoZQorICoJV2F2ZWNhY2hlLiAgVGhlIEFQVXMgY2FuIGJlIHRob3VnaCBvZiBhcyB2aXJ0dWFsIGF1ZGlvIHJvdXRpbmcKKyAqCWNoYW5uZWxzLiAgVGhleSBjYW4gdGFrZSBkYXRhIGZyb20gYSBudW1iZXIgb2Ygc291cmNlcyBhbmQgcGVyZm9ybQorICoJYmFzaWMgZW5jb2RpbmdzIG9mIHRoZSBkYXRhLiAgVGhlIHdhdmVjYWNoZSBpcyBhIHN0b3JlaG91c2UgZm9yCisgKglQQ00gZGF0YS4gIFR5cGljYWxseSBpdCBkZWFscyB3aXRoIFBDSSBhbmQgaW50ZXJyYWN0cyB3aXRoIHRoZQorICoJQVBVcy4gIFRoZSBBU1NQIGlzIGEgd2Fja3kgRFNQIGxpa2UgZGV2aWNlIHRoYXQgRVNTIGlzIGxvdGgKKyAqCXRvIHJlbGVhc2UgZG9jcyBvbi4gIFRoYW5rZnVsbHkgaXQgaXNuJ3QgcmVxdWlyZWQgb24gdGhlIE1hZXN0cm8KKyAqCXVudGlsIHlvdSBzdGFydCBkb2luZyBpbnNhbmUgdGhpbmdzIGxpa2UgRk0gZW11bGF0aW9uIGFuZCBzdXJyb3VuZAorICoJZW5jb2RpbmcuICBUaGUgY29kZWNzIGFyZSBhbG1vc3QgYWx3YXlzIEFDLTk3IGNvbXBsaWFudCBjb2RlY3MsIAorICoJYnV0IGl0IGFwcGVhcnMgdGhhdCBlYXJseSBNYWVzdHJvcyBtYXkgaGF2ZSBoYWQgUFQxMDEgKGFuIEVTUworICoJcGFydD8pIHdpcmVkIHRvIHRoZW0uICBUaGUgb25seSByZWFsIGRpZmZlcmVuY2UgaW4gdGhlIE1hZXN0cm8KKyAqCWZhbWlsaWVzIGlzIGV4dGVybmFsIGdvb3AgbGlrZSBkb2NraW5nIGNhcGFiaWxpdHksIG1lbW9yeSBmb3IKKyAqCXRoZSBBU1NQLCBhbmQgaW5pdGlhbGl6YXRpb24gZGlmZmVyZW5jZXMuCisgKgorICogIERyaXZlciBPcGVyYXRpb24KKyAqCisgKglXZSBvbmx5IGRyaXZlIHRoZSBBUFUvV2F2ZWNhY2hlIGFzIHR5cGljYWwgREFDcyBhbmQgZHJpdmUgdGhlCisgKgltaXhlcnMgaW4gdGhlIGNvZGVjcy4gIFRoZXJlIGFyZSA2NCBBUFVzLiAgV2UgYXNzaWduIDYgdG8gZWFjaAorICoJL2Rldi9kc3A/IGRldmljZS4gIDIgY2hhbm5lbHMgZm9yIG91dHB1dCwgYW5kIDQgY2hhbm5lbHMgZm9yCisgKglpbnB1dC4KKyAqCisgKglFYWNoIEFQVSBjYW4gZG8gYSBudW1iZXIgb2YgdGhpbmdzLCBidXQgd2Ugb25seSByZWFsbHkgdXNlCisgKgkzIGJhc2ljIGZ1bmN0aW9ucy4gIEZvciBwbGF5YmFjayB3ZSB1c2UgdGhlbSB0byBjb252ZXJ0IFBDTQorICoJZGF0YSBmZXRjaGVkIG92ZXIgUENJIGJ5IHRoZSB3YXZlY2FoY2hlIGludG8gYW5hbG9nIGRhdGEgdGhhdAorICoJaXMgaGFuZGVkIHRvIHRoZSBjb2RlYy4gIE9uZSBBUFUgZm9yIG1vbm8sIGFuZCBhIHBhaXIgZm9yIHN0ZXJlby4KKyAqCVdoZW4gaW4gc3RlcmVvLCB0aGUgY29tYmluYXRpb24gb2Ygc21hcnRzIGluIHRoZSBBUFUgYW5kIFdhdmVjYWNoZQorICoJZGVjaWRlIHdoaWNoIHdhdmVjYWNoZSBnZXRzIHRoZSBsZWZ0IG9yIHJpZ2h0IGNoYW5uZWwuCisgKgorICoJRm9yIHJlY29yZCB3ZSBzdGlsbCB1c2UgdGhlIG9sZCBvdmVybHkgbW9ubyBzeXN0ZW0uICBGb3IgZWFjaCBpbgorICoJY29taW5nIGNoYW5uZWwgdGhlIGRhdGEgY29tZXMgaW4gZnJvbSB0aGUgY29kZWMsIHRocm91Z2ggYSAnaW5wdXQnCisgKglBUFUsIHRocm91Z2ggYW5vdGhlciByYXRlIGNvbnZlcnRlciBBUFUsIGFuZCB0aGVuIGludG8gbWVtb3J5IHZpYQorICoJdGhlIHdhdmVjYWNoZSBhbmQgUENJLiAgSWYgaXRzIHN0ZXJlbywgd2UgbWFzaCBpdCBiYWNrIGludG8gTFJMUiBpbgorICoJc29mdHdhcmUuICBUaGUgcGFzcyBiZXR3ZWVuIHRoZSAyIEFQVXMgaXMgc3VwcG9zZWRseSB3aGF0IHJlcXVpcmVzIHVzCisgKgl0byBoYXZlIGEgNTEyIGJ5dGUgYnVmZmVyIHNpdHRpbmcgYXJvdW5kIGluIHdhdmVjYWNoZS9tZW1vcnkuCisgKgorICoJVGhlIHdhdmVjYWNoZSBtYWtlcyBvdXIgbGlmZSBldmVuIG1vcmUgZnVuLiAgRmlyc3Qgb2ZmLCBpdCBjYW4KKyAqCW9ubHkgYWRkcmVzcyB0aGUgZmlyc3QgMjggYml0cyBvZiBQQ0kgYWRkcmVzcyBzcGFjZSwgbWFraW5nIGl0CisgKgl1c2VsZXNzIG9uIHF1aXRlIGEgZmV3IGFyY2hpdGVjdHVyZXMuICBTZWNvbmRseSwgaXRzIGluc2FuZS4KKyAqCUl0IGNsYWltcyB0byBmZXRjaCBmcm9tIDQgcmVnaW9ucyBvZiBQQ0kgc3BhY2UsIGVhY2ggNCBtZWcgaW4gbGVuZ3RoLgorICoJQnV0IHRoYXQgZG9lc24ndCByZWFsbHkgd29yay4gIFlvdSBjYW4gb25seSB1c2UgMSByZWdpb24uICBTbyBhbGwgb3VyCisgKglhbGxvY2F0aW9ucyBoYXZlIHRvIGJlIGluIDRtZWcgb2YgZWFjaCBvdGhlci4gIEJvb28uICBIaXNzLgorICoJU28gd2UgaGF2ZSBhIG1vZHVsZSBwYXJhbWV0ZXIsIGRzcHNfb3JkZXIsIHRoYXQgaXMgdGhlIG9yZGVyIG9mCisgKgl0aGUgbnVtYmVyIG9mIGRzcHMgdG8gcHJvdmlkZS4gIEFsbCB0aGVpciBidWZmZXIgc3BhY2UgaXMgYWxsb2NhdGVkCisgKglvbiBvcGVuIHRpbWUuICBUaGUgc29uaWN2aWJlcyBPU1Mgcm91dGluZXMgd2UgaW5oZXJpdGVkIHJlYWxseSB3YW50CisgKglwb3dlciBvZiAyIGJ1ZmZlcnMsIHNvIHdlIGhhdmUgYWxsIHRob3NlIG5leHQgdG8gZWFjaCBvdGhlciwgdGhlbgorICoJNTEyIGJ5dGUgcmVnaW9ucyBmb3IgdGhlIHJlY29yZGluZyB3YXZlY2FjaGVzLiAgVGhpcyBlbmRzIHVwCisgKgl3YXN0aW5nIHF1aXRlIGEgYml0IG9mIG1lbW9yeS4gIFRoZSBvbmx5IGZpeGVzIEkgY2FuIHNlZSB3b3VsZCBiZSAKKyAqCWdldHRpbmcgYSBrZXJuZWwgYWxsb2NhdG9yIHRoYXQgY291bGQgd29yayBpbiB6b25lcywgb3IgZmlndXJpbmcgb3V0CisgKglqdXN0IGhvdyB0byBjb2VyY2UgdGhlIFdQIGludG8gZG9pbmcgd2hhdCB3ZSB3YW50LgorICoKKyAqCVRoZSBpbmRpcmVjdGlvbiBvZiB0aGUgdmFyaW91cyByZWdpc3RlcnMgbWVhbnMgd2UgaGF2ZSB0byBzcGlubG9jaworICoJbmVhcmx5IGFsbCByZWdpc3RlciBhY2Nlc3Nlcy4gIFdlIGhhdmUgdGhlIG1haW4gcmVnaXN0ZXIgaW5kaXJlY3Rpb24KKyAqCWxpa2UgdGhlIHdhdmUgY2FjaGUsIG1hZXN0cm8gcmVnaXN0ZXJzLCBldGMuICBUaGVuIHdlIGhhdmUgYmVhc3RzCisgKglsaWtlIHRoZSBBUFUgaW50ZXJmYWNlIHRoYXQgaXMgaW5kaXJlY3QgcmVnaXN0ZXJzIGdvdHRlbiBhdCB0aHJvdWdoCisgKgl0aGUgbWFpbiBtYWVzdHJvIGluZGlyZWN0aW9uLiAgT3VjaC4gIFdlIHNwaW5sb2NrIGFyb3VuZCB0aGUgYWN0dWFsCisgKglwb3J0cyBvbiBhIHBlciBjYXJkIGJhc2lzLiAgVGhpcyBtZWFucyBzcGlubG9jayBhY3Rpdml0eSBhdCBlYWNoIElPCisgKglvcGVyYXRpb24sIGJ1dCB0aGUgb25seSBJTyBvcGVyYXRpb24gY2x1c3RlcnMgYXJlIGluIG5vbiBjcml0aWNhbCAKKyAqCXBhdGhzIGFuZCBpdCBtYWtlcyB0aGUgY29kZSBmYXIgZWFzaWVyIHRvIGZvbGxvdy4gIEludGVycnVwdHMgYXJlCisgKglibG9ja2VkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2tzIGJlY2F1c2UgdGhlIGludCBoYW5kbGVyIGhhcyB0bworICoJZ2V0IGF0IHNvbWUgb2YgdGhlbSA6KC4gIFRoZSBtaXhlciBpbnRlcmZhY2UgZG9lc24ndCwgaG93ZXZlci4KKyAqCVdlIGFsc28gaGF2ZSBhbiBPU1Mgc3RhdGUgbG9jayB0aGF0IGlzIHRocm93biBhcm91bmQgaW4gYSBmZXcKKyAqCXBsYWNlcy4KKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2RlZmluZSBDQVJEX05BTUUgIkVTUyBNYWVzdHJvMS8yIgorI2RlZmluZSBEUklWRVJfTkFNRSAiRVMxOTY4IgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkVTUyBNYWVzdHJvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tFU1MsTWFlc3RybyAyZX0sIgorCQkie0VTUyxNYWVzdHJvIDJ9LCIKKwkJIntFU1MsTWFlc3RybyAxfSwiCisJCSJ7VGVycmFUZWMsRE1YfX0iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDEtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCB0b3RhbF9idWZzaXplW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMTAyNCB9Oworc3RhdGljIGludCBwY21fc3Vic3RyZWFtc19wW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNCB9Oworc3RhdGljIGludCBwY21fc3Vic3RyZWFtc19jW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMSB9Oworc3RhdGljIGludCBjbG9ja1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Oworc3RhdGljIGludCB1c2VfcG1bU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAyfTsKK3N0YXRpYyBpbnQgZW5hYmxlX21wdVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDJ9OworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK3N0YXRpYyBpbnQgam95c3RpY2tbU05EUlZfQ0FSRFNdOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0b3RhbF9idWZzaXplLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh0b3RhbF9idWZzaXplLCAiVG90YWwgYnVmZmVyIHNpemUgaW4ga0IuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGNtX3N1YnN0cmVhbXNfcCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGNtX3N1YnN0cmVhbXNfcCwgIlBDTSBQbGF5YmFjayBzdWJzdHJlYW1zIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwY21fc3Vic3RyZWFtc19jLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwY21fc3Vic3RyZWFtc19jLCAiUENNIENhcHR1cmUgc3Vic3RyZWFtcyBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoY2xvY2ssIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrLCAiQ2xvY2sgb24gIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuICAoMCA9IGF1dG8tZGV0ZWN0KSIpOworbW9kdWxlX3BhcmFtX2FycmF5KHVzZV9wbSwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX3BtLCAiVG9nZ2xlIHBvd2VyLW1hbmFnZW1lbnQuICAoMCA9IG9mZiwgMSA9IG9uLCAyID0gYXV0bykiKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGVfbXB1LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfbXB1LCAiRW5hYmxlIE1QVTQwMS4gICgwID0gb2ZmLCAxID0gb24sIDIgPSBhdXRvKSIpOworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK21vZHVsZV9wYXJhbV9hcnJheShqb3lzdGljaywgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrLCAiRW5hYmxlIGpveXN0aWNrLiIpOworI2VuZGlmCisKKworLyogUENJIERldiBJRCdzICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9FU1MKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FU1MJMHgxMjVECisjZW5kaWYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VTU19PTEQJMHgxMjg1CS8qIFBsYXRmb3JtIFRlY2gsIHRoZSBwZW9wbGUgdGhlIEVTUworCQkJCQkgICB3YXMgYm91Z2h0IGZvcm0gKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VTU19NMkUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfTTJFCTB4MTk3OAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRVNTX00yCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX00yCTB4MTk2OAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRVNTX00xCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX00xCTB4MDEwMAorI2VuZGlmCisKKyNkZWZpbmUgTlJfQVBVUwkJCTY0CisjZGVmaW5lIE5SX0FQVV9SRUdTCQkxNgorCisvKiBORUMgVmVyc2FzID8gKi8KKyNkZWZpbmUgTkVDX1ZFUlNBX1NVQklEMQkweDgwNTgxMDMzCisjZGVmaW5lIE5FQ19WRVJTQV9TVUJJRDIJMHg4MDNjMTAzMworCisvKiBNb2RlIEZsYWdzICovCisjZGVmaW5lIEVTU19GTVRfU1RFUkVPICAgICAJMHgwMQorI2RlZmluZSBFU1NfRk1UXzE2QklUICAgICAgCTB4MDIKKworI2RlZmluZSBEQUNfUlVOTklORwkJMQorI2RlZmluZSBBRENfUlVOTklORwkJMgorCisvKiBWYWx1ZXMgZm9yIHRoZSBFU01fTEVHQUNZX0FVRElPX0NPTlRST0wgKi8KKworI2RlZmluZSBFU1NfRU5BQkxFX0FVRElPCTB4ODAwMAorI2RlZmluZSBFU1NfRU5BQkxFX1NFUklBTF9JUlEJMHg0MDAwCisjZGVmaW5lIElPX0FEUkVTU19BTElBUwkJMHgwMDIwCisjZGVmaW5lIE1QVTQwMV9JUlFfRU5BQkxFCTB4MDAxMAorI2RlZmluZSBNUFU0MDFfSU9fRU5BQkxFCTB4MDAwOAorI2RlZmluZSBHQU1FX0lPX0VOQUJMRQkJMHgwMDA0CisjZGVmaW5lIEZNX0lPX0VOQUJMRQkJMHgwMDAyCisjZGVmaW5lIFNCX0lPX0VOQUJMRQkJMHgwMDAxCisKKy8qIFZhbHVlcyBmb3IgdGhlIEVTTV9DT05GSUdfQSAqLworCisjZGVmaW5lIFBJQ19TTk9PUDEJCTB4NDAwMAorI2RlZmluZSBQSUNfU05PT1AyCQkweDIwMDAKKyNkZWZpbmUgU0FGRUdVQVJECQkweDA4MDAKKyNkZWZpbmUgRE1BX0NMRUFSCQkweDA3MDAKKyNkZWZpbmUgRE1BX0RETUEJCTB4MDAwMAorI2RlZmluZSBETUFfVERNQQkJMHgwMTAwCisjZGVmaW5lIERNQV9QQ1BDSQkJMHgwMjAwCisjZGVmaW5lIFBPU1RfV1JJVEUJCTB4MDA4MAorI2RlZmluZSBJU0FfVElNSU5HCQkweDAwNDAKKyNkZWZpbmUgU1dBUF9MUgkJCTB4MDAyMAorI2RlZmluZSBTVUJUUl9ERUNPREUJCTB4MDAwMgorCisvKiBWYWx1ZXMgZm9yIHRoZSBFU01fQ09ORklHX0IgKi8KKworI2RlZmluZSBTUERJRl9DT05GQgkJMHgwMTAwCisjZGVmaW5lIEhXVl9DT05GQgkJMHgwMDgwCisjZGVmaW5lIERFQk9VTkNFCQkweDAwNDAKKyNkZWZpbmUgR1BJT19DT05GQgkJMHgwMDIwCisjZGVmaW5lIENISV9DT05GQgkJMHgwMDEwCisjZGVmaW5lIElETUFfQ09ORkIJCTB4MDAwOAkvKnVuZG9jICovCisjZGVmaW5lIE1JRElfRklYCQkweDAwMDQJLyp1bmRvYyAqLworI2RlZmluZSBJUlFfVE9fSVNBCQkweDAwMDEJLyp1bmRvYyAqLworCisvKiBWYWx1ZXMgZm9yIFJpbmcgQnVzIENvbnRyb2wgQiAqLworI2RlZmluZQlSSU5HQl8yQ09ERUNfSURfTUFTSwkweDAwMDMKKyNkZWZpbmUgUklOR0JfRElTX1ZBTElEQVRJT04JMHgwMDA4CisjZGVmaW5lIFJJTkdCX0VOX1NQRElGCQkweDAwMTAKKyNkZWZpbmUJUklOR0JfRU5fMkNPREVDCQkweDAwMjAKKyNkZWZpbmUgUklOR0JfU0lOR19CSVRfRFVBTAkweDAwNDAKKworLyogKioqKlBvcnQgQWRyZXNzZXMqKioqICovCisKKy8qICAgV3JpdGUgJiBSZWFkICovCisjZGVmaW5lIEVTTV9JTkRFWAkJMHgwMgorI2RlZmluZSBFU01fREFUQQkJMHgwMAorCisvKiAgIEFDOTcgKyBSaW5nQnVzICovCisjZGVmaW5lIEVTTV9BQzk3X0lOREVYCQkweDMwCisjZGVmaW5lCUVTTV9BQzk3X0RBVEEJCTB4MzIKKyNkZWZpbmUgRVNNX1JJTkdfQlVTX0RFU1QJMHgzNAorI2RlZmluZSBFU01fUklOR19CVVNfQ09OVFJfQQkweDM2CisjZGVmaW5lIEVTTV9SSU5HX0JVU19DT05UUl9CCTB4MzgKKyNkZWZpbmUgRVNNX1JJTkdfQlVTX1NETwkweDNBCisKKy8qICAgV2F2ZUNhY2hlKi8KKyNkZWZpbmUgV0NfSU5ERVgJCTB4MTAKKyNkZWZpbmUgV0NfREFUQQkJCTB4MTIKKyNkZWZpbmUgV0NfQ09OVFJPTAkJMHgxNAorCisvKiAgIEFTU1AqLworI2RlZmluZSBBU1NQX0lOREVYCQkweDgwCisjZGVmaW5lIEFTU1BfTUVNT1JZCQkweDgyCisjZGVmaW5lIEFTU1BfREFUQQkJMHg4NAorI2RlZmluZSBBU1NQX0NPTlRST0xfQQkJMHhBMgorI2RlZmluZSBBU1NQX0NPTlRST0xfQgkJMHhBNAorI2RlZmluZSBBU1NQX0NPTlRST0xfQwkJMHhBNgorI2RlZmluZSBBU1NQX0hPU1RXX0lOREVYCTB4QTgKKyNkZWZpbmUgQVNTUF9IT1NUV19EQVRBCQkweEFBCisjZGVmaW5lIEFTU1BfSE9TVFdfSVJRCQkweEFDCisvKiBNaWRpICovCisjZGVmaW5lIEVTTV9NUFU0MDFfUE9SVAkJMHg5OAorLyogT3RoZXJzICovCisjZGVmaW5lIEVTTV9QT1JUX0hPU1RfSVJRCTB4MTgKKworI2RlZmluZSBJRFIwX0RBVEFfUE9SVAkJMHgwMAorI2RlZmluZSBJRFIxX0NSQU1fUE9JTlRFUgkweDAxCisjZGVmaW5lIElEUjJfQ1JBTV9EQVRBCQkweDAyCisjZGVmaW5lIElEUjNfV0FWRV9EQVRBCQkweDAzCisjZGVmaW5lIElEUjRfV0FWRV9QVFJfTE9XCTB4MDQKKyNkZWZpbmUgSURSNV9XQVZFX1BUUl9ISQkweDA1CisjZGVmaW5lIElEUjZfVElNRVJfQ1RSTAkJMHgwNgorI2RlZmluZSBJRFI3X1dBVkVfUk9NUkFNCTB4MDcKKworI2RlZmluZSBXUklURUFCTEVfTUFQCQkweEVGRkZGRgorI2RlZmluZSBSRUFEQUJMRV9NQVAJCTB4NjQwMDNGCisKKy8qIFBDSSBSZWdpc3RlciAqLworCisjZGVmaW5lIEVTTV9MRUdBQ1lfQVVESU9fQ09OVFJPTCAweDQwCisjZGVmaW5lIEVTTV9BQ1BJX0NPTU1BTkQJMHg1NAorI2RlZmluZSBFU01fQ09ORklHX0EJCTB4NTAKKyNkZWZpbmUgRVNNX0NPTkZJR19CCQkweDUyCisjZGVmaW5lIEVTTV9ERE1BCQkweDYwCisKKy8qIEJvYiBCaXRzICovCisjZGVmaW5lIEVTTV9CT0JfRU5BQkxFCQkweDAwMDEKKyNkZWZpbmUgRVNNX0JPQl9TVEFSVAkJMHgwMDAxCisKKy8qIEhvc3QgSVJRIENvbnRyb2wgQml0cyAqLworI2RlZmluZSBFU01fUkVTRVRfTUFFU1RSTwkweDgwMDAKKyNkZWZpbmUgRVNNX1JFU0VUX0RJUkVDVFNPVU5EICAgMHg0MDAwCisjZGVmaW5lIEVTTV9ISVJRX0Nsa1J1bgkJMHgwMTAwCisjZGVmaW5lIEVTTV9ISVJRX0hXX1ZPTFVNRQkweDAwNDAKKyNkZWZpbmUgRVNNX0hJUlFfSEFSUE8JCTB4MDAzMAkvKiBXaGF0J3MgdGhhdD8gKi8KKyNkZWZpbmUgRVNNX0hJUlFfQVNTUAkJMHgwMDEwCisjZGVmaW5lCUVTTV9ISVJRX0RTSUUJCTB4MDAwNAorI2RlZmluZSBFU01fSElSUV9NUFU0MDEJCTB4MDAwMgorI2RlZmluZSBFU01fSElSUV9TQgkJMHgwMDAxCisKKy8qIEhvc3QgSVJRIFN0YXR1cyBCaXRzICovCisjZGVmaW5lIEVTTV9NUFU0MDFfSVJRCQkweDAyCisjZGVmaW5lIEVTTV9TQl9JUlEJCTB4MDEKKyNkZWZpbmUgRVNNX1NPVU5EX0lSUQkJMHgwNAorI2RlZmluZQlFU01fQVNTUF9JUlEJCTB4MTAKKyNkZWZpbmUgRVNNX0hXVk9MX0lSUQkJMHg0MAorCisjZGVmaW5lIEVTU19TWVNDTEsJCTUwMDAwMDAwCisjZGVmaW5lIEVTTV9CT0JfRlJFUSAJCTIwMAorI2RlZmluZSBFU01fQk9CX0ZSRVFfTUFYCTgwMAorCisjZGVmaW5lIEVTTV9GUkVRX0VTTTEgIAkJKDQ5MTUyMDAwTCAvIDEwMjRMKQkvKiBkZWZhdWx0IHJhdGUgNDgwMDAgKi8KKyNkZWZpbmUgRVNNX0ZSRVFfRVNNMiAgCQkoNTAwMDAwMDBMIC8gMTAyNEwpCisKKy8qIEFQVSBNb2RlczogcmVnIDB4MDAsIGJpdCA0LTcgKi8KKyNkZWZpbmUgRVNNX0FQVV9NT0RFX1NISUZUCTQKKyNkZWZpbmUgRVNNX0FQVV9NT0RFX01BU0sJKDB4ZiA8PCA0KQorI2RlZmluZQlFU01fQVBVX09GRgkJMHgwMAorI2RlZmluZQlFU01fQVBVXzE2QklUTElORUFSCTB4MDEJLyogMTYtQml0IExpbmVhciBTYW1wbGUgUGxheWVyICovCisjZGVmaW5lCUVTTV9BUFVfMTZCSVRTVEVSRU8JMHgwMgkvKiAxNi1CaXQgU3RlcmVvIFNhbXBsZSBQbGF5ZXIgKi8KKyNkZWZpbmUJRVNNX0FQVV84QklUTElORUFSCTB4MDMJLyogOC1CaXQgTGluZWFyIFNhbXBsZSBQbGF5ZXIgKi8KKyNkZWZpbmUJRVNNX0FQVV84QklUU1RFUkVPCTB4MDQJLyogOC1CaXQgU3RlcmVvIFNhbXBsZSBQbGF5ZXIgKi8KKyNkZWZpbmUJRVNNX0FQVV84QklURElGRgkweDA1CS8qIDgtQml0IERpZmZlcmVudGlhbCBTYW1wbGUgUGxheXJlciAqLworI2RlZmluZQlFU01fQVBVX0RJR0lUQUxERUxBWQkweDA2CS8qIERpZ2l0YWwgRGVsYXkgTGluZSAqLworI2RlZmluZQlFU01fQVBVX0RVQUxUQVAJCTB4MDcJLyogRHVhbCBUYXAgUmVhZGVyICovCisjZGVmaW5lCUVTTV9BUFVfQ09SUkVMQVRPUgkweDA4CS8qIENvcnJlbGF0b3IgKi8KKyNkZWZpbmUJRVNNX0FQVV9JTlBVVE1JWEVSCTB4MDkJLyogSW5wdXQgTWl4ZXIgKi8KKyNkZWZpbmUJRVNNX0FQVV9XQVZFVEFCTEUJMHgwQQkvKiBXYXZlIFRhYmxlIE1vZGUgKi8KKyNkZWZpbmUJRVNNX0FQVV9TUkNPTlZFUlRPUgkweDBCCS8qIFNhbXBsZSBSYXRlIENvbnZlcnRvciAqLworI2RlZmluZQlFU01fQVBVXzE2QklUUElOR1BPTkcJMHgwQwkvKiAxNi1CaXQgUGluZy1Qb25nIFNhbXBsZSBQbGF5ZXIgKi8KKyNkZWZpbmUJRVNNX0FQVV9SRVNFUlZFRDEJMHgwRAkvKiBSZXNlcnZlZCAxICovCisjZGVmaW5lCUVTTV9BUFVfUkVTRVJWRUQyCTB4MEUJLyogUmVzZXJ2ZWQgMiAqLworI2RlZmluZQlFU01fQVBVX1JFU0VSVkVEMwkweDBGCS8qIFJlc2VydmVkIDMgKi8KKworLyogcmVnIDB4MDAgKi8KKyNkZWZpbmUgRVNNX0FQVV9GSUxURVJfUV9TSElGVAkJMAorI2RlZmluZSBFU01fQVBVX0ZJTFRFUl9RX01BU0sJCSgzIDw8IDApCisvKiBBUFUgRmlsdGV5IFEgQ29udHJvbCAqLworI2RlZmluZSBFU01fQVBVX0ZJTFRFUl9MRVNTUQkweDAwCisjZGVmaW5lIEVTTV9BUFVfRklMVEVSX01PUkVRCTB4MDMKKworI2RlZmluZSBFU01fQVBVX0ZJTFRFUl9UWVBFX1NISUZUCTIKKyNkZWZpbmUgRVNNX0FQVV9GSUxURVJfVFlQRV9NQVNLCSgzIDw8IDIpCisjZGVmaW5lIEVTTV9BUFVfRU5WX1RZUEVfU0hJRlQJCTgKKyNkZWZpbmUgRVNNX0FQVV9FTlZfVFlQRV9NQVNLCQkoMyA8PCA4KQorI2RlZmluZSBFU01fQVBVX0VOVl9TVEFURV9TSElGVAkJMTAKKyNkZWZpbmUgRVNNX0FQVV9FTlZfU1RBVEVfTUFTSwkJKDMgPDwgMTApCisjZGVmaW5lIEVTTV9BUFVfRU5EX0NVUlZFCQkoMSA8PCAxMikKKyNkZWZpbmUgRVNNX0FQVV9JTlRfT05fTE9PUAkJKDEgPDwgMTMpCisjZGVmaW5lIEVTTV9BUFVfRE1BX0VOQUJMRQkJKDEgPDwgMTQpCisKKy8qIHJlZyAweDAyICovCisjZGVmaW5lIEVTTV9BUFVfU1VCTUlYX0dST1VQX1NISVJUCTAKKyNkZWZpbmUgRVNNX0FQVV9TVUJNSVhfR1JPVVBfTUFTSwkoNyA8PCAwKQorI2RlZmluZSBFU01fQVBVX1NVQk1JWF9NT0RFCQkoMSA8PCAzKQorI2RlZmluZSBFU01fQVBVXzZkQgkJCSgxIDw8IDQpCisjZGVmaW5lIEVTTV9BUFVfRFVBTF9FRkZFQ1QJCSgxIDw8IDUpCisjZGVmaW5lIEVTTV9BUFVfRUZGRUNUX0NIQU5ORUxTX1NISUZUCTYKKyNkZWZpbmUgRVNNX0FQVV9FRkZFQ1RfQ0hBTk5FTFNfTUFTSwkoMyA8PCA2KQorCisvKiByZWcgMHgwMyAqLworI2RlZmluZSBFU01fQVBVX1NURVBfU0laRV9NQVNLCQkweDBmZmYKKworLyogcmVnIDB4MDQgKi8KKyNkZWZpbmUgRVNNX0FQVV9QSEFTRV9TSElGVAkJMAorI2RlZmluZSBFU01fQVBVX1BIQVNFX01BU0sJCSgweGZmIDw8IDApCisjZGVmaW5lIEVTTV9BUFVfV0FWRTY0S19QQUdFX1NISUZUCTgJLyogbW9zdCA4Yml0IG9mIHdhdmUgc3RhcnQgb2Zmc2V0ICovCisjZGVmaW5lIEVTTV9BUFVfV0FWRTY0S19QQUdFX01BU0sJKDB4ZmYgPDwgOCkKKworLyogcmVnIDB4MDUgLSB3YXZlIHN0YXJ0IG9mZnNldCAqLworLyogcmVnIDB4MDYgLSB3YXZlIGVuZCBvZmZzZXQgKi8KKy8qIHJlZyAweDA3IC0gd2F2ZSBsb29wIGxlbmd0aCAqLworCisvKiByZWcgMHgwOCAqLworI2RlZmluZSBFU01fQVBVX0VGRkVDVF9HQUlOX1NISUZUCTAKKyNkZWZpbmUgRVNNX0FQVV9FRkZFQ1RfR0FJTl9NQVNLCSgweGZmIDw8IDApCisjZGVmaW5lIEVTTV9BUFVfVFJFTU9MT19ERVBUSF9TSElGVAk4CisjZGVmaW5lIEVTTV9BUFVfVFJFTU9MT19ERVBUSF9NQVNLCSgweGYgPDwgOCkKKyNkZWZpbmUgRVNNX0FQVV9UUkVNT0xPX1JBVEVfU0hJRlQJMTIKKyNkZWZpbmUgRVNNX0FQVV9UUkVNT0xPX1JBVEVfTUFTSwkoMHhmIDw8IDEyKQorCisvKiByZWcgMHgwOSAqLworLyogYml0IDAtNyBhbXBsaXR1ZGUgZGVzdD8gKi8KKyNkZWZpbmUgRVNNX0FQVV9BTVBMSVRVREVfTk9XX1NISUZUCTgKKyNkZWZpbmUgRVNNX0FQVV9BTVBMSVRVREVfTk9XX01BU0sJKDB4ZmYgPDwgOCkKKworLyogcmVnIDB4MGEgKi8KKyNkZWZpbmUgRVNNX0FQVV9QT0xBUl9QQU5fU0hJRlQJCTAKKyNkZWZpbmUgRVNNX0FQVV9QT0xBUl9QQU5fTUFTSwkJKDB4M2YgPDwgMCkKKy8qIFBvbGFyIFBhbiBDb250cm9sICovCisjZGVmaW5lCUVTTV9BUFVfUEFOX0NFTlRFUl9DSVJDTEUJCTB4MDAKKyNkZWZpbmUJRVNNX0FQVV9QQU5fTUlERExFX1JBRElVUwkJMHgwMQorI2RlZmluZQlFU01fQVBVX1BBTl9PVVRTSURFX1JBRElVUwkJMHgwMgorCisjZGVmaW5lIEVTTV9BUFVfRklMVEVSX1RVTklOR19TSElGVAk4CisjZGVmaW5lIEVTTV9BUFVfRklMVEVSX1RVTklOR19NQVNLCSgweGZmIDw8IDgpCisKKy8qIHJlZyAweDBiICovCisjZGVmaW5lIEVTTV9BUFVfREFUQV9TUkNfQV9TSElGVAkwCisjZGVmaW5lIEVTTV9BUFVfREFUQV9TUkNfQV9NQVNLCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBFU01fQVBVX0lOVl9QT0xfQQkJKDEgPDwgNykKKyNkZWZpbmUgRVNNX0FQVV9EQVRBX1NSQ19CX1NISUZUCTgKKyNkZWZpbmUgRVNNX0FQVV9EQVRBX1NSQ19CX01BU0sJCSgweDdmIDw8IDgpCisjZGVmaW5lIEVTTV9BUFVfSU5WX1BPTF9CCQkoMSA8PCAxNSkKKworI2RlZmluZSBFU01fQVBVX1ZJQlJBVE9fUkFURV9TSElGVAkwCisjZGVmaW5lIEVTTV9BUFVfVklCUkFUT19SQVRFX01BU0sJKDB4ZiA8PCAwKQorI2RlZmluZSBFU01fQVBVX1ZJQlJBVE9fREVQVEhfU0hJRlQJNAorI2RlZmluZSBFU01fQVBVX1ZJQlJBVE9fREVQVEhfTUFTSwkoMHhmIDw8IDQpCisjZGVmaW5lIEVTTV9BUFVfVklCUkFUT19QSEFTRV9TSElGVAk4CisjZGVmaW5lIEVTTV9BUFVfVklCUkFUT19QSEFTRV9NQVNLCSgweGZmIDw8IDgpCisKKy8qIHJlZyAweDBjICovCisjZGVmaW5lIEVTTV9BUFVfUkFESVVTX1NFTEVDVAkJKDEgPDwgNikKKworLyogQVBVIEZpbHRlciBDb250cm9sICovCisjZGVmaW5lCUVTTV9BUFVfRklMVEVSXzJQT0xFX0xPUEFTUwkweDAwCisjZGVmaW5lCUVTTV9BUFVfRklMVEVSXzJQT0xFX0JBTkRQQVNTCTB4MDEKKyNkZWZpbmUJRVNNX0FQVV9GSUxURVJfMlBPTEVfSElQQVNTCTB4MDIKKyNkZWZpbmUJRVNNX0FQVV9GSUxURVJfMVBPTEVfTE9QQVNTCTB4MDMKKyNkZWZpbmUJRVNNX0FQVV9GSUxURVJfMVBPTEVfSElQQVNTCTB4MDQKKyNkZWZpbmUJRVNNX0FQVV9GSUxURVJfT0ZGCQkweDA1CisKKy8qIEFQVSBBVEZQIFR5cGUgKi8KKyNkZWZpbmUJRVNNX0FQVV9BVEZQX0FNUExJVFVERQkJCTB4MDAKKyNkZWZpbmUJRVNNX0FQVV9BVEZQX1RSRU1FTE8JCQkweDAxCisjZGVmaW5lCUVTTV9BUFVfQVRGUF9GSUxURVIJCQkweDAyCisjZGVmaW5lCUVTTV9BUFVfQVRGUF9QQU4JCQkweDAzCisKKy8qIEFQVSBBVEZQIEZsYWdzICovCisjZGVmaW5lCUVTTV9BUFVfQVRGUF9GTEdfT0ZGCQkJMHgwMAorI2RlZmluZQlFU01fQVBVX0FURlBfRkxHX1dBSVQJCQkweDAxCisjZGVmaW5lCUVTTV9BUFVfQVRGUF9GTEdfRE9ORQkJCTB4MDIKKyNkZWZpbmUJRVNNX0FQVV9BVEZQX0ZMR19JTlBST0NFU1MJCTB4MDMKKworCisvKiBjYXB0dXJlIG1peGluZyBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBFU01fTUVNX0FMSUdOCQkweDEwMDAKKyNkZWZpbmUgRVNNX01JWEJVRl9TSVpFCQkweDQwMAorCisjZGVmaW5lIEVTTV9NT0RFX1BMQVkJCTAKKyNkZWZpbmUgRVNNX01PREVfQ0FQVFVSRQkxCisKKy8qIGFjcGkgc3RhdGVzICovCitlbnVtIHsKKwlBQ1BJX0QwPTAsCisJQUNQSV9EMSwKKwlBQ1BJX0QyLAorCUFDUElfRDMKK307CisKKy8qIGJpdHMgaW4gdGhlIGFjcGkgbWFza3MgKi8KKyNkZWZpbmUgQUNQSV8xMk1IWgkoIDEgPDwgMTUpCisjZGVmaW5lIEFDUElfMjRNSFoJKCAxIDw8IDE0KQorI2RlZmluZSBBQ1BJXzk3OAkoIDEgPDwgMTMpCisjZGVmaW5lIEFDUElfU1BESUYJKCAxIDw8IDEyKQorI2RlZmluZSBBQ1BJX0dMVUUJKCAxIDw8IDExKQorI2RlZmluZSBBQ1BJX18xMAkoIDEgPDwgMTApIC8qIHJlc2VydmVkICovCisjZGVmaW5lIEFDUElfUENJSU5UCSggMSA8PCA5KQorI2RlZmluZSBBQ1BJX0hWCQkoIDEgPDwgOCkgLyogaGFyZHdhcmUgdm9sdW1lICovCisjZGVmaW5lIEFDUElfR1BJTwkoIDEgPDwgNykKKyNkZWZpbmUgQUNQSV9BU1NQCSggMSA8PCA2KQorI2RlZmluZSBBQ1BJX1NCCQkoIDEgPDwgNSkgLyogc2IgZW11bCAqLworI2RlZmluZSBBQ1BJX0ZNCQkoIDEgPDwgNCkgLyogZm0gZW11bCAqLworI2RlZmluZSBBQ1BJX1JCCQkoIDEgPDwgMykgLyogcmluZ2J1cyAvIGFjbGluayAqLworI2RlZmluZSBBQ1BJX01JREkJKCAxIDw8IDIpIAorI2RlZmluZSBBQ1BJX0dQCQkoIDEgPDwgMSkgLyogZ2FtZSBwb3J0ICovCisjZGVmaW5lIEFDUElfV1AJCSggMSA8PCAwKSAvKiB3YXZlIHByb2Nlc3NvciAqLworCisjZGVmaW5lIEFDUElfQUxMCSgweGZmZmYpCisjZGVmaW5lIEFDUElfU0xFRVAJKH4oQUNQSV9TUERJRnxBQ1BJX0FTU1B8QUNQSV9TQnxBQ1BJX0ZNfCBcCisJCQlBQ1BJX01JREl8QUNQSV9HUHxBQ1BJX1dQKSkKKyNkZWZpbmUgQUNQSV9OT05FCShBQ1BJX18xMCkKKworLyogdGhlc2UgbWFza3MgaW5kaWNhdGUgd2hpY2ggdW5pdHMgd2UgY2FyZSBhYm91dCBhdAorCXdoaWNoIHN0YXRlcyAqLworc3RhdGljIHUxNiBhY3BpX3N0YXRlX21hc2tbXSA9IHsKKwlbQUNQSV9EMF0gPSBBQ1BJX0FMTCwKKwlbQUNQSV9EMV0gPSBBQ1BJX1NMRUVQLAorCVtBQ1BJX0QyXSA9IEFDUElfU0xFRVAsCisJW0FDUElfRDNdID0gQUNQSV9OT05FCit9OworCisKK3R5cGVkZWYgc3RydWN0IHNuZF9lczE5NjggZXMxOTY4X3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZXNzY2hhbiBlc3NjaGFuX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZXNtX21lbW9yeSBlc21fbWVtb3J5X3Q7CisKKy8qIEFQVSB1c2UgaW4gdGhlIGRyaXZlciAqLworZW51bSBzbmRfZW51bV9hcHVfdHlwZSB7CisJRVNNX0FQVV9QQ01fUExBWSwKKwlFU01fQVBVX1BDTV9DQVBUVVJFLAorCUVTTV9BUFVfUENNX1JBVEVDT05WLAorCUVTTV9BUFVfRlJFRQorfTsKKworLyogY2hpcCB0eXBlICovCitlbnVtIHsKKwlUWVBFX01BRVNUUk8sIFRZUEVfTUFFU1RSTzIsIFRZUEVfTUFFU1RSTzJFCit9OworCisvKiBETUEgSGFjayEgKi8KK3N0cnVjdCBzbmRfZXNtX21lbW9yeSB7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJ1ZjsKKwlpbnQgZW1wdHk7CS8qIHN0YXR1cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qIFBsYXliYWNrIENoYW5uZWwgKi8KK3N0cnVjdCBzbmRfZXNzY2hhbiB7CisJaW50IHJ1bm5pbmc7CisKKwl1OCBhcHVbNF07CisJdTggYXB1X21vZGVbNF07CisKKwkvKiBwbGF5YmFjay9jYXB0dXJlIHBjbSBidWZmZXIgKi8KKwllc21fbWVtb3J5X3QgKm1lbW9yeTsKKwkvKiBjYXB0dXJlIG1peGVyIGJ1ZmZlciAqLworCWVzbV9tZW1vcnlfdCAqbWl4YnVmOworCisJdW5zaWduZWQgaW50IGh3cHRyOwkvKiBjdXJyZW50IGh3IHBvaW50ZXIgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CS8qIHNhbXBsZSBjb3VudGVyIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50IGRtYV9zaXplOwkvKiB0b3RhbCBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBmcmFnX3NpemU7CS8qIHBlcmlvZCBzaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50IHdhdl9zaGlmdDsKKwl1MTYgYmFzZVs0XTsJCS8qIG9mZnNldCBmb3IgcHRyICovCisKKwkvKiBzdGVyZW8vMTZiaXQgZmxhZyAqLworCXVuc2lnbmVkIGNoYXIgZm10OworCWludCBtb2RlOwkvKiBwbGF5YmFjayAvIGNhcHR1cmUgKi8KKworCWludCBib2JfZnJlcTsJLyogcmVxdWlyZWQgdGltZXIgZnJlcXVlbmN5ICovCisKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisKKwkvKiBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworI2lmZGVmIENPTkZJR19QTQorCXUxNiB3Y19tYXBbNF07CisjZW5kaWYKK307CisKK3N0cnVjdCBzbmRfZXMxOTY4IHsKKwkvKiBNb2R1bGUgQ29uZmlnICovCisJaW50IHRvdGFsX2J1ZnNpemU7CQkJLyogaW4gYnl0ZXMgKi8KKworCWludCBwbGF5YmFja19zdHJlYW1zLCBjYXB0dXJlX3N0cmVhbXM7CisKKwl1bnNpZ25lZCBpbnQgY2xvY2s7CQkvKiBjbG9jayAqLworCS8qIGZvciBjbG9jayBtZWFzdXJlbWVudCAqLworCXVuc2lnbmVkIGludCBpbl9tZWFzdXJlbWVudDogMTsKKwl1bnNpZ25lZCBpbnQgbWVhc3VyZV9hcHU7CisJdW5zaWduZWQgaW50IG1lYXN1cmVfbGFzdHBvczsKKwl1bnNpZ25lZCBpbnQgbWVhc3VyZV9jb3VudDsKKworCS8qIGJ1ZmZlciAqLworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWE7CisKKwkvKiBSZXNvdXJjZXMuLi4gKi8KKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDsKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc25kX3BjbV90ICpwY207CisJaW50IGRvX3BtOwkJLyogcG93ZXItbWFuYWdlbWVudCBlbmFibGVkICovCisKKwkvKiBETUEgbWVtb3J5IGJsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBidWZfbGlzdDsKKworCS8qIEFMU0EgU3R1ZmYgKi8KKwlhYzk3X3QgKmFjOTc7CisJc25kX2tjb250cm9sX3QgKm1hc3Rlcl9zd2l0Y2g7IC8qIGZvciBoL3cgdm9sdW1lIGNvbnRyb2wgKi8KKwlzbmRfa2NvbnRyb2xfdCAqbWFzdGVyX3ZvbHVtZTsKKworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzcGlubG9ja190IGFjOTdfbG9jazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaHd2b2xfdHE7CisJdW5zaWduZWQgaW50IGluX3N1c3BlbmQ7CisKKwkvKiBNYWVzdHJvIFN0dWZmICovCisJdTE2IG1hZXN0cm9fbWFwWzMyXTsKKwlpbnQgYm9iY2xpZW50OwkJLyogYWN0aXZlIHRpbWVyIGluc3RhbmNzICovCisJaW50IGJvYl9mcmVxOwkJLyogdGltZXIgZnJlcXVlbmN5ICovCisJc3RydWN0IHNlbWFwaG9yZSBtZW1vcnlfbXV0ZXg7CS8qIG1lbW9yeSBsb2NrICovCisKKwkvKiBBUFUgc3RhdGVzICovCisJdW5zaWduZWQgY2hhciBhcHVbTlJfQVBVU107CisKKwkvKiBhY3RpdmUgc3Vic3RyZWFtcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3Vic3RyZWFtX2xpc3Q7CisJc3BpbmxvY2tfdCBzdWJzdHJlYW1fbG9jazsKKworI2lmZGVmIENPTkZJR19QTQorCXUxNiBhcHVfbWFwW05SX0FQVVNdW05SX0FQVV9SRUdTXTsKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisjZW5kaWYKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfZXMxOTY4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9lczE5NjhfaWRzW10gPSB7CisJLyogTWFlc3RybyAxICovCisgICAgICAgIHsgMHgxMjg1LCAweDAxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsIDB4ZmZmZjAwLCBUWVBFX01BRVNUUk8gfSwKKwkvKiBNYWVzdHJvIDIgKi8KKwl7IDB4MTI1ZCwgMHgxOTY4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgVFlQRV9NQUVTVFJPMiB9LAorCS8qIE1hZXN0cm8gMkUgKi8KKyAgICAgICAgeyAweDEyNWQsIDB4MTk3OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIFRZUEVfTUFFU1RSTzJFIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2VzMTk2OF9pZHMpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioKKyAgICogTG93IExldmVsIEZ1bmNzISAgKgorICAgKioqKioqKioqKioqKioqKioqKioqLworCisvKiBubyBzcGlubG9jayAqLworc3RhdGljIHZvaWQgX19tYWVzdHJvX3dyaXRlKGVzMTk2OF90ICpjaGlwLCB1MTYgcmVnLCB1MTYgZGF0YSkKK3sKKwlvdXR3KHJlZywgY2hpcC0+aW9fcG9ydCArIEVTTV9JTkRFWCk7CisJb3V0dyhkYXRhLCBjaGlwLT5pb19wb3J0ICsgRVNNX0RBVEEpOworCWNoaXAtPm1hZXN0cm9fbWFwW3JlZ10gPSBkYXRhOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgbWFlc3Ryb193cml0ZShlczE5NjhfdCAqY2hpcCwgdTE2IHJlZywgdTE2IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlfX21hZXN0cm9fd3JpdGUoY2hpcCwgcmVnLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCisvKiBubyBzcGlubG9jayAqLworc3RhdGljIHUxNiBfX21hZXN0cm9fcmVhZChlczE5NjhfdCAqY2hpcCwgdTE2IHJlZykKK3sKKwlpZiAoUkVBREFCTEVfTUFQICYgKDEgPDwgcmVnKSkgeworCQlvdXR3KHJlZywgY2hpcC0+aW9fcG9ydCArIEVTTV9JTkRFWCk7CisJCWNoaXAtPm1hZXN0cm9fbWFwW3JlZ10gPSBpbncoY2hpcC0+aW9fcG9ydCArIEVTTV9EQVRBKTsKKwl9CisJcmV0dXJuIGNoaXAtPm1hZXN0cm9fbWFwW3JlZ107Cit9CisKK2lubGluZSBzdGF0aWMgdTE2IG1hZXN0cm9fcmVhZChlczE5NjhfdCAqY2hpcCwgdTE2IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiByZXN1bHQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gX19tYWVzdHJvX3JlYWQoY2hpcCwgcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgYmlnX21kZWxheShtc2VjKSBkbyB7XAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTtcCisJc2NoZWR1bGVfdGltZW91dCgoKG1zZWMpICogSFogKyA5OTkpIC8gMTAwMCk7XAorfSB3aGlsZSAoMCkKKwkKKy8qIFdhaXQgZm9yIHRoZSBjb2RlYyBidXMgdG8gYmUgZnJlZSAqLworc3RhdGljIGludCBzbmRfZXMxOTY4X2FjOTdfd2FpdChlczE5NjhfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dCA9IDEwMDAwMDsKKworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCWlmICghKGluYihjaGlwLT5pb19wb3J0ICsgRVNNX0FDOTdfSU5ERVgpICYgMSkpCisJCQlyZXR1cm4gMDsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXNuZF9wcmludGQoImVzMTk2ODogYWM5NyB0aW1lb3V0XG4iKTsKKwlyZXR1cm4gMTsgLyogdGltZW91dCAqLworfQorCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X2FjOTdfd3JpdGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwllczE5NjhfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc25kX2VzMTk2OF9hYzk3X3dhaXQoY2hpcCk7CisKKwkvKiBXcml0ZSB0aGUgYnVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOworCW91dHcodmFsLCBjaGlwLT5pb19wb3J0ICsgRVNNX0FDOTdfREFUQSk7CisJLyptc2xlZXAoMSk7Ki8KKwlvdXRiKHJlZywgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0lOREVYKTsKKwkvKm1zbGVlcCgxKTsqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2VzMTk2OF9hYzk3X3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJdTE2IGRhdGEgPSAwOworCWVzMTk2OF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzbmRfZXMxOTY4X2FjOTdfd2FpdChjaGlwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5hYzk3X2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZyB8IDB4ODAsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCk7CisJLyptc2xlZXAoMSk7Ki8KKworCWlmICghIHNuZF9lczE5NjhfYWM5N193YWl0KGNoaXApKSB7CisJCWRhdGEgPSBpbncoY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0RBVEEpOworCQkvKm1zbGVlcCgxKTsqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5hYzk3X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCisvKiBubyBzcGlubG9jayAqLworc3RhdGljIHZvaWQgYXB1X2luZGV4X3NldChlczE5NjhfdCAqY2hpcCwgdTE2IGluZGV4KQoreworCWludCBpOworCV9fbWFlc3Ryb193cml0ZShjaGlwLCBJRFIxX0NSQU1fUE9JTlRFUiwgaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCWlmIChfX21hZXN0cm9fcmVhZChjaGlwLCBJRFIxX0NSQU1fUE9JTlRFUikgPT0gaW5kZXgpCisJCQlyZXR1cm47CisJc25kX3ByaW50ZCgiZXMxOTY4OiBBUFUgcmVnaXN0ZXIgc2VsZWN0IGZhaWxlZC4gKFRpbWVvdXQpXG4iKTsKK30KKworLyogbm8gc3BpbmxvY2sgKi8KK3N0YXRpYyB2b2lkIGFwdV9kYXRhX3NldChlczE5NjhfdCAqY2hpcCwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAoX19tYWVzdHJvX3JlYWQoY2hpcCwgSURSMF9EQVRBX1BPUlQpID09IGRhdGEpCisJCQlyZXR1cm47CisJCV9fbWFlc3Ryb193cml0ZShjaGlwLCBJRFIwX0RBVEFfUE9SVCwgZGF0YSk7CisJfQorCXNuZF9wcmludGQoImVzMTk2ODogQVBVIHJlZ2lzdGVyIHNldCBwcm9iYWJseSBmYWlsZWQgKFRpbWVvdXQpIVxuIik7Cit9CisKKy8qIG5vIHNwaW5sb2NrICovCitzdGF0aWMgdm9pZCBfX2FwdV9zZXRfcmVnaXN0ZXIoZXMxOTY4X3QgKmNoaXAsIHUxNiBjaGFubmVsLCB1OCByZWcsIHUxNiBkYXRhKQoreworCXNuZF9hc3NlcnQoY2hhbm5lbCA8IE5SX0FQVVMsIHJldHVybik7CisjaWZkZWYgQ09ORklHX1BNCisJY2hpcC0+YXB1X21hcFtjaGFubmVsXVtyZWddID0gZGF0YTsKKyNlbmRpZgorCXJlZyB8PSAoY2hhbm5lbCA8PCA0KTsKKwlhcHVfaW5kZXhfc2V0KGNoaXAsIHJlZyk7CisJYXB1X2RhdGFfc2V0KGNoaXAsIGRhdGEpOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgYXB1X3NldF9yZWdpc3RlcihlczE5NjhfdCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlfX2FwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgY2hhbm5lbCwgcmVnLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdTE2IF9fYXB1X2dldF9yZWdpc3RlcihlczE5NjhfdCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZykKK3sKKwlzbmRfYXNzZXJ0KGNoYW5uZWwgPCBOUl9BUFVTLCByZXR1cm4gMCk7CisJcmVnIHw9IChjaGFubmVsIDw8IDQpOworCWFwdV9pbmRleF9zZXQoY2hpcCwgcmVnKTsKKwlyZXR1cm4gX19tYWVzdHJvX3JlYWQoY2hpcCwgSURSMF9EQVRBX1BPUlQpOworfQorCitpbmxpbmUgc3RhdGljIHUxNiBhcHVfZ2V0X3JlZ2lzdGVyKGVzMTk2OF90ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHY7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJdiA9IF9fYXB1X2dldF9yZWdpc3RlcihjaGlwLCBjaGFubmVsLCByZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHY7Cit9CisKKyNpZiAwIC8qIEFTU1AgaXMgbm90IHN1cHBvcnRlZCAqLworCitzdGF0aWMgdm9pZCBhc3NwX3NldF9yZWdpc3RlcihlczE5NjhfdCAqY2hpcCwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlvdXRsKHJlZywgY2hpcC0+aW9fcG9ydCArIEFTU1BfSU5ERVgpOworCW91dGwodmFsdWUsIGNoaXAtPmlvX3BvcnQgKyBBU1NQX0RBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MzIgYXNzcF9nZXRfcmVnaXN0ZXIoZXMxOTY4X3QgKmNoaXAsIHUzMiByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsdWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlvdXRsKHJlZywgY2hpcC0+aW9fcG9ydCArIEFTU1BfSU5ERVgpOworCXZhbHVlID0gaW5sKGNoaXAtPmlvX3BvcnQgKyBBU1NQX0RBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3YXZlX3NldF9yZWdpc3RlcihlczE5NjhfdCAqY2hpcCwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlvdXR3KHJlZywgY2hpcC0+aW9fcG9ydCArIFdDX0lOREVYKTsKKwlvdXR3KHZhbHVlLCBjaGlwLT5pb19wb3J0ICsgV0NfREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUxNiB3YXZlX2dldF9yZWdpc3RlcihlczE5NjhfdCAqY2hpcCwgdTE2IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCW91dHcocmVnLCBjaGlwLT5pb19wb3J0ICsgV0NfSU5ERVgpOworCXZhbHVlID0gaW53KGNoaXAtPmlvX3BvcnQgKyBXQ19EQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqCisgICAqIEJvYiB0aGUgVGltZXIhICAqCisgICAqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X2JvYl9zdG9wKGVzMTk2OF90ICpjaGlwKQoreworCXUxNiByZWc7CisKKwlyZWcgPSBfX21hZXN0cm9fcmVhZChjaGlwLCAweDExKTsKKwlyZWcgJj0gfkVTTV9CT0JfRU5BQkxFOworCV9fbWFlc3Ryb193cml0ZShjaGlwLCAweDExLCByZWcpOworCXJlZyA9IF9fbWFlc3Ryb19yZWFkKGNoaXAsIDB4MTcpOworCXJlZyAmPSB+RVNNX0JPQl9TVEFSVDsKKwlfX21hZXN0cm9fd3JpdGUoY2hpcCwgMHgxNywgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9ib2Jfc3RhcnQoZXMxOTY4X3QgKmNoaXApCit7CisJaW50IHByZXNjYWxlOworCWludCBkaXZpZGU7CisKKwkvKiBjb21wdXRlIGlkZWFsIGludGVycnVwdCBmcmVxdWVuY3kgZm9yIGJ1ZmZlciBzaXplICYgcGxheSByYXRlICovCisJLyogZmlyc3QsIGZpbmQgYmVzdCBwcmVzY2FsZXIgdmFsdWUgdG8gbWF0Y2ggZnJlcSAqLworCWZvciAocHJlc2NhbGUgPSA1OyBwcmVzY2FsZSA8IDEyOyBwcmVzY2FsZSsrKQorCQlpZiAoY2hpcC0+Ym9iX2ZyZXEgPiAoRVNTX1NZU0NMSyA+PiAocHJlc2NhbGUgKyA5KSkpCisJCQlicmVhazsKKworCS8qIG5leHQsIGJhY2sgb2ZmIHByZXNjYWxlciB3aGlsc3QgZ2V0dGluZyBkaXZpZGVyIGludG8gb3B0aW11bSByYW5nZSAqLworCWRpdmlkZSA9IDE7CisJd2hpbGUgKChwcmVzY2FsZSA+IDUpICYmIChkaXZpZGUgPCAzMikpIHsKKwkJcHJlc2NhbGUtLTsKKwkJZGl2aWRlIDw8PSAxOworCX0KKwlkaXZpZGUgPj49IDE7CisKKwkvKiBub3cgZmluZS10dW5lIHRoZSBkaXZpZGVyIGZvciBiZXN0IG1hdGNoICovCisJZm9yICg7IGRpdmlkZSA8IDMxOyBkaXZpZGUrKykKKwkJaWYgKGNoaXAtPmJvYl9mcmVxID4KKwkJICAgICgoRVNTX1NZU0NMSyA+PiAocHJlc2NhbGUgKyA5KSkgLyAoZGl2aWRlICsgMSkpKSBicmVhazsKKworCS8qIGRpdmlkZSA9IDAgaXMgaWxsZWdhbCwgYnV0IGRvbid0IGxldCBwcmVzY2FsZSA9IDQhICovCisJaWYgKGRpdmlkZSA9PSAwKSB7CisJCWRpdmlkZSsrOworCQlpZiAocHJlc2NhbGUgPiA1KQorCQkJcHJlc2NhbGUtLTsKKwl9IGVsc2UgaWYgKGRpdmlkZSA+IDEpCisJCWRpdmlkZS0tOworCisJX19tYWVzdHJvX3dyaXRlKGNoaXAsIDYsIDB4OTAwMCB8IChwcmVzY2FsZSA8PCA1KSB8IGRpdmlkZSk7CS8qIHNldCByZWcgKi8KKworCS8qIE5vdyBzZXQgSURSIDExLzE3ICovCisJX19tYWVzdHJvX3dyaXRlKGNoaXAsIDB4MTEsIF9fbWFlc3Ryb19yZWFkKGNoaXAsIDB4MTEpIHwgMSk7CisJX19tYWVzdHJvX3dyaXRlKGNoaXAsIDB4MTcsIF9fbWFlc3Ryb19yZWFkKGNoaXAsIDB4MTcpIHwgMSk7Cit9CisKKy8qIGNhbGwgd2l0aCBzdWJzdHJlYW0gc3BpbmxvY2sgKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5NjhfYm9iX2luYyhlczE5NjhfdCAqY2hpcCwgaW50IGZyZXEpCit7CisJY2hpcC0+Ym9iY2xpZW50Kys7CisJaWYgKGNoaXAtPmJvYmNsaWVudCA9PSAxKSB7CisJCWNoaXAtPmJvYl9mcmVxID0gZnJlcTsKKwkJc25kX2VzMTk2OF9ib2Jfc3RhcnQoY2hpcCk7CisJfSBlbHNlIGlmIChjaGlwLT5ib2JfZnJlcSA8IGZyZXEpIHsKKwkJc25kX2VzMTk2OF9ib2Jfc3RvcChjaGlwKTsKKwkJY2hpcC0+Ym9iX2ZyZXEgPSBmcmVxOworCQlzbmRfZXMxOTY4X2JvYl9zdGFydChjaGlwKTsKKwl9Cit9CisKKy8qIGNhbGwgd2l0aCBzdWJzdHJlYW0gc3BpbmxvY2sgKi8KK3N0YXRpYyB2b2lkIHNuZF9lczE5NjhfYm9iX2RlYyhlczE5NjhfdCAqY2hpcCkKK3sKKwljaGlwLT5ib2JjbGllbnQtLTsKKwlpZiAoY2hpcC0+Ym9iY2xpZW50IDw9IDApCisJCXNuZF9lczE5NjhfYm9iX3N0b3AoY2hpcCk7CisJZWxzZSBpZiAoY2hpcC0+Ym9iX2ZyZXEgPiBFU01fQk9CX0ZSRVEpIHsKKwkJLyogY2hlY2sgcmVkdWN0aW9uIG9mIHRpbWVyIGZyZXF1ZW5jeSAqLworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQlpbnQgbWF4X2ZyZXEgPSBFU01fQk9CX0ZSRVE7CisJCWxpc3RfZm9yX2VhY2gocCwgJmNoaXAtPnN1YnN0cmVhbV9saXN0KSB7CisJCQllc3NjaGFuX3QgKmVzID0gbGlzdF9lbnRyeShwLCBlc3NjaGFuX3QsIGxpc3QpOworCQkJaWYgKG1heF9mcmVxIDwgZXMtPmJvYl9mcmVxKQorCQkJCW1heF9mcmVxID0gZXMtPmJvYl9mcmVxOworCQl9CisJCWlmIChtYXhfZnJlcSAhPSBjaGlwLT5ib2JfZnJlcSkgeworCQkJc25kX2VzMTk2OF9ib2Jfc3RvcChjaGlwKTsKKwkJCWNoaXAtPmJvYl9mcmVxID0gbWF4X2ZyZXE7CisJCQlzbmRfZXMxOTY4X2JvYl9zdGFydChjaGlwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorc25kX2VzMTk2OF9jYWxjX2JvYl9yYXRlKGVzMTk2OF90ICpjaGlwLCBlc3NjaGFuX3QgKmVzLAorCQkJIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCS8qIHdlIGFjcXVpcmUgNCBpbnRlcnJ1cHRzIHBlciBwZXJpb2QgZm9yIHByZWNpc2UgY29udHJvbC4uICovCisJaW50IGZyZXEgPSBydW50aW1lLT5yYXRlICogNDsKKwlpZiAoZXMtPmZtdCAmIEVTU19GTVRfU1RFUkVPKQorCQlmcmVxIDw8PSAxOworCWlmIChlcy0+Zm10ICYgRVNTX0ZNVF8xNkJJVCkKKwkJZnJlcSA8PD0gMTsKKwlmcmVxIC89IGVzLT5mcmFnX3NpemU7CisJaWYgKGZyZXEgPCBFU01fQk9CX0ZSRVEpCisJCWZyZXEgPSBFU01fQk9CX0ZSRVE7CisJZWxzZSBpZiAoZnJlcSA+IEVTTV9CT0JfRlJFUV9NQVgpCisJCWZyZXEgPSBFU01fQk9CX0ZSRVFfTUFYOworCXJldHVybiBmcmVxOworfQorCisKKy8qKioqKioqKioqKioqCisgKiAgUENNIFBhcnQgKgorICoqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIgc25kX2VzMTk2OF9jb21wdXRlX3JhdGUoZXMxOTY4X3QgKmNoaXAsIHUzMiBmcmVxKQoreworCXUzMiByYXRlID0gKGZyZXEgPDwgMTYpIC8gY2hpcC0+Y2xvY2s7CisjaWYgMCAvKiBYWFg6IGRvIHdlIG5lZWQgdGhpcz8gKi8gCisJaWYgKHJhdGUgPiAweDEwMDAwKQorCQlyYXRlID0gMHgxMDAwMDsKKyNlbmRpZgorCXJldHVybiByYXRlOworfQorCisvKiBnZXQgY3VycmVudCBwb2ludGVyICovCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGludAorc25kX2VzMTk2OF9nZXRfZG1hX3B0cihlczE5NjhfdCAqY2hpcCwgZXNzY2hhbl90ICplcykKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gYXB1X2dldF9yZWdpc3RlcihjaGlwLCBlcy0+YXB1WzBdLCA1KTsKKworCW9mZnNldCAtPSBlcy0+YmFzZVswXTsKKworCXJldHVybiAob2Zmc2V0ICYgMHhGRkZFKTsJLyogaGFyZHdhcmUgaXMgaW4gd29yZHMgKi8KK30KKworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9hcHVfc2V0X2ZyZXEoZXMxOTY4X3QgKmNoaXAsIGludCBhcHUsIGludCBmcmVxKQoreworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCAyLAorCQkJICAgKGFwdV9nZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCAyKSAmIDB4MDBGRikgfAorCQkJICAgKChmcmVxICYgMHhmZikgPDwgOCkgfCAweDEwKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgMywgZnJlcSA+PiA4KTsKK30KKworLyogc3BpbiBsb2NrIGhlbGQgKi8KK2lubGluZSBzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X3RyaWdnZXJfYXB1KGVzMTk2OF90ICplc20sIGludCBhcHUsIGludCBtb2RlKQoreworCS8qIHNldCB0aGUgQVBVIG1vZGUgKi8KKwlfX2FwdV9zZXRfcmVnaXN0ZXIoZXNtLCBhcHUsIDAsCisJCQkgICAoX19hcHVfZ2V0X3JlZ2lzdGVyKGVzbSwgYXB1LCAwKSAmIDB4ZmYwZikgfAorCQkJICAgKG1vZGUgPDwgNCkpOworfQorCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X3BjbV9zdGFydChlczE5NjhfdCAqY2hpcCwgZXNzY2hhbl90ICplcykKK3sKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlfX2FwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgZXMtPmFwdVswXSwgNSwgZXMtPmJhc2VbMF0pOworCXNuZF9lczE5NjhfdHJpZ2dlcl9hcHUoY2hpcCwgZXMtPmFwdVswXSwgZXMtPmFwdV9tb2RlWzBdKTsKKwlpZiAoZXMtPm1vZGUgPT0gRVNNX01PREVfQ0FQVFVSRSkgeworCQlfX2FwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgZXMtPmFwdVsyXSwgNSwgZXMtPmJhc2VbMl0pOworCQlzbmRfZXMxOTY4X3RyaWdnZXJfYXB1KGNoaXAsIGVzLT5hcHVbMl0sIGVzLT5hcHVfbW9kZVsyXSk7CisJfQorCWlmIChlcy0+Zm10ICYgRVNTX0ZNVF9TVEVSRU8pIHsKKwkJX19hcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGVzLT5hcHVbMV0sIDUsIGVzLT5iYXNlWzFdKTsKKwkJc25kX2VzMTk2OF90cmlnZ2VyX2FwdShjaGlwLCBlcy0+YXB1WzFdLCBlcy0+YXB1X21vZGVbMV0pOworCQlpZiAoZXMtPm1vZGUgPT0gRVNNX01PREVfQ0FQVFVSRSkgeworCQkJX19hcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGVzLT5hcHVbM10sIDUsIGVzLT5iYXNlWzNdKTsKKwkJCXNuZF9lczE5NjhfdHJpZ2dlcl9hcHUoY2hpcCwgZXMtPmFwdVszXSwgZXMtPmFwdV9tb2RlWzNdKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X3BjbV9zdG9wKGVzMTk2OF90ICpjaGlwLCBlc3NjaGFuX3QgKmVzKQoreworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXNuZF9lczE5NjhfdHJpZ2dlcl9hcHUoY2hpcCwgZXMtPmFwdVswXSwgMCk7CisJc25kX2VzMTk2OF90cmlnZ2VyX2FwdShjaGlwLCBlcy0+YXB1WzFdLCAwKTsKKwlpZiAoZXMtPm1vZGUgPT0gRVNNX01PREVfQ0FQVFVSRSkgeworCQlzbmRfZXMxOTY4X3RyaWdnZXJfYXB1KGNoaXAsIGVzLT5hcHVbMl0sIDApOworCQlzbmRfZXMxOTY4X3RyaWdnZXJfYXB1KGNoaXAsIGVzLT5hcHVbM10sIDApOworCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworfQorCisvKiBzZXQgdGhlIHdhdmVjYWNoZSBjb250cm9sIHJlZyAqLworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9wcm9ncmFtX3dhdmVjYWNoZShlczE5NjhfdCAqY2hpcCwgZXNzY2hhbl90ICplcywKKwkJCQkJIGludCBjaGFubmVsLCB1MzIgYWRkciwgaW50IGNhcHR1cmUpCit7CisJdTMyIHRtcHZhbCA9IChhZGRyIC0gMHgxMCkgJiAweEZGRjg7CisKKwlpZiAoISBjYXB0dXJlKSB7CisJCWlmICghKGVzLT5mbXQgJiBFU1NfRk1UXzE2QklUKSkKKwkJCXRtcHZhbCB8PSA0OwkvKiA4Yml0ICovCisJCWlmIChlcy0+Zm10ICYgRVNTX0ZNVF9TVEVSRU8pCisJCQl0bXB2YWwgfD0gMjsJLyogc3RlcmVvICovCisJfQorCisJLyogc2V0IHRoZSB3YXZlY2FjaGUgY29udHJvbCByZWcgKi8KKwl3YXZlX3NldF9yZWdpc3RlcihjaGlwLCBlcy0+YXB1W2NoYW5uZWxdIDw8IDMsIHRtcHZhbCk7CisKKyNpZmRlZiBDT05GSUdfUE0KKwllcy0+d2NfbWFwW2NoYW5uZWxdID0gdG1wdmFsOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9wbGF5YmFja19zZXR1cChlczE5NjhfdCAqY2hpcCwgZXNzY2hhbl90ICplcywKKwkJCQkgICAgICBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwl1MzIgcGE7CisJaW50IGhpZ2hfYXB1ID0gMDsKKwlpbnQgY2hhbm5lbCwgYXB1OworCWludCBpLCBzaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGZyZXE7CisKKwlzaXplID0gZXMtPmRtYV9zaXplID4+IGVzLT53YXZfc2hpZnQ7CisKKwlpZiAoZXMtPmZtdCAmIEVTU19GTVRfU1RFUkVPKQorCQloaWdoX2FwdSsrOworCisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBoaWdoX2FwdTsgY2hhbm5lbCsrKSB7CisJCWFwdSA9IGVzLT5hcHVbY2hhbm5lbF07CisKKwkJc25kX2VzMTk2OF9wcm9ncmFtX3dhdmVjYWNoZShjaGlwLCBlcywgY2hhbm5lbCwgZXMtPm1lbW9yeS0+YnVmLmFkZHIsIDApOworCisJCS8qIE9mZnNldCB0byBQQ01CQVIgKi8KKwkJcGEgPSBlcy0+bWVtb3J5LT5idWYuYWRkcjsKKwkJcGEgLT0gY2hpcC0+ZG1hLmFkZHI7CisJCXBhID4+PSAxOwkvKiB3b3JkcyAqLworCisJCXBhIHw9IDB4MDA0MDAwMDA7CS8qIFN5c3RlbSBSQU0gKEJpdCAyMikgKi8KKworCQlpZiAoZXMtPmZtdCAmIEVTU19GTVRfU1RFUkVPKSB7CisJCQkvKiBFbmFibGUgc3RlcmVvICovCisJCQlpZiAoY2hhbm5lbCkKKwkJCQlwYSB8PSAweDAwODAwMDAwOwkvKiAoQml0IDIzKSAqLworCQkJaWYgKGVzLT5mbXQgJiBFU1NfRk1UXzE2QklUKQorCQkJCXBhID4+PSAxOworCQl9CisKKwkJLyogYmFzZSBvZmZzZXQgb2YgZG1hIGNhbGNzIHdoZW4gcmVhZGluZyB0aGUgcG9pbnRlcgorCQkgICBvbiB0aGlzIGxlZnQgb25lICovCisJCWVzLT5iYXNlW2NoYW5uZWxdID0gcGEgJiAweEZGRkY7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgaSwgMHgwMDAwKTsKKworCQkvKiBMb2FkIHRoZSBidWZmZXIgaW50byB0aGUgd2F2ZSBlbmdpbmUgKi8KKwkJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDQsICgocGEgPj4gMTYpICYgMHhGRikgPDwgOCk7CisJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA1LCBwYSAmIDB4RkZGRik7CisJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA2LCAocGEgKyBzaXplKSAmIDB4RkZGRik7CisJCS8qIHNldHRpbmcgbG9vcCA9PSBzYW1wbGUgbGVuICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA3LCBzaXplKTsKKworCQkvKiBjbGVhciBlZmZlY3RzL2Vudi4uICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA4LCAweDAwMDApOworCQkvKiBzZXQgYW1wIG5vdyB0byAweGQwICg/KSwgbG93IGJ5dGUgaXMgJ2FtcGxpdHVkZSBkZXN0Jz8gKi8KKwkJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDksIDB4RDAwMCk7CisKKwkJLyogY2xlYXIgcm91dGluZyBzdHVmZiAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgMTEsIDB4MDAwMCk7CisJCS8qIGRtYSBvbiwgbm8gZW52ZWxvcGVzLCBmaWx0ZXIgdG8gYWxsIDFzKSAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgMCwgMHg0MDBGKTsKKworCQlpZiAoZXMtPmZtdCAmIEVTU19GTVRfMTZCSVQpCisJCQllcy0+YXB1X21vZGVbY2hhbm5lbF0gPSBFU01fQVBVXzE2QklUTElORUFSOworCQllbHNlCisJCQllcy0+YXB1X21vZGVbY2hhbm5lbF0gPSBFU01fQVBVXzhCSVRMSU5FQVI7CisKKwkJaWYgKGVzLT5mbXQgJiBFU1NfRk1UX1NURVJFTykgeworCQkJLyogc2V0IHBhbm5pbmc6IGxlZnQgb3IgcmlnaHQgKi8KKwkJCS8qIENoZWNrOiBkaWZmZXJlbnQgcGFubmluZy4gT24gbXkgQ2FueW9uIDNEIENoaXBzZXQgdGhlCisJCQkgICBDaGFubmVscyBhcmUgc3dhcHBlZC4gSSBkb24ndCBrbm93LCBhYm91dCB0aGUgb3V0cHV0CisJCQkgICB0byB0aGUgU1BEaWYgTGluay4gUGVyaGFwcyB5b3UgaGF2ZSB0byBjaGFuZ2UgdGhpcworCQkJICAgYW5kIG5vdCB0aGUgQVBVIFJlZ3MgNC01LiAqLworCQkJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDEwLAorCQkJCQkgMHg4RjAwIHwgKGNoYW5uZWwgPyAwIDogMHgxMCkpOworCQkJZXMtPmFwdV9tb2RlW2NoYW5uZWxdICs9IDE7CS8qIHN0ZXJlbyAqLworCQl9IGVsc2UKKwkJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCAxMCwgMHg4RjA4KTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkvKiBjbGVhciBXUCBpbnRlcnJ1cHRzICovCisJb3V0dygxLCBjaGlwLT5pb19wb3J0ICsgMHgwNCk7CisJLyogZW5hYmxlIFdQIGludHMgKi8KKwlvdXR3KGludyhjaGlwLT5pb19wb3J0ICsgRVNNX1BPUlRfSE9TVF9JUlEpIHwgRVNNX0hJUlFfRFNJRSwgY2hpcC0+aW9fcG9ydCArIEVTTV9QT1JUX0hPU1RfSVJRKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCisJZnJlcSA9IHJ1bnRpbWUtPnJhdGU7CisJLyogc2V0IGZyZXF1ZW5jeSAqLworCWlmIChmcmVxID4gNDgwMDApCisJCWZyZXEgPSA0ODAwMDsKKwlpZiAoZnJlcSA8IDQwMDApCisJCWZyZXEgPSA0MDAwOworCisJLyogaG1tbS4uICovCisJaWYgKCEoZXMtPmZtdCAmIEVTU19GTVRfMTZCSVQpICYmICEoZXMtPmZtdCAmIEVTU19GTVRfU1RFUkVPKSkKKwkJZnJlcSA+Pj0gMTsKKworCWZyZXEgPSBzbmRfZXMxOTY4X2NvbXB1dGVfcmF0ZShjaGlwLCBmcmVxKTsKKworCS8qIExvYWQgdGhlIGZyZXF1ZW5jeSwgdHVybiBvbiA2ZEIgKi8KKwlzbmRfZXMxOTY4X2FwdV9zZXRfZnJlcShjaGlwLCBlcy0+YXB1WzBdLCBmcmVxKTsKKwlzbmRfZXMxOTY4X2FwdV9zZXRfZnJlcShjaGlwLCBlcy0+YXB1WzFdLCBmcmVxKTsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X2NhcHR1cmVfYXB1KGVzMTk2OF90ICpjaGlwLCBlc3NjaGFuX3QgKmVzLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHBhLCB1bnNpZ25lZCBpbnQgYnNpemUsCisJCQkgICAgIGludCBtb2RlLCBpbnQgcm91dGUpCit7CisJaW50IGksIGFwdSA9IGVzLT5hcHVbY2hhbm5lbF07CisKKwllcy0+YXB1X21vZGVbY2hhbm5lbF0gPSBtb2RlOworCisJLyogc2V0IHRoZSB3YXZlY2FjaGUgY29udHJvbCByZWcgKi8KKwlzbmRfZXMxOTY4X3Byb2dyYW1fd2F2ZWNhY2hlKGNoaXAsIGVzLCBjaGFubmVsLCBwYSwgMSk7CisKKwkvKiBPZmZzZXQgdG8gUENNQkFSICovCisJcGEgLT0gY2hpcC0+ZG1hLmFkZHI7CisJcGEgPj49IDE7CS8qIHdvcmRzICovCisKKwkvKiBiYXNlIG9mZnNldCBvZiBkbWEgY2FsY3Mgd2hlbiByZWFkaW5nIHRoZSBwb2ludGVyCisJICAgb24gdGhpcyBsZWZ0IG9uZSAqLworCWVzLT5iYXNlW2NoYW5uZWxdID0gcGEgJiAweEZGRkY7CisJcGEgfD0gMHgwMDQwMDAwMDsJLyogYml0IDIyIC0+IFN5c3RlbSBSQU0gKi8KKworCS8qIEJlZ2luIGxvYWRpbmcgdGhlIEFQVSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgaSwgMHgwMDAwKTsKKworCS8qIG5lZWQgdG8gZW5hYmxlIHN1Ymdyb3Vwcy4uIGFuZCB3ZSBzaG91bGQgcHJvYmFibHkKKwkgICBoYXZlIGRpZmZlcmVudCBncm91cHMgZm9yIGRpZmZlcmVudCAvZGV2L2RzcHMuLiAgKi8KKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgMiwgMHg4KTsKKworCS8qIExvYWQgdGhlIGJ1ZmZlciBpbnRvIHRoZSB3YXZlIGVuZ2luZSAqLworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA0LCAoKHBhID4+IDE2KSAmIDB4RkYpIDw8IDgpOworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA1LCBwYSAmIDB4RkZGRik7CisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDYsIChwYSArIGJzaXplKSAmIDB4RkZGRik7CisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDcsIGJzaXplKTsKKwkvKiBjbGVhciBlZmZlY3RzL2Vudi4uICovCisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDgsIDB4MDBGMCk7CisJLyogYW1wbGl0dWRlIG5vdz8gIHN1cmUuICB3aHkgbm90LiAgKi8KKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgOSwgMHgwMDAwKTsKKwkvKiBzZXQgZmlsdGVyIHR1bmUsIHJhZGl1cywgcG9sYXIgcGFuICovCisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDEwLCAweDhGMDgpOworCS8qIHJvdXRlIGlucHV0ICovCisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDExLCByb3V0ZSk7CisJLyogZG1hIG9uLCBubyBlbnZlbG9wZXMsIGZpbHRlciB0byBhbGwgMXMpICovCisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDAsIDB4NDAwRik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lczE5NjhfY2FwdHVyZV9zZXR1cChlczE5NjhfdCAqY2hpcCwgZXNzY2hhbl90ICplcywKKwkJCQkgICAgIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCWludCBzaXplOworCXUzMiBmcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzaXplID0gZXMtPmRtYV9zaXplID4+IGVzLT53YXZfc2hpZnQ7CisKKwkvKiBBUFUgYXNzaWdubWVudHM6CisJICAgMCA9IG1vbm8vbGVmdCBTUkMKKwkgICAxID0gcmlnaHQgU1JDCisJICAgMiA9IG1vbm8vbGVmdCBJbnB1dCBNaXhlcgorCSAgIDMgPSByaWdodCBJbnB1dCBNaXhlcgorCSovCisJLyogZGF0YSBzZWVtcyB0byBmbG93IGZyb20gdGhlIGNvZGVjLCB0aHJvdWdoIGFuIGFwdSBpbnRvCisJICAgdGhlICdtaXhidWYnIGJpdCBvZiBwYWdlLCB0aGVuIHRocm91Z2ggdGhlIFNSQyBhcHUKKwkgICBhbmQgb3V0IHRvIHRoZSByZWFsICdidWZmZXInLiAgb2suICBzdXJlLiAgKi8KKworCS8qIGlucHV0IG1peGVyIChsZWZ0L21vbm8pICovCisJLyogcGFyYWxsZWwgaW4gY3JhcCwgc2VlIG1hZXN0cm8gcmVnIDB4QyBbOC0xMV0gKi8KKwlpbml0X2NhcHR1cmVfYXB1KGNoaXAsIGVzLCAyLAorCQkJIGVzLT5taXhidWYtPmJ1Zi5hZGRyLCBFU01fTUlYQlVGX1NJWkUvNCwgLyogaW4gd29yZHMgKi8KKwkJCSBFU01fQVBVX0lOUFVUTUlYRVIsIDB4MTQpOworCS8qIFNSQyAobGVmdC9tb25vKTsgZ2V0IGlucHV0IGZyb20gaW5wdXRpbmcgYXB1ICovCisJaW5pdF9jYXB0dXJlX2FwdShjaGlwLCBlcywgMCwgZXMtPm1lbW9yeS0+YnVmLmFkZHIsIHNpemUsCisJCQkgRVNNX0FQVV9TUkNPTlZFUlRPUiwgZXMtPmFwdVsyXSk7CisJaWYgKGVzLT5mbXQgJiBFU1NfRk1UX1NURVJFTykgeworCQkvKiBpbnB1dCBtaXhlciAocmlnaHQpICovCisJCWluaXRfY2FwdHVyZV9hcHUoY2hpcCwgZXMsIDMsCisJCQkJIGVzLT5taXhidWYtPmJ1Zi5hZGRyICsgRVNNX01JWEJVRl9TSVpFLzIsCisJCQkJIEVTTV9NSVhCVUZfU0laRS80LCAvKiBpbiB3b3JkcyAqLworCQkJCSBFU01fQVBVX0lOUFVUTUlYRVIsIDB4MTUpOworCQkvKiBTUkMgKHJpZ2h0KSAqLworCQlpbml0X2NhcHR1cmVfYXB1KGNoaXAsIGVzLCAxLAorCQkJCSBlcy0+bWVtb3J5LT5idWYuYWRkciArIHNpemUqMiwgc2l6ZSwKKwkJCQkgRVNNX0FQVV9TUkNPTlZFUlRPUiwgZXMtPmFwdVszXSk7CisJfQorCisJZnJlcSA9IHJ1bnRpbWUtPnJhdGU7CisJLyogU2FtcGxlIFJhdGUgY29udmVyc2lvbiBBUFVzIGRvbid0IGxpa2UgMHgxMDAwMCBmb3IgdGhlaXIgcmF0ZSAqLworCWlmIChmcmVxID4gNDc5OTkpCisJCWZyZXEgPSA0Nzk5OTsKKwlpZiAoZnJlcSA8IDQwMDApCisJCWZyZXEgPSA0MDAwOworCisJZnJlcSA9IHNuZF9lczE5NjhfY29tcHV0ZV9yYXRlKGNoaXAsIGZyZXEpOworCisJLyogTG9hZCB0aGUgZnJlcXVlbmN5LCB0dXJuIG9uIDZkQiAqLworCXNuZF9lczE5NjhfYXB1X3NldF9mcmVxKGNoaXAsIGVzLT5hcHVbMF0sIGZyZXEpOworCXNuZF9lczE5NjhfYXB1X3NldF9mcmVxKGNoaXAsIGVzLT5hcHVbMV0sIGZyZXEpOworCisJLyogZml4IG1peGVyIHJhdGUgYXQgNDhraHouICBhbmQgaXRzIF9tdXN0XyBiZSAweDEwMDAwLiAqLworCWZyZXEgPSAweDEwMDAwOworCXNuZF9lczE5NjhfYXB1X3NldF9mcmVxKGNoaXAsIGVzLT5hcHVbMl0sIGZyZXEpOworCXNuZF9lczE5NjhfYXB1X3NldF9mcmVxKGNoaXAsIGVzLT5hcHVbM10sIGZyZXEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJLyogY2xlYXIgV1AgaW50ZXJydXB0cyAqLworCW91dHcoMSwgY2hpcC0+aW9fcG9ydCArIDB4MDQpOworCS8qIGVuYWJsZSBXUCBpbnRzICovCisJb3V0dyhpbncoY2hpcC0+aW9fcG9ydCArIEVTTV9QT1JUX0hPU1RfSVJRKSB8IEVTTV9ISVJRX0RTSUUsIGNoaXAtPmlvX3BvcnQgKyBFU01fUE9SVF9IT1NUX0lSUSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioKKyAqICBBTFNBIEludGVyZmFjZSAqCisgKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzbmRfZXMxOTY4X3BjbV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllczE5NjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwllc3NjaGFuX3QgKmVzID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZXMtPmRtYV9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJZXMtPmZyYWdfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCisJZXMtPndhdl9zaGlmdCA9IDE7IC8qIG1hZXN0cm8gaGFuZGxlcyBhbHdheXMgMTZiaXQgKi8KKwllcy0+Zm10ID0gMDsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNikKKwkJZXMtPmZtdCB8PSBFU1NfRk1UXzE2QklUOworCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpIHsKKwkJZXMtPmZtdCB8PSBFU1NfRk1UX1NURVJFTzsKKwkJaWYgKGVzLT5mbXQgJiBFU1NfRk1UXzE2QklUKSAvKiA4Yml0IGlzIGFscmVhZHkgd29yZCBzaGlmdGVkICovCisJCQllcy0+d2F2X3NoaWZ0Kys7CisJfQorCWVzLT5ib2JfZnJlcSA9IHNuZF9lczE5NjhfY2FsY19ib2JfcmF0ZShjaGlwLCBlcywgcnVudGltZSk7CisKKwlzd2l0Y2ggKGVzLT5tb2RlKSB7CisJY2FzZSBFU01fTU9ERV9QTEFZOgorCQlzbmRfZXMxOTY4X3BsYXliYWNrX3NldHVwKGNoaXAsIGVzLCBydW50aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFU01fTU9ERV9DQVBUVVJFOgorCQlzbmRfZXMxOTY4X2NhcHR1cmVfc2V0dXAoY2hpcCwgZXMsIHJ1bnRpbWUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZXMxOTY4X3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwllczE5NjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllc3NjaGFuX3QgKmVzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2soJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWlmIChlcy0+cnVubmluZykKKwkJCWJyZWFrOworCQlzbmRfZXMxOTY4X2JvYl9pbmMoY2hpcCwgZXMtPmJvYl9mcmVxKTsKKwkJZXMtPmNvdW50ID0gMDsKKwkJZXMtPmh3cHRyID0gMDsKKwkJc25kX2VzMTk2OF9wY21fc3RhcnQoY2hpcCwgZXMpOworCQllcy0+cnVubmluZyA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCWlmICghIGVzLT5ydW5uaW5nKQorCQkJYnJlYWs7CisJCXNuZF9lczE5NjhfcGNtX3N0b3AoY2hpcCwgZXMpOworCQllcy0+cnVubmluZyA9IDA7CisJCXNuZF9lczE5NjhfYm9iX2RlYyhjaGlwKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZXMxOTY4X3BjbV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwllczE5NjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllc3NjaGFuX3QgKmVzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHB0cjsKKworCXB0ciA9IHNuZF9lczE5NjhfZ2V0X2RtYV9wdHIoY2hpcCwgZXMpIDw8IGVzLT53YXZfc2hpZnQ7CisJCisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0ciAlIGVzLT5kbWFfc2l6ZSk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2VzMTk2OF9wbGF5YmFjayA9IHsKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorICAgICAgICAgICAgICAgCQkgICAgICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIC8qU05EUlZfUENNX0lORk9fUEFVU0UgfCovCisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CTY1NTM2LAorCS5wZXJpb2RfYnl0ZXNfbWluID0JMjU2LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JNjU1MzYsCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZXMxOTY4X2NhcHR1cmUgPSB7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19OT05JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSAvKlNORFJWX1BDTV9JTkZPX1BBVVNFIHwqLworCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0JCS8qU05EUlZfUENNX0ZNVEJJVF9VOCB8Ki8gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JNjU1MzYsCisJLnBlcmlvZF9ieXRlc19taW4gPQkyNTYsCisJLnBlcmlvZF9ieXRlc19tYXggPQk2NTUzNiwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIERNQSBtZW1vcnkgbWFuYWdlbWVudCAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCZWNhdXNlIHRoZSBNYWVzdHJvIGNhbiBvbmx5IHRha2UgYWRkcmVzc2VzIHJlbGF0aXZlIHRvIHRoZSBQQ00gYmFzZSBhZGRyZXNzCisgICByZWdpc3RlciA6KCAqLworCitzdGF0aWMgaW50IGNhbGNfYXZhaWxhYmxlX21lbW9yeV9zaXplKGVzMTk2OF90ICpjaGlwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IG1heF9zaXplID0gMDsKKwkKKwlkb3duKCZjaGlwLT5tZW1vcnlfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2gocCwgJmNoaXAtPmJ1Zl9saXN0KSB7CisJCWVzbV9tZW1vcnlfdCAqYnVmID0gbGlzdF9lbnRyeShwLCBlc21fbWVtb3J5X3QsIGxpc3QpOworCQlpZiAoYnVmLT5lbXB0eSAmJiBidWYtPmJ1Zi5ieXRlcyA+IG1heF9zaXplKQorCQkJbWF4X3NpemUgPSBidWYtPmJ1Zi5ieXRlczsKKwl9CisJdXAoJmNoaXAtPm1lbW9yeV9tdXRleCk7CisJaWYgKG1heF9zaXplID49IDEyOCoxMDI0KQorCQltYXhfc2l6ZSA9IDEyNyoxMDI0OworCXJldHVybiBtYXhfc2l6ZTsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgbWVtb3J5IGNodW5rIHdpdGggdGhlIHNwZWNpZmllZCBzaXplICovCitzdGF0aWMgZXNtX21lbW9yeV90ICpzbmRfZXMxOTY4X25ld19tZW1vcnkoZXMxOTY4X3QgKmNoaXAsIGludCBzaXplKQoreworCWVzbV9tZW1vcnlfdCAqYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCisJc2l6ZSA9ICgoc2l6ZSArIEVTTV9NRU1fQUxJR04gLSAxKSAvIEVTTV9NRU1fQUxJR04pICogRVNNX01FTV9BTElHTjsKKwlkb3duKCZjaGlwLT5tZW1vcnlfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2gocCwgJmNoaXAtPmJ1Zl9saXN0KSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkocCwgZXNtX21lbW9yeV90LCBsaXN0KTsKKwkJaWYgKGJ1Zi0+ZW1wdHkgJiYgYnVmLT5idWYuYnl0ZXMgPj0gc2l6ZSkKKwkJCWdvdG8gX19mb3VuZDsKKwl9CisJdXAoJmNoaXAtPm1lbW9yeV9tdXRleCk7CisJcmV0dXJuIE5VTEw7CisKK19fZm91bmQ6CisJaWYgKGJ1Zi0+YnVmLmJ5dGVzID4gc2l6ZSkgeworCQllc21fbWVtb3J5X3QgKmNodW5rID0ga21hbGxvYyhzaXplb2YoKmNodW5rKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChjaHVuayA9PSBOVUxMKSB7CisJCQl1cCgmY2hpcC0+bWVtb3J5X211dGV4KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNodW5rLT5idWYgPSBidWYtPmJ1ZjsKKwkJY2h1bmstPmJ1Zi5ieXRlcyAtPSBzaXplOworCQljaHVuay0+YnVmLmFyZWEgKz0gc2l6ZTsKKwkJY2h1bmstPmJ1Zi5hZGRyICs9IHNpemU7CisJCWNodW5rLT5lbXB0eSA9IDE7CisJCWJ1Zi0+YnVmLmJ5dGVzID0gc2l6ZTsKKwkJbGlzdF9hZGQoJmNodW5rLT5saXN0LCAmYnVmLT5saXN0KTsKKwl9CisJYnVmLT5lbXB0eSA9IDA7CisJdXAoJmNoaXAtPm1lbW9yeV9tdXRleCk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogZnJlZSBhIG1lbW9yeSBjaHVuayAqLworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9mcmVlX21lbW9yeShlczE5NjhfdCAqY2hpcCwgZXNtX21lbW9yeV90ICpidWYpCit7CisJZXNtX21lbW9yeV90ICpjaHVuazsKKworCWRvd24oJmNoaXAtPm1lbW9yeV9tdXRleCk7CisJYnVmLT5lbXB0eSA9IDE7CisJaWYgKGJ1Zi0+bGlzdC5wcmV2ICE9ICZjaGlwLT5idWZfbGlzdCkgeworCQljaHVuayA9IGxpc3RfZW50cnkoYnVmLT5saXN0LnByZXYsIGVzbV9tZW1vcnlfdCwgbGlzdCk7CisJCWlmIChjaHVuay0+ZW1wdHkpIHsKKwkJCWNodW5rLT5idWYuYnl0ZXMgKz0gYnVmLT5idWYuYnl0ZXM7CisJCQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKKwkJCWtmcmVlKGJ1Zik7CisJCQlidWYgPSBjaHVuazsKKwkJfQorCX0KKwlpZiAoYnVmLT5saXN0Lm5leHQgIT0gJmNoaXAtPmJ1Zl9saXN0KSB7CisJCWNodW5rID0gbGlzdF9lbnRyeShidWYtPmxpc3QubmV4dCwgZXNtX21lbW9yeV90LCBsaXN0KTsKKwkJaWYgKGNodW5rLT5lbXB0eSkgeworCQkJYnVmLT5idWYuYnl0ZXMgKz0gY2h1bmstPmJ1Zi5ieXRlczsKKwkJCWxpc3RfZGVsKCZjaHVuay0+bGlzdCk7CisJCQlrZnJlZShjaHVuayk7CisJCX0KKwl9CisJdXAoJmNoaXAtPm1lbW9yeV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9lczE5NjhfZnJlZV9kbWFidWYoZXMxOTY4X3QgKmNoaXApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghIGNoaXAtPmRtYS5hcmVhKQorCQlyZXR1cm47CisJc25kX2RtYV9yZXNlcnZlX2J1ZigmY2hpcC0+ZG1hLCBzbmRfZG1hX3BjaV9idWZfaWQoY2hpcC0+cGNpKSk7CisJd2hpbGUgKChwID0gY2hpcC0+YnVmX2xpc3QubmV4dCkgIT0gJmNoaXAtPmJ1Zl9saXN0KSB7CisJCWVzbV9tZW1vcnlfdCAqY2h1bmsgPSBsaXN0X2VudHJ5KHAsIGVzbV9tZW1vcnlfdCwgbGlzdCk7CisJCWxpc3RfZGVsKHApOworCQlrZnJlZShjaHVuayk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX2VzMTk2OF9pbml0X2RtYWJ1ZihlczE5NjhfdCAqY2hpcCkKK3sKKwlpbnQgZXJyOworCWVzbV9tZW1vcnlfdCAqY2h1bms7CisKKwljaGlwLT5kbWEuZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJY2hpcC0+ZG1hLmRldi5kZXYgPSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSk7CisJaWYgKCEgc25kX2RtYV9nZXRfcmVzZXJ2ZWRfYnVmKCZjaGlwLT5kbWEsIHNuZF9kbWFfcGNpX2J1Zl9pZChjaGlwLT5wY2kpKSkgeworCQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzX2ZhbGxiYWNrKFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCSAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJCSAgIGNoaXAtPnRvdGFsX2J1ZnNpemUsICZjaGlwLT5kbWEpOworCQlpZiAoZXJyIDwgMCB8fCAhIGNoaXAtPmRtYS5hcmVhKSB7CisJCQlzbmRfcHJpbnRrKCJlczE5Njg6IGNhbid0IGFsbG9jYXRlIGRtYSBwYWdlcyBmb3Igc2l6ZSAlZFxuIiwKKwkJCQkgICBjaGlwLT50b3RhbF9idWZzaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICgoY2hpcC0+ZG1hLmFkZHIgKyBjaGlwLT5kbWEuYnl0ZXMgLSAxKSAmIH4oKDEgPDwgMjgpIC0gMSkpIHsKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+ZG1hKTsKKwkJCXNuZF9wcmludGsoImVzMTk2ODogRE1BIGJ1ZmZlciBiZXlvbmQgMjU2TUIuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmJ1Zl9saXN0KTsKKwkvKiBhbGxvY2F0ZSBhbiBlbXB0eSBjaHVuayAqLworCWNodW5rID0ga21hbGxvYyhzaXplb2YoKmNodW5rKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNodW5rID09IE5VTEwpIHsKKwkJc25kX2VzMTk2OF9mcmVlX2RtYWJ1ZihjaGlwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChjaGlwLT5kbWEuYXJlYSwgMCwgRVNNX01FTV9BTElHTik7CisJY2h1bmstPmJ1ZiA9IGNoaXAtPmRtYTsKKwljaHVuay0+YnVmLmFyZWEgKz0gRVNNX01FTV9BTElHTjsKKwljaHVuay0+YnVmLmFkZHIgKz0gRVNNX01FTV9BTElHTjsKKwljaHVuay0+YnVmLmJ5dGVzIC09IEVTTV9NRU1fQUxJR047CisJY2h1bmstPmVtcHR5ID0gMTsKKwlsaXN0X2FkZCgmY2h1bmstPmxpc3QsICZjaGlwLT5idWZfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0dXAgdGhlIGRtYV9hcmVhcyAqLworLyogYnVmZmVyIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBjaHVuayAqLworc3RhdGljIGludCBzbmRfZXMxOTY4X2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJc25kX3BjbV9od19wYXJhbXNfdCAqaHdfcGFyYW1zKQoreworCWVzMTk2OF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVzc2NoYW5fdCAqY2hhbiA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgc2l6ZSA9IHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKTsKKworCWlmIChjaGFuLT5tZW1vcnkpIHsKKwkJaWYgKGNoYW4tPm1lbW9yeS0+YnVmLmJ5dGVzID49IHNpemUpIHsKKwkJCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IHNpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzbmRfZXMxOTY4X2ZyZWVfbWVtb3J5KGNoaXAsIGNoYW4tPm1lbW9yeSk7CisJfQorCWNoYW4tPm1lbW9yeSA9IHNuZF9lczE5NjhfbmV3X21lbW9yeShjaGlwLCBzaXplKTsKKwlpZiAoY2hhbi0+bWVtb3J5ID09IE5VTEwpIHsKKwkJLy8gc25kX3ByaW50ZCgiY2Fubm90IGFsbG9jYXRlIGRtYSBidWZmZXI6IHNpemUgPSAlZFxuIiwgc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZjaGFuLT5tZW1vcnktPmJ1Zik7CisJcmV0dXJuIDE7IC8qIGFyZWEgd2FzIGNoYW5nZWQgKi8KK30KKworLyogcmVtb3ZlIGRtYSBhcmVhcyBpZiBhbGxvY2F0ZWQgKi8KK3N0YXRpYyBpbnQgc25kX2VzMTk2OF9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZXMxOTY4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZXNzY2hhbl90ICpjaGFuOworCQorCWlmIChydW50aW1lLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJY2hhbiA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hhbi0+bWVtb3J5KSB7CisJCXNuZF9lczE5NjhfZnJlZV9tZW1vcnkoY2hpcCwgY2hhbi0+bWVtb3J5KTsKKwkJY2hhbi0+bWVtb3J5ID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGFsbG9jYXRlIEFQVSBwYWlyCisgKi8KK3N0YXRpYyBpbnQgc25kX2VzMTk2OF9hbGxvY19hcHVfcGFpcihlczE5NjhfdCAqY2hpcCwgaW50IHR5cGUpCit7CisJaW50IGFwdTsKKworCWZvciAoYXB1ID0gMDsgYXB1IDwgTlJfQVBVUzsgYXB1ICs9IDIpIHsKKwkJaWYgKGNoaXAtPmFwdVthcHVdID09IEVTTV9BUFVfRlJFRSAmJgorCQkgICAgY2hpcC0+YXB1W2FwdSArIDFdID09IEVTTV9BUFVfRlJFRSkgeworCQkJY2hpcC0+YXB1W2FwdV0gPSBjaGlwLT5hcHVbYXB1ICsgMV0gPSB0eXBlOworCQkJcmV0dXJuIGFwdTsKKwkJfQorCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCisvKgorICogcmVsZWFzZSBBUFUgcGFpcgorICovCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X2ZyZWVfYXB1X3BhaXIoZXMxOTY4X3QgKmNoaXAsIGludCBhcHUpCit7CisJY2hpcC0+YXB1W2FwdV0gPSBjaGlwLT5hcHVbYXB1ICsgMV0gPSBFU01fQVBVX0ZSRUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKgorICogUENNIG9wZW4vY2xvc2UgKgorICoqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzbmRfZXMxOTY4X3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWVzMTk2OF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVzc2NoYW5fdCAqZXM7CisJaW50IGFwdTE7CisKKwkvKiBzZWFyY2ggMiBBUFVzICovCisJYXB1MSA9IHNuZF9lczE5NjhfYWxsb2NfYXB1X3BhaXIoY2hpcCwgRVNNX0FQVV9QQ01fUExBWSk7CisJaWYgKGFwdTEgPCAwKQorCQlyZXR1cm4gYXB1MTsKKworCWVzID0ga2NhbGxvYygxLCBzaXplb2YoKmVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcykgeworCQlzbmRfZXMxOTY4X2ZyZWVfYXB1X3BhaXIoY2hpcCwgYXB1MSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVzLT5hcHVbMF0gPSBhcHUxOworCWVzLT5hcHVbMV0gPSBhcHUxICsgMTsKKwllcy0+YXB1X21vZGVbMF0gPSAwOworCWVzLT5hcHVfbW9kZVsxXSA9IDA7CisJZXMtPnJ1bm5pbmcgPSAwOworCWVzLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJZXMtPm1vZGUgPSBFU01fTU9ERV9QTEFZOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXM7CisJcnVudGltZS0+aHcgPSBzbmRfZXMxOTY4X3BsYXliYWNrOworCXJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXggPSBydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4ID0KKwkJY2FsY19hdmFpbGFibGVfbWVtb3J5X3NpemUoY2hpcCk7CisjaWYgMAorCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCisJCQkJICAgMTAyNCk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CisJbGlzdF9hZGQoJmVzLT5saXN0LCAmY2hpcC0+c3Vic3RyZWFtX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+c3Vic3RyZWFtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VzMTk2OF9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWVzMTk2OF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWVzc2NoYW5fdCAqZXM7CisJaW50IGFwdTEsIGFwdTI7CisKKwlhcHUxID0gc25kX2VzMTk2OF9hbGxvY19hcHVfcGFpcihjaGlwLCBFU01fQVBVX1BDTV9DQVBUVVJFKTsKKwlpZiAoYXB1MSA8IDApCisJCXJldHVybiBhcHUxOworCWFwdTIgPSBzbmRfZXMxOTY4X2FsbG9jX2FwdV9wYWlyKGNoaXAsIEVTTV9BUFVfUENNX1JBVEVDT05WKTsKKwlpZiAoYXB1MiA8IDApIHsKKwkJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdTEpOworCQlyZXR1cm4gYXB1MjsKKwl9CisJCisJZXMgPSBrY2FsbG9jKDEsIHNpemVvZigqZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVzKSB7CisJCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUxKTsKKwkJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdTIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcy0+YXB1WzBdID0gYXB1MTsKKwllcy0+YXB1WzFdID0gYXB1MSArIDE7CisJZXMtPmFwdVsyXSA9IGFwdTI7CisJZXMtPmFwdVszXSA9IGFwdTIgKyAxOworCWVzLT5hcHVfbW9kZVswXSA9IDA7CisJZXMtPmFwdV9tb2RlWzFdID0gMDsKKwllcy0+YXB1X21vZGVbMl0gPSAwOworCWVzLT5hcHVfbW9kZVszXSA9IDA7CisJZXMtPnJ1bm5pbmcgPSAwOworCWVzLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJZXMtPm1vZGUgPSBFU01fTU9ERV9DQVBUVVJFOworCisJLyogZ2V0IG1peGJ1ZmZlciAqLworCWlmICgoZXMtPm1peGJ1ZiA9IHNuZF9lczE5NjhfbmV3X21lbW9yeShjaGlwLCBFU01fTUlYQlVGX1NJWkUpKSA9PSBOVUxMKSB7CisJCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUxKTsKKwkJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdTIpOworCQlrZnJlZShlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKwltZW1zZXQoZXMtPm1peGJ1Zi0+YnVmLmFyZWEsIDAsIEVTTV9NSVhCVUZfU0laRSk7CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlczsKKwlydW50aW1lLT5odyA9IHNuZF9lczE5NjhfY2FwdHVyZTsKKwlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21heCA9CisJCWNhbGNfYXZhaWxhYmxlX21lbW9yeV9zaXplKGNoaXApIC0gMTAyNDsgLyoga2VlcCBNSVhCVUYgc2l6ZSAqLworI2lmIDAKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQkJCSAgIDEwMjQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+c3Vic3RyZWFtX2xvY2spOworCWxpc3RfYWRkKCZlcy0+bGlzdCwgJmNoaXAtPnN1YnN0cmVhbV9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5NjhfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwllczE5NjhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwllc3NjaGFuX3QgKmVzOworCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCWVzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+c3Vic3RyZWFtX2xvY2spOworCWxpc3RfZGVsKCZlcy0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CisJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGVzLT5hcHVbMF0pOworCWtmcmVlKGVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5NjhfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWVzMTk2OF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWVzc2NoYW5fdCAqZXM7CisKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZXMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CisJbGlzdF9kZWwoJmVzLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKKwlzbmRfZXMxOTY4X2ZyZWVfbWVtb3J5KGNoaXAsIGVzLT5taXhidWYpOworCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBlcy0+YXB1WzBdKTsKKwlzbmRfZXMxOTY4X2ZyZWVfYXB1X3BhaXIoY2hpcCwgZXMtPmFwdVsyXSk7CisJa2ZyZWUoZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lczE5NjhfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9lczE5NjhfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZXMxOTY4X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfZXMxOTY4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9lczE5NjhfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9lczE5NjhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfZXMxOTY4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2VzMTk2OF9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9lczE5NjhfY2FwdHVyZV9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2VzMTk2OF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2VzMTk2OF9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfZXMxOTY4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9lczE5NjhfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9lczE5NjhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfZXMxOTY4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2VzMTk2OF9wY21fcG9pbnRlciwKK307CisKKworLyoKKyAqIG1lYXN1cmUgY2xvY2sKKyAqLworI2RlZmluZSBDTE9DS19NRUFTVVJFX0JVRlNJWkUJMTY3NjgJLyogZW5vdWdoIGxhcmdlIGZvciBhIHNpbmdsZSBzaG90ICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlczE5NjhfbWVhc3VyZV9jbG9jayhlczE5NjhfdCAqY2hpcCkKK3sKKwlpbnQgaSwgYXB1OworCXVuc2lnbmVkIGludCBwYSwgb2Zmc2V0LCB0OworCWVzbV9tZW1vcnlfdCAqbWVtb3J5OworCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RpbWUsIHN0b3BfdGltZTsKKworCWlmIChjaGlwLT5jbG9jayA9PSAwKQorCQljaGlwLT5jbG9jayA9IDQ4MDAwOyAvKiBkZWZhdWx0IGNsb2NrIHZhbHVlICovCisKKwkvKiBzZWFyY2ggMiBBUFVzIChhbHRob3VnaCBvbmUgYXB1IGlzIGVub3VnaCkgKi8KKwlpZiAoKGFwdSA9IHNuZF9lczE5NjhfYWxsb2NfYXB1X3BhaXIoY2hpcCwgRVNNX0FQVV9QQ01fUExBWSkpIDwgMCkgeworCQlzbmRfcHJpbnRrKCJIbW0sIGNhbm5vdCBmaW5kIGVtcHR5IEFQVSBwYWlyIT9cbiIpOworCQlyZXR1cm47CisJfQorCWlmICgobWVtb3J5ID0gc25kX2VzMTk2OF9uZXdfbWVtb3J5KGNoaXAsIENMT0NLX01FQVNVUkVfQlVGU0laRSkpID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygiY2Fubm90IGFsbG9jYXRlIGRtYSBidWZmZXIgLSB1c2luZyBkZWZhdWx0IGNsb2NrICVkXG4iLCBjaGlwLT5jbG9jayk7CisJCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KG1lbW9yeS0+YnVmLmFyZWEsIDAsIENMT0NLX01FQVNVUkVfQlVGU0laRSk7CisKKwl3YXZlX3NldF9yZWdpc3RlcihjaGlwLCBhcHUgPDwgMywgKG1lbW9yeS0+YnVmLmFkZHIgLSAweDEwKSAmIDB4ZmZmOCk7CisKKwlwYSA9ICh1bnNpZ25lZCBpbnQpKChtZW1vcnktPmJ1Zi5hZGRyIC0gY2hpcC0+ZG1hLmFkZHIpID4+IDEpOworCXBhIHw9IDB4MDA0MDAwMDA7CS8qIFN5c3RlbSBSQU0gKEJpdCAyMikgKi8KKworCS8qIGluaXRpYWxpemUgYXB1ICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCBpLCAweDAwMDApOworCisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDAsIDB4NDAwZik7CisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDQsICgocGEgPj4gMTYpICYgMHhmZikgPDwgOCk7CisJYXB1X3NldF9yZWdpc3RlcihjaGlwLCBhcHUsIDUsIHBhICYgMHhmZmZmKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgNiwgKHBhICsgQ0xPQ0tfTUVBU1VSRV9CVUZTSVpFLzIpICYgMHhmZmZmKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgNywgQ0xPQ0tfTUVBU1VSRV9CVUZTSVpFLzIpOworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA4LCAweDAwMDApOworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCA5LCAweEQwMDApOworCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgYXB1LCAxMCwgMHg4RjA4KTsKKwlhcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgMTEsIDB4MDAwMCk7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCW91dHcoMSwgY2hpcC0+aW9fcG9ydCArIDB4MDQpOyAvKiBjbGVhciBXUCBpbnRlcnJ1cHRzICovCisJb3V0dyhpbncoY2hpcC0+aW9fcG9ydCArIEVTTV9QT1JUX0hPU1RfSVJRKSB8IEVTTV9ISVJRX0RTSUUsIGNoaXAtPmlvX3BvcnQgKyBFU01fUE9SVF9IT1NUX0lSUSk7IC8qIGVuYWJsZSBXUCBpbnRzICovCisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlzbmRfZXMxOTY4X2FwdV9zZXRfZnJlcShjaGlwLCBhcHUsICgodW5zaWduZWQgaW50KTQ4MDAwIDw8IDE2KSAvIGNoaXAtPmNsb2NrKTsgLyogNDgwMDAgSHogKi8KKworCWNoaXAtPmluX21lYXN1cmVtZW50ID0gMTsKKwljaGlwLT5tZWFzdXJlX2FwdSA9IGFwdTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJc25kX2VzMTk2OF9ib2JfaW5jKGNoaXAsIEVTTV9CT0JfRlJFUSk7CisJX19hcHVfc2V0X3JlZ2lzdGVyKGNoaXAsIGFwdSwgNSwgcGEgJiAweGZmZmYpOworCXNuZF9lczE5NjhfdHJpZ2dlcl9hcHUoY2hpcCwgYXB1LCBFU01fQVBVXzE2QklUTElORUFSKTsKKwlkb19nZXR0aW1lb2ZkYXkoJnN0YXJ0X3RpbWUpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMjApOyAvKiA1MCBtc2VjICovCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCW9mZnNldCA9IF9fYXB1X2dldF9yZWdpc3RlcihjaGlwLCBhcHUsIDUpOworCWRvX2dldHRpbWVvZmRheSgmc3RvcF90aW1lKTsKKwlzbmRfZXMxOTY4X3RyaWdnZXJfYXB1KGNoaXAsIGFwdSwgMCk7IC8qIHN0b3AgKi8KKwlzbmRfZXMxOTY4X2JvYl9kZWMoY2hpcCk7CisJY2hpcC0+aW5fbWVhc3VyZW1lbnQgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJLyogY2hlY2sgdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KKwlvZmZzZXQgLT0gKHBhICYgMHhmZmZmKTsKKwlvZmZzZXQgJj0gMHhmZmZlOworCW9mZnNldCArPSBjaGlwLT5tZWFzdXJlX2NvdW50ICogKENMT0NLX01FQVNVUkVfQlVGU0laRS8yKTsKKworCXQgPSBzdG9wX3RpbWUudHZfc2VjIC0gc3RhcnRfdGltZS50dl9zZWM7CisJdCAqPSAxMDAwMDAwOworCWlmIChzdG9wX3RpbWUudHZfdXNlYyA8IHN0YXJ0X3RpbWUudHZfdXNlYykKKwkJdCAtPSBzdGFydF90aW1lLnR2X3VzZWMgLSBzdG9wX3RpbWUudHZfdXNlYzsKKwllbHNlCisJCXQgKz0gc3RvcF90aW1lLnR2X3VzZWMgLSBzdGFydF90aW1lLnR2X3VzZWM7CisJaWYgKHQgPT0gMCkgeworCQlzbmRfcHJpbnRrKCI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKKwl9IGVsc2UgeworCQlvZmZzZXQgKj0gMTAwMDsKKwkJb2Zmc2V0ID0gKG9mZnNldCAvIHQpICogMTAwMCArICgob2Zmc2V0ICUgdCkgKiAxMDAwKSAvIHQ7CisJCWlmIChvZmZzZXQgPCA0NzUwMCB8fCBvZmZzZXQgPiA0ODUwMCkgeworCQkJaWYgKG9mZnNldCA+PSA0MDAwMCAmJiBvZmZzZXQgPD0gNTAwMDApCisJCQkJY2hpcC0+Y2xvY2sgPSAoY2hpcC0+Y2xvY2sgKiBvZmZzZXQpIC8gNDgwMDA7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXMxOTY4OiBjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+Y2xvY2spOworCX0KKwlzbmRfZXMxOTY4X2ZyZWVfbWVtb3J5KGNoaXAsIG1lbW9yeSk7CisJc25kX2VzMTk2OF9mcmVlX2FwdV9wYWlyKGNoaXAsIGFwdSk7Cit9CisKKworLyoKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWVzMTk2OF90ICplc20gPSBwY20tPnByaXZhdGVfZGF0YTsKKwlzbmRfZXMxOTY4X2ZyZWVfZG1hYnVmKGVzbSk7CisJZXNtLT5wY20gPSBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX2VzMTk2OF9wY20oZXMxOTY4X3QgKmNoaXAsIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCS8qIGdldCBETUEgYnVmZmVyICovCisJaWYgKChlcnIgPSBzbmRfZXMxOTY4X2luaXRfZG1hYnVmKGNoaXApKSA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBzZXQgUENNQkFSICovCisJd2F2ZV9zZXRfcmVnaXN0ZXIoY2hpcCwgMHgwMUZDLCBjaGlwLT5kbWEuYWRkciA+PiAxMik7CisJd2F2ZV9zZXRfcmVnaXN0ZXIoY2hpcCwgMHgwMUZELCBjaGlwLT5kbWEuYWRkciA+PiAxMik7CisJd2F2ZV9zZXRfcmVnaXN0ZXIoY2hpcCwgMHgwMUZFLCBjaGlwLT5kbWEuYWRkciA+PiAxMik7CisJd2F2ZV9zZXRfcmVnaXN0ZXIoY2hpcCwgMHgwMUZGLCBjaGlwLT5kbWEuYWRkciA+PiAxMik7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJFU1MgTWFlc3RybyIsIGRldmljZSwKKwkJCSAgICAgICBjaGlwLT5wbGF5YmFja19zdHJlYW1zLAorCQkJICAgICAgIGNoaXAtPmNhcHR1cmVfc3RyZWFtcywgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9lczE5NjhfcGNtX2ZyZWU7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2VzMTk2OF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9lczE5NjhfY2FwdHVyZV9vcHMpOworCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKworCXN0cmNweShwY20tPm5hbWUsICJFU1MgTWFlc3RybyIpOworCisJY2hpcC0+cGNtID0gcGNtOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1cGRhdGUgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X3VwZGF0ZV9wY20oZXMxOTY4X3QgKmNoaXAsIGVzc2NoYW5fdCAqZXMpCit7CisJdW5zaWduZWQgaW50IGh3cHRyOworCXVuc2lnbmVkIGludCBkaWZmOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMgPSBlcy0+c3Vic3RyZWFtOworICAgICAgICAKKwlpZiAoc3VicyA9PSBOVUxMIHx8ICFlcy0+cnVubmluZykKKwkJcmV0dXJuOworCisJaHdwdHIgPSBzbmRfZXMxOTY4X2dldF9kbWFfcHRyKGNoaXAsIGVzKSA8PCBlcy0+d2F2X3NoaWZ0OworCWh3cHRyICU9IGVzLT5kbWFfc2l6ZTsKKworCWRpZmYgPSAoZXMtPmRtYV9zaXplICsgaHdwdHIgLSBlcy0+aHdwdHIpICUgZXMtPmRtYV9zaXplOworCisJZXMtPmh3cHRyID0gaHdwdHI7CisJZXMtPmNvdW50ICs9IGRpZmY7CisKKwlpZiAoZXMtPmNvdW50ID4gZXMtPmZyYWdfc2l6ZSkgeworCQlzcGluX3VubG9jaygmY2hpcC0+c3Vic3RyZWFtX2xvY2spOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnMpOworCQlzcGluX2xvY2soJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKKwkJZXMtPmNvdW50ICU9IGVzLT5mcmFnX3NpemU7CisJfQorfQorCisvKgorICovCitzdGF0aWMgdm9pZCBlczE5NjhfdXBkYXRlX2h3X3ZvbHVtZSh1bnNpZ25lZCBsb25nIHByaXZhdGVfZGF0YSkKK3sKKwllczE5NjhfdCAqY2hpcCA9IChlczE5NjhfdCAqKSBwcml2YXRlX2RhdGE7CisJaW50IHgsIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRmlndXJlIG91dCB3aGljaCB2b2x1bWUgY29udHJvbCBidXR0b24gd2FzIHB1c2hlZCwKKwkgICBiYXNlZCBvbiBkaWZmZXJlbmNlcyBmcm9tIHRoZSBkZWZhdWx0IHJlZ2lzdGVyCisJICAgdmFsdWVzLiAqLworCXggPSBpbmIoY2hpcC0+aW9fcG9ydCArIDB4MWMpOworCS8qIFJlc2V0IHRoZSB2b2x1bWUgY29udHJvbCByZWdpc3RlcnMuICovCisJb3V0YigweDg4LCBjaGlwLT5pb19wb3J0ICsgMHgxYyk7CisJb3V0YigweDg4LCBjaGlwLT5pb19wb3J0ICsgMHgxZCk7CisJb3V0YigweDg4LCBjaGlwLT5pb19wb3J0ICsgMHgxZSk7CisJb3V0YigweDg4LCBjaGlwLT5pb19wb3J0ICsgMHgxZik7CisKKwlpZiAoY2hpcC0+aW5fc3VzcGVuZCkKKwkJcmV0dXJuOworCisJaWYgKCEgY2hpcC0+bWFzdGVyX3N3aXRjaCB8fCAhIGNoaXAtPm1hc3Rlcl92b2x1bWUpCisJCXJldHVybjsKKworCS8qIEZJWE1FOiB3ZSBjYW4ndCBjYWxsIHNuZF9hYzk3XyogZnVuY3Rpb25zIHNpbmNlIGhlcmUgaXMgaW4gdGFza2xldC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7CisJdmFsID0gY2hpcC0+YWM5Ny0+cmVnc1tBQzk3X01BU1RFUl07CisJaWYgKHggJiAxKSB7CisJCS8qIG11dGUgKi8KKwkJdmFsIF49IDB4ODAwMDsKKwkJY2hpcC0+YWM5Ny0+cmVnc1tBQzk3X01BU1RFUl0gPSB2YWw7CisJCW91dHcodmFsLCBjaGlwLT5pb19wb3J0ICsgRVNNX0FDOTdfREFUQSk7CisJCW91dGIoQUM5N19NQVNURVIsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCk7CisJCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZjaGlwLT5tYXN0ZXJfc3dpdGNoLT5pZCk7CisJfSBlbHNlIHsKKwkJdmFsICY9IDB4N2ZmZjsKKwkJaWYgKCgoeD4+MSkgJiA3KSA+IDQpIHsKKwkJCS8qIHZvbHVtZSB1cCAqLworCQkJaWYgKCh2YWwgJiAweGZmKSA+IDApCisJCQkJdmFsLS07CisJCQlpZiAoKHZhbCAmIDB4ZmYwMCkgPiAwKQorCQkJCXZhbCAtPSAweDAxMDA7CisJCX0gZWxzZSB7CisJCQkvKiB2b2x1bWUgZG93biAqLworCQkJaWYgKCh2YWwgJiAweGZmKSA8IDB4MWYpCisJCQkJdmFsKys7CisJCQlpZiAoKHZhbCAmIDB4ZmYwMCkgPCAweDFmMDApCisJCQkJdmFsICs9IDB4MDEwMDsKKwkJfQorCQljaGlwLT5hYzk3LT5yZWdzW0FDOTdfTUFTVEVSXSA9IHZhbDsKKwkJb3V0dyh2YWwsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19EQVRBKTsKKwkJb3V0YihBQzk3X01BU1RFUiwgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0lOREVYKTsKKwkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmNoaXAtPm1hc3Rlcl92b2x1bWUtPmlkKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2VzMTk2OF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwllczE5NjhfdCAqY2hpcCA9IGRldl9pZDsKKwl1MzIgZXZlbnQ7CisKKwlpZiAoIShldmVudCA9IGluYihjaGlwLT5pb19wb3J0ICsgMHgxQSkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlvdXR3KGludyhjaGlwLT5pb19wb3J0ICsgNCkgJiAxLCBjaGlwLT5pb19wb3J0ICsgNCk7CisKKwlpZiAoZXZlbnQgJiBFU01fSFdWT0xfSVJRKQorCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjaGlwLT5od3ZvbF90cSk7IC8qIHdlJ2xsIGRvIHRoaXMgbGF0ZXIgKi8KKworCS8qIGVsc2UgYWNrICdlbSBhbGwsIGkgaW1hZ2luZSAqLworCW91dGIoMHhGRiwgY2hpcC0+aW9fcG9ydCArIDB4MUEpOworCisJaWYgKChldmVudCAmIEVTTV9NUFU0MDFfSVJRKSAmJiBjaGlwLT5ybWlkaSkgeworCQlzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KGlycSwgY2hpcC0+cm1pZGktPnByaXZhdGVfZGF0YSwgcmVncyk7CisJfQorCisJaWYgKGV2ZW50ICYgRVNNX1NPVU5EX0lSUSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQlzcGluX2xvY2soJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+c3Vic3RyZWFtX2xpc3QpIHsKKwkJCWVzc2NoYW5fdCAqZXMgPSBsaXN0X2VudHJ5KHAsIGVzc2NoYW5fdCwgbGlzdCk7CisJCQlpZiAoZXMtPnJ1bm5pbmcpCisJCQkJc25kX2VzMTk2OF91cGRhdGVfcGNtKGNoaXAsIGVzKTsKKwkJfQorCQlzcGluX3VubG9jaygmY2hpcC0+c3Vic3RyZWFtX2xvY2spOworCQlpZiAoY2hpcC0+aW5fbWVhc3VyZW1lbnQpIHsKKwkJCXVuc2lnbmVkIGludCBjdXJwID0gX19hcHVfZ2V0X3JlZ2lzdGVyKGNoaXAsIGNoaXAtPm1lYXN1cmVfYXB1LCA1KTsKKwkJCWlmIChjdXJwIDwgY2hpcC0+bWVhc3VyZV9sYXN0cG9zKQorCQkJCWNoaXAtPm1lYXN1cmVfY291bnQrKzsKKwkJCWNoaXAtPm1lYXN1cmVfbGFzdHBvcyA9IGN1cnA7CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgTWl4ZXIgc3R1ZmYKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX2VzMTk2OF9taXhlcihlczE5NjhfdCAqY2hpcCkKK3sKKwlhYzk3X2J1c190ICpwYnVzOworCWFjOTdfdGVtcGxhdGVfdCBhYzk3OworCXNuZF9jdGxfZWxlbV9pZF90IGlkOworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX2VzMTk2OF9hYzk3X3dyaXRlLAorCQkucmVhZCA9IHNuZF9lczE5NjhfYWM5N19yZWFkLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjaGlwLT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwYnVzLT5ub192cmEgPSAxOyAvKiBFUzE5NjggZG9lc24ndCBuZWVkIFZSQSAqLworCisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIGF0dGFjaCBtYXN0ZXIgc3dpdGNoIC8gdm9sdW1lcyBmb3IgaC93IHZvbHVtZSBjb250cm9sICovCisJbWVtc2V0KCZpZCwgMCwgc2l6ZW9mKGlkKSk7CisJaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoaWQubmFtZSwgIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giKTsKKwljaGlwLT5tYXN0ZXJfc3dpdGNoID0gc25kX2N0bF9maW5kX2lkKGNoaXAtPmNhcmQsICZpZCk7CisJbWVtc2V0KCZpZCwgMCwgc2l6ZW9mKGlkKSk7CisJaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlzdHJjcHkoaWQubmFtZSwgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiKTsKKwljaGlwLT5tYXN0ZXJfdm9sdW1lID0gc25kX2N0bF9maW5kX2lkKGNoaXAtPmNhcmQsICZpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlc2V0IGFjOTcgY29kZWMKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X2FjOTdfcmVzZXQoZXMxOTY4X3QgKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBjaGlwLT5pb19wb3J0OworCisJdW5zaWduZWQgc2hvcnQgc2F2ZV9yaW5nYnVzX2E7CisJdW5zaWduZWQgc2hvcnQgc2F2ZV82ODsKKwl1bnNpZ25lZCBzaG9ydCB3OworCXVuc2lnbmVkIGludCB2ZW5kOworCisJLyogc2F2ZSBjb25maWd1cmF0aW9uICovCisJc2F2ZV9yaW5nYnVzX2EgPSBpbncoaW9hZGRyICsgMHgzNik7CisKKwkvL291dHcoaW53KGlvYWRkciArIDB4MzgpICYgMHhmZmZjLCBpb2FkZHIgKyAweDM4KTsgLyogY2xlYXIgc2Vjb25kIGNvZGVjIGlkPyAqLworCS8qIHNldCBjb21tYW5kL3N0YXR1cyBhZGRyZXNzIGkvbyB0byAxc3QgY29kZWMgKi8KKwlvdXR3KGludyhpb2FkZHIgKyAweDNhKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYSk7CisJb3V0dyhpbncoaW9hZGRyICsgMHgzYykgJiAweGZmZmMsIGlvYWRkciArIDB4M2MpOworCisJLyogZGlzYWJsZSBhYyBsaW5rICovCisJb3V0dygweDAwMDAsIGlvYWRkciArIDB4MzYpOworCXNhdmVfNjggPSBpbncoaW9hZGRyICsgMHg2OCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCAweDU4LCAmdyk7CS8qIHNvbWV0aGluZyBtYWdpY2FsIHdpdGggZ3BpbyBhbmQgYnVzIGFyYi4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2hpcC0+cGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnZlbmQpOworCWlmICh3ICYgMSkKKwkJc2F2ZV82OCB8PSAweDEwOworCW91dHcoMHhmZmZlLCBpb2FkZHIgKyAweDY0KTsJLyogdW5tYXNrIGdwaW8gMCAqLworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyAweDY4KTsJLyogZ3BpbyB3cml0ZSAqLworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDYwKTsJLyogd3JpdGUgMCB0byBncGlvIDAgKi8KKwl1ZGVsYXkoMjApOworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyAweDYwKTsJLyogd3JpdGUgMSB0byBncGlvIDEgKi8KKwliaWdfbWRlbGF5KDIwKTsKKworCW91dHcoc2F2ZV82OCB8IDB4MSwgaW9hZGRyICsgMHg2OCk7CS8qIG5vdyByZXN0b3JlIC4uICovCisJb3V0dygoaW53KGlvYWRkciArIDB4MzgpICYgMHhmZmZjKSB8IDB4MSwgaW9hZGRyICsgMHgzOCk7CisJb3V0dygoaW53KGlvYWRkciArIDB4M2EpICYgMHhmZmZjKSB8IDB4MSwgaW9hZGRyICsgMHgzYSk7CisJb3V0dygoaW53KGlvYWRkciArIDB4M2MpICYgMHhmZmZjKSB8IDB4MSwgaW9hZGRyICsgMHgzYyk7CisKKwkvKiBub3cgdGhlIHNlY29uZCBjb2RlYyAqLworCS8qIGRpc2FibGUgYWMgbGluayAqLworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDM2KTsKKwlvdXR3KDB4ZmZmNywgaW9hZGRyICsgMHg2NCk7CS8qIHVubWFzayBncGlvIDMgKi8KKwlzYXZlXzY4ID0gaW53KGlvYWRkciArIDB4NjgpOworCW91dHcoMHgwMDA5LCBpb2FkZHIgKyAweDY4KTsJLyogZ3BpbyB3cml0ZSAwICYgMyA/PyAqLworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyAweDYwKTsJLyogd3JpdGUgMSB0byBncGlvICovCisJdWRlbGF5KDIwKTsKKwlvdXR3KDB4MDAwOSwgaW9hZGRyICsgMHg2MCk7CS8qIHdyaXRlIDkgdG8gZ3BpbyAqLworCWJpZ19tZGVsYXkoNTAwKTsKKwkvL291dHcoaW53KGlvYWRkciArIDB4MzgpICYgMHhmZmZjLCBpb2FkZHIgKyAweDM4KTsKKwlvdXR3KGludyhpb2FkZHIgKyAweDNhKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYSk7CisJb3V0dyhpbncoaW9hZGRyICsgMHgzYykgJiAweGZmZmMsIGlvYWRkciArIDB4M2MpOworCisjaWYgMAkJCQkvKiB0aGUgbG9vcCBoZXJlIG5lZWRzIHRvIGJlIG11Y2ggYmV0dGVyIGlmIHdlIHdhbnQgaXQuLiAqLworCXNuZF9wcmludGsoInRyeWluZyBzb2Z0d2FyZSByZXNldFxuIik7CisJLyogdHJ5IGFuZCBkbyBhIHNvZnR3YXJlIHJlc2V0ICovCisJb3V0YigweDgwIHwgMHg3YywgaW9hZGRyICsgMHgzMCk7CisJZm9yICh3ID0gMDs7IHcrKykgeworCQlpZiAoKGludyhpb2FkZHIgKyAweDMwKSAmIDEpID09IDApIHsKKwkJCWlmIChpbmIoaW9hZGRyICsgMHgzMikgIT0gMCkKKwkJCQlicmVhazsKKworCQkJb3V0YigweDgwIHwgMHg3ZCwgaW9hZGRyICsgMHgzMCk7CisJCQlpZiAoKChpbncoaW9hZGRyICsgMHgzMCkgJiAxKSA9PSAwKQorCQkJICAgICYmIChpbmIoaW9hZGRyICsgMHgzMikgIT0gMCkpCisJCQkJYnJlYWs7CisJCQlvdXRiKDB4ODAgfCAweDdmLCBpb2FkZHIgKyAweDMwKTsKKwkJCWlmICgoKGludyhpb2FkZHIgKyAweDMwKSAmIDEpID09IDApCisJCQkgICAgJiYgKGluYihpb2FkZHIgKyAweDMyKSAhPSAwKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh3ID4gMTAwMDApIHsKKwkJCW91dGIoaW5iKGlvYWRkciArIDB4MzcpIHwgMHgwOCwgaW9hZGRyICsgMHgzNyk7CS8qIGRvIGEgc29mdHdhcmUgcmVzZXQgKi8KKwkJCWJpZ19tZGVsYXkoNTAwKTsJLyogb2ggbXkuLiAqLworCQkJb3V0YihpbmIoaW9hZGRyICsgMHgzNykgJiB+MHgwOCwKKwkJCQlpb2FkZHIgKyAweDM3KTsKKwkJCXVkZWxheSgxKTsKKwkJCW91dHcoMHg4MCwgaW9hZGRyICsgMHgzMCk7CisJCQlmb3IgKHcgPSAwOyB3IDwgMTAwMDA7IHcrKykgeworCQkJCWlmICgoaW53KGlvYWRkciArIDB4MzApICYgMSkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlpZiAodmVuZCA9PSBORUNfVkVSU0FfU1VCSUQxIHx8IHZlbmQgPT0gTkVDX1ZFUlNBX1NVQklEMikgeworCQkvKiB0dXJuIG9uIGV4dGVybmFsIGFtcD8gKi8KKwkJb3V0dygweGY5ZmYsIGlvYWRkciArIDB4NjQpOworCQlvdXR3KGludyhpb2FkZHIgKyAweDY4KSB8IDB4NjAwLCBpb2FkZHIgKyAweDY4KTsKKwkJb3V0dygweDAyMDksIGlvYWRkciArIDB4NjApOworCX0KKworCS8qIHJlc3RvcmUuLiAqLworCW91dHcoc2F2ZV9yaW5nYnVzX2EsIGlvYWRkciArIDB4MzYpOworCisJLyogVHVybiBvbiB0aGUgOTc4IGRvY2tpbmcgY2hpcC4KKwkgICBGaXJzdCBmcm9iIHRoZSAibWFzdGVyIG91dHB1dCBlbmFibGUiIGJpdCwKKwkgICB0aGVuIHNldCBtb3N0IG9mIHRoZSBwbGF5YmFjayB2b2x1bWUgY29udHJvbCByZWdpc3RlcnMgdG8gbWF4LiAqLworCW91dGIoaW5iKGlvYWRkcisweGMwKXwoMTw8NSksIGlvYWRkcisweGMwKTsKKwlvdXRiKDB4ZmYsIGlvYWRkcisweGMzKTsKKwlvdXRiKDB4ZmYsIGlvYWRkcisweGM0KTsKKwlvdXRiKDB4ZmYsIGlvYWRkcisweGM2KTsKKwlvdXRiKDB4ZmYsIGlvYWRkcisweGM4KTsKKwlvdXRiKDB4M2YsIGlvYWRkcisweGNmKTsKKwlvdXRiKDB4M2YsIGlvYWRkcisweGQwKTsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9yZXNldChlczE5NjhfdCAqY2hpcCkKK3sKKwkvKiBSZXNldCAqLworCW91dHcoRVNNX1JFU0VUX01BRVNUUk8gfCBFU01fUkVTRVRfRElSRUNUU09VTkQsCisJICAgICBjaGlwLT5pb19wb3J0ICsgRVNNX1BPUlRfSE9TVF9JUlEpOworCXVkZWxheSgxMCk7CisJb3V0dygweDAwMDAsIGNoaXAtPmlvX3BvcnQgKyBFU01fUE9SVF9IT1NUX0lSUSk7CisJdWRlbGF5KDEwKTsKK30KKworLyoKKyAqIHBvd2VyIG1hbmFnZW1lbnQKKyAqLworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9zZXRfYWNwaShlczE5NjhfdCAqY2hpcCwgaW50IHN0YXRlKQoreworCXUxNiBhY3RpdmVfbWFzayA9IGFjcGlfc3RhdGVfbWFza1tzdGF0ZV07CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgc3RhdGUpOworCS8qIG1ha2Ugc3VyZSB0aGUgdW5pdHMgd2UgY2FyZSBhYm91dCBhcmUgb24gCisJCVhYWCB3ZSBtaWdodCB3YW50IHRvIGRvIHRoaXMgYmVmb3JlIHN0YXRlIGZsaXBwaW5nPyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIDB4NTQsIH4gYWN0aXZlX21hc2spOworCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIDB4NTYsIH4gYWN0aXZlX21hc2spOworfQorCisKKy8qCisgKiBpbml0aWFsaXplIG1hZXN0cm8gY2hpcAorICovCitzdGF0aWMgdm9pZCBzbmRfZXMxOTY4X2NoaXBfaW5pdChlczE5NjhfdCAqY2hpcCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gY2hpcC0+cGNpOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlICA9IGNoaXAtPmlvX3BvcnQ7CisJdTE2IHc7CisJdTMyIG47CisKKwkvKiBXZSB1c2VkIHRvIG11Y2sgYXJvdW5kIHdpdGggcGNpIGNvbmZpZyBzcGFjZSB0aGF0CisJICogd2UgaGFkIG5vIGJ1c2luZXNzIG1lc3Npbmcgd2l0aC4gIFdlIGRvbid0IGtub3cgZW5vdWdoCisJICogYWJvdXQgdGhlIG1hY2hpbmUgdG8ga25vdyB3aGljaCBETUEgbW9kZSBpcyBhcHByb3ByaWF0ZSwgCisJICogZXRjLiAgV2Ugd2VyZSBndWVzc2luZyB3cm9uZyBvbiBzb21lIG1hY2hpbmVzIGFuZCBtYWtpbmcKKwkgKiB0aGVtIHVuaGFwcHkuICBXZSBub3cgdHJ1c3QgaW4gdGhlIEJJT1MgdG8gZG8gdGhpbmdzIHJpZ2h0LAorCSAqIHdoaWNoIGFsbW9zdCBjZXJ0YWlubHkgbWVhbnMgYSBuZXcgaG9zdCBvZiBwcm9ibGVtcyB3aWxsCisJICogYXJpc2Ugd2l0aCBicm9rZW4gQklPUyBpbXBsZW1lbnRhdGlvbnMuICBzY3JldyAnZW0uIAorCSAqIFdlJ3JlIGFscmVhZHkgaW50b2xlcmFudCBvZiBtYWNoaW5lcyB0aGF0IGRvbid0IGFzc2lnbgorCSAqIElSUXMuCisJICovCisJCisJLyogZG8gY29uZmlnIHdvcmsgYXQgZnVsbCBwb3dlciAqLworCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMCk7CisKKwkvKiBDb25maWcgUmVnIEEgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIEVTTV9DT05GSUdfQSwgJncpOworCisJLyogICAgICBVc2UgVERNQSBmb3Igbm93LiBURE1BIHdvcmtzIG9uIGFsbCBib2FyZHMsIHNvIHdoaWxlIGl0cworCSAqICAgICAgbm90IHRoZSBtb3N0IGVmZmljaWVudCBpdHMgdGhlIHNpbXBsZXN0LiAqLworCXcgJj0gfkRNQV9DTEVBUjsJLyogQ2xlYXIgRE1BIGJpdHMgKi8KKwl3IHw9IERNQV9URE1BOwkJLyogVERNQSBvbiAqLworCXcgJj0gfihQSUNfU05PT1AxIHwgUElDX1NOT09QMik7CS8qIENsZWFyIFBpYyBTbm9vcCBNb2RlIEJpdHMgKi8KKwl3ICY9IH5TQUZFR1VBUkQ7CS8qIFNhZmVndWFyZCBvZmYgKi8KKwl3IHw9IFBPU1RfV1JJVEU7CS8qIFBvc3RlZCB3cml0ZSAqLworCXcgfD0gSVNBX1RJTUlORzsJLyogSVNBIHRpbWluZyBvbiAqLworCS8qIFhYWCBodWg/ICBjbGFpbXMgdG8gYmUgcmVzZXJ2ZWQuLiAqLworCXcgJj0gflNXQVBfTFI7CQkvKiBzd2FwIGxlZnQvcmlnaHQgCisJCQkJICAgc2VlbXMgdG8gb25seSBoYXZlIGVmZmVjdCBvbiBTQgorCQkJCSAgIEVtdWxhdGlvbiAqLworCXcgJj0gflNVQlRSX0RFQ09ERTsJLyogU3VidHJhY3RpdmUgZGVjb2RlIG9mZiAqLworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgRVNNX0NPTkZJR19BLCB3KTsKKworCS8qIENvbmZpZyBSZWcgQiAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBFU01fQ09ORklHX0IsICZ3KTsKKworCXcgJj0gfigxIDw8IDE1KTsJLyogVHVybiBvZmYgaW50ZXJuYWwgY2xvY2sgbXVsdGlwbGllciAqLworCS8qIFhYWCBob3cgZG8gd2Uga25vdyB3aGljaCB0byB1c2U/ICovCisJdyAmPSB+KDEgPDwgMTQpOwkvKiBFeHRlcm5hbCBjbG9jayAqLworCisJdyAmPSB+U1BESUZfQ09ORkI7CS8qIGRpc2FibGUgUy9QRElGIG91dHB1dCAqLworCXcgfD0gSFdWX0NPTkZCOwkJLyogSFdWIG9uICovCisJdyB8PSBERUJPVU5DRTsJCS8qIERlYm91bmNlIG9mZjogZWFzaWVyIHRvIHB1c2ggdGhlIEhXIGJ1dHRvbnMgKi8KKwl3ICY9IH5HUElPX0NPTkZCOwkvKiBHUElPIDQ6NSAqLworCXcgfD0gQ0hJX0NPTkZCOwkJLyogRGlzY29ubmVjdCBmcm9tIHRoZSBDSEkuICBFbmFibGluZyB0aGlzIG1hZGUgYSBkZWxsIDc1MDAgd29yay4gKi8KKwl3ICY9IH5JRE1BX0NPTkZCOwkvKiBJRE1BIG9mZiAodW5kb2N1bWVudGVkKSAqLworCXcgJj0gfk1JRElfRklYOwkJLyogTUlESSBmaXggb2ZmICh1bmRvYykgKi8KKwl3ICY9IH4oMSA8PCAxKTsJCS8qIHJlc2VydmVkLCBhbHdheXMgd3JpdGUgMCAqLworCXcgJj0gfklSUV9UT19JU0E7CS8qIElSUSB0byBJU0Egb2ZmICh1bmRvYykgKi8KKworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIEVTTV9DT05GSUdfQiwgdyk7CisKKwkvKiBERE1BIG9mZiAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBFU01fRERNQSwgJncpOworCXcgJj0gfigxIDw8IDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIEVTTV9ERE1BLCB3KTsKKworCS8qCisJICoJTGVnYWN5IG1vZGUKKwkgKi8KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgRVNNX0xFR0FDWV9BVURJT19DT05UUk9MLCAmdyk7CisKKwl3ICY9IH5FU1NfRU5BQkxFX0FVRElPOwkvKiBEaXNhYmxlIExlZ2FjeSBBdWRpbyAqLworCXcgJj0gfkVTU19FTkFCTEVfU0VSSUFMX0lSUTsJLyogRGlzYWJsZSBTSVJRICovCisJdyAmPSB+KDB4MWYpOwkJLyogZGlzYWJsZSBtcHUgaXJxL2lvLCBnYW1lIHBvcnQsIGZtLCBTQiAqLworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgRVNNX0xFR0FDWV9BVURJT19DT05UUk9MLCB3KTsKKworCS8qIFNldCB1cCA5NzggZG9ja2luZyBjb250cm9sIGNoaXAuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCAweDU4LCAmdyk7CisJd3w9MTw8MjsJLyogRW5hYmxlIDk3OC4gKi8KKwl3fD0xPDwzOwkvKiBUdXJuIG9uIDk3OCBoYXJkd2FyZSB2b2x1bWUgY29udHJvbC4gKi8KKwl3Jj1+KDE8PDExKTsJLyogVHVybiBvbiA5NzggbWl4ZXIgdm9sdW1lIGNvbnRyb2wuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgMHg1OCwgdyk7CisJCisJLyogU291bmQgUmVzZXQgKi8KKworCXNuZF9lczE5NjhfcmVzZXQoY2hpcCk7CisKKwkvKgorCSAqCVJpbmcgQnVzIFNldHVwCisJICovCisKKwkvKiBzZXR1cCB1c3VhbCAweDM0IHN0dWZmLi4gMHgzNiBtYXkgYmUgY2hpcCBzcGVjaWZpYyAqLworCW91dHcoMHhDMDkwLCBpb2Jhc2UgKyBFU01fUklOR19CVVNfREVTVCk7IC8qIGRpcmVjdCBzb3VuZCwgc3RlcmVvICovCisJdWRlbGF5KDIwKTsKKwlvdXR3KDB4MzAwMCwgaW9iYXNlICsgRVNNX1JJTkdfQlVTX0NPTlRSX0EpOyAvKiBlbmFibGUgcmluZ2J1cy9zZXJpYWwgKi8KKwl1ZGVsYXkoMjApOworCisJLyoKKwkgKglSZXNldCB0aGUgQ09ERUMKKwkgKi8KKwkgCisJc25kX2VzMTk2OF9hYzk3X3Jlc2V0KGNoaXApOworCisJLyogUmluZyBCdXMgQ29udHJvbCBCICovCisKKwluID0gaW5sKGlvYmFzZSArIEVTTV9SSU5HX0JVU19DT05UUl9CKTsKKwluICY9IH5SSU5HQl9FTl9TUERJRjsJLyogU1BESUYgb2ZmICovCisJLy93IHw9IFJJTkdCX0VOXzJDT0RFQzsJLyogZW5hYmxlIDJuZCBjb2RlYyAqLworCW91dGwobiwgaW9iYXNlICsgRVNNX1JJTkdfQlVTX0NPTlRSX0IpOworCisJLyogU2V0IGhhcmR3YXJlIHZvbHVtZSBjb250cm9sIHJlZ2lzdGVycyB0byBtaWRwb2ludHMuCisJICAgV2UgY2FuIHRlbGwgd2hpY2ggYnV0dG9uIHdhcyBwdXNoZWQgYmFzZWQgb24gaG93IHRoZXkgY2hhbmdlLiAqLworCW91dGIoMHg4OCwgaW9iYXNlKzB4MWMpOworCW91dGIoMHg4OCwgaW9iYXNlKzB4MWQpOworCW91dGIoMHg4OCwgaW9iYXNlKzB4MWUpOworCW91dGIoMHg4OCwgaW9iYXNlKzB4MWYpOworCisJLyogaXQgYXBwZWFycyBzb21lIG1hZXN0cm9zIChkZWxsIDc1MDApIG9ubHkgd29yayBpZiB0aGVzZSBhcmUgc2V0LAorCSAgIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIHdlIHVzZSB0aGUgYXNzcCBvciBub3QuICovCisKKwlvdXRiKDAsIGlvYmFzZSArIEFTU1BfQ09OVFJPTF9CKTsKKwlvdXRiKDMsIGlvYmFzZSArIEFTU1BfQ09OVFJPTF9BKTsJLyogTTogUmVzZXJ2ZWQgYml0cy4uLiAqLworCW91dGIoMCwgaW9iYXNlICsgQVNTUF9DT05UUk9MX0MpOwkvKiBNOiBEaXNhYmxlIEFTU1AsIEFTU1AgSVJRJ3MgYW5kIEZNIFBvcnQgKi8KKworCS8qCisJICogc2V0IHVwIHdhdmVjYWNoZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCS8qIFdyaXRlIDAgaW50byB0aGUgYnVmZmVyIGFyZWEgMHgxRTAtPjFFRiAqLworCQlvdXR3KDB4MDFFMCArIGksIGlvYmFzZSArIFdDX0lOREVYKTsKKwkJb3V0dygweDAwMDAsIGlvYmFzZSArIFdDX0RBVEEpOworCisJCS8qIFRoZSAxLjEwIHRlc3QgcHJvZ3JhbSBzZWVtIHRvIHdyaXRlIDAgaW50byB0aGUgYnVmZmVyIGFyZWEKKwkJICogMHgxRDAtMHgxREYgdG9vLiovCisJCW91dHcoMHgwMUQwICsgaSwgaW9iYXNlICsgV0NfSU5ERVgpOworCQlvdXR3KDB4MDAwMCwgaW9iYXNlICsgV0NfREFUQSk7CisJfQorCXdhdmVfc2V0X3JlZ2lzdGVyKGNoaXAsIElEUjdfV0FWRV9ST01SQU0sCisJCQkgICh3YXZlX2dldF9yZWdpc3RlcihjaGlwLCBJRFI3X1dBVkVfUk9NUkFNKSAmIDB4RkYwMCkpOworCXdhdmVfc2V0X3JlZ2lzdGVyKGNoaXAsIElEUjdfV0FWRV9ST01SQU0sCisJCQkgIHdhdmVfZ2V0X3JlZ2lzdGVyKGNoaXAsIElEUjdfV0FWRV9ST01SQU0pIHwgMHgxMDApOworCXdhdmVfc2V0X3JlZ2lzdGVyKGNoaXAsIElEUjdfV0FWRV9ST01SQU0sCisJCQkgIHdhdmVfZ2V0X3JlZ2lzdGVyKGNoaXAsIElEUjdfV0FWRV9ST01SQU0pICYgfjB4MjAwKTsKKwl3YXZlX3NldF9yZWdpc3RlcihjaGlwLCBJRFI3X1dBVkVfUk9NUkFNLAorCQkJICB3YXZlX2dldF9yZWdpc3RlcihjaGlwLCBJRFI3X1dBVkVfUk9NUkFNKSB8IH4weDQwMCk7CisKKworCW1hZXN0cm9fd3JpdGUoY2hpcCwgSURSMl9DUkFNX0RBVEEsIDB4MDAwMCk7CisJLyogTm93IGJhY2sgdG8gdGhlIERpcmVjdFNvdW5kIHN0dWZmICovCisJLyogYXVkaW8gc2VyaWFsIGNvbmZpZ3VyYXRpb24uLiA/ICovCisJbWFlc3Ryb193cml0ZShjaGlwLCAweDA4LCAweEIwMDQpOworCW1hZXN0cm9fd3JpdGUoY2hpcCwgMHgwOSwgMHgwMDFCKTsKKwltYWVzdHJvX3dyaXRlKGNoaXAsIDB4MEEsIDB4ODAwMCk7CisJbWFlc3Ryb193cml0ZShjaGlwLCAweDBCLCAweDNGMzcpOworCW1hZXN0cm9fd3JpdGUoY2hpcCwgMHgwQywgMHgwMDk4KTsKKworCS8qIHBhcmFsbGVsIGluLCBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggcmVjb3JkaW5nIDopICovCisJbWFlc3Ryb193cml0ZShjaGlwLCAweDBDLAorCQkgICAgICAobWFlc3Ryb19yZWFkKGNoaXAsIDB4MEMpICYgfjB4RjAwMCkgfCAweDgwMDApOworCS8qIHBhcmFsbGVsIG91dCAqLworCW1hZXN0cm9fd3JpdGUoY2hpcCwgMHgwQywKKwkJICAgICAgKG1hZXN0cm9fcmVhZChjaGlwLCAweDBDKSAmIH4weDBGMDApIHwgMHgwNTAwKTsKKworCW1hZXN0cm9fd3JpdGUoY2hpcCwgMHgwRCwgMHg3NjMyKTsKKworCS8qIFdhdmUgY2FjaGUgY29udHJvbCBvbiAtIHRlc3Qgb2ZmLCBzZyBvZmYsIAorCSAgIGVuYWJsZSwgZW5hYmxlIGV4dHJhIGNoYW5zIDFNYiAqLworCisJdyA9IGludyhpb2Jhc2UgKyBXQ19DT05UUk9MKTsKKworCXcgJj0gfjB4RkEwMDsJCS8qIFNlZW1zIHRvIGJlIHJlc2VydmVkPyBJIGRvbid0IGtub3cgKi8KKwl3IHw9IDB4QTAwMDsJCS8qIHJlc2VydmVkLi4uIEkgZG9uJ3Qga25vdyAqLworCXcgJj0gfjB4MDIwMDsJCS8qIENoYW5uZWxzIDU2LDU3LDU4LDU5IGFzIEV4dHJhIFBsYXksUmVjIENoYW5uZWwgZW5hYmxlCisJCQkJICAgU2VlbXMgdG8gY3Jhc2ggdGhlIENvbXB1dGVyIGlmIGVuYWJsZWQuLi4gKi8KKwl3IHw9IDB4MDEwMDsJCS8qIFdhdmUgQ2FjaGUgT3BlcmF0aW9uIEVuYWJsZWQgKi8KKwl3IHw9IDB4MDA4MDsJCS8qIENoYW5uZWxzIDYwLzYxIGFzIFBsYWNiYWNrL1JlY29yZCBlbmFibGVkICovCisJdyAmPSB+MHgwMDYwOwkJLyogQ2xlYXIgV2F2dGFibGUgU2l6ZSAqLworCXcgfD0gMHgwMDIwOwkJLyogV2F2ZXRhYmxlIFNpemUgOiAxTUIgKi8KKwkvKiBCaXQgNCBpcyByZXNlcnZlZCAqLworCXcgJj0gfjB4MDAwQzsJCS8qIERNQSBTdHVmZj8gSSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgdGhlIGRhdGFzaGVldCBtZWFucyAqLworCS8qIEJpdCAxIGlzIHJlc2VydmVkICovCisJdyAmPSB+MHgwMDAxOwkJLyogVGVzdCBNb2RlIG9mZiAqLworCisJb3V0dyh3LCBpb2Jhc2UgKyBXQ19DT05UUk9MKTsKKworCS8qIE5vdyBjbGVhciB0aGUgQVBVIGNvbnRyb2wgcmFtICovCisJZm9yIChpID0gMDsgaSA8IE5SX0FQVVM7IGkrKykgeworCQlmb3IgKHcgPSAwOyB3IDwgTlJfQVBVX1JFR1M7IHcrKykKKwkJCWFwdV9zZXRfcmVnaXN0ZXIoY2hpcCwgaSwgdywgMCk7CisKKwl9Cit9CisKKy8qIEVuYWJsZSBJUlEncyAqLworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9zdGFydF9pcnEoZXMxOTY4X3QgKmNoaXApCit7CisJdW5zaWduZWQgc2hvcnQgdzsKKwl3ID0gRVNNX0hJUlFfRFNJRSB8IEVTTV9ISVJRX0hXX1ZPTFVNRTsKKwlpZiAoY2hpcC0+cm1pZGkpCisJCXcgfD0gRVNNX0hJUlFfTVBVNDAxOworCW91dHcodywgY2hpcC0+aW9fcG9ydCArIEVTTV9QT1JUX0hPU1RfSVJRKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIFBNIHN1cHBvcnQKKyAqLworc3RhdGljIGludCBlczE5Njhfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJZXMxOTY4X3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisKKwlpZiAoISBjaGlwLT5kb19wbSkKKwkJcmV0dXJuIDA7CisKKwljaGlwLT5pbl9zdXNwZW5kID0gMTsKKwlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKwlzbmRfZXMxOTY4X2JvYl9zdG9wKGNoaXApOworCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMyk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMxOTY4X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWVzMTk2OF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoISBjaGlwLT5kb19wbSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXN0b3JlIGFsbCBvdXIgY29uZmlnICovCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlwY2lfc2V0X21hc3RlcihjaGlwLT5wY2kpOworCXNuZF9lczE5NjhfY2hpcF9pbml0KGNoaXApOworCisJLyogbmVlZCB0byByZXN0b3JlIHRoZSBiYXNlIHBvaW50ZXJzLi4gKi8gCisJaWYgKGNoaXAtPmRtYS5hZGRyKSB7CisJCS8qIHNldCBQQ01CQVIgKi8KKwkJd2F2ZV9zZXRfcmVnaXN0ZXIoY2hpcCwgMHgwMUZDLCBjaGlwLT5kbWEuYWRkciA+PiAxMik7CisJfQorCisJc25kX2VzMTk2OF9zdGFydF9pcnEoY2hpcCk7CisKKwkvKiByZXN0b3JlIGFjOTcgc3RhdGUgKi8KKwlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjaGlwLT5zdWJzdHJlYW1fbGlzdCkgeworCQllc3NjaGFuX3QgKmVzID0gbGlzdF9lbnRyeShwLCBlc3NjaGFuX3QsIGxpc3QpOworCQlzd2l0Y2ggKGVzLT5tb2RlKSB7CisJCWNhc2UgRVNNX01PREVfUExBWToKKwkJCXNuZF9lczE5NjhfcGxheWJhY2tfc2V0dXAoY2hpcCwgZXMsIGVzLT5zdWJzdHJlYW0tPnJ1bnRpbWUpOworCQkJYnJlYWs7CisJCWNhc2UgRVNNX01PREVfQ0FQVFVSRToKKwkJCXNuZF9lczE5NjhfY2FwdHVyZV9zZXR1cChjaGlwLCBlcywgZXMtPnN1YnN0cmVhbS0+cnVudGltZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIHN0YXJ0IHRpbWVyIGFnYWluICovCisJaWYgKGNoaXAtPmJvYmNsaWVudCkKKwkJc25kX2VzMTk2OF9ib2Jfc3RhcnQoY2hpcCk7CisKKwljaGlwLT5pbl9zdXNwZW5kID0gMDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKyNkZWZpbmUgSk9ZU1RJQ0tfQUREUgkweDIwMAorc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTk2OF9jcmVhdGVfZ2FtZXBvcnQoZXMxOTY4X3QgKmNoaXAsIGludCBkZXYpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJdTE2IHZhbDsKKworCWlmICgham95c3RpY2tbZGV2XSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0gcmVxdWVzdF9yZWdpb24oSk9ZU1RJQ0tfQUREUiwgOCwgIkVTMTk2OCBnYW1lcG9ydCIpOworCWlmICghcikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTk2ODogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3Jlc291cmNlKHIpOworCQlrZnJlZV9ub2NoZWNrKHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChjaGlwLT5wY2ksIEVTTV9MRUdBQ1lfQVVESU9fQ09OVFJPTCwgJnZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgRVNNX0xFR0FDWV9BVURJT19DT05UUk9MLCB2YWwgfCAweDA0KTsKKworCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiRVMxOTY4IEdhbWVwb3J0Iik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwlnYW1lcG9ydF9zZXRfZGV2X3BhcmVudChncCwgJmNoaXAtPnBjaS0+ZGV2KTsKKwlncC0+aW8gPSBKT1lTVElDS19BRERSOworCWdhbWVwb3J0X3NldF9wb3J0X2RhdGEoZ3AsIHIpOworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2VzMTk2OF9mcmVlX2dhbWVwb3J0KGVzMTk2OF90ICpjaGlwKQoreworCWlmIChjaGlwLT5nYW1lcG9ydCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGNoaXAtPmdhbWVwb3J0KTsKKworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoY2hpcC0+Z2FtZXBvcnQpOworCQljaGlwLT5nYW1lcG9ydCA9IE5VTEw7CisKKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX2VzMTk2OF9jcmVhdGVfZ2FtZXBvcnQoZXMxOTY4X3QgKmNoaXAsIGludCBkZXYpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfZXMxOTY4X2ZyZWVfZ2FtZXBvcnQoZXMxOTY4X3QgKmNoaXApIHsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX2VzMTk2OF9mcmVlKGVzMTk2OF90ICpjaGlwKQoreworCWlmIChjaGlwLT5pb19wb3J0KSB7CisJCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCQlvdXR3KDEsIGNoaXAtPmlvX3BvcnQgKyAweDA0KTsgLyogY2xlYXIgV1AgaW50ZXJydXB0cyAqLworCQlvdXR3KDAsIGNoaXAtPmlvX3BvcnQgKyBFU01fUE9SVF9IT1NUX0lSUSk7IC8qIGRpc2FibGUgSVJRICovCisJfQorCisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJc25kX2VzMTk2OF9mcmVlX2dhbWVwb3J0KGNoaXApOworCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMyk7CisJY2hpcC0+bWFzdGVyX3N3aXRjaCA9IE5VTEw7CisJY2hpcC0+bWFzdGVyX3ZvbHVtZSA9IE5VTEw7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lczE5NjhfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJZXMxOTY4X3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfZXMxOTY4X2ZyZWUoY2hpcCk7Cit9CisKK3N0cnVjdCBlc3NfZGV2aWNlX2xpc3QgeworCXVuc2lnbmVkIHNob3J0IHR5cGU7CS8qIGNoaXAgdHlwZSAqLworCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsJLyogc3Vic3lzdGVtIHZlbmRvciBpZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBlc3NfZGV2aWNlX2xpc3QgcG1fd2hpdGVsaXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFRZUEVfTUFFU1RSTzJFLCAweDBlMTEgfSwJLyogQ29tcGFxIEFybWFkYSAqLworCXsgVFlQRV9NQUVTVFJPMkUsIDB4MTAyOCB9LAorCXsgVFlQRV9NQUVTVFJPMkUsIDB4MTAzYyB9LAorCXsgVFlQRV9NQUVTVFJPMkUsIDB4MTE3OSB9LAorCXsgVFlQRV9NQUVTVFJPMkUsIDB4MTRjMCB9LAkvKiBIUCBvbW5pYm9vayA0MTUwICovCit9OworCitzdGF0aWMgc3RydWN0IGVzc19kZXZpY2VfbGlzdCBtcHVfYmxhY2tsaXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFRZUEVfTUFFU1RSTzIsIDB4MTI1ZCB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTk2OF9jcmVhdGUoc25kX2NhcmRfdCAqIGNhcmQsCisJCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgIGludCB0b3RhbF9idWZzaXplLAorCQkJCSAgICAgICBpbnQgcGxheV9zdHJlYW1zLAorCQkJCSAgICAgICBpbnQgY2FwdF9zdHJlYW1zLAorCQkJCSAgICAgICBpbnQgY2hpcF90eXBlLAorCQkJCSAgICAgICBpbnQgZG9fcG0sCisJCQkJICAgICAgIGVzMTk2OF90ICoqY2hpcF9yZXQpCit7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfZXMxOTY4X2Rldl9mcmVlLAorCX07CisJZXMxOTY4X3QgKmNoaXA7CisJaW50IGksIGVycjsKKworCSpjaGlwX3JldCA9IE5VTEw7CisKKwkvKiBlbmFibGUgUENJIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjggYml0cyAqLworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgMHgwZmZmZmZmZikgPCAwIHx8CisJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIDB4MGZmZmZmZmYpIDwgMCkgeworCQlzbmRfcHJpbnRrKCJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghIGNoaXApIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFNldCBWYXJzICovCisJY2hpcC0+dHlwZSA9IGNoaXBfdHlwZTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmJ1Zl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2hpcC0+c3Vic3RyZWFtX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5hYzk3X2xvY2spOworCWluaXRfTVVURVgoJmNoaXAtPm1lbW9yeV9tdXRleCk7CisJdGFza2xldF9pbml0KCZjaGlwLT5od3ZvbF90cSwgZXMxOTY4X3VwZGF0ZV9od192b2x1bWUsICh1bnNpZ25lZCBsb25nKWNoaXApOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKwljaGlwLT50b3RhbF9idWZzaXplID0gdG90YWxfYnVmc2l6ZTsJLyogaW4gYnl0ZXMgKi8KKwljaGlwLT5wbGF5YmFja19zdHJlYW1zID0gcGxheV9zdHJlYW1zOworCWNoaXAtPmNhcHR1cmVfc3RyZWFtcyA9IGNhcHRfc3RyZWFtczsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJFU1MgTWFlc3RybyIpKSA8IDApIHsKKwkJa2ZyZWUoY2hpcCk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTY4X2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJIkVTUyBNYWVzdHJvIiwgKHZvaWQqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfZXMxOTY4X2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworCSAgICAgICAgCisJLyogQ2xlYXIgTWFlc3Ryb19tYXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJY2hpcC0+bWFlc3Ryb19tYXBbaV0gPSAwOworCisJLyogQ2xlYXIgQXB1IE1hcCAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BUFVTOyBpKyspCisJCWNoaXAtPmFwdVtpXSA9IEVTTV9BUFVfRlJFRTsKKworCS8qIGp1c3QgdG8gYmUgc3VyZSAqLworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisKKwlpZiAoZG9fcG0gPiAxKSB7CisJCS8qIGRpc2FibGUgcG93ZXItbWFuYWdlbWVudCBpZiBub3Qgb24gdGhlIHdoaXRlbGlzdCAqLworCQl1bnNpZ25lZCBzaG9ydCB2ZW5kOworCQlwY2lfcmVhZF9jb25maWdfd29yZChjaGlwLT5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdmVuZCk7CisJCWZvciAoaSA9IDA7IGkgPCAoaW50KUFSUkFZX1NJWkUocG1fd2hpdGVsaXN0KTsgaSsrKSB7CisJCQlpZiAoY2hpcC0+dHlwZSA9PSBwbV93aGl0ZWxpc3RbaV0udHlwZSAmJgorCQkJICAgIHZlbmQgPT0gcG1fd2hpdGVsaXN0W2ldLnZlbmRvcikgeworCQkJCWRvX3BtID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZG9fcG0gPiAxKSB7CisJCQkvKiBub3QgbWF0Y2hlZDsgZGlzYWJsaW5nIHBtICovCisJCQlwcmludGsoS0VSTl9JTkZPICJlczE5Njg6IG5vdCBhdHRlbXB0aW5nIHBvd2VyIG1hbmFnZW1lbnQuXG4iKTsKKwkJCWRvX3BtID0gMDsKKwkJfQorCX0KKwljaGlwLT5kb19wbSA9IGRvX3BtOworCisJc25kX2VzMTk2OF9jaGlwX2luaXQoY2hpcCk7CisKKwlpZiAoY2hpcC0+ZG9fcG0pCisJCXNuZF9jYXJkX3NldF9wbV9jYWxsYmFjayhjYXJkLCBlczE5Njhfc3VzcGVuZCwgZXMxOTY4X3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgeworCQlzbmRfZXMxOTY4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJKmNoaXBfcmV0ID0gY2hpcDsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE5NjhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJZXMxOTY4X3QgKmNoaXA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgCisJaWYgKHRvdGFsX2J1ZnNpemVbZGV2XSA8IDEyOCkKKwkJdG90YWxfYnVmc2l6ZVtkZXZdID0gMTI4OworCWlmICh0b3RhbF9idWZzaXplW2Rldl0gPiA0MDk2KQorCQl0b3RhbF9idWZzaXplW2Rldl0gPSA0MDk2OworCWlmICgoZXJyID0gc25kX2VzMTk2OF9jcmVhdGUoY2FyZCwgcGNpLAorCQkJCSAgICAgdG90YWxfYnVmc2l6ZVtkZXZdICogMTAyNCwgLyogaW4gYnl0ZXMgKi8KKwkJCQkgICAgIHBjbV9zdWJzdHJlYW1zX3BbZGV2XSwgCisJCQkJICAgICBwY21fc3Vic3RyZWFtc19jW2Rldl0sCisJCQkJICAgICBwY2lfaWQtPmRyaXZlcl9kYXRhLAorCQkJCSAgICAgdXNlX3BtW2Rldl0sCisJCQkJICAgICAmY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN3aXRjaCAoY2hpcC0+dHlwZSkgeworCWNhc2UgVFlQRV9NQUVTVFJPMkU6CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJFUzE5NzgiKTsKKwkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkVTUyBFUzE5NzggKE1hZXN0cm8gMkUpIik7CisJCWJyZWFrOworCWNhc2UgVFlQRV9NQUVTVFJPMjoKKwkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkVTMTk2OCIpOworCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRVNTIEVTMTk2OCAoTWFlc3RybyAyKSIpOworCQlicmVhazsKKwljYXNlIFRZUEVfTUFFU1RSTzoKKwkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkVTTTEiKTsKKwkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkVTUyBNYWVzdHJvIDEiKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZXMxOTY4X3BjbShjaGlwLCAwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZXMxOTY4X21peGVyKGNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoZW5hYmxlX21wdVtkZXZdID09IDIpIHsKKwkJLyogY2hlY2sgdGhlIGJsYWNrIGxpc3QgKi8KKwkJdW5zaWduZWQgc2hvcnQgdmVuZDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnZlbmQpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtcHVfYmxhY2tsaXN0KTsgaSsrKSB7CisJCQlpZiAoY2hpcC0+dHlwZSA9PSBtcHVfYmxhY2tsaXN0W2ldLnR5cGUgJiYKKwkJCSAgICB2ZW5kID09IG1wdV9ibGFja2xpc3RbaV0udmVuZG9yKSB7CisJCQkJZW5hYmxlX21wdVtkZXZdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZW5hYmxlX21wdVtkZXZdKSB7CisJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAorCQkJCQkgICAgICAgY2hpcC0+aW9fcG9ydCArIEVTTV9NUFU0MDFfUE9SVCwgMSwKKwkJCQkJICAgICAgIGNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczE5Njg6IHNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOworCQl9CisJfQorCisJc25kX2VzMTk2OF9jcmVhdGVfZ2FtZXBvcnQoY2hpcCwgZGV2KTsKKworCXNuZF9lczE5Njhfc3RhcnRfaXJxKGNoaXApOworCisJY2hpcC0+Y2xvY2sgPSBjbG9ja1tkZXZdOworCWlmICghIGNoaXAtPmNsb2NrKQorCQllczE5NjhfbWVhc3VyZV9jbG9jayhjaGlwKTsKKworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5pb19wb3J0LCBjaGlwLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2VzMTk2OF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJFUzE5NjggKEVTUyBNYWVzdHJvKSIsCisJLmlkX3RhYmxlID0gc25kX2VzMTk2OF9pZHMsCisJLnByb2JlID0gc25kX2VzMTk2OF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2VzMTk2OF9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfZXMxOTY4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2VzMTk2OF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfZXMxOTY4X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfZXMxOTY4X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZm04MDEuYyBiL3NvdW5kL3BjaS9mbTgwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTdjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMCwwICsxLDE0ODAgQEAKKy8qCisgKiAgVGhlIGRyaXZlciBmb3IgdGhlIEZvcnRlTWVkaWEgRk04MDEgYmFzZWQgc291bmRjYXJkcworICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgorI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmIChkZWZpbmVkKENPTkZJR19TTkRfRk04MDFfVEVBNTc1WCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0ZNODAxX1RFQTU3NVhfTU9EVUxFKSkgJiYgKGRlZmluZWQoQ09ORklHX1ZJREVPX0RFVikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fREVWX01PRFVMRSkpCisjaW5jbHVkZSA8c291bmQvdGVhNTc1eC10dW5lci5oPgorI2RlZmluZSBURUE1NzVYX1JBRElPIDEKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZvcnRlTWVkaWEgRk04MDEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0ZvcnRlTWVkaWEsRk04MDF9LCIKKwkJIntHZW5pdXMsU291bmRNYWtlciBMaXZlIDUuMX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworLyoKKyAqICBFbmFibGUgVEVBNTc1eCB0dW5lcgorICogICAgMSA9IE1lZGlhRm9ydGUgMjU2LVBDUworICogICAgMiA9IE1lZGlhRm9ydGUgMjU2LVBDUFIKKyAqICAgIDMgPSBNZWRpYUZvcnRlIDY0LVBDUgorICogIEhpZ2ggMTYtYml0cyBhcmUgdmlkZW8gKHJhZGlvKSBkZXZpY2UgbnVtYmVyICsgMQorICovCitzdGF0aWMgaW50IHRlYTU3NXhfdHVuZXJbU05EUlZfQ0FSRFNdID0geyBbMCAuLi4gKFNORFJWX0NBUkRTLTEpXSA9IDAgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0aGUgRk04MDEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciB0aGUgRk04MDEgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBGTTgwMSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkodGVhNTc1eF90dW5lciwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModGVhNTc1eF90dW5lciwgIkVuYWJsZSBURUE1NzV4IHR1bmVyLiIpOworCisvKgorICogIERpcmVjdCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIEZNODAxX1JFRyhjaGlwLCByZWcpCShjaGlwLT5wb3J0ICsgRk04MDFfIyNyZWcpCisKKyNkZWZpbmUgRk04MDFfUENNX1ZPTAkJMHgwMAkvKiBQQ00gT3V0cHV0IFZvbHVtZSAqLworI2RlZmluZSBGTTgwMV9GTV9WT0wJCTB4MDIJLyogRk0gT3V0cHV0IFZvbHVtZSAqLworI2RlZmluZSBGTTgwMV9JMlNfVk9MCQkweDA0CS8qIEkyUyBWb2x1bWUgKi8KKyNkZWZpbmUgRk04MDFfUkVDX1NSQwkJMHgwNgkvKiBSZWNvcmQgU291cmNlICovCisjZGVmaW5lIEZNODAxX1BMWV9DVFJMCQkweDA4CS8qIFBsYXliYWNrIENvbnRyb2wgKi8KKyNkZWZpbmUgRk04MDFfUExZX0NPVU5UCQkweDBhCS8qIFBsYXliYWNrIENvdW50ICovCisjZGVmaW5lIEZNODAxX1BMWV9CVUYxCQkweDBjCS8qIFBsYXliYWNrIEJ1ZmVyIEkgKi8KKyNkZWZpbmUgRk04MDFfUExZX0JVRjIJCTB4MTAJLyogUGxheWJhY2sgQnVmZmVyIElJICovCisjZGVmaW5lIEZNODAxX0NBUF9DVFJMCQkweDE0CS8qIENhcHR1cmUgQ29udHJvbCAqLworI2RlZmluZSBGTTgwMV9DQVBfQ09VTlQJCTB4MTYJLyogQ2FwdHVyZSBDb3VudCAqLworI2RlZmluZSBGTTgwMV9DQVBfQlVGMQkJMHgxOAkvKiBDYXB0dXJlIEJ1ZmZlciBJICovCisjZGVmaW5lIEZNODAxX0NBUF9CVUYyCQkweDFjCS8qIENhcHR1cmUgQnVmZmVyIElJICovCisjZGVmaW5lIEZNODAxX0NPREVDX0NUUkwJMHgyMgkvKiBDb2RlYyBDb250cm9sICovCisjZGVmaW5lIEZNODAxX0kyU19NT0RFCQkweDI0CS8qIEkyUyBNb2RlIENvbnRyb2wgKi8KKyNkZWZpbmUgRk04MDFfVk9MVU1FCQkweDI2CS8qIFZvbHVtZSBVcC9Eb3duL011dGUgU3RhdHVzICovCisjZGVmaW5lIEZNODAxX0kyQ19DVFJMCQkweDI5CS8qIEkyQyBDb250cm9sICovCisjZGVmaW5lIEZNODAxX0FDOTdfQ01ECQkweDJhCS8qIEFDJzk3IENvbW1hbmQgKi8KKyNkZWZpbmUgRk04MDFfQUM5N19EQVRBCQkweDJjCS8qIEFDJzk3IERhdGEgKi8KKyNkZWZpbmUgRk04MDFfTVBVNDAxX0RBVEEJMHgzMAkvKiBNUFU0MDEgRGF0YSAqLworI2RlZmluZSBGTTgwMV9NUFU0MDFfQ01ECTB4MzEJLyogTVBVNDAxIENvbW1hbmQgKi8KKyNkZWZpbmUgRk04MDFfR1BJT19DVFJMCQkweDUyCS8qIEdlbmVyYWwgUHVycG9zZSBJL08gQ29udHJvbCAqLworI2RlZmluZSBGTTgwMV9HRU5fQ1RSTAkJMHg1NAkvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyNkZWZpbmUgRk04MDFfSVJRX01BU0sJCTB4NTYJLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgRk04MDFfSVJRX1NUQVRVUwkweDVhCS8qIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRk04MDFfT1BMM19CQU5LMAkweDY4CS8qIE9QTDMgU3RhdHVzIFJlYWQgLyBCYW5rIDAgV3JpdGUgKi8KKyNkZWZpbmUgRk04MDFfT1BMM19EQVRBMAkweDY5CS8qIE9QTDMgRGF0YSAwIFdyaXRlICovCisjZGVmaW5lIEZNODAxX09QTDNfQkFOSzEJMHg2YQkvKiBPUEwzIEJhbmsgMSBXcml0ZSAqLworI2RlZmluZSBGTTgwMV9PUEwzX0RBVEExCTB4NmIJLyogT1BMMyBCYW5rIDEgV3JpdGUgKi8KKyNkZWZpbmUgRk04MDFfUE9XRVJET1dOCQkweDcwCS8qIEJsb2NrcyBQb3dlciBEb3duIENvbnRyb2wgKi8KKworI2RlZmluZSBGTTgwMV9BQzk3X0FERFJfU0hJRlQJMTAKKworLyogcGxheWJhY2sgYW5kIHJlY29yZCBjb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgRk04MDFfQlVGMV9MQVNUCQkoMTw8MSkKKyNkZWZpbmUgRk04MDFfQlVGMl9MQVNUCQkoMTw8MikKKyNkZWZpbmUgRk04MDFfU1RBUlQJCSgxPDw1KQorI2RlZmluZSBGTTgwMV9QQVVTRQkJKDE8PDYpCisjZGVmaW5lIEZNODAxX0lNTUVEX1NUT1AJKDE8PDcpCisjZGVmaW5lIEZNODAxX1JBVEVfU0hJRlQJOAorI2RlZmluZSBGTTgwMV9SQVRFX01BU0sJCSgxNSA8PCBGTTgwMV9SQVRFX1NISUZUKQorI2RlZmluZSBGTTgwMV9DSEFOTkVMU180CSgxPDwxMikJLyogcGxheWJhY2sgb25seSAqLworI2RlZmluZSBGTTgwMV9DSEFOTkVMU182CSgyPDwxMikJLyogcGxheWJhY2sgb25seSAqLworI2RlZmluZSBGTTgwMV9DSEFOTkVMU182TVMJKDM8PDEyKQkvKiBwbGF5YmFjayBvbmx5ICovCisjZGVmaW5lIEZNODAxX0NIQU5ORUxTX01BU0sJKDM8PDEyKQorI2RlZmluZSBGTTgwMV8xNkJJVAkJKDE8PDE0KQorI2RlZmluZSBGTTgwMV9TVEVSRU8JCSgxPDwxNSkKKworLyogSVJRIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIEZNODAxX0lSUV9QTEFZQkFDSwkoMTw8OCkKKyNkZWZpbmUgRk04MDFfSVJRX0NBUFRVUkUJKDE8PDkpCisjZGVmaW5lIEZNODAxX0lSUV9WT0xVTUUJKDE8PDE0KQorI2RlZmluZSBGTTgwMV9JUlFfTVBVCQkoMTw8MTUpCisKKy8qIEdQSU8gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBGTTgwMV9HUElPX0dQMAkJKDE8PDApCS8qIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgRk04MDFfR1BJT19HUDEJCSgxPDwxKQorI2RlZmluZSBGTTgwMV9HUElPX0dQMgkJKDE8PDIpCisjZGVmaW5lIEZNODAxX0dQSU9fR1AzCQkoMTw8MykKKyNkZWZpbmUgRk04MDFfR1BJT19HUCh4KQkoMTw8KDArKHgpKSkKKyNkZWZpbmUgRk04MDFfR1BJT19HRDAJCSgxPDw4KQkvKiBkaXJlY3Rpb25zOiAxID0gaW5wdXQsIDAgPSBvdXRwdXQqLworI2RlZmluZSBGTTgwMV9HUElPX0dEMQkJKDE8PDkpCisjZGVmaW5lIEZNODAxX0dQSU9fR0QyCQkoMTw8MTApCisjZGVmaW5lIEZNODAxX0dQSU9fR0QzCQkoMTw8MTEpCisjZGVmaW5lIEZNODAxX0dQSU9fR0QoeCkJKDE8PCg4Kyh4KSkpCisjZGVmaW5lIEZNODAxX0dQSU9fR1MwCQkoMTw8MTIpCS8qIGZ1bmN0aW9uIHNlbGVjdDogKi8KKyNkZWZpbmUgRk04MDFfR1BJT19HUzEJCSgxPDwxMykJLyogICAgMSA9IEdQSU8gKi8KKyNkZWZpbmUgRk04MDFfR1BJT19HUzIJCSgxPDwxNCkJLyogICAgMCA9IG90aGVyIChTL1BESUYsIFZPTCkgKi8KKyNkZWZpbmUgRk04MDFfR1BJT19HUzMJCSgxPDwxNSkKKyNkZWZpbmUgRk04MDFfR1BJT19HUyh4KQkoMTw8KDEyKyh4KSkpCisJCisvKgorCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9mbTgwMSBmbTgwMV90OworCitzdHJ1Y3QgX3NuZF9mbTgwMSB7CisJaW50IGlycTsKKworCXVuc2lnbmVkIGxvbmcgcG9ydDsJLyogSS9PIHBvcnQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IG11bHRpY2hhbm5lbDogMSwJLyogbXVsdGljaGFubmVsIHN1cHBvcnQgKi8KKwkJICAgICBzZWNvbmRhcnk6IDE7CS8qIHNlY29uZGFyeSBjb2RlYyAqLworCXVuc2lnbmVkIGNoYXIgc2Vjb25kYXJ5X2FkZHI7CS8qIGFkZHJlc3Mgb2YgdGhlIHNlY29uZGFyeSBjb2RlYyAqLworCisJdW5zaWduZWQgc2hvcnQgcGx5X2N0cmw7IC8qIHBsYXliYWNrIGNvbnRyb2wgKi8KKwl1bnNpZ25lZCBzaG9ydCBjYXBfY3RybDsgLyogY2FwdHVyZSBjb250cm9sICovCisKKwl1bnNpZ25lZCBsb25nIHBseV9idWZmZXI7CisJdW5zaWduZWQgaW50IHBseV9idWY7CisJdW5zaWduZWQgaW50IHBseV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcGx5X3NpemU7CisJdW5zaWduZWQgaW50IHBseV9wb3M7CisKKwl1bnNpZ25lZCBsb25nIGNhcF9idWZmZXI7CisJdW5zaWduZWQgaW50IGNhcF9idWY7CisJdW5zaWduZWQgaW50IGNhcF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgY2FwX3NpemU7CisJdW5zaWduZWQgaW50IGNhcF9wb3M7CisKKwlhYzk3X2J1c190ICphYzk3X2J1czsKKwlhYzk3X3QgKmFjOTc7CisJYWM5N190ICphYzk3X3NlYzsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfcmF3bWlkaV90ICpybWlkaTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpwbGF5YmFja19zdWJzdHJlYW07CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqY2FwdHVyZV9zdWJzdHJlYW07CisJdW5zaWduZWQgaW50IHBfZG1hX3NpemU7CisJdW5zaWduZWQgaW50IGNfZG1hX3NpemU7CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXNuZF9pbmZvX2VudHJ5X3QgKnByb2NfZW50cnk7CisKKyNpZmRlZiBURUE1NzVYX1JBRElPCisJdGVhNTc1eF90IHRlYTsKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9mbTgwMV9pZHNbXSA9IHsKKwl7IDB4MTMxOSwgMHgwODAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgMCwgfSwgICAvKiBGTTgwMSAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9mbTgwMV9pZHMpOworCisvKgorICogIGNvbW1vbiBJL08gcm91dGluZXMKKyAqLworCitzdGF0aWMgaW50IHNuZF9mbTgwMV91cGRhdGVfYml0cyhmbTgwMV90ICpjaGlwLCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJIHVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBvbGQsIG5ldzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCW9sZCA9IGludyhjaGlwLT5wb3J0ICsgcmVnKTsKKwluZXcgPSAob2xkICYgfm1hc2spIHwgdmFsdWU7CisJY2hhbmdlID0gb2xkICE9IG5ldzsKKwlpZiAoY2hhbmdlKQorCQlvdXR3KG5ldywgY2hpcC0+cG9ydCArIHJlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgdm9pZCBzbmRfZm04MDFfY29kZWNfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWZtODAxX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IGlkeDsKKworCS8qCisJICogIFdhaXQgdW50aWwgdGhlIGNvZGVjIGludGVyZmFjZSBpcyBub3QgcmVhZHkuLgorCSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgMTAwOyBpZHgrKykgeworCQlpZiAoIShpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSkgJiAoMTw8OSkpKQorCQkJZ290byBvazE7CisJCXVkZWxheSgxMCk7CisJfQorCXNuZF9wcmludGsoIkFDJzk3IGludGVyZmFjZSBpcyBidXN5ICgxKVxuIik7CisJcmV0dXJuOworCisgb2sxOgorCS8qIHdyaXRlIGRhdGEgYW5kIGFkZHJlc3MgKi8KKwlvdXR3KHZhbCwgRk04MDFfUkVHKGNoaXAsIEFDOTdfREFUQSkpOworCW91dHcocmVnIHwgKGFjOTctPmFkZHIgPDwgRk04MDFfQUM5N19BRERSX1NISUZUKSwgRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSk7CisJLyoKKwkgKiAgV2FpdCB1bnRpbCB0aGUgd3JpdGUgY29tbWFuZCBpcyBub3QgY29tcGxldGVkLi4KKyAgICAgICAgICovCisJZm9yIChpZHggPSAwOyBpZHggPCAxMDAwOyBpZHgrKykgeworCQlpZiAoIShpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSkgJiAoMTw8OSkpKQorCQkJcmV0dXJuOworCQl1ZGVsYXkoMTApOworCX0KKwlzbmRfcHJpbnRrKCJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2ZtODAxX2NvZGVjX3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJZm04MDFfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwlpbnQgaWR4OworCisJLyoKKwkgKiAgV2FpdCB1bnRpbCB0aGUgY29kZWMgaW50ZXJmYWNlIGlzIG5vdCByZWFkeS4uCisJICovCisJZm9yIChpZHggPSAwOyBpZHggPCAxMDA7IGlkeCsrKSB7CisJCWlmICghKGludyhGTTgwMV9SRUcoY2hpcCwgQUM5N19DTUQpKSAmICgxPDw5KSkpCisJCQlnb3RvIG9rMTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJc25kX3ByaW50aygiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKKwlyZXR1cm4gMDsKKworIG9rMToKKwkvKiByZWFkIGNvbW1hbmQgKi8KKwlvdXR3KHJlZyB8IChhYzk3LT5hZGRyIDw8IEZNODAxX0FDOTdfQUREUl9TSElGVCkgfCAoMTw8NyksIEZNODAxX1JFRyhjaGlwLCBBQzk3X0NNRCkpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgMTAwOyBpZHgrKykgeworCQlpZiAoIShpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSkgJiAoMTw8OSkpKQorCQkJZ290byBvazI7CisJCXVkZWxheSgxMCk7CisJfQorCXNuZF9wcmludGsoIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgYnVzeSAoMilcbiIsIGFjOTctPm51bSk7CisJcmV0dXJuIDA7CisKKyBvazI6CisJZm9yIChpZHggPSAwOyBpZHggPCAxMDAwOyBpZHgrKykgeworCQlpZiAoaW53KEZNODAxX1JFRyhjaGlwLCBBQzk3X0NNRCkpICYgKDE8PDgpKQorCQkJZ290byBvazM7CisJCXVkZWxheSgxMCk7CisJfQorCXNuZF9wcmludGsoIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgbm90IHZhbGlkICgyKVxuIiwgYWM5Ny0+bnVtKTsKKwlyZXR1cm4gMDsKKworIG9rMzoKKwlyZXR1cm4gaW53KEZNODAxX1JFRyhjaGlwLCBBQzk3X0RBVEEpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0geworICA1NTAwLCAgODAwMCwgIDk2MDAsIDExMDI1LAorICAxNjAwMCwgMTkyMDAsIDIyMDUwLCAzMjAwMCwKKyAgMzg0MDAsIDQ0MTAwLCA0ODAwMAorfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfcmF0ZXMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlcyksCisJLmxpc3QgPSByYXRlcywKKwkubWFzayA9IDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNoYW5uZWxzW10gPSB7CisgIDIsIDQsIDYKK307CisKKyNkZWZpbmUgQ0hBTk5FTFMgc2l6ZW9mKGNoYW5uZWxzKSAvIHNpemVvZihjaGFubmVsc1swXSkKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfY2hhbm5lbHMgPSB7CisJLmNvdW50ID0gQ0hBTk5FTFMsCisJLmxpc3QgPSBjaGFubmVscywKKwkubWFzayA9IDAsCit9OworCisvKgorICogIFNhbXBsZSByYXRlIHJvdXRpbmVzCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9mbTgwMV9yYXRlX2JpdHModW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShyYXRlcyk7IGlkeCsrKQorCQlpZiAocmF0ZXNbaWR4XSA9PSByYXRlKQorCQkJcmV0dXJuIGlkeDsKKwlzbmRfQlVHKCk7CisJcmV0dXJuIEFSUkFZX1NJWkUocmF0ZXMpIC0gMTsKK30KKworLyoKKyAqICBQQ00gcGFydAorICovCisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgICBpbnQgY21kKQoreworCWZtODAxX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWNoaXAtPnBseV9jdHJsICY9IH4oRk04MDFfQlVGMV9MQVNUIHwKKwkJCQkgICAgIEZNODAxX0JVRjJfTEFTVCB8CisJCQkJICAgICBGTTgwMV9QQVVTRSk7CisJCWNoaXAtPnBseV9jdHJsIHw9IEZNODAxX1NUQVJUIHwKKwkJCQkgICBGTTgwMV9JTU1FRF9TVE9QOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWNoaXAtPnBseV9jdHJsICY9IH4oRk04MDFfU1RBUlQgfCBGTTgwMV9QQVVTRSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJY2hpcC0+cGx5X2N0cmwgfD0gRk04MDFfUEFVU0U7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJY2hpcC0+cGx5X2N0cmwgJj0gfkZNODAxX1BBVVNFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlvdXR3KGNoaXAtPnBseV9jdHJsLCBGTTgwMV9SRUcoY2hpcCwgUExZX0NUUkwpKTsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9jYXB0dXJlX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgIGludCBjbWQpCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJY2hpcC0+Y2FwX2N0cmwgJj0gfihGTTgwMV9CVUYxX0xBU1QgfAorCQkJCSAgICAgRk04MDFfQlVGMl9MQVNUIHwKKwkJCQkgICAgIEZNODAxX1BBVVNFKTsKKwkJY2hpcC0+Y2FwX2N0cmwgfD0gRk04MDFfU1RBUlQgfAorCQkJCSAgIEZNODAxX0lNTUVEX1NUT1A7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJY2hpcC0+Y2FwX2N0cmwgJj0gfihGTTgwMV9TVEFSVCB8IEZNODAxX1BBVVNFKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQljaGlwLT5jYXBfY3RybCB8PSBGTTgwMV9QQVVTRTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQljaGlwLT5jYXBfY3RybCAmPSB+Rk04MDFfUEFVU0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXNuZF9CVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW91dHcoY2hpcC0+Y2FwX2N0cmwsIEZNODAxX1JFRyhjaGlwLCBDQVBfQ1RSTCkpOworCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJICAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWNoaXAtPnBseV9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJY2hpcC0+cGx5X2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPnBseV9jdHJsICY9IH4oRk04MDFfU1RBUlQgfCBGTTgwMV8xNkJJVCB8CisJCQkgICAgIEZNODAxX1NURVJFTyB8IEZNODAxX1JBVEVfTUFTSyB8CisJCQkgICAgIEZNODAxX0NIQU5ORUxTX01BU0spOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQljaGlwLT5wbHlfY3RybCB8PSBGTTgwMV8xNkJJVDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKSB7CisJCWNoaXAtPnBseV9jdHJsIHw9IEZNODAxX1NURVJFTzsKKwkJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDQpCisJCQljaGlwLT5wbHlfY3RybCB8PSBGTTgwMV9DSEFOTkVMU180OworCQllbHNlIGlmIChydW50aW1lLT5jaGFubmVscyA9PSA2KQorCQkJY2hpcC0+cGx5X2N0cmwgfD0gRk04MDFfQ0hBTk5FTFNfNjsKKwl9CisJY2hpcC0+cGx5X2N0cmwgfD0gc25kX2ZtODAxX3JhdGVfYml0cyhydW50aW1lLT5yYXRlKSA8PCBGTTgwMV9SQVRFX1NISUZUOworCWNoaXAtPnBseV9idWYgPSAwOworCW91dHcoY2hpcC0+cGx5X2N0cmwsIEZNODAxX1JFRyhjaGlwLCBQTFlfQ1RSTCkpOworCW91dHcoY2hpcC0+cGx5X2NvdW50IC0gMSwgRk04MDFfUkVHKGNoaXAsIFBMWV9DT1VOVCkpOworCWNoaXAtPnBseV9idWZmZXIgPSBydW50aW1lLT5kbWFfYWRkcjsKKwljaGlwLT5wbHlfcG9zID0gMDsKKwlvdXRsKGNoaXAtPnBseV9idWZmZXIsIEZNODAxX1JFRyhjaGlwLCBQTFlfQlVGMSkpOworCW91dGwoY2hpcC0+cGx5X2J1ZmZlciArIChjaGlwLT5wbHlfY291bnQgJSBjaGlwLT5wbHlfc2l6ZSksIEZNODAxX1JFRyhjaGlwLCBQTFlfQlVGMikpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlmbTgwMV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJY2hpcC0+Y2FwX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwljaGlwLT5jYXBfY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+Y2FwX2N0cmwgJj0gfihGTTgwMV9TVEFSVCB8IEZNODAxXzE2QklUIHwKKwkJCSAgICAgRk04MDFfU1RFUkVPIHwgRk04MDFfUkFURV9NQVNLKTsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNikKKwkJY2hpcC0+Y2FwX2N0cmwgfD0gRk04MDFfMTZCSVQ7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID4gMSkKKwkJY2hpcC0+Y2FwX2N0cmwgfD0gRk04MDFfU1RFUkVPOworCWNoaXAtPmNhcF9jdHJsIHw9IHNuZF9mbTgwMV9yYXRlX2JpdHMocnVudGltZS0+cmF0ZSkgPDwgRk04MDFfUkFURV9TSElGVDsKKwljaGlwLT5jYXBfYnVmID0gMDsKKwlvdXR3KGNoaXAtPmNhcF9jdHJsLCBGTTgwMV9SRUcoY2hpcCwgQ0FQX0NUUkwpKTsKKwlvdXR3KGNoaXAtPmNhcF9jb3VudCAtIDEsIEZNODAxX1JFRyhjaGlwLCBDQVBfQ09VTlQpKTsKKwljaGlwLT5jYXBfYnVmZmVyID0gcnVudGltZS0+ZG1hX2FkZHI7CisJY2hpcC0+Y2FwX3BvcyA9IDA7CisJb3V0bChjaGlwLT5jYXBfYnVmZmVyLCBGTTgwMV9SRUcoY2hpcCwgQ0FQX0JVRjEpKTsKKwlvdXRsKGNoaXAtPmNhcF9idWZmZXIgKyAoY2hpcC0+Y2FwX2NvdW50ICUgY2hpcC0+Y2FwX3NpemUpLCBGTTgwMV9SRUcoY2hpcCwgQ0FQX0JVRjIpKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9mbTgwMV9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoY2hpcC0+cGx5X2N0cmwgJiBGTTgwMV9TVEFSVCkpCisJCXJldHVybiAwOworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXB0ciA9IGNoaXAtPnBseV9wb3MgKyAoY2hpcC0+cGx5X2NvdW50IC0gMSkgLSBpbncoRk04MDFfUkVHKGNoaXAsIFBMWV9DT1VOVCkpOworCWlmIChpbncoRk04MDFfUkVHKGNoaXAsIElSUV9TVEFUVVMpKSAmIEZNODAxX0lSUV9QTEFZQkFDSykgeworCQlwdHIgKz0gY2hpcC0+cGx5X2NvdW50OworCQlwdHIgJT0gY2hpcC0+cGx5X3NpemU7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZm04MDFfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoY2hpcC0+Y2FwX2N0cmwgJiBGTTgwMV9TVEFSVCkpCisJCXJldHVybiAwOworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXB0ciA9IGNoaXAtPmNhcF9wb3MgKyAoY2hpcC0+Y2FwX2NvdW50IC0gMSkgLSBpbncoRk04MDFfUkVHKGNoaXAsIENBUF9DT1VOVCkpOworCWlmIChpbncoRk04MDFfUkVHKGNoaXAsIElSUV9TVEFUVVMpKSAmIEZNODAxX0lSUV9DQVBUVVJFKSB7CisJCXB0ciArPSBjaGlwLT5jYXBfY291bnQ7CisJCXB0ciAlPSBjaGlwLT5jYXBfc2l6ZTsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNuZF9mbTgwMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlmbTgwMV90ICpjaGlwID0gZGV2X2lkOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3RhdHVzID0gaW53KEZNODAxX1JFRyhjaGlwLCBJUlFfU1RBVFVTKSk7CisJc3RhdHVzICY9IEZNODAxX0lSUV9QTEFZQkFDS3xGTTgwMV9JUlFfQ0FQVFVSRXxGTTgwMV9JUlFfTVBVfEZNODAxX0lSUV9WT0xVTUU7CisJaWYgKCEgc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisJLyogYWNrIGZpcnN0ICovCisJb3V0dyhzdGF0dXMsIEZNODAxX1JFRyhjaGlwLCBJUlFfU1RBVFVTKSk7CisJaWYgKGNoaXAtPnBjbSAmJiAoc3RhdHVzICYgRk04MDFfSVJRX1BMQVlCQUNLKSAmJiBjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pIHsKKwkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCWNoaXAtPnBseV9idWYrKzsKKwkJY2hpcC0+cGx5X3BvcyArPSBjaGlwLT5wbHlfY291bnQ7CisJCWNoaXAtPnBseV9wb3MgJT0gY2hpcC0+cGx5X3NpemU7CisJCXRtcCA9IGNoaXAtPnBseV9wb3MgKyBjaGlwLT5wbHlfY291bnQ7CisJCXRtcCAlPSBjaGlwLT5wbHlfc2l6ZTsKKwkJb3V0bChjaGlwLT5wbHlfYnVmZmVyICsgdG1wLAorCQkJCShjaGlwLT5wbHlfYnVmICYgMSkgPworCQkJCQlGTTgwMV9SRUcoY2hpcCwgUExZX0JVRjEpIDoKKwkJCQkJRk04MDFfUkVHKGNoaXAsIFBMWV9CVUYyKSk7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKKwl9CisJaWYgKGNoaXAtPnBjbSAmJiAoc3RhdHVzICYgRk04MDFfSVJRX0NBUFRVUkUpICYmIGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKSB7CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQljaGlwLT5jYXBfYnVmKys7CisJCWNoaXAtPmNhcF9wb3MgKz0gY2hpcC0+Y2FwX2NvdW50OworCQljaGlwLT5jYXBfcG9zICU9IGNoaXAtPmNhcF9zaXplOworCQl0bXAgPSBjaGlwLT5jYXBfcG9zICsgY2hpcC0+Y2FwX2NvdW50OworCQl0bXAgJT0gY2hpcC0+Y2FwX3NpemU7CisJCW91dGwoY2hpcC0+Y2FwX2J1ZmZlciArIHRtcCwKKwkJCQkoY2hpcC0+Y2FwX2J1ZiAmIDEpID8KKwkJCQkJRk04MDFfUkVHKGNoaXAsIENBUF9CVUYxKSA6CisJCQkJCUZNODAxX1JFRyhjaGlwLCBDQVBfQlVGMikpOworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwl9CisJaWYgKGNoaXAtPnJtaWRpICYmIChzdGF0dXMgJiBGTTgwMV9JUlFfTVBVKSkKKwkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIGNoaXAtPnJtaWRpLT5wcml2YXRlX2RhdGEsIHJlZ3MpOworCWlmIChzdGF0dXMgJiBGTTgwMV9JUlFfVk9MVU1FKQorCQk7LyogVE9ETyAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9mbTgwMV9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNTUwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfZm04MDFfY2FwdHVyZSA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNTUwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIGludCBzbmRfZm04MDFfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWZtODAxX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9mbTgwMV9wbGF5YmFjazsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX3JhdGVzKTsKKwlpZiAoY2hpcC0+bXVsdGljaGFubmVsKSB7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IDY7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgJmh3X2NvbnN0cmFpbnRzX2NoYW5uZWxzKTsKKwl9CisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZm04MDFfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfZm04MDFfY2FwdHVyZTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX3JhdGVzKTsKKwlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9wbGF5YmFja19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWZtODAxX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ZtODAxX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfZm04MDFfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfZm04MDFfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9mbTgwMV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfZm04MDFfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9mbTgwMV9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ZtODAxX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfZm04MDFfcGxheWJhY2tfcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9mbTgwMV9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfZm04MDFfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CXNuZF9mbTgwMV9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfZm04MDFfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ZtODAxX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfZm04MDFfY2FwdHVyZV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ZtODAxX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9mbTgwMV9jYXB0dXJlX3BvaW50ZXIsCit9OworCitzdGF0aWMgdm9pZCBzbmRfZm04MDFfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJZm04MDFfdCAqY2hpcCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPnBjbSA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9mbTgwMV9wY20oZm04MDFfdCAqY2hpcCwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiRk04MDEiLCBkZXZpY2UsIDEsIDEsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2ZtODAxX3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2ZtODAxX2NhcHR1cmVfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9mbTgwMV9wY21fZnJlZTsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsICJGTTgwMSIpOworCWNoaXAtPnBjbSA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJICAgICAgY2hpcC0+bXVsdGljaGFubmVsID8gMTI4KjEwMjQgOiA2NCoxMDI0LCAxMjgqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVEVBNTc1NyByYWRpbworICovCisKKyNpZmRlZiBURUE1NzVYX1JBRElPCisKKy8qIDI1NlBDUyBHUElPIG51bWJlcnMgKi8KKyNkZWZpbmUgVEVBXzI1NlBDU19EQVRBCQkJMQorI2RlZmluZSBURUFfMjU2UENTX1dSSVRFX0VOQUJMRQkJMgkvKiBpbnZlcnRlZCAqLworI2RlZmluZSBURUFfMjU2UENTX0JVU19DTE9DSwkJMworCitzdGF0aWMgdm9pZCBzbmRfZm04MDFfdGVhNTc1eF8yNTZwY3Nfd3JpdGUodGVhNTc1eF90ICp0ZWEsIHVuc2lnbmVkIGludCB2YWwpCit7CisJZm04MDFfdCAqY2hpcCA9IHRlYS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIHNob3J0IHJlZzsKKwlpbnQgaSA9IDI1OworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJlZyA9IGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJLyogdXNlIEdQSU8gbGluZXMgYW5kIHNldCB3cml0ZSBlbmFibGUgYml0ICovCisJcmVnIHw9IEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDU19EQVRBKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDU19XUklURV9FTkFCTEUpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUyhURUFfMjU2UENTX0JVU19DTE9DSyk7CisJLyogYWxsIG9mIGxpbmVzIGFyZSBpbiB0aGUgd3JpdGUgZGlyZWN0aW9uICovCisJLyogY2xlYXIgZGF0YSBhbmQgY2xvY2sgbGluZXMgKi8KKwlyZWcgJj0gfihGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1NfREFUQSkgfAorCSAgICAgICAgIEZNODAxX0dQSU9fR0QoVEVBXzI1NlBDU19XUklURV9FTkFCTEUpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1NfQlVTX0NMT0NLKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENTX0RBVEEpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfQlVTX0NMT0NLKSB8CisJCSBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfV1JJVEVfRU5BQkxFKSk7CisJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwl1ZGVsYXkoMSk7CisKKwl3aGlsZSAoaS0tKSB7CisJCWlmICh2YWwgJiAoMSA8PCBpKSkKKwkJCXJlZyB8PSBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfREFUQSk7CisJCWVsc2UKKwkJCXJlZyAmPSB+Rk04MDFfR1BJT19HUChURUFfMjU2UENTX0RBVEEpOworCQlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCQl1ZGVsYXkoMSk7CisJCXJlZyB8PSBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfQlVTX0NMT0NLKTsKKwkJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwkJcmVnICY9IH5GTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfQlVTX0NMT0NLKTsKKwkJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwkJdWRlbGF5KDEpOworCX0KKworCS8qIGFuZCByZXNldCB0aGUgd3JpdGUgZW5hYmxlIGJpdCAqLworCXJlZyB8PSBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDU19EQVRBKTsKKwlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9mbTgwMV90ZWE1NzV4XzI1NnBjc19yZWFkKHRlYTU3NXhfdCAqdGVhKQoreworCWZtODAxX3QgKmNoaXAgPSB0ZWEtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCByZWc7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisJaW50IGk7CisJCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJlZyA9IGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJLyogdXNlIEdQSU8gbGluZXMsIHNldCBkYXRhIGRpcmVjdGlvbiB0byBpbnB1dCAqLworCXJlZyB8PSBGTTgwMV9HUElPX0dTKFRFQV8yNTZQQ1NfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dTKFRFQV8yNTZQQ1NfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDU19CVVNfQ0xPQ0spIHwKKwkgICAgICAgRk04MDFfR1BJT19HRChURUFfMjU2UENTX0RBVEEpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENTX0RBVEEpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENTX1dSSVRFX0VOQUJMRSk7CisJLyogYWxsIG9mIGxpbmVzIGFyZSBpbiB0aGUgd3JpdGUgZGlyZWN0aW9uLCBleGNlcHQgZGF0YSAqLworCS8qIGNsZWFyIGRhdGEsIHdyaXRlIGVuYWJsZSBhbmQgY2xvY2sgbGluZXMgKi8KKwlyZWcgJj0gfihGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1NfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HRChURUFfMjU2UENTX0JVU19DTE9DSykgfAorCSAgICAgICAgIEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDU19CVVNfQ0xPQ0spKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7CisJCXJlZyAmPSB+Rk04MDFfR1BJT19HUChURUFfMjU2UENTX0JVU19DTE9DSyk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwkJcmVnIHw9IEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDU19CVVNfQ0xPQ0spOworCQlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCQl1ZGVsYXkoMSk7CisJCXZhbCA8PD0gMTsKKwkJaWYgKGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSkgJiBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1NfREFUQSkpCisJCQl2YWwgfD0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qIDI1NlBDUFIgR1BJTyBudW1iZXJzICovCisjZGVmaW5lIFRFQV8yNTZQQ1BSX0JVU19DTE9DSwkJMAorI2RlZmluZSBURUFfMjU2UENQUl9EQVRBCQkxCisjZGVmaW5lIFRFQV8yNTZQQ1BSX1dSSVRFX0VOQUJMRQkyCS8qIGludmVydGVkICovCisKK3N0YXRpYyB2b2lkIHNuZF9mbTgwMV90ZWE1NzV4XzI1NnBjcHJfd3JpdGUodGVhNTc1eF90ICp0ZWEsIHVuc2lnbmVkIGludCB2YWwpCit7CisJZm04MDFfdCAqY2hpcCA9IHRlYS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIHNob3J0IHJlZzsKKwlpbnQgaSA9IDI1OworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJlZyA9IGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJLyogdXNlIEdQSU8gbGluZXMgYW5kIHNldCB3cml0ZSBlbmFibGUgYml0ICovCisJcmVnIHw9IEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDUFJfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dTKFRFQV8yNTZQQ1BSX1dSSVRFX0VOQUJMRSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dTKFRFQV8yNTZQQ1BSX0JVU19DTE9DSyk7CisJLyogYWxsIG9mIGxpbmVzIGFyZSBpbiB0aGUgd3JpdGUgZGlyZWN0aW9uICovCisJLyogY2xlYXIgZGF0YSBhbmQgY2xvY2sgbGluZXMgKi8KKwlyZWcgJj0gfihGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1BSX0RBVEEpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1BSX1dSSVRFX0VOQUJMRSkgfAorCSAgICAgICAgIEZNODAxX0dQSU9fR0QoVEVBXzI1NlBDUFJfQlVTX0NMT0NLKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9EQVRBKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9CVVNfQ0xPQ0spIHwKKwkJIEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDUFJfV1JJVEVfRU5BQkxFKSk7CisJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwl1ZGVsYXkoMSk7CisKKwl3aGlsZSAoaS0tKSB7CisJCWlmICh2YWwgJiAoMSA8PCBpKSkKKwkJCXJlZyB8PSBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1BSX0RBVEEpOworCQllbHNlCisJCQlyZWcgJj0gfkZNODAxX0dQSU9fR1AoVEVBXzI1NlBDUFJfREFUQSk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwkJcmVnIHw9IEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDUFJfQlVTX0NMT0NLKTsKKwkJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwkJcmVnICY9IH5GTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1BSX0JVU19DTE9DSyk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBhbmQgcmVzZXQgdGhlIHdyaXRlIGVuYWJsZSBiaXQgKi8KKwlyZWcgfD0gRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9XUklURV9FTkFCTEUpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9EQVRBKTsKKwlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9mbTgwMV90ZWE1NzV4XzI1NnBjcHJfcmVhZCh0ZWE1NzV4X3QgKnRlYSkKK3sKKwlmbTgwMV90ICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgcmVnOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCWludCBpOworCQorCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZWcgPSBpbncoRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCS8qIHVzZSBHUElPIGxpbmVzLCBzZXQgZGF0YSBkaXJlY3Rpb24gdG8gaW5wdXQgKi8KKwlyZWcgfD0gRk04MDFfR1BJT19HUyhURUFfMjU2UENQUl9EQVRBKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDUFJfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1MoVEVBXzI1NlBDUFJfQlVTX0NMT0NLKSB8CisJICAgICAgIEZNODAxX0dQSU9fR0QoVEVBXzI1NlBDUFJfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1BSX0RBVEEpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9XUklURV9FTkFCTEUpOworCS8qIGFsbCBvZiBsaW5lcyBhcmUgaW4gdGhlIHdyaXRlIGRpcmVjdGlvbiwgZXhjZXB0IGRhdGEgKi8KKwkvKiBjbGVhciBkYXRhLCB3cml0ZSBlbmFibGUgYW5kIGNsb2NrIGxpbmVzICovCisJcmVnICY9IH4oRk04MDFfR1BJT19HRChURUFfMjU2UENQUl9XUklURV9FTkFCTEUpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dEKFRFQV8yNTZQQ1BSX0JVU19DTE9DSykgfAorCSAgICAgICAgIEZNODAxX0dQSU9fR1AoVEVBXzI1NlBDUFJfQlVTX0NMT0NLKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgeworCQlyZWcgJj0gfkZNODAxX0dQSU9fR1AoVEVBXzI1NlBDUFJfQlVTX0NMT0NLKTsKKwkJb3V0dyhyZWcsIEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwkJdWRlbGF5KDEpOworCQlyZWcgfD0gRk04MDFfR1BJT19HUChURUFfMjU2UENQUl9CVVNfQ0xPQ0spOworCQlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCQl1ZGVsYXkoMSk7CisJCXZhbCA8PD0gMTsKKwkJaWYgKGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSkgJiBGTTgwMV9HUElPX0dQKFRFQV8yNTZQQ1BSX0RBVEEpKQorCQkJdmFsIHw9IDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKiA2NFBDUiBHUElPIG51bWJlcnMgKi8KKyNkZWZpbmUgVEVBXzY0UENSX0JVU19DTE9DSwkJMAorI2RlZmluZSBURUFfNjRQQ1JfV1JJVEVfRU5BQkxFCQkxCS8qIGludmVydGVkICovCisjZGVmaW5lIFRFQV82NFBDUl9EQVRBCQkJMgorCitzdGF0aWMgdm9pZCBzbmRfZm04MDFfdGVhNTc1eF82NHBjcl93cml0ZSh0ZWE1NzV4X3QgKnRlYSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlmbTgwMV90ICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgcmVnOworCWludCBpID0gMjU7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmVnID0gaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKKwkvKiB1c2UgR1BJTyBsaW5lcyBhbmQgc2V0IHdyaXRlIGVuYWJsZSBiaXQgKi8KKwlyZWcgfD0gRk04MDFfR1BJT19HUyhURUFfNjRQQ1JfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dTKFRFQV82NFBDUl9XUklURV9FTkFCTEUpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUyhURUFfNjRQQ1JfQlVTX0NMT0NLKTsKKwkvKiBhbGwgb2YgbGluZXMgYXJlIGluIHRoZSB3cml0ZSBkaXJlY3Rpb24gKi8KKwkvKiBjbGVhciBkYXRhIGFuZCBjbG9jayBsaW5lcyAqLworCXJlZyAmPSB+KEZNODAxX0dQSU9fR0QoVEVBXzY0UENSX0RBVEEpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dEKFRFQV82NFBDUl9XUklURV9FTkFCTEUpIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dEKFRFQV82NFBDUl9CVVNfQ0xPQ0spIHwKKwkgICAgICAgICBGTTgwMV9HUElPX0dQKFRFQV82NFBDUl9EQVRBKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HUChURUFfNjRQQ1JfQlVTX0NMT0NLKSB8CisJCSBGTTgwMV9HUElPX0dQKFRFQV82NFBDUl9XUklURV9FTkFCTEUpKTsKKwlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCXVkZWxheSgxKTsKKworCXdoaWxlIChpLS0pIHsKKwkJaWYgKHZhbCAmICgxIDw8IGkpKQorCQkJcmVnIHw9IEZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0RBVEEpOworCQllbHNlCisJCQlyZWcgJj0gfkZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0RBVEEpOworCQlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCQl1ZGVsYXkoMSk7CisJCXJlZyB8PSBGTTgwMV9HUElPX0dQKFRFQV82NFBDUl9CVVNfQ0xPQ0spOworCQlvdXR3KHJlZywgRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCQlyZWcgJj0gfkZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0JVU19DTE9DSyk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBhbmQgcmVzZXQgdGhlIHdyaXRlIGVuYWJsZSBiaXQgKi8KKwlyZWcgfD0gRk04MDFfR1BJT19HUChURUFfNjRQQ1JfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgIEZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0RBVEEpOworCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2ZtODAxX3RlYTU3NXhfNjRwY3JfcmVhZCh0ZWE1NzV4X3QgKnRlYSkKK3sKKwlmbTgwMV90ICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgcmVnOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCWludCBpOworCQorCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZWcgPSBpbncoRk04MDFfUkVHKGNoaXAsIEdQSU9fQ1RSTCkpOworCS8qIHVzZSBHUElPIGxpbmVzLCBzZXQgZGF0YSBkaXJlY3Rpb24gdG8gaW5wdXQgKi8KKwlyZWcgfD0gRk04MDFfR1BJT19HUyhURUFfNjRQQ1JfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dTKFRFQV82NFBDUl9XUklURV9FTkFCTEUpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUyhURUFfNjRQQ1JfQlVTX0NMT0NLKSB8CisJICAgICAgIEZNODAxX0dQSU9fR0QoVEVBXzY0UENSX0RBVEEpIHwKKwkgICAgICAgRk04MDFfR1BJT19HUChURUFfNjRQQ1JfREFUQSkgfAorCSAgICAgICBGTTgwMV9HUElPX0dQKFRFQV82NFBDUl9XUklURV9FTkFCTEUpOworCS8qIGFsbCBvZiBsaW5lcyBhcmUgaW4gdGhlIHdyaXRlIGRpcmVjdGlvbiwgZXhjZXB0IGRhdGEgKi8KKwkvKiBjbGVhciBkYXRhLCB3cml0ZSBlbmFibGUgYW5kIGNsb2NrIGxpbmVzICovCisJcmVnICY9IH4oRk04MDFfR1BJT19HRChURUFfNjRQQ1JfV1JJVEVfRU5BQkxFKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HRChURUFfNjRQQ1JfQlVTX0NMT0NLKSB8CisJICAgICAgICAgRk04MDFfR1BJT19HUChURUFfNjRQQ1JfQlVTX0NMT0NLKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgeworCQlyZWcgJj0gfkZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0JVU19DTE9DSyk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwkJcmVnIHw9IEZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0JVU19DTE9DSyk7CisJCW91dHcocmVnLCBGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7CisJCXVkZWxheSgxKTsKKwkJdmFsIDw8PSAxOworCQlpZiAoaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKSAmIEZNODAxX0dQSU9fR1AoVEVBXzY0UENSX0RBVEEpKQorCQkJdmFsIHw9IDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3RydWN0IHNuZF90ZWE1NzV4X29wcyBzbmRfZm04MDFfdGVhX29wc1szXSA9IHsKKwl7CisJCS8qIDEgPSBNZWRpYUZvcnRlIDI1Ni1QQ1MgKi8KKwkJLndyaXRlID0gc25kX2ZtODAxX3RlYTU3NXhfMjU2cGNzX3dyaXRlLAorCQkucmVhZCA9IHNuZF9mbTgwMV90ZWE1NzV4XzI1NnBjc19yZWFkLAorCX0sCisJeworCQkvKiAyID0gTWVkaWFGb3J0ZSAyNTYtUENQUiAqLworCQkud3JpdGUgPSBzbmRfZm04MDFfdGVhNTc1eF8yNTZwY3ByX3dyaXRlLAorCQkucmVhZCA9IHNuZF9mbTgwMV90ZWE1NzV4XzI1NnBjcHJfcmVhZCwKKwl9LAorCXsKKwkJLyogMyA9IE1lZGlhRm9ydGUgNjQtUENSICovCisJCS53cml0ZSA9IHNuZF9mbTgwMV90ZWE1NzV4XzY0cGNyX3dyaXRlLAorCQkucmVhZCA9IHNuZF9mbTgwMV90ZWE1NzV4XzY0cGNyX3JlYWQsCisJfQorfTsKKyNlbmRpZgorCisvKgorICogIE1peGVyIHJvdXRpbmVzCisgKi8KKworI2RlZmluZSBGTTgwMV9TSU5HTEUoeG5hbWUsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfZm04MDFfaW5mb19zaW5nbGUsIFwKKyAgLmdldCA9IHNuZF9mbTgwMV9nZXRfc2luZ2xlLCAucHV0ID0gc25kX2ZtODAxX3B1dF9zaW5nbGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSByZWcgfCAoc2hpZnQgPDwgOCkgfCAobWFzayA8PCAxNikgfCAoaW52ZXJ0IDw8IDI0KSB9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX2luZm9fc2luZ2xlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZm04MDFfZ2V0X3NpbmdsZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWZtODAxX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoaW53KGNoaXAtPnBvcnQgKyByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKGludmVydCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX3B1dF9zaW5nbGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlmbTgwMV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKKwlpZiAoaW52ZXJ0KQorCQl2YWwgPSBtYXNrIC0gdmFsOworCXJldHVybiBzbmRfZm04MDFfdXBkYXRlX2JpdHMoY2hpcCwgcmVnLCBtYXNrIDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQpOworfQorCisjZGVmaW5lIEZNODAxX0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5mbyA9IHNuZF9mbTgwMV9pbmZvX2RvdWJsZSwgXAorICAuZ2V0ID0gc25kX2ZtODAxX2dldF9kb3VibGUsIC5wdXQgPSBzbmRfZm04MDFfcHV0X2RvdWJsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9IHJlZyB8IChzaGlmdF9sZWZ0IDw8IDgpIHwgKHNoaWZ0X3JpZ2h0IDw8IDEyKSB8IChtYXNrIDw8IDE2KSB8IChpbnZlcnQgPDwgMjQpIH0KKworc3RhdGljIGludCBzbmRfZm04MDFfaW5mb19kb3VibGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKworCXVpbmZvLT50eXBlID0gbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9nZXRfZG91YmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHNoaWZ0X3JpZ2h0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoaW53KGNoaXAtPnBvcnQgKyByZWcpID4+IHNoaWZ0X2xlZnQpICYgbWFzazsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChpbncoY2hpcC0+cG9ydCArIHJlZykgPj4gc2hpZnRfcmlnaHQpICYgbWFzazsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoaW52ZXJ0KSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX3B1dF9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlmbTgwMV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0X2xlZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweDBmOworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCXVuc2lnbmVkIHNob3J0IHZhbDEsIHZhbDI7CisgCisJdmFsMSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKKwl2YWwyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdmFsMSA9IG1hc2sgLSB2YWwxOworCQl2YWwyID0gbWFzayAtIHZhbDI7CisJfQorCXJldHVybiBzbmRfZm04MDFfdXBkYXRlX2JpdHMoY2hpcCwgcmVnLAorCQkJCSAgICAgKG1hc2sgPDwgc2hpZnRfbGVmdCkgfCAobWFzayA8PCBzaGlmdF9yaWdodCksCisJCQkJICAgICAodmFsMSA8PCBzaGlmdF9sZWZ0ICkgfCAodmFsMiA8PCBzaGlmdF9yaWdodCkpOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9pbmZvX211eChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNV0gPSB7CisJCSJBQzk3IFByaW1hcnkiLCAiRk0iLCAiSTJTIiwgIlBDTSIsICJBQzk3IFNlY29uZGFyeSIKKwl9OworIAorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA1OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gNCkKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDQ7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZm04MDFfZ2V0X211eChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWZtODAxX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbDsKKyAKKwl2YWwgPSBpbncoRk04MDFfUkVHKGNoaXAsIFJFQ19TUkMpKSAmIDc7CisJaWYgKHZhbCA+IDQpCisJCXZhbCA9IDQ7CisgICAgICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB2YWw7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9mbTgwMV9wdXRfbXV4KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJZm04MDFfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsOworIAorICAgICAgICBpZiAoKHZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pID4gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc25kX2ZtODAxX3VwZGF0ZV9iaXRzKGNoaXAsIEZNODAxX1JFQ19TUkMsIDcsIHZhbCk7Cit9CisKKyNkZWZpbmUgRk04MDFfQ09OVFJPTFMgKHNpemVvZihzbmRfZm04MDFfY29udHJvbHMpL3NpemVvZihzbmRfa2NvbnRyb2xfbmV3X3QpKQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9mbTgwMV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitGTTgwMV9ET1VCTEUoIldhdmUgUGxheWJhY2sgVm9sdW1lIiwgRk04MDFfUENNX1ZPTCwgMCwgOCwgMzEsIDEpLAorRk04MDFfU0lOR0xFKCJXYXZlIFBsYXliYWNrIFN3aXRjaCIsIEZNODAxX1BDTV9WT0wsIDE1LCAxLCAxKSwKK0ZNODAxX0RPVUJMRSgiSTJTIFBsYXliYWNrIFZvbHVtZSIsIEZNODAxX0kyU19WT0wsIDAsIDgsIDMxLCAxKSwKK0ZNODAxX1NJTkdMRSgiSTJTIFBsYXliYWNrIFN3aXRjaCIsIEZNODAxX0kyU19WT0wsIDE1LCAxLCAxKSwKK0ZNODAxX0RPVUJMRSgiRk0gUGxheWJhY2sgVm9sdW1lIiwgRk04MDFfRk1fVk9MLCAwLCA4LCAzMSwgMSksCitGTTgwMV9TSU5HTEUoIkZNIFBsYXliYWNrIFN3aXRjaCIsIEZNODAxX0ZNX1ZPTCwgMTUsIDEsIDEpLAoreworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkRpZ2l0YWwgQ2FwdHVyZSBTb3VyY2UiLAorCS5pbmZvID0gc25kX2ZtODAxX2luZm9fbXV4LAorCS5nZXQgPSBzbmRfZm04MDFfZ2V0X211eCwKKwkucHV0ID0gc25kX2ZtODAxX3B1dF9tdXgsCit9Cit9OworCisjZGVmaW5lIEZNODAxX0NPTlRST0xTX01VTFRJIChzaXplb2Yoc25kX2ZtODAxX2NvbnRyb2xzX211bHRpKS9zaXplb2Yoc25kX2tjb250cm9sX25ld190KSkKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZm04MDFfY29udHJvbHNfbXVsdGlbXSBfX2RldmluaXRkYXRhID0geworRk04MDFfU0lOR0xFKCJBQzk3IDJjaC0+NGNoIENvcHkgU3dpdGNoIiwgRk04MDFfQ09ERUNfQ1RSTCwgNywgMSwgMCksCitGTTgwMV9TSU5HTEUoIkFDOTcgMTgtYml0IFN3aXRjaCIsIEZNODAxX0NPREVDX0NUUkwsIDEwLCAxLCAwKSwKK0ZNODAxX1NJTkdMRSgiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgRk04MDFfSTJTX01PREUsIDgsIDEsIDApLAorRk04MDFfU0lOR0xFKCJJRUM5NTggUmF3IERhdGEgUGxheWJhY2sgU3dpdGNoIiwgRk04MDFfSTJTX01PREUsIDksIDEsIDApLAorRk04MDFfU0lOR0xFKCJJRUM5NTggUmF3IERhdGEgQ2FwdHVyZSBTd2l0Y2giLCBGTTgwMV9JMlNfTU9ERSwgMTAsIDEsIDApLAorRk04MDFfU0lOR0xFKCJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiwgRk04MDFfR0VOX0NUUkwsIDIsIDEsIDApLAorfTsKKworc3RhdGljIHZvaWQgc25kX2ZtODAxX21peGVyX2ZyZWVfYWM5N19idXMoYWM5N19idXNfdCAqYnVzKQoreworCWZtODAxX3QgKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwljaGlwLT5hYzk3X2J1cyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9mbTgwMV9taXhlcl9mcmVlX2FjOTcoYWM5N190ICphYzk3KQoreworCWZtODAxX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaWYgKGFjOTctPm51bSA9PSAwKSB7CisJCWNoaXAtPmFjOTcgPSBOVUxMOworCX0gZWxzZSB7CisJCWNoaXAtPmFjOTdfc2VjID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9mbTgwMV9taXhlcihmbTgwMV90ICpjaGlwKQoreworCWFjOTdfdGVtcGxhdGVfdCBhYzk3OworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX2ZtODAxX2NvZGVjX3dyaXRlLAorCQkucmVhZCA9IHNuZF9mbTgwMV9jb2RlY19yZWFkLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjaGlwLT5jYXJkLCAwLCAmb3BzLCBjaGlwLCAmY2hpcC0+YWM5N19idXMpKSA8IDApCisJCXJldHVybiBlcnI7CisJY2hpcC0+YWM5N19idXMtPnByaXZhdGVfZnJlZSA9IHNuZF9mbTgwMV9taXhlcl9mcmVlX2FjOTdfYnVzOworCisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9mbTgwMV9taXhlcl9mcmVlX2FjOTc7CisJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihjaGlwLT5hYzk3X2J1cywgJmFjOTcsICZjaGlwLT5hYzk3KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChjaGlwLT5zZWNvbmRhcnkpIHsKKwkJYWM5Ny5udW0gPSAxOworCQlhYzk3LmFkZHIgPSBjaGlwLT5zZWNvbmRhcnlfYWRkcjsKKwkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihjaGlwLT5hYzk3X2J1cywgJmFjOTcsICZjaGlwLT5hYzk3X3NlYykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWZvciAoaSA9IDA7IGkgPCBGTTgwMV9DT05UUk9MUzsgaSsrKQorCQlzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9mbTgwMV9jb250cm9sc1tpXSwgY2hpcCkpOworCWlmIChjaGlwLT5tdWx0aWNoYW5uZWwpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZNODAxX0NPTlRST0xTX01VTFRJOyBpKyspCisJCQlzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9mbTgwMV9jb250cm9sc19tdWx0aVtpXSwgY2hpcCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBpbml0aWFsaXphdGlvbiByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX2ZyZWUoZm04MDFfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjbWR3OworCisJaWYgKGNoaXAtPmlycSA8IDApCisJCWdvdG8gX19lbmRfaHc7CisKKwkvKiBpbnRlcnJ1cHQgc2V0dXAgLSBtYXNrIGV2ZXJ5dGhpbmcgKi8KKwljbWR3ID0gaW53KEZNODAxX1JFRyhjaGlwLCBJUlFfTUFTSykpOworCWNtZHcgfD0gMHgwMGMzOworCW91dHcoY21kdywgRk04MDFfUkVHKGNoaXAsIElSUV9NQVNLKSk7CisKKyAgICAgIF9fZW5kX2h3OgorI2lmZGVmIFRFQTU3NVhfUkFESU8KKwlzbmRfdGVhNTc1eF9leGl0KCZjaGlwLT50ZWEpOworI2VuZGlmCisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ZtODAxX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWZtODAxX3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfZm04MDFfZnJlZShjaGlwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ZtODAxX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqIHBjaSwKKwkJCQkgICAgICBpbnQgdGVhNTc1eF90dW5lciwKKwkJCQkgICAgICBmbTgwMV90ICoqIHJjaGlwKQoreworCWZtODAxX3QgKmNoaXA7CisJdW5zaWduZWQgY2hhciByZXYsIGlkOworCXVuc2lnbmVkIHNob3J0IGNtZHc7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBlcnI7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfZm04MDFfZGV2X2ZyZWUsCisJfTsKKworCSpyY2hpcCA9IE5VTEw7CisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+Y2FyZCA9IGNhcmQ7CisJY2hpcC0+cGNpID0gcGNpOworCWNoaXAtPmlycSA9IC0xOworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJGTTgwMSIpKSA8IDApIHsKKwkJa2ZyZWUoY2hpcCk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZm04MDFfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJGTTgwMSIsICh2b2lkICopY2hpcCkpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBjaGlwLT5pcnEpOworCQlzbmRfZm04MDFfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKKwlpZiAocmV2ID49IDB4YjEpCS8qIEZNODAxLUFVICovCisJCWNoaXAtPm11bHRpY2hhbm5lbCA9IDE7CisKKwkvKiBjb2RlYyBjb2xkIHJlc2V0ICsgQUMnOTcgd2FybSByZXNldCAqLworCW91dHcoKDE8PDUpfCgxPDw2KSwgRk04MDFfUkVHKGNoaXAsIENPREVDX0NUUkwpKTsKKwlpbncoRk04MDFfUkVHKGNoaXAsIENPREVDX0NUUkwpKTsgLyogZmx1c2ggcG9zdGluZyBkYXRhICovCisJdWRlbGF5KDEwMCk7CisJb3V0dygwLCBGTTgwMV9SRUcoY2hpcCwgQ09ERUNfQ1RSTCkpOworCisJdGltZW91dCA9IChqaWZmaWVzICsgKDMgKiBIWikgLyA0KSArIDE7CQkvKiBtaW4gNzUwbXMgKi8KKworCW91dHcoKDE8PDcpIHwgKDAgPDwgRk04MDFfQUM5N19BRERSX1NISUZUKSwgRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSk7CisJdWRlbGF5KDUpOworCWRvIHsKKwkJaWYgKChpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSkgJiAoMzw8OCkpID09ICgxPDw4KSkKKwkJCWdvdG8gX19hYzk3X3NlY29uZGFyeTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCXNuZF9wcmludGsoIlByaW1hcnkgQUMnOTcgY29kZWMgbm90IGZvdW5kXG4iKTsKKwlzbmRfZm04MDFfZnJlZShjaGlwKTsKKwlyZXR1cm4gLUVJTzsKKworICAgICAgX19hYzk3X3NlY29uZGFyeToKKyAgICAgIAlpZiAoIWNoaXAtPm11bHRpY2hhbm5lbCkJLyogbG9va3VwIGlzIG5vdCByZXF1aXJlZCAqLworICAgICAgCQlnb3RvIF9fYWM5N19vazsKKwlmb3IgKGlkID0gMzsgaWQgPiAwOyBpZC0tKSB7CS8qIG15IGNhcmQgaGFzIHRoZSBzZWNvbmRhcnkgY29kZWMgKi8KKwkJCQkJLyogYXQgYWRkcmVzcyAjMywgc28gdGhlIGxvb3AgaXMgaW52ZXJ0ZWQgKi8KKworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMjA7CisKKwkJb3V0dygoMTw8NykgfCAoaWQgPDwgRk04MDFfQUM5N19BRERSX1NISUZUKSB8IEFDOTdfVkVORE9SX0lEMSwgRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSk7CisJCXVkZWxheSg1KTsKKwkJZG8geworCQkJaWYgKChpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfQ01EKSkgJiAoMzw8OCkpID09ICgxPDw4KSkgeworCQkJCWNtZHcgPSBpbncoRk04MDFfUkVHKGNoaXAsIEFDOTdfREFUQSkpOworCQkJCWlmIChjbWR3ICE9IDB4ZmZmZiAmJiBjbWR3ICE9IDApIHsKKwkJCQkJY2hpcC0+c2Vjb25kYXJ5ID0gMTsKKwkJCQkJY2hpcC0+c2Vjb25kYXJ5X2FkZHIgPSBpZDsKKwkJCQkJZ290byBfX2FjOTdfb2s7CisJCQkJfQorCQkJfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisJfQorCisJLyogdGhlIHJlY292ZXJ5IHBoYXNlLCBpdCBzZWVtcyB0aGF0IHByb2JpbmcgZm9yIG5vbi1leGlzdGluZyBjb2RlYyBtaWdodCAqLworCS8qIGNhdXNlIHRpbWVvdXQgcHJvYmxlbXMgKi8KKwl0aW1lb3V0ID0gKGppZmZpZXMgKyAoMyAqIEhaKSAvIDQpICsgMTsJCS8qIG1pbiA3NTBtcyAqLworCisJb3V0dygoMTw8NykgfCAoMCA8PCBGTTgwMV9BQzk3X0FERFJfU0hJRlQpLCBGTTgwMV9SRUcoY2hpcCwgQUM5N19DTUQpKTsKKwl1ZGVsYXkoNSk7CisJZG8geworCQlpZiAoKGludyhGTTgwMV9SRUcoY2hpcCwgQUM5N19DTUQpKSAmICgzPDw4KSkgPT0gKDE8PDgpKQorCQkJZ290byBfX2FjOTdfb2s7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKwlzbmRfcHJpbnRrKCJQcmltYXJ5IEFDJzk3IGNvZGVjIG5vdCByZXNwb25kaW5nXG4iKTsKKwlzbmRfZm04MDFfZnJlZShjaGlwKTsKKwlyZXR1cm4gLUVJTzsKKworICAgICAgX19hYzk3X29rOgorCisJLyogaW5pdCB2b2x1bWUgKi8KKwlvdXR3KDB4MDgwOCwgRk04MDFfUkVHKGNoaXAsIFBDTV9WT0wpKTsKKwlvdXR3KDB4OWYxZiwgRk04MDFfUkVHKGNoaXAsIEZNX1ZPTCkpOworCW91dHcoMHg4ODA4LCBGTTgwMV9SRUcoY2hpcCwgSTJTX1ZPTCkpOworCisJLyogSTJTIGNvbnRyb2wgLSBJMlMgbW9kZSAqLworCW91dHcoMHgwMDAzLCBGTTgwMV9SRUcoY2hpcCwgSTJTX01PREUpKTsKKworCS8qIGludGVycnVwdCBzZXR1cCAtIHVubWFzayBNUFUsIFBMQVlCQUNLICYgQ0FQVFVSRSAqLworCWNtZHcgPSBpbncoRk04MDFfUkVHKGNoaXAsIElSUV9NQVNLKSk7CisJY21kdyAmPSB+MHgwMDgzOworCW91dHcoY21kdywgRk04MDFfUkVHKGNoaXAsIElSUV9NQVNLKSk7CisKKwkvKiBpbnRlcnJ1cHQgY2xlYXIgKi8KKwlvdXR3KEZNODAxX0lSUV9QTEFZQkFDS3xGTTgwMV9JUlFfQ0FQVFVSRXxGTTgwMV9JUlFfTVBVLCBGTTgwMV9SRUcoY2hpcCwgSVJRX1NUQVRVUykpOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX2ZtODAxX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisjaWZkZWYgVEVBNTc1WF9SQURJTworCWlmICh0ZWE1NzV4X3R1bmVyID4gMCAmJiAodGVhNTc1eF90dW5lciAmIDB4ZmZmZikgPCA0KSB7CisJCWNoaXAtPnRlYS5kZXZfbnIgPSB0ZWE1NzV4X3R1bmVyID4+IDE2OworCQljaGlwLT50ZWEuY2FyZCA9IGNhcmQ7CisJCWNoaXAtPnRlYS5mcmVxX2ZpeHVwID0gMTA3MDA7CisJCWNoaXAtPnRlYS5wcml2YXRlX2RhdGEgPSBjaGlwOworCQljaGlwLT50ZWEub3BzID0gJnNuZF9mbTgwMV90ZWFfb3BzWyh0ZWE1NzV4X3R1bmVyICYgMHhmZmZmKSAtIDFdOworCQlzbmRfdGVhNTc1eF9pbml0KCZjaGlwLT50ZWEpOworCX0KKyNlbmRpZgorCisJKnJjaGlwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NhcmRfZm04MDFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJZm04MDFfdCAqY2hpcDsKKwlvcGwzX3QgKm9wbDM7CisJaW50IGVycjsKKworICAgICAgICBpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoZXJyID0gc25kX2ZtODAxX2NyZWF0ZShjYXJkLCBwY2ksIHRlYTU3NXhfdHVuZXJbZGV2XSwgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiRk04MDEiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRm9ydGVNZWRpYSBGTTgwMS0iKTsKKwlzdHJjYXQoY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5tdWx0aWNoYW5uZWwgPyAiQVUiIDogIkFTIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPnBvcnQsIGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9mbTgwMV9wY20oY2hpcCwgMCwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9mbTgwMV9taXhlcihjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRk04MDEsCisJCQkJICAgICAgIEZNODAxX1JFRyhjaGlwLCBNUFU0MDFfREFUQSksIDEsCisJCQkJICAgICAgIGNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX29wbDNfY3JlYXRlKGNhcmQsIEZNODAxX1JFRyhjaGlwLCBPUEwzX0JBTkswKSwKKwkJCQkgICBGTTgwMV9SRUcoY2hpcCwgT1BMM19CQU5LMSksCisJCQkJICAgT1BMM19IV19PUEwzX0ZNODAxLCAxLCAmb3BsMykpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2NhcmRfZm04MDFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiRk04MDEiLAorCS5pZF90YWJsZSA9IHNuZF9mbTgwMV9pZHMsCisJLnByb2JlID0gc25kX2NhcmRfZm04MDFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2ZtODAxX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfZm04MDFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfZm04MDFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2ZtODAxX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfZm04MDFfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGE1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorc25kLWhkYS1pbnRlbC1vYmpzIDo9IGhkYV9pbnRlbC5vCitzbmQtaGRhLWNvZGVjLW9ianMgOj0gaGRhX2NvZGVjLm8gaGRhX2dlbmVyaWMubyBwYXRjaF9yZWFsdGVrLm8gcGF0Y2hfY21lZGlhLm8gcGF0Y2hfYW5hbG9nLm8KK2lmZGVmIENPTkZJR19QUk9DX0ZTCitzbmQtaGRhLWNvZGVjLW9ianMgKz0gaGRhX3Byb2MubworZW5kaWYKKworb2JqLSQoQ09ORklHX1NORF9IREFfSU5URUwpICs9IHNuZC1oZGEtaW50ZWwubyBzbmQtaGRhLWNvZGVjLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDExN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC0wLDAgKzEsMTg1NiBAQAorLyoKKyAqIFVuaXZlcnNhbCBJbnRlcmZhY2UgZm9yIEludGVsIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCisKKworTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVbml2ZXJzYWwgaW50ZXJmYWNlIGZvciBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKgorICogdmVuZG9yIC8gcHJlc2V0IHRhYmxlCisgKi8KKworc3RydWN0IGhkYV92ZW5kb3JfaWQgeworCXVuc2lnbmVkIGludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworLyogY29kZWMgdmVuZG9yIGxhYmVscyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVuZG9yX2lkIGhkYV92ZW5kb3JfaWRzW10gPSB7CisJeyAweDEwZWMsICJSZWFsdGVrIiB9LAorCXsgMHgxM2Y2LCAiQy1NZWRpYSIgfSwKKwl7IDB4NDM0ZCwgIkMtTWVkaWEiIH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworLyogY29kZWMgcHJlc2V0cyAqLworI2luY2x1ZGUgImhkYV9wYXRjaC5oIgorCisKKy8qKgorICogc25kX2hkYV9jb2RlY19yZWFkIC0gc2VuZCBhIGNvbW1hbmQgYW5kIGdldCB0aGUgcmVzcG9uc2UKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHNlbmQgdGhlIGNvbW1hbmQKKyAqIEBkaXJlY3Q6IGRpcmVjdCBmbGFnCisgKiBAdmVyYjogdGhlIHZlcmIgdG8gc2VuZAorICogQHBhcm06IHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSB2ZXJiCisgKgorICogU2VuZCBhIHNpbmdsZSBjb21tYW5kIGFuZCByZWFkIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICoKKyAqIFJldHVybnMgdGhlIG9idGFpbmVkIHJlc3BvbnNlIHZhbHVlLCBvciAtMSBmb3IgYW4gZXJyb3IuCisgKi8KK3Vuc2lnbmVkIGludCBzbmRfaGRhX2NvZGVjX3JlYWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXJlY3QsCisJCQkJdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtKQoreworCXVuc2lnbmVkIGludCByZXM7CisJZG93bigmY29kZWMtPmJ1cy0+Y21kX211dGV4KTsKKwlpZiAoISBjb2RlYy0+YnVzLT5vcHMuY29tbWFuZChjb2RlYywgbmlkLCBkaXJlY3QsIHZlcmIsIHBhcm0pKQorCQlyZXMgPSBjb2RlYy0+YnVzLT5vcHMuZ2V0X3Jlc3BvbnNlKGNvZGVjKTsKKwllbHNlCisJCXJlcyA9ICh1bnNpZ25lZCBpbnQpLTE7CisJdXAoJmNvZGVjLT5idXMtPmNtZF9tdXRleCk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzbmRfaGRhX2NvZGVjX3dyaXRlIC0gc2VuZCBhIHNpbmdsZSBjb21tYW5kIHdpdGhvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHNlbmQgdGhlIGNvbW1hbmQKKyAqIEBkaXJlY3Q6IGRpcmVjdCBmbGFnCisgKiBAdmVyYjogdGhlIHZlcmIgdG8gc2VuZAorICogQHBhcm06IHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSB2ZXJiCisgKgorICogU2VuZCBhIHNpbmdsZSBjb21tYW5kIHdpdGhvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFfY29kZWNfd3JpdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXJlY3QsCisJCQkgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtKQoreworCWludCBlcnI7CisJZG93bigmY29kZWMtPmJ1cy0+Y21kX211dGV4KTsKKwllcnIgPSBjb2RlYy0+YnVzLT5vcHMuY29tbWFuZChjb2RlYywgbmlkLCBkaXJlY3QsIHZlcmIsIHBhcm0pOworCXVwKCZjb2RlYy0+YnVzLT5jbWRfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc25kX2hkYV9zZXF1ZW5jZV93cml0ZSAtIHNlcXVlbmNlIHdyaXRlcworICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCisgKiBAc2VxOiBWRVJCIGFycmF5IHRvIHNlbmQKKyAqCisgKiBTZW5kIHRoZSBjb21tYW5kcyBzZXF1ZW50aWFsbHkgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuCisgKiBUaGUgYXJyYXkgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggTklEPTAuCisgKi8KK3ZvaWQgc25kX2hkYV9zZXF1ZW5jZV93cml0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXEpCit7CisJZm9yICg7IHNlcS0+bmlkOyBzZXErKykKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc2VxLT5uaWQsIDAsIHNlcS0+dmVyYiwgc2VxLT5wYXJhbSk7Cit9CisKKy8qKgorICogc25kX2hkYV9nZXRfc3ViX25vZGVzIC0gZ2V0IHRoZSByYW5nZSBvZiBzdWIgbm9kZXMKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHBhcnNlCisgKiBAc3RhcnRfaWQ6IHRoZSBwb2ludGVyIHRvIHN0b3JlIHRoZSBzdGFydCBOSUQKKyAqCisgKiBQYXJzZSB0aGUgTklEIGFuZCBzdG9yZSB0aGUgc3RhcnQgTklEIG9mIGl0cyBzdWItbm9kZXMuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViLW5vZGVzLgorICovCitpbnQgc25kX2hkYV9nZXRfc3ViX25vZGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBoZGFfbmlkX3QgKnN0YXJ0X2lkKQoreworCXVuc2lnbmVkIGludCBwYXJtOworCisJcGFybSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfTk9ERV9DT1VOVCk7CisJKnN0YXJ0X2lkID0gKHBhcm0gPj4gMTYpICYgMHg3ZmZmOworCXJldHVybiAoaW50KShwYXJtICYgMHg3ZmZmKTsKK30KKworLyoqCisgKiBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyAtIGdldCBjb25uZWN0aW9uIGxpc3QKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHBhcnNlCisgKiBAY29ubl9saXN0OiBjb25uZWN0aW9uIGxpc3QgYXJyYXkKKyAqIEBtYXhfY29ubnM6IG1heC4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHN0b3JlCisgKgorICogUGFyc2VzIHRoZSBjb25uZWN0aW9uIGxpc3Qgb2YgdGhlIGdpdmVuIHdpZGdldCBhbmQgc3RvcmVzIHRoZSBsaXN0CisgKiBvZiBOSURzLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25uZWN0aW9ucywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgaGRhX25pZF90ICpjb25uX2xpc3QsIGludCBtYXhfY29ubnMpCit7CisJdW5zaWduZWQgaW50IHBhcm07CisJaW50IGksIGosIGNvbm5fbGVuLCBudW1fdHVwcGxlcywgY29ubnM7CisJdW5zaWduZWQgaW50IHNoaWZ0LCBudW1fZWxlbXMsIG1hc2s7CisKKwlzbmRfYXNzZXJ0KGNvbm5fbGlzdCAmJiBtYXhfY29ubnMgPiAwLCByZXR1cm4gLUVJTlZBTCk7CisKKwlwYXJtID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9DT05OTElTVF9MRU4pOworCWlmIChwYXJtICYgQUNfQ0xJU1RfTE9ORykgeworCQkvKiBsb25nIGZvcm0gKi8KKwkJc2hpZnQgPSAxNjsKKwkJbnVtX2VsZW1zID0gMjsKKwl9IGVsc2UgeworCQkvKiBzaG9ydCBmb3JtICovCisJCXNoaWZ0ID0gODsKKwkJbnVtX2VsZW1zID0gNDsKKwl9CisJY29ubl9sZW4gPSBwYXJtICYgQUNfQ0xJU1RfTEVOR1RIOworCW51bV90dXBwbGVzID0gbnVtX2VsZW1zIC8gMjsKKwltYXNrID0gKDEgPDwgKHNoaWZ0LTEpKSAtIDE7CisKKwlpZiAoISBjb25uX2xlbikKKwkJcmV0dXJuIDA7IC8qIG5vIGNvbm5lY3Rpb24gKi8KKworCWlmIChjb25uX2xlbiA9PSAxKSB7CisJCS8qIHNpbmdsZSBjb25uZWN0aW9uICovCisJCXBhcm0gPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9MSVNULCAwKTsKKwkJY29ubl9saXN0WzBdID0gcGFybSAmIG1hc2s7CisJCXJldHVybiAxOworCX0KKworCS8qIG11bHRpIGNvbm5lY3Rpb24gKi8KKwljb25ucyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvbm5fbGVuOyBpICs9IG51bV9lbGVtcykgeworCQlwYXJtID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfTElTVCwgaSk7CisJCWZvciAoaiA9IDA7IGogPCBudW1fdHVwcGxlczsgaisrKSB7CisJCQlpbnQgcmFuZ2VfdmFsOworCQkJaGRhX25pZF90IHZhbDEsIHZhbDIsIG47CisJCQlyYW5nZV92YWwgPSBwYXJtICYgKDEgPDwgKHNoaWZ0LTEpKTsgLyogcmFuZ2VzICovCisJCQl2YWwxID0gcGFybSAmIG1hc2s7CisJCQlwYXJtID4+PSBzaGlmdDsKKwkJCXZhbDIgPSBwYXJtICYgbWFzazsKKwkJCXBhcm0gPj49IHNoaWZ0OworCQkJaWYgKHJhbmdlX3ZhbCkgeworCQkJCS8qIHJhbmdlcyBiZXR3ZWVuIHZhbDEgYW5kIHZhbDIgKi8KKwkJCQlpZiAodmFsMSA+IHZhbDIpIHsKKwkJCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogaW52YWxpZCBkZXBfcmFuZ2VfdmFsICV4OiV4XG4iLCB2YWwxLCB2YWwyKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWZvciAobiA9IHZhbDE7IG4gPD0gdmFsMjsgbisrKSB7CisJCQkJCWlmIChjb25ucyA+PSBtYXhfY29ubnMpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJY29ubl9saXN0W2Nvbm5zKytdID0gbjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghIHZhbDEpCisJCQkJCWJyZWFrOworCQkJCWlmIChjb25ucyA+PSBtYXhfY29ubnMpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWNvbm5fbGlzdFtjb25ucysrXSA9IHZhbDE7CisJCQkJaWYgKCEgdmFsMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGNvbm5zID49IG1heF9jb25ucykKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJY29ubl9saXN0W2Nvbm5zKytdID0gdmFsMjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gY29ubnM7Cit9CisKKworLyoqCisgKiBzbmRfaGRhX3F1ZXVlX3Vuc29sX2V2ZW50IC0gYWRkIGFuIHVuc29saWNpdGVkIGV2ZW50IHRvIHF1ZXVlCisgKiBAYnVzOiB0aGUgQlVTCisgKiBAcmVzOiB1bnNvbGljaXRlZCBldmVudCAobG93ZXIgMzJiaXQgb2YgUklSQiBlbnRyeSkKKyAqIEByZXNfZXg6IGNvZGVjIGFkZHIgYW5kIGZsYWdzICh1cHBlciAzMmJpdCBvciBSSVJCIGVudHJ5KQorICoKKyAqIEFkZHMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBxdWV1ZS4gIFRoZSBldmVudHMgYXJlIHByb2Nlc3NlZCBpbgorICogdGhlIHdvcmtxdWV1ZSBhc3luY2hyb25vdXNseS4gIENhbGwgdGhpcyBmdW5jdGlvbiBpbiB0aGUgaW50ZXJydXB0CisgKiBoYW5sZGVyIHdoZW4gUklSQiByZWNlaXZlcyBhbiB1bnNvbGljaXRlZCBldmVudC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgcmVzLCB1MzIgcmVzX2V4KQoreworCXN0cnVjdCBoZGFfYnVzX3Vuc29saWNpdGVkICp1bnNvbDsKKwl1bnNpZ25lZCBpbnQgd3A7CisKKwlpZiAoKHVuc29sID0gYnVzLT51bnNvbCkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl3cCA9ICh1bnNvbC0+d3AgKyAxKSAlIEhEQV9VTlNPTF9RVUVVRV9TSVpFOworCXVuc29sLT53cCA9IHdwOworCisJd3AgPDw9IDE7CisJdW5zb2wtPnF1ZXVlW3dwXSA9IHJlczsKKwl1bnNvbC0+cXVldWVbd3AgKyAxXSA9IHJlc19leDsKKworCXF1ZXVlX3dvcmsodW5zb2wtPndvcmtxLCAmdW5zb2wtPndvcmspOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jZXNzIHF1ZXVldWQgdW5zb2xpY2l0ZWQgZXZlbnRzCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfdW5zb2xfZXZlbnRzKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhkYV9idXMgKmJ1cyA9IGRhdGE7CisJc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgKnVuc29sID0gYnVzLT51bnNvbDsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwl1bnNpZ25lZCBpbnQgcnAsIGNhZGRyLCByZXM7CisKKwl3aGlsZSAodW5zb2wtPnJwICE9IHVuc29sLT53cCkgeworCQlycCA9ICh1bnNvbC0+cnAgKyAxKSAlIEhEQV9VTlNPTF9RVUVVRV9TSVpFOworCQl1bnNvbC0+cnAgPSBycDsKKwkJcnAgPDw9IDE7CisJCXJlcyA9IHVuc29sLT5xdWV1ZVtycF07CisJCWNhZGRyID0gdW5zb2wtPnF1ZXVlW3JwICsgMV07CisJCWlmICghIChjYWRkciAmICgxIDw8IDQpKSkgLyogbm8gdW5zb2xpY2l0ZWQgZXZlbnQ/ICovCisJCQljb250aW51ZTsKKwkJY29kZWMgPSBidXMtPmNhZGRyX3RibFtjYWRkciAmIDB4MGZdOworCQlpZiAoY29kZWMgJiYgY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCkKKwkJCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7CisJfQorfQorCisvKgorICogaW5pdGlhbGl6ZSB1bnNvbGljaXRlZCBxdWV1ZQorICovCitzdGF0aWMgaW50IGluaXRfdW5zb2xfcXVldWUoc3RydWN0IGhkYV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CisKKwl1bnNvbCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCp1bnNvbCksIEdGUF9LRVJORUwpOworCWlmICghIHVuc29sKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2FuJ3QgYWxsb2NhdGUgdW5zb2xpY2l0ZWQgcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdW5zb2wtPndvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZSgiaGRhX2NvZGVjIik7CisJaWYgKCEgdW5zb2wtPndvcmtxKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2FuJ3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCWtmcmVlKHVuc29sKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzLCBidXMpOworCWJ1cy0+dW5zb2wgPSB1bnNvbDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlc3RydWN0b3IKKyAqLworc3RhdGljIHZvaWQgc25kX2hkYV9jb2RlY19mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKworc3RhdGljIGludCBzbmRfaGRhX2J1c19mcmVlKHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlpZiAoISBidXMpCisJCXJldHVybiAwOworCWlmIChidXMtPnVuc29sKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGJ1cy0+dW5zb2wtPndvcmtxKTsKKwkJa2ZyZWUoYnVzLT51bnNvbCk7CisJfQorCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmYnVzLT5jb2RlY19saXN0KSB7CisJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2NvZGVjLCBsaXN0KTsKKwkJc25kX2hkYV9jb2RlY19mcmVlKGNvZGVjKTsKKwl9CisJaWYgKGJ1cy0+b3BzLnByaXZhdGVfZnJlZSkKKwkJYnVzLT5vcHMucHJpdmF0ZV9mcmVlKGJ1cyk7CisJa2ZyZWUoYnVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRhX2J1c19kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX2hkYV9idXNfZnJlZShidXMpOworfQorCisvKioKKyAqIHNuZF9oZGFfYnVzX25ldyAtIGNyZWF0ZSBhIEhEQSBidXMKKyAqIEBjYXJkOiB0aGUgY2FyZCBlbnRyeQorICogQHRlbXA6IHRoZSB0ZW1wbGF0ZSBmb3IgaGRhX2J1cyBpbmZvcm1hdGlvbgorICogQGJ1c3A6IHRoZSBwb2ludGVyIHRvIHN0b3JlIHRoZSBjcmVhdGVkIGJ1cyBpbnN0YW5jZQorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX2J1c19uZXcoc25kX2NhcmRfdCAqY2FyZCwgY29uc3Qgc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgKnRlbXAsCisJCSAgICBzdHJ1Y3QgaGRhX2J1cyAqKmJ1c3ApCit7CisJc3RydWN0IGhkYV9idXMgKmJ1czsKKwlpbnQgZXJyOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IGRldl9vcHMgPSB7CisJCS5kZXZfZnJlZSA9IHNuZF9oZGFfYnVzX2Rldl9mcmVlLAorCX07CisKKwlzbmRfYXNzZXJ0KHRlbXAsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfYXNzZXJ0KHRlbXAtPm9wcy5jb21tYW5kICYmIHRlbXAtPm9wcy5nZXRfcmVzcG9uc2UsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChidXNwKQorCQkqYnVzcCA9IE5VTEw7CisKKwlidXMgPSBrY2FsbG9jKDEsIHNpemVvZigqYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1cyA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIHN0cnVjdCBoZGFfYnVzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVzLT5jYXJkID0gY2FyZDsKKwlidXMtPnByaXZhdGVfZGF0YSA9IHRlbXAtPnByaXZhdGVfZGF0YTsKKwlidXMtPnBjaSA9IHRlbXAtPnBjaTsKKwlidXMtPm1vZGVsbmFtZSA9IHRlbXAtPm1vZGVsbmFtZTsKKwlidXMtPm9wcyA9IHRlbXAtPm9wczsKKworCWluaXRfTVVURVgoJmJ1cy0+Y21kX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmYnVzLT5jb2RlY19saXN0KTsKKworCWluaXRfdW5zb2xfcXVldWUoYnVzKTsKKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0JVUywgYnVzLCAmZGV2X29wcykpIDwgMCkgeworCQlzbmRfaGRhX2J1c19mcmVlKGJ1cyk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChidXNwKQorCQkqYnVzcCA9IGJ1czsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogZmluZCBhIG1hdGNoaW5nIGNvZGVjIHByZXNldAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgKmZpbmRfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0ICoqdGJsLCAqcHJlc2V0OworCisJZm9yICh0YmwgPSBoZGFfcHJlc2V0X3RhYmxlczsgKnRibDsgdGJsKyspIHsKKwkJZm9yIChwcmVzZXQgPSAqdGJsOyBwcmVzZXQtPmlkOyBwcmVzZXQrKykgeworCQkJdTMyIG1hc2sgPSBwcmVzZXQtPm1hc2s7CisJCQlpZiAoISBtYXNrKQorCQkJCW1hc2sgPSB+MDsKKwkJCWlmIChwcmVzZXQtPmlkID09IChjb2RlYy0+dmVuZG9yX2lkICYgbWFzaykpCisJCQkJcmV0dXJuIHByZXNldDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHNuZF9oZGFfZ2V0X2NvZGVjX25hbWUgLSBzdG9yZSB0aGUgY29kZWMgbmFtZQorICovCit2b2lkIHNuZF9oZGFfZ2V0X2NvZGVjX25hbWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJY29uc3Qgc3RydWN0IGhkYV92ZW5kb3JfaWQgKmM7CisJY29uc3QgY2hhciAqdmVuZG9yID0gTlVMTDsKKwl1MTYgdmVuZG9yX2lkID0gY29kZWMtPnZlbmRvcl9pZCA+PiAxNjsKKwljaGFyIHRtcFsxNl07CisKKwlmb3IgKGMgPSBoZGFfdmVuZG9yX2lkczsgYy0+aWQ7IGMrKykgeworCQlpZiAoYy0+aWQgPT0gdmVuZG9yX2lkKSB7CisJCQl2ZW5kb3IgPSBjLT5uYW1lOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCEgdmVuZG9yKSB7CisJCXNwcmludGYodG1wLCAiR2VuZXJpYyAlMDR4IiwgdmVuZG9yX2lkKTsKKwkJdmVuZG9yID0gdG1wOworCX0KKwlpZiAoY29kZWMtPnByZXNldCAmJiBjb2RlYy0+cHJlc2V0LT5uYW1lKQorCQlzbnByaW50ZihuYW1lLCBuYW1lbGVuLCAiJXMgJXMiLCB2ZW5kb3IsIGNvZGVjLT5wcmVzZXQtPm5hbWUpOworCWVsc2UKKwkJc25wcmludGYobmFtZSwgbmFtZWxlbiwgIiVzIElEICV4IiwgdmVuZG9yLCBjb2RlYy0+dmVuZG9yX2lkICYgMHhmZmZmKTsKK30KKworLyoKKyAqIGxvb2sgZm9yIGFuIEFGRyBub2RlCisgKgorICogcmV0dXJuIDAgaWYgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBpbnQgbG9va19mb3JfYWZnX25vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGksIHRvdGFsX25vZGVzOworCWhkYV9uaWRfdCBuaWQ7CisKKwl0b3RhbF9ub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgQUNfTk9ERV9ST09ULCAmbmlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgdG90YWxfbm9kZXM7IGkrKywgbmlkKyspIHsKKwkJaWYgKChzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0ZVTkNUSU9OX1RZUEUpICYgMHhmZikgPT0KKwkJICAgIEFDX0dSUF9BVURJT19GVU5DVElPTikKKwkJCXJldHVybiBuaWQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogY29kZWMgZGVzdHJ1Y3RvcgorICovCitzdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaWYgKCEgY29kZWMpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmY29kZWMtPmxpc3QpOworCWNvZGVjLT5idXMtPmNhZGRyX3RibFtjb2RlYy0+YWRkcl0gPSBOVUxMOworCWlmIChjb2RlYy0+cGF0Y2hfb3BzLmZyZWUpCisJCWNvZGVjLT5wYXRjaF9vcHMuZnJlZShjb2RlYyk7CisJa2ZyZWUoY29kZWMpOworfQorCitzdGF0aWMgdm9pZCBpbml0X2FtcF9oYXNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKworLyoqCisgKiBzbmRfaGRhX2NvZGVjX25ldyAtIGNyZWF0ZSBhIEhEQSBjb2RlYworICogQGJ1czogdGhlIGJ1cyB0byBhc3NpZ24KKyAqIEBjb2RlY19hZGRyOiB0aGUgY29kZWMgYWRkcmVzcworICogQGNvZGVjcDogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBjb2RlYworICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX2NvZGVjX25ldyhzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgY29kZWNfYWRkciwKKwkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwljaGFyIGNvbXBvbmVudFsxM107CisJaW50IGVycjsKKworCXNuZF9hc3NlcnQoYnVzLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydChjb2RlY19hZGRyIDw9IEhEQV9NQVhfQ09ERUNfQUREUkVTUywgcmV0dXJuIC1FSU5WQUwpOworCisJaWYgKGJ1cy0+Y2FkZHJfdGJsW2NvZGVjX2FkZHJdKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogYWRkcmVzcyAweCV4IGlzIGFscmVhZHkgb2NjdXBpZWRcbiIsIGNvZGVjX2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNvZGVjID0ga2NhbGxvYygxLCBzaXplb2YoKmNvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgc3RydWN0IGhkYV9jb2RlY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5idXMgPSBidXM7CisJY29kZWMtPmFkZHIgPSBjb2RlY19hZGRyOworCWluaXRfTVVURVgoJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJaW5pdF9hbXBfaGFzaChjb2RlYyk7CisKKwlsaXN0X2FkZF90YWlsKCZjb2RlYy0+bGlzdCwgJmJ1cy0+Y29kZWNfbGlzdCk7CisJYnVzLT5jYWRkcl90YmxbY29kZWNfYWRkcl0gPSBjb2RlYzsKKworCWNvZGVjLT52ZW5kb3JfaWQgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIEFDX05PREVfUk9PVCwgQUNfUEFSX1ZFTkRPUl9JRCk7CisJY29kZWMtPnN1YnN5c3RlbV9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULCBBQ19QQVJfU1VCU1lTVEVNX0lEKTsKKwljb2RlYy0+cmV2aXNpb25faWQgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIEFDX05PREVfUk9PVCwgQUNfUEFSX1JFVl9JRCk7CisKKwkvKiBGSVhNRTogc3VwcG9ydCBmb3IgbXVsdGlwbGUgQUZHcz8gKi8KKwljb2RlYy0+YWZnID0gbG9va19mb3JfYWZnX25vZGUoY29kZWMpOworCWlmICghIGNvZGVjLT5hZmcpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBubyBBRkcgbm9kZSBmb3VuZFxuIik7CisJCXNuZF9oZGFfY29kZWNfZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNvZGVjLT5wcmVzZXQgPSBmaW5kX2NvZGVjX3ByZXNldChjb2RlYyk7CisJaWYgKCEgKmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKQorCQlzbmRfaGRhX2dldF9jb2RlY19uYW1lKGNvZGVjLCBidXMtPmNhcmQtPm1peGVybmFtZSwKKwkJCQkgICAgICAgc2l6ZW9mKGJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKSk7CisKKwlpZiAoY29kZWMtPnByZXNldCAmJiBjb2RlYy0+cHJlc2V0LT5wYXRjaCkKKwkJZXJyID0gY29kZWMtPnByZXNldC0+cGF0Y2goY29kZWMpOworCWVsc2UKKwkJZXJyID0gc25kX2hkYV9wYXJzZV9nZW5lcmljX2NvZGVjKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfaGRhX2NvZGVjX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9oZGFfY29kZWNfcHJvY19uZXcoY29kZWMpOworCisJc3ByaW50Zihjb21wb25lbnQsICJIREE6JTA4eCIsIGNvZGVjLT52ZW5kb3JfaWQpOworCXNuZF9jb21wb25lbnRfYWRkKGNvZGVjLT5idXMtPmNhcmQsIGNvbXBvbmVudCk7CisKKwlpZiAoY29kZWNwKQorCQkqY29kZWNwID0gY29kZWM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0gLSBzZXQgdXAgdGhlIGNvZGVjIGZvciBzdHJlYW1pbmcKKyAqIEBjb2RlYzogdGhlIENPREVDIHRvIHNldCB1cAorICogQG5pZDogdGhlIE5JRCB0byBzZXQgdXAKKyAqIEBzdHJlYW1fdGFnOiBzdHJlYW0gdGFnIHRvIHBhc3MsIGl0J3MgYmV0d2VlbiAweDEgYW5kIDB4Zi4KKyAqIEBjaGFubmVsX2lkOiBjaGFubmVsIGlkIHRvIHBhc3MsIHplcm8gYmFzZWQuCisgKiBAZm9ybWF0OiBzdHJlYW0gZm9ybWF0LgorICovCit2b2lkIHNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCB1MzIgc3RyZWFtX3RhZywKKwkJCQlpbnQgY2hhbm5lbF9pZCwgaW50IGZvcm1hdCkKK3sKKwlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjX3NldHVwX3N0cmVhbTogTklEPTB4JXgsIHN0cmVhbT0weCV4LCBjaGFubmVsPSVkLCBmb3JtYXQ9MHgleFxuIiwKKwkJICAgIG5pZCwgc3RyZWFtX3RhZywgY2hhbm5lbF9pZCwgZm9ybWF0KTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NIQU5ORUxfU1RSRUFNSUQsCisJCQkgICAgKHN0cmVhbV90YWcgPDwgNCkgfCBjaGFubmVsX2lkKTsKKwltc2xlZXAoMSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCBmb3JtYXQpOworfQorCisKKy8qCisgKiBhbXAgYWNjZXNzIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgSERBX0hBU0hfS0VZKG5pZCxkaXIsaWR4KSAodTMyKSgobmlkKSArIChpZHgpICogMzIgKyAoZGlyKSAqIDY0KQorI2RlZmluZSBJTkZPX0FNUF9DQVBTCSgxPDwwKQorI2RlZmluZSBJTkZPX0FNUF9WT0wJKDE8PDEpCisKKy8qIGluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKi8KK3N0YXRpYyB2b2lkIGluaXRfYW1wX2hhc2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJbWVtc2V0KGNvZGVjLT5hbXBfaGFzaCwgMHhmZiwgc2l6ZW9mKGNvZGVjLT5hbXBfaGFzaCkpOworCWNvZGVjLT5udW1fYW1wX2VudHJpZXMgPSAwOworfQorCisvKiBxdWVyeSB0aGUgaGFzaC4gIGFsbG9jYXRlIGFuIGVudHJ5IGlmIG5vdCBmb3VuZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX2FtcF9pbmZvICpnZXRfYWxsb2NfYW1wX2hhc2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHUzMiBrZXkpCit7CisJdTE2IGlkeCA9IGtleSAlICh1MTYpQVJSQVlfU0laRShjb2RlYy0+YW1wX2hhc2gpOworCXUxNiBjdXIgPSBjb2RlYy0+YW1wX2hhc2hbaWR4XTsKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOworCisJd2hpbGUgKGN1ciAhPSAweGZmZmYpIHsKKwkJaW5mbyA9ICZjb2RlYy0+YW1wX2luZm9bY3VyXTsKKwkJaWYgKGluZm8tPmtleSA9PSBrZXkpCisJCQlyZXR1cm4gaW5mbzsKKwkJY3VyID0gaW5mby0+bmV4dDsKKwl9CisKKwkvKiBhZGQgYSBuZXcgaGFzaCBlbnRyeSAqLworCWlmIChjb2RlYy0+bnVtX2FtcF9lbnRyaWVzID49IEFSUkFZX1NJWkUoY29kZWMtPmFtcF9pbmZvKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IFRvb29vbyBtYW55IGFtcHMhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWN1ciA9IGNvZGVjLT5udW1fYW1wX2VudHJpZXMrKzsKKwlpbmZvID0gJmNvZGVjLT5hbXBfaW5mb1tjdXJdOworCWluZm8tPmtleSA9IGtleTsKKwlpbmZvLT5zdGF0dXMgPSAwOyAvKiBub3QgaW5pdGlhbGl6ZWQgeWV0ICovCisJaW5mby0+bmV4dCA9IGNvZGVjLT5hbXBfaGFzaFtpZHhdOworCWNvZGVjLT5hbXBfaGFzaFtpZHhdID0gY3VyOworCisJcmV0dXJuIGluZm87Cit9CisKKy8qCisgKiBxdWVyeSBBTVAgY2FwYWJpbGl0aWVzIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0IGFuZCBkaXJlY3Rpb24KKyAqLworc3RhdGljIHUzMiBxdWVyeV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIDApKTsKKworCWlmICghIGluZm8pCisJCXJldHVybiAwOworCWlmICghIChpbmZvLT5zdGF0dXMgJiBJTkZPX0FNUF9DQVBTKSkgeworCQlpZiAoIShzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApICYgQUNfV0NBUF9BTVBfT1ZSRCkpCisJCQluaWQgPSBjb2RlYy0+YWZnOworCQlpbmZvLT5hbXBfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBkaXJlY3Rpb24gPT0gSERBX09VVFBVVCA/CisJCQkJCQkgICAgQUNfUEFSX0FNUF9PVVRfQ0FQIDogQUNfUEFSX0FNUF9JTl9DQVApOworCQlpbmZvLT5zdGF0dXMgfD0gSU5GT19BTVBfQ0FQUzsKKwl9CisJcmV0dXJuIGluZm8tPmFtcF9jYXBzOworfQorCisvKgorICogcmVhZCB0aGUgY3VycmVudCB2b2x1bWUgdG8gaW5mbworICogaWYgdGhlIGNhY2hlIGV4aXN0cywgcmVhZCBmcm9tIHRoZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3ZvbF9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvLAorCQkJIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KQoreworCXUzMiB2YWwsIHBhcm07CisKKwlpZiAoaW5mby0+c3RhdHVzICYgKElORk9fQU1QX1ZPTCA8PCBjaCkpCisJCXJldHVybjsKKworCXBhcm0gPSBjaCA/IEFDX0FNUF9HRVRfUklHSFQgOiBBQ19BTVBfR0VUX0xFRlQ7CisJcGFybSB8PSBkaXJlY3Rpb24gPT0gSERBX09VVFBVVCA/IEFDX0FNUF9HRVRfT1VUUFVUIDogQUNfQU1QX0dFVF9JTlBVVDsKKwlwYXJtIHw9IGluZGV4OworCXZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9BTVBfR0FJTl9NVVRFLCBwYXJtKTsKKwlpbmZvLT52b2xbY2hdID0gdmFsICYgMHhmZjsKKwlpbmZvLT5zdGF0dXMgfD0gSU5GT19BTVBfVk9MIDw8IGNoOworfQorCisvKgorICogd3JpdGUgdGhlIGN1cnJlbnQgdm9sdW1lIGluIGluZm8gdG8gdGhlIGgvdworICovCitzdGF0aWMgdm9pZCBwdXRfdm9sX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgaGRhX25pZF90IG5pZCwgaW50IGNoLCBpbnQgZGlyZWN0aW9uLCBpbnQgaW5kZXgsIGludCB2YWwpCit7CisJdTMyIHBhcm07CisKKwlwYXJtID0gY2ggPyBBQ19BTVBfU0VUX1JJR0hUIDogQUNfQU1QX1NFVF9MRUZUOworCXBhcm0gfD0gZGlyZWN0aW9uID09IEhEQV9PVVRQVVQgPyBBQ19BTVBfU0VUX09VVFBVVCA6IEFDX0FNUF9TRVRfSU5QVVQ7CisJcGFybSB8PSBpbmRleCA8PCBBQ19BTVBfU0VUX0lOREVYX1NISUZUOworCXBhcm0gfD0gdmFsOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgcGFybSk7Cit9CisKKy8qCisgKiByZWFkL3dyaXRlIEFNUCB2YWx1ZS4gIFRoZSB2b2x1bWUgaXMgYmV0d2VlbiAwIHRvIDB4N2YsIDB4ODAgPSBtdXRlIGJpdC4KKyAqLworaW50IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KQoreworCXN0cnVjdCBoZGFfYW1wX2luZm8gKmluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIEhEQV9IQVNIX0tFWShuaWQsIGRpcmVjdGlvbiwgaW5kZXgpKTsKKwlpZiAoISBpbmZvKQorCQlyZXR1cm4gMDsKKwlnZXRfdm9sX211dGUoY29kZWMsIGluZm8sIG5pZCwgY2gsIGRpcmVjdGlvbiwgaW5kZXgpOworCXJldHVybiBpbmZvLT52b2xbY2hdOworfQorCitpbnQgc25kX2hkYV9jb2RlY19hbXBfd3JpdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIGlkeCkpOworCWlmICghIGluZm8pCisJCXJldHVybiAwOworCWdldF92b2xfbXV0ZShjb2RlYywgaW5mbywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpZHgpOworCWlmIChpbmZvLT52b2xbY2hdID09IHZhbCAmJiAhIGNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCXB1dF92b2xfbXV0ZShjb2RlYywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpZHgsIHZhbCk7CisJaW5mby0+dm9sW2NoXSA9IHZhbDsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogQU1QIGNvbnRyb2wgY2FsbGJhY2tzCisgKi8KKy8qIHJldHJpZXZlIHBhcmFtZXRlcnMgZnJvbSBwcml2YXRlX3ZhbHVlICovCisjZGVmaW5lIGdldF9hbXBfbmlkKGtjKQkJKChrYyktPnByaXZhdGVfdmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIGdldF9hbXBfY2hhbm5lbHMoa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDMpCisjZGVmaW5lIGdldF9hbXBfZGlyZWN0aW9uKGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTgpICYgMHgxKQorI2RlZmluZSBnZXRfYW1wX2luZGV4KGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHhmKQorCisvKiB2b2x1bWUgKi8KK2ludCBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiBuaWQgPSBnZXRfYW1wX25pZChrY29udHJvbCk7CisJdTggY2hzID0gZ2V0X2FtcF9jaGFubmVscyhrY29udHJvbCk7CisJaW50IGRpciA9IGdldF9hbXBfZGlyZWN0aW9uKGtjb250cm9sKTsKKwl1MzIgY2FwczsKKworCWNhcHMgPSBxdWVyeV9hbXBfY2Fwcyhjb2RlYywgbmlkLCBkaXIpOworCWNhcHMgPSAoY2FwcyAmIEFDX0FNUENBUF9OVU1fU1RFUFMpID4+IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQ7IC8qIG51bSBzdGVwcyAqLworCWlmICghIGNhcHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBudW1fc3RlcHMgPSAwIGZvciBOSUQ9MHgleFxuIiwgbmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGNocyA9PSAzID8gMiA6IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBjYXBzOworCXJldHVybiAwOworfQorCitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0gZ2V0X2FtcF9uaWQoa2NvbnRyb2wpOworCWludCBjaHMgPSBnZXRfYW1wX2NoYW5uZWxzKGtjb250cm9sKTsKKwlpbnQgZGlyID0gZ2V0X2FtcF9kaXJlY3Rpb24oa2NvbnRyb2wpOworCWludCBpZHggPSBnZXRfYW1wX2luZGV4KGtjb250cm9sKTsKKwlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisKKwlpZiAoY2hzICYgMSkKKwkJKnZhbHArKyA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIG5pZCwgMCwgZGlyLCBpZHgpICYgMHg3ZjsKKwlpZiAoY2hzICYgMikKKwkJKnZhbHAgPSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWQsIDEsIGRpciwgaWR4KSAmIDB4N2Y7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBnZXRfYW1wX25pZChrY29udHJvbCk7CisJaW50IGNocyA9IGdldF9hbXBfY2hhbm5lbHMoa2NvbnRyb2wpOworCWludCBkaXIgPSBnZXRfYW1wX2RpcmVjdGlvbihrY29udHJvbCk7CisJaW50IGlkeCA9IGdldF9hbXBfaW5kZXgoa2NvbnRyb2wpOworCWludCB2YWw7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCWludCBjaGFuZ2UgPSAwOworCisJaWYgKGNocyAmIDEpIHsKKwkJdmFsID0gKnZhbHAgJiAweDdmOworCQl2YWwgfD0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCkgJiAweDgwOworCQljaGFuZ2UgPSBzbmRfaGRhX2NvZGVjX2FtcF93cml0ZShjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCwgdmFsKTsKKwkJdmFscCsrOworCX0KKwlpZiAoY2hzICYgMikgeworCQl2YWwgPSAqdmFscCAmIDB4N2Y7CisJCXZhbCB8PSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWQsIDEsIGRpciwgaWR4KSAmIDB4ODA7CisJCWNoYW5nZSB8PSBzbmRfaGRhX2NvZGVjX2FtcF93cml0ZShjb2RlYywgbmlkLCAxLCBkaXIsIGlkeCwgdmFsKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyogc3dpdGNoICovCitpbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlpbnQgY2hzID0gZ2V0X2FtcF9jaGFubmVscyhrY29udHJvbCk7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSBjaHMgPT0gMyA/IDIgOiAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKKwlpbnQgY2hzID0gZ2V0X2FtcF9jaGFubmVscyhrY29udHJvbCk7CisJaW50IGRpciA9IGdldF9hbXBfZGlyZWN0aW9uKGtjb250cm9sKTsKKwlpbnQgaWR4ID0gZ2V0X2FtcF9pbmRleChrY29udHJvbCk7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCisJaWYgKGNocyAmIDEpCisJCSp2YWxwKysgPSAoc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCkgJiAweDgwKSA/IDAgOiAxOworCWlmIChjaHMgJiAyKQorCQkqdmFscCA9IChzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWQsIDEsIGRpciwgaWR4KSAmIDB4ODApID8gMCA6IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBnZXRfYW1wX25pZChrY29udHJvbCk7CisJaW50IGNocyA9IGdldF9hbXBfY2hhbm5lbHMoa2NvbnRyb2wpOworCWludCBkaXIgPSBnZXRfYW1wX2RpcmVjdGlvbihrY29udHJvbCk7CisJaW50IGlkeCA9IGdldF9hbXBfaW5kZXgoa2NvbnRyb2wpOworCWludCB2YWw7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCWludCBjaGFuZ2UgPSAwOworCisJaWYgKGNocyAmIDEpIHsKKwkJdmFsID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCkgJiAweDdmOworCQl2YWwgfD0gKnZhbHAgPyAwIDogMHg4MDsKKwkJY2hhbmdlID0gc25kX2hkYV9jb2RlY19hbXBfd3JpdGUoY29kZWMsIG5pZCwgMCwgZGlyLCBpZHgsIHZhbCk7CisJCXZhbHArKzsKKwl9CisJaWYgKGNocyAmIDIpIHsKKwkJdmFsID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAxLCBkaXIsIGlkeCkgJiAweDdmOworCQl2YWwgfD0gKnZhbHAgPyAwIDogMHg4MDsKKwkJY2hhbmdlID0gc25kX2hkYV9jb2RlY19hbXBfd3JpdGUoY29kZWMsIG5pZCwgMSwgZGlyLCBpZHgsIHZhbCk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBTUERJRiBvdXQgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfY21hc2tfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCQkJICAgSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJCQkgICBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSB8CisJCQkJCSAgIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZIHwKKwkJCQkJICAgSUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfcG1hc2tfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCQkJICAgSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJCQkgICBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBjb2RlYy0+c3BkaWZfc3RhdHVzICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChjb2RlYy0+c3BkaWZfc3RhdHVzID4+IDgpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IChjb2RlYy0+c3BkaWZfc3RhdHVzID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoY29kZWMtPnNwZGlmX3N0YXR1cyA+PiAyNCkgJiAweGZmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbnZlcnQgZnJvbSBTUERJRiBzdGF0dXMgYml0cyB0byBIREEgU1BESUYgYml0cworICogYml0IDAgKERpZ0VuKSBpcyBhbHdheXMgc2V0IHplcm8gKHRvIGJlIGZpbGxlZCBsYXRlcikKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbnZlcnRfZnJvbV9zcGRpZl9zdGF0dXModW5zaWduZWQgaW50IHNiaXRzKQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisKKwlpZiAoc2JpdHMgJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpCisJCXZhbCB8PSAxIDw8IDY7CisJaWYgKHNiaXRzICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pCisJCXZhbCB8PSAxIDw8IDU7CisJaWYgKHNiaXRzICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCWlmICgoc2JpdHMgJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMpID09IElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1KQorCQkJdmFsIHw9IDEgPDwgMzsKKwl9IGVsc2UgeworCQlpZiAoKHNiaXRzICYgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTKSA9PSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSkKKwkJCXZhbCB8PSAxIDw8IDM7CisJCWlmICghIChzYml0cyAmIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUKSkKKwkJCXZhbCB8PSAxIDw8IDQ7CisJCWlmIChzYml0cyAmIChJRUM5NThfQUVTMV9DT05fT1JJR0lOQUwgPDwgOCkpCisJCQl2YWwgfD0gMSA8PCA3OworCQl2YWwgfD0gc2JpdHMgJiAoSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZIDw8IDgpOworCX0KKwlyZXR1cm4gdmFsOworfQorCisvKiBjb252ZXJ0IHRvIFNQRElGIHN0YXR1cyBiaXRzIGZyb20gSERBIFNQRElGIGJpdHMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBjb252ZXJ0X3RvX3NwZGlmX3N0YXR1cyh1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdW5zaWduZWQgaW50IHNiaXRzID0gMDsKKworCWlmICh2YWwgJiAoMSA8PCA1KSkKKwkJc2JpdHMgfD0gSUVDOTU4X0FFUzBfTk9OQVVESU87CisJaWYgKHZhbCAmICgxIDw8IDYpKQorCQlzYml0cyB8PSBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUw7CisJaWYgKHNiaXRzICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCWlmIChzYml0cyAmICgxIDw8IDMpKQorCQkJc2JpdHMgfD0gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTU7CisJfSBlbHNlIHsKKwkJaWYgKHZhbCAmICgxIDw8IDMpKQorCQkJc2JpdHMgfD0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTU7CisJCWlmICghICh2YWwgJiAoMSA8PCA0KSkpCisJCQlzYml0cyB8PSBJRUM5NThfQUVTMF9DT05fTk9UX0NPUFlSSUdIVDsKKwkJaWYgKHZhbCAmICgxIDw8IDcpKQorCQkJc2JpdHMgfD0gKElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTCA8PCA4KTsKKwkJc2JpdHMgfD0gdmFsICYgKDB4N2YgPDwgOCk7CisJfQorCXJldHVybiBzYml0czsKK30KKworc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2RlZmF1bHRfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJaW50IGNoYW5nZTsKKworCWRvd24oJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJY29kZWMtPnNwZGlmX3N0YXR1cyA9IHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIHwKKwkJKCh1bnNpZ25lZCBpbnQpdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCkgfAorCQkoKHVuc2lnbmVkIGludCl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA8PCAxNikgfAorCQkoKHVuc2lnbmVkIGludCl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJdmFsID0gY29udmVydF9mcm9tX3NwZGlmX3N0YXR1cyhjb2RlYy0+c3BkaWZfc3RhdHVzKTsKKwl2YWwgfD0gY29kZWMtPnNwZGlmX2N0bHMgJiAxOworCWNoYW5nZSA9IGNvZGVjLT5zcGRpZl9jdGxzICE9IHZhbDsKKwljb2RlYy0+c3BkaWZfY3RscyA9IHZhbDsKKworCWlmIChjaGFuZ2UgfHwgY29kZWMtPmluX3Jlc3VtZSkgeworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwgJiAweGZmKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMiwgdmFsID4+IDgpOworCX0KKworCXVwKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX291dF9zd2l0Y2hfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjb2RlYy0+c3BkaWZfY3RscyAmIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCWludCBjaGFuZ2U7CisKKwlkb3duKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXZhbCA9IGNvZGVjLT5zcGRpZl9jdGxzICYgfjE7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl2YWwgfD0gMTsKKwljaGFuZ2UgPSBjb2RlYy0+c3BkaWZfY3RscyAhPSB2YWw7CisJaWYgKGNoYW5nZSB8fCBjb2RlYy0+aW5fcmVzdW1lKSB7CisJCWNvZGVjLT5zcGRpZl9jdGxzID0gdmFsOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwgJiAweGZmKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCSAgICBBQ19BTVBfU0VUX1JJR0hUIHwgQUNfQU1QX1NFVF9MRUZUIHwKKwkJCQkgICAgQUNfQU1QX1NFVF9PVVRQVVQgfCAoKHZhbCAmIDEpID8gMCA6IDB4ODApKTsKKwl9CisJdXAoJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBkaWdfbWl4ZXNbXSA9IHsKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkJLmluZm8gPSBzbmRfaGRhX3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfc3BkaWZfY21hc2tfZ2V0LAorCX0sCisJeworCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCisJCS5pbmZvID0gc25kX2hkYV9zcGRpZl9tYXNrX2luZm8sCisJCS5nZXQgPSBzbmRfaGRhX3NwZGlmX3BtYXNrX2dldCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCQkuaW5mbyA9IHNuZF9oZGFfc3BkaWZfbWFza19pbmZvLAorCQkuZ2V0ID0gc25kX2hkYV9zcGRpZl9kZWZhdWx0X2dldCwKKwkJLnB1dCA9IHNuZF9oZGFfc3BkaWZfZGVmYXVsdF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpLAorCQkuaW5mbyA9IHNuZF9oZGFfc3BkaWZfb3V0X3N3aXRjaF9pbmZvLAorCQkuZ2V0ID0gc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX2dldCwKKwkJLnB1dCA9IHNuZF9oZGFfc3BkaWZfb3V0X3N3aXRjaF9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKioKKyAqIHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzIC0gY3JlYXRlIE91dHB1dCBTUERJRi1yZWxhdGVkIGNvbnRyb2xzCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBuaWQ6IGF1ZGlvIG91dCB3aWRnZXQgTklECisgKgorICogQ3JlYXRlcyBjb250cm9scyByZWxhdGVkIHdpdGggdGhlIFNQRElGIG91dHB1dC4KKyAqIENhbGxlZCBmcm9tIGVhY2ggcGF0Y2ggc3VwcG9ydGluZyB0aGUgU1BESUYgb3V0LgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlpbnQgZXJyOworCXNuZF9rY29udHJvbF90ICprY3RsOworCXNuZF9rY29udHJvbF9uZXdfdCAqZGlnX21peDsKKworCWZvciAoZGlnX21peCA9IGRpZ19taXhlczsgZGlnX21peC0+bmFtZTsgZGlnX21peCsrKSB7CisJCWtjdGwgPSBzbmRfY3RsX25ldzEoZGlnX21peCwgY29kZWMpOworCQlrY3RsLT5wcml2YXRlX3ZhbHVlID0gbmlkOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5idXMtPmNhcmQsIGtjdGwpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwljb2RlYy0+c3BkaWZfY3RscyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsIDApOworCWNvZGVjLT5zcGRpZl9zdGF0dXMgPSBjb252ZXJ0X3RvX3NwZGlmX3N0YXR1cyhjb2RlYy0+c3BkaWZfY3Rscyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTUERJRiBpbnB1dAorICovCisKKyNkZWZpbmUgc25kX2hkYV9zcGRpZl9pbl9zd2l0Y2hfaW5mbwlzbmRfaGRhX3NwZGlmX291dF9zd2l0Y2hfaW5mbworCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3dpdGNoX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY29kZWMtPnNwZGlmX2luX2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2luX3N3aXRjaF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCB2YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWludCBjaGFuZ2U7CisKKwlkb3duKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCWNoYW5nZSA9IGNvZGVjLT5zcGRpZl9pbl9lbmFibGUgIT0gdmFsOworCWlmIChjaGFuZ2UgfHwgY29kZWMtPmluX3Jlc3VtZSkgeworCQljb2RlYy0+c3BkaWZfaW5fZW5hYmxlID0gdmFsOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwpOworCX0KKwl1cCgmY29kZWMtPnNwZGlmX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3RhdHVzX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXVuc2lnbmVkIGludCBzYml0czsKKworCXZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsIDApOworCXNiaXRzID0gY29udmVydF90b19zcGRpZl9zdGF0dXModmFsKTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IHNiaXRzOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gc2JpdHMgPj4gODsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IHNiaXRzID4+IDE2OworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gc2JpdHMgPj4gMjQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgZGlnX2luX2N0bHNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksCisJCS5pbmZvID0gc25kX2hkYV9zcGRpZl9pbl9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfc3BkaWZfaW5fc3dpdGNoX2dldCwKKwkJLnB1dCA9IHNuZF9oZGFfc3BkaWZfaW5fc3dpdGNoX3B1dCwKKwl9LAorCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxERUZBVUxUKSwKKwkJLmluZm8gPSBzbmRfaGRhX3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfc3BkaWZfaW5fc3RhdHVzX2dldCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qKgorICogc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3RscyAtIGNyZWF0ZSBJbnB1dCBTUERJRi1yZWxhdGVkIGNvbnRyb2xzCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBuaWQ6IGF1ZGlvIGluIHdpZGdldCBOSUQKKyAqCisgKiBDcmVhdGVzIGNvbnRyb2xzIHJlbGF0ZWQgd2l0aCB0aGUgU1BESUYgaW5wdXQuCisgKiBDYWxsZWQgZnJvbSBlYWNoIHBhdGNoIHN1cHBvcnRpbmcgdGhlIFNQRElGIGluLgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9pbl9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQoreworCWludCBlcnI7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJc25kX2tjb250cm9sX25ld190ICpkaWdfbWl4OworCisJZm9yIChkaWdfbWl4ID0gZGlnX2luX2N0bHM7IGRpZ19taXgtPm5hbWU7IGRpZ19taXgrKykgeworCQlrY3RsID0gc25kX2N0bF9uZXcxKGRpZ19taXgsIGNvZGVjKTsKKwkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IG5pZDsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJY29kZWMtPnNwZGlmX2luX2VuYWJsZSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsIDApICYgMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNuZF9oZGFfYnVpbGRfY29udHJvbHMgLSBidWlsZCBtaXhlciBjb250cm9scworICogQGJ1czogdGhlIEJVUworICoKKyAqIENyZWF0ZXMgbWl4ZXIgY29udHJvbHMgZm9yIGVhY2ggY29kZWMgaW5jbHVkZWQgaW4gdGhlIGJ1cy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFfYnVpbGRfY29udHJvbHMoc3RydWN0IGhkYV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJLyogYnVpbGQgY29udHJvbHMgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZidXMtPmNvZGVjX2xpc3QpIHsKKwkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfY29kZWMsIGxpc3QpOworCQlpbnQgZXJyOworCQlpZiAoISBjb2RlYy0+cGF0Y2hfb3BzLmJ1aWxkX2NvbnRyb2xzKQorCQkJY29udGludWU7CisJCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfY29udHJvbHMoY29kZWMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogaW5pdGlhbGl6ZSAqLworCWxpc3RfZm9yX2VhY2gocCwgJmJ1cy0+Y29kZWNfbGlzdCkgeworCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9jb2RlYywgbGlzdCk7CisJCWludCBlcnI7CisJCWlmICghIGNvZGVjLT5wYXRjaF9vcHMuaW5pdCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBjb2RlYy0+cGF0Y2hfb3BzLmluaXQoY29kZWMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBzdHJlYW0gZm9ybWF0cworICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVfYml0c1tdWzNdID0geworCS8qIHJhdGUgaW4gSHosIEFMU0EgcmF0ZSBiaXRtYXNrLCBIREEgZm9ybWF0IHZhbHVlICovCisJeyA4MDAwLCBTTkRSVl9QQ01fUkFURV84MDAwLCAweDA1MDAgfSwgLyogMS82IHggNDggKi8KKwl7IDExMDI1LCBTTkRSVl9QQ01fUkFURV8xMTAyNSwgMHg0MzAwIH0sIC8qIDEvNCB4IDQ0ICovCisJeyAxNjAwMCwgU05EUlZfUENNX1JBVEVfMTYwMDAsIDB4MDIwMCB9LCAvKiAxLzMgeCA0OCAqLworCXsgMjIwNTAsIFNORFJWX1BDTV9SQVRFXzIyMDUwLCAweDQxMDAgfSwgLyogMS8yIHggNDQgKi8KKwl7IDMyMDAwLCBTTkRSVl9QQ01fUkFURV8zMjAwMCwgMHgwYTAwIH0sIC8qIDIvMyB4IDQ4ICovCisJeyA0NDEwMCwgU05EUlZfUENNX1JBVEVfNDQxMDAsIDB4NDAwMCB9LCAvKiA0NCAqLworCXsgNDgwMDAsIFNORFJWX1BDTV9SQVRFXzQ4MDAwLCAweDAwMDAgfSwgLyogNDggKi8KKwl7IDg4MjAwLCBTTkRSVl9QQ01fUkFURV84ODIwMCwgMHg0ODAwIH0sIC8qIDIgeCA0NCAqLworCXsgOTYwMDAsIFNORFJWX1BDTV9SQVRFXzk2MDAwLCAweDA4MDAgfSwgLyogMiB4IDQ4ICovCisJeyAxNzY0MDAsIFNORFJWX1BDTV9SQVRFXzE3NjQwMCwgMHg1ODAwIH0sLyogNCB4IDQ0ICovCisJeyAxOTIwMDAsIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwgMHgxODAwIH0sIC8qIDQgeCA0OCAqLworCXsgMCB9Cit9OworCisvKioKKyAqIHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0IC0gY2FsY3VsYXRlIGZvcm1hdCBiaXRzZXQKKyAqIEByYXRlOiB0aGUgc2FtcGxlIHJhdGUKKyAqIEBjaGFubmVsczogdGhlIG51bWJlciBvZiBjaGFubmVscworICogQGZvcm1hdDogdGhlIFBDTSBmb3JtYXQgKFNORFJWX1BDTV9GT1JNQVRfWFhYKQorICogQG1heGJwczogdGhlIG1heC4gYnBzCisgKgorICogQ2FsY3VsYXRlIHRoZSBmb3JtYXQgYml0c2V0IGZyb20gdGhlIGdpdmVuIHJhdGUsIGNoYW5uZWxzIGFuZCB0aCBQQ00gZm9ybWF0LgorICoKKyAqIFJldHVybiB6ZXJvIGlmIGludmFsaWQuCisgKi8KK3Vuc2lnbmVkIGludCBzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdCh1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJCQkJdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJCQl1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQl1bnNpZ25lZCBpbnQgbWF4YnBzKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJZm9yIChpID0gMDsgcmF0ZV9iaXRzW2ldWzBdOyBpKyspCisJCWlmIChyYXRlX2JpdHNbaV1bMF0gPT0gcmF0ZSkgeworCQkJdmFsID0gcmF0ZV9iaXRzW2ldWzJdOworCQkJYnJlYWs7CisJCX0KKwlpZiAoISByYXRlX2JpdHNbaV1bMF0pIHsKKwkJc25kX3ByaW50ZGQoImludmFsaWQgcmF0ZSAlZFxuIiwgcmF0ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFubmVscyA9PSAwIHx8IGNoYW5uZWxzID4gOCkgeworCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gMDsKKwl9CisJdmFsIHw9IGNoYW5uZWxzIC0gMTsKKworCXN3aXRjaCAoc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KSkgeworCWNhc2UgODogIHZhbCB8PSAweDAwOyBicmVhazsKKwljYXNlIDE2OiB2YWwgfD0gMHgxMDsgYnJlYWs7CisJY2FzZSAyMDoKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWlmIChtYXhicHMgPj0gMzIpCisJCQl2YWwgfD0gMHg0MDsKKwkJZWxzZSBpZiAobWF4YnBzID49IDI0KQorCQkJdmFsIHw9IDB4MzA7CisJCWVsc2UKKwkJCXZhbCB8PSAweDIwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBmb3JtYXQgd2lkdGggJWRcbiIsIHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKioKKyAqIHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbSAtIHF1ZXJ5IHRoZSBzdXBwb3J0ZWQgUENNIHJhdGVzIGFuZCBmb3JtYXRzCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBuaWQ6IE5JRCB0byBxdWVyeQorICogQHJhdGVzcDogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGRldGVjdGVkIHJhdGUgYml0ZmxhZ3MKKyAqIEBmb3JtYXRzcDogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGRldGVjdGVkIGZvcm1hdHMKKyAqIEBicHNwOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgZGV0ZWN0ZWQgZm9ybWF0IHdpZHRocworICoKKyAqIFF1ZXJpZXMgdGhlIHN1cHBvcnRlZCBQQ00gcmF0ZXMgYW5kIGZvcm1hdHMuICBUaGUgTlVMTCBAcmF0ZXNwLCBAZm9ybWF0c3AKKyAqIG9yIEBic3BzIGFyZ3VtZW50IGlzIGlnbm9yZWQuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX3F1ZXJ5X3N1cHBvcnRlZF9wY20oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJdTMyICpyYXRlc3AsIHU2NCAqZm9ybWF0c3AsIHVuc2lnbmVkIGludCAqYnBzcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBzdHJlYW1zOworCisJdmFsID0gMDsKKwlpZiAobmlkICE9IGNvZGVjLT5hZmcgJiYKKwkgICAgc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKSAmIEFDX1dDQVBfRk9STUFUX09WUkQpIHsKKwkJdmFsID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QQ00pOworCQlpZiAodmFsID09IC0xKQorCQkJcmV0dXJuIC1FSU87CisJfQorCWlmICghIHZhbCkKKwkJdmFsID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfUENNKTsKKworCWlmIChyYXRlc3ApIHsKKwkJdTMyIHJhdGVzID0gMDsKKwkJZm9yIChpID0gMDsgcmF0ZV9iaXRzW2ldWzBdOyBpKyspIHsKKwkJCWlmICh2YWwgJiAoMSA8PCBpKSkKKwkJCQlyYXRlcyB8PSByYXRlX2JpdHNbaV1bMV07CisJCX0KKwkJKnJhdGVzcCA9IHJhdGVzOworCX0KKworCWlmIChmb3JtYXRzcCB8fCBicHNwKSB7CisJCXU2NCBmb3JtYXRzID0gMDsKKwkJdW5zaWduZWQgaW50IGJwczsKKwkJdW5zaWduZWQgaW50IHdjYXBzOworCisJCXdjYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKTsKKwkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfU1RSRUFNKTsKKwkJaWYgKHN0cmVhbXMgPT0gLTEpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKCEgc3RyZWFtcykgeworCQkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX1NUUkVBTSk7CisJCQlpZiAoc3RyZWFtcyA9PSAtMSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWJwcyA9IDA7CisJCWlmIChzdHJlYW1zICYgQUNfU1VQRk1UX1BDTSkgeworCQkJaWYgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzgpIHsKKwkJCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfVTg7CisJCQkJYnBzID0gODsKKwkJCX0KKwkJCWlmICh2YWwgJiBBQ19TVVBQQ01fQklUU18xNikgeworCQkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEU7CisJCQkJYnBzID0gMTY7CisJCQl9CisJCQlpZiAod2NhcHMgJiBBQ19XQ0FQX0RJR0lUQUwpIHsKKwkJCQlpZiAodmFsICYgQUNfU1VQUENNX0JJVFNfMzIpCisJCQkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9JRUM5NThfU1VCRlJBTUVfTEU7CisJCQkJaWYgKHZhbCAmIChBQ19TVVBQQ01fQklUU18yMHxBQ19TVVBQQ01fQklUU18yNCkpCisJCQkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CisJCQkJaWYgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzI0KQorCQkJCQlicHMgPSAyNDsKKwkJCQllbHNlIGlmICh2YWwgJiBBQ19TVVBQQ01fQklUU18yMCkKKwkJCQkJYnBzID0gMjA7CisJCQl9IGVsc2UgaWYgKHZhbCAmIChBQ19TVVBQQ01fQklUU18yMHxBQ19TVVBQQ01fQklUU18yNHxBQ19TVVBQQ01fQklUU18zMikpIHsKKwkJCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOworCQkJCWlmICh2YWwgJiBBQ19TVVBQQ01fQklUU18zMikKKwkJCQkJYnBzID0gMzI7CisJCQkJZWxzZSBpZiAodmFsICYgQUNfU1VQUENNX0JJVFNfMjApCisJCQkJCWJwcyA9IDIwOworCQkJCWVsc2UgaWYgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzI0KQorCQkJCQlicHMgPSAyNDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzdHJlYW1zID09IEFDX1NVUEZNVF9GTE9BVDMyKSB7IC8qIHNob3VsZCBiZSBleGNsdXNpdmUgKi8KKwkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9GTE9BVF9MRTsKKwkJCWJwcyA9IDMyOworCQl9IGVsc2UgaWYgKHN0cmVhbXMgPT0gQUNfU1VQRk1UX0FDMykgeyAvKiBzaG91bGQgYmUgZXhjbHVzaXZlICovCisJCQkvKiB0ZW1wb3JhcnkgaGFjazogd2UgaGF2ZSBzdGlsbCBubyBwcm9wZXIgc3VwcG9ydAorCQkJICogZm9yIHRoZSBkaXJlY3QgQUMzIHN0cmVhbS4uLgorCQkJICovCisJCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfVTg7CisJCQlicHMgPSA4OworCQl9CisJCWlmIChmb3JtYXRzcCkKKwkJCSpmb3JtYXRzcCA9IGZvcm1hdHM7CisJCWlmIChicHNwKQorCQkJKmJwc3AgPSBicHM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2hkYV9pc19zdXBwb3J0ZWRfZm9ybWF0IC0gY2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBzdXBwb3J0cyB0aGUgZm9ybWF0IHZhbAorICoKKyAqIFJldHVybnMgMSBpZiBzdXBwb3J0ZWQsIDAgaWYgbm90LgorICovCitpbnQgc25kX2hkYV9pc19zdXBwb3J0ZWRfZm9ybWF0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCXVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHZhbCA9IDAsIHJhdGUsIHN0cmVhbTsKKworCWlmIChuaWQgIT0gY29kZWMtPmFmZyAmJgorCSAgICBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApICYgQUNfV0NBUF9GT1JNQVRfT1ZSRCkgeworCQl2YWwgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BDTSk7CisJCWlmICh2YWwgPT0gLTEpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEgdmFsKSB7CisJCXZhbCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX1BDTSk7CisJCWlmICh2YWwgPT0gLTEpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyYXRlID0gZm9ybWF0ICYgMHhmZjAwOworCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXVswXTsgaSsrKQorCQlpZiAocmF0ZV9iaXRzW2ldWzJdID09IHJhdGUpIHsKKwkJCWlmICh2YWwgJiAoMSA8PCBpKSkKKwkJCQlicmVhazsKKwkJCXJldHVybiAwOworCQl9CisJaWYgKCEgcmF0ZV9iaXRzW2ldWzBdKQorCQlyZXR1cm4gMDsKKworCXN0cmVhbSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfU1RSRUFNKTsKKwlpZiAoc3RyZWFtID09IC0xKQorCQlyZXR1cm4gMDsKKwlpZiAoISBzdHJlYW0gJiYgbmlkICE9IGNvZGVjLT5hZmcpCisJCXN0cmVhbSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX1NUUkVBTSk7CisJaWYgKCEgc3RyZWFtIHx8IHN0cmVhbSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RyZWFtICYgQUNfU1VQRk1UX1BDTSkgeworCQlzd2l0Y2ggKGZvcm1hdCAmIDB4ZjApIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKCEgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzgpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMDoKKwkJCWlmICghICh2YWwgJiBBQ19TVVBQQ01fQklUU18xNikpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSAweDIwOgorCQkJaWYgKCEgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzIwKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzA6CisJCQlpZiAoISAodmFsICYgQUNfU1VQUENNX0JJVFNfMjQpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MDoKKwkJCWlmICghICh2YWwgJiBBQ19TVVBQQ01fQklUU18zMikpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogRklYTUU6IGNoZWNrIGZvciBmbG9hdDMyIGFuZCBBQzM/ICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQQ00gc3R1ZmYKKyAqLworc3RhdGljIGludCBoZGFfcGNtX2RlZmF1bHRfb3Blbl9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZGFfcGNtX2RlZmF1bHRfcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBoaW5mby0+bmlkLCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkYV9wY21fZGVmYXVsdF9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBoaW5mby0+bmlkLCAwLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfcGNtX2RlZmF1bHRfdmFsdWVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmluZm8pCit7CisJaWYgKGluZm8tPm5pZCkgeworCQkvKiBxdWVyeSBzdXBwb3J0IFBDTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBOSUQgKi8KKwkJaWYgKCEgaW5mby0+cmF0ZXMgfHwgISBpbmZvLT5mb3JtYXRzKQorCQkJc25kX2hkYV9xdWVyeV9zdXBwb3J0ZWRfcGNtKGNvZGVjLCBpbmZvLT5uaWQsCisJCQkJCQkgICAgaW5mby0+cmF0ZXMgPyBOVUxMIDogJmluZm8tPnJhdGVzLAorCQkJCQkJICAgIGluZm8tPmZvcm1hdHMgPyBOVUxMIDogJmluZm8tPmZvcm1hdHMsCisJCQkJCQkgICAgaW5mby0+bWF4YnBzID8gTlVMTCA6ICZpbmZvLT5tYXhicHMpOworCX0KKwlpZiAoaW5mby0+b3BzLm9wZW4gPT0gTlVMTCkKKwkJaW5mby0+b3BzLm9wZW4gPSBoZGFfcGNtX2RlZmF1bHRfb3Blbl9jbG9zZTsKKwlpZiAoaW5mby0+b3BzLmNsb3NlID09IE5VTEwpCisJCWluZm8tPm9wcy5jbG9zZSA9IGhkYV9wY21fZGVmYXVsdF9vcGVuX2Nsb3NlOworCWlmIChpbmZvLT5vcHMucHJlcGFyZSA9PSBOVUxMKSB7CisJCXNuZF9hc3NlcnQoaW5mby0+bmlkLCByZXR1cm4gLUVJTlZBTCk7CisJCWluZm8tPm9wcy5wcmVwYXJlID0gaGRhX3BjbV9kZWZhdWx0X3ByZXBhcmU7CisJfQorCWlmIChpbmZvLT5vcHMucHJlcGFyZSA9PSBOVUxMKSB7CisJCXNuZF9hc3NlcnQoaW5mby0+bmlkLCByZXR1cm4gLUVJTlZBTCk7CisJCWluZm8tPm9wcy5wcmVwYXJlID0gaGRhX3BjbV9kZWZhdWx0X3ByZXBhcmU7CisJfQorCWlmIChpbmZvLT5vcHMuY2xlYW51cCA9PSBOVUxMKSB7CisJCXNuZF9hc3NlcnQoaW5mby0+bmlkLCByZXR1cm4gLUVJTlZBTCk7CisJCWluZm8tPm9wcy5jbGVhbnVwID0gaGRhX3BjbV9kZWZhdWx0X2NsZWFudXA7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9oZGFfYnVpbGRfcGNtcyAtIGJ1aWxkIFBDTSBpbmZvcm1hdGlvbgorICogQGJ1czogdGhlIEJVUworICoKKyAqIENyZWF0ZSBQQ00gaW5mb3JtYXRpb24gZm9yIGVhY2ggY29kZWMgaW5jbHVkZWQgaW4gdGhlIGJ1cy4KKyAqCisgKiBUaGUgYnVpbGRfcGNtcyBjb2RlYyBwYXRjaCBpcyByZXF1ZXN0ZWQgdG8gc2V0IHVwIGNvZGVjLT5udW1fcGNtcyBhbmQKKyAqIGNvZGVjLT5wY21faW5mbyBwcm9wZXJseS4gIFRoZSBhcnJheSBpcyByZWZlcnJlZCBieSB0aGUgdG9wLWxldmVsIGRyaXZlcgorICogdG8gY3JlYXRlIGl0cyBQQ00gaW5zdGFuY2VzLgorICogVGhlIGFsbG9jYXRlZCBjb2RlYy0+cGNtX2luZm8gc2hvdWxkIGJlIHJlbGVhc2VkIGluIGNvZGVjLT5wYXRjaF9vcHMuZnJlZQorICogY2FsbGJhY2suCisgKgorICogQXQgbGVhc3QsIHN1YnN0cmVhbXMsIGNoYW5uZWxzX21pbiBhbmQgY2hhbm5lbHNfbWF4IG11c3QgYmUgZmlsbGVkIGZvcgorICogZWFjaCBzdHJlYW0uICBzdWJzdHJlYW1zID0gMCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGRvZXNuJ3QgZXhpc3QuCisgKiBXaGVuIHJhdGVzIGFuZC9vciBmb3JtYXRzIGFyZSB6ZXJvLCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgcXVlcmllZAorICogZnJvbSB0aGUgZ2l2ZW4gbmlkLiAgVGhlIG5pZCBpcyB1c2VkIGFsc28gYnkgdGhlIGRlZmF1bHQgb3BzLnByZXBhcmUKKyAqIGFuZCBvcHMuY2xlYW51cCBjYWxsYmFja3MuCisgKgorICogVGhlIGRyaXZlciBuZWVkcyB0byBjYWxsIG9wcy5vcGVuIGluIGl0cyBvcGVuIGNhbGxiYWNrLiAgU2ltaWxhcmx5LAorICogb3BzLmNsb3NlIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBpbiB0aGUgY2xvc2UgY2FsbGJhY2suCisgKiBvcHMucHJlcGFyZSBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBwcmVwYXJlIG9yIGh3X3BhcmFtcyBjYWxsYmFjaworICogd2l0aCB0aGUgcHJvcGVyIHBhcmFtZXRlcnMgZm9yIHNldCB1cC4KKyAqIG9wcy5jbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgaW4gaHdfZnJlZSBmb3IgY2xlYW4gdXAgb2Ygc3RyZWFtcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsbCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYV9idWlsZF9wY21zKHN0cnVjdCBoZGFfYnVzICpidXMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmJ1cy0+Y29kZWNfbGlzdCkgeworCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9jb2RlYywgbGlzdCk7CisJCXVuc2lnbmVkIGludCBwY20sIHM7CisJCWludCBlcnI7CisJCWlmICghIGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfcGNtcykKKwkJCWNvbnRpbnVlOworCQllcnIgPSBjb2RlYy0+cGF0Y2hfb3BzLmJ1aWxkX3BjbXMoY29kZWMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZvciAocGNtID0gMDsgcGNtIDwgY29kZWMtPm51bV9wY21zOyBwY20rKykgeworCQkJZm9yIChzID0gMDsgcyA8IDI7IHMrKykgeworCQkJCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaW5mbzsKKwkJCQlpbmZvID0gJmNvZGVjLT5wY21faW5mb1twY21dLnN0cmVhbVtzXTsKKwkJCQlpZiAoISBpbmZvLT5zdWJzdHJlYW1zKQorCQkJCQljb250aW51ZTsKKwkJCQllcnIgPSBzZXRfcGNtX2RlZmF1bHRfdmFsdWVzKGNvZGVjLCBpbmZvKTsKKwkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnIC0gY29tcGFyZSB0aGUgY3VycmVudCBjb2RlYyB3aXRoIHRoZSBjb25maWcgdGFibGUKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQHRibDogY29uZmlndXJhdGlvbiB0YWJsZSwgdGVybWluYXRlZCBieSBudWxsIGVudHJpZXMKKyAqCisgKiBDb21wYXJlcyB0aGUgbW9kZWxuYW1lIG9yIFBDSSBzdWJzeXN0ZW0gaWQgb2YgdGhlIGN1cnJlbnQgY29kZWMgd2l0aCB0aGUKKyAqIGdpdmVuIGNvbmZpZ3VyYXRpb24gdGFibGUuICBJZiBhIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLCByZXR1cm5zIGl0cworICogY29uZmlnIHZhbHVlIChzdXBwb3NlZCB0byBiZSAwIG9yIHBvc2l0aXZlKS4KKyAqCisgKiBJZiBubyBlbnRyaWVzIGFyZSBtYXRjaGluZywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAqLworaW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyAqdGJsKQoreworCXN0cnVjdCBoZGFfYm9hcmRfY29uZmlnICpjOworCisJaWYgKGNvZGVjLT5idXMtPm1vZGVsbmFtZSkgeworCQlmb3IgKGMgPSB0Ymw7IGMtPm1vZGVsbmFtZSB8fCBjLT5wY2lfdmVuZG9yOyBjKyspIHsKKwkJCWlmIChjLT5tb2RlbG5hbWUgJiYKKwkJCSAgICAhIHN0cmNtcChjb2RlYy0+YnVzLT5tb2RlbG5hbWUsIGMtPm1vZGVsbmFtZSkpIHsKKwkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkXG4iLCBjLT5tb2RlbG5hbWUpOworCQkJCXJldHVybiBjLT5jb25maWc7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29kZWMtPmJ1cy0+cGNpKSB7CisJCXUxNiBzdWJzeXN0ZW1fdmVuZG9yLCBzdWJzeXN0ZW1fZGV2aWNlOworCQlwY2lfcmVhZF9jb25maWdfd29yZChjb2RlYy0+YnVzLT5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3Vic3lzdGVtX3ZlbmRvcik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNvZGVjLT5idXMtPnBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOworCQlmb3IgKGMgPSB0Ymw7IGMtPm1vZGVsbmFtZSB8fCBjLT5wY2lfdmVuZG9yOyBjKyspIHsKKwkJCWlmIChjLT5wY2lfdmVuZG9yID09IHN1YnN5c3RlbV92ZW5kb3IgJiYKKwkJCSAgICBjLT5wY2lfZGV2aWNlID09IHN1YnN5c3RlbV9kZXZpY2UpCisJCQkJcmV0dXJuIGMtPmNvbmZpZzsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogc25kX2hkYV9hZGRfbmV3X2N0bHMgLSBjcmVhdGUgY29udHJvbHMgZnJvbSB0aGUgYXJyYXkKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQGtuZXc6IHRoZSBhcnJheSBvZiBzbmRfa2NvbnRyb2xfbmV3X3QKKyAqCisgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhZGQgbmV3IGNvbnRyb2xzIGluIHRoZSBnaXZlbiBhcnJheS4KKyAqIFRoZSBhcnJheSBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhbiBlbXB0eSBlbnRyeSBhcyB0ZXJtaW5hdG9yLgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX2FkZF9uZXdfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc25kX2tjb250cm9sX25ld190ICprbmV3KQoreworCWludCBlcnI7CisKKwlmb3IgKDsga25ldy0+bmFtZTsga25ldysrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5idXMtPmNhcmQsIHNuZF9jdGxfbmV3MShrbmV3LCBjb2RlYykpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBpbnB1dCBNVVggaGVscGVyCisgKi8KK2ludCBzbmRfaGRhX2lucHV0X211eF9pbmZvKGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4LCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gaW11eC0+bnVtX2l0ZW1zOworCWluZGV4ID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlpZiAoaW5kZXggPj0gaW11eC0+bnVtX2l0ZW1zKQorCQlpbmRleCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGltdXgtPml0ZW1zW2luZGV4XS5sYWJlbCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfaGRhX2lucHV0X211eF9wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4LAorCQkJICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wsIGhkYV9uaWRfdCBuaWQsCisJCQkgIHVuc2lnbmVkIGludCAqY3VyX3ZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCisJaWR4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKKwkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKKwlpZiAoKmN1cl92YWwgPT0gaWR4ICYmICEgY29kZWMtPmluX3Jlc3VtZSkKKwkJcmV0dXJuIDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCSAgICBpbXV4LT5pdGVtc1tpZHhdLmluZGV4KTsKKwkqY3VyX3ZhbCA9IGlkeDsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogTXVsdGktY2hhbm5lbCAvIGRpZ2l0YWwtb3V0IFBDTSBoZWxwZXIgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIG9wZW4gdGhlIGRpZ2l0YWwgb3V0IGluIHRoZSBleGNsdXNpdmUgbW9kZQorICovCitpbnQgc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0KQoreworCWRvd24oJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJaWYgKG1vdXQtPmRpZ19vdXRfdXNlZCkgeworCQl1cCgmY29kZWMtPnNwZGlmX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsgLyogYWxyZWFkeSBiZWluZyB1c2VkICovCisJfQorCW1vdXQtPmRpZ19vdXRfdXNlZCA9IEhEQV9ESUdfRVhDTFVTSVZFOworCXVwKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogcmVsZWFzZSB0aGUgZGlnaXRhbCBvdXQKKyAqLworaW50IHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQpCit7CisJZG93bigmY29kZWMtPnNwZGlmX211dGV4KTsKKwltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOworCXVwKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogc2V0IHVwIG1vcmUgcmVzdHJpY3Rpb25zIGZvciBhbmFsb2cgb3V0CisgKi8KK2ludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3BlbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCisJCQkJICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBtb3V0LT5tYXhfY2hhbm5lbHM7CisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIDIpOworfQorCisvKgorICogc2V0IHVwIHRoZSBpL28gZm9yIGFuYWxvZyBvdXQKKyAqIHdoZW4gdGhlIGRpZ2l0YWwgb3V0IGlzIGF2YWlsYWJsZSwgY29weSB0aGUgZnJvbnQgb3V0IHRvIGRpZ2l0YWwgb3V0LCB0b28uCisgKi8KK2ludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaGRhX25pZF90ICpuaWRzID0gbW91dC0+ZGFjX25pZHM7CisJaW50IGNocyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJaW50IGk7CisKKwlkb3duKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCWlmIChtb3V0LT5kaWdfb3V0X25pZCAmJiBtb3V0LT5kaWdfb3V0X3VzZWQgIT0gSERBX0RJR19FWENMVVNJVkUpIHsKKwkJaWYgKGNocyA9PSAyICYmCisJCSAgICBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCBmb3JtYXQpICYmCisJCSAgICAhIChjb2RlYy0+c3BkaWZfc3RhdHVzICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pKSB7CisJCQltb3V0LT5kaWdfb3V0X3VzZWQgPSBIREFfRElHX0FOQUxPR19EVVA7CisJCQkvKiBzZXR1cCBkaWdpdGFsIHJlY2VpdmVyICovCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsCisJCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCQl9IGVsc2UgeworCQkJbW91dC0+ZGlnX291dF91c2VkID0gMDsKKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCwgMCwgMCwgMCk7CisJCX0KKwl9CisJdXAoJmNvZGVjLT5zcGRpZl9tdXRleCk7CisKKwkvKiBmcm9udCAqLworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW0hEQV9GUk9OVF0sIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJaWYgKG1vdXQtPmhwX25pZCkKKwkJLyogaGVhZHBob25lIG91dCB3aWxsIGp1c3QgZGVjb2RlIGZyb250IGxlZnQvcmlnaHQgKHN0ZXJlbykgKi8KKwkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwkvKiBzdXJyb3VuZHMgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbW91dC0+bnVtX2RhY3M7IGkrKykgeworCQlpZiAoaSA9PSBIREFfUkVBUiAmJiBjaHMgPT0gMikgLyogY29weSBmcm9udCB0byByZWFyICovCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwkJZWxzZSBpZiAoY2hzID49IChpICsgMSkgKiAyKSAvKiBpbmRlcGVuZGVudCBvdXQgKi8KKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLCBpICogMiwKKwkJCQkJCSAgIGZvcm1hdCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogY2xlYW4gdXAgdGhlIHNldHRpbmcgZm9yIGFuYWxvZyBvdXQKKyAqLworaW50IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19jbGVhbnVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCkKK3sKKwloZGFfbmlkX3QgKm5pZHMgPSBtb3V0LT5kYWNfbmlkczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtb3V0LT5udW1fZGFjczsgaSsrKQorCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgMCwgMCwgMCk7CisJaWYgKG1vdXQtPmhwX25pZCkKKwkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwgMCwgMCwgMCk7CisJZG93bigmY29kZWMtPnNwZGlmX211dGV4KTsKKwlpZiAobW91dC0+ZGlnX291dF9uaWQgJiYgbW91dC0+ZGlnX291dF91c2VkID09IEhEQV9ESUdfQU5BTE9HX0RVUCkgeworCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsIDAsIDAsIDApOworCQltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOworCX0KKwl1cCgmY29kZWMtPnNwZGlmX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIHBvd2VyIG1hbmFnZW1lbnQKKyAqLworCisvKioKKyAqIHNuZF9oZGFfc3VzcGVuZCAtIHN1c3BlbmQgdGhlIGNvZGVjcworICogQGJ1czogdGhlIEhEQSBidXMKKyAqIEBzdGF0ZTogc3VzcHNlbmQgc3RhdGUKKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KKyAqLworaW50IHNuZF9oZGFfc3VzcGVuZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCS8qIEZJWE1FOiBzaG91bGQgaGFuZGxlIHBvd2VyIHdpZGdldCBjYXBhYmlsaXRpZXMgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZidXMtPmNvZGVjX2xpc3QpIHsKKwkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfY29kZWMsIGxpc3QpOworCQlpZiAoY29kZWMtPnBhdGNoX29wcy5zdXNwZW5kKQorCQkJY29kZWMtPnBhdGNoX29wcy5zdXNwZW5kKGNvZGVjLCBzdGF0ZSk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9oZGFfcmVzdW1lIC0gcmVzdW1lIHRoZSBjb2RlY3MKKyAqIEBidXM6IHRoZSBIREEgYnVzCisgKiBAc3RhdGU6IHJlc3VtZSBzdGF0ZQorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgorICovCitpbnQgc25kX2hkYV9yZXN1bWUoc3RydWN0IGhkYV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJbGlzdF9mb3JfZWFjaChwLCAmYnVzLT5jb2RlY19saXN0KSB7CisJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2NvZGVjLCBsaXN0KTsKKwkJaWYgKGNvZGVjLT5wYXRjaF9vcHMucmVzdW1lKQorCQkJY29kZWMtPnBhdGNoX29wcy5yZXN1bWUoY29kZWMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzbmRfaGRhX3Jlc3VtZV9jdGxzIC0gcmVzdW1lIGNvbnRyb2xzIGluIHRoZSBuZXcgY29udHJvbCBsaXN0CisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBrbmV3OiB0aGUgYXJyYXkgb2Ygc25kX2tjb250cm9sX25ld190CisgKgorICogVGhpcyBmdW5jdGlvbiByZXN1bWVzIHRoZSBtaXhlciBjb250cm9scyBpbiB0aGUgc25kX2tjb250cm9sX25ld190IGFycmF5LAorICogb3JpZ2luYWxseSBmb3Igc25kX2hkYV9hZGRfbmV3X2N0bHMoKS4KKyAqIFRoZSBhcnJheSBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhbiBlbXB0eSBlbnRyeSBhcyB0ZXJtaW5hdG9yLgorICovCitpbnQgc25kX2hkYV9yZXN1bWVfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc25kX2tjb250cm9sX25ld190ICprbmV3KQoreworCXNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWw7CisKKwl2YWwgPSBrbWFsbG9jKHNpemVvZigqdmFsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgdmFsKQorCQlyZXR1cm4gLUVOT01FTTsKKwljb2RlYy0+aW5fcmVzdW1lID0gMTsKKwlmb3IgKDsga25ldy0+bmFtZTsga25ldysrKSB7CisJCWludCBpLCBjb3VudDsKKwkJY291bnQgPSBrbmV3LT5jb3VudCA/IGtuZXctPmNvdW50IDogMTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCW1lbXNldCh2YWwsIDAsIHNpemVvZigqdmFsKSk7CisJCQl2YWwtPmlkLmlmYWNlID0ga25ldy0+aWZhY2U7CisJCQl2YWwtPmlkLmRldmljZSA9IGtuZXctPmRldmljZTsKKwkJCXZhbC0+aWQuc3ViZGV2aWNlID0ga25ldy0+c3ViZGV2aWNlOworCQkJc3RyY3B5KHZhbC0+aWQubmFtZSwga25ldy0+bmFtZSk7CisJCQl2YWwtPmlkLmluZGV4ID0ga25ldy0+aW5kZXggPyBrbmV3LT5pbmRleCA6IGk7CisJCQkvKiBBc3N1bWUgdGhhdCBnZXQgY2FsbGJhY2sgcmVhZHMgb25seSBmcm9tIGNhY2hlLAorCQkJICogbm90IGFjY2Vzc2luZyB0byB0aGUgcmVhbCBoYXJkd2FyZQorCQkJICovCisJCQlpZiAoc25kX2N0bF9lbGVtX3JlYWQoY29kZWMtPmJ1cy0+Y2FyZCwgdmFsKSA8IDApCisJCQkJY29udGludWU7CisJCQlzbmRfY3RsX2VsZW1fd3JpdGUoY29kZWMtPmJ1cy0+Y2FyZCwgTlVMTCwgdmFsKTsKKwkJfQorCX0KKwljb2RlYy0+aW5fcmVzdW1lID0gMDsKKwlrZnJlZSh2YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9oZGFfcmVzdW1lX3NwZGlmX291dCAtIHJlc3VtZSB0aGUgZGlnaXRhbCBvdXQKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICovCitpbnQgc25kX2hkYV9yZXN1bWVfc3BkaWZfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBkaWdfbWl4ZXMpOworfQorCisvKioKKyAqIHNuZF9oZGFfcmVzdW1lX3NwZGlmX2luIC0gcmVzdW1lIHRoZSBkaWdpdGFsIGluCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqLworaW50IHNuZF9oZGFfcmVzdW1lX3NwZGlmX2luKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBkaWdfaW5fY3Rscyk7Cit9CisjZW5kaWYKKworLyoKKyAqIHN5bWJvbHMgZXhwb3J0ZWQgZm9yIGNvbnRyb2xsZXIgbW9kdWxlcworICovCitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfd3JpdGUpOworRVhQT1JUX1NZTUJPTChzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9nZXRfc3ViX25vZGVzKTsKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudCk7CitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfYnVzX25ldyk7CitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfbmV3KTsKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0pOworRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdCk7CitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfYnVpbGRfcGNtcyk7CitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfYnVpbGRfY29udHJvbHMpOworI2lmZGVmIENPTkZJR19QTQorRVhQT1JUX1NZTUJPTChzbmRfaGRhX3N1c3BlbmQpOworRVhQT1JUX1NZTUJPTChzbmRfaGRhX3Jlc3VtZSk7CisjZW5kaWYKKworLyoKKyAqICBJTklUIHBhcnQKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2hkYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2hkYV9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfaGRhX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2hkYV9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllOWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qCisgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0hEQV9DT0RFQ19ICisjZGVmaW5lIF9fU09VTkRfSERBX0NPREVDX0gKKworI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisKKy8qCisgKiBub2RlcworICovCisjZGVmaW5lCUFDX05PREVfUk9PVAkJMHgwMAorCisvKgorICogZnVuY3Rpb24gZ3JvdXAgdHlwZXMKKyAqLworZW51bSB7CisJQUNfR1JQX0FVRElPX0ZVTkNUSU9OID0gMHgwMSwKKwlBQ19HUlBfTU9ERU1fRlVOQ1RJT04gPSAweDAyLAorfTsKKwkKKy8qCisgKiB3aWRnZXQgdHlwZXMKKyAqLworZW51bSB7CisJQUNfV0lEX0FVRF9PVVQsCQkvKiBBdWRpbyBPdXQgKi8KKwlBQ19XSURfQVVEX0lOLAkJLyogQXVkaW8gSW4gKi8KKwlBQ19XSURfQVVEX01JWCwJCS8qIEF1ZGlvIE1peGVyICovCisJQUNfV0lEX0FVRF9TRUwsCQkvKiBBdWRpbyBTZWxlY3RvciAqLworCUFDX1dJRF9QSU4sCQkvKiBQaW4gQ29tcGxleCAqLworCUFDX1dJRF9QT1dFUiwJCS8qIFBvd2VyICovCisJQUNfV0lEX1ZPTF9LTkIsCQkvKiBWb2x1bWUgS25vYiAqLworCUFDX1dJRF9CRUVQLAkJLyogQmVlcCBHZW5lcmF0b3IgKi8KKwlBQ19XSURfVkVORE9SID0gMHgwZgkvKiBWZW5kb3Igc3BlY2lmaWMgKi8KK307CisKKy8qCisgKiBHRVQgdmVyYnMKKyAqLworI2RlZmluZSBBQ19WRVJCX0dFVF9TVFJFQU1fRk9STUFUCQkweDBhMDAKKyNkZWZpbmUgQUNfVkVSQl9HRVRfQU1QX0dBSU5fTVVURQkJMHgwYjAwCisjZGVmaW5lIEFDX1ZFUkJfR0VUX1BST0NfQ09FRgkJCTB4MGMwMAorI2RlZmluZSBBQ19WRVJCX0dFVF9DT0VGX0lOREVYCQkJMHgwZDAwCisjZGVmaW5lIEFDX1ZFUkJfUEFSQU1FVEVSUwkJCTB4MGYwMAorI2RlZmluZSBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTAkJCTB4MGYwMQorI2RlZmluZSBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QJCTB4MGYwMgorI2RlZmluZSBBQ19WRVJCX0dFVF9QUk9DX1NUQVRFCQkJMHgwZjAzCisjZGVmaW5lIEFDX1ZFUkJfR0VUX1NESV9TRUxFQ1QJCQkweDBmMDQKKyNkZWZpbmUgQUNfVkVSQl9HRVRfUE9XRVJfU1RBVEUJCQkweDBmMDUKKyNkZWZpbmUgQUNfVkVSQl9HRVRfQ09OVgkJCTB4MGYwNgorI2RlZmluZSBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wJCTB4MGYwNworI2RlZmluZSBBQ19WRVJCX0dFVF9VTlNPTElDSVRFRF9SRVNQT05TRQkweDBmMDgKKyNkZWZpbmUgQUNfVkVSQl9HRVRfUElOX1NFTlNFCQkJMHgwZjA5CisjZGVmaW5lIEFDX1ZFUkJfR0VUX0JFRVBfQ09OVFJPTAkJMHgwZjBhCisjZGVmaW5lIEFDX1ZFUkJfR0VUX0VBUERfQlRMRU5BQkxFCQkweDBmMGMKKyNkZWZpbmUgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUCQkweDBmMGQKKyNkZWZpbmUgQUNfVkVSQl9HRVRfVk9MVU1FX0tOT0JfQ09OVFJPTAkJMHgwZjBmCisvKiBmMTAtZjFhOiBHUElPICovCisjZGVmaW5lIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxUCQkweDBmMWMKKworLyoKKyAqIFNFVCB2ZXJicworICovCisjZGVmaW5lIEFDX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQJCTB4MjAwCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUJCTB4MzAwCisjZGVmaW5lIEFDX1ZFUkJfU0VUX1BST0NfQ09FRgkJCTB4NDAwCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgJCQkweDUwMAorI2RlZmluZSBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTAkJCTB4NzAxCisjZGVmaW5lIEFDX1ZFUkJfU0VUX1BST0NfU1RBVEUJCQkweDcwMworI2RlZmluZSBBQ19WRVJCX1NFVF9TRElfU0VMRUNUCQkJMHg3MDQKKyNkZWZpbmUgQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUJCQkweDcwNQorI2RlZmluZSBBQ19WRVJCX1NFVF9DSEFOTkVMX1NUUkVBTUlECQkweDcwNgorI2RlZmluZSBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wJCTB4NzA3CisjZGVmaW5lIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRQkJMHg3MDgKKyNkZWZpbmUgQUNfVkVSQl9TRVRfUElOX1NFTlNFCQkJMHg3MDkKKyNkZWZpbmUgQUNfVkVSQl9TRVRfQkVFUF9DT05UUk9MCQkweDcwYQorI2RlZmluZSBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUxCRQkJMHg3MGMKKyNkZWZpbmUgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEJCTB4NzBkCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8yCQkweDcwZQorI2RlZmluZSBBQ19WRVJCX1NFVF9WT0xVTUVfS05PQl9DT05UUk9MCQkweDcwZgorI2RlZmluZSBBQ19WRVJCX1NFVF9DT05GSUdfREVGQVVMVF9CWVRFU18wCTB4NzFjCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzEJMHg3MWQKKyNkZWZpbmUgQUNfVkVSQl9TRVRfQ09ORklHX0RFRkFVTFRfQllURVNfMgkweDcxZQorI2RlZmluZSBBQ19WRVJCX1NFVF9DT05GSUdfREVGQVVMVF9CWVRFU18zCTB4NzFmCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0NPREVDX1JFU0VUCQkJMHg3ZmYKKworLyoKKyAqIFBhcmFtZXRlciBJRHMKKyAqLworI2RlZmluZSBBQ19QQVJfVkVORE9SX0lECQkweDAwCisjZGVmaW5lIEFDX1BBUl9TVUJTWVNURU1fSUQJCTB4MDEKKyNkZWZpbmUgQUNfUEFSX1JFVl9JRAkJCTB4MDIKKyNkZWZpbmUgQUNfUEFSX05PREVfQ09VTlQJCTB4MDQKKyNkZWZpbmUgQUNfUEFSX0ZVTkNUSU9OX1RZUEUJCTB4MDUKKyNkZWZpbmUgQUNfUEFSX0FVRElPX0ZHX0NBUAkJMHgwOAorI2RlZmluZSBBQ19QQVJfQVVESU9fV0lER0VUX0NBUAkJMHgwOQorI2RlZmluZSBBQ19QQVJfUENNCQkJMHgwYQorI2RlZmluZSBBQ19QQVJfU1RSRUFNCQkJMHgwYgorI2RlZmluZSBBQ19QQVJfUElOX0NBUAkJCTB4MGMKKyNkZWZpbmUgQUNfUEFSX0FNUF9JTl9DQVAJCTB4MGQKKyNkZWZpbmUgQUNfUEFSX0NPTk5MSVNUX0xFTgkJMHgwZQorI2RlZmluZSBBQ19QQVJfUE9XRVJfU1RBVEUJCTB4MGYKKyNkZWZpbmUgQUNfUEFSX1BST0NfQ0FQCQkJMHgxMAorI2RlZmluZSBBQ19QQVJfR1BJT19DQVAJCQkweDExCisjZGVmaW5lIEFDX1BBUl9BTVBfT1VUX0NBUAkJMHgxMgorCisvKgorICogQUNfVkVSQl9QQVJBTUVURVJTIHJlc3VsdHMgKDMyYml0KQorICovCisKKy8qIEZ1bmN0aW9uIEdyb3VwIFR5cGUgKi8KKyNkZWZpbmUgQUNfRkdUX1RZUEUJCQkoMHhmZjw8MCkKKyNkZWZpbmUgQUNfRkdUX1RZUEVfU0hJRlQJCTAKKyNkZWZpbmUgQUNfRkdUX1VOU09MX0NBUAkJKDE8PDgpCisKKy8qIEF1ZGlvIEZ1bmN0aW9uIEdyb3VwIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBBQ19BRkdfT1VUX0RFTEFZCQkoMHhmPDwwKQorI2RlZmluZSBBQ19BRkdfSU5fREVMQVkJCQkoMHhmPDw4KQorI2RlZmluZSBBQ19BRkdfQkVFUF9HRU4JCQkoMTw8MTYpCisKKy8qIEF1ZGlvIFdpZGdldCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQUNfV0NBUF9TVEVSRU8JCQkoMTw8MCkJLyogc3RlcmVvIEkvTyAqLworI2RlZmluZSBBQ19XQ0FQX0lOX0FNUAkJCSgxPDwxKQkvKiBBTVAtaW4gcHJlc2VudCAqLworI2RlZmluZSBBQ19XQ0FQX09VVF9BTVAJCQkoMTw8MikJLyogQU1QLW91dCBwcmVzZW50ICovCisjZGVmaW5lIEFDX1dDQVBfQU1QX09WUkQJCSgxPDwzKQkvKiBBTVAtcGFyYW1ldGVyIG92ZXJyaWRlICovCisjZGVmaW5lIEFDX1dDQVBfRk9STUFUX09WUkQJCSgxPDw0KQkvKiBmb3JtYXQgb3ZlcnJpZGUgKi8KKyNkZWZpbmUgQUNfV0NBUF9TVFJJUEUJCQkoMTw8NSkJLyogc3RyaXBlICovCisjZGVmaW5lIEFDX1dDQVBfUFJPQ19XSUQJCSgxPDw2KQkvKiBQcm9jIFdpZGdldCAqLworI2RlZmluZSBBQ19XQ0FQX1VOU09MX0NBUAkJKDE8PDcpCS8qIFVuc29sIGNhcGFibGUgKi8KKyNkZWZpbmUgQUNfV0NBUF9DT05OX0xJU1QJCSgxPDw4KQkvKiBjb25uZWN0aW9uIGxpc3QgKi8KKyNkZWZpbmUgQUNfV0NBUF9ESUdJVEFMCQkJKDE8PDkpCS8qIGRpZ2l0YWwgSS9PICovCisjZGVmaW5lIEFDX1dDQVBfUE9XRVIJCQkoMTw8MTApCS8qIHBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUNfV0NBUF9MUl9TV0FQCQkJKDE8PDExKQkvKiBML1Igc3dhcCAqLworI2RlZmluZSBBQ19XQ0FQX0RFTEFZCQkJKDB4Zjw8MTYpCisjZGVmaW5lIEFDX1dDQVBfREVMQVlfU0hJRlQJCTE2CisjZGVmaW5lIEFDX1dDQVBfVFlQRQkJCSgweGY8PDIwKQorI2RlZmluZSBBQ19XQ0FQX1RZUEVfU0hJRlQJCTIwCisKKy8qIHN1cHBvcnRlZCBQQ00gcmF0ZXMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgQUNfU1VQUENNX1JBVEVTCQkJKDB4ZmZmIDw8IDApCisjZGVmaW5lIEFDX1NVUFBDTV9CSVRTXzgJCSgxPDwxNikKKyNkZWZpbmUgQUNfU1VQUENNX0JJVFNfMTYJCSgxPDwxNykKKyNkZWZpbmUgQUNfU1VQUENNX0JJVFNfMjAJCSgxPDwxOCkKKyNkZWZpbmUgQUNfU1VQUENNX0JJVFNfMjQJCSgxPDwxOSkKKyNkZWZpbmUgQUNfU1VQUENNX0JJVFNfMzIJCSgxPDwyMCkKKworLyogc3VwcG9ydGVkIFBDTSBzdHJlYW0gZm9ybWF0ICovCisjZGVmaW5lIEFDX1NVUEZNVF9QQ00JCQkoMTw8MCkKKyNkZWZpbmUgQUNfU1VQRk1UX0ZMT0FUMzIJCSgxPDwxKQorI2RlZmluZSBBQ19TVVBGTVRfQUMzCQkJKDE8PDIpCisKKy8qIFBpbiB3aWRnZXQgY2FwYWJpbGllcyAqLworI2RlZmluZSBBQ19QSU5DQVBfSU1QX1NFTlNFCQkoMTw8MCkJLyogaW1wZWRhbmNlIHNlbnNlIGNhcGFibGUgKi8KKyNkZWZpbmUgQUNfUElOQ0FQX1RSSUdfUkVRCQkoMTw8MSkJLyogdHJpZ2dlciByZXF1aXJlZCAqLworI2RlZmluZSBBQ19QSU5DQVBfUFJFU19ERVRFQ1QJCSgxPDwyKQkvKiBwcmVzZW5jZSBkZXRlY3QgY2FwYWJsZSAqLworI2RlZmluZSBBQ19QSU5DQVBfSFBfRFJWCQkoMTw8MykJLyogaGVhZHBob25lIGRyaXZlIGNhcGFibGUgKi8KKyNkZWZpbmUgQUNfUElOQ0FQX09VVAkJCSgxPDw0KQkvKiBvdXRwdXQgY2FwYWJsZSAqLworI2RlZmluZSBBQ19QSU5DQVBfSU4JCQkoMTw8NSkJLyogaW5wdXQgY2FwYWJsZSAqLworI2RlZmluZSBBQ19QSU5DQVBfQkFMQU5DRQkJKDE8PDYpCS8qIGJhbGFuY2VkIEkvTyBjYXBhYmxlICovCisjZGVmaW5lIEFDX1BJTkNBUF9WUkVGCQkJKDc8PDgpCisjZGVmaW5lIEFDX1BJTkNBUF9WUkVGX1NISUZUCQk4CisjZGVmaW5lIEFDX1BJTkNBUF9FQVBECQkJKDE8PDE2KQkvKiBFQVBEIGNhcGFibGUgKi8KKy8qIFZyZWYgc3RhdHVzICh1c2VkIGluIHBpbiBjYXAgYW5kIHBpbiBjdGwpICovCisjZGVmaW5lIEFDX1BJTl9WUkVGX0hJWgkJCSgxPDwwKQkvKiBIaS1aICovCisjZGVmaW5lIEFDX1BJTl9WUkVGXzUwCQkJKDE8PDEpCS8qIDUwJSAqLworI2RlZmluZSBBQ19QSU5fVlJFRl9HUkQJCQkoMTw8MikJLyogZ3JvdW5kICovCisjZGVmaW5lIEFDX1BJTl9WUkVGXzgwCQkJKDE8PDQpCS8qIDgwJSAqLworI2RlZmluZSBBQ19QSU5fVlJFRl8xMDAJCQkoMTw8NSkJLyogMTAwJSAqLworCisKKy8qIEFtcGxpZmllciBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQUNfQU1QQ0FQX09GRlNFVAkJKDB4N2Y8PDApICAvKiAwZEIgb2Zmc2V0ICovCisjZGVmaW5lIEFDX0FNUENBUF9PRkZTRVRfU0hJRlQJCTAKKyNkZWZpbmUgQUNfQU1QQ0FQX05VTV9TVEVQUwkJKDB4N2Y8PDgpICAvKiBudW1iZXIgb2Ygc3RlcHMgKi8KKyNkZWZpbmUgQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVAk4CisjZGVmaW5lIEFDX0FNUENBUF9TVEVQX1NJWkUJCSgweDdmPDwxNikgLyogc3RlcCBzaXplIDAtMzJkQiBpbiAwLjI1ZEIgKi8KKyNkZWZpbmUgQUNfQU1QQ0FQX1NURVBfU0laRV9TSElGVAkxNgorI2RlZmluZSBBQ19BTVBDQVBfTVVURQkJCSgxPDwzMSkgICAgLyogbXV0ZSBjYXBhYmxlICovCisjZGVmaW5lIEFDX0FNUENBUF9NVVRFX1NISUZUCQkzMQorCisvKiBDb25uZWN0aW9uIGxpc3QgKi8KKyNkZWZpbmUgQUNfQ0xJU1RfTEVOR1RICQkJKDB4N2Y8PDApCisjZGVmaW5lIEFDX0NMSVNUX0xPTkcJCQkoMTw8NykKKworLyogU3VwcG9ydGVkIHBvd2VyIHN0YXR1cyAqLworI2RlZmluZSBBQ19QV1JTVF9EMFNVUAkJCSgxPDwwKQorI2RlZmluZSBBQ19QV1JTVF9EMVNVUAkJCSgxPDwxKQorI2RlZmluZSBBQ19QV1JTVF9EMlNVUAkJCSgxPDwyKQorI2RlZmluZSBBQ19QV1JTVF9EM1NVUAkJCSgxPDwzKQorCisvKiBQcm9jZXNzaW5nIGNhcGFiaWxpZXMgKi8KKyNkZWZpbmUgQUNfUENBUF9CRU5JR04JCQkoMTw8MCkKKyNkZWZpbmUgQUNfUENBUF9OVU1fQ09FRgkJKDB4ZmY8PDgpCisKKy8qIFZvbHVtZSBrbm9icyBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQUNfS05CQ0FQX05VTV9TVEVQUwkJKDB4N2Y8PDApCisjZGVmaW5lIEFDX0tOQkNBUF9ERUxUQQkJCSgxPDw4KQorCisvKgorICogQ29udHJvbCBQYXJhbWV0ZXJzCisgKi8KKworLyogQW1wIGdhaW4vbXV0ZSAqLworI2RlZmluZSBBQ19BTVBfTVVURQkJCSgxPDw4KQorI2RlZmluZSBBQ19BTVBfR0FJTgkJCSgweDdmKQorI2RlZmluZSBBQ19BTVBfR0VUX0lOREVYCQkoMHhmPDwwKQorCisjZGVmaW5lIEFDX0FNUF9HRVRfTEVGVAkJCSgxPDwxMykKKyNkZWZpbmUgQUNfQU1QX0dFVF9SSUdIVAkJKDA8PDEzKQorI2RlZmluZSBBQ19BTVBfR0VUX09VVFBVVAkJKDE8PDE1KQorI2RlZmluZSBBQ19BTVBfR0VUX0lOUFVUCQkoMDw8MTUpCisKKyNkZWZpbmUgQUNfQU1QX1NFVF9JTkRFWAkJKDB4Zjw8OCkKKyNkZWZpbmUgQUNfQU1QX1NFVF9JTkRFWF9TSElGVAkJOAorI2RlZmluZSBBQ19BTVBfU0VUX1JJR0hUCQkoMTw8MTIpCisjZGVmaW5lIEFDX0FNUF9TRVRfTEVGVAkJCSgxPDwxMykKKyNkZWZpbmUgQUNfQU1QX1NFVF9JTlBVVAkJKDE8PDE0KQorI2RlZmluZSBBQ19BTVBfU0VUX09VVFBVVAkJKDE8PDE1KQorCisvKiBESUdJVEFMMSBiaXRzICovCisjZGVmaW5lIEFDX0RJRzFfRU5BQkxFCQkJKDE8PDApCisjZGVmaW5lIEFDX0RJRzFfVgkJCSgxPDwxKQorI2RlZmluZSBBQ19ESUcxX1ZDRkcJCQkoMTw8MikKKyNkZWZpbmUgQUNfRElHMV9FTVBIQVNJUwkJKDE8PDMpCisjZGVmaW5lIEFDX0RJRzFfQ09QWVJJR0hUCQkoMTw8NCkKKyNkZWZpbmUgQUNfRElHMV9OT05BVURJTwkJKDE8PDUpCisjZGVmaW5lIEFDX0RJRzFfUFJPRkVTU0lPTkFMCQkoMTw8NikKKyNkZWZpbmUgQUNfRElHMV9MRVZFTAkJCSgxPDw3KQorCisvKiBQaW4gd2lkZ2V0IGNvbnRyb2wgLSA4Yml0ICovCisjZGVmaW5lIEFDX1BJTkNUTF9WUkVGRU4JCSgweDc8PDApCisjZGVmaW5lIEFDX1BJTkNUTF9JTl9FTgkJCSgxPDw1KQorI2RlZmluZSBBQ19QSU5DVExfT1VUX0VOCQkoMTw8NikKKyNkZWZpbmUgQUNfUElOQ1RMX0hQX0VOCQkJKDE8PDcpCisKKy8qIGNvbmZpZ3VyYXRpb24gZGVmYXVsdCAtIDMyYml0ICovCisjZGVmaW5lIEFDX0RFRkNGR19TRVFVRU5DRQkJKDB4Zjw8MCkKKyNkZWZpbmUgQUNfREVGQ0ZHX0RFRl9BU1NPQwkJKDB4Zjw8NCkKKyNkZWZpbmUgQUNfREVGQ0ZHX01JU0MJCQkoMHhmPDw4KQorI2RlZmluZSBBQ19ERUZDRkdfQ09MT1IJCQkoMHhmPDwxMikKKyNkZWZpbmUgQUNfREVGQ0ZHX0NPTE9SX1NISUZUCQkxMgorI2RlZmluZSBBQ19ERUZDRkdfQ09OTl9UWVBFCQkoMHhmPDwxNikKKyNkZWZpbmUgQUNfREVGQ0ZHX0NPTk5fVFlQRV9TSElGVAkxNgorI2RlZmluZSBBQ19ERUZDRkdfREVWSUNFCQkoMHhmPDwyMCkKKyNkZWZpbmUgQUNfREVGQ0ZHX0RFVklDRV9TSElGVAkJMjAKKyNkZWZpbmUgQUNfREVGQ0ZHX0xPQ0FUSU9OCQkoMHgzZjw8MjQpCisjZGVmaW5lIEFDX0RFRkNGR19MT0NBVElPTl9TSElGVAkyNAorI2RlZmluZSBBQ19ERUZDRkdfUE9SVF9DT05OCQkoMHgzPDwzMCkKKyNkZWZpbmUgQUNfREVGQ0ZHX1BPUlRfQ09OTl9TSElGVAkzMAorCisvKiBkZXZpY2UgZGV2aWNlIHR5cGVzICgweDAtMHhmKSAqLworZW51bSB7CisJQUNfSkFDS19MSU5FX09VVCwKKwlBQ19KQUNLX1NQRUFLRVIsCisJQUNfSkFDS19IUF9PVVQsCisJQUNfSkFDS19DRCwKKwlBQ19KQUNLX1NQRElGX09VVCwKKwlBQ19KQUNLX0RJR19PVEhFUl9PVVQsCisJQUNfSkFDS19NT0RFTV9MSU5FX1NJREUsCisJQUNfSkFDS19NT0RFTV9IQU5EX1NJREUsCisJQUNfSkFDS19MSU5FX0lOLAorCUFDX0pBQ0tfQVVYLAorCUFDX0pBQ0tfTUlDX0lOLAorCUFDX0pBQ0tfVEVMRVBIT05ZLAorCUFDX0pBQ0tfU1BESUZfSU4sCisJQUNfSkFDS19ESUdfT1RIRVJfSU4sCisJQUNfSkFDS19PVEhFUiA9IDB4ZiwKK307CisKKy8qIGphY2sgY29ubmVjdGlvbiB0eXBlcyAoMHgwLTB4ZikgKi8KK2VudW0geworCUFDX0pBQ0tfQ09OTl9VTktOT1dOLAorCUFDX0pBQ0tfQ09OTl8xXzgsCisJQUNfSkFDS19DT05OXzFfNCwKKwlBQ19KQUNLX0NPTk5fQVRBUEksCisJQUNfSkFDS19DT05OX1JDQSwKKwlBQ19KQUNLX0NPTk5fT1BUSUNBTCwKKwlBQ19KQUNLX0NPTk5fT1RIRVJfRElHSVRBTCwKKwlBQ19KQUNLX0NPTk5fT1RIRVJfQU5BTE9HLAorCUFDX0pBQ0tfQ09OTl9ESU4sCisJQUNfSkFDS19DT05OX1hMUiwKKwlBQ19KQUNLX0NPTk5fUkoxMSwKKwlBQ19KQUNLX0NPTk5fQ09NQiwKKwlBQ19KQUNLX0NPTk5fT1RIRVIgPSAweGYsCit9OworCisvKiBqYWNrIGNvbG9ycyAoMHgwLTB4ZikgKi8KK2VudW0geworCUFDX0pBQ0tfQ09MT1JfVU5LTk9XTiwKKwlBQ19KQUNLX0NPTE9SX0JMQUNLLAorCUFDX0pBQ0tfQ09MT1JfR1JFWSwKKwlBQ19KQUNLX0NPTE9SX0JMVUUsCisJQUNfSkFDS19DT0xPUl9HUkVFTiwKKwlBQ19KQUNLX0NPTE9SX1JFRCwKKwlBQ19KQUNLX0NPTE9SX09SQU5HRSwKKwlBQ19KQUNLX0NPTE9SX1lFTExPVywKKwlBQ19KQUNLX0NPTE9SX1BVUlBMRSwKKwlBQ19KQUNLX0NPTE9SX1BJTkssCisJQUNfSkFDS19DT0xPUl9XSElURSA9IDB4ZSwKKwlBQ19KQUNLX0NPTE9SX09USEVSLAorfTsKKworLyogSmFjayBsb2NhdGlvbiAoMHgwLTB4M2YpICovCisvKiBjb21tb24gY2FzZSAqLworZW51bSB7CisJQUNfSkFDS19MT0NfTk9ORSwKKwlBQ19KQUNLX0xPQ19SRUFSLAorCUFDX0pBQ0tfTE9DX0ZST05ULAorCUFDX0pBQ0tfTE9DX0xFRlQsCisJQUNfSkFDS19MT0NfUklHSFQsCisJQUNfSkFDS19MT0NfVE9QLAorCUFDX0pBQ0tfTE9DX0JPVFRPTSwKK307CisvKiBiaXRzIDQtNSAqLworZW51bSB7CisJQUNfSkFDS19MT0NfRVhURVJOQUwgPSAweDAwLAorCUFDX0pBQ0tfTE9DX0lOVEVSTkFMID0gMHgxMCwKKwlBQ19KQUNLX0xPQ19TRVBBUkFURSA9IDB4MjAsCisJQUNfSkFDS19MT0NfT1RIRVIgICAgPSAweDMwLAorfTsKK2VudW0geworCS8qIGV4dGVybmFsIG9uIHByaW1hcnkgY2hhc2lzICovCisJQUNfSkFDS19MT0NfUkVBUl9QQU5FTCA9IDB4MDcsCisJQUNfSkFDS19MT0NfRFJJVkVfQkFZLAorCS8qIGludGVybmFsICovCisJQUNfSkFDS19MT0NfUklTRVIgPSAweDE3LAorCUFDX0pBQ0tfTE9DX0hETUksCisJQUNfSkFDS19MT0NfQVRBUEksCisJLyogb3RoZXJzICovCisJQUNfSkFDS19MT0NfTU9CSUxFX0lOID0gMHgzNywKKwlBQ19KQUNLX0xPQ19NT0JJTEVfT1VULAorfTsKKworLyogUG9ydCBjb25uZWN0aXZpdHkgKDAtMykgKi8KK2VudW0geworCUFDX0pBQ0tfUE9SVF9DT01QTEVYLAorCUFDX0pBQ0tfUE9SVF9OT05FLAorCUFDX0pBQ0tfUE9SVF9GSVhFRCwKKwlBQ19KQUNLX1BPUlRfQk9USCwKK307CisKKy8qIG1heC4gY29ubmVjdGlvbnMgdG8gYSB3aWRnZXQgKi8KKyNkZWZpbmUgSERBX01BWF9DT05ORUNUSU9OUwkxNgorCisvKiBtYXguIGNvZGVjIGFkZHJlc3MgKi8KKyNkZWZpbmUgSERBX01BWF9DT0RFQ19BRERSRVNTCTB4MGYKKworLyoKKyAqIFN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgaGRhX2J1czsKK3N0cnVjdCBoZGFfY29kZWM7CitzdHJ1Y3QgaGRhX3BjbTsKK3N0cnVjdCBoZGFfcGNtX3N0cmVhbTsKK3N0cnVjdCBoZGFfYnVzX3Vuc29saWNpdGVkOworCisvKiBOSUQgdHlwZSAqLwordHlwZWRlZiB1MTYgaGRhX25pZF90OworCisvKiBidXMgb3BlcmF0b3JzICovCitzdHJ1Y3QgaGRhX2J1c19vcHMgeworCS8qIHNlbmQgYSBzaW5nbGUgY29tbWFuZCAqLworCWludCAoKmNvbW1hbmQpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgZGlyZWN0LAorCQkgICAgICAgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtKTsKKwkvKiBnZXQgYSByZXNwb25zZSBmcm9tIHRoZSBsYXN0IGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBpbnQgKCpnZXRfcmVzcG9uc2UpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKwkvKiBmcmVlIHRoZSBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICgqcHJpdmF0ZV9mcmVlKShzdHJ1Y3QgaGRhX2J1cyAqKTsKK307CisKKy8qIHRlbXBsYXRlIHRvIHBhc3MgdG8gdGhlIGJ1cyBjb25zdHJ1Y3RvciAqLworc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgeworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCWNvbnN0IGNoYXIgKm1vZGVsbmFtZTsKKwlzdHJ1Y3QgaGRhX2J1c19vcHMgb3BzOworfTsKKworLyoKKyAqIGNvZGVjIGJ1cworICoKKyAqIGVhY2ggY29udHJvbGxlciBuZWVkcyB0byBjcmVhdGEgYSBoZGFfYnVzIHRvIGFzc2lnbiB0aGUgYWNjZXNzb3IuCisgKiBBIGhkYV9idXMgY29udGFpbnMgc2V2ZXJhbCBjb2RlY3MgaW4gdGhlIGxpc3QgY29kZWNfbGlzdC4KKyAqLworc3RydWN0IGhkYV9idXMgeworCXNuZF9jYXJkX3QgKmNhcmQ7CisKKwkvKiBjb3BpZWQgZnJvbSB0ZW1wbGF0ZSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCWNvbnN0IGNoYXIgKm1vZGVsbmFtZTsKKwlzdHJ1Y3QgaGRhX2J1c19vcHMgb3BzOworCisJLyogY29kZWMgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvZGVjX2xpc3Q7CisJc3RydWN0IGhkYV9jb2RlYyAqY2FkZHJfdGJsW0hEQV9NQVhfQ09ERUNfQUREUkVTU107IC8qIGNhZGRyIC0+IGNvZGVjICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGNtZF9tdXRleDsKKworCS8qIHVuc29saWNpdGVkIGV2ZW50IHF1ZXVlICovCisJc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgKnVuc29sOworCisJc25kX2luZm9fZW50cnlfdCAqcHJvYzsKK307CisKKy8qCisgKiBjb2RlYyBwcmVzZXQKKyAqCisgKiBLbm93biBjb2RlY3MgaGF2ZSB0aGUgcGF0Y2ggdG8gYnVpbGQgYW5kIHNldCB1cCB0aGUgY29udHJvbHMvUENNcworICogYmV0dGVyIHRoYW4gdGhlIGdlbmVyaWMgcGFyc2VyLgorICovCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCB7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGludCBzdWJzOworCXVuc2lnbmVkIGludCBzdWJzX21hc2s7CisJdW5zaWduZWQgaW50IHJldjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnBhdGNoKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Cit9OworCQorLyogb3BzIHNldCBieSB0aGUgcHJlc2V0IHBhdGNoICovCitzdHJ1Y3QgaGRhX2NvZGVjX29wcyB7CisJaW50ICgqYnVpbGRfY29udHJvbHMpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKwlpbnQgKCpidWlsZF9wY21zKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisJaW50ICgqaW5pdCkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisJdm9pZCAoKnVuc29sX2V2ZW50KShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcyk7CisjaWZkZWYgQ09ORklHX1BNCisJaW50ICgqc3VzcGVuZCkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisjZW5kaWYKK307CisKKy8qIHJlY29yZCBmb3IgYW1wIGluZm9ybWF0aW9uIGNhY2hlICovCitzdHJ1Y3QgaGRhX2FtcF9pbmZvIHsKKwl1MzIga2V5OwkJLyogaGFzaCBrZXkgKi8KKwl1MzIgYW1wX2NhcHM7CQkvKiBhbXAgY2FwYWJpbGl0aWVzICovCisJdTE2IHZvbFsyXTsJCS8qIGN1cnJlbnQgdm9sdW1lICYgbXV0ZSovCisJdTE2IHN0YXR1czsJCS8qIHVwZGF0ZSBmbGFnICovCisJdTE2IG5leHQ7CQkvKiBuZXh0IGxpbmsgKi8KK307CisKKy8qIFBDTSBjYWxsYmFja3MgKi8KK3N0cnVjdCBoZGFfcGNtX29wcyB7CisJaW50ICgqb3Blbikoc3RydWN0IGhkYV9wY21fc3RyZWFtICppbmZvLCBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSk7CisJaW50ICgqY2xvc2UpKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaW5mbywgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCSAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKTsKKwlpbnQgKCpwcmVwYXJlKShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmluZm8sIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkgICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCSAgICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pOworCWludCAoKmNsZWFudXApKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaW5mbywgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCSAgICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pOworfTsKKworLyogUENNIGluZm9ybWF0aW9uIGZvciBlYWNoIHN1YnN0cmVhbSAqLworc3RydWN0IGhkYV9wY21fc3RyZWFtIHsKKwl1bnNpZ25lZCBpbnQgc3Vic3RyZWFtczsJLyogbnVtYmVyIG9mIHN1YnN0cmVhbXMsIDAgPSBub3QgZXhpc3QgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWluOwkvKiBtaW4uIG51bWJlciBvZiBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCBjaGFubmVsc19tYXg7CS8qIG1heC4gbnVtYmVyIG9mIGNoYW5uZWxzICovCisJaGRhX25pZF90IG5pZDsJLyogZGVmYXVsdCBOSUQgdG8gcXVlcnkgcmF0ZXMvZm9ybWF0cy9icHMsIG9yIHNldCB1cCAqLworCXUzMiByYXRlczsJLyogc3VwcG9ydGVkIHJhdGVzICovCisJdTY0IGZvcm1hdHM7CS8qIHN1cHBvcnRlZCBmb3JtYXRzIChTTkRSVl9QQ01fRk1UQklUXykgKi8KKwl1bnNpZ25lZCBpbnQgbWF4YnBzOwkvKiBzdXBwb3J0ZWQgbWF4LiBiaXQgcGVyIHNhbXBsZSAqLworCXN0cnVjdCBoZGFfcGNtX29wcyBvcHM7Cit9OworCisvKiBmb3IgUENNIGNyZWF0aW9uICovCitzdHJ1Y3QgaGRhX3BjbSB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gc3RyZWFtWzJdOworfTsKKworLyogY29kZWMgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBoZGFfY29kZWMgeworCXN0cnVjdCBoZGFfYnVzICpidXM7CisJdW5zaWduZWQgaW50IGFkZHI7CS8qIGNvZGVjIGFkZHIqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlzdCBwb2ludCAqLworCisJaGRhX25pZF90IGFmZzsJLyogQUZHIG5vZGUgaWQgKi8KKworCS8qIGlkcyAqLworCXUzMiB2ZW5kb3JfaWQ7CisJdTMyIHN1YnN5c3RlbV9pZDsKKwl1MzIgcmV2aXNpb25faWQ7CisKKwkvKiBkZXRlY3RlZCBwcmVzZXQgKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCAqcHJlc2V0OworCisJLyogc2V0IGJ5IHBhdGNoICovCisJc3RydWN0IGhkYV9jb2RlY19vcHMgcGF0Y2hfb3BzOworCisJLyogcmVzdW1lIHBoYXNlIC0gYWxsIGNvbnRyb2xzIHNob3VsZCB1cGRhdGUgZXZlbiBpZgorCSAqIHRoZSB2YWx1ZXMgYXJlIG5vdCBjaGFuZ2VkCisJICovCisJdW5zaWduZWQgaW50IGluX3Jlc3VtZTsKKworCS8qIFBDTSB0byBjcmVhdGUsIHNldCBieSBwYXRjaF9vcHMuYnVpbGRfcGNtcyBjYWxsYmFjayAqLworCXVuc2lnbmVkIGludCBudW1fcGNtczsKKwlzdHJ1Y3QgaGRhX3BjbSAqcGNtX2luZm87CisKKwkvKiBjb2RlYyBzcGVjaWZpYyBpbmZvICovCisJdm9pZCAqc3BlYzsKKworCS8qIGhhc2ggZm9yIGFtcCBhY2Nlc3MgKi8KKwl1MTYgYW1wX2hhc2hbMzJdOworCWludCBudW1fYW1wX2VudHJpZXM7CisJc3RydWN0IGhkYV9hbXBfaW5mbyBhbXBfaW5mb1sxMjhdOyAvKiBiaWcgZW5vdWdoPyAqLworCisJc3RydWN0IHNlbWFwaG9yZSBzcGRpZl9tdXRleDsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfc3RhdHVzOwkvKiBJRUM5NTggc3RhdHVzIGJpdHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzcGRpZl9jdGxzOwkvKiBTUERJRiBjb250cm9sIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgc3BkaWZfaW5fZW5hYmxlOwkvKiBTUERJRiBpbnB1dCBlbmFibGU/ICovCit9OworCisvKiBkaXJlY3Rpb24gKi8KK2VudW0geworCUhEQV9JTlBVVCwgSERBX09VVFBVVAorfTsKKworCisvKgorICogY29uc3RydWN0b3JzCisgKi8KK2ludCBzbmRfaGRhX2J1c19uZXcoc25kX2NhcmRfdCAqY2FyZCwgY29uc3Qgc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgKnRlbXAsCisJCSAgICBzdHJ1Y3QgaGRhX2J1cyAqKmJ1c3ApOworaW50IHNuZF9oZGFfY29kZWNfbmV3KHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCBjb2RlY19hZGRyLAorCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKTsKKworLyoKKyAqIGxvdyBsZXZlbCBmdW5jdGlvbnMKKyAqLwordW5zaWduZWQgaW50IHNuZF9oZGFfY29kZWNfcmVhZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdCwKKwkJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pOworaW50IHNuZF9oZGFfY29kZWNfd3JpdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXJlY3QsCisJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pOworI2RlZmluZSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgcGFyYW0pIHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1BBUkFNRVRFUlMsIHBhcmFtKQoraW50IHNuZF9oZGFfZ2V0X3N1Yl9ub2RlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaGRhX25pZF90ICpzdGFydF9pZCk7CitpbnQgc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGhkYV9uaWRfdCAqY29ubl9saXN0LCBpbnQgbWF4X2Nvbm5zKTsKKworc3RydWN0IGhkYV92ZXJiIHsKKwloZGFfbmlkX3QgbmlkOworCXUzMiB2ZXJiOworCXUzMiBwYXJhbTsKK307CisKK3ZvaWQgc25kX2hkYV9zZXF1ZW5jZV93cml0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXEpOworCisvKiB1bnNvbGljaXRlZCBldmVudCAqLworaW50IHNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCk7CisKKy8qCisgKiBNaXhlcgorICovCitpbnQgc25kX2hkYV9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2J1cyAqYnVzKTsKKworLyoKKyAqIFBDTQorICovCitpbnQgc25kX2hkYV9idWlsZF9wY21zKHN0cnVjdCBoZGFfYnVzICpidXMpOwordm9pZCBzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgdTMyIHN0cmVhbV90YWcsCisJCQkJaW50IGNoYW5uZWxfaWQsIGludCBmb3JtYXQpOwordW5zaWduZWQgaW50IHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCQkJCXVuc2lnbmVkIGludCBmb3JtYXQsIHVuc2lnbmVkIGludCBtYXhicHMpOworaW50IHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQl1MzIgKnJhdGVzcCwgdTY0ICpmb3JtYXRzcCwgdW5zaWduZWQgaW50ICpicHNwKTsKK2ludCBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJdW5zaWduZWQgaW50IGZvcm1hdCk7CisKKy8qCisgKiBNaXNjCisgKi8KK3ZvaWQgc25kX2hkYV9nZXRfY29kZWNfbmFtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCisjaWZkZWYgQ09ORklHX1BNCitpbnQgc25kX2hkYV9zdXNwZW5kKHN0cnVjdCBoZGFfYnVzICpidXMsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitpbnQgc25kX2hkYV9yZXN1bWUoc3RydWN0IGhkYV9idXMgKmJ1cyk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU09VTkRfSERBX0NPREVDX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY3YjZjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCkBAIC0wLDAgKzEsOTA2IEBACisvKgorICogVW5pdmVyc2FsIEludGVyZmFjZSBmb3IgSW50ZWwgSGlnaCBEZWZpbml0aW9uIEF1ZGlvIENvZGVjCisgKgorICogR2VuZXJpYyB3aWRnZXQgdHJlZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKworLyogd2lkZ2V0IG5vZGUgZm9yIHBhcnNpbmcgKi8KK3N0cnVjdCBoZGFfZ25vZGUgeworCWhkYV9uaWRfdCBuaWQ7CQkvKiBOSUQgb2YgdGhpcyB3aWRnZXQgKi8KKwl1bnNpZ25lZCBzaG9ydCBuY29ubnM7CS8qIG51bWJlciBvZiBpbnB1dCBjb25uZWN0aW9ucyAqLworCWhkYV9uaWRfdCBjb25uX2xpc3RbSERBX01BWF9DT05ORUNUSU9OU107IC8qIGlucHV0IGNvbm5lY3Rpb25zICovCisJdW5zaWduZWQgaW50IHdpZF9jYXBzOwkvKiB3aWRnZXQgY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgY2hhciB0eXBlOwkvKiB3aWRnZXQgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIgcGluX2N0bDsJLyogcGluIGNvbnRyb2xzICovCisJdW5zaWduZWQgY2hhciBjaGVja2VkOwkvKiB0aGUgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgbm9kZSBpcyBhbHJlYWR5IHBhcnNlZCAqLworCXVuc2lnbmVkIGludCBwaW5fY2FwczsJLyogcGluIHdpZGdldCBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgZGVmX2NmZzsJLyogZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgaW50IGFtcF9vdXRfY2FwczsJLyogQU1QIG91dCBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgYW1wX2luX2NhcHM7CS8qIEFNUCBpbiBjYXBhYmlsaXRpZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKiBwYXRoYy1zcGVjaWZpYyByZWNvcmQgKi8KK3N0cnVjdCBoZGFfZ3NwZWMgeworCXN0cnVjdCBoZGFfZ25vZGUgKmRhY19ub2RlOwkvKiBEQUMgbm9kZSAqLworCXN0cnVjdCBoZGFfZ25vZGUgKm91dF9waW5fbm9kZTsJLyogT3V0cHV0IHBpbiAoTGluZS1PdXQpIG5vZGUgKi8KKwlzdHJ1Y3QgaGRhX2dub2RlICpwY21fdm9sX25vZGU7CS8qIE5vZGUgZm9yIFBDTSB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgcGNtX3ZvbF9pbmRleDsJLyogY29ubmVjdGlvbiBvZiBQQ00gdm9sdW1lICovCisKKwlzdHJ1Y3QgaGRhX2dub2RlICphZGNfbm9kZTsJLyogQURDIG5vZGUgKi8KKwlzdHJ1Y3QgaGRhX2dub2RlICpjYXBfdm9sX25vZGU7CS8qIE5vZGUgZm9yIGNhcHR1cmUgdm9sdW1lICovCisJdW5zaWduZWQgaW50IGN1cl9jYXBfc3JjOwkvKiBjdXJyZW50IGNhcHR1cmUgc291cmNlICovCisJc3RydWN0IGhkYV9pbnB1dF9tdXggaW5wdXRfbXV4OworCWNoYXIgY2FwX2xhYmVsc1tIREFfTUFYX05VTV9JTlBVVFNdWzE2XTsKKworCXVuc2lnbmVkIGludCBkZWZfYW1wX2luX2NhcHM7CisJdW5zaWduZWQgaW50IGRlZl9hbXBfb3V0X2NhcHM7CisKKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjOwkJLyogUENNIGluZm9ybWF0aW9uICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5pZF9saXN0OwkvKiBsaXN0IG9mIHdpZGdldHMgKi8KK307CisKKy8qCisgKiByZXRyaWV2ZSB0aGUgZGVmYXVsdCBkZXZpY2UgdHlwZSBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZyB2YWx1ZQorICovCisjZGVmaW5lIGdldF9kZWZjZmdfdHlwZShub2RlKSAoKChub2RlKS0+ZGVmX2NmZyAmIEFDX0RFRkNGR19ERVZJQ0UpID4+IEFDX0RFRkNGR19ERVZJQ0VfU0hJRlQpCisjZGVmaW5lIGdldF9kZWZjZmdfbG9jYXRpb24obm9kZSkgKCgobm9kZSktPmRlZl9jZmcgJiBBQ19ERUZDRkdfTE9DQVRJT04pID4+IEFDX0RFRkNGR19MT0NBVElPTl9TSElGVCkKKworLyoKKyAqIGRlc3RydWN0b3IKKyAqLworc3RhdGljIHZvaWQgc25kX2hkYV9nZW5lcmljX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJaWYgKCEgc3BlYykKKwkJcmV0dXJuOworCS8qIGZyZWUgYWxsIHdpZGdldHMgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnNwZWMtPm5pZF9saXN0KSB7CisJCXN0cnVjdCBoZGFfZ25vZGUgKm5vZGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfZ25vZGUsIGxpc3QpOworCQlrZnJlZShub2RlKTsKKwl9CisJa2ZyZWUoc3BlYyk7Cit9CisKKworLyoKKyAqIGFkZCBhIG5ldyB3aWRnZXQgbm9kZSBhbmQgcmVhZCBpdHMgYXR0cmlidXRlcworICovCitzdGF0aWMgaW50IGFkZF9uZXdfbm9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9nc3BlYyAqc3BlYywgaGRhX25pZF90IG5pZCkKK3sKKwlzdHJ1Y3QgaGRhX2dub2RlICpub2RlOworCWludCBuY29ubnM7CisKKwlub2RlID0ga2NhbGxvYygxLCBzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlub2RlLT5uaWQgPSBuaWQ7CisJbmNvbm5zID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgbm9kZS0+Y29ubl9saXN0LCBIREFfTUFYX0NPTk5FQ1RJT05TKTsKKwlpZiAobmNvbm5zIDwgMCkgeworCQlrZnJlZShub2RlKTsKKwkJcmV0dXJuIG5jb25uczsKKwl9CisJbm9kZS0+bmNvbm5zID0gbmNvbm5zOworCW5vZGUtPndpZF9jYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKTsKKwlub2RlLT50eXBlID0gKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7CisKKwlpZiAobm9kZS0+dHlwZSA9PSBBQ19XSURfUElOKSB7CisJCW5vZGUtPnBpbl9jYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBub2RlLT5uaWQsIEFDX1BBUl9QSU5fQ0FQKTsKKwkJbm9kZS0+cGluX2N0bCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbm9kZS0+bmlkLCAwLCBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCQlub2RlLT5kZWZfY2ZnID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBub2RlLT5uaWQsIDAsIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxULCAwKTsKKwl9CisKKwlpZiAobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX09VVF9BTVApIHsKKwkJaWYgKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9BTVBfT1ZSRCkKKwkJCW5vZGUtPmFtcF9vdXRfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbm9kZS0+bmlkLCBBQ19QQVJfQU1QX09VVF9DQVApOworCQlpZiAoISBub2RlLT5hbXBfb3V0X2NhcHMpCisJCQlub2RlLT5hbXBfb3V0X2NhcHMgPSBzcGVjLT5kZWZfYW1wX291dF9jYXBzOworCX0KKwlpZiAobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX0lOX0FNUCkgeworCQlpZiAobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX0FNUF9PVlJEKQorCQkJbm9kZS0+YW1wX2luX2NhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5vZGUtPm5pZCwgQUNfUEFSX0FNUF9JTl9DQVApOworCQlpZiAoISBub2RlLT5hbXBfaW5fY2FwcykKKwkJCW5vZGUtPmFtcF9pbl9jYXBzID0gc3BlYy0+ZGVmX2FtcF9pbl9jYXBzOworCX0KKwlsaXN0X2FkZF90YWlsKCZub2RlLT5saXN0LCAmc3BlYy0+bmlkX2xpc3QpOworCXJldHVybiAwOworfQorCisvKgorICogYnVpbGQgdGhlIEFGRyBzdWJ0cmVlCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfYWZnX3RyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpLCBub2RlcywgZXJyOworCWhkYV9uaWRfdCBuaWQ7CisKKwlzbmRfYXNzZXJ0KHNwZWMsIHJldHVybiAtRUlOVkFMKTsKKworCXNwZWMtPmRlZl9hbXBfb3V0X2NhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIEFDX1BBUl9BTVBfT1VUX0NBUCk7CisJc3BlYy0+ZGVmX2FtcF9pbl9jYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfQU1QX0lOX0NBUCk7CisKKwlub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgY29kZWMtPmFmZywgJm5pZCk7CisJaWYgKCEgbmlkIHx8IG5vZGVzIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgQUZHIHN1YnRyZWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBwYXJzZSBhbGwgbm9kZXMgYmVsb25naW5nIHRvIHRoZSBBRkcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKywgbmlkKyspIHsKKwkJaWYgKChlcnIgPSBhZGRfbmV3X25vZGUoY29kZWMsIHNwZWMsIG5pZCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGxvb2sgZm9yIHRoZSBub2RlIHJlY29yZCBmb3IgdGhlIGdpdmVuIE5JRAorICovCisvKiBGSVhNRTogc2hvdWxkIGF2b2lkIHRoZSBicmFpbmRlYWQgbGluZWFyIHNlYXJjaCAqLworc3RhdGljIHN0cnVjdCBoZGFfZ25vZGUgKmhkYV9nZXRfbm9kZShzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjLCBoZGFfbmlkX3QgbmlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhkYV9nbm9kZSAqbm9kZTsKKworCWxpc3RfZm9yX2VhY2gocCwgJnNwZWMtPm5pZF9saXN0KSB7CisJCW5vZGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfZ25vZGUsIGxpc3QpOworCQlpZiAobm9kZS0+bmlkID09IG5pZCkKKwkJCXJldHVybiBub2RlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHVubXV0ZSAoYW5kIHNldCBtYXggdm9sKSB0aGUgb3V0cHV0IGFtcGxpZmllcgorICovCitzdGF0aWMgaW50IHVubXV0ZV9vdXRwdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfZ25vZGUgKm5vZGUpCit7CisJdW5zaWduZWQgaW50IHZhbCwgb2ZzOworCXNuZF9wcmludGRkKCJVTk1VVEUgT1VUOiBOSUQ9MHgleFxuIiwgbm9kZS0+bmlkKTsKKwl2YWwgPSAobm9kZS0+YW1wX291dF9jYXBzICYgQUNfQU1QQ0FQX05VTV9TVEVQUykgPj4gQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVDsKKwlvZnMgPSAobm9kZS0+YW1wX291dF9jYXBzICYgQUNfQU1QQ0FQX09GRlNFVCkgPj4gQUNfQU1QQ0FQX09GRlNFVF9TSElGVDsKKwlpZiAodmFsID49IG9mcykKKwkJdmFsIC09IG9mczsKKwl2YWwgfD0gQUNfQU1QX1NFVF9MRUZUIHwgQUNfQU1QX1NFVF9SSUdIVDsKKwl2YWwgfD0gQUNfQU1QX1NFVF9PVVRQVVQ7CisJcmV0dXJuIHNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5vZGUtPm5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKK30KKworLyoKKyAqIHVubXV0ZSAoYW5kIHNldCBtYXggdm9sKSB0aGUgaW5wdXQgYW1wbGlmaWVyCisgKi8KK3N0YXRpYyBpbnQgdW5tdXRlX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2dub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHZhbCwgb2ZzOworCXNuZF9wcmludGRkKCJVTk1VVEUgSU46IE5JRD0weCV4IElEWD0weCV4XG4iLCBub2RlLT5uaWQsIGluZGV4KTsKKwl2YWwgPSAobm9kZS0+YW1wX2luX2NhcHMgJiBBQ19BTVBDQVBfTlVNX1NURVBTKSA+PiBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUOworCW9mcyA9IChub2RlLT5hbXBfaW5fY2FwcyAmIEFDX0FNUENBUF9PRkZTRVQpID4+IEFDX0FNUENBUF9PRkZTRVRfU0hJRlQ7CisJaWYgKHZhbCA+PSBvZnMpCisJCXZhbCAtPSBvZnM7CisJdmFsIHw9IEFDX0FNUF9TRVRfTEVGVCB8IEFDX0FNUF9TRVRfUklHSFQ7CisJdmFsIHw9IEFDX0FNUF9TRVRfSU5QVVQ7CisJLy8gYXdrIGFkZGVkIC0gZml4ZWQgdG8gYWxsb3cgdW5tdXRpbmcgb2YgaW5kZXhlZCBhbXBzCisJdmFsIHw9IGluZGV4IDw8IEFDX0FNUF9TRVRfSU5ERVhfU0hJRlQ7CisJcmV0dXJuIHNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5vZGUtPm5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKK30KKworLyoKKyAqIHNlbGVjdCB0aGUgaW5wdXQgY29ubmVjdGlvbiBvZiB0aGUgZ2l2ZW4gbm9kZS4KKyAqLworc3RhdGljIGludCBzZWxlY3RfaW5wdXRfY29ubmVjdGlvbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9nbm9kZSAqbm9kZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc25kX3ByaW50ZGQoIkNPTk5FQ1Q6IE5JRD0weCV4IElEWD0weCV4XG4iLCBub2RlLT5uaWQsIGluZGV4KTsKKwlyZXR1cm4gc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbm9kZS0+bmlkLCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgaW5kZXgpOworfQorCisvKgorICogY2xlYXIgY2hlY2tlZCBmbGFnIG9mIGVhY2ggbm9kZSBpbiB0aGUgbm9kZSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX2NoZWNrX2ZsYWdzKHN0cnVjdCBoZGFfZ3NwZWMgKnNwZWMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGRhX2dub2RlICpub2RlOworCisJbGlzdF9mb3JfZWFjaChwLCAmc3BlYy0+bmlkX2xpc3QpIHsKKwkJbm9kZSA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9nbm9kZSwgbGlzdCk7CisJCW5vZGUtPmNoZWNrZWQgPSAwOworCX0KK30KKworLyoKKyAqIHBhcnNlIHRoZSBvdXRwdXQgcGF0aCByZWN1cnNpdmVseSB1bnRpbCByZWFjaCB0byBhbiBhdWRpbyBvdXRwdXQgd2lkZ2V0CisgKgorICogcmV0dXJucyAwIGlmIG5vdCBmb3VuZCwgMSBpZiBmb3VuZCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHBhcnNlX291dHB1dF9wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjLAorCQkJICAgICBzdHJ1Y3QgaGRhX2dub2RlICpub2RlKQoreworCWludCBpLCBlcnI7CisJc3RydWN0IGhkYV9nbm9kZSAqY2hpbGQ7CisKKwlpZiAobm9kZS0+Y2hlY2tlZCkKKwkJcmV0dXJuIDA7CisKKwlub2RlLT5jaGVja2VkID0gMTsKKwlpZiAobm9kZS0+dHlwZSA9PSBBQ19XSURfQVVEX09VVCkgeworCQlpZiAobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX0RJR0lUQUwpIHsKKwkJCXNuZF9wcmludGRkKCJTa2lwIERpZ2l0YWwgT1VUIG5vZGUgJXhcbiIsIG5vZGUtPm5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzbmRfcHJpbnRkZCgiQVVEX09VVCBmb3VuZCAleFxuIiwgbm9kZS0+bmlkKTsKKwkJaWYgKHNwZWMtPmRhY19ub2RlKSB7CisJCQkvKiBhbHJlYWR5IERBQyBub2RlIGlzIGFzc2lnbmVkLCBqdXN0IHVubXV0ZSAmIGNvbm5lY3QgKi8KKwkJCXJldHVybiBub2RlID09IHNwZWMtPmRhY19ub2RlOworCQl9CisJCXNwZWMtPmRhY19ub2RlID0gbm9kZTsKKwkJaWYgKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9PVVRfQU1QKSB7CisJCQlzcGVjLT5wY21fdm9sX25vZGUgPSBub2RlOworCQkJc3BlYy0+cGNtX3ZvbF9pbmRleCA9IDA7CisJCX0KKwkJcmV0dXJuIDE7IC8qIGZvdW5kICovCisJfQorCisJZm9yIChpID0gMDsgaSA8IG5vZGUtPm5jb25uczsgaSsrKSB7CisJCWNoaWxkID0gaGRhX2dldF9ub2RlKHNwZWMsIG5vZGUtPmNvbm5fbGlzdFtpXSk7CisJCWlmICghIGNoaWxkKQorCQkJY29udGludWU7CisJCWVyciA9IHBhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBzcGVjLCBjaGlsZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZWxzZSBpZiAoZXJyID4gMCkgeworCQkJLyogZm91bmQgb25lLAorCQkJICogc2VsZWN0IHRoZSBwYXRoLCB1bm11dGUgYm90aCBpbnB1dCBhbmQgb3V0cHV0CisJCQkgKi8KKwkJCWlmIChub2RlLT5uY29ubnMgPiAxKQorCQkJCXNlbGVjdF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBub2RlLCBpKTsKKwkJCXVubXV0ZV9pbnB1dChjb2RlYywgbm9kZSwgaSk7CisJCQl1bm11dGVfb3V0cHV0KGNvZGVjLCBub2RlKTsKKwkJCWlmICghIHNwZWMtPnBjbV92b2xfbm9kZSkgeworCQkJCWlmIChub2RlLT53aWRfY2FwcyAmIEFDX1dDQVBfSU5fQU1QKSB7CisJCQkJCXNwZWMtPnBjbV92b2xfbm9kZSA9IG5vZGU7CisJCQkJCXNwZWMtPnBjbV92b2xfaW5kZXggPSBpOworCQkJCX0gZWxzZSBpZiAobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX09VVF9BTVApIHsKKwkJCQkJc3BlYy0+cGNtX3ZvbF9ub2RlID0gbm9kZTsKKwkJCQkJc3BlYy0+cGNtX3ZvbF9pbmRleCA9IDA7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb29rIGZvciB0aGUgb3V0cHV0IFBJTiB3aWRnZXQgd2l0aCB0aGUgZ2l2ZW4gamFjayB0eXBlCisgKiBhbmQgcGFyc2UgdGhlIG91dHB1dCBwYXRoIHRvIHRoYXQgUElOLgorICoKKyAqIFJldHVybnMgdGhlIFBJTiBub2RlIHdoZW4gdGhlIHBhdGggdG8gREFDIGlzIGVzdGFibGlzaGVkLgorICovCitzdGF0aWMgc3RydWN0IGhkYV9nbm9kZSAqcGFyc2Vfb3V0cHV0X2phY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIHN0cnVjdCBoZGFfZ3NwZWMgKnNwZWMsCisJCQkJCSAgIGludCBqYWNrX3R5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGRhX2dub2RlICpub2RlOworCWludCBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZzcGVjLT5uaWRfbGlzdCkgeworCQlub2RlID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2dub2RlLCBsaXN0KTsKKwkJaWYgKG5vZGUtPnR5cGUgIT0gQUNfV0lEX1BJTikKKwkJCWNvbnRpbnVlOworCQkvKiBvdXRwdXQgY2FwYWJsZT8gKi8KKwkJaWYgKCEgKG5vZGUtPnBpbl9jYXBzICYgQUNfUElOQ0FQX09VVCkpCisJCQljb250aW51ZTsKKwkJaWYgKGphY2tfdHlwZSA+PSAwKSB7CisJCQlpZiAoamFja190eXBlICE9IGdldF9kZWZjZmdfdHlwZShub2RlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChub2RlLT53aWRfY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkKKwkJCQljb250aW51ZTsgLyogc2tpcCBTUERJRiAqLworCQl9IGVsc2UgeworCQkJLyogb3V0cHV0IGFzIGRlZmF1bHQ/ICovCisJCQlpZiAoISAobm9kZS0+cGluX2N0bCAmIEFDX1BJTkNUTF9PVVRfRU4pKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWNsZWFyX2NoZWNrX2ZsYWdzKHNwZWMpOworCQllcnIgPSBwYXJzZV9vdXRwdXRfcGF0aChjb2RlYywgc3BlYywgbm9kZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWVsc2UgaWYgKGVyciA+IDApIHsKKwkJCS8qIHVubXV0ZSB0aGUgUElOIG91dHB1dCAqLworCQkJdW5tdXRlX291dHB1dChjb2RlYywgbm9kZSk7CisJCQkvKiBzZXQgUElOLU91dCBlbmFibGUgKi8KKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5vZGUtPm5pZCwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkJICAgIEFDX1BJTkNUTF9PVVRfRU4gfCBBQ19QSU5DVExfSFBfRU4pOworCQkJcmV0dXJuIG5vZGU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIHBhcnNlIG91dHB1dHMKKyAqLworc3RhdGljIGludCBwYXJzZV9vdXRwdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfZ25vZGUgKm5vZGU7CisKKwkvKgorCSAqIExvb2sgZm9yIHRoZSBvdXRwdXQgUElOIHdpZGdldAorCSAqLworCS8qIGZpcnN0LCBsb29rIGZvciB0aGUgbGluZS1vdXQgcGluICovCisJbm9kZSA9IHBhcnNlX291dHB1dF9qYWNrKGNvZGVjLCBzcGVjLCBBQ19KQUNLX0xJTkVfT1VUKTsKKwlpZiAobm9kZSkgLyogZm91bmQsIHJlbWVtYmVyIHRoZSBQSU4gbm9kZSAqLworCQlzcGVjLT5vdXRfcGluX25vZGUgPSBub2RlOworCS8qIGxvb2sgZm9yIHRoZSBIUC1vdXQgcGluICovCisJbm9kZSA9IHBhcnNlX291dHB1dF9qYWNrKGNvZGVjLCBzcGVjLCBBQ19KQUNLX0hQX09VVCk7CisJaWYgKG5vZGUpIHsKKwkJaWYgKCEgc3BlYy0+b3V0X3Bpbl9ub2RlKQorCQkJc3BlYy0+b3V0X3Bpbl9ub2RlID0gbm9kZTsKKwl9CisKKwlpZiAoISBzcGVjLT5vdXRfcGluX25vZGUpIHsKKwkJLyogbm8gbGluZS1vdXQgb3IgSFAgcGlucyBmb3VuZCwKKwkJICogdGhlbiBjaG9vc2UgZm9yIHRoZSBmaXJzdCBvdXRwdXQgcGluCisJCSAqLworCQlzcGVjLT5vdXRfcGluX25vZGUgPSBwYXJzZV9vdXRwdXRfamFjayhjb2RlYywgc3BlYywgLTEpOworCQlpZiAoISBzcGVjLT5vdXRfcGluX25vZGUpCisJCQlzbmRfcHJpbnRkKCJoZGFfZ2VuZXJpYzogbm8gcHJvcGVyIG91dHB1dCBwYXRoIGZvdW5kXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlucHV0IE1VWAorICovCisKKy8qIGNvbnRyb2wgY2FsbGJhY2tzICovCitzdGF0aWMgaW50IGNhcHR1cmVfc291cmNlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oJnNwZWMtPmlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IGNhcHR1cmVfc291cmNlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+Y3VyX2NhcF9zcmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FwdHVyZV9zb3VyY2VfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoZGFfZ3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCAmc3BlYy0+aW5wdXRfbXV4LCB1Y29udHJvbCwKKwkJCQkgICAgIHNwZWMtPmFkY19ub2RlLT5uaWQsICZzcGVjLT5jdXJfY2FwX3NyYyk7Cit9CisKKy8qCisgKiByZXR1cm4gdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBnaXZlbiBpbnB1dCBQSU4gd2lkZ2V0CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfaW5wdXRfdHlwZShzdHJ1Y3QgaGRhX2dub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgKnBpbmN0bCkKK3sKKwl1bnNpZ25lZCBpbnQgbG9jYXRpb24gPSBnZXRfZGVmY2ZnX2xvY2F0aW9uKG5vZGUpOworCXN3aXRjaCAoZ2V0X2RlZmNmZ190eXBlKG5vZGUpKSB7CisJY2FzZSBBQ19KQUNLX0xJTkVfSU46CisJCWlmICgobG9jYXRpb24gJiAweDBmKSA9PSBBQ19KQUNLX0xPQ19GUk9OVCkKKwkJCXJldHVybiAiRnJvbnQgTGluZSI7CisJCXJldHVybiAiTGluZSI7CisJY2FzZSBBQ19KQUNLX0NEOgorCQlpZiAocGluY3RsKQorCQkJKnBpbmN0bCB8PSBBQ19QSU5fVlJFRl9HUkQ7CisJCXJldHVybiAiQ0QiOworCWNhc2UgQUNfSkFDS19BVVg6CisJCWlmICgobG9jYXRpb24gJiAweDBmKSA9PSBBQ19KQUNLX0xPQ19GUk9OVCkKKwkJCXJldHVybiAiRnJvbnQgQXV4IjsKKwkJcmV0dXJuICJBdXgiOworCWNhc2UgQUNfSkFDS19NSUNfSU46CisJCWlmICgobG9jYXRpb24gJiAweDBmKSA9PSBBQ19KQUNLX0xPQ19GUk9OVCkKKwkJCXJldHVybiAiRnJvbnQgTWljIjsKKwkJcmV0dXJuICJNaWMiOworCWNhc2UgQUNfSkFDS19TUERJRl9JTjoKKwkJcmV0dXJuICJTUERJRiI7CisJY2FzZSBBQ19KQUNLX0RJR19PVEhFUl9JTjoKKwkJcmV0dXJuICJEaWdpdGFsIjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBwYXJzZSB0aGUgbm9kZXMgcmVjdXJzaXZlbHkgdW50aWwgcmVhY2ggdG8gdGhlIGlucHV0IFBJTgorICoKKyAqIHJldHVybnMgMCBpZiBub3QgZm91bmQsIDEgaWYgZm91bmQsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBwYXJzZV9hZGNfc3ViX25vZGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjLAorCQkJICAgICAgIHN0cnVjdCBoZGFfZ25vZGUgKm5vZGUpCit7CisJaW50IGksIGVycjsKKwl1bnNpZ25lZCBpbnQgcGluY3RsOworCWNoYXIgKmxhYmVsOworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlpZiAobm9kZS0+Y2hlY2tlZCkKKwkJcmV0dXJuIDA7CisKKwlub2RlLT5jaGVja2VkID0gMTsKKwlpZiAobm9kZS0+dHlwZSAhPSBBQ19XSURfUElOKSB7CisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5uY29ubnM7IGkrKykgeworCQkJc3RydWN0IGhkYV9nbm9kZSAqY2hpbGQ7CisJCQljaGlsZCA9IGhkYV9nZXRfbm9kZShzcGVjLCBub2RlLT5jb25uX2xpc3RbaV0pOworCQkJaWYgKCEgY2hpbGQpCisJCQkJY29udGludWU7CisJCQllcnIgPSBwYXJzZV9hZGNfc3ViX25vZGVzKGNvZGVjLCBzcGVjLCBjaGlsZCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKGVyciA+IDApIHsKKwkJCQkvKiBmb3VuZCBvbmUsCisJCQkJICogc2VsZWN0IHRoZSBwYXRoLCB1bm11dGUgYm90aCBpbnB1dCBhbmQgb3V0cHV0CisJCQkJICovCisJCQkJaWYgKG5vZGUtPm5jb25ucyA+IDEpCisJCQkJCXNlbGVjdF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBub2RlLCBpKTsKKwkJCQl1bm11dGVfaW5wdXQoY29kZWMsIG5vZGUsIGkpOworCQkJCXVubXV0ZV9vdXRwdXQoY29kZWMsIG5vZGUpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogaW5wdXQgY2FwYWJsZT8gKi8KKwlpZiAoISAobm9kZS0+cGluX2NhcHMgJiBBQ19QSU5DQVBfSU4pKQorCQlyZXR1cm4gMDsKKworCWlmIChub2RlLT53aWRfY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkKKwkJcmV0dXJuIDA7IC8qIHNraXAgU1BESUYgKi8KKworCWlmIChzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zID49IEhEQV9NQVhfTlVNX0lOUFVUUykgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfZ2VuZXJpYzogVG9vIG1hbnkgaXRlbXMgZm9yIGNhcHR1cmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaW5jdGwgPSBBQ19QSU5DVExfSU5fRU47CisJLyogY3JlYXRlIGEgcHJvcGVyIGNhcHR1cmUgc291cmNlIGxhYmVsICovCisJdHlwZSA9IGdldF9pbnB1dF90eXBlKG5vZGUsICZwaW5jdGwpOworCWlmICghIHR5cGUpIHsKKwkJLyogaW5wdXQgYXMgZGVmYXVsdD8gKi8KKwkJaWYgKCEgKG5vZGUtPnBpbl9jdGwgJiBBQ19QSU5DVExfSU5fRU4pKQorCQkJcmV0dXJuIDA7CisJCXR5cGUgPSAiSW5wdXQiOworCX0KKwlsYWJlbCA9IHNwZWMtPmNhcF9sYWJlbHNbc3BlYy0+aW5wdXRfbXV4Lm51bV9pdGVtc107CisJc3RyY3B5KGxhYmVsLCB0eXBlKTsKKwlzcGVjLT5pbnB1dF9tdXguaXRlbXNbc3BlYy0+aW5wdXRfbXV4Lm51bV9pdGVtc10ubGFiZWwgPSBsYWJlbDsKKworCS8qIHVubXV0ZSB0aGUgUElOIGV4dGVybmFsIGlucHV0ICovCisJdW5tdXRlX2lucHV0KGNvZGVjLCBub2RlLCAwKTsgLyogaW5kZXggPSAwPyAqLworCS8qIHNldCBQSU4tSW4gZW5hYmxlICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbm9kZS0+bmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIHBpbmN0bCk7CisKKwlyZXR1cm4gMTsgLyogZm91bmQgKi8KK30KKworLyoKKyAqIHBhcnNlIGlucHV0CisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfaW5wdXRfcGF0aChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9nbm9kZSAqYWRjX25vZGUpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfZ25vZGUgKm5vZGU7CisJaW50IGksIGVycjsKKworCXNuZF9wcmludGRkKCJBVURfSU4gPSAleFxuIiwgYWRjX25vZGUtPm5pZCk7CisJY2xlYXJfY2hlY2tfZmxhZ3Moc3BlYyk7CisKKwkvLyBhd2sgYWRkZWQgLSBmaXhlZCBubyByZWNvcmRpbmcgZHVlIHRvIG11dGVkIHdpZGdldAorCXVubXV0ZV9pbnB1dChjb2RlYywgYWRjX25vZGUsIDApOworCQorCS8qCisJICogY2hlY2sgZWFjaCBjb25uZWN0aW9uIG9mIHRoZSBBREMKKwkgKiBpZiBpdCByZWFjaGVzIHRvIGEgcHJvcGVyIGlucHV0IFBJTiwgYWRkIHRoZSBwYXRoIGFzIHRoZQorCSAqIGlucHV0IHBhdGguCisJICovCisJZm9yIChpID0gMDsgaSA8IGFkY19ub2RlLT5uY29ubnM7IGkrKykgeworCQlub2RlID0gaGRhX2dldF9ub2RlKHNwZWMsIGFkY19ub2RlLT5jb25uX2xpc3RbaV0pOworCQlpZiAoISBub2RlKQorCQkJY29udGludWU7CisJCWVyciA9IHBhcnNlX2FkY19zdWJfbm9kZXMoY29kZWMsIHNwZWMsIG5vZGUpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UgaWYgKGVyciA+IDApIHsKKwkJCXN0cnVjdCBoZGFfaW5wdXRfbXV4X2l0ZW0gKmNzcmMgPSAmc3BlYy0+aW5wdXRfbXV4Lml0ZW1zW3NwZWMtPmlucHV0X211eC5udW1faXRlbXNdOworCQkJY2hhciAqYnVmID0gc3BlYy0+Y2FwX2xhYmVsc1tzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zXTsKKwkJCWludCBvY2FwOworCQkJZm9yIChvY2FwID0gMDsgb2NhcCA8IHNwZWMtPmlucHV0X211eC5udW1faXRlbXM7IG9jYXArKykgeworCQkJCWlmICghIHN0cmNtcChidWYsIHNwZWMtPmNhcF9sYWJlbHNbb2NhcF0pKSB7CisJCQkJCS8qIHNhbWUgbGFiZWwgYWxyZWFkeSBleGlzdHMsCisJCQkJCSAqIHB1dCB0aGUgaW5kZXggbnVtYmVyIHRvIGJlIHVuaXF1ZQorCQkJCQkgKi8KKwkJCQkJc3ByaW50ZihidWYsICIlcyAlZCIsIHNwZWMtPmNhcF9sYWJlbHNbb2NhcF0sCisJCQkJCQlzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zKTsKKwkJCQl9CisJCQl9CisJCQljc3JjLT5pbmRleCA9IGk7CisJCQlzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zKys7CisJCX0KKwl9CisKKwlpZiAoISBzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zKQorCQlyZXR1cm4gMDsgLyogbm8gaW5wdXQgcGF0aCBmb3VuZC4uLiAqLworCisJc25kX3ByaW50ZGQoIltDYXB0dXJlIFNvdXJjZV0gTklEPTB4JXgsICNTUkM9JWRcbiIsIGFkY19ub2RlLT5uaWQsIHNwZWMtPmlucHV0X211eC5udW1faXRlbXMpOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5pbnB1dF9tdXgubnVtX2l0ZW1zOyBpKyspCisJCXNuZF9wcmludGRkKCIgIFslc10gSURYPTB4JXhcbiIsIHNwZWMtPmlucHV0X211eC5pdGVtc1tpXS5sYWJlbCwKKwkJCSAgICBzcGVjLT5pbnB1dF9tdXguaXRlbXNbaV0uaW5kZXgpOworCisJc3BlYy0+YWRjX25vZGUgPSBhZGNfbm9kZTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHBhcnNlIGlucHV0CisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfaW5wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhkYV9nbm9kZSAqbm9kZTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBBdCBmaXJzdCB3ZSBsb29rIGZvciBhbiBhdWRpbyBpbnB1dCB3aWRnZXQuCisJICogSWYgaXQgcmVhY2hlcyB0byBjZXJ0YWluIGlucHV0IFBJTnMsIHdlIHRha2UgaXQgYXMgdGhlCisJICogaW5wdXQgcGF0aC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZzcGVjLT5uaWRfbGlzdCkgeworCQlub2RlID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2dub2RlLCBsaXN0KTsKKwkJaWYgKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9ESUdJVEFMKQorCQkJY29udGludWU7IC8qIHNraXAgU1BESUYgKi8KKwkJaWYgKG5vZGUtPnR5cGUgPT0gQUNfV0lEX0FVRF9JTikgeworCQkJZXJyID0gcGFyc2VfaW5wdXRfcGF0aChjb2RlYywgbm9kZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZWxzZSBpZiAoZXJyID4gMCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzbmRfcHJpbnRkKCJoZGFfZ2VuZXJpYzogbm8gcHJvcGVyIGlucHV0IHBhdGggZm91bmRcbiIpOworCXJldHVybiAwOworfQorCisvKgorICogY3JlYXRlIG1peGVyIGNvbnRyb2xzIGlmIHBvc3NpYmxlCisgKi8KKyNkZWZpbmUgRElSX09VVAkJMHgxCisjZGVmaW5lIERJUl9JTgkJMHgyCisKK3N0YXRpYyBpbnQgY3JlYXRlX21peGVyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2dub2RlICpub2RlLAorCQkJdW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpkaXJfc2Z4KQoreworCWNoYXIgbmFtZVszMl07CisJaW50IGVycjsKKwlpbnQgY3JlYXRlZCA9IDA7CisJc25kX2tjb250cm9sX25ld190IGtuZXc7CisKKwlpZiAodHlwZSkKKwkJc3ByaW50ZihuYW1lLCAiJXMgJXMgU3dpdGNoIiwgdHlwZSwgZGlyX3NmeCk7CisJZWxzZQorCQlzcHJpbnRmKG5hbWUsICIlcyBTd2l0Y2giLCBkaXJfc2Z4KTsKKwlpZiAoKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9JTl9BTVApICYmCisJICAgIChub2RlLT5hbXBfaW5fY2FwcyAmIEFDX0FNUENBUF9NVVRFKSkgeworCQlrbmV3ID0gKHNuZF9rY29udHJvbF9uZXdfdClIREFfQ09ERUNfTVVURShuYW1lLCBub2RlLT5uaWQsIGluZGV4LCBIREFfSU5QVVQpOworCQlzbmRfcHJpbnRkZCgiWyVzXSBOSUQ9MHgleCwgRElSPUlOLCBJRFg9MHgleFxuIiwgbmFtZSwgbm9kZS0+bmlkLCBpbmRleCk7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBjb2RlYykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQljcmVhdGVkID0gMTsKKwl9IGVsc2UgaWYgKChub2RlLT53aWRfY2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgJiYKKwkJICAgKG5vZGUtPmFtcF9vdXRfY2FwcyAmIEFDX0FNUENBUF9NVVRFKSkgeworCQlrbmV3ID0gKHNuZF9rY29udHJvbF9uZXdfdClIREFfQ09ERUNfTVVURShuYW1lLCBub2RlLT5uaWQsIDAsIEhEQV9PVVRQVVQpOworCQlzbmRfcHJpbnRkZCgiWyVzXSBOSUQ9MHgleCwgRElSPU9VVFxuIiwgbmFtZSwgbm9kZS0+bmlkKTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBzbmRfY3RsX25ldzEoJmtuZXcsIGNvZGVjKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWNyZWF0ZWQgPSAxOworCX0KKworCWlmICh0eXBlKQorCQlzcHJpbnRmKG5hbWUsICIlcyAlcyBWb2x1bWUiLCB0eXBlLCBkaXJfc2Z4KTsKKwllbHNlCisJCXNwcmludGYobmFtZSwgIiVzIFZvbHVtZSIsIGRpcl9zZngpOworCWlmICgobm9kZS0+d2lkX2NhcHMgJiBBQ19XQ0FQX0lOX0FNUCkgJiYKKwkgICAgKG5vZGUtPmFtcF9pbl9jYXBzICYgQUNfQU1QQ0FQX05VTV9TVEVQUykpIHsKKwkJa25ldyA9IChzbmRfa2NvbnRyb2xfbmV3X3QpSERBX0NPREVDX1ZPTFVNRShuYW1lLCBub2RlLT5uaWQsIGluZGV4LCBIREFfSU5QVVQpOworCQlzbmRfcHJpbnRkZCgiWyVzXSBOSUQ9MHgleCwgRElSPUlOLCBJRFg9MHgleFxuIiwgbmFtZSwgbm9kZS0+bmlkLCBpbmRleCk7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBjb2RlYykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQljcmVhdGVkID0gMTsKKwl9IGVsc2UgaWYgKChub2RlLT53aWRfY2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgJiYKKwkJICAgKG5vZGUtPmFtcF9vdXRfY2FwcyAmIEFDX0FNUENBUF9OVU1fU1RFUFMpKSB7CisJCWtuZXcgPSAoc25kX2tjb250cm9sX25ld190KUhEQV9DT0RFQ19WT0xVTUUobmFtZSwgbm9kZS0+bmlkLCAwLCBIREFfT1VUUFVUKTsKKwkJc25kX3ByaW50ZGQoIlslc10gTklEPTB4JXgsIERJUj1PVVRcbiIsIG5hbWUsIG5vZGUtPm5pZCk7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBjb2RlYykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQljcmVhdGVkID0gMTsKKwl9CisKKwlyZXR1cm4gY3JlYXRlZDsKK30KKworLyoKKyAqIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xzIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRpcmVjdGlvbiBzdWZmaXggYWxyZWFkeSBleGlzdAorICovCitzdGF0aWMgaW50IGNoZWNrX2V4aXN0aW5nX2NvbnRyb2woc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmRpcikKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCBpZDsKKwltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwlzcHJpbnRmKGlkLm5hbWUsICIlcyAlcyBWb2x1bWUiLCB0eXBlLCBkaXIpOworCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJaWYgKHNuZF9jdGxfZmluZF9pZChjb2RlYy0+YnVzLT5jYXJkLCAmaWQpKQorCQlyZXR1cm4gMTsKKwlzcHJpbnRmKGlkLm5hbWUsICIlcyAlcyBTd2l0Y2giLCB0eXBlLCBkaXIpOworCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJaWYgKHNuZF9jdGxfZmluZF9pZChjb2RlYy0+YnVzLT5jYXJkLCAmaWQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGJ1aWxkIG91dHB1dCBtaXhlciBjb250cm9scworICovCitzdGF0aWMgaW50IGJ1aWxkX291dHB1dF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVycjsKKworCWVyciA9IGNyZWF0ZV9taXhlcihjb2RlYywgc3BlYy0+cGNtX3ZvbF9ub2RlLCBzcGVjLT5wY21fdm9sX2luZGV4LAorCQkJICAgIlBDTSIsICJQbGF5YmFjayIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgY2FwdHVyZSB2b2x1bWUvc3dpdGNoICovCitzdGF0aWMgaW50IGJ1aWxkX2lucHV0X2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZGFfZ3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX2dub2RlICphZGNfbm9kZSA9IHNwZWMtPmFkY19ub2RlOworCWludCBlcnI7CisKKwlpZiAoISBhZGNfbm9kZSkKKwkJcmV0dXJuIDA7IC8qIG5vdCBmb3VuZCAqLworCisJLyogY3JlYXRlIGNhcHR1cmUgdm9sdW1lIGFuZCBzd2l0Y2ggY29udHJvbHMgaWYgdGhlIEFEQyBoYXMgYW4gYW1wICovCisJZXJyID0gY3JlYXRlX21peGVyKGNvZGVjLCBhZGNfbm9kZSwgMCwgTlVMTCwgIkNhcHR1cmUiKTsKKworCS8qIGNyZWF0ZSBpbnB1dCBNVVggaWYgbXVsdGlwbGUgc291cmNlcyBhcmUgYXZhaWxhYmxlICovCisJaWYgKHNwZWMtPmlucHV0X211eC5udW1faXRlbXMgPiAxKSB7CisJCXN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgY2FwX3NlbCA9IHsKKwkJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkJLmluZm8gPSBjYXB0dXJlX3NvdXJjZV9pbmZvLAorCQkJLmdldCA9IGNhcHR1cmVfc291cmNlX2dldCwKKwkJCS5wdXQgPSBjYXB0dXJlX3NvdXJjZV9wdXQsCisJCX07CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwgc25kX2N0bF9uZXcxKCZjYXBfc2VsLCBjb2RlYykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzcGVjLT5jdXJfY2FwX3NyYyA9IDA7CisJCXNlbGVjdF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBhZGNfbm9kZSwgc3BlYy0+aW5wdXRfbXV4Lml0ZW1zWzBdLmluZGV4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHBhcnNlIHRoZSBub2RlcyByZWN1cnNpdmVseSB1bnRpbCByZWFjaCB0byB0aGUgb3V0cHV0IFBJTi4KKyAqCisgKiByZXR1cm5zIDAgLSBpZiBub3QgZm91bmQsCisgKiAgICAgICAgIDEgLSBpZiBmb3VuZCwgYnV0IG5vIG1peGVyIGlzIGNyZWF0ZWQKKyAqICAgICAgICAgMiAtIGlmIGZvdW5kIGFuZCBtaXhlciB3YXMgYWxyZWFkeSBjcmVhdGVkLCAoanVzdCBza2lwKQorICogICAgICAgICBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBwYXJzZV9sb29wYmFja19wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjLAorCQkJICAgICAgIHN0cnVjdCBoZGFfZ25vZGUgKm5vZGUsIHN0cnVjdCBoZGFfZ25vZGUgKmRlc3Rfbm9kZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpLCBlcnI7CisKKwlpZiAobm9kZS0+Y2hlY2tlZCkKKwkJcmV0dXJuIDA7CisKKwlub2RlLT5jaGVja2VkID0gMTsKKwlpZiAobm9kZSA9PSBkZXN0X25vZGUpIHsKKwkJLyogbG9vcGJhY2sgY29ubmVjdGlvbiBmb3VuZCAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bmNvbm5zOyBpKyspIHsKKwkJc3RydWN0IGhkYV9nbm9kZSAqY2hpbGQgPSBoZGFfZ2V0X25vZGUoc3BlYywgbm9kZS0+Y29ubl9saXN0W2ldKTsKKwkJaWYgKCEgY2hpbGQpCisJCQljb250aW51ZTsKKwkJZXJyID0gcGFyc2VfbG9vcGJhY2tfcGF0aChjb2RlYywgc3BlYywgY2hpbGQsIGRlc3Rfbm9kZSwgdHlwZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZWxzZSBpZiAoZXJyID49IDEpIHsKKwkJCWlmIChlcnIgPT0gMSkgeworCQkJCWVyciA9IGNyZWF0ZV9taXhlcihjb2RlYywgbm9kZSwgaSwgdHlwZSwgIlBsYXliYWNrIik7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQkJaWYgKGVyciA+IDApCisJCQkJCXJldHVybiAyOyAvKiBvaywgY3JlYXRlZCAqLworCQkJCS8qIG5vdCBjcmVhdGVkLCBtYXliZSBpbiB0aGUgbG93ZXIgcGF0aCAqLworCQkJCWVyciA9IDE7CisJCQl9CisJCQkvKiBjb25uZWN0IGFuZCB1bm11dGUgKi8KKwkJCWlmIChub2RlLT5uY29ubnMgPiAxKQorCQkJCXNlbGVjdF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBub2RlLCBpKTsKKwkJCXVubXV0ZV9pbnB1dChjb2RlYywgbm9kZSwgaSk7CisJCQl1bm11dGVfb3V0cHV0KGNvZGVjLCBub2RlKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXJzZSB0aGUgdHJlZSBhbmQgYnVpbGQgdGhlIGxvb3BiYWNrIGNvbnRyb2xzCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfbG9vcGJhY2tfY29udHJvbHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkYV9nc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhkYV9nbm9kZSAqbm9kZTsKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlpZiAoISBzcGVjLT5vdXRfcGluX25vZGUpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaChwLCAmc3BlYy0+bmlkX2xpc3QpIHsKKwkJbm9kZSA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9nbm9kZSwgbGlzdCk7CisJCWlmIChub2RlLT50eXBlICE9IEFDX1dJRF9QSU4pCisJCQljb250aW51ZTsKKwkJLyogaW5wdXQgY2FwYWJsZT8gKi8KKwkJaWYgKCEgKG5vZGUtPnBpbl9jYXBzICYgQUNfUElOQ0FQX0lOKSkKKwkJCXJldHVybiAwOworCQl0eXBlID0gZ2V0X2lucHV0X3R5cGUobm9kZSwgTlVMTCk7CisJCWlmICh0eXBlKSB7CisJCQlpZiAoY2hlY2tfZXhpc3RpbmdfY29udHJvbChjb2RlYywgdHlwZSwgIlBsYXliYWNrIikpCisJCQkJY29udGludWU7CisJCQljbGVhcl9jaGVja19mbGFncyhzcGVjKTsKKwkJCWVyciA9IHBhcnNlX2xvb3BiYWNrX3BhdGgoY29kZWMsIHNwZWMsIHNwZWMtPm91dF9waW5fbm9kZSwKKwkJCQkJCSAgbm9kZSwgdHlwZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKCEgZXJyKQorCQkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogYnVpbGQgbWl4ZXIgY29udHJvbHMKKyAqLworc3RhdGljIGludCBidWlsZF9nZW5lcmljX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGJ1aWxkX2lucHV0X2NvbnRyb2xzKGNvZGVjKSkgPCAwIHx8CisJICAgIChlcnIgPSBidWlsZF9vdXRwdXRfY29udHJvbHMoY29kZWMpKSA8IDAgfHwKKwkgICAgKGVyciA9IGJ1aWxkX2xvb3BiYWNrX2NvbnRyb2xzKGNvZGVjKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQQ00KKyAqLworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBnZW5lcmljX3BjbV9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCit9OworCitzdGF0aWMgaW50IGJ1aWxkX2dlbmVyaWNfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSAmc3BlYy0+cGNtX3JlYzsKKworCWlmICghIHNwZWMtPmRhY19ub2RlICYmICEgc3BlYy0+YWRjX25vZGUpIHsKKwkJc25kX3ByaW50ZCgiaGRhX2dlbmVyaWM6IG5vIFBDTSBmb3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWNvZGVjLT5udW1fcGNtcyA9IDE7CisJY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKKworCWluZm8tPm5hbWUgPSAiSERBIEdlbmVyaWMiOworCWlmIChzcGVjLT5kYWNfbm9kZSkgeworCQlpbmZvLT5zdHJlYW1bMF0gPSBnZW5lcmljX3BjbV9wbGF5YmFjazsKKwkJaW5mby0+c3RyZWFtWzBdLm5pZCA9IHNwZWMtPmRhY19ub2RlLT5uaWQ7CisJfQorCWlmIChzcGVjLT5hZGNfbm9kZSkgeworCQlpbmZvLT5zdHJlYW1bMV0gPSBnZW5lcmljX3BjbV9wbGF5YmFjazsKKwkJaW5mby0+c3RyZWFtWzFdLm5pZCA9IHNwZWMtPmFkY19ub2RlLT5uaWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIGdlbmVyaWNfcGF0Y2hfb3BzID0geworCS5idWlsZF9jb250cm9scyA9IGJ1aWxkX2dlbmVyaWNfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBidWlsZF9nZW5lcmljX3BjbXMsCisJLmZyZWUgPSBzbmRfaGRhX2dlbmVyaWNfZnJlZSwKK307CisKKy8qCisgKiB0aGUgZ2VuZXJpYyBwYXJzZXIKKyAqLworaW50IHNuZF9oZGFfcGFyc2VfZ2VuZXJpY19jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgaGRhX2dzcGVjICpzcGVjOworCWludCBlcnI7CisKKwlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGRhX2dlbmVyaWM6IGNhbid0IGFsbG9jYXRlIHNwZWNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY29kZWMtPnNwZWMgPSBzcGVjOworCUlOSVRfTElTVF9IRUFEKCZzcGVjLT5uaWRfbGlzdCk7CisKKwlpZiAoKGVyciA9IGJ1aWxkX2FmZ190cmVlKGNvZGVjKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKChlcnIgPSBwYXJzZV9pbnB1dChjb2RlYykpIDwgMCB8fAorCSAgICAoZXJyID0gcGFyc2Vfb3V0cHV0KGNvZGVjKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJY29kZWMtPnBhdGNoX29wcyA9IGdlbmVyaWNfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlzbmRfaGRhX2dlbmVyaWNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTY0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC0wLDAgKzEsMTQ0OSBAQAorLyoKKyAqCisgKiAgaGRhX2ludGVsLmMgLSBJbXBsZW1lbnRhdGlvbiBvZiBwcmltYXJ5IGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSW50ZWwgSEQgQXVkaW8uCisgKgorICogIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogICAgICAgICAgICAgICAgICAgICBQZWlTZW4gSG91IDxwc2hvdUByZWFsdGVrLmNvbS50dz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWF0dCBKYXJlZAkJbWF0dC5qYXJlZEBpbnRlbC5jb20KKyAqICBBbmR5IEtvcHAJCWFuZHkua29wcEBpbnRlbC5jb20KKyAqICBEYW4gS29nYW4JCWRhbi5kLmtvZ2FuQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDA0LjEyLjAxCU1ham9yIHJld3JpdGUgYnkgdGl3YWksIG1lcmdlZCB0aGUgd29yayBvZiBwc2hvdQorICogCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsKK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsKK3N0YXRpYyBjaGFyICptb2RlbFtTTkRSVl9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgSW50ZWwgSEQgYXVkaW8gaW50ZXJmYWNlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBJbnRlbCBIRCBhdWRpbyBpbnRlcmZhY2UuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEludGVsIEhEIGF1ZGlvIGludGVyZmFjZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShtb2RlbCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtb2RlbCwgIlVzZSB0aGUgZ2l2ZW4gYm9hcmQgbW9kZWwuIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0ludGVsLCBJQ0g2fSwiCisJCQkgIntJbnRlbCwgSUNINk19LCIKKwkJCSAie0ludGVsLCBJQ0g3fX0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgSERBIGRyaXZlciIpOworCisjZGVmaW5lIFNGWAkiaGRhLWludGVsOiAiCisKKy8qCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBJQ0g2X1JFR19HQ0FQCQkJMHgwMAorI2RlZmluZSBJQ0g2X1JFR19WTUlOCQkJMHgwMgorI2RlZmluZSBJQ0g2X1JFR19WTUFKCQkJMHgwMworI2RlZmluZSBJQ0g2X1JFR19PVVRQQVkJCQkweDA0CisjZGVmaW5lIElDSDZfUkVHX0lOUEFZCQkJMHgwNgorI2RlZmluZSBJQ0g2X1JFR19HQ1RMCQkJMHgwOAorI2RlZmluZSBJQ0g2X1JFR19XQUtFRU4JCQkweDBjCisjZGVmaW5lIElDSDZfUkVHX1NUQVRFU1RTCQkweDBlCisjZGVmaW5lIElDSDZfUkVHX0dTVFMJCQkweDEwCisjZGVmaW5lIElDSDZfUkVHX0lOVENUTAkJCTB4MjAKKyNkZWZpbmUgSUNINl9SRUdfSU5UU1RTCQkJMHgyNAorI2RlZmluZSBJQ0g2X1JFR19XQUxDTEsJCQkweDMwCisjZGVmaW5lIElDSDZfUkVHX1NZTkMJCQkweDM0CQorI2RlZmluZSBJQ0g2X1JFR19DT1JCTEJBU0UJCTB4NDAKKyNkZWZpbmUgSUNINl9SRUdfQ09SQlVCQVNFCQkweDQ0CisjZGVmaW5lIElDSDZfUkVHX0NPUkJXUAkJCTB4NDgKKyNkZWZpbmUgSUNINl9SRUdfQ09SQlJQCQkJMHg0QQorI2RlZmluZSBJQ0g2X1JFR19DT1JCQ1RMCQkweDRjCisjZGVmaW5lIElDSDZfUkVHX0NPUkJTVFMJCTB4NGQKKyNkZWZpbmUgSUNINl9SRUdfQ09SQlNJWkUJCTB4NGUKKworI2RlZmluZSBJQ0g2X1JFR19SSVJCTEJBU0UJCTB4NTAKKyNkZWZpbmUgSUNINl9SRUdfUklSQlVCQVNFCQkweDU0CisjZGVmaW5lIElDSDZfUkVHX1JJUkJXUAkJCTB4NTgKKyNkZWZpbmUgSUNINl9SRUdfUklOVENOVAkJMHg1YQorI2RlZmluZSBJQ0g2X1JFR19SSVJCQ1RMCQkweDVjCisjZGVmaW5lIElDSDZfUkVHX1JJUkJTVFMJCTB4NWQKKyNkZWZpbmUgSUNINl9SRUdfUklSQlNJWkUJCTB4NWUKKworI2RlZmluZSBJQ0g2X1JFR19JQwkJCTB4NjAKKyNkZWZpbmUgSUNINl9SRUdfSVIJCQkweDY0CisjZGVmaW5lIElDSDZfUkVHX0lSUwkJCTB4NjgKKyNkZWZpbmUgICBJQ0g2X0lSU19WQUxJRAkoMTw8MSkKKyNkZWZpbmUgICBJQ0g2X0lSU19CVVNZCQkoMTw8MCkKKworI2RlZmluZSBJQ0g2X1JFR19EUExCQVNFCQkweDcwCisjZGVmaW5lIElDSDZfUkVHX0RQVUJBU0UJCTB4NzQKKyNkZWZpbmUgICBJQ0g2X0RQTEJBU0VfRU5BQkxFCTB4MQkvKiBFbmFibGUgcG9zaXRpb24gYnVmZmVyICovCisKKy8qIFNEIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCitlbnVtIHsgU0RJMCwgU0RJMSwgU0RJMiwgU0RJMywgU0RPMCwgU0RPMSwgU0RPMiwgU0RPMyB9OworCisvKiBzdHJlYW0gcmVnaXN0ZXIgb2Zmc2V0cyBmcm9tIHN0cmVhbSBiYXNlICovCisjZGVmaW5lIElDSDZfUkVHX1NEX0NUTAkJCTB4MDAKKyNkZWZpbmUgSUNINl9SRUdfU0RfU1RTCQkJMHgwMworI2RlZmluZSBJQ0g2X1JFR19TRF9MUElCCQkweDA0CisjZGVmaW5lIElDSDZfUkVHX1NEX0NCTAkJCTB4MDgKKyNkZWZpbmUgSUNINl9SRUdfU0RfTFZJCQkJMHgwYworI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPVwkJMHgwZQorI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPU0laRQkJMHgxMAorI2RlZmluZSBJQ0g2X1JFR19TRF9GT1JNQVQJCTB4MTIKKyNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUEwJCTB4MTgKKyNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUFUJCTB4MWMKKworLyogUENJIHNwYWNlICovCisjZGVmaW5lIElDSDZfUENJUkVHX1RDU0VMCTB4NDQKKworLyoKKyAqIG90aGVyIGNvbnN0YW50cworICovCisKKy8qIG1heCBudW1iZXIgb2YgU0RzICovCisjZGVmaW5lIE1BWF9JQ0g2X0RFVgkJOAorLyogbWF4IG51bWJlciBvZiBmcmFnbWVudHMgLSB3ZSBtYXkgdXNlIG1vcmUgaWYgYWxsb2NhdGluZyBtb3JlIHBhZ2VzIGZvciBCREwgKi8KKyNkZWZpbmUgQVpYX01BWF9GUkFHCQkoUEFHRV9TSVpFIC8gKE1BWF9JQ0g2X0RFViAqIDE2KSkKKy8qIG1heCBidWZmZXIgc2l6ZSAtIG5vIGgvdyBsaW1pdCwgeW91IGNhbiBpbmNyZWFzZSBhcyB5b3UgbGlrZSAqLworI2RlZmluZSBBWlhfTUFYX0JVRl9TSVpFCSgxMDI0KjEwMjQqMTAyNCkKKy8qIG1heCBudW1iZXIgb2YgUENNIGRldmljcyBwZXIgY2FyZCAqLworI2RlZmluZSBBWlhfTUFYX1BDTVMJCTgKKworLyogUklSQiBpbnQgbWFzazogb3ZlcnJ1blsyXSwgcmVzcG9uc2VbMF0gKi8KKyNkZWZpbmUgUklSQl9JTlRfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBSSVJCX0lOVF9PVkVSUlVOCTB4MDQKKyNkZWZpbmUgUklSQl9JTlRfTUFTSwkJMHgwNQorCisvKiBTVEFURVNUUyBpbnQgbWFzazogU0QyLFNEMSxTRDAgKi8KKyNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJMHgwNworI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJMworCisvKiBTRF9DVEwgYml0cyAqLworI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLworI2RlZmluZSBTRF9DVExfRE1BX1NUQVJUCTB4MDIJLyogc3RyZWFtIERNQSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfTUFTSwkoMHhmIDw8IDIwKQorI2RlZmluZSBTRF9DVExfU1RSRUFNX1RBR19TSElGVAkyMAorCisvKiBTRF9DVEwgYW5kIFNEX1NUUyAqLworI2RlZmluZSBTRF9JTlRfREVTQ19FUlIJCTB4MTAJLyogZGVzY3JpcHRvciBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0RfSU5UX0ZJRk9fRVJSCQkweDA4CS8qIEZJRk8gZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIFNEX0lOVF9DT01QTEVURQkJMHgwNAkvKiBjb21wbGV0aW9uIGludGVycnVwdCAqLworI2RlZmluZSBTRF9JTlRfTUFTSwkJKFNEX0lOVF9ERVNDX0VSUnxTRF9JTlRfRklGT19FUlJ8U0RfSU5UX0NPTVBMRVRFKQorCisvKiBTRF9TVFMgKi8KKyNkZWZpbmUgU0RfU1RTX0ZJRk9fUkVBRFkJMHgyMAkvKiBGSUZPIHJlYWR5ICovCisKKy8qIElOVENUTCBhbmQgSU5UU1RTICovCisjZGVmaW5lIElDSDZfSU5UX0FMTF9TVFJFQU0JMHhmZgkJLyogYWxsIHN0cmVhbSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElDSDZfSU5UX0NUUkxfRU4JMHg0MDAwMDAwMAkvKiBjb250cm9sbGVyIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIElDSDZfSU5UX0dMT0JBTF9FTgkweDgwMDAwMDAwCS8qIGdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCisvKiBHQ1RMIHJlc2V0IGJpdCAqLworI2RlZmluZSBJQ0g2X0dDVExfUkVTRVQJCSgxPDwwKQorCisvKiBDT1JCL1JJUkIgY29udHJvbCwgcmVhZC93cml0ZSBwb2ludGVyICovCisjZGVmaW5lIElDSDZfUkJDVExfRE1BX0VOCTB4MDIJLyogZW5hYmxlIERNQSAqLworI2RlZmluZSBJQ0g2X1JCQ1RMX0lSUV9FTgkweDAxCS8qIGVuYWJsZSBJUlEgKi8KKyNkZWZpbmUgSUNINl9SQlJXUF9DTFIJCTB4ODAwMAkvKiByZWFkL3dyaXRlIHBvaW50ZXIgY2xlYXIgKi8KKy8qIGJlbG93IGFyZSBzbyBmYXIgaGFyZGNvZGVkIC0gc2hvdWxkIHJlYWQgcmVnaXN0ZXJzIGluIGZ1dHVyZSAqLworI2RlZmluZSBJQ0g2X01BWF9DT1JCX0VOVFJJRVMJMjU2CisjZGVmaW5lIElDSDZfTUFYX1JJUkJfRU5UUklFUwkyNTYKKworCisvKgorICogVXNlIENPUkIvUklSQiBmb3IgY29tbXVuaWNhdGlvbiBmcm9tL3RvIGNvZGVjcy4KKyAqIFRoaXMgaXMgdGhlIHdheSByZWNvbW1lbmRlZCBieSBJbnRlbCAoc2VlIGJlbG93KS4KKyAqLworI2RlZmluZSBVU0VfQ09SQl9SSVJCCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB1c2UgdGhlIHBvc2l0aW9uIGJ1ZmZlciBpbnN0ZWFkIG9mIHJlYWRpbmcgU0RfTFBJQgorICogSXQncyBub3QgdXNlZCBhcyBkZWZhdWx0IHNpbmNlIFNEX0xQSUIgc2VlbXMgdG8gZ2l2ZSBtb3JlIGFjY3VyYXRlIHBvc2l0aW9uCisgKi8KKy8qICNkZWZpbmUgVVNFX1BPU0JVRiAqLworCisvKgorICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9henggYXp4X3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfYXp4X3JiIGF6eF9yYl90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX2F6eF9kZXYgYXp4X2Rldl90OworCitzdHJ1Y3Qgc25kX2F6eF9kZXYgeworCXUzMiAqYmRsOwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgQkRMICovCisJZG1hX2FkZHJfdCBiZGxfYWRkcjsJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEJETCAqLworCXZvbGF0aWxlIHUzMiAqcG9zYnVmOwkJCS8qIHBvc2l0aW9uIGJ1ZmZlciBwb2ludGVyICovCisKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJCS8qIHNpemUgb2YgdGhlIHBsYXkgYnVmZmVyIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50IGZyYWdzaXplOwkJLyogc2l6ZSBvZiBlYWNoIHBlcmlvZCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBmcmFnczsJCS8qIG51bWJlciBmb3IgcGVyaW9kIGluIHRoZSBwbGF5IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CQkvKiBGSUZPIHNpemUgKi8KKworCXZvaWQgX19pb21lbSAqc2RfYWRkcjsJCS8qIHN0cmVhbSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKworCXUzMiBzZF9pbnRfc3RhX21hc2s7CQkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCisKKwkvKiBwY20gc3VwcG9ydCAqLworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsJLyogYXNzaWduZWQgc3Vic3RyZWFtLCBzZXQgaW4gUENNIG9wZW4gKi8KKwl1bnNpZ25lZCBpbnQgZm9ybWF0X3ZhbDsJLyogZm9ybWF0IHZhbHVlIHRvIGJlIHNldCBpbiB0aGUgY29udHJvbGxlciBhbmQgdGhlIGNvZGVjICovCisJdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KKwl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCisKKwl1bnNpZ25lZCBpbnQgb3BlbmVkOiAxOworCXVuc2lnbmVkIGludCBydW5uaW5nOiAxOworfTsKKworLyogQ09SQi9SSVJCICovCitzdHJ1Y3Qgc25kX2F6eF9yYiB7CisJdTMyICpidWY7CQkvKiBDT1JCL1JJUkIgYnVmZmVyCisJCQkJICogRWFjaCBDT1JCIGVudHJ5IGlzIDRieXRlLCBSSVJCIGlzIDhieXRlCisJCQkJICovCisJZG1hX2FkZHJfdCBhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIENPUkIvUklSQiBidWZmZXIgKi8KKwkvKiBmb3IgUklSQiAqLworCXVuc2lnbmVkIHNob3J0IHJwLCB3cDsJLyogcmVhZC93cml0ZSBwb2ludGVycyAqLworCWludCBjbWRzOwkJLyogbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwl1MzIgcmVzOwkJLyogbGFzdCByZWFkIHZhbHVlICovCit9OworCitzdHJ1Y3Qgc25kX2F6eCB7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCisJLyogcGNpIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKnJlbWFwX2FkZHI7CisJaW50IGlycTsKKworCS8qIGxvY2tzICovCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fbXV0ZXg7CisKKwkvKiBzdHJlYW1zICovCisJYXp4X2Rldl90IGF6eF9kZXZbTUFYX0lDSDZfREVWXTsKKworCS8qIFBDTSAqLworCXVuc2lnbmVkIGludCBwY21fZGV2czsKKwlzbmRfcGNtX3QgKnBjbVtBWlhfTUFYX1BDTVNdOworCisJLyogSEQgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjb2RlY19tYXNrOworCXN0cnVjdCBoZGFfYnVzICpidXM7CisKKwkvKiBDT1JCL1JJUkIgKi8KKwlhenhfcmJfdCBjb3JiOworCWF6eF9yYl90IHJpcmI7CisKKwkvKiBCREwsIENPUkIvUklSQiBhbmQgcG9zaXRpb24gYnVmZmVycyAqLworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBiZGw7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHJiOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBwb3NidWY7Cit9OworCisvKgorICogbWFjcm9zIGZvciBlYXN5IHVzZQorICovCisjZGVmaW5lIGF6eF93cml0ZWwoY2hpcCxyZWcsdmFsdWUpIFwKKwl3cml0ZWwodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQorI2RlZmluZSBhenhfcmVhZGwoY2hpcCxyZWcpIFwKKwlyZWFkbCgoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKKyNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLHJlZyx2YWx1ZSkgXAorCXdyaXRldyh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCisjZGVmaW5lIGF6eF9yZWFkdyhjaGlwLHJlZykgXAorCXJlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQorI2RlZmluZSBhenhfd3JpdGViKGNoaXAscmVnLHZhbHVlKSBcCisJd3JpdGViKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKKyNkZWZpbmUgYXp4X3JlYWRiKGNoaXAscmVnKSBcCisJcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCisKKyNkZWZpbmUgYXp4X3NkX3dyaXRlbChkZXYscmVnLHZhbHVlKSBcCisJd3JpdGVsKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQorI2RlZmluZSBhenhfc2RfcmVhZGwoZGV2LHJlZykgXAorCXJlYWRsKChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCisjZGVmaW5lIGF6eF9zZF93cml0ZXcoZGV2LHJlZyx2YWx1ZSkgXAorCXdyaXRldyh2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKKyNkZWZpbmUgYXp4X3NkX3JlYWR3KGRldixyZWcpIFwKKwlyZWFkdygoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQorI2RlZmluZSBhenhfc2Rfd3JpdGViKGRldixyZWcsdmFsdWUpIFwKKwl3cml0ZWIodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCisjZGVmaW5lIGF6eF9zZF9yZWFkYihkZXYscmVnKSBcCisJcmVhZGIoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKKworLyogZm9yIHBjbSBzdXBwb3J0ICovCisjZGVmaW5lIGdldF9henhfZGV2KHN1YnN0cmVhbSkgKGF6eF9kZXZfdCopKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKQorCisvKiBHZXQgdGhlIHVwcGVyIDMyYml0IG9mIHRoZSBnaXZlbiBkbWFfYWRkcl90CisgKiBDb21waWxlciBzaG91bGQgb3B0aW1pemUgYW5kIGVsaW1pbmF0ZSB0aGUgY29kZSBpZiBkbWFfYWRkcl90IGlzIDMyYml0CisgKi8KKyNkZWZpbmUgdXBwZXJfMzJiaXQoYWRkcikgKHNpemVvZihhZGRyKSA+IDQgPyAodTMyKSgoYWRkcikgPj4gMzIpIDogKHUzMikwKQorCisKKy8qCisgKiBJbnRlcmZhY2UgZm9yIEhEIGNvZGVjCisgKi8KKworI2lmZGVmIFVTRV9DT1JCX1JJUkIKKy8qCisgKiBDT1JCIC8gUklSQiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBhenhfYWxsb2NfY21kX2lvKGF6eF90ICpjaGlwKQoreworCWludCBlcnI7CisKKwkvKiBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgNDA5NiBieXRlcykgbXVzdCBzdWZmaWNlIGZvciBib3RoIHJpbmdidWZmZXMgKi8KKwllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCSAgUEFHRV9TSVpFLCAmY2hpcC0+cmIpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJjYW5ub3QgYWxsb2NhdGUgQ09SQi9SSVJCXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF6eF9pbml0X2NtZF9pbyhhenhfdCAqY2hpcCkKK3sKKwkvKiBDT1JCIHNldCB1cCAqLworCWNoaXAtPmNvcmIuYWRkciA9IGNoaXAtPnJiLmFkZHI7CisJY2hpcC0+Y29yYi5idWYgPSAodTMyICopY2hpcC0+cmIuYXJlYTsKKwlhenhfd3JpdGVsKGNoaXAsIENPUkJMQkFTRSwgKHUzMiljaGlwLT5jb3JiLmFkZHIpOworCWF6eF93cml0ZWwoY2hpcCwgQ09SQlVCQVNFLCB1cHBlcl8zMmJpdChjaGlwLT5jb3JiLmFkZHIpKTsKKworCS8qIHNldCB0aGUgY29yYiB3cml0ZSBwb2ludGVyIHRvIDAgKi8KKwlhenhfd3JpdGV3KGNoaXAsIENPUkJXUCwgMCk7CisJLyogcmVzZXQgdGhlIGNvcmIgaHcgcmVhZCBwb2ludGVyICovCisJYXp4X3dyaXRldyhjaGlwLCBDT1JCUlAsIElDSDZfUkJSV1BfQ0xSKTsKKwkvKiBlbmFibGUgY29yYiBkbWEgKi8KKwlhenhfd3JpdGViKGNoaXAsIENPUkJDVEwsIElDSDZfUkJDVExfRE1BX0VOKTsKKworCS8qIFJJUkIgc2V0IHVwICovCisJY2hpcC0+cmlyYi5hZGRyID0gY2hpcC0+cmIuYWRkciArIDIwNDg7CisJY2hpcC0+cmlyYi5idWYgPSAodTMyICopKGNoaXAtPnJiLmFyZWEgKyAyMDQ4KTsKKwlhenhfd3JpdGVsKGNoaXAsIFJJUkJMQkFTRSwgKHUzMiljaGlwLT5yaXJiLmFkZHIpOworCWF6eF93cml0ZWwoY2hpcCwgUklSQlVCQVNFLCB1cHBlcl8zMmJpdChjaGlwLT5yaXJiLmFkZHIpKTsKKworCS8qIHJlc2V0IHRoZSByaXJiIGh3IHdyaXRlIHBvaW50ZXIgKi8KKwlhenhfd3JpdGV3KGNoaXAsIFJJUkJXUCwgSUNINl9SQlJXUF9DTFIpOworCS8qIHNldCBOPTEsIGdldCBSSVJCIHJlc3BvbnNlIGludGVycnVwdCBmb3IgbmV3IGVudHJ5ICovCisJYXp4X3dyaXRldyhjaGlwLCBSSU5UQ05ULCAxKTsKKwkvKiBlbmFibGUgcmlyYiBkbWEgYW5kIHJlc3BvbnNlIGlycSAqLworI2lmZGVmIFVTRV9DT1JCX1JJUkIKKwlhenhfd3JpdGViKGNoaXAsIFJJUkJDVEwsIElDSDZfUkJDVExfRE1BX0VOIHwgSUNINl9SQkNUTF9JUlFfRU4pOworI2Vsc2UKKwlhenhfd3JpdGViKGNoaXAsIFJJUkJDVEwsIElDSDZfUkJDVExfRE1BX0VOKTsKKyNlbmRpZgorCWNoaXAtPnJpcmIucnAgPSBjaGlwLT5yaXJiLmNtZHMgPSAwOworfQorCitzdGF0aWMgdm9pZCBhenhfZnJlZV9jbWRfaW8oYXp4X3QgKmNoaXApCit7CisJLyogZGlzYWJsZSByaW5nYnVmZmVyIERNQXMgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJDVEwsIDApOworCWF6eF93cml0ZWIoY2hpcCwgQ09SQkNUTCwgMCk7Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kICovCitzdGF0aWMgaW50IGF6eF9zZW5kX2NtZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdCwKKwkJCXVuc2lnbmVkIGludCB2ZXJiLCB1bnNpZ25lZCBpbnQgcGFyYSkKK3sKKwlhenhfdCAqY2hpcCA9IGNvZGVjLT5idXMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgd3A7CisJdTMyIHZhbDsKKworCXZhbCA9ICh1MzIpKGNvZGVjLT5hZGRyICYgMHgwZikgPDwgMjg7CisJdmFsIHw9ICh1MzIpZGlyZWN0IDw8IDI3OworCXZhbCB8PSAodTMyKW5pZCA8PCAyMDsKKwl2YWwgfD0gdmVyYiA8PCA4OworCXZhbCB8PSBwYXJhOworCisJLyogYWRkIGNvbW1hbmQgdG8gY29yYiAqLworCXdwID0gYXp4X3JlYWRiKGNoaXAsIENPUkJXUCk7CisJd3ArKzsKKwl3cCAlPSBJQ0g2X01BWF9DT1JCX0VOVFJJRVM7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+cmlyYi5jbWRzKys7CisJY2hpcC0+Y29yYi5idWZbd3BdID0gY3B1X3RvX2xlMzIodmFsKTsKKwlhenhfd3JpdGVsKGNoaXAsIENPUkJXUCwgd3ApOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSUNINl9SSVJCX0VYX1VOU09MX0VWCSgxPDw0KQorCisvKiByZXRyaWV2ZSBSSVJCIGVudHJ5IC0gY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGF6eF91cGRhdGVfcmlyYihhenhfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgcnAsIHdwOworCXUzMiByZXMsIHJlc19leDsKKworCXdwID0gYXp4X3JlYWRiKGNoaXAsIFJJUkJXUCk7CisJaWYgKHdwID09IGNoaXAtPnJpcmIud3ApCisJCXJldHVybjsKKwljaGlwLT5yaXJiLndwID0gd3A7CisJCQorCXdoaWxlIChjaGlwLT5yaXJiLnJwICE9IHdwKSB7CisJCWNoaXAtPnJpcmIucnArKzsKKwkJY2hpcC0+cmlyYi5ycCAlPSBJQ0g2X01BWF9SSVJCX0VOVFJJRVM7CisKKwkJcnAgPSBjaGlwLT5yaXJiLnJwIDw8IDE7IC8qIGFuIFJJUkIgZW50cnkgaXMgOC1ieXRlcyAqLworCQlyZXNfZXggPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycCArIDFdKTsKKwkJcmVzID0gbGUzMl90b19jcHUoY2hpcC0+cmlyYi5idWZbcnBdKTsKKwkJaWYgKHJlc19leCAmIElDSDZfUklSQl9FWF9VTlNPTF9FVikKKwkJCXNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQoY2hpcC0+YnVzLCByZXMsIHJlc19leCk7CisJCWVsc2UgaWYgKGNoaXAtPnJpcmIuY21kcykgeworCQkJY2hpcC0+cmlyYi5jbWRzLS07CisJCQljaGlwLT5yaXJiLnJlcyA9IHJlczsKKwkJfQorCX0KK30KKworLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYXp4X3QgKmNoaXAgPSBjb2RlYy0+YnVzLT5wcml2YXRlX2RhdGE7CisJaW50IHRpbWVvdXQgPSA1MDsKKworCXdoaWxlIChjaGlwLT5yaXJiLmNtZHMpIHsKKwkJaWYgKCEgLS10aW1lb3V0KSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXRcbiIpOworCQkJY2hpcC0+cmlyYi5ycCA9IGF6eF9yZWFkYihjaGlwLCBSSVJCV1ApOworCQkJY2hpcC0+cmlyYi5jbWRzID0gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorCXJldHVybiBjaGlwLT5yaXJiLnJlczsgLyogdGhlIGxhc3QgdmFsdWUgKi8KK30KKworI2Vsc2UKKy8qCisgKiBVc2UgdGhlIHNpbmdsZSBpbW1lZGlhdGUgY29tbWFuZCBpbnN0ZWFkIG9mIENPUkIvUklSQiBmb3Igc2ltcGxpY2l0eQorICoKKyAqIE5vdGU6IGFjY29yZGluZyB0byBJbnRlbCwgdGhpcyBpcyBub3QgcHJlZmVycmVkIHVzZS4gIFRoZSBjb21tYW5kIHdhcworICogICAgICAgaW50ZW5kZWQgZm9yIHRoZSBCSU9TIG9ubHksIGFuZCBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggdW5zb2xpY2l0ZWQKKyAqICAgICAgIHJlc3BvbnNlcy4gIFNvLCB3ZSBzaG91bGRuJ3QgdXNlIGl0IGZvciBub3JtYWwgb3BlcmF0aW9uIGZyb20gdGhlCisgKiAgICAgICBkcml2ZXIuCisgKiAgICAgICBJIGxlZnQgdGhlIGNvZGVzLCBob3dldmVyLCBmb3IgZGVidWdnaW5nL3Rlc3RpbmcgcHVycG9zZXMuCisgKi8KKworI2RlZmluZSBhenhfYWxsb2NfY21kX2lvKGNoaXApCTAKKyNkZWZpbmUgYXp4X2luaXRfY21kX2lvKGNoaXApCisjZGVmaW5lIGF6eF9mcmVlX2NtZF9pbyhjaGlwKQorCisvKiBzZW5kIGEgY29tbWFuZCAqLworc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXJlY3QsCisJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcmEpCit7CisJYXp4X3QgKmNoaXAgPSBjb2RlYy0+YnVzLT5wcml2YXRlX2RhdGE7CisJdTMyIHZhbDsKKwlpbnQgdGltZW91dCA9IDUwOworCisJdmFsID0gKHUzMikoY29kZWMtPmFkZHIgJiAweDBmKSA8PCAyODsKKwl2YWwgfD0gKHUzMilkaXJlY3QgPDwgMjc7CisJdmFsIHw9ICh1MzIpbmlkIDw8IDIwOworCXZhbCB8PSB2ZXJiIDw8IDg7CisJdmFsIHw9IHBhcmE7CisKKwl3aGlsZSAodGltZW91dC0tKSB7CisJCS8qIGNoZWNrIElDQiBidXN5IGJpdCAqLworCQlpZiAoISAoYXp4X3JlYWR3KGNoaXAsIElSUykgJiBJQ0g2X0lSU19CVVNZKSkgeworCQkJLyogQ2xlYXIgSVJWIHZhbGlkIGJpdCAqLworCQkJYXp4X3dyaXRldyhjaGlwLCBJUlMsIGF6eF9yZWFkdyhjaGlwLCBJUlMpIHwgSUNINl9JUlNfVkFMSUQpOworCQkJYXp4X3dyaXRlbChjaGlwLCBJQywgdmFsKTsKKwkJCWF6eF93cml0ZXcoY2hpcCwgSVJTLCBhenhfcmVhZHcoY2hpcCwgSVJTKSB8IElDSDZfSVJTX0JVU1kpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlzbmRfcHJpbnRkKFNGWCAic2VuZF9jbWQgdGltZW91dDogSVJTPTB4JXgsIHZhbD0weCV4XG4iLCBhenhfcmVhZHcoY2hpcCwgSVJTKSwgdmFsKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYXp4X3QgKmNoaXAgPSBjb2RlYy0+YnVzLT5wcml2YXRlX2RhdGE7CisJaW50IHRpbWVvdXQgPSA1MDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJLyogY2hlY2sgSVJWIGJ1c3kgYml0ICovCisJCWlmIChhenhfcmVhZHcoY2hpcCwgSVJTKSAmIElDSDZfSVJTX1ZBTElEKQorCQkJcmV0dXJuIGF6eF9yZWFkbChjaGlwLCBJUik7CisJCXVkZWxheSgxKTsKKwl9CisJc25kX3ByaW50ZChTRlggImdldF9yZXNwb25zZSB0aW1lb3V0OiBJUlM9MHgleFxuIiwgYXp4X3JlYWR3KGNoaXAsIElSUykpOworCXJldHVybiAodW5zaWduZWQgaW50KS0xOworfQorCisjZGVmaW5lIGF6eF91cGRhdGVfcmlyYihjaGlwKQorCisjZW5kaWYgLyogVVNFX0NPUkJfUklSQiAqLworCisvKiByZXNldCBjb2RlYyBsaW5rICovCitzdGF0aWMgaW50IGF6eF9yZXNldChhenhfdCAqY2hpcCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1JFU0VUKTsKKworCWNvdW50ID0gNTA7CisJd2hpbGUgKGF6eF9yZWFkYihjaGlwLCBHQ1RMKSAmJiAtLWNvdW50KQorCQltc2xlZXAoMSk7CisKKwkvKiBkZWxheSBmb3IgPj0gMTAwdXMgZm9yIGNvZGVjIFBMTCB0byBzZXR0bGUgcGVyIHNwZWMKKwkgKiBSZXYgMC45IHNlY3Rpb24gNS41LjEKKwkgKi8KKwltc2xlZXAoMSk7CisKKwkvKiBCcmluZyBjb250cm9sbGVyIG91dCBvZiByZXNldCAqLworCWF6eF93cml0ZWIoY2hpcCwgR0NUTCwgYXp4X3JlYWRiKGNoaXAsIEdDVEwpIHwgSUNINl9HQ1RMX1JFU0VUKTsKKworCWNvdW50ID0gNTA7CisJd2hpbGUgKCEgYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYmIC0tY291bnQpCisJCW1zbGVlcCgxKTsKKworCS8qIEJyZW50IENoYXJ0cmFuZCBzYWlkIHRvIHdhaXQgPj0gNTQwdXMgZm9yIGNvZGVjcyB0byBpbnRpYWxpemUgKi8KKwltc2xlZXAoMSk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgY29udHJvbGxlciBpcyByZWFkeSAqLworCWlmICghIGF6eF9yZWFkYihjaGlwLCBHQ1RMKSkgeworCQlzbmRfcHJpbnRkKCJhenhfcmVzZXQ6IGNvbnRyb2xsZXIgbm90IHJlYWR5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogZGV0ZWN0IGNvZGVjcyAqLworCWlmICghIGNoaXAtPmNvZGVjX21hc2spIHsKKwkJY2hpcC0+Y29kZWNfbWFzayA9IGF6eF9yZWFkdyhjaGlwLCBTVEFURVNUUyk7CisJCXNuZF9wcmludGRkKCJjb2RlY19tYXNrID0gMHgleFxuIiwgY2hpcC0+Y29kZWNfbWFzayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIExvd2xldmVsIGludGVyZmFjZQorICovICAKKworLyogZW5hYmxlIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfZW5hYmxlKGF6eF90ICpjaGlwKQoreworCS8qIGVuYWJsZSBjb250cm9sbGVyIENJRSBhbmQgR0lFICovCisJYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpIHwKKwkJICAgSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0dMT0JBTF9FTik7Cit9CisKKy8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgYXp4X2ludF9kaXNhYmxlKGF6eF90ICpjaGlwKQoreworCWludCBpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHN0cmVhbSBkZXNjcmlwdG9yICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JQ0g2X0RFVjsgaSsrKSB7CisJCWF6eF9kZXZfdCAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwKKwkJCSAgICAgIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYgflNEX0lOVF9NQVNLKTsKKwl9CisKKwkvKiBkaXNhYmxlIFNJRSBmb3IgYWxsIHN0cmVhbXMgKi8KKwlhenhfd3JpdGViKGNoaXAsIElOVENUTCwgMCk7CisKKwkvKiBkaXNhYmxlIGNvbnRyb2xsZXIgQ0lFIGFuZCBHSUUgKi8KKwlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgJgorCQkgICB+KElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9HTE9CQUxfRU4pKTsKK30KKworLyogY2xlYXIgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgYXp4X2ludF9jbGVhcihhenhfdCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGNsZWFyIHN0cmVhbSBzdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lDSDZfREVWOyBpKyspIHsKKwkJYXp4X2Rldl90ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07CisJCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7CisJfQorCisJLyogY2xlYXIgU1RBVEVTVFMgKi8KKwlhenhfd3JpdGViKGNoaXAsIFNUQVRFU1RTLCBTVEFURVNUU19JTlRfTUFTSyk7CisKKwkvKiBjbGVhciByaXJiIHN0YXR1cyAqLworCWF6eF93cml0ZWIoY2hpcCwgUklSQlNUUywgUklSQl9JTlRfTUFTSyk7CisKKwkvKiBjbGVhciBpbnQgc3RhdHVzICovCisJYXp4X3dyaXRlbChjaGlwLCBJTlRTVFMsIElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9BTExfU1RSRUFNKTsKK30KKworLyogc3RhcnQgYSBzdHJlYW0gKi8KK3N0YXRpYyB2b2lkIGF6eF9zdHJlYW1fc3RhcnQoYXp4X3QgKmNoaXAsIGF6eF9kZXZfdCAqYXp4X2RldikKK3sKKwkvKiBlbmFibGUgU0lFICovCisJYXp4X3dyaXRlYihjaGlwLCBJTlRDVEwsCisJCSAgIGF6eF9yZWFkYihjaGlwLCBJTlRDVEwpIHwgKDEgPDwgYXp4X2Rldi0+aW5kZXgpKTsKKwkvKiBzZXQgRE1BIHN0YXJ0IGFuZCBpbnRlcnJ1cHQgbWFzayAqLworCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLCBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSB8CisJCSAgICAgIFNEX0NUTF9ETUFfU1RBUlQgfCBTRF9JTlRfTUFTSyk7Cit9CisKKy8qIHN0b3AgYSBzdHJlYW0gKi8KK3N0YXRpYyB2b2lkIGF6eF9zdHJlYW1fc3RvcChhenhfdCAqY2hpcCwgYXp4X2Rldl90ICphenhfZGV2KQoreworCS8qIHN0b3AgRE1BICovCisJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYKKwkJICAgICAgfihTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spKTsKKwlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOyAvKiB0byBiZSBzdXJlICovCisJLyogZGlzYWJsZSBTSUUgKi8KKwlhenhfd3JpdGViKGNoaXAsIElOVENUTCwKKwkJICAgYXp4X3JlYWRiKGNoaXAsIElOVENUTCkgJiB+KDEgPDwgYXp4X2Rldi0+aW5kZXgpKTsKK30KKworCisvKgorICogaW5pdGlhbGl6ZSB0aGUgY2hpcAorICovCitzdGF0aWMgdm9pZCBhenhfaW5pdF9jaGlwKGF6eF90ICpjaGlwKQoreworCXVuc2lnbmVkIGNoYXIgdGNzZWxfcmVnOworCisJLyogQ2xlYXIgYml0cyAwLTIgb2YgUENJIHJlZ2lzdGVyIFRDU0VMIChhdCBvZmZzZXQgMHg0NCkKKwkgKiBUQ1NFTCA9PSBUcmFmZmljIENsYXNzIFNlbGVjdCBSZWdpc3Rlciwgd2hpY2ggc2V0cyBQQ0kgZXhwcmVzcyBRT1MKKwkgKiBFbnN1cmluZyB0aGVzZSBiaXRzIGFyZSAwIGNsZWFycyBwbGF5YmFjayBzdGF0aWMgb24gc29tZSBIRCBBdWRpbyBjb2RlY3MKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2hpcC0+cGNpLCBJQ0g2X1BDSVJFR19UQ1NFTCwgJnRjc2VsX3JlZyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgSUNINl9QQ0lSRUdfVENTRUwsIHRjc2VsX3JlZyAmIDB4ZjgpOworCisJLyogcmVzZXQgY29udHJvbGxlciAqLworCWF6eF9yZXNldChjaGlwKTsKKworCS8qIGluaXRpYWxpemUgaW50ZXJydXB0cyAqLworCWF6eF9pbnRfY2xlYXIoY2hpcCk7CisJYXp4X2ludF9lbmFibGUoY2hpcCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBjb2RlYyBjb21tYW5kIEkvTyAqLworCWF6eF9pbml0X2NtZF9pbyhjaGlwKTsKKworI2lmZGVmIFVTRV9QT1NCVUYKKwkvKiBwcm9ncmFtIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwlhenhfd3JpdGVsKGNoaXAsIERQTEJBU0UsICh1MzIpY2hpcC0+cG9zYnVmLmFkZHIpOworCWF6eF93cml0ZWwoY2hpcCwgRFBVQkFTRSwgdXBwZXJfMzJiaXQoY2hpcC0+cG9zYnVmLmFkZHIpKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXp4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWF6eF90ICpjaGlwID0gZGV2X2lkOworCWF6eF9kZXZfdCAqYXp4X2RldjsKKwl1MzIgc3RhdHVzOworCWludCBpOworCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlzdGF0dXMgPSBhenhfcmVhZGwoY2hpcCwgSU5UU1RTKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lDSDZfREVWOyBpKyspIHsKKwkJYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOworCQlpZiAoc3RhdHVzICYgYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrKSB7CisJCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOworCQkJaWYgKGF6eF9kZXYtPnN1YnN0cmVhbSAmJiBhenhfZGV2LT5ydW5uaW5nKSB7CisJCQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGF6eF9kZXYtPnN1YnN0cmVhbSk7CisJCQkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjbGVhciByaXJiIGludCAqLworCXN0YXR1cyA9IGF6eF9yZWFkYihjaGlwLCBSSVJCU1RTKTsKKwlpZiAoc3RhdHVzICYgUklSQl9JTlRfTUFTSykgeworCQlpZiAoc3RhdHVzICYgUklSQl9JTlRfUkVTUE9OU0UpCisJCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7CisJCWF6eF93cml0ZWIoY2hpcCwgUklSQlNUUywgUklSQl9JTlRfTUFTSyk7CisJfQorCisjaWYgMAorCS8qIGNsZWFyIHN0YXRlIHN0YXR1cyBpbnQgKi8KKwlpZiAoYXp4X3JlYWRiKGNoaXAsIFNUQVRFU1RTKSAmIDB4MDQpCisJCWF6eF93cml0ZWIoY2hpcCwgU1RBVEVTVFMsIDB4MDQpOworI2VuZGlmCisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoKKyAqIHNldCB1cCBCREwgZW50cmllcworICovCitzdGF0aWMgdm9pZCBhenhfc2V0dXBfcGVyaW9kcyhhenhfZGV2X3QgKmF6eF9kZXYpCit7CisJdTMyICpiZGwgPSBhenhfZGV2LT5iZGw7CisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IGF6eF9kZXYtPnN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisJaW50IGlkeDsKKworCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgMCk7CisKKwkvKiBwcm9ncmFtIHRoZSBpbml0aWFsIEJETCBlbnRyaWVzICovCisJZm9yIChpZHggPSAwOyBpZHggPCBhenhfZGV2LT5mcmFnczsgaWR4KyspIHsKKwkJdW5zaWduZWQgaW50IG9mZiA9IGlkeCA8PCAyOyAvKiA0IGR3b3JkIHN0ZXAgKi8KKwkJZG1hX2FkZHJfdCBhZGRyID0gZG1hX2FkZHIgKyBpZHggKiBhenhfZGV2LT5mcmFnc2l6ZTsKKwkJLyogcHJvZ3JhbSB0aGUgYWRkcmVzcyBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCisJCWJkbFtvZmZdID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKKwkJYmRsW29mZisxXSA9IGNwdV90b19sZTMyKHVwcGVyXzMyYml0KGFkZHIpKTsKKworCQkvKiBwcm9ncmFtIHRoZSBzaXplIGZpZWxkIG9mIHRoZSBCREwgZW50cnkgKi8KKwkJYmRsW29mZisyXSA9IGNwdV90b19sZTMyKGF6eF9kZXYtPmZyYWdzaXplKTsKKworCQkvKiBwcm9ncmFtIHRoZSBJT0MgdG8gZW5hYmxlIGludGVycnVwdCB3aGVuIGJ1ZmZlciBjb21wbGV0ZXMgKi8KKwkJYmRsW29mZiszXSA9IGNwdV90b19sZTMyKDB4MDEpOworCX0KK30KKworLyoKKyAqIHNldCB1cCB0aGUgU0QgZm9yIHN0cmVhbWluZworICovCitzdGF0aWMgaW50IGF6eF9zZXR1cF9jb250cm9sbGVyKGF6eF90ICpjaGlwLCBhenhfZGV2X3QgKmF6eF9kZXYpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHJ1biBiaXQgaXMgemVybyBmb3IgU0QgKi8KKwlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwgYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgJiB+U0RfQ1RMX0RNQV9TVEFSVCk7CisJLyogcmVzZXQgc3RyZWFtICovCisJYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpIHwgU0RfQ1RMX1NUUkVBTV9SRVNFVCk7CisJdWRlbGF5KDMpOworCXRpbWVvdXQgPSAzMDA7CisJd2hpbGUgKCEoKHZhbCA9IGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpKSAmIFNEX0NUTF9TVFJFQU1fUkVTRVQpICYmCisJICAgICAgIC0tdGltZW91dCkKKwkJOworCXZhbCAmPSB+U0RfQ1RMX1NUUkVBTV9SRVNFVDsKKwlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwgdmFsKTsKKwl1ZGVsYXkoMyk7CisKKwl0aW1lb3V0ID0gMzAwOworCS8qIHdhaXRpbmcgZm9yIGhhcmR3YXJlIHRvIHJlcG9ydCB0aGF0IHRoZSBzdHJlYW0gaXMgb3V0IG9mIHJlc2V0ICovCisJd2hpbGUgKCgodmFsID0gYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkpICYgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYKKwkgICAgICAgLS10aW1lb3V0KQorCQk7CisKKwkvKiBwcm9ncmFtIHRoZSBzdHJlYW1fdGFnICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsCisJCSAgICAgIChhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfQ1RMKSAmIH5TRF9DVExfU1RSRUFNX1RBR19NQVNLKSB8CisJCSAgICAgIChhenhfZGV2LT5zdHJlYW1fdGFnIDw8IFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUKSk7CisKKwkvKiBwcm9ncmFtIHRoZSBsZW5ndGggb2Ygc2FtcGxlcyBpbiBjeWNsaWMgYnVmZmVyICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DQkwsIGF6eF9kZXYtPmJ1ZnNpemUpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIGZvcm1hdCAqLworCS8qIHRoaXMgdmFsdWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwcm9ncmFtbWVkICovCisJYXp4X3NkX3dyaXRldyhhenhfZGV2LCBTRF9GT1JNQVQsIGF6eF9kZXYtPmZvcm1hdF92YWwpOworCisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtIExWSSAobGFzdCB2YWxpZCBpbmRleCkgb2YgdGhlIEJETCAqLworCWF6eF9zZF93cml0ZXcoYXp4X2RldiwgU0RfTFZJLCBhenhfZGV2LT5mcmFncyAtIDEpOworCisJLyogcHJvZ3JhbSB0aGUgQkRMIGFkZHJlc3MgKi8KKwkvKiBsb3dlciBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUEwsICh1MzIpYXp4X2Rldi0+YmRsX2FkZHIpOworCS8qIHVwcGVyIEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgdXBwZXJfMzJiaXQoYXp4X2Rldi0+YmRsX2FkZHIpKTsKKworI2lmZGVmIFVTRV9QT1NCVUYKKwkvKiBlbmFibGUgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCWlmICghIChhenhfcmVhZGwoY2hpcCwgRFBMQkFTRSkgJiBJQ0g2X0RQTEJBU0VfRU5BQkxFKSkKKwkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAodTMyKWNoaXAtPnBvc2J1Zi5hZGRyIHwgSUNINl9EUExCQVNFX0VOQUJMRSk7CisjZW5kaWYKKwkvKiBzZXQgdGhlIGludGVycnVwdCBlbmFibGUgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBjb250cm9sIHJlZ2lzdGVyICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpIHwgU0RfSU5UX01BU0spOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENvZGVjIGluaXRpYWxpemF0aW9uCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYXp4X2NvZGVjX2NyZWF0ZShhenhfdCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwpCit7CisJc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgYnVzX3RlbXA7CisJaW50IGMsIGNvZGVjcywgZXJyOworCisJbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7CisJYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlidXNfdGVtcC5tb2RlbG5hbWUgPSBtb2RlbDsKKwlidXNfdGVtcC5wY2kgPSBjaGlwLT5wY2k7CisJYnVzX3RlbXAub3BzLmNvbW1hbmQgPSBhenhfc2VuZF9jbWQ7CisJYnVzX3RlbXAub3BzLmdldF9yZXNwb25zZSA9IGF6eF9nZXRfcmVzcG9uc2U7CisKKwlpZiAoKGVyciA9IHNuZF9oZGFfYnVzX25ldyhjaGlwLT5jYXJkLCAmYnVzX3RlbXAsICZjaGlwLT5idXMpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwljb2RlY3MgPSAwOworCWZvciAoYyA9IDA7IGMgPCBBWlhfTUFYX0NPREVDUzsgYysrKSB7CisJCWlmIChjaGlwLT5jb2RlY19tYXNrICYgKDEgPDwgYykpIHsKKwkJCWVyciA9IHNuZF9oZGFfY29kZWNfbmV3KGNoaXAtPmJ1cywgYywgTlVMTCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWNvZGVjcysrOworCQl9CisJfQorCWlmICghIGNvZGVjcykgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAibm8gY29kZWNzIGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUENNIHN1cHBvcnQKKyAqLworCisvKiBhc3NpZ24gYSBzdHJlYW0gZm9yIHRoZSBQQ00gKi8KK3N0YXRpYyBpbmxpbmUgYXp4X2Rldl90ICphenhfYXNzaWduX2RldmljZShhenhfdCAqY2hpcCwgaW50IHN0cmVhbSkKK3sKKwlpbnQgZGV2LCBpOworCWRldiA9IHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gNCA6IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgZGV2KyspCisJCWlmICghIGNoaXAtPmF6eF9kZXZbZGV2XS5vcGVuZWQpIHsKKwkJCWNoaXAtPmF6eF9kZXZbZGV2XS5vcGVuZWQgPSAxOworCQkJcmV0dXJuICZjaGlwLT5henhfZGV2W2Rldl07CisJCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmVsZWFzZSB0aGUgYXNzaWduZWQgc3RyZWFtICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXZfdCAqYXp4X2RldikKK3sKKwlhenhfZGV2LT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IGF6eF9wY21faHcgPSB7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkyLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMjgsCisJLnBlcmlvZF9ieXRlc19tYXggPQlBWlhfTUFYX0JVRl9TSVpFIC8gMiwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJQVpYX01BWF9GUkFHLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0cnVjdCBhenhfcGNtIHsKKwlhenhfdCAqY2hpcDsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvWzJdOworfTsKKworc3RhdGljIGludCBhenhfcGNtX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJYXp4X3QgKmNoaXAgPSBhcGNtLT5jaGlwOworCWF6eF9kZXZfdCAqYXp4X2RldjsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlkb3duKCZjaGlwLT5vcGVuX211dGV4KTsKKwlhenhfZGV2ID0gYXp4X2Fzc2lnbl9kZXZpY2UoY2hpcCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmIChhenhfZGV2ID09IE5VTEwpIHsKKwkJdXAoJmNoaXAtPm9wZW5fbXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlydW50aW1lLT5odyA9IGF6eF9wY21faHc7CisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKKwlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoaW5mby0+Y2hhbm5lbHNfbWF4OworCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBoaW5mby0+Zm9ybWF0czsKKwlydW50aW1lLT5ody5yYXRlcyA9IGhpbmZvLT5yYXRlczsKKwlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoKGVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSkpIDwgMCkgeworCQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7CisJCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X2Rldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBhenhfZGV2OworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhenhfcGNtX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCWF6eF90ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlhenhfZGV2X3QgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkb3duKCZjaGlwLT5vcGVuX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlhenhfZGV2LT5zdWJzdHJlYW0gPSBOVUxMOworCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOworCXVwKCZjaGlwLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhenhfcGNtX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIHNuZF9wY21faHdfcGFyYW1zX3QgKmh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWF6eF9kZXZfdCAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKworCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgMCk7CisJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsIDApOworCisJaGluZm8tPm9wcy5jbGVhbnVwKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlhenhfdCAqY2hpcCA9IGFwY20tPmNoaXA7CisJYXp4X2Rldl90ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJYXp4X2Rldi0+YnVmc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWF6eF9kZXYtPmZyYWdzaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJYXp4X2Rldi0+ZnJhZ3MgPSBhenhfZGV2LT5idWZzaXplIC8gYXp4X2Rldi0+ZnJhZ3NpemU7CisJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KHJ1bnRpbWUtPnJhdGUsCisJCQkJCQkJIHJ1bnRpbWUtPmNoYW5uZWxzLAorCQkJCQkJCSBydW50aW1lLT5mb3JtYXQsCisJCQkJCQkJIGhpbmZvLT5tYXhicHMpOworCWlmICghIGF6eF9kZXYtPmZvcm1hdF92YWwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImludmFsaWQgZm9ybWF0X3ZhbCwgcmF0ZT0lZCwgY2g9JWQsIGZvcm1hdD0lZFxuIiwKKwkJCSAgIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5mb3JtYXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfcHJpbnRkZCgiYXp4X3BjbV9wcmVwYXJlOiBidWZzaXplPTB4JXgsIGZyYWdzaXplPTB4JXgsIGZvcm1hdD0weCV4XG4iLAorCQkgICAgYXp4X2Rldi0+YnVmc2l6ZSwgYXp4X2Rldi0+ZnJhZ3NpemUsIGF6eF9kZXYtPmZvcm1hdF92YWwpOworCWF6eF9zZXR1cF9wZXJpb2RzKGF6eF9kZXYpOworCWF6eF9zZXR1cF9jb250cm9sbGVyKGNoaXAsIGF6eF9kZXYpOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlhenhfZGV2LT5maWZvX3NpemUgPSBhenhfc2RfcmVhZHcoYXp4X2RldiwgU0RfRklGT1NJWkUpICsgMTsKKwllbHNlCisJCWF6eF9kZXYtPmZpZm9fc2l6ZSA9IDA7CisKKwlyZXR1cm4gaGluZm8tPm9wcy5wcmVwYXJlKGhpbmZvLCBhcGNtLT5jb2RlYywgYXp4X2Rldi0+c3RyZWFtX3RhZywKKwkJCQkgIGF6eF9kZXYtPmZvcm1hdF92YWwsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlhenhfZGV2X3QgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCWF6eF90ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWF6eF9zdHJlYW1fc3RhcnQoY2hpcCwgYXp4X2Rldik7CisJCWF6eF9kZXYtPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgYXp4X2Rldik7CisJCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCB8fAorCSAgICBjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQlpbnQgdGltZW91dCA9IDUwMDA7CisJCXdoaWxlIChhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSAmIFNEX0NUTF9ETUFfU1RBUlQgJiYgLS10aW1lb3V0KQorCQkJOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgYXp4X3BjbV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlhenhfZGV2X3QgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGludCBwb3M7CisKKyNpZmRlZiBVU0VfUE9TQlVGCisJLyogdXNlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwlwb3MgPSAqYXp4X2Rldi0+cG9zYnVmOworI2Vsc2UKKwkvKiByZWFkIExQSUIgKi8KKwlwb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQikgKyBhenhfZGV2LT5maWZvX3NpemU7CisjZW5kaWYKKwlpZiAocG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCisJCXBvcyA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHBvcyk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IGF6eF9wY21fb3BzID0geworCS5vcGVuID0gYXp4X3BjbV9vcGVuLAorCS5jbG9zZSA9IGF6eF9wY21fY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IGF6eF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlID0gYXp4X3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0gYXp4X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0gYXp4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0gYXp4X3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHZvaWQgYXp4X3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWtmcmVlKHBjbS0+cHJpdmF0ZV9kYXRhKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY3JlYXRlX2NvZGVjX3BjbShhenhfdCAqY2hpcCwgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgc3RydWN0IGhkYV9wY20gKmNwY20sIGludCBwY21fZGV2KQoreworCWludCBlcnI7CisJc25kX3BjbV90ICpwY207CisJc3RydWN0IGF6eF9wY20gKmFwY207CisKKwlzbmRfYXNzZXJ0KGNwY20tPnN0cmVhbVswXS5zdWJzdHJlYW1zIHx8IGNwY20tPnN0cmVhbVsxXS5zdWJzdHJlYW1zLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydChjcGNtLT5uYW1lLCByZXR1cm4gLUVJTlZBTCk7CisKKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjcGNtLT5uYW1lLCBwY21fZGV2LAorCQkJICBjcGNtLT5zdHJlYW1bMF0uc3Vic3RyZWFtcywgY3BjbS0+c3RyZWFtWzFdLnN1YnN0cmVhbXMsCisJCQkgICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXN0cmNweShwY20tPm5hbWUsIGNwY20tPm5hbWUpOworCWFwY20gPSBrbWFsbG9jKHNpemVvZigqYXBjbSksIEdGUF9LRVJORUwpOworCWlmIChhcGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWFwY20tPmNoaXAgPSBjaGlwOworCWFwY20tPmNvZGVjID0gY29kZWM7CisJYXBjbS0+aGluZm9bMF0gPSAmY3BjbS0+c3RyZWFtWzBdOworCWFwY20tPmhpbmZvWzFdID0gJmNwY20tPnN0cmVhbVsxXTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGFwY207CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBhenhfcGNtX2ZyZWU7CisJaWYgKGNwY20tPnN0cmVhbVswXS5zdWJzdHJlYW1zKQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmYXp4X3BjbV9vcHMpOworCWlmIChjcGNtLT5zdHJlYW1bMV0uc3Vic3RyZWFtcykKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmYXp4X3BjbV9vcHMpOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJICAgICAgMTAyNCAqIDY0LCAxMDI0ICogMTI4KTsKKwljaGlwLT5wY21bcGNtX2Rldl0gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYXp4X3BjbV9jcmVhdGUoYXp4X3QgKmNoaXApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwlpbnQgYywgZXJyOworCWludCBwY21fZGV2OworCisJaWYgKChlcnIgPSBzbmRfaGRhX2J1aWxkX3BjbXMoY2hpcC0+YnVzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGNtX2RldiA9IDA7CisJbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+YnVzLT5jb2RlY19saXN0KSB7CisJCWNvZGVjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2NvZGVjLCBsaXN0KTsKKwkJZm9yIChjID0gMDsgYyA8IGNvZGVjLT5udW1fcGNtczsgYysrKSB7CisJCQlpZiAocGNtX2RldiA+PSBBWlhfTUFYX1BDTVMpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiVG9vIG1hbnkgUENNc1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQllcnIgPSBjcmVhdGVfY29kZWNfcGNtKGNoaXAsIGNvZGVjLCAmY29kZWMtPnBjbV9pbmZvW2NdLCBwY21fZGV2KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlwY21fZGV2Kys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtaXhlciBjcmVhdGlvbiAtIGFsbCBzdHVmZiBpcyBpbXBsZW1lbnRlZCBpbiBoZGEgbW9kdWxlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF6eF9taXhlcl9jcmVhdGUoYXp4X3QgKmNoaXApCit7CisJcmV0dXJuIHNuZF9oZGFfYnVpbGRfY29udHJvbHMoY2hpcC0+YnVzKTsKK30KKworCisvKgorICogaW5pdGlhbGl6ZSBTRCBzdHJlYW1zCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF6eF9pbml0X3N0cmVhbShhenhfdCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgZWFjaCBzdHJlYW0gKGFrYSBkZXZpY2UpCisJICogYXNzaWduIHRoZSBzdGFydGluZyBiZGwgYWRkcmVzcyB0byBlYWNoIHN0cmVhbSAoZGV2aWNlKSBhbmQgaW5pdGlhbGl6ZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgb2ZmID0gc2l6ZW9mKHUzMikgKiAoaSAqIEFaWF9NQVhfRlJBRyAqIDQpOworCQlhenhfZGV2X3QgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X2Rldi0+YmRsID0gKHUzMiAqKShjaGlwLT5iZGwuYXJlYSArIG9mZik7CisJCWF6eF9kZXYtPmJkbF9hZGRyID0gY2hpcC0+YmRsLmFkZHIgKyBvZmY7CisjaWZkZWYgVVNFX1BPU0JVRgorCQlhenhfZGV2LT5wb3NidWYgPSAodm9sYXRpbGUgdTMyICopKGNoaXAtPnBvc2J1Zi5hcmVhICsgaSAqIDgpOworI2VuZGlmCisJCS8qIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCisJCWF6eF9kZXYtPnNkX2FkZHIgPSBjaGlwLT5yZW1hcF9hZGRyICsgKDB4MjAgKiBpICsgMHg4MCk7CisJCS8qIGludCBtYXNrOiBTREkwPTB4MDEsIFNESTE9MHgwMiwgLi4uIFNETzM9MHg4MCAqLworCQlhenhfZGV2LT5zZF9pbnRfc3RhX21hc2sgPSAxIDw8IGk7CisJCS8qIHN0cmVhbSB0YWc6IG11c3QgYmUgbm9uLXplcm8gYW5kIHVuaXF1ZSAqLworCQlhenhfZGV2LT5pbmRleCA9IGk7CisJCWF6eF9kZXYtPnN0cmVhbV90YWcgPSBpICsgMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IGF6eF9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlhenhfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5wY21fZGV2czsgaSsrKQorCQlpZiAoY2hpcC0+cGNtW2ldKQorCQkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOworCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMsIHN0YXRlKTsKKwlhenhfZnJlZV9jbWRfaW8oY2hpcCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWF6eF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlwY2lfc2V0X21hc3RlcihjaGlwLT5wY2kpOworCWF6eF9pbml0X2NoaXAoY2hpcCk7CisJc25kX2hkYV9yZXN1bWUoY2hpcC0+YnVzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCisvKgorICogZGVzdHJ1Y3RvcgorICovCitzdGF0aWMgaW50IGF6eF9mcmVlKGF6eF90ICpjaGlwKQoreworCWlmIChjaGlwLT5yZW1hcF9hZGRyKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykKKwkJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCAmY2hpcC0+YXp4X2RldltpXSk7CisKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCWF6eF9pbnRfZGlzYWJsZShjaGlwKTsKKwkJYXp4X2ludF9jbGVhcihjaGlwKTsKKworCQkvKiBkaXNhYmxlIENPUkIvUklSQiAqLworCQlhenhfZnJlZV9jbWRfaW8oY2hpcCk7CisKKwkJLyogZGlzYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KKwkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKKwkJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCAwKTsKKworCQkvKiB3YWl0IGEgbGl0dGxlIGZvciBpbnRlcnJ1cHRzIHRvIGZpbmlzaCAqLworCQltc2xlZXAoMSk7CisKKwkJaW91bm1hcChjaGlwLT5yZW1hcF9hZGRyKTsKKwl9CisKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQqKWNoaXApOworCisJaWYgKGNoaXAtPmJkbC5hcmVhKQorCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmJkbCk7CisJaWYgKGNoaXAtPnJiLmFyZWEpCisJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cmIpOworI2lmZGVmIFVTRV9QT1NCVUYKKwlpZiAoY2hpcC0+cG9zYnVmLmFyZWEpCisJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cG9zYnVmKTsKKyNlbmRpZgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF6eF9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwlyZXR1cm4gYXp4X2ZyZWUoZGV2aWNlLT5kZXZpY2VfZGF0YSk7Cit9CisKKy8qCisgKiBjb25zdHJ1Y3RvcgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhenhfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksIGF6eF90ICoqcmNoaXApCit7CisJYXp4X3QgKmNoaXA7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPSBhenhfZGV2X2ZyZWUsCisJfTsKKworCSpyY2hpcCA9IE5VTEw7CisJCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwkKKwlpZiAoTlVMTCA9PSBjaGlwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJjYW5ub3QgYWxsb2NhdGUgY2hpcFxuIik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCWluaXRfTVVURVgoJmNoaXAtPm9wZW5fbXV0ZXgpOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJJQ0ggSEQgYXVkaW8iKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwwKTsKKwljaGlwLT5yZW1hcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmFkZHIsIHBjaV9yZXNvdXJjZV9sZW4ocGNpLDApKTsKKwlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJpb3JlbWFwIGVycm9yXG4iKTsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGF6eF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwKKwkJCSJIREEgSW50ZWwiLCAodm9pZCopY2hpcCkpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3V0OworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBCREwgZm9yIGVhY2ggc3RyZWFtICovCisJaWYgKChlcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCSAgICAgICBQQUdFX1NJWkUsICZjaGlwLT5iZGwpKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBCRExcbiIpOworCQlnb3RvIGVycm91dDsKKwl9CisjaWZkZWYgVVNFX1BPU0JVRgorCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLworCWlmICgoZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkgICAgICAgTUFYX0lDSDZfREVWICogOCwgJmNoaXAtPnBvc2J1ZikpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiY2Fubm90IGFsbG9jYXRlIHBvc2J1ZlxuIik7CisJCWdvdG8gZXJyb3V0OworCX0KKyNlbmRpZgorCS8qIGFsbG9jYXRlIENPUkIvUklSQiAqLworCWlmICgoZXJyID0gYXp4X2FsbG9jX2NtZF9pbyhjaGlwKSkgPCAwKQorCQlnb3RvIGVycm91dDsKKworCS8qIGluaXRpYWxpemUgc3RyZWFtcyAqLworCWF6eF9pbml0X3N0cmVhbShjaGlwKTsKKworCS8qIGluaXRpYWxpemUgY2hpcCAqLworCWF6eF9pbml0X2NoaXAoY2hpcCk7CisKKwkvKiBjb2RlYyBkZXRlY3Rpb24gKi8KKwlpZiAoISBjaGlwLT5jb2RlY19tYXNrKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJubyBjb2RlY3MgZm91bmQhXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8MCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgZGV2aWNlIFtjYXJkXSFcbiIpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwkqcmNoaXAgPSBjaGlwOworCXJldHVybiAwOworCisgZXJyb3V0OgorCWF6eF9mcmVlKGNoaXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF6eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJYXp4X3QgKmNoaXA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoISBlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKE5VTEwgPT0gY2FyZCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgY2FyZCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoKGVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJIREEtSW50ZWwiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiSERBIEludGVsIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4IGlycSAlaSIsIGNhcmQtPnNob3J0bmFtZSwgY2hpcC0+YWRkciwgY2hpcC0+aXJxKTsKKworCS8qIGNyZWF0ZSBjb2RlYyBpbnN0YW5jZXMgKi8KKwlpZiAoKGVyciA9IGF6eF9jb2RlY19jcmVhdGUoY2hpcCwgbW9kZWxbZGV2XSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNyZWF0ZSBQQ00gc3RyZWFtcyAqLworCWlmICgoZXJyID0gYXp4X3BjbV9jcmVhdGUoY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNyZWF0ZSBtaXhlciBjb250cm9scyAqLworCWlmICgoZXJyID0gYXp4X21peGVyX2NyZWF0ZShjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIGF6eF9zdXNwZW5kLCBhenhfcmVzdW1lLCBjaGlwKTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhenhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKKy8qIFBDSSBJRHMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhenhfaWRzW10gPSB7CisJeyAweDgwODYsIDB4MjY2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBJQ0g2ICovCisJeyAweDgwODYsIDB4MjdkOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBJQ0g3ICovCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF6eF9pZHMpOworCisvKiBwY2lfZHJpdmVyIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiSERBIEludGVsIiwKKwkuaWRfdGFibGUgPSBhenhfaWRzLAorCS5wcm9iZSA9IGF6eF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYXp4X3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9henhfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfYXp4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9henhfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9henhfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2I4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogVW5pdmVyc2FsIEludGVyZmFjZSBmb3IgSW50ZWwgSGlnaCBEZWZpbml0aW9uIEF1ZGlvIENvZGVjCisgKgorICogTG9jYWwgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fU09VTkRfSERBX0xPQ0FMX0gKKyNkZWZpbmUgX19TT1VORF9IREFfTE9DQUxfSAorCisvKgorICogZm9yIG1peGVyIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsY2hzLGlkeCxkaXIpICgobmlkKSB8ICgoY2hzKTw8MTYpIHwgKChkaXIpPDwxOCkgfCAoKGlkeCk8PDE5KSkKKyNkZWZpbmUgSERBX0NPREVDX1ZPTFVNRV9NT05PX0lEWCh4bmFtZSwgeGNpZHgsIG5pZCwgY2hhbm5lbCwgeGluZGV4LCBkaXJlY3Rpb24pIFwKKwl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4Y2lkeCwgIFwKKwkgIC5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8sIFwKKwkgIC5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0LCBcCisJICAucHV0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCwgXAorCSAgLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hhbm5lbCwgeGluZGV4LCBkaXJlY3Rpb24pIH0KKyNkZWZpbmUgSERBX0NPREVDX1ZPTFVNRV9JRFgoeG5hbWUsIHhjaWR4LCBuaWQsIHhpbmRleCwgZGlyZWN0aW9uKSBcCisJSERBX0NPREVDX1ZPTFVNRV9NT05PX0lEWCh4bmFtZSwgeGNpZHgsIG5pZCwgMywgeGluZGV4LCBkaXJlY3Rpb24pCisjZGVmaW5lIEhEQV9DT0RFQ19WT0xVTUVfTU9OTyh4bmFtZSwgbmlkLCBjaGFubmVsLCB4aW5kZXgsIGRpcmVjdGlvbikgXAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OT19JRFgoeG5hbWUsIDAsIG5pZCwgY2hhbm5lbCwgeGluZGV4LCBkaXJlY3Rpb24pCisjZGVmaW5lIEhEQV9DT0RFQ19WT0xVTUUoeG5hbWUsIG5pZCwgeGluZGV4LCBkaXJlY3Rpb24pIFwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oeG5hbWUsIG5pZCwgMywgeGluZGV4LCBkaXJlY3Rpb24pCisjZGVmaW5lIEhEQV9DT0RFQ19NVVRFX01PTk9fSURYKHhuYW1lLCB4Y2lkeCwgbmlkLCBjaGFubmVsLCB4aW5kZXgsIGRpcmVjdGlvbikgXAorCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhjaWR4LCBcCisJICAuaW5mbyA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9pbmZvLCBcCisJICAuZ2V0ID0gc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldCwgXAorCSAgLnB1dCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQsIFwKKwkgIC5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNoYW5uZWwsIHhpbmRleCwgZGlyZWN0aW9uKSB9CisjZGVmaW5lIEhEQV9DT0RFQ19NVVRFX0lEWCh4bmFtZSwgeGNpZHgsIG5pZCwgeGluZGV4LCBkaXJlY3Rpb24pIFwKKwlIREFfQ09ERUNfTVVURV9NT05PX0lEWCh4bmFtZSwgeGNpZHgsIG5pZCwgMywgeGluZGV4LCBkaXJlY3Rpb24pCisjZGVmaW5lIEhEQV9DT0RFQ19NVVRFX01PTk8oeG5hbWUsIG5pZCwgY2hhbm5lbCwgeGluZGV4LCBkaXJlY3Rpb24pIFwKKwlIREFfQ09ERUNfTVVURV9NT05PX0lEWCh4bmFtZSwgMCwgbmlkLCBjaGFubmVsLCB4aW5kZXgsIGRpcmVjdGlvbikKKyNkZWZpbmUgSERBX0NPREVDX01VVEUoeG5hbWUsIG5pZCwgeGluZGV4LCBkaXJlY3Rpb24pIFwKKwlIREFfQ09ERUNfTVVURV9NT05PKHhuYW1lLCBuaWQsIDMsIHhpbmRleCwgZGlyZWN0aW9uKQorCitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbyk7CitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCk7CitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCk7CitpbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbyk7CitpbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCk7CitpbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCk7CisKK2ludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCk7CitpbnQgc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCk7CisKKy8qCisgKiBpbnB1dCBNVVggaGVscGVyCisgKi8KKyNkZWZpbmUgSERBX01BWF9OVU1fSU5QVVRTCTgKK3N0cnVjdCBoZGFfaW5wdXRfbXV4X2l0ZW0geworCWNvbnN0IGNoYXIgKmxhYmVsOworCXVuc2lnbmVkIGludCBpbmRleDsKK307CitzdHJ1Y3QgaGRhX2lucHV0X211eCB7CisJdW5zaWduZWQgaW50IG51bV9pdGVtczsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eF9pdGVtIGl0ZW1zW0hEQV9NQVhfTlVNX0lOUFVUU107Cit9OworCitpbnQgc25kX2hkYV9pbnB1dF9tdXhfaW5mbyhjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pOworaW50IHNuZF9oZGFfaW5wdXRfbXV4X3B1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXgsCisJCQkgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCwgaGRhX25pZF90IG5pZCwKKwkJCSAgdW5zaWduZWQgaW50ICpjdXJfdmFsKTsKKworLyoKKyAqIE11bHRpLWNoYW5uZWwgLyBkaWdpdGFsLW91dCBQQ00gaGVscGVyCisgKi8KKworZW51bSB7IEhEQV9GUk9OVCwgSERBX1JFQVIsIEhEQV9DTEZFLCBIREFfU0lERSB9OyAvKiBpbmRleCBmb3IgZGFjX25pZHggKi8KK2VudW0geyBIREFfRElHX05PTkUsIEhEQV9ESUdfRVhDTFVTSVZFLCBIREFfRElHX0FOQUxPR19EVVAgfTsgLyogZGlnX291dF91c2VkICovCisKK3N0cnVjdCBoZGFfbXVsdGlfb3V0IHsKKwlpbnQgbnVtX2RhY3M7CQkvKiAjIG9mIERBQ3MsIG11c3QgYmUgbW9yZSB0aGFuIDEgKi8KKwloZGFfbmlkX3QgKmRhY19uaWRzOwkvKiBEQUMgbGlzdCAqLworCWhkYV9uaWRfdCBocF9uaWQ7CS8qIG9wdGlvbmFsIERBQyBmb3IgSFAsIDAgd2hlbiBub3QgZXhpc3RzICovCisJaGRhX25pZF90IGRpZ19vdXRfbmlkOwkvKiBkaWdpdGFsIG91dCBhdWRpbyB3aWRnZXQgKi8KKwlpbnQgbWF4X2NoYW5uZWxzOwkvKiBjdXJyZW50bHkgc3VwcG9ydGVkIGFuYWxvZyBjaGFubmVscyAqLworCWludCBkaWdfb3V0X3VzZWQ7CS8qIGN1cnJlbnQgdXNhZ2Ugb2YgZGlnaXRhbCBvdXQgKEhEQV9ESUdfWFhYKSAqLworfTsKKworaW50IHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCk7CitpbnQgc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCk7CitpbnQgc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0LAorCQkJCSAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKTsKK2ludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pOworaW50IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19jbGVhbnVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCk7CisKKy8qCisgKiBnZW5lcmljIGNvZGVjIHBhcnNlcgorICovCitpbnQgc25kX2hkYV9wYXJzZV9nZW5lcmljX2NvZGVjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKworLyoKKyAqIGdlbmVyaWMgcHJvYyBpbnRlcmZhY2UKKyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitpbnQgc25kX2hkYV9jb2RlY19wcm9jX25ldyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9jb2RlY19wcm9jX25ldyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKy8qCisgKiBNaXNjCisgKi8KK3N0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHsKKwljb25zdCBjaGFyICptb2RlbG5hbWU7CisJaW50IGNvbmZpZzsKKwl1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yOworCXVuc2lnbmVkIHNob3J0IHBjaV9kZXZpY2U7Cit9OworCitpbnQgc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnICp0YmwpOworaW50IHNuZF9oZGFfYWRkX25ld19jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzbmRfa2NvbnRyb2xfbmV3X3QgKmtuZXcpOworCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCisjaWZkZWYgQ09ORklHX1BNCitpbnQgc25kX2hkYV9yZXN1bWVfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc25kX2tjb250cm9sX25ld190ICprbmV3KTsKK2ludCBzbmRfaGRhX3Jlc3VtZV9zcGRpZl9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworaW50IHNuZF9oZGFfcmVzdW1lX3NwZGlmX2luKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKyNlbmRpZgorCisvKgorICogdW5zb2xpY2l0ZWQgZXZlbnQgaGFuZGxlcgorICovCisKKyNkZWZpbmUgSERBX1VOU09MX1FVRVVFX1NJWkUJNjQKKworc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgeworCS8qIHJpbmcgYnVmZmVyICovCisJdTMyIHF1ZXVlW0hEQV9VTlNPTF9RVUVVRV9TSVpFICogMl07CisJdW5zaWduZWQgaW50IHJwLCB3cDsKKworCS8qIHdvcmtxdWV1ZSAqLworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKKyNlbmRpZiAvKiBfX1NPVU5EX0hEQV9MT0NBTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oIGIvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaApAQCAtMCwwICsxLDE3IEBACisvKgorICogSERBIFBhdGNoZXMgLSBpbmNsdWRlZCBieSBoZGFfY29kZWMuYworICovCisKKy8qIFJlYWx0ZWsgY29kZWNzICovCitleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfcmVhbHRla1tdOworLyogQy1NZWRpYSBjb2RlY3MgKi8KK2V4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9jbWVkaWFbXTsKKy8qIEFuYWxvZyBEZXZpY2VzIGNvZGVjcyAqLworZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2FuYWxvZ1tdOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgKmhkYV9wcmVzZXRfdGFibGVzW10gPSB7CisJc25kX2hkYV9wcmVzZXRfcmVhbHRlaywKKwlzbmRfaGRhX3ByZXNldF9jbWVkaWEsCisJc25kX2hkYV9wcmVzZXRfYW5hbG9nLAorCU5VTEwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1ZGI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIFVuaXZlcnNhbCBJbnRlcmZhY2UgZm9yIEludGVsIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYworICogCisgKiBHZW5lcmljIHByb2MgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfd2lkX3R5cGVfbmFtZSh1bnNpZ25lZCBpbnQgd2lkX3ZhbHVlKQoreworCXN0YXRpYyBjaGFyICpuYW1lc1sxNl0gPSB7CisJCVtBQ19XSURfQVVEX09VVF0gPSAiQXVkaW8gT3V0cHV0IiwKKwkJW0FDX1dJRF9BVURfSU5dID0gIkF1ZGlvIElucHV0IiwKKwkJW0FDX1dJRF9BVURfTUlYXSA9ICJBdWRpbyBNaXhlciIsCisJCVtBQ19XSURfQVVEX1NFTF0gPSAiQXVkaW8gU2VsZWN0b3IiLAorCQlbQUNfV0lEX1BJTl0gPSAiUGluIENvbXBsZXgiLAorCQlbQUNfV0lEX1BPV0VSXSA9ICJQb3dlciBXaWRnZXQiLAorCQlbQUNfV0lEX1ZPTF9LTkJdID0gIlZvbHVtZSBLbm9iIFdpZGdldCIsCisJCVtBQ19XSURfQkVFUF0gPSAiQmVlcCBHZW5lcmF0b3IgV2lkZ2V0IiwKKwkJW0FDX1dJRF9WRU5ET1JdID0gIlZlbmRvciBEZWZpbmVkIFdpZGdldCIsCisJfTsKKwl3aWRfdmFsdWUgJj0gMHhmOworCWlmIChuYW1lc1t3aWRfdmFsdWVdKQorCQlyZXR1cm4gbmFtZXNbd2lkX3ZhbHVlXTsKKwllbHNlCisJCXJldHVybiAiVU5LT1dOIFdpZGdldCI7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2FtcF9jYXBzKHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIsCisJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgY2FwczsKKwlpZiAoZGlyID09IEhEQV9PVVRQVVQpCisJCWNhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0FNUF9PVVRfQ0FQKTsKKwllbHNlCisJCWNhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0FNUF9JTl9DQVApOworCWlmIChjYXBzID09IC0xIHx8IGNhcHMgPT0gMCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJOL0FcbiIpOworCQlyZXR1cm47CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm9mcz0weCUwMngsIG5zdGVwcz0weCUwMngsIHN0ZXBzaXplPTB4JTAyeCwgbXV0ZT0leFxuIiwKKwkJICAgIGNhcHMgJiBBQ19BTVBDQVBfT0ZGU0VULAorCQkgICAgKGNhcHMgJiBBQ19BTVBDQVBfTlVNX1NURVBTKSA+PiBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZULAorCQkgICAgKGNhcHMgJiBBQ19BTVBDQVBfU1RFUF9TSVpFKSA+PiBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZULAorCQkgICAgKGNhcHMgJiBBQ19BTVBDQVBfTVVURSkgPj4gQUNfQU1QQ0FQX01VVEVfU0hJRlQpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9hbXBfdmFscyhzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyLAorCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICBpbnQgZGlyLCBpbnQgc3RlcmVvKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaWYgKHN0ZXJlbykgeworCQl2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkJICBBQ19BTVBfR0VUX0xFRlQgfAorCQkJCQkgKGRpciA9PSBIREFfT1VUUFVUID8gQUNfQU1QX0dFVF9PVVRQVVQgOgorCQkJCQkgIEFDX0FNUF9HRVRfSU5QVVQpKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiMHglMDJ4ICIsIHZhbCk7CisJfQorCXZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9BTVBfR0FJTl9NVVRFLAorCQkJCSBBQ19BTVBfR0VUX1JJR0hUIHwKKwkJCQkgKGRpciA9PSBIREFfT1VUUFVUID8gQUNfQU1QX0dFVF9PVVRQVVQgOgorCQkJCSAgQUNfQU1QX0dFVF9JTlBVVCkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIjB4JTAyeFxuIiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGNtX2NhcHMoc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlciwKKwkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQoreworCXVuc2lnbmVkIGludCBwY20gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BDTSk7CisJdW5zaWduZWQgaW50IHN0cmVhbSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfU1RSRUFNKTsKKwlpZiAocGNtID09IC0xIHx8IHN0cmVhbSA9PSAtMSkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJOL0FcbiIpOworCQlyZXR1cm47CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInJhdGVzIDB4JTAzeCwgYml0cyAweCUwMngsIHR5cGVzIDB4JXhcbiIsCisJCSAgICBwY20gJiBBQ19TVVBQQ01fUkFURVMsIChwY20gPj4gMTYpICYgMHhmZiwgc3RyZWFtICYgMHhmKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9qYWNrX2xvY2F0aW9uKHUzMiBjZmcpCit7CisJc3RhdGljIGNoYXIgKmJhc2VzWzddID0geworCQkiTi9BIiwgIlJlYXIiLCAiRnJvbnQiLCAiTGVmdCIsICJSaWdodCIsICJUb3AiLCAiQm90dG9tIiwKKwl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNwZWNpYWxzX2lkeFtdID0geworCQkweDA3LCAweDA4LAorCQkweDE3LCAweDE4LCAweDE5LAorCQkweDM3LCAweDM4CisJfTsKKwlzdGF0aWMgY2hhciAqc3BlY2lhbHNbXSA9IHsKKwkJIlJlYXIgUGFuZWwiLCAiRHJpdmUgQmFyIiwKKwkJIlJpc2VyIiwgIkhETUkiLCAiQVRBUEkiLAorCQkiTW9iaWxlLUluIiwgIk1vYmlsZS1PdXQiCisJfTsKKwlpbnQgaTsKKwljZmcgPSAoY2ZnICYgQUNfREVGQ0ZHX0xPQ0FUSU9OKSA+PiBBQ19ERUZDRkdfTE9DQVRJT05fU0hJRlQ7CisJaWYgKChjZmcgJiAweDBmKSA8IDcpCisJCXJldHVybiBiYXNlc1tjZmcgJiAweDBmXTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGVjaWFsc19pZHgpOyBpKyspIHsKKwkJaWYgKGNmZyA9PSBzcGVjaWFsc19pZHhbaV0pCisJCQlyZXR1cm4gc3BlY2lhbHNbaV07CisJfQorCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfamFja19jb25uZWN0aW9uKHUzMiBjZmcpCit7CisJc3RhdGljIGNoYXIgKm5hbWVzWzE2XSA9IHsKKwkJIlVua25vd24iLCAiMS84IiwgIjEvNCIsICJBVEFQSSIsCisJCSJSQ0EiLCAiT3B0aWNhbCIsIkRpZ2l0YWwiLCAiQW5hbG9nIiwKKwkJIkRJTiIsICJYTFIiLCAiUkoxMSIsICJDb21iIiwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgIk90aGVyIgorCX07CisJY2ZnID0gKGNmZyAmIEFDX0RFRkNGR19DT05OX1RZUEUpID4+IEFDX0RFRkNGR19DT05OX1RZUEVfU0hJRlQ7CisJaWYgKG5hbWVzW2NmZ10pCisJCXJldHVybiBuYW1lc1tjZmddOworCWVsc2UKKwkJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9qYWNrX2NvbG9yKHUzMiBjZmcpCit7CisJc3RhdGljIGNoYXIgKm5hbWVzWzE2XSA9IHsKKwkJIlVua25vd24iLCAiQmxhY2siLCAiR3JleSIsICJCbHVlIiwKKwkJIkdyZWVuIiwgIlJlZCIsICJPcmFuZ2UiLCAiWWVsbG93IiwKKwkJIlB1cnBsZSIsICJQaW5rIiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgIldoaXRlIiwgIk90aGVyIiwKKwl9OworCWNmZyA9IChjZmcgJiBBQ19ERUZDRkdfQ09MT1IpID4+IEFDX0RFRkNGR19DT0xPUl9TSElGVDsKKwlpZiAobmFtZXNbY2ZnXSkKKwkJcmV0dXJuIG5hbWVzW2NmZ107CisJZWxzZQorCQlyZXR1cm4gIlVOS05PV04iOworfQorCitzdGF0aWMgdm9pZCBwcmludF9waW5fY2FwcyhzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyLAorCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJc3RhdGljIGNoYXIgKmphY2tfdHlwZXNbMTZdID0geworCQkiTGluZSBPdXQiLCAiU3BlYWtlciIsICJIUCBPdXQiLCAiQ0QiLAorCQkiU1BESUYgT3V0IiwgIkRpZ2l0YWwgT3V0IiwgIk1vZGVtIExpbmUiLCAiTW9kZW0gSGFuZCIsCisJCSJMaW5lIEluIiwgIkF1eCIsICJNaWMiLCAiVGVsZXBob255IiwKKwkJIlNQRElGIEluIiwgIkRpZ2l0aWFsIEluIiwgIlJlc2VydmVkIiwgIk90aGVyIgorCX07CisJc3RhdGljIGNoYXIgKmphY2tfbG9jYXRpb25zWzRdID0geyAiRXh0IiwgIkludCIsICJTZXAiLCAiT3RoIiB9OworCXVuc2lnbmVkIGludCBjYXBzOworCisJY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBQaW5jYXAgMHgwOCV4OiIsIGNhcHMpOworCWlmIChjYXBzICYgQUNfUElOQ0FQX0lOKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgSU4iKTsKKwlpZiAoY2FwcyAmIEFDX1BJTkNBUF9PVVQpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBPVVQiKTsKKwlpZiAoY2FwcyAmIEFDX1BJTkNBUF9IUF9EUlYpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBIUCIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJY2FwcyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwgMCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBQaW4gRGVmYXVsdCAweCUwOHg6ICVzIGF0ICVzICVzXG4iLCBjYXBzLAorCQkgICAgamFja190eXBlc1soY2FwcyAmIEFDX0RFRkNGR19ERVZJQ0UpID4+IEFDX0RFRkNGR19ERVZJQ0VfU0hJRlRdLAorCQkgICAgamFja19sb2NhdGlvbnNbKGNhcHMgPj4gKEFDX0RFRkNGR19MT0NBVElPTl9TSElGVCArIDQpKSAmIDNdLAorCQkgICAgZ2V0X2phY2tfbG9jYXRpb24oY2FwcykpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgICBDb25uID0gJXMsIENvbG9yID0gJXNcbiIsCisJCSAgICBnZXRfamFja19jb25uZWN0aW9uKGNhcHMpLAorCQkgICAgZ2V0X2phY2tfY29sb3IoY2FwcykpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X2NvZGVjX2luZm8oc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzMyXTsKKwloZGFfbmlkX3QgbmlkOworCWludCBpLCBub2RlczsKKworCXNuZF9oZGFfZ2V0X2NvZGVjX25hbWUoY29kZWMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNvZGVjOiAlc1xuIiwgYnVmKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJBZGRyZXNzOiAlZFxuIiwgY29kZWMtPmFkZHIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlZlbmRvciBJZDogMHgleFxuIiwgY29kZWMtPnZlbmRvcl9pZCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiU3Vic3lzdGVtIElkOiAweCV4XG4iLCBjb2RlYy0+c3Vic3lzdGVtX2lkKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJSZXZpc2lvbiBJZDogMHgleFxuIiwgY29kZWMtPnJldmlzaW9uX2lkKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJEZWZhdWx0IFBDTTogIik7CisJcHJpbnRfcGNtX2NhcHMoYnVmZmVyLCBjb2RlYywgY29kZWMtPmFmZyk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRGVmYXVsdCBBbXAtSW4gY2FwczogIik7CisJcHJpbnRfYW1wX2NhcHMoYnVmZmVyLCBjb2RlYywgY29kZWMtPmFmZywgSERBX0lOUFVUKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJEZWZhdWx0IEFtcC1PdXQgY2FwczogIik7CisJcHJpbnRfYW1wX2NhcHMoYnVmZmVyLCBjb2RlYywgY29kZWMtPmFmZywgSERBX09VVFBVVCk7CisKKwlub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgY29kZWMtPmFmZywgJm5pZCk7CisJaWYgKCEgbmlkIHx8IG5vZGVzIDwgMCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnZhbGlkIEFGRyBzdWJ0cmVlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKywgbmlkKyspIHsKKwkJdW5zaWduZWQgaW50IHdpZF9jYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsCisJCQkJCQkJICAgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApOworCQl1bnNpZ25lZCBpbnQgd2lkX3R5cGUgPSAod2lkX2NhcHMgJiBBQ19XQ0FQX1RZUEUpID4+IEFDX1dDQVBfVFlQRV9TSElGVDsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiTm9kZSAweCUwMnggWyVzXSB3Y2FwcyAweCV4OiIsIG5pZCwKKwkJCSAgICBnZXRfd2lkX3R5cGVfbmFtZSh3aWRfdHlwZSksIHdpZF9jYXBzKTsKKwkJaWYgKHdpZF9jYXBzICYgQUNfV0NBUF9TVEVSRU8pCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgU3RlcmVvIik7CisJCWVsc2UKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBNb25vIik7CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBEaWdpdGFsIik7CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfSU5fQU1QKQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIEFtcC1JbiIpOworCQlpZiAod2lkX2NhcHMgJiBBQ19XQ0FQX09VVF9BTVApCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgQW1wLU91dCIpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfSU5fQU1QKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIEFtcC1JbiBjYXBzOiAiKTsKKwkJCXByaW50X2FtcF9jYXBzKGJ1ZmZlciwgY29kZWMsIG5pZCwgSERBX0lOUFVUKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgQW1wLUluIHZhbHM6ICIpOworCQkJcHJpbnRfYW1wX3ZhbHMoYnVmZmVyLCBjb2RlYywgbmlkLCBIREFfSU5QVVQsCisJCQkJICAgICAgIHdpZF9jYXBzICYgQUNfV0NBUF9TVEVSRU8pOworCQl9CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICBBbXAtT3V0IGNhcHM6ICIpOworCQkJcHJpbnRfYW1wX2NhcHMoYnVmZmVyLCBjb2RlYywgbmlkLCBIREFfT1VUUFVUKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgQW1wLU91dCB2YWxzOiAiKTsKKwkJCXByaW50X2FtcF92YWxzKGJ1ZmZlciwgY29kZWMsIG5pZCwgSERBX09VVFBVVCwKKwkJCQkgICAgICAgd2lkX2NhcHMgJiBBQ19XQ0FQX1NURVJFTyk7CisJCX0KKworCQlpZiAod2lkX3R5cGUgPT0gQUNfV0lEX1BJTikgeworCQkJdW5zaWduZWQgaW50IHBpbmN0bHM7CisJCQlwcmludF9waW5fY2FwcyhidWZmZXIsIGNvZGVjLCBuaWQpOworCQkJcGluY3RscyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICBQaW4tY3RsczogMHglMDJ4OiIsIHBpbmN0bHMpOworCQkJaWYgKHBpbmN0bHMgJiBBQ19QSU5DVExfSU5fRU4pCisJCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIElOIik7CisJCQlpZiAocGluY3RscyAmIEFDX1BJTkNUTF9PVVRfRU4pCisJCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIE9VVCIpOworCQkJaWYgKHBpbmN0bHMgJiBBQ19QSU5DVExfSFBfRU4pCisJCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIEhQIik7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCQl9CisKKwkJaWYgKCh3aWRfdHlwZSA9PSBBQ19XSURfQVVEX09VVCB8fCB3aWRfdHlwZSA9PSBBQ19XSURfQVVEX0lOKSAmJgorCQkgICAgKHdpZF9jYXBzICYgQUNfV0NBUF9GT1JNQVRfT1ZSRCkpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgUENNOiAiKTsKKwkJCXByaW50X3BjbV9jYXBzKGJ1ZmZlciwgY29kZWMsIG5pZCk7CisJCX0KKworCQlpZiAod2lkX2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkgeworCQkJaGRhX25pZF90IGNvbm5bSERBX01BWF9DT05ORUNUSU9OU107CisJCQlpbnQgYywgY29ubl9sZW47CisJCQljb25uX2xlbiA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGNvbm4sCisJCQkJCQkJICAgSERBX01BWF9DT05ORUNUSU9OUyk7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIENvbm5lY3Rpb246ICVkXG4iLCBjb25uX2xlbik7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgICAgIik7CisJCQlmb3IgKGMgPSAwOyBjIDwgY29ubl9sZW47IGMrKykKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICIgMHglMDJ4IiwgY29ubltjXSk7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCQl9CisJfQorfQorCisvKgorICogY3JlYXRlIGEgcHJvYyByZWFkCisgKi8KK2ludCBzbmRfaGRhX2NvZGVjX3Byb2NfbmV3KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWNoYXIgbmFtZVszMl07CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJaW50IGVycjsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImNvZGVjIyVkIiwgY29kZWMtPmFkZHIpOworCWVyciA9IHNuZF9jYXJkX3Byb2NfbmV3KGNvZGVjLT5idXMtPmNhcmQsIG5hbWUsICZlbnRyeSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNvZGVjLCAzMiAqIDEwMjQsIHByaW50X2NvZGVjX2luZm8pOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQyMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgQUQxOTg2QQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCisKK3N0cnVjdCBhZDE5ODZhX3NwZWMgeworCXN0cnVjdCBzZW1hcGhvcmUgYW1wX211dGV4OwkvKiBQQ00gdm9sdW1lL211dGUgY29udHJvbCBtdXRleCAqLworCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwkvKiBwbGF5YmFjayAqLworCXVuc2lnbmVkIGludCBjdXJfbXV4OwkJLyogY2FwdHVyZSBzb3VyY2UgKi8KKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOwkvKiBQQ00gaW5mb3JtYXRpb24gKi8KK307CisKKyNkZWZpbmUgQUQxOTg2QV9TUERJRl9PVVQJMHgwMgorI2RlZmluZSBBRDE5ODZBX0ZST05UX0RBQwkweDAzCisjZGVmaW5lIEFEMTk4NkFfU1VSUl9EQUMJMHgwNAorI2RlZmluZSBBRDE5ODZBX0NMRkVfREFDCTB4MDUKKyNkZWZpbmUgQUQxOTg2QV9BREMJCTB4MDYKKworc3RhdGljIGhkYV9uaWRfdCBhZDE5ODZhX2RhY19uaWRzWzNdID0geworCUFEMTk4NkFfRlJPTlRfREFDLCBBRDE5ODZBX1NVUlJfREFDLCBBRDE5ODZBX0NMRkVfREFDCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggYWQxOTg2YV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJDRCIsIDB4MSB9LAorCQl7ICJBdXgiLCAweDMgfSwKKwkJeyAiTGluZSIsIDB4NCB9LAorCQl7ICJNaXgiLCAweDUgfSwKKwkJeyAiTW9ubyIsIDB4NiB9LAorCQl7ICJQaG9uZSIsIDB4NyB9LAorCX0sCit9OworCisvKgorICogUENNIGNvbnRyb2wKKyAqCisgKiBiaW5kIHZvbHVtZXMvbXV0ZXMgb2YgMyBEQUNzIGFzIGEgc2luZ2xlIFBDTSBjb250cm9sIGZvciBzaW1wbGljaXR5CisgKi8KKworI2RlZmluZSBhZDE5ODZhX3BjbV9hbXBfdm9sX2luZm8Jc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8KKworc3RhdGljIGludCBhZDE5ODZhX3BjbV9hbXBfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWQxOTg2YV9zcGVjICphZCA9IGNvZGVjLT5zcGVjOworCisJZG93bigmYWQtPmFtcF9tdXRleCk7CisJc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldChrY29udHJvbCwgdWNvbnRyb2wpOworCXVwKCZhZC0+YW1wX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE5ODZhX3BjbV9hbXBfdm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWQxOTg2YV9zcGVjICphZCA9IGNvZGVjLT5zcGVjOworCWludCBpLCBjaGFuZ2UgPSAwOworCisJZG93bigmYWQtPmFtcF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWQxOTg2YV9kYWNfbmlkcyk7IGkrKykgeworCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoYWQxOTg2YV9kYWNfbmlkc1tpXSwgMywgMCwgSERBX09VVFBVVCk7CisJCWNoYW5nZSB8PSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfcHV0KGtjb250cm9sLCB1Y29udHJvbCk7CisJfQorCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChBRDE5ODZBX0ZST05UX0RBQywgMywgMCwgSERBX09VVFBVVCk7CisJdXAoJmFkLT5hbXBfbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgYWQxOTg2YV9wY21fYW1wX3N3X2luZm8JCXNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9pbmZvCisKK3N0YXRpYyBpbnQgYWQxOTg2YV9wY21fYW1wX3N3X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWQxOTg2YV9zcGVjICphZCA9IGNvZGVjLT5zcGVjOworCisJZG93bigmYWQtPmFtcF9tdXRleCk7CisJc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldChrY29udHJvbCwgdWNvbnRyb2wpOworCXVwKCZhZC0+YW1wX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE5ODZhX3BjbV9hbXBfc3dfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhZDE5ODZhX3NwZWMgKmFkID0gY29kZWMtPnNwZWM7CisJaW50IGksIGNoYW5nZSA9IDA7CisKKwlkb3duKCZhZC0+YW1wX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZDE5ODZhX2RhY19uaWRzKTsgaSsrKSB7CisJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChhZDE5ODZhX2RhY19uaWRzW2ldLCAzLCAwLCBIREFfT1VUUFVUKTsKKwkJY2hhbmdlIHw9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQoa2NvbnRyb2wsIHVjb250cm9sKTsKKwl9CisJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKEFEMTk4NkFfRlJPTlRfREFDLCAzLCAwLCBIREFfT1VUUFVUKTsKKwl1cCgmYWQtPmFtcF9tdXRleCk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIGlucHV0IE1VWCBoYW5kbGluZworICovCitzdGF0aWMgaW50IGFkMTk4NmFfbXV4X2VudW1faW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKCZhZDE5ODZhX2NhcHR1cmVfc291cmNlLCB1aW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg2YV9tdXhfZW51bV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9tdXg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg2YV9tdXhfZW51bV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgJmFkMTk4NmFfY2FwdHVyZV9zb3VyY2UsIHVjb250cm9sLAorCQkJCSAgICAgQUQxOTg2QV9BREMsICZzcGVjLT5jdXJfbXV4KTsKK30KKworLyoKKyAqIG1peGVycworICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IGFkMTk4NmFfbWl4ZXJzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gYWQxOTg2YV9wY21fYW1wX3ZvbF9pbmZvLAorCQkuZ2V0ID0gYWQxOTg2YV9wY21fYW1wX3ZvbF9nZXQsCisJCS5wdXQgPSBhZDE5ODZhX3BjbV9hbXBfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKEFEMTk4NkFfRlJPTlRfREFDLCAzLCAwLCBIREFfT1VUUFVUKQorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gYWQxOTg2YV9wY21fYW1wX3N3X2luZm8sCisJCS5nZXQgPSBhZDE5ODZhX3BjbV9hbXBfc3dfZ2V0LAorCQkucHV0ID0gYWQxOTg2YV9wY21fYW1wX3N3X3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKEFEMTk4NkFfRlJPTlRfREFDLCAzLCAwLCBIREFfT1VUUFVUKQorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDFjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDFjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MWQsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxZCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgxZCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxYSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgxOCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE4LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMHgxZSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDFlLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEyLCAweDAsIEhEQV9PVVRQVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkJLmluZm8gPSBhZDE5ODZhX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhZDE5ODZhX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFkMTk4NmFfbXV4X2VudW1fcHV0LAorCX0sCisJSERBX0NPREVDX01VVEUoIlN0ZXJlbyBEb3dubWl4IFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIGluaXRpYWxpemF0aW9uIHZlcmJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWQxOTg2YV9pbml0X3ZlcmJzW10gPSB7CisJLyogRnJvbnQsIFN1cnJvdW5kLCBDTEZFIERBQzsgbXV0ZSBhcyBkZWZhdWx0ICovCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJLyogRG93bm1peCAtIG9mZiAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCS8qIEhQLCBMaW5lLU91dCwgU3Vycm91bmQsIENMRkUgc2VsZWN0b3JzICovCisJezB4MGEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAorCS8qIE1vbm8gc2VsZWN0b3IgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCisJLyogTWljIHNlbGVjdG9yOiBNaWMgMS8yIHBpbiAqLworCXsweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwkvKiBMaW5lLWluIHNlbGVjdG9yOiBMaW5lLWluICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAorCS8qIE1pYyAxLzIgc3dhcCAqLworCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwkvKiBSZWNvcmQgc2VsZWN0b3I6IG1pYyAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwkvKiBNaWMsIFBob25lLCBDRCwgQXV4LCBMaW5lLUluIGFtcDsgbXV0ZSBhcyBkZWZhdWx0ICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJLyogUEMgYmVlcCAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwkvKiBIUCwgTGluZS1PdXQsIFN1cnJvdW5kLCBDTEZFLCBNb25vIHBpbnM7IG11dGUgYXMgZGVmYXVsdCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsweDFlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKworc3RhdGljIGludCBhZDE5ODZhX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgYWQxOTg2YV9pbml0X3ZlcmJzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE5ODZhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgYWQxOTg2YV9taXhlcnMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLCBBRDE5ODZBX1NQRElGX09VVCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbmFsb2cgcGxheWJhY2sgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBpbnQgYWQxOTg2YV9wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGFkMTk4NmFfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCXVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCQl1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkJZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGFkMTk4NmFfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWQxOTg2YV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19jbGVhbnVwKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCisvKgorICogRGlnaXRhbCBvdXQKKyAqLworc3RhdGljIGludCBhZDE5ODZhX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworc3RhdGljIGludCBhZDE5ODZhX2RpZ19wbGF5YmFja19wY21fY2xvc2Uoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfY2xvc2UoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKKy8qCisgKiBBbmFsb2cgY2FwdHVyZQorICovCitzdGF0aWMgaW50IGFkMTk4NmFfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgQUQxOTg2QV9BREMsIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg2YV9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIEFEMTk4NkFfQURDLCAwLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICovCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFkMTk4NmFfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDYsCisJLm5pZCA9IEFEMTk4NkFfRlJPTlRfREFDLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IGFkMTk4NmFfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gYWQxOTg2YV9wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBhZDE5ODZhX3BsYXliYWNrX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWQxOTg2YV9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAyLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5uaWQgPSBBRDE5ODZBX0FEQywgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBhZDE5ODZhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gYWQxOTg2YV9jYXB0dXJlX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWQxOTg2YV9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IEFEMTk4NkFfU1BESUZfT1VULCAKKwkub3BzID0geworCQkub3BlbiA9IGFkMTk4NmFfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSBhZDE5ODZhX2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwl9LAorfTsKKworc3RhdGljIGludCBhZDE5ODZhX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFkMTk4NmFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfcGNtICppbmZvID0gc3BlYy0+cGNtX3JlYzsKKworCWNvZGVjLT5udW1fcGNtcyA9IDI7CisJY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKKworCWluZm8tPm5hbWUgPSAiQUQxOTg2QSBBbmFsb2ciOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGFkMTk4NmFfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGFkMTk4NmFfcGNtX2FuYWxvZ19jYXB0dXJlOworCWluZm8rKzsKKworCWluZm8tPm5hbWUgPSAiQUQxOTg2QSBEaWdpdGFsIjsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBhZDE5ODZhX3BjbV9kaWdpdGFsX3BsYXliYWNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTk4NmFfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlrZnJlZShjb2RlYy0+c3BlYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWQxOTg2YV9yZXN1bWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWQxOTg2YV9pbml0KGNvZGVjKTsKKwlzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBhZDE5ODZhX21peGVycyk7CisJc25kX2hkYV9yZXN1bWVfc3BkaWZfb3V0KGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19vcHMgYWQxOTg2YV9wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gYWQxOTg2YV9idWlsZF9jb250cm9scywKKwkuYnVpbGRfcGNtcyA9IGFkMTk4NmFfYnVpbGRfcGNtcywKKwkuaW5pdCA9IGFkMTk4NmFfaW5pdCwKKwkuZnJlZSA9IGFkMTk4NmFfZnJlZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lID0gYWQxOTg2YV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxOTg2YShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWQxOTg2YV9zcGVjICpzcGVjOworCisJc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X01VVEVYKCZzcGVjLT5hbXBfbXV0ZXgpOworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDY7CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFkMTk4NmFfZGFjX25pZHMpOworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gYWQxOTg2YV9kYWNfbmlkczsKKwlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFEMTk4NkFfU1BESUZfT1VUOworCisJY29kZWMtPnBhdGNoX29wcyA9IGFkMTk4NmFfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXRjaCBlbnRyaWVzCisgKi8KK3N0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2FuYWxvZ1tdID0geworCXsgLmlkID0gMHgxMWQ0MTk4NiwgLm5hbWUgPSAiQUQxOTg2QSIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4NmEgfSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjYzhlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKKyAqCisgKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIEMtTWVkaWEgQ01JOTg4MAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9sb2NhbC5oIgorCisKKy8qIGJvYXJkIGNvbmZpZyB0eXBlICovCitlbnVtIHsKKwlDTUlfTUlOSU1BTCwJLyogYmFjayAzLWphY2sgKi8KKwlDTUlfTUlOX0ZQLAkvKiBiYWNrIDMtamFjayArIGZyb250LXBhbmVsIDItamFjayAqLworCUNNSV9GVUxMLAkvKiBiYWNrIDYtamFjayArIGZyb250LXBhbmVsIDItamFjayAqLworCUNNSV9GVUxMX0RJRywJLyogYmFjayA2LWphY2sgKyBmcm9udC1wYW5lbCAyLWphY2sgKyBkaWdpdGFsIEkvTyAqLworCUNNSV9BTExPVVQsCS8qIGJhY2sgNS1qYWNrICsgZnJvbnQtcGFuZWwgMi1qYWNrICsgZGlnaXRhbCBvdXQgKi8KK307CisKK3N0cnVjdCBjbWlfc3BlYyB7CisJaW50IGJvYXJkX2NvbmZpZzsKKwl1bnNpZ25lZCBpbnQgc3Vycl9zd2l0Y2g6IDE7CS8qIHN3aXRjaGFibGUgbGluZSxtaWMgKi8KKwl1bnNpZ25lZCBpbnQgbm9fbGluZV9pbjogMTsJLyogbm8gbGluZS1pbiAoNS1qYWNrKSAqLworCXVuc2lnbmVkIGludCBmcm9udF9wYW5lbDogMTsJLyogaGFzIGZyb250LXBhbmVsIDItamFjayAqLworCisJLyogcGxheWJhY2sgKi8KKwlzdHJ1Y3QgaGRhX211bHRpX291dCBtdWx0aW91dDsKKworCS8qIGNhcHR1cmUgKi8KKwloZGFfbmlkX3QgKmFkY19uaWRzOworCWhkYV9uaWRfdCBkaWdfaW5fbmlkOworCisJLyogY2FwdHVyZSBzb3VyY2UgKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBjdXJfbXV4WzJdOworCisJLyogY2hhbm5lbCBtb2RlICovCisJdW5zaWduZWQgaW50IG51bV9jaF9tb2RlczsKKwl1bnNpZ25lZCBpbnQgY3VyX2NoX21vZGU7CisJY29uc3Qgc3RydWN0IGNtaV9jaGFubmVsX21vZGUgKmNoYW5uZWxfbW9kZXM7CisKKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOwkvKiBQQ00gaW5mb3JtYXRpb24gKi8KK307CisKKy8qCisgKiBpbnB1dCBNVVgKKyAqLworc3RhdGljIGludCBjbWlfbXV4X2VudW1faW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKHNwZWMtPmlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IGNtaV9tdXhfZW51bV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5jdXJfbXV4W2FkY19pZHhdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtaV9tdXhfZW51bV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCisJCQkJICAgICBzcGVjLT5hZGNfbmlkc1thZGNfaWR4XSwgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOworfQorCisvKgorICogc2hhcmVkIGxpbmUtaW4sIG1pYyBmb3Igc3Vycm91bmRzCisgKi8KKworLyogMy1zdGFjayAvIDIgY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjbWk5ODgwX2NoMl9pbml0W10gPSB7CisJLyogc2V0IGxpbmUtaW4gUElOIGZvciBpbnB1dCAqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogc2V0IG1pYyBQSU4gZm9yIGlucHV0LCBhbHNvIGVuYWJsZSB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiByb3V0ZSBmcm9udCBQQ00gKERBQzEpIHRvIEhQICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCXt9Cit9OworCisvKiAzLXN0YWNrIC8gNiBjaGFubmVsICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGNtaTk4ODBfY2g2X2luaXRbXSA9IHsKKwkvKiBzZXQgbGluZS1pbiBQSU4gZm9yIG91dHB1dCAqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogc2V0IG1pYyBQSU4gZm9yIG91dHB1dCAqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogcm91dGUgZnJvbnQgUENNIChEQUMxKSB0byBIUCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwl7fQorfTsKKworLyogMy1zdGFjaytmcm9udCAvIDggY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjbWk5ODgwX2NoOF9pbml0W10gPSB7CisJLyogc2V0IGxpbmUtaW4gUElOIGZvciBvdXRwdXQgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHNldCBtaWMgUElOIGZvciBvdXRwdXQgKi8KKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHJvdXRlIHJlYXItc3Vycm91bmQgUENNIChEQUM0KSB0byBIUCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDMgfSwKKwl7fQorfTsKKworc3RydWN0IGNtaV9jaGFubmVsX21vZGUgeworCXVuc2lnbmVkIGludCBjaGFubmVsczsKKwljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKnNlcXVlbmNlOworfTsKKworc3RhdGljIHN0cnVjdCBjbWlfY2hhbm5lbF9tb2RlIGNtaTk4ODBfY2hhbm5lbF9tb2Rlc1szXSA9IHsKKwl7IDIsIGNtaTk4ODBfY2gyX2luaXQgfSwKKwl7IDYsIGNtaTk4ODBfY2g2X2luaXQgfSwKKwl7IDgsIGNtaTk4ODBfY2g4X2luaXQgfSwKK307CisKK3N0YXRpYyBpbnQgY21pX2NoX21vZGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc25kX2Fzc2VydChzcGVjLT5jaGFubmVsX21vZGVzLCByZXR1cm4gLUVJTlZBTCk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IHNwZWMtPm51bV9jaF9tb2RlczsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzcHJpbnRmKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsICIlZGNoIiwKKwkJc3BlYy0+Y2hhbm5lbF9tb2Rlc1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXS5jaGFubmVscyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21pX2NoX21vZGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9jaF9tb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtaV9jaF9tb2RlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNuZF9hc3NlcnQoc3BlYy0+Y2hhbm5lbF9tb2RlcywgcmV0dXJuIC1FSU5WQUwpOworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IHNwZWMtPm51bV9jaF9tb2RlcykKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPm51bV9jaF9tb2RlczsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSBzcGVjLT5jdXJfY2hfbW9kZSAmJgorCSAgICAhIGNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCisJc3BlYy0+Y3VyX2NoX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmNoYW5uZWxfbW9kZXNbc3BlYy0+Y3VyX2NoX21vZGVdLnNlcXVlbmNlKTsKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsX21vZGVzW3NwZWMtPmN1cl9jaF9tb2RlXS5jaGFubmVsczsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqLworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBjbWk5ODgwX2Jhc2ljX21peGVyW10gPSB7CisJLyogQ01JOTg4MCBoYXMgbm8gcGxheWJhY2sgdm9sdW1lcyEgKi8KKwlIREFfQ09ERUNfTVVURSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksIC8qIGZyb250ICovCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqIEZJWE1FOiB0aGUgY29udHJvbHMgYXBwZWFyIGluIHRoZSAicGxheWJhY2siIHZpZXchCisJCSAqLworCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDIsCisJCS5pbmZvID0gY21pX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBjbWlfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gY21pX211eF9lbnVtX3B1dCwKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDA5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MDksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDIzLCAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDIzLCAwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogc2hhcmVkIEkvTyBwaW5zCisgKi8KK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgY21pOTg4MF9jaF9tb2RlX21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBjbWlfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gY21pX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gY21pX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogQVVELWluIHNlbGVjdGlvbnM6CisgKiAweDBiIDB4MGMgMHgwZCAweDBlIDB4MGYgMHgxMCAweDExIDB4MWYgMHgyMAorICovCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggY21pOTg4MF9iYXNpY19tdXggPSB7CisJLm51bV9pdGVtcyA9IDQsCisJLml0ZW1zID0geworCQl7ICJGcm9udCBNaWMiLCAweDUgfSwKKwkJeyAiUmVhciBNaWMiLCAweDIgfSwKKwkJeyAiTGluZSIsIDB4MSB9LAorCQl7ICJDRCIsIDB4NyB9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBjbWk5ODgwX25vX2xpbmVfbXV4ID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiRnJvbnQgTWljIiwgMHg1IH0sCisJCXsgIlJlYXIgTWljIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg3IH0sCisJfQorfTsKKworLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLworc3RhdGljIGhkYV9uaWRfdCBjbWk5ODgwX2RhY19uaWRzWzRdID0geworCTB4MDMsIDB4MDQsIDB4MDUsIDB4MDYKK307CisvKiBBREMwLCBBREMxICovCitzdGF0aWMgaGRhX25pZF90IGNtaTk4ODBfYWRjX25pZHNbMl0gPSB7CisJMHgwOCwgMHgwOQorfTsKKworI2RlZmluZSBDTUlfRElHX09VVF9OSUQJMHgwNworI2RlZmluZSBDTUlfRElHX0lOX05JRAkweDBhCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY21pOTg4MF9iYXNpY19pbml0W10gPSB7CisJLyogcG9ydC1EIGZvciBsaW5lIG91dCAocmVhciBwYW5lbCkgKi8KKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAorCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAorCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKSAqLworCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLworCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcG9ydC1IIGZvciBzaWRlIChyZWFyIHBhbmVsKSAqLworCXsgMHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIENELWluICovCisJeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMS8yICovCisJeyAweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNSB9LAorCXsgMHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDUgfSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGNtaTk4ODBfYWxsb3V0X2luaXRbXSA9IHsKKwkvKiBwb3J0LUQgZm9yIGxpbmUgb3V0IChyZWFyIHBhbmVsKSAqLworCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtQSBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KKwl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAorCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KKwl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAorCS8qIHBvcnQtQyBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwKKwkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLworCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJLyogQ0QtaW4gKi8KKwl7IDB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxLzIgKi8KKwl7IDB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA1IH0sCisJeyAweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNSB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKKy8qCisgKi8KK3N0YXRpYyBpbnQgY21pOTg4MF9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIGNtaTk4ODBfYmFzaWNfbWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChzcGVjLT5zdXJyX3N3aXRjaCkgeworCQllcnIgPSBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgY21pOTg4MF9jaF9tb2RlX21peGVyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoc3BlYy0+ZGlnX2luX25pZCkgeworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9pbl9jdGxzKGNvZGVjLCBzcGVjLT5kaWdfaW5fbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWk5ODgwX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBDTUlfQUxMT1VUKQorCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBjbWk5ODgwX2FsbG91dF9pbml0KTsKKwllbHNlCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGNtaTk4ODBfYmFzaWNfaW5pdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiByZXN1bWUKKyAqLworc3RhdGljIGludCBjbWk5ODgwX3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCWNtaTk4ODBfaW5pdChjb2RlYyk7CisJc25kX2hkYV9yZXN1bWVfY3Rscyhjb2RlYywgY21pOTg4MF9iYXNpY19taXhlcik7CisJaWYgKHNwZWMtPnN1cnJfc3dpdGNoKQorCQlzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBjbWk5ODgwX2NoX21vZGVfbWl4ZXIpOworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkKKwkJc25kX2hkYV9yZXN1bWVfc3BkaWZfb3V0KGNvZGVjKTsKKwlpZiAoc3BlYy0+ZGlnX2luX25pZCkKKwkJc25kX2hkYV9yZXN1bWVfc3BkaWZfaW4oY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIEFuYWxvZyBwbGF5YmFjayBjYWxsYmFja3MKKyAqLworc3RhdGljIGludCBjbWk5ODgwX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCwgc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBjbWk5ODgwX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQl1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkJdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkJZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGNtaTk4ODBfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX2NsZWFudXAoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKKy8qCisgKiBEaWdpdGFsIG91dAorICovCitzdGF0aWMgaW50IGNtaTk4ODBfZGlnX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKK3N0YXRpYyBpbnQgY21pOTg4MF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfY2xvc2UoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKKy8qCisgKiBBbmFsb2cgY2FwdHVyZQorICovCitzdGF0aWMgaW50IGNtaTk4ODBfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSwKKwkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtaTk4ODBfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sIDAsIDAsIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY21pOTg4MF9wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gOCwKKwkubmlkID0gMHgwMywgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLm9wZW4gPSBjbWk5ODgwX3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IGNtaTk4ODBfcGxheWJhY2tfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gY21pOTg4MF9wbGF5YmFja19wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNtaTk4ODBfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMiwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMHgwOCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBjbWk5ODgwX2NhcHR1cmVfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gY21pOTg4MF9jYXB0dXJlX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY21pOTg4MF9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLyogTklEIGlzIHNldCBpbiBjbWk5ODgwX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IGNtaTk4ODBfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSBjbWk5ODgwX2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjbWk5ODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gY21pOTg4MF9idWlsZF9wY21zICovCit9OworCitzdGF0aWMgaW50IGNtaTk4ODBfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY21pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7CisKKwljb2RlYy0+bnVtX3BjbXMgPSAxOworCWNvZGVjLT5wY21faW5mbyA9IGluZm87CisKKwlpbmZvLT5uYW1lID0gIkNNSTk4ODAiOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGNtaTk4ODBfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGNtaTk4ODBfcGNtX2FuYWxvZ19jYXB0dXJlOworCisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkIHx8IHNwZWMtPmRpZ19pbl9uaWQpIHsKKwkJY29kZWMtPm51bV9wY21zKys7CisJCWluZm8rKzsKKwkJaW5mby0+bmFtZSA9ICJDTUk5ODgwIERpZ2l0YWwiOworCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGNtaTk4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0gc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQ7CisJCX0KKwkJaWYgKHNwZWMtPmRpZ19pbl9uaWQpIHsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gY21pOTg4MF9wY21fZGlnaXRhbF9jYXB0dXJlOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+ZGlnX2luX25pZDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbWk5ODgwX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJa2ZyZWUoY29kZWMtPnNwZWMpOworfQorCisvKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBjbWk5ODgwX2NmZ190YmxbXSA9IHsKKwl7IC5tb2RlbG5hbWUgPSAibWluaW1hbCIsIC5jb25maWcgPSBDTUlfTUlOSU1BTCB9LAorCXsgLm1vZGVsbmFtZSA9ICJtaW5fZnAiLCAuY29uZmlnID0gQ01JX01JTl9GUCB9LAorCXsgLm1vZGVsbmFtZSA9ICJmdWxsIiwgLmNvbmZpZyA9IENNSV9GVUxMIH0sCisJeyAubW9kZWxuYW1lID0gImZ1bGxfZGlnIiwgLmNvbmZpZyA9IENNSV9GVUxMX0RJRyB9LAorCXsgLm1vZGVsbmFtZSA9ICJhbGxvdXQiLCAuY29uZmlnID0gQ01JX0FMTE9VVCB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBjbWk5ODgwX3BhdGNoX29wcyA9IHsKKwkuYnVpbGRfY29udHJvbHMgPSBjbWk5ODgwX2J1aWxkX2NvbnRyb2xzLAorCS5idWlsZF9wY21zID0gY21pOTg4MF9idWlsZF9wY21zLAorCS5pbml0ID0gY21pOTg4MF9pbml0LAorCS5mcmVlID0gY21pOTg4MF9mcmVlLAorI2lmZGVmIENPTkZJR19QTQorCS5yZXN1bWUgPSBjbWk5ODgwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBwYXRjaF9jbWk5ODgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYzsKKworCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBjbWk5ODgwX2NmZ190YmwpOworCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CisJCXNuZF9wcmludGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIENNSTk4ODBcbiIpOworCQlzcGVjLT5ib2FyZF9jb25maWcgPSBDTUlfRlVMTF9ESUc7IC8qIHRyeSBldmVyeXRoaW5nICovCisJfQorCisJc3dpdGNoIChzcGVjLT5ib2FyZF9jb25maWcpIHsKKwljYXNlIENNSV9NSU5JTUFMOgorCWNhc2UgQ01JX01JTl9GUDoKKwkJc3BlYy0+c3Vycl9zd2l0Y2ggPSAxOworCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IENNSV9NSU5JTUFMKQorCQkJc3BlYy0+bnVtX2NoX21vZGVzID0gMjsKKwkJZWxzZSB7CisJCQlzcGVjLT5mcm9udF9wYW5lbCA9IDE7CisJCQlzcGVjLT5udW1fY2hfbW9kZXMgPSAzOworCQl9CisJCXNwZWMtPmNoYW5uZWxfbW9kZXMgPSBjbWk5ODgwX2NoYW5uZWxfbW9kZXM7CisJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IGNtaTk4ODBfY2hhbm5lbF9tb2Rlc1swXS5jaGFubmVsczsKKwkJc3BlYy0+aW5wdXRfbXV4ID0gJmNtaTk4ODBfYmFzaWNfbXV4OworCQlicmVhazsKKwljYXNlIENNSV9GVUxMOgorCWNhc2UgQ01JX0ZVTExfRElHOgorCQlzcGVjLT5mcm9udF9wYW5lbCA9IDE7CisJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDg7CisJCXNwZWMtPmlucHV0X211eCA9ICZjbWk5ODgwX2Jhc2ljX211eDsKKwkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBDTUlfRlVMTF9ESUcpIHsKKwkJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQ01JX0RJR19PVVRfTklEOworCQkJc3BlYy0+ZGlnX2luX25pZCA9IENNSV9ESUdfSU5fTklEOworCQl9CisJCWJyZWFrOworCWNhc2UgQ01JX0FMTE9VVDoKKwkJc3BlYy0+ZnJvbnRfcGFuZWwgPSAxOworCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSA4OworCQlzcGVjLT5ub19saW5lX2luID0gMTsKKwkJc3BlYy0+aW5wdXRfbXV4ID0gJmNtaTk4ODBfbm9fbGluZV9tdXg7CisJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQ01JX0RJR19PVVRfTklEOworCQlicmVhazsKKwl9CisKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDQ7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBjbWk5ODgwX2RhY19uaWRzOworCisJc3BlYy0+YWRjX25pZHMgPSBjbWk5ODgwX2FkY19uaWRzOworCisJY29kZWMtPnBhdGNoX29wcyA9IGNtaTk4ODBfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXRjaCBlbnRyaWVzCisgKi8KK3N0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2NtZWRpYVtdID0geworCXsgLmlkID0gMHgxM2Y2OTg4MCwgLm5hbWUgPSAiQ01JOTg4MCIsIC5wYXRjaCA9IHBhdGNoX2NtaTk4ODAgfSwKKyAJeyAuaWQgPSAweDQzNGQ0OTgwLCAubmFtZSA9ICJDTUk5ODgwIiwgLnBhdGNoID0gcGF0Y2hfY21pOTg4MCB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzUwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMCwwICsxLDE1MDMgQEAKKy8qCisgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKKyAqCisgKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIEFMQyAyNjAvODgwLzg4MiBjb2RlY3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUGVpU2VuIEhvdSA8cHNob3VAcmVhbHRlay5jb20udHc+CisgKiAgICAgICAgICAgICAgICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9sb2NhbC5oIgorCisKKy8qIEFMQzg4MCBib2FyZCBjb25maWcgdHlwZSAqLworZW51bSB7CisJQUxDODgwX01JTklNQUwsCisJQUxDODgwXzNTVCwKKwlBTEM4ODBfM1NUX0RJRywKKwlBTEM4ODBfNVNULAorCUFMQzg4MF81U1RfRElHLAorCUFMQzg4MF9XODEwLAorfTsKKworc3RydWN0IGFsY19zcGVjIHsKKwkvKiBjb2RlYyBwYXJhbWV0ZXJpemF0aW9uICovCisJdW5zaWduZWQgaW50IGZyb250X3BhbmVsOiAxOworCisJc25kX2tjb250cm9sX25ld190KiBtaXhlcnNbMl07CisJdW5zaWduZWQgaW50IG51bV9taXhlcnM7CisKKwlzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnM7CisKKwljaGFyKiBzdHJlYW1fbmFtZV9hbmFsb2c7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fYW5hbG9nX3BsYXliYWNrOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19jYXB0dXJlOworCisJY2hhciogc3RyZWFtX25hbWVfZGlnaXRhbDsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2RpZ2l0YWxfY2FwdHVyZTsKKworCS8qIHBsYXliYWNrICovCisJc3RydWN0IGhkYV9tdWx0aV9vdXQgbXVsdGlvdXQ7CisKKwkvKiBjYXB0dXJlICovCisJdW5zaWduZWQgaW50IG51bV9hZGNfbmlkczsKKwloZGFfbmlkX3QgKmFkY19uaWRzOworCWhkYV9uaWRfdCBkaWdfaW5fbmlkOworCisJLyogY2FwdHVyZSBzb3VyY2UgKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBjdXJfbXV4WzNdOworCisJLyogY2hhbm5lbCBtb2RlbCAqLworCWNvbnN0IHN0cnVjdCBhbGNfY2hhbm5lbF9tb2RlICpjaGFubmVsX21vZGU7CisJaW50IG51bV9jaGFubmVsX21vZGU7CisKKwkvKiBQQ00gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOworfTsKKworLyogREFDL0FEQyBhc3NpZ25tZW50ICovCisKK3N0YXRpYyBoZGFfbmlkX3QgYWxjODgwX2RhY19uaWRzWzRdID0geworCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KKwkweDAyLCAweDA1LCAweDA0LCAweDAzCit9OworCitzdGF0aWMgaGRhX25pZF90IGFsYzg4MF93ODEwX2RhY19uaWRzWzNdID0geworCS8qIGZyb250LCByZWFyL3N1cnJvdW5kLCBjbGZlICovCisJMHgwMiwgMHgwMywgMHgwNAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBhbGM4ODBfYWRjX25pZHNbM10gPSB7CisJLyogQURDMC0yICovCisJMHgwNywgMHgwOCwgMHgwOSwKK307CisKKyNkZWZpbmUgQUxDODgwX0RJR09VVF9OSUQJMHgwNgorI2RlZmluZSBBTEM4ODBfRElHSU5fTklECTB4MGEKKworc3RhdGljIGhkYV9uaWRfdCBhbGMyNjBfZGFjX25pZHNbMV0gPSB7CisJLyogZnJvbnQgKi8KKwkweDAyLAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBhbGMyNjBfYWRjX25pZHNbMl0gPSB7CisJLyogQURDMC0xICovCisJMHgwNCwgMHgwNSwKK307CisKKyNkZWZpbmUgQUxDMjYwX0RJR09VVF9OSUQJMHgwMworI2RlZmluZSBBTEMyNjBfRElHSU5fTklECTB4MDYKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNCwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJGcm9udCBNaWMiLCAweDMgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKKy8qCisgKiBpbnB1dCBNVVggaGFuZGxpbmcKKyAqLworc3RhdGljIGludCBhbGNfbXV4X2VudW1faW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKHNwZWMtPmlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IGFsY19tdXhfZW51bV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5jdXJfbXV4W2FkY19pZHhdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY19tdXhfZW51bV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5pbnB1dF9tdXgsIHVjb250cm9sLAorCQkJCSAgICAgc3BlYy0+YWRjX25pZHNbYWRjX2lkeF0sICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdKTsKK30KKworLyoKKyAqIGNoYW5uZWwgbW9kZSBzZXR0aW5nCisgKi8KK3N0cnVjdCBhbGNfY2hhbm5lbF9tb2RlIHsKKwlpbnQgY2hhbm5lbHM7CisJY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXF1ZW5jZTsKK307CisKKworLyoKKyAqIGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDIvNiBjaGFubmVsIHNlbGVjdGlvbiBmb3IgMy1zdGFjaykKKyAqLworCisvKgorICogc2V0IHRoZSBwYXRoIHdheXMgZm9yIDIgY2hhbm5lbCBvdXRwdXQKKyAqIG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBsaW5lIG91dCBhbmQgbWljIDEgcGluIHdpZGdldHMgdG8gaW5wdXRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3RocmVlc3RhY2tfY2gyX2luaXRbXSA9IHsKKwkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBpbnB1dCAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3IgaW5wdXQsIGZvciBtaWMgYWxzbyBlbmFibGUgdGhlIHZyZWYgKi8KKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIG11dGUgdGhlIG91dHB1dCBmb3IgTGluZSBJbiBQVyAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCisJLyogbXV0ZSBmb3IgTWljMSBQVyAqLworCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKiBuZWVkIHRvIHNldCB0aGUgY29kZWMgbGluZSBvdXQgYW5kIG1pYyAxIHBpbiB3aWRnZXRzIHRvIG91dHB1dHMKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdGhyZWVzdGFja19jaDZfaW5pdFtdID0geworCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIG91dHB1dCAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0ICovCisJeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwkvKiB1bm11dGUgdGhlIG91dHB1dCBmb3IgTGluZSBJbiBQVyAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwIH0sCisJLyogdW5tdXRlIGZvciBNaWMxIFBXICovCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDAgfSwKKwkvKiBmb3IgcmVhciBjaGFubmVsIG91dHB1dCB1c2luZyBMaW5lIEluIDEKKwkgKiBzZXQgc2VsZWN0IHdpZGdldCBjb25uZWN0aW9uIChuaWQgPSAweDEyKSAtIHRvIHN1bW1lciBub2RlCisJICogZm9yIHJlYXIgTklEID0gMHgwZi4uLm9mZnNldCAzIGluIGNvbm5lY3Rpb24gbGlzdAorCSAqLworCXsgMHgxMiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MyB9LAorCS8qIGZvciBNaWMxIC0gcmV0YXNrIGZvciBjZW50ZXIvbGZlICovCisJLyogc2V0IHNlbGVjdCB3aWRnZXQgY29ubmVjdGlvbiAobmlkID0gMHgxMCkgLSB0byBzdW1tZXIgbm9kZSBmb3IKKwkgKiBmcm9udCBDTEZFIE5JRCA9IDB4MGUuLi5vZmZzZXQgMiBpbiBjb25uZWN0aW9uIGxpc3QKKwkgKi8KKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDIgfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGFsY19jaGFubmVsX21vZGUgYWxjODgwX3RocmVlc3RhY2tfbW9kZXNbMl0gPSB7CisJeyAyLCBhbGM4ODBfdGhyZWVzdGFja19jaDJfaW5pdCB9LAorCXsgNiwgYWxjODgwX3RocmVlc3RhY2tfY2g2X2luaXQgfSwKK307CisKKworLyoKKyAqIGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDYvOCBjaGFubmVsIHNlbGVjdGlvbiBmb3IgNS1zdGFjaykKKyAqLworCisvKiBzZXQgdGhlIHBhdGggd2F5cyBmb3IgNiBjaGFubmVsIG91dHB1dAorICogbmVlZCB0byBzZXQgdGhlIGNvZGVjIGxpbmUgb3V0IGFuZCBtaWMgMSBwaW4gd2lkZ2V0cyB0byBpbnB1dHMKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfZml2ZXN0YWNrX2NoNl9pbml0W10gPSB7CisJLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3IgaW5wdXQgKi8KKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIG11dGUgdGhlIG91dHB1dCBmb3IgTGluZSBJbiBQVyAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogbmVlZCB0byBzZXQgdGhlIGNvZGVjIGxpbmUgb3V0IGFuZCBtaWMgMSBwaW4gd2lkZ2V0cyB0byBvdXRwdXRzICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9maXZlc3RhY2tfY2g4X2luaXRbXSA9IHsKKwkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBvdXRwdXQgKi8KKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHVubXV0ZSB0aGUgb3V0cHV0IGZvciBMaW5lIEluIFBXICovCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDAgfSwKKwkvKiBvdXRwdXQgZm9yIHN1cnJvdW5kIGNoYW5uZWwgb3V0cHV0IHVzaW5nIExpbmUgSW4gMSAqLworCS8qIHNldCBzZWxlY3Qgd2lkZ2V0IGNvbm5lY3Rpb24gKG5pZCA9IDB4MTIpIC0gdG8gc3VtbWVyIG5vZGUKKwkgKiBmb3Igc3Vycl9yZWFyIE5JRCA9IDB4MGQuLi5vZmZzZXQgMSBpbiBjb25uZWN0aW9uIGxpc3QKKwkgKi8KKwl7IDB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDEgfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGFsY19jaGFubmVsX21vZGUgYWxjODgwX2ZpdmVzdGFja19tb2Rlc1syXSA9IHsKKwl7IDYsIGFsYzg4MF9maXZlc3RhY2tfY2g2X2luaXQgfSwKKwl7IDgsIGFsYzg4MF9maXZlc3RhY2tfY2g4X2luaXQgfSwKK307CisKKy8qCisgKiBjaGFubmVsIHNvdXJjZSBzZXR0aW5nIGZvciBXODEwIHN5c3RlbQorICoKKyAqIFc4MTAgaGFzIHJlYXIgSU8gZm9yOgorICogRnJvbnQgKERBQyAwMikKKyAqIFN1cnJvdW5kIChEQUMgMDMpCisgKiBDZW50ZXIvTEZFIChEQUMgMDQpCisgKiBEaWdpdGFsIG91dCAoMDYpCisgKgorICogVGhlIHN5c3RlbSBhbHNvIGhhcyBhIHBhaXIgb2YgaW50ZXJuYWwgc3BlYWtlcnMsIGFuZCBhIGhlYWRwaG9uZSBqYWNrLgorICogVGhlc2UgYXJlIGJvdGggY29ubmVjdGVkIHRvIExpbmUyIG9uIHRoZSBjb2RlYywgaGVuY2UgdG8gREFDIDAyLgorICogCisgKiBUaGVyZSBpcyBhIHZhcmlhYmxlIHJlc2lzdG9yIHRvIGNvbnRyb2wgdGhlIHNwZWFrZXIgb3IgaGVhZHBob25lCisgKiB2b2x1bWUuIFRoaXMgaXMgYSBoYXJkd2FyZS1vbmx5IGRldmljZSB3aXRob3V0IGEgc29mdHdhcmUgQVBJLgorICoKKyAqIFBsdWdnaW5nIGhlYWRwaG9uZXMgaW4gd2lsbCBkaXNhYmxlIHRoZSBpbnRlcm5hbCBzcGVha2Vycy4gVGhpcyBpcworICogaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUsIG5vdCB2aWEgdGhlIGRyaXZlciB1c2luZyBqYWNrIHNlbnNlLiBJbgorICogYSBzaW1pbGFyIGZhc2hpb24sIHBsdWdnaW5nIGludG8gdGhlIHJlYXIgc29ja2V0IG1hcmtlZCAiZnJvbnQiIHdpbGwKKyAqIGRpc2FibGUgYm90aCB0aGUgc3BlYWtlcnMgYW5kIGhlYWRwaG9uZXMuCisgKgorICogRm9yIGlucHV0LCB0aGVyZSdzIGEgbWljcm9waG9uZSBqYWNrLCBhbmQgYW4gImF1ZGlvIGluIiBqYWNrLgorICogVGhlc2UgbWF5IG5vdCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGlzIGRyaXZlciB5ZXQsIGJlY2F1c2UgSQorICogaGF2ZW4ndCBzZXR1cCBhbnkgaW5pdGlhbGl6YXRpb24gdmVyYnMgZm9yIHRoZXNlIHlldC4uLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYWxjX2NoYW5uZWxfbW9kZSBhbGM4ODBfdzgxMF9tb2Rlc1sxXSA9IHsKKwl7IDYsIE5VTEwgfQorfTsKKworLyoKKyAqLworc3RhdGljIGludCBhbGM4ODBfY2hfbW9kZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzbmRfYXNzZXJ0KHNwZWMtPmNoYW5uZWxfbW9kZSwgcmV0dXJuIC1FTlhJTyk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gMikKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7CisJc3ByaW50Zih1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCAiJWRjaCIsCisJCXNwZWMtPmNoYW5uZWxfbW9kZVt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXS5jaGFubmVscyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjODgwX2NoX21vZGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc25kX2Fzc2VydChzcGVjLT5jaGFubmVsX21vZGUsIHJldHVybiAtRU5YSU8pOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkoc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID09IHNwZWMtPmNoYW5uZWxfbW9kZVswXS5jaGFubmVscykgPyAwIDogMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGM4ODBfY2hfbW9kZV9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IG1vZGU7CisKKwlzbmRfYXNzZXJ0KHNwZWMtPmNoYW5uZWxfbW9kZSwgcmV0dXJuIC1FTlhJTyk7CisJbW9kZSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPyAxIDogMDsKKwlpZiAoc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID09IHNwZWMtPmNoYW5uZWxfbW9kZVttb2RlXS5jaGFubmVscyAmJgorCSAgICAhIGNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCisJLyogY2hhbmdlIHRoZSBjdXJyZW50IGNoYW5uZWwgc2V0dGluZyAqLworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPmNoYW5uZWxfbW9kZVttb2RlXS5jaGFubmVsczsKKwlpZiAoc3BlYy0+Y2hhbm5lbF9tb2RlW21vZGVdLnNlcXVlbmNlKQorCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBzcGVjLT5jaGFubmVsX21vZGVbbW9kZV0uc2VxdWVuY2UpOworCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqLworCisvKiAzLXN0YWNrIG1vZGUKKyAqIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBMaW5lLUluL1JlYXI9MHgxYSwgTWljL0NMRkU9MHgxOCwgRi1NaWM9MHgxYgorICogICAgICAgICAgICAgICAgIEhQPTB4MTkKKyAqLworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBhbGM4ODBfYmFzZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTgsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MTgsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE5LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqIEZJWE1FOiB0aGUgY29udHJvbHMgYXBwZWFyIGluIHRoZSAicGxheWJhY2siIHZpZXchCisJCSAqLworCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDIsCisJCS5pbmZvID0gYWxjX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjX211eF9lbnVtX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjODgwX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsYzg4MF9jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsYzg4MF9jaF9tb2RlX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIDUtc3RhY2sgbW9kZQorICogUGluIGFzc2lnbm1lbnQ6IEZyb250PTB4MTQsIFJlYXI9MHgxNywgQ0xGRT0weDE2CisgKiAgICAgICAgICAgICAgICAgTGluZS1Jbi9TaWRlPTB4MWEsIE1pYz0weDE4LCBGLU1pYz0weDFiLCBIUD0weDE5CisgKi8KK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgYWxjODgwX2ZpdmVfc3RhY2tfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxOSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKKwkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgorCQkgKiBGSVhNRTogdGhlIGNvbnRyb2xzIGFwcGVhciBpbiB0aGUgInBsYXliYWNrIiB2aWV3IQorCQkgKi8KKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAorCQkuaW5mbyA9IGFsYzg4MF9jaF9tb2RlX2luZm8sCisJCS5nZXQgPSBhbGM4ODBfY2hfbW9kZV9nZXQsCisJCS5wdXQgPSBhbGM4ODBfY2hfbW9kZV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IGFsYzg4MF93ODEwX2Jhc2VfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAyLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKKwkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgorCQkgKiBGSVhNRTogdGhlIGNvbnRyb2xzIGFwcGVhciBpbiB0aGUgInBsYXliYWNrIiB2aWV3IQorCQkgKi8KKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAzLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICovCitzdGF0aWMgaW50IGFsY19idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgeworCQllcnIgPSBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXJzW2ldKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgeworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX2luX2N0bHMoY29kZWMsIHNwZWMtPmRpZ19pbl9uaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGl6ZSB0aGUgY29kZWMgdm9sdW1lcywgZXRjCisgKi8KKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfaW5pdF92ZXJic190aHJlZV9zdGFja1tdID0geworCS8qIExpbmUgSW4gcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCS8qIE1pYzEgKHJlYXIgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCS8qIE1pYzIgKGZyb250IHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKKwkvKiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCisJLyogc2V0IGNvbm5lY3Rpb24gc2VsZWN0IHRvIGxpbmUgaW4gKGRlZmF1bHQgc2VsZWN0IGZvciB0aGlzIEFEQykgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCS8qIHVubXV0ZSBmcm9udCBtaXhlciBhbXAgbGVmdCAodm9sdW1lID0gMCkgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIHVubXV0ZSByZWFyIG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIHVubXV0ZSByZWFyIG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCisJLyogdXNpbmcgcmVhciBzdXJyb3VuZCBhcyB0aGUgcGF0aCBmb3IgaGVhZHBob25lIG91dHB1dCAqLworCS8qIHVubXV0ZSByZWFyIHN1cnJvdW5kIG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBQQVNEIDMgc3RhY2sgYm9hcmRzIHVzZSB0aGUgTWljIDIgYXMgdGhlIGhlYWRwaG9uZSBvdXRwdXQgKi8KKwkvKiBuZWVkIHRvIHByb2dyYW0gdGhlIHNlbGVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWljIDIgcGluIHdpZGdldCB0bworCSAqIHN1cnJvdW5kIHBhdGggKGluZGV4IDB4MDEpIGZvciBoZWFkcGhvbmUgb3V0cHV0ICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIG5lZWQgdG8gcmV0YXNrIHRoZSBNaWMgMiBwaW4gd2lkZ2V0IHRvIG91dHB1dCAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBmb3IgbWl4ZXIgd2lkZ2V0KG5pZD0weDBCKQorCSAqIHRvIHN1cHBvcnQgdGhlIGlucHV0IHBhdGggb2YgYW5hbG9nIGxvb3BiYWNrCisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQgcGFuZWwKKwkgKiBtaWMgKG1pYyAyKQorCSAqLworCS8qIEFtcCBJbmRleGVzOiBDRCA9IDB4MDQsIExpbmUgSW4gMSA9IDB4MDIsIE1pYyAxID0gMHgwMCAmIExpbmUgSW4gMiA9IDB4MDMgKi8KKwkvKiB1bm11dGUgQ0QgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sCisJLyogdW5tdXRlIExpbmUgSW4gKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCisJLyogdW5tdXRlIE1pYyAxICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCS8qIHVubXV0ZSBMaW5lIEluIDIgKGZvciBQQVNEIGJvYXJkcyBNaWMgMikgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyBmb3IgdGhlIGxpbmUgb3V0IHBhdGhzIHRvIHN1cHBvcnQgdGhlIG91dHB1dCBwYXRoIG9mCisJICogYW5hbG9nIGxvb3BiYWNrCisJICogdGhlIG1peGVycyBvbiB0aGUgb3V0cHV0IHBhdGggaGFzIDIgaW5wdXRzLCBvbmUgZnJvbSB0aGUgREFDIGFuZCBvbmUKKwkgKiBmcm9tIHRoZSBtaXhlcgorCSAqLworCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCisJLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgU3Vycm91bmQgKHVzZWQgYXMgSFApIG91dCBwYXRoICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgQy9MRkUgb3V0IHBhdGggKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSl9LCAvKiBtdXRlICovCisJLyogVW5tdXRlIHJlYXIgU3Vycm91bmQgb3V0IHBhdGggKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9pbml0X3ZlcmJzX2ZpdmVfc3RhY2tbXSA9IHsKKwkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKwkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKKwkvKiBNaWMyIChmcm9udCBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJLyogdW5tdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDB9LAorCS8qIHNldCBjb25uZWN0aW9uIHNlbGVjdCB0byBsaW5lIGluIChkZWZhdWx0IHNlbGVjdCBmb3IgdGhpcyBBREMpICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKKwkvKiB1bm11dGUgZnJvbnQgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJLyogZml2ZSByZWFyIGFuZCBjbGZlICovCisJLyogdW5tdXRlIHJlYXIgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAgKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIHVubXV0ZSBjbGZlIG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCisJLyogdXNpbmcgcmVhciBzdXJyb3VuZCBhcyB0aGUgcGF0aCBmb3IgaGVhZHBob25lIG91dHB1dCAqLworCS8qIHVubXV0ZSByZWFyIHN1cnJvdW5kIG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBQQVNEIDMgc3RhY2sgYm9hcmRzIHVzZSB0aGUgTWljIDIgYXMgdGhlIGhlYWRwaG9uZSBvdXRwdXQgKi8KKwkvKiBuZWVkIHRvIHByb2dyYW0gdGhlIHNlbGVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWljIDIgcGluIHdpZGdldCB0bworCSAqIHN1cnJvdW5kIHBhdGggKGluZGV4IDB4MDEpIGZvciBoZWFkcGhvbmUgb3V0cHV0CisJICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIG5lZWQgdG8gcmV0YXNrIHRoZSBNaWMgMiBwaW4gd2lkZ2V0IHRvIG91dHB1dCAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBmb3IgbWl4ZXIKKwkgKiB3aWRnZXQobmlkPTB4MEIpIHRvIHN1cHBvcnQgdGhlIGlucHV0IHBhdGggb2YgYW5hbG9nIGxvb3BiYWNrCisJICovCisJLyogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQgcGFuZWwgbWljIChtaWMgMikgKi8KKwkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJiBMaW5lIEluIDIgPSAweDAzKi8KKwkvKiB1bm11dGUgQ0QgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sCisJLyogdW5tdXRlIExpbmUgSW4gKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCisJLyogdW5tdXRlIE1pYyAxICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCS8qIHVubXV0ZSBMaW5lIEluIDIgKGZvciBQQVNEIGJvYXJkcyBNaWMgMikgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyBmb3IgdGhlIGxpbmUgb3V0IHBhdGhzIHRvIHN1cHBvcnQgdGhlIG91dHB1dCBwYXRoIG9mCisJICogYW5hbG9nIGxvb3BiYWNrCisJICogdGhlIG1peGVycyBvbiB0aGUgb3V0cHV0IHBhdGggaGFzIDIgaW5wdXRzLCBvbmUgZnJvbSB0aGUgREFDIGFuZAorCSAqIG9uZSBmcm9tIHRoZSBtaXhlcgorCSAqLworCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCisJLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgU3Vycm91bmQgKHVzZWQgYXMgSFApIG91dCBwYXRoICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgQy9MRkUgb3V0IHBhdGggKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSl9LCAvKiBtdXRlICovCisJLyogVW5tdXRlIHJlYXIgU3Vycm91bmQgb3V0IHBhdGggKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF93ODEwX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBmcm9udCBjaGFubmVsIHNlbGVjdG9yL2FtcDogaW5wdXQgMDogREFDOiB1bm11dGVkLCAobm8gdm9sdW1lIHNlbGVjdGlvbikgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKKworCS8qIGZyb250IGNoYW5uZWwgc2VsZWN0b3IvYW1wOiBpbnB1dCAxOiBjYXB0dXJlIG1peDogbXV0ZWQsIChubyB2b2x1bWUgc2VsZWN0aW9uKSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcxODB9LAorCisJLyogZnJvbnQgY2hhbm5lbCBzZWxlY3Rvci9hbXA6IG91dHB1dCAwOiB1bm11dGVkLCBtYXggdm9sdW1lICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisKKwkvKiBmcm9udCBvdXQgcGluOiBtdXRlZCwgKG5vIHZvbHVtZSBzZWxlY3Rpb24pICAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCisJLyogZnJvbnQgb3V0IHBpbjogTk9UIGhlYWRwaG9uZSBlbmFibGUsIG91dCBlbmFibGUsIHZyZWYgZGlzYWJsZWQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKworCisJLyogc3Vycm91bmQgY2hhbm5lbCBzZWxlY3Rvci9hbXA6IGlucHV0IDA6IERBQzogdW5tdXRlZCwgKG5vIHZvbHVtZSBzZWxlY3Rpb24pICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCisKKwkvKiBzdXJyb3VuZCBjaGFubmVsIHNlbGVjdG9yL2FtcDogaW5wdXQgMTogY2FwdHVyZSBtaXg6IG11dGVkLCAobm8gdm9sdW1lIHNlbGVjdGlvbikgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MTgwfSwKKworCS8qIHN1cnJvdW5kIGNoYW5uZWwgc2VsZWN0b3IvYW1wOiBvdXRwdXQgMDogdW5tdXRlZCwgbWF4IHZvbHVtZSAqLworCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCisJLyogc3Vycm91bmQgb3V0IHBpbjogbXV0ZWQsIChubyB2b2x1bWUgc2VsZWN0aW9uKSAgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKworCS8qIHN1cnJvdW5kIG91dCBwaW46IE5PVCBoZWFkcGhvbmUgZW5hYmxlLCBvdXQgZW5hYmxlLCB2cmVmIGRpc2FibGVkICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisKKworCS8qIGMvbGZlIGNoYW5uZWwgc2VsZWN0b3IvYW1wOiBpbnB1dCAwOiBEQUM6IHVubXV0ZWQsIChubyB2b2x1bWUgc2VsZWN0aW9uKSAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDB9LAorCisJLyogYy9sZmUgY2hhbm5lbCBzZWxlY3Rvci9hbXA6IGlucHV0IDE6IGNhcHR1cmUgbWl4OiBtdXRlZCwgKG5vIHZvbHVtZSBzZWxlY3Rpb24pICovCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzE4MH0sCisKKwkvKiBjL2xmZSBjaGFubmVsIHNlbGVjdG9yL2FtcDogb3V0cHV0IDA6IHVubXV0ZWQsIG1heCB2b2x1bWUgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKworCS8qIGMvbGZlIG91dCBwaW46IG11dGVkLCAobm8gdm9sdW1lIHNlbGVjdGlvbikgICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisKKwkvKiBjL2xmZSBvdXQgcGluOiBOT1QgaGVhZHBob25lIGVuYWJsZSwgb3V0IGVuYWJsZSwgdnJlZiBkaXNhYmxlZCAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCisKKwkvKiBocGhvbmUvc3BlYWtlciBpbnB1dCBzZWxlY3RvcjogZnJvbnQgREFDICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAorCisJLyogaHBob25lL3NwZWFrZXIgb3V0IHBpbjogbXV0ZWQsIChubyB2b2x1bWUgc2VsZWN0aW9uKSAgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKworCS8qIGhwaG9uZS9zcGVha2VyIG91dCBwaW46IE5PVCBoZWFkcGhvbmUgZW5hYmxlLCBvdXQgZW5hYmxlLCB2cmVmIGRpc2FibGVkICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisKKworCXsgfQorfTsKKworc3RhdGljIGludCBhbGNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBzcGVjLT5pbml0X3ZlcmJzKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIHJlc3VtZQorICovCitzdGF0aWMgaW50IGFsY19yZXN1bWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlhbGNfaW5pdChjb2RlYyk7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgeworCQlzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBzcGVjLT5taXhlcnNbaV0pOworCX0KKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX291dChjb2RlYyk7CisJaWYgKHNwZWMtPmRpZ19pbl9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX2luKGNvZGVjKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBBbmFsb2cgcGxheWJhY2sgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBpbnQgYWxjODgwX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjODgwX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkgICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkJZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGFsYzg4MF9wbGF5YmFja19wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworLyoKKyAqIERpZ2l0YWwgb3V0CisgKi8KK3N0YXRpYyBpbnQgYWxjODgwX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworc3RhdGljIGludCBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworLyoKKyAqIEFuYWxvZyBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgYWxjODgwX2NhcHR1cmVfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sCisJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGM4ODBfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sIDAsIDAsIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSA4LAorCS5uaWQgPSAweDAyLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IGFsYzg4MF9wbGF5YmFja19wY21fb3BlbiwKKwkJLnByZXBhcmUgPSBhbGM4ODBfcGxheWJhY2tfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gYWxjODgwX3BsYXliYWNrX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDIsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4MDcsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gYWxjODgwX2NhcHR1cmVfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gYWxjODgwX2NhcHR1cmVfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IGFsYzg4MF9kaWdfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IGFsYzg4MF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KK307CisKK3N0YXRpYyBpbnQgYWxjX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOworCWludCBpOworCisJY29kZWMtPm51bV9wY21zID0gMTsKKwljb2RlYy0+cGNtX2luZm8gPSBpbmZvOworCisJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSAqKHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2spOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKihzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUpOworCisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9jaGFubmVsX21vZGU7IGkrKykgeworCQlpZiAoc3BlYy0+Y2hhbm5lbF9tb2RlW2ldLmNoYW5uZWxzID4gaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCkgeworCQkgICAgaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9IHNwZWMtPmNoYW5uZWxfbW9kZVtpXS5jaGFubmVsczsKKwkJfQorCX0KKworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCB8fCBzcGVjLT5kaWdfaW5fbmlkKSB7CisJCWNvZGVjLT5udW1fcGNtcysrOworCQlpbmZvKys7CisJCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsOworCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOworCQl9CisJCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSk7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5kaWdfaW5fbmlkOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsY19mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWtmcmVlKGNvZGVjLT5zcGVjKTsKK30KKworLyoKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIGFsY19wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gYWxjX2J1aWxkX2NvbnRyb2xzLAorCS5idWlsZF9wY21zID0gYWxjX2J1aWxkX3BjbXMsCisJLmluaXQgPSBhbGNfaW5pdCwKKwkuZnJlZSA9IGFsY19mcmVlLAorI2lmZGVmIENPTkZJR19QTQorCS5yZXN1bWUgPSBhbGNfcmVzdW1lLAorI2VuZGlmCit9OworCisvKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGM4ODBfY2ZnX3RibFtdID0geworCS8qIEJhY2sgMyBqYWNrLCBmcm9udCAyIGphY2sgKi8KKwl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwMCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwMiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwMywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwNSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwOCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwOSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwYSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwYiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwYywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwZCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwZSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIwZiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIxMCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIxMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIxNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwMiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwMywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTQwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4YTEwMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4MzAzMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDAzNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDAzNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDAzOCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDA0MCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDA0MSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKKworCS8qIEJhY2sgMyBqYWNrLCBmcm9udCAyIGphY2sgKEludGVybmFsIGFkZCBBdXgtSW4pICovCisJeyAucGNpX3ZlbmRvciA9IDB4MTAyNSwgLnBjaV9kZXZpY2UgPSAweGUzMTAsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCisKKwkvKiBCYWNrIDMgamFjayBwbHVzIDEgU1BESUYgb3V0IGphY2ssIGZyb250IDIgamFjayAqLworCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnb3V0IiwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCisJeyAucGNpX3ZlbmRvciA9IDB4ODA4NiwgLnBjaV9kZXZpY2UgPSAweGUzMDgsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAorCisJLyogQmFjayAzIGphY2sgcGx1cyAxIFNQRElGIG91dCBqYWNrLCBmcm9udCAyIGphY2sgKEludGVybmFsIGFkZCBBdXgtSW4pKi8KKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTMwNSwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCisJeyAucGNpX3ZlbmRvciA9IDB4ODA4NiwgLnBjaV9kZXZpY2UgPSAweGQ0MDIsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAorCXsgLnBjaV92ZW5kb3IgPSAweDEwMjUsIC5wY2lfZGV2aWNlID0gMHhlMzA5LCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKKworCS8qIEJhY2sgNSBqYWNrLCBmcm9udCAyIGphY2sgKi8KKwl7IC5tb2RlbG5hbWUgPSAiNXN0YWNrIiwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4MzAzMywgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4NDAzOSwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDdiLCAucGNpX2RldmljZSA9IDB4MzAzMiwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxMDNjLCAucGNpX2RldmljZSA9IDB4MmEwOSwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKKworCS8qIEJhY2sgNSBqYWNrIHBsdXMgMSBTUERJRiBvdXQgamFjaywgZnJvbnQgMiBqYWNrICovCisJeyAubW9kZWxuYW1lID0gIjVzdGFjay1kaWdvdXQiLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTIyNCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCisJeyAucGNpX3ZlbmRvciA9IDB4ODA4NiwgLnBjaV9kZXZpY2UgPSAweGU0MDAsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAorCXsgLnBjaV92ZW5kb3IgPSAweDgwODYsIC5wY2lfZGV2aWNlID0gMHhlNDAxLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4ZTQwMiwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCisJeyAucGNpX3ZlbmRvciA9IDB4ODA4NiwgLnBjaV9kZXZpY2UgPSAweGQ0MDAsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAorCXsgLnBjaV92ZW5kb3IgPSAweDgwODYsIC5wY2lfZGV2aWNlID0gMHhkNDAxLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHg4MDg2LCAucGNpX2RldmljZSA9IDB4YTEwMCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCisJeyAucGNpX3ZlbmRvciA9IDB4MTU2NSwgLnBjaV9kZXZpY2UgPSAweDgyMDIsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAorCisJeyAubW9kZWxuYW1lID0gInc4MTAiLCAuY29uZmlnID0gQUxDODgwX1c4MTAgfSwKKwl7IC5wY2lfdmVuZG9yID0gMHgxNjFmLCAucGNpX2RldmljZSA9IDB4MjAzZCwgLmNvbmZpZyA9IEFMQzg4MF9XODEwIH0sCisKKwl7fQorfTsKKworc3RhdGljIGludCBwYXRjaF9hbGM4ODAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjOworCWludCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGM4ODBfY2ZnX3RibCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKKwkJc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDODgwXG4iKTsKKwkJYm9hcmRfY29uZmlnID0gQUxDODgwX01JTklNQUw7CisJfQorCisJc3dpdGNoIChib2FyZF9jb25maWcpIHsKKwljYXNlIEFMQzg4MF9XODEwOgorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4ODBfdzgxMF9iYXNlX21peGVyOworCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJCWJyZWFrOworCWNhc2UgQUxDODgwXzVTVDoKKwljYXNlIEFMQzg4MF81U1RfRElHOgorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4ODBfZml2ZV9zdGFja19taXhlcjsKKwkJc3BlYy0+bnVtX21peGVycysrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4ODBfYmFzZV9taXhlcjsKKwkJc3BlYy0+bnVtX21peGVycysrOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgeworCWNhc2UgQUxDODgwXzNTVF9ESUc6CisJY2FzZSBBTEM4ODBfNVNUX0RJRzoKKwljYXNlIEFMQzg4MF9XODEwOgorCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgeworCWNhc2UgQUxDODgwXzNTVDoKKwljYXNlIEFMQzg4MF8zU1RfRElHOgorCWNhc2UgQUxDODgwXzVTVDoKKwljYXNlIEFMQzg4MF81U1RfRElHOgorCWNhc2UgQUxDODgwX1c4MTA6CisJCXNwZWMtPmZyb250X3BhbmVsID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChib2FyZF9jb25maWcpIHsKKwljYXNlIEFMQzg4MF81U1Q6CisJY2FzZSBBTEM4ODBfNVNUX0RJRzoKKwkJc3BlYy0+aW5pdF92ZXJicyA9IGFsYzg4MF9pbml0X3ZlcmJzX2ZpdmVfc3RhY2s7CisJCXNwZWMtPmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9maXZlc3RhY2tfbW9kZXM7CisJCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9maXZlc3RhY2tfbW9kZXMpOworCQlicmVhazsKKwljYXNlIEFMQzg4MF9XODEwOgorCQlzcGVjLT5pbml0X3ZlcmJzID0gYWxjODgwX3c4MTBfaW5pdF92ZXJiczsKKwkJc3BlYy0+Y2hhbm5lbF9tb2RlID0gYWxjODgwX3c4MTBfbW9kZXM7CisJCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF93ODEwX21vZGVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3BlYy0+aW5pdF92ZXJicyA9IGFsYzg4MF9pbml0X3ZlcmJzX3RocmVlX3N0YWNrOworCQlzcGVjLT5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlczsKKwkJc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpOworCQlicmVhazsKKwl9CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDODgwIEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM4ODBfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZTsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiQUxDODgwIERpZ2l0YWwiOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg4MF9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbF9tb2RlWzBdLmNoYW5uZWxzOworCisJc3dpdGNoIChib2FyZF9jb25maWcpIHsKKwljYXNlIEFMQzg4MF9XODEwOgorCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX3c4MTBfZGFjX25pZHMpOworCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IGFsYzg4MF93ODEwX2RhY19uaWRzOworCQkvLyBObyBkZWRpY2F0ZWQgaGVhZHBob25lIHNvY2tldCAtIGl0J3Mgc2hhcmVkIHdpdGggYnVpbHQtaW4gc3BlYWtlcnMuCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpOworCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkczsKKwkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMHgwMzsgLyogcmVhci1zdXJyb3VuZCBOSUQgKi8KKwkJYnJlYWs7CisJfQorCisJc3BlYy0+aW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZTsKKwlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4MF9hZGNfbmlkcyk7CisJc3BlYy0+YWRjX25pZHMgPSBhbGM4ODBfYWRjX25pZHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKworCXJldHVybiAwOworfQorCisvKgorICogQUxDMjYwIHN1cHBvcnQKKyAqLworCisvKgorICogVGhpcyBpcyBqdXN0IHBsYWNlLWhvbGRlciwgc28gdGhlcmUncyBzb21ldGhpbmcgZm9yIGFsY19idWlsZF9wY21zIHRvIGxvb2sKKyAqIGF0IHdoZW4gaXQgY2FsY3VsYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMuIEFMQzI2MCBoYXMgbm8gbWl4ZXIKKyAqIGVsZW1lbnQgd2hpY2ggYWxsb3dzIGNoYW5naW5nIHRoZSBjaGFubmVsIG1vZGUsIHNvIHRoZSB2ZXJiIGxpc3QgaXMKKyAqIG5ldmVyIHVzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWxjX2NoYW5uZWxfbW9kZSBhbGMyNjBfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0sCit9OworCitzbmRfa2NvbnRyb2xfbmV3X3QgYWxjMjYwX2Jhc2VfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9PVVRQVVQpLAorCS8qIHVzZSBMSU5FMiBmb3IgdGhlIG91dHB1dCAqLworCS8qIEhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLCAqLworCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxMSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDQsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9pbml0X3ZlcmJzW10gPSB7CisJLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCS8qIENEIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCS8qIExJTkUtMiBpcyB1c2VkIGZvciBsaW5lLW91dCBpbiByZWFyICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJLyogc2VsZWN0IGxpbmUtb3V0ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBMSU5FLU9VVCBwaW4gKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBlbmFibGUgSFAgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBlbmFibGUgTW9ubyAqLworCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCS8qIHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKKwkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogdW5tdXRlIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCS8qIHVubXV0ZSBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKwkvKiB1bm11dGUgTW9ubyBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKwkvKiBtdXRlIExJTkUtMiBvdXQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKwkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJiBMaW5lIEluIDIgPSAweDAzICovCisJLyogdW5tdXRlIENEICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAorCS8qIHVubXV0ZSBMaW5lIEluICovCisJezB4MDcsICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKKwkvKiB1bm11dGUgTWljICovCisJezB4MDcsICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwkvKiBBbXAgSW5kZXhlczogREFDID0gMHgwMSAmIG1peGVyID0gMHgwMCAqLworCS8qIFVubXV0ZSBGcm9udCBvdXQgcGF0aCAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJLyogVW5tdXRlIEhlYWRwaG9uZSBvdXQgcGF0aCAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJLyogVW5tdXRlIE1vbm8gb3V0IHBhdGggKi8KKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGMyNjBfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4MiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjMjYwX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4NCwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjMjYwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKKworCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gYWxjMjYwX2Jhc2VfbWl4ZXI7CisJc3BlYy0+bnVtX21peGVycysrOworCisJc3BlYy0+aW5pdF92ZXJicyA9IGFsYzI2MF9pbml0X3ZlcmJzOworCXNwZWMtPmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlczsKKwlzcGVjLT5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpOworCisJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIkFMQzI2MCBBbmFsb2ciOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmYWxjMjYwX3BjbV9hbmFsb2dfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJmFsYzI2MF9wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsX21vZGVbMF0uY2hhbm5lbHM7CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyk7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHM7CisKKwlzcGVjLT5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlOworCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FkY19uaWRzKTsKKwlzcGVjLT5hZGNfbmlkcyA9IGFsYzI2MF9hZGNfbmlkczsKKworCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBTEM4ODIgc3VwcG9ydAorICoKKyAqIEFMQzg4MiBpcyBhbG1vc3QgaWRlbnRpY2FsIHdpdGggQUxDODgwIGJ1dCBoYXMgY2xlYW5lciBhbmQgbW9yZSBmbGV4aWJsZQorICogY29uZmlndXJhdGlvbi4gIEVhY2ggcGluIHdpZGdldCBjYW4gY2hvb3NlIGFueSBpbnB1dCBEQUNzIGFuZCBhIG1peGVyLgorICogRWFjaCBBREMgaXMgY29ubmVjdGVkIGZyb20gYSBtaXhlciBvZiBhbGwgaW5wdXRzLiAgVGhpcyBtYWtlcyBwb3NzaWJsZQorICogNi1jaGFubmVsIGluZGVwZW5kZW50IGNhcHR1cmVzLgorICoKKyAqIEluIGFkZGl0aW9uLCBhbiBpbmRlcGVuZGVudCBEQUMgZm9yIHRoZSBtdWx0aS1wbGF5YmFjayAobm90IHVzZWQgaW4gdGhpcworICogZHJpdmVyIHlldCkuCisgKi8KKworc3RhdGljIHN0cnVjdCBhbGNfY2hhbm5lbF9tb2RlIGFsYzg4Ml9jaF9tb2Rlc1sxXSA9IHsKKwl7IDgsIE5VTEwgfQorfTsKKworc3RhdGljIGhkYV9uaWRfdCBhbGM4ODJfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLworCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUKK307CisKK3N0YXRpYyBoZGFfbmlkX3QgYWxjODgyX2FkY19uaWRzWzNdID0geworCS8qIEFEQzAtMiAqLworCTB4MDcsIDB4MDgsIDB4MDksCit9OworCisvKiBpbnB1dCBNVVggKi8KKy8qIEZJWE1FOiBzaG91bGQgYmUgYSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODJfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDQsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwl9LAorfTsKKworI2RlZmluZSBhbGM4ODJfbXV4X2VudW1faW5mbyBhbGNfbXV4X2VudW1faW5mbworI2RlZmluZSBhbGM4ODJfbXV4X2VudW1fZ2V0IGFsY19tdXhfZW51bV9nZXQKKworc3RhdGljIGludCBhbGM4ODJfbXV4X2VudW1fcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gc3BlYy0+aW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJc3RhdGljIGhkYV9uaWRfdCBjYXB0dXJlX21peGVyc1szXSA9IHsgMHgyNCwgMHgyMywgMHgyMiB9OworCWhkYV9uaWRfdCBuaWQgPSBjYXB0dXJlX21peGVyc1thZGNfaWR4XTsKKwl1bnNpZ25lZCBpbnQgKmN1cl92YWwgPSAmc3BlYy0+Y3VyX211eFthZGNfaWR4XTsKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCisJaWR4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKKwkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKKwlpZiAoKmN1cl92YWwgPT0gaWR4ICYmICEgY29kZWMtPmluX3Jlc3VtZSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IGltdXgtPm51bV9pdGVtczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2ID0gKGkgPT0gaWR4KSA/IDB4NzAwMCA6IDB4NzA4MDsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCSAgICB2IHwgKGltdXgtPml0ZW1zW2ldLmluZGV4IDw8IDgpKTsKKwl9CisJKmN1cl92YWwgPSBpZHg7CisJcmV0dXJuIDE7Cit9CisKKy8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3CisgKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKKyAqLworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBhbGM4ODJfYmFzZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAyLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDMsCisJCS5pbmZvID0gYWxjODgyX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODJfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgyX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBGcm9udCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCS8qIFJlYXIgbWl4ZXIgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJLyogQ0xGRSBtaXhlciAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwkvKiBTaWRlIG1peGVyICovCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCisJLyogRnJvbnQgUGluOiB0byBvdXRwdXQgbW9kZSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCS8qIEZyb250IFBpbjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIHZvbHVtZSkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKwkvKiBzZWxlY3QgRnJvbnQgbWl4ZXIgKDB4MGMsIGluZGV4IDApICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBSZWFyIFBpbiAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCS8qIFJlYXIgUGluOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAobm8gdm9sdW1lKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIHNlbGVjdCBSZWFyIG1peGVyICgweDBkLCBpbmRleCAxKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJLyogQ0xGRSBQaW4gKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBDTEZFIFBpbjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIHZvbHVtZSkgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKwkvKiBzZWxlY3QgQ0xGRSBtaXhlciAoMHgwZSwgaW5kZXggMikgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCS8qIFNpZGUgUGluICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJLyogU2lkZSBQaW46IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyB2b2x1bWUpICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJLyogc2VsZWN0IFNpZGUgbWl4ZXIgKDB4MGYsIGluZGV4IDMpICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKKwkvKiBIZWFkcGhvbmUgUGluICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJLyogSGVhZHBob25lIFBpbjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIHZvbHVtZSkgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKwkvKiBzZWxlY3QgRnJvbnQgbWl4ZXIgKDB4MGMsIGluZGV4IDApICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBNaWMgKHJlYXIpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCS8qIEZyb250IE1pYyBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKKwkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKworCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLworCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKKwkvKiBJbnB1dCBtaXhlcjIgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA0IDw8IDgpKX0sCisJLyogSW5wdXQgbWl4ZXIzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDMgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAorCS8qIEFEQzE6IHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKKwkvKiBBREMyOiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCisJLyogQURDMzogdW5tdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDB9LAorCisJLyogVW5tdXRlIGZyb250IGxvb3BiYWNrICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCS8qIFVubXV0ZSByZWFyIGxvb3BiYWNrICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCS8qIE11dGUgQ0xGRSBsb29wYmFjayAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgc2lkZSBsb29wYmFjayAqLworCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKworCXsgfQorfTsKKworc3RhdGljIGludCBwYXRjaF9hbGM4ODIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjOworCisJc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4ODJfYmFzZV9taXhlcjsKKwlzcGVjLT5udW1fbWl4ZXJzKys7CisKKwlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklEOworCXNwZWMtPmRpZ19pbl9uaWQgPSBBTEM4ODBfRElHSU5fTklEOworCXNwZWMtPmZyb250X3BhbmVsID0gMTsKKwlzcGVjLT5pbml0X3ZlcmJzID0gYWxjODgyX2luaXRfdmVyYnM7CisJc3BlYy0+Y2hhbm5lbF9tb2RlID0gYWxjODgyX2NoX21vZGVzOworCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4Ml9jaF9tb2Rlcyk7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDODgyIEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM4ODBfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZTsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiQUxDODgyIERpZ2l0YWwiOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg4MF9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+Y2hhbm5lbF9tb2RlWzBdLmNoYW5uZWxzOworCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpOworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzOworCisJc3BlYy0+aW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZTsKKwlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyk7CisJc3BlYy0+YWRjX25pZHMgPSBhbGM4ODJfYWRjX25pZHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKworCXJldHVybiAwOworfQorCisvKgorICogcGF0Y2ggZW50cmllcworICovCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9yZWFsdGVrW10gPSB7CisJeyAuaWQgPSAweDEwZWMwMjYwLCAubmFtZSA9ICJBTEMyNjAiLCAucGF0Y2ggPSBwYXRjaF9hbGMyNjAgfSwKKyAJeyAuaWQgPSAweDEwZWMwODgwLCAubmFtZSA9ICJBTEM4ODAiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODAgfSwKKwl7IC5pZCA9IDB4MTBlYzA4ODIsIC5uYW1lID0gIkFMQzg4MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9NYWtlZmlsZSBiL3NvdW5kL3BjaS9pY2UxNzEyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzdjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciBBTFNBCisjIENvcHlyaWdodCAoYykgMjAwMSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisjCisKK3NuZC1pY2UxN3h4LWFrNHh4eC1vYmpzIDo9IGFrNHh4eC5vCitzbmQtaWNlMTcxMi1vYmpzIDo9IGljZTE3MTIubyBkZWx0YS5vIGhvb250ZWNoLm8gZXdzLm8KK3NuZC1pY2UxNzI0LW9ianMgOj0gaWNlMTcyNC5vIGFtcC5vIHJldm8ubyBhdXJlb24ubyB2dDE3MjBfbW9iby5vIHBvbnRpcy5vIHByb2RpZ3kxOTIubyBqdWxpLm8gcGhhc2UubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX0lDRTE3MTIpICs9IHNuZC1pY2UxNzEyLm8gc25kLWljZTE3eHgtYWs0eHh4Lm8KK29iai0kKENPTkZJR19TTkRfSUNFMTcyNCkgKz0gc25kLWljZTE3MjQubyBzbmQtaWNlMTd4eC1hazR4eHgubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYWs0eHh4LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlkYzAyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYWs0eHh4LmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkKKyAqCisgKiAgIEFLNDUyNCAvIEFLNDUyOCAvIEFLNDUyOSAvIEFLNDM1NSAvIEFLNDM4MSBpbnRlcmZhY2UKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSAiaWNlMTcxMi5oIgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklDRW5zZW1ibGUgSUNFMTd4eCA8LT4gQUs0eHh4IEFEL0RBIGNoaXAgaW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX2FrbTR4eHhfbG9jayhha200eHh4X3QgKmFrLCBpbnQgY2hpcCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IGFrLT5wcml2YXRlX2RhdGFbMF07CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX2FrbTR4eHhfdW5sb2NrKGFrbTR4eHhfdCAqYWssIGludCBjaGlwKQoreworCWljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKK30KKworLyoKKyAqIHdyaXRlIEFLNHh4eCByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZCBzbmRfaWNlMTcxMl9ha200eHh4X3dyaXRlKGFrbTR4eHhfdCAqYWssIGludCBjaGlwLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBpbnQgYWRkcmRhdGE7CisJc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqcHJpdiA9ICh2b2lkICopYWstPnByaXZhdGVfdmFsdWVbMF07CisJaWNlMTcxMl90ICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCisJc25kX2Fzc2VydChjaGlwID49IDAgJiYgY2hpcCA8IDQsIHJldHVybik7CisKKwl0bXAgPSBzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKTsKKwl0bXAgfD0gcHJpdi0+YWRkX2ZsYWdzOworCXRtcCAmPSB+cHJpdi0+bWFza19mbGFnczsKKwlpZiAocHJpdi0+Y3NfbWFzayA9PSBwcml2LT5jc19hZGRyKSB7CisJCWlmIChwcml2LT5jaWYpIHsKKwkJCXRtcCB8PSBwcml2LT5jc19tYXNrOyAvKiBzdGFydCB3aXRob3V0IGNoaXAgc2VsZWN0ICovCisJCX0gIGVsc2UgeworCQkJdG1wICY9IH5wcml2LT5jc19tYXNrOyAvKiBjaGlwIHNlbGVjdCBsb3cgKi8KKwkJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCQkJdWRlbGF5KDEpOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG9lc24ndCBoYW5kbGUgY2Y9MSB5ZXQgKi8KKwkJdG1wICY9IH5wcml2LT5jc19tYXNrOworCQl0bXAgfD0gcHJpdi0+Y3NfYWRkcjsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBidWlsZCBJMkMgYWRkcmVzcyArIGRhdGEgYnl0ZSAqLworCWFkZHJkYXRhID0gKHByaXYtPmNhZGRyIDw8IDYpIHwgMHgyMCB8IChhZGRyICYgMHgxZik7CisJYWRkcmRhdGEgPSAoYWRkcmRhdGEgPDwgOCkgfCBkYXRhOworCWZvciAoaWR4ID0gMTU7IGlkeCA+PSAwOyBpZHgtLSkgeworCQkvKiBkcm9wIGNsb2NrICovCisJCXRtcCAmPSB+cHJpdi0+Y2xrX21hc2s7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCQl1ZGVsYXkoMSk7CisJCS8qIHNldCBkYXRhICovCisJCWlmIChhZGRyZGF0YSAmICgxIDw8IGlkeCkpCisJCQl0bXAgfD0gcHJpdi0+ZGF0YV9tYXNrOworCQllbHNlCisJCQl0bXAgJj0gfnByaXYtPmRhdGFfbWFzazsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCXVkZWxheSgxKTsKKwkJLyogcmFpc2UgY2xvY2sgKi8KKwkJdG1wIHw9IHByaXYtPmNsa19tYXNrOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwkJdWRlbGF5KDEpOworCX0KKworCWlmIChwcml2LT5jc19tYXNrID09IHByaXYtPmNzX2FkZHIpIHsKKwkJaWYgKHByaXYtPmNpZikgeworCQkJLyogYXNzZXJ0IGEgY3MgcHVsc2UgdG8gdHJpZ2dlciAqLworCQkJdG1wICY9IH5wcml2LT5jc19tYXNrOworCQkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJdG1wIHw9IHByaXYtPmNzX21hc2s7IC8qIGNoaXAgc2VsZWN0IGhpZ2ggdG8gdHJpZ2dlciAqLworCX0gZWxzZSB7CisJCXRtcCAmPSB+cHJpdi0+Y3NfbWFzazsKKwkJdG1wIHw9IHByaXYtPmNzX25vbmU7IC8qIGRlc2VsZWN0IGFkZHJlc3MgKi8KKwl9CisJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJdWRlbGF5KDEpOworfQorCisvKgorICogaW5pdGlhbGl6ZSB0aGUgYWttNHh4eF90IHJlY29yZCB3aXRoIHRoZSB0ZW1wbGF0ZQorICovCitpbnQgc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrbTR4eHhfdCAqYWssIGNvbnN0IGFrbTR4eHhfdCAqdGVtcCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqX3ByaXYsIGljZTE3MTJfdCAqaWNlKQoreworCXN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgKnByaXY7CisKKwlpZiAoX3ByaXYgIT0gTlVMTCkgeworCQlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHByaXYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQkqcHJpdiA9ICpfcHJpdjsKKwl9IGVsc2UgeworCQlwcml2ID0gTlVMTDsKKwl9CisJKmFrID0gKnRlbXA7CisJYWstPmNhcmQgPSBpY2UtPmNhcmQ7CisgICAgICAgIGFrLT5wcml2YXRlX3ZhbHVlWzBdID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKKwlhay0+cHJpdmF0ZV9kYXRhWzBdID0gaWNlOworCWlmIChhay0+b3BzLmxvY2sgPT0gTlVMTCkKKwkJYWstPm9wcy5sb2NrID0gc25kX2ljZTE3MTJfYWttNHh4eF9sb2NrOworCWlmIChhay0+b3BzLnVubG9jayA9PSBOVUxMKQorCQlhay0+b3BzLnVubG9jayA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfdW5sb2NrOworCWlmIChhay0+b3BzLndyaXRlID09IE5VTEwpCisJCWFrLT5vcHMud3JpdGUgPSBzbmRfaWNlMTcxMl9ha200eHh4X3dyaXRlOworCXNuZF9ha200eHh4X2luaXQoYWspOworCXJldHVybiAwOworfQorCit2b2lkIHNuZF9pY2UxNzEyX2FrbTR4eHhfZnJlZShpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWtpZHg7CisJaWYgKGljZS0+YWttID09IE5VTEwpCisJCXJldHVybjsKKwlmb3IgKGFraWR4ID0gMDsgYWtpZHggPCBpY2UtPmFrbV9jb2RlY3M7IGFraWR4KyspIHsKKwkJYWttNHh4eF90ICphayA9ICZpY2UtPmFrbVtha2lkeF07CisJCWtmcmVlKCh2b2lkKilhay0+cHJpdmF0ZV92YWx1ZVswXSk7CisJfQorCWtmcmVlKGljZS0+YWttKTsKK30KKworLyoKKyAqIGJ1aWxkIEFLNHh4eCBjb250cm9scworICovCitpbnQgc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWtpZHg7CisJaW50IGVycjsKKworCWZvciAoYWtpZHggPSAwOyBha2lkeCA8IGljZS0+YWttX2NvZGVjczsgYWtpZHgrKykgeworCQlha200eHh4X3QgKmFrID0gJmljZS0+YWttW2FraWR4XTsKKwkJZXJyID0gc25kX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoYWspOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2ljZTE3MTJfYWttNHh4eF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorICAgICAgICAKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2ljZTE3MTJfYWttNHh4eF9tb2R1bGVfZXhpdCh2b2lkKQoreworfQorICAgICAgICAKK21vZHVsZV9pbml0KGFsc2FfaWNlMTcxMl9ha200eHh4X21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9pY2UxNzEyX2FrbTR4eHhfbW9kdWxlX2V4aXQpCisKK0VYUE9SVF9TWU1CT0woc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KTsKK0VYUE9SVF9TWU1CT0woc25kX2ljZTE3MTJfYWttNHh4eF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTk1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBWVDE3MjQgKEVudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBBZHZhbmNlZCBNaWNybyBQZXJpcGhlcmFscyBMdGQgQVVESU8yMDAwCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImFtcC5oIgorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfYW1wX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJLyogb25seSB1c2UgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3Igbm93ICovCisKKwlpY2UtPm51bV90b3RhbF9kYWNzID0gMjsJLyogb25seSBQU0RPVVQwIGlzIGNvbm5lY3RlZCAqLworCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfYW1wX2FkZF9jb250cm9scyhpY2UxNzEyX3QgKmljZSkKK3sKKwkvKiB3ZSB1c2UgcGlucyAzOSBhbmQgNDEgb2YgdGhlIFZUMTYxNiBmb3IgbGVmdCBhbmQgcmlnaHQgcmVhZCBvdXRwdXRzICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoaWNlLT5hYzk3LCAweDVhLCBzbmRfYWM5N19yZWFkKGljZS0+YWM5NywgMHg1YSkgJiB+MHg4MDAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBlbnRyeSBwb2ludCAqLworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2FtcF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9BVURJTzIwMDAsCisJCS5uYW1lID0gIkFNUCBMdGQgQVVESU8yMDAwIiwKKwkJLm1vZGVsID0gImFtcDIwMDAiLAorCQkuY2hpcF9pbml0ID0gc25kX3Z0MTcyNF9hbXBfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX3Z0MTcyNF9hbXBfYWRkX2NvbnRyb2xzLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5oIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4ZDQzMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX19TT1VORF9BTVBfSAorI2RlZmluZSBfX1NPVU5EX0FNUF9ICisKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBWSUEgVlQxNzI0IChFbnZ5MjRIVCkKKyAqCisgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgQWR2YW5jZWQgTWljcm8gUGVyaXBoZXJhbHMgTHRkIEFVRElPMjAwMAorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjZGVmaW5lICBBTVBfQVVESU8yMDAwX0RFVklDRV9ERVNDIAkgICAgICAgIntBTVAgTHRkLEFVRElPMjAwMH0sIgorCisjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfQVVESU8yMDAwCTB4MTIxNDI0MTcJLyogQWR2YW5jZWQgTWljcm8gUGVyaXBoZXJhbHMgTHRkIEFVRElPMjAwMCAqLworCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9hbXBfY2FyZHNbXTsKKworCisjZW5kaWYgLyogX19TT1VORF9BTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA1ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKQEAgLTAsMCArMSwxOTQ4IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBWVDE3MjQgKEVudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBUZXJyYXRlYyBBdXJlb24gY2FyZHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogTk9URVM6CisgKgorICogLSB3ZSByZXVzZSB0aGUgYWttNHh4eF90IHJlY29yZCBmb3Igc3RvcmluZyB0aGUgd204NzcwIGNvZGVjIGRhdGEuCisgKiAgIGJvdGggd20gYW5kIGFrbSBjb2RlY3MgYXJlIHByZXR0eSBzaW1pbGFyLCBzbyB3ZSBjYW4gaW50ZWdyYXRlCisgKiAgIGJvdGggY29udHJvbHMgaW4gdGhlIGZ1dHVyZSwgb25jZSBpZiB3bSBjb2RlY3MgYXJlIHJldXNlZCBpbgorICogICBtYW55IGJvYXJkcy4KKyAqCisgKiAtIERBQyBkaWdpdGFsIHZvbHVtZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgbWl4ZXIuCisgKiAgIGlmIHRoZXkgc2hvdyBiZXR0ZXIgcmVzcG9uc2UgdGhhbiBEQUMgYW5hbG9nIHZvbHVtZXMsIHdlIGNhbiB1c2UgdGhlbQorICogICBpbnN0ZWFkLgorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBBdWRpb1RyYWsgUHJvZGlneSA3LjEgKGFuZCBwb3NzaWJseSAxOTIpIGNhcmRzCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMyBEaW1pdHJvbWFub2xha2lzIEFwb3N0b2xvcyA8YXBvc3RvbEBjcy51dG9yb250by5jYT4KKyAqCisgKiAgIHZlcnNpb24gMC44MjogU3RhYmxlIC8gbm90IGFsbCBmZWF0dXJlcyB3b3JrIHlldCAobm8gY29tbXVuaWNhdGlvbiB3aXRoIEFDOTcgc2Vjb25kYXJ5KQorICogICAgICAgYWRkZWQgNjR4LzEyOHggb3ZlcnNhbXBsaW5nIHN3aXRjaCAoc2hvdWxkIGJlIDY0eCBvbmx5IGZvciA5NmtoeikKKyAqICAgICAgIGZpeGVkIHNvbWUgcmVjb3JkaW5nIGxhYmVscyAoc3RpbGwgbmVlZCB0byBjaGVjayB0aGUgcmVzdCkKKyAqICAgICAgIHJlY29yZGluZyBpcyB3b3JraW5nIHByb2JhYmx5IHRoYW5rcyB0byBjb3JyZWN0IHdtODc3MCBpbml0aWFsaXphdGlvbgorICoKKyAqICAgdmVyc2lvbiAwLjU6IEluaXRpYWwgcmVsZWFzZToKKyAqICAgICAgICAgICB3b3JraW5nOiBhbmFsb2cgb3V0cHV0LCBtaXhlciwgaGVhZHBob25lIGFtcGxpZmllciBzd2l0Y2gKKyAqICAgICAgIG5vdCB3b3JraW5nOiBwcmV0eSBtdWNoIGV2ZXJ5dGhpbmcgZWxzZSwgYXQgbGVhc3QgaSBjb3VsZCB2ZXJpZnkgdGhhdAorICogICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgbm8gZGlnaXRhbCBvdXRwdXQsIG5vIGNhcHR1cmUsIHByZXR0eSBiYWQgY2xpY2tzIGFuZCBwb29wcworICogICAgICAgICAgICAgICAgICAgIG9uIG1peGVyIHN3aXRjaCBhbmQgb3RoZXIgY29sbCBzdHVmZi4KKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKKyNpbmNsdWRlICJpY2UxNzEyLmgiCisjaW5jbHVkZSAiZW52eTI0aHQuaCIKKyNpbmNsdWRlICJhdXJlb24uaCIKKworLyogV004NzcwIHJlZ2lzdGVycyAqLworI2RlZmluZSBXTV9EQUNfQVRURU4JCTB4MDAJLyogREFDMS04IGFuYWxvZyBhdHRlbnVhdGlvbiAqLworI2RlZmluZSBXTV9EQUNfTUFTVEVSX0FUVEVOCTB4MDgJLyogREFDIG1hc3RlciBhbmFsb2cgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgV01fREFDX0RJR19BVFRFTgkweDA5CS8qIERBQzEtOCBkaWdpdGFsIGF0dGVudWF0aW9uICovCisjZGVmaW5lIFdNX0RBQ19ESUdfTUFTVEVSX0FUVEVOCTB4MTEJLyogREFDIG1hc3RlciBkaWdpdGFsIGF0dGVudWF0aW9uICovCisjZGVmaW5lIFdNX1BIQVNFX1NXQVAJCTB4MTIJLyogREFDIHBoYXNlICovCisjZGVmaW5lIFdNX0RBQ19DVFJMMQkJMHgxMwkvKiBEQUMgY29udHJvbCBiaXRzICovCisjZGVmaW5lIFdNX01VVEUJCQkweDE0CS8qIG11dGUgY29udHJvbHMgKi8KKyNkZWZpbmUgV01fREFDX0NUUkwyCQkweDE1CS8qIGRlLWVtcGhhc2lzIGFuZCB6ZWZvLWZsYWcgKi8KKyNkZWZpbmUgV01fSU5UX0NUUkwJCTB4MTYJLyogaW50ZXJmYWNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgV01fTUFTVEVSCQkweDE3CS8qIG1hc3RlciBjbG9jayBhbmQgbW9kZSAqLworI2RlZmluZSBXTV9QT1dFUkRPV04JCTB4MTgJLyogcG93ZXItZG93biBjb250cm9scyAqLworI2RlZmluZSBXTV9BRENfR0FJTgkJMHgxOQkvKiBBREMgZ2FpbiBMKDE5KS9SKDFhKSAqLworI2RlZmluZSBXTV9BRENfTVVYCQkweDFiCS8qIGlucHV0IE1VWCAqLworI2RlZmluZSBXTV9PVVRfTVVYMQkJMHgxYwkvKiBvdXRwdXQgTVVYICovCisjZGVmaW5lIFdNX09VVF9NVVgyCQkweDFlCS8qIG91dHB1dCBNVVggKi8KKyNkZWZpbmUgV01fUkVTRVQJCTB4MWYJLyogc29mdHdhcmUgcmVzZXQgKi8KKworLyogQ1M4NDE1QSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1M4NDE1X0NUUkwxCTB4MDEKKyNkZWZpbmUgQ1M4NDE1X0NUUkwyCTB4MDIKKyNkZWZpbmUgQ1M4NDE1X1FTVUIJCTB4MTQKKyNkZWZpbmUgQ1M4NDE1X1JBVElPCTB4MUUKKyNkZWZpbmUgQ1M4NDE1X0NfQlVGRkVSCTB4MjAKKyNkZWZpbmUgQ1M4NDE1X0lECQkweDdGCisKK3N0YXRpYyB2b2lkIGF1cmVvbl9hYzk3X3dyaXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkgeworCXVuc2lnbmVkIGludCB0bXA7CisKKwkvKiBTZW5kIGFkZHJlc3MgdG8gWElMSU5YIGNoaXAgKi8KKwl0bXAgPSAoc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSkgJiB+MHhGRikgfCAocmVnICYgMHg3Rik7CisJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJdWRlbGF5KDEwKTsKKwl0bXAgfD0gQVVSRU9OX0FDOTdfQUREUjsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOworCXRtcCAmPSB+QVVSRU9OX0FDOTdfQUREUjsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOwkKKworCS8qIFNlbmQgbG93LW9yZGVyIGJ5dGUgdG8gWElMSU5YIGNoaXAgKi8KKwl0bXAgJj0gfkFVUkVPTl9BQzk3X0RBVEFfTUFTSzsKKwl0bXAgfD0gdmFsICYgQVVSRU9OX0FDOTdfREFUQV9NQVNLOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxMCk7CisJdG1wIHw9IEFVUkVPTl9BQzk3X0RBVEFfTE9XOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxMCk7CisJdG1wICY9IH5BVVJFT05fQUM5N19EQVRBX0xPVzsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOworCQorCS8qIFNlbmQgaGlnaC1vcmRlciBieXRlIHRvIFhJTElOWCBjaGlwICovCisJdG1wICY9IH5BVVJFT05fQUM5N19EQVRBX01BU0s7CisJdG1wIHw9ICh2YWwgPj4gOCkgJiBBVVJFT05fQUM5N19EQVRBX01BU0s7CisKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOworCXRtcCB8PSBBVVJFT05fQUM5N19EQVRBX0hJR0g7CisJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJdWRlbGF5KDEwKTsKKwl0bXAgJj0gfkFVUkVPTl9BQzk3X0RBVEFfSElHSDsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOworCQorCS8qIEluc3RydWN0IFhJTElOWCBjaGlwIHRvIHBhcnNlIHRoZSBkYXRhIHRvIHRoZSBTVEFDOTc0NCBjaGlwICovCisJdG1wIHw9IEFVUkVPTl9BQzk3X0NPTU1JVDsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMTApOworCXRtcCAmPSB+QVVSRU9OX0FDOTdfQ09NTUlUOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxMCk7CisJCisJLyogU3RvcmUgdGhlIGRhdGEgaW4gb3V0IHByaXZhdGUgYnVmZmVyICovCisJaWNlLT5zcGVjLmF1cmVvbi5zdGFjOTc0NFsocmVnICYgMHg3RikgPj4gMV0gPSB2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhdXJlb25fYWM5N19yZWFkKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisgICAgICAgcmV0dXJuIGljZS0+c3BlYy5hdXJlb24uc3RhYzk3NDRbKHJlZyAmIDB4N0YpID4+IDFdOworfQorCisvKgorICogSW5pdGlhbGl6ZSBTVEFDOTc0NCBjaGlwCisgKi8KK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfaW5pdCAoaWNlMTcxMl90ICppY2UpIHsKKwlpbnQgaTsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWM5N19kZWZhdWx0c1tdID0geworCQkweDAwLCAweDk2NDAsCisJCTB4MDIsIDB4ODAwMCwKKwkJMHgwNCwgMHg4MDAwLAorCQkweDA2LCAweDgwMDAsCisJCTB4MEMsIDB4ODAwOCwKKwkJMHgwRSwgMHg4MDA4LAorCQkweDEwLCAweDg4MDgsCisJCTB4MTIsIDB4ODgwOCwKKwkJMHgxNCwgMHg4ODA4LAorCQkweDE2LCAweDg4MDgsCisJCTB4MTgsIDB4ODgwOCwKKwkJMHgxQywgMHg4MDAwLAorCQkweDI2LCAweDAwMEYsCisJCTB4MjgsIDB4MDIwMSwKKwkJMHgyQywgMHhCQjgwLAorCQkweDMyLCAweEJCODAsCisJCTB4N0MsIDB4ODM4NCwKKwkJMHg3RSwgMHg3NjQ0LAorCQkodW5zaWduZWQgc2hvcnQpLTEKKwl9OworCXVuc2lnbmVkIGludCB0bXA7CisKKwkvKiBDb2xkIHJlc2V0ICovCisJdG1wID0gKHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpIHwgQVVSRU9OX0FDOTdfUkVTRVQpICYgfkFVUkVPTl9BQzk3X0RBVEFfTUFTSzsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMyk7CisJCisJdG1wICY9IH5BVVJFT05fQUM5N19SRVNFVDsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMyk7CisJCisJdG1wIHw9IEFVUkVPTl9BQzk3X1JFU0VUOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgzKTsKKwkKKwltZW1zZXQoJmljZS0+c3BlYy5hdXJlb24uc3RhYzk3NDQsIDAsIHNpemVvZihpY2UtPnNwZWMuYXVyZW9uLnN0YWM5NzQ0KSk7CisJZm9yIChpPTA7IGFjOTdfZGVmYXVsdHNbaV0gIT0gKHVuc2lnbmVkIHNob3J0KS0xOyBpKz0yKQorCQlpY2UtPnNwZWMuYXVyZW9uLnN0YWM5NzQ0WyhhYzk3X2RlZmF1bHRzW2ldKSA+PiAxXSA9IGFjOTdfZGVmYXVsdHNbaSsxXTsKKwkJCisJYXVyZW9uX2FjOTdfd3JpdGUoaWNlLCBBQzk3X01BU1RFUiwgMHgwMDAwKTsgLy8gVW5tdXRlIEFDJzk3IG1hc3RlciB2b2x1bWUgcGVybWFuZW50bHkgLSBtdXRpbmcgaXMgZG9uZSBieSBXTTg3NzAKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFVUkVPTl9BQzk3X1NURVJFTwkweDgwCisKKy8qCisgKiBBQyc5NyB2b2x1bWUgY29udHJvbHMKKyAqLworc3RhdGljIGludCBhdXJlb25fYWM5N192b2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgQVVSRU9OX0FDOTdfU1RFUkVPID8gMiA6IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAzMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fYWM5N192b2xfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZvbDsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisKKwl2b2wgPSBhdXJlb25fYWM5N19yZWFkKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDB4MUYgLSAodm9sICYgMHgxRik7CisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgQVVSRU9OX0FDOTdfU1RFUkVPKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDB4MUYgLSAoKHZvbCA+PiA4KSAmIDB4MUYpOworCisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfdm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCBvdm9sLCBudm9sOworCWludCBjaGFuZ2U7CisJCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCisJb3ZvbCA9IGF1cmVvbl9hYzk3X3JlYWQoaWNlLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4N0YpOworCW52b2wgPSAoMHgxRiAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSAmIDB4MDAxRjsKKwlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiBBVVJFT05fQUM5N19TVEVSRU8pCisJCW52b2wgfD0gKCgweDFGIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIDw8IDgpICYgMHgxRjAwOworCW52b2wgfD0gb3ZvbCAmIH4weDFGMUY7CisJCisJaWYgKChjaGFuZ2UgPSAob3ZvbCAhPSBudm9sKSkpCisJCWF1cmVvbl9hYzk3X3dyaXRlKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGLCBudm9sKTsKKworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKworCXJldHVybiBjaGFuZ2U7CQkKK30KKworLyoKKyAqIEFDJzk3IG11dGUgY29udHJvbHMKKyAqLworI2RlZmluZSBhdXJlb25fYWM5N19tdXRlX2luZm8JYXVyZW9uX21vbm9fYm9vbF9pbmZvCisKK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfbXV0ZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhdXJlb25fYWM5N19yZWFkKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGKSAmIDB4ODAwMCA/IDAgOiAxOworCisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfbXV0ZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCBvdm9sLCBudm9sOworCWludCBjaGFuZ2U7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJCisJb3ZvbCA9IGF1cmVvbl9hYzk3X3JlYWQoaWNlLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4N0YpOworCW52b2wgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAweDAwMDAgOiAweDgwMDApIHwgKG92b2wgJiB+CTB4ODAwMCk7CisJCisJaWYgKChjaGFuZ2UgPSAob3ZvbCAhPSBudm9sKSkpCisJCWF1cmVvbl9hYzk3X3dyaXRlKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGLCBudm9sKTsKKwkJCisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIEFDJzk3IG11dGUgY29udHJvbHMKKyAqLworI2RlZmluZSBhdXJlb25fYWM5N19taWNib29zdF9pbmZvCWF1cmVvbl9tb25vX2Jvb2xfaW5mbworCitzdGF0aWMgaW50IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGF1cmVvbl9hYzk3X3JlYWQoaWNlLCBBQzk3X01JQykgJiAweDAwMjAgPyAwIDogMTsKKworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9hYzk3X21pY2Jvb3N0X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IG92b2wsIG52b2w7CisJaW50IGNoYW5nZTsKKworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwkKKwlvdm9sID0gYXVyZW9uX2FjOTdfcmVhZChpY2UsIEFDOTdfTUlDKTsKKwludm9sID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMHgwMDAwIDogMHgwMDIwKSB8IChvdm9sICYgfjB4MDAyMCk7CisJCisJaWYgKChjaGFuZ2UgPSAob3ZvbCAhPSBudm9sKSkpCisJCWF1cmVvbl9hYzk3X3dyaXRlKGljZSwgQUM5N19NSUMsIG52b2wpOworCQkKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogd3JpdGUgZGF0YSBpbiB0aGUgU1BJIG1vZGUKKyAqLworc3RhdGljIHZvaWQgYXVyZW9uX3NwaV93cml0ZShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGNzLCB1bnNpZ25lZCBpbnQgZGF0YSwgaW50IGJpdHMpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgaTsKKworCXRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH4oQVVSRU9OX1dNX1JXfEFVUkVPTl9TUElfTU9TSXxBVVJFT05fU1BJX0NMS3wKKwkJCQkJIEFVUkVPTl9XTV9DU3xBVVJFT05fQ1M4NDE1X0NTKSk7CisJdG1wIHw9IEFVUkVPTl9XTV9SVzsKKwl0bXAgJj0gfmNzOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKworCWZvciAoaSA9IGJpdHMgLSAxOyBpID49IDA7IGktLSkgeworCQl0bXAgJj0gfkFVUkVPTl9TUElfQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwkJdWRlbGF5KDEpOworCQlpZiAoZGF0YSAmICgxIDw8IGkpKQorCQkJdG1wIHw9IEFVUkVPTl9TUElfTU9TSTsKKwkJZWxzZQorCQkJdG1wICY9IH5BVVJFT05fU1BJX01PU0k7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCQl1ZGVsYXkoMSk7CisJCXRtcCB8PSBBVVJFT05fU1BJX0NMSzsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwl0bXAgJj0gfkFVUkVPTl9TUElfQ0xLOworCXRtcCB8PSBjczsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMSk7CisJdG1wIHw9IEFVUkVPTl9TUElfQ0xLOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKK30KKworLyoKKyAqIFJlYWQgZGF0YSBpbiBTUEkgbW9kZQorICovCitzdGF0aWMgdm9pZCBhdXJlb25fc3BpX3JlYWQoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBjcywgdW5zaWduZWQgaW50IGRhdGEsIGludCBiaXRzLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKSB7CisJaW50IGksIGo7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCA9IChzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIH5BVVJFT05fU1BJX0NMSykgfCBBVVJFT05fQ1M4NDE1X0NTfEFVUkVPTl9XTV9DUzsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl0bXAgJj0gfmNzOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKworCWZvciAoaT1iaXRzLTE7IGk+PTA7IGktLSkgeworCQlpZiAoZGF0YSAmICgxIDw8IGkpKQorCQkJdG1wIHw9IEFVUkVPTl9TUElfTU9TSTsKKwkJZWxzZQorCQkJdG1wICY9IH5BVVJFT05fU1BJX01PU0k7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCQl1ZGVsYXkoMSk7CisKKwkJdG1wIHw9IEFVUkVPTl9TUElfQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwkJdWRlbGF5KDEpOworCisJCXRtcCAmPSB+QVVSRU9OX1NQSV9DTEs7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCQl1ZGVsYXkoMSk7CisJfQorCisJZm9yIChqPTA7IGo8c2l6ZTsgaisrKSB7CisJCXVuc2lnbmVkIGNoYXIgb3V0ZGF0YSA9IDA7CisJCWZvciAoaT03OyBpPj0wOyBpLS0pIHsKKwkJCXRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCQkJb3V0ZGF0YSA8PD0gMTsKKwkJCW91dGRhdGEgfD0gKHRtcCAmIEFVUkVPTl9TUElfTUlTTykgPyAxIDogMDsKKwkJCXVkZWxheSgxKTsKKworCQkJdG1wIHw9IEFVUkVPTl9TUElfQ0xLOworCQkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCQl1ZGVsYXkoMSk7CisKKwkJCXRtcCAmPSB+QVVSRU9OX1NQSV9DTEs7CisJCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwkJCXVkZWxheSgxKTsKKwkJfQorCQlidWZmZXJbal0gPSBvdXRkYXRhOworCX0KKworCXRtcCB8PSBjczsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uX2NzODQxNV9nZXQoaWNlMTcxMl90ICppY2UsIGludCByZWcpIHsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlhdXJlb25fc3BpX3dyaXRlKGljZSwgQVVSRU9OX0NTODQxNV9DUywgMHgyMDAwIHwgcmVnLCAxNik7CisJYXVyZW9uX3NwaV9yZWFkKGljZSwgQVVSRU9OX0NTODQxNV9DUywgMHgyMSwgOCwgJnZhbCwgMSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgYXVyZW9uX2NzODQxNV9yZWFkKGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKSB7CisJYXVyZW9uX3NwaV93cml0ZShpY2UsIEFVUkVPTl9DUzg0MTVfQ1MsIDB4MjAwMCB8IHJlZywgMTYpOworCWF1cmVvbl9zcGlfcmVhZChpY2UsIEFVUkVPTl9DUzg0MTVfQ1MsIDB4MjEsIDgsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF1cmVvbl9jczg0MTVfcHV0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkgeworCWF1cmVvbl9zcGlfd3JpdGUoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAweDIwMDAwMCB8IChyZWcgPDwgOCkgfCB2YWwsIDI0KTsKK30KKworLyoKKyAqIGdldCB0aGUgY3VycmVudCByZWdpc3RlciB2YWx1ZSBvZiBXTSBjb2RlYworICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21fZ2V0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnKQoreworCXJlZyA8PD0gMTsKKwlyZXR1cm4gKCh1bnNpZ25lZCBzaG9ydClpY2UtPmFrbVswXS5pbWFnZXNbcmVnXSA8PCA4KSB8CisJCWljZS0+YWttWzBdLmltYWdlc1tyZWcgKyAxXTsKK30KKworLyoKKyAqIHNldCB0aGUgcmVnaXN0ZXIgdmFsdWUgb2YgV00gY29kZWMKKyAqLworc3RhdGljIHZvaWQgd21fcHV0X25vY2FjaGUoaWNlMTcxMl90ICppY2UsIGludCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlhdXJlb25fc3BpX3dyaXRlKGljZSwgQVVSRU9OX1dNX0NTLCAocmVnIDw8IDkpIHwgKHZhbCAmIDB4MWZmKSwgMTYpOworfQorCisvKgorICogc2V0IHRoZSByZWdpc3RlciB2YWx1ZSBvZiBXTSBjb2RlYyBhbmQgcmVtZW1iZXIgaXQKKyAqLworc3RhdGljIHZvaWQgd21fcHV0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJd21fcHV0X25vY2FjaGUoaWNlLCByZWcsIHZhbCk7CisJcmVnIDw8PSAxOworCWljZS0+YWttWzBdLmltYWdlc1tyZWddID0gdmFsID4+IDg7CisJaWNlLT5ha21bMF0uaW1hZ2VzW3JlZyArIDFdID0gdmFsOworfQorCisvKgorICovCitzdGF0aWMgaW50IGF1cmVvbl9tb25vX2Jvb2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqaywgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBQyc5NyBtYXN0ZXIgcGxheWJhY2sgbXV0ZSBjb250cm9scyAoTXV0ZSBvbiBXTTg3NzAgY2hpcCkKKyAqLworI2RlZmluZSBhdXJlb25fYWM5N19tbXV0ZV9pbmZvCWF1cmVvbl9tb25vX2Jvb2xfaW5mbworCitzdGF0aWMgaW50IGF1cmVvbl9hYzk3X21tdXRlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9PVVRfTVVYMSkgPj4gMSkgJiAweDAxOworCisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfbW11dGVfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKSB7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgb3ZvbCwgbnZvbDsKKwlpbnQgY2hhbmdlOworCQorCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwkKKwlvdm9sID0gd21fZ2V0KGljZSwgV01fT1VUX01VWDEpOworCW52b2wgPSAob3ZvbCAmIH4weDAyKSB8ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDB4MDIgOiAweDAwKTsKKwlpZiAoKGNoYW5nZSA9IChvdm9sICE9IG52b2wpKSkKKwkJd21fcHV0KGljZSwgV01fT1VUX01VWDEsIG52b2wpOworCQkKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogTG9nYXJpdGhtaWMgdm9sdW1lIHZhbHVlcyBmb3IgV004NzcwCisgKiBDb21wdXRlZCBhcyAyMCAqIExvZzEwKDI1NSAvIHgpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdtX3ZvbFsyNTZdID0geworCTEyNywgNDgsIDQyLCAzOSwgMzYsIDM0LCAzMywgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNywgMjYsIDI1LCAyNSwgMjQsIDI0LCAyMywKKwkyMywgMjIsIDIyLCAyMSwgMjEsIDIxLCAyMCwgMjAsIDIwLCAxOSwgMTksIDE5LCAxOCwgMTgsIDE4LCAxOCwgMTcsIDE3LCAxNywKKwkxNywgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywKKwkxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKwkxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOCwgOCwKKwk4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA2LCA2LCA2LAorCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisJNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCTIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwCit9OworCisjZGVmaW5lIFdNX1ZPTF9NQVgJKHNpemVvZih3bV92b2wpIC0gMSkKKyNkZWZpbmUgV01fVk9MX01VVEUJMHg4MDAwCisKK3N0YXRpYyB2b2lkIHdtX3NldF92b2woaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgc2hvcnQgdm9sLCB1bnNpZ25lZCBzaG9ydCBtYXN0ZXIpCit7CisJdW5zaWduZWQgY2hhciBudm9sOworCQorCWlmICgobWFzdGVyICYgV01fVk9MX01VVEUpIHx8ICh2b2wgJiBXTV9WT0xfTVVURSkpCisJCW52b2wgPSAwOworCWVsc2UKKwkJbnZvbCA9IDEyNyAtIHdtX3ZvbFsoKCh2b2wgJiB+V01fVk9MX01VVEUpICogKG1hc3RlciAmIH5XTV9WT0xfTVVURSkpIC8gMTI3KSAmIFdNX1ZPTF9NQVhdOworCQorCXdtX3B1dChpY2UsIGluZGV4LCBudm9sKTsKKwl3bV9wdXRfbm9jYWNoZShpY2UsIGluZGV4LCAweDE4MCB8IG52b2wpOworfQorCisvKgorICogREFDIG11dGUgY29udHJvbAorICovCisjZGVmaW5lIHdtX3BjbV9tdXRlX2luZm8JYXVyZW9uX21vbm9fYm9vbF9pbmZvCisKK3N0YXRpYyBpbnQgd21fcGNtX211dGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9NVVRFKSAmIDB4MTApID8gMCA6IDE7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fcGNtX211dGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgbnZhbCwgb3ZhbDsKKwlpbnQgY2hhbmdlOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCW92YWwgPSB3bV9nZXQoaWNlLCBXTV9NVVRFKTsKKwludmFsID0gKG92YWwgJiB+MHgxMCkgfCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAwIDogMHgxMCk7CisJaWYgKChjaGFuZ2UgPSAobnZhbCAhPSBvdmFsKSkpCisJCXdtX3B1dChpY2UsIFdNX01VVEUsIG52YWwpOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBNYXN0ZXIgdm9sdW1lIGF0dGVudWF0aW9uIG1peGVyIGNvbnRyb2wKKyAqLworc3RhdGljIGludCB3bV9tYXN0ZXJfdm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gV01fVk9MX01BWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9tYXN0ZXJfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwyOyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gaWNlLT5zcGVjLmF1cmVvbi5tYXN0ZXJbaV0gJiB+V01fVk9MX01VVEU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fbWFzdGVyX3ZvbF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoLCBjaGFuZ2UgPSAwOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCWZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2NoXSAhPSBpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltjaF0pIHsKKwkJCWludCBkYWM7CisJCQlpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltjaF0gJj0gV01fVk9MX01VVEU7CisJCQlpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltjaF0gfD0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbY2hdOworCQkJZm9yIChkYWMgPSAwOyBkYWMgPCBpY2UtPm51bV90b3RhbF9kYWNzOyBkYWMgKz0gMikKKwkJCQl3bV9zZXRfdm9sKGljZSwgV01fREFDX0FUVEVOICsgZGFjICsgY2gsCisJCQkJCSAgIGljZS0+c3BlYy5hdXJlb24udm9sW2RhYyArIGNoXSwKKwkJCQkJICAgaWNlLT5zcGVjLmF1cmVvbi5tYXN0ZXJbY2hdKTsKKwkJCWNoYW5nZSA9IDE7CisJCX0KKwl9CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBEQUMgdm9sdW1lIGF0dGVudWF0aW9uIG1peGVyIGNvbnRyb2wKKyAqLworc3RhdGljIGludCB3bV92b2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCWludCB2b2ljZXMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4OworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IHZvaWNlczsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJLyogbXV0ZSAoLTEwMWRCKSAqLworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4N0Y7CS8qIDBkQiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX3ZvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGksIG9mcywgdm9pY2VzOworCisJdm9pY2VzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKKwlvZnMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJZm9yIChpID0gMDsgaSA8IHZvaWNlczsgaSsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IGljZS0+c3BlYy5hdXJlb24udm9sW29mcytpXSAmIH5XTV9WT0xfTVVURTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV92b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpLCBpZHgsIG9mcywgdm9pY2VzOworCWludCBjaGFuZ2UgPSAwOworCisJdm9pY2VzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKKwlvZnMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCWZvciAoaSA9IDA7IGkgPCB2b2ljZXM7IGkrKykgeworCQlpZHggID0gV01fREFDX0FUVEVOICsgb2ZzICsgaTsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldICE9IGljZS0+c3BlYy5hdXJlb24udm9sW29mcytpXSkgeworCQkJaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzK2ldICY9IFdNX1ZPTF9NVVRFOworCQkJaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzK2ldIHw9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJd21fc2V0X3ZvbChpY2UsIGlkeCwgaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzK2ldLAorCQkJCSAgIGljZS0+c3BlYy5hdXJlb24ubWFzdGVyW2ldKTsKKwkJCWNoYW5nZSA9IDE7CisJCX0KKwl9CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBXTTg3NzAgbXV0ZSBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgd21fbXV0ZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pIHsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4OworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9tdXRlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgdm9pY2VzLCBvZnMsIGk7CisJCisJdm9pY2VzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKKwlvZnMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4RkY7CisKKwlmb3IgKGkgPSAwOyBpIDwgdm9pY2VzOyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gKGljZS0+c3BlYy5hdXJlb24udm9sW29mcytpXSAmIFdNX1ZPTF9NVVRFKSA/IDAgOiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX211dGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZSA9IDAsIHZvaWNlcywgb2ZzLCBpOworCisJdm9pY2VzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKKwlvZnMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4RkY7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJZm9yIChpID0gMDsgaSA8IHZvaWNlczsgaSsrKSB7CisJCWludCB2YWwgPSAoaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzICsgaV0gJiBXTV9WT0xfTVVURSkgPyAwIDogMTsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldICE9IHZhbCkgeworCQkJaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzICsgaV0gJj0gfldNX1ZPTF9NVVRFOworCQkJaWNlLT5zcGVjLmF1cmVvbi52b2xbb2ZzICsgaV0gfD0KKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA/IDAgOiBXTV9WT0xfTVVURTsKKwkJCXdtX3NldF92b2woaWNlLCBvZnMgKyBpLCBpY2UtPnNwZWMuYXVyZW9uLnZvbFtvZnMgKyBpXSwKKwkJCQkgICBpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltpXSk7CisJCQljaGFuZ2UgPSAxOworCQl9CisJfQorCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBXTTg3NzAgbWFzdGVyIG11dGUgY29udHJvbAorICovCitzdGF0aWMgaW50IHdtX21hc3Rlcl9tdXRlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykgeworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX21hc3Rlcl9tdXRlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChpY2UtPnNwZWMuYXVyZW9uLm1hc3RlclswXSAmIFdNX1ZPTF9NVVRFKSA/IDAgOiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gKGljZS0+c3BlYy5hdXJlb24ubWFzdGVyWzFdICYgV01fVk9MX01VVEUpID8gMCA6IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fbWFzdGVyX211dGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZSA9IDAsIGk7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpbnQgdmFsID0gKGljZS0+c3BlYy5hdXJlb24ubWFzdGVyW2ldICYgV01fVk9MX01VVEUpID8gMCA6IDE7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSAhPSB2YWwpIHsKKwkJCWludCBkYWM7CisJCQlpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltpXSAmPSB+V01fVk9MX01VVEU7CisJCQlpY2UtPnNwZWMuYXVyZW9uLm1hc3RlcltpXSB8PQorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID8gMCA6IFdNX1ZPTF9NVVRFOworCQkJZm9yIChkYWMgPSAwOyBkYWMgPCBpY2UtPm51bV90b3RhbF9kYWNzOyBkYWMgKz0gMikKKwkJCQl3bV9zZXRfdm9sKGljZSwgV01fREFDX0FUVEVOICsgZGFjICsgaSwKKwkJCQkJICAgaWNlLT5zcGVjLmF1cmVvbi52b2xbZGFjICsgaV0sCisJCQkJCSAgIGljZS0+c3BlYy5hdXJlb24ubWFzdGVyW2ldKTsKKwkJCWNoYW5nZSA9IDE7CisJCX0KKwl9CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCisJcmV0dXJuIGNoYW5nZTsKK30KKworLyogZGlnaXRhbCBtYXN0ZXIgdm9sdW1lICovCisjZGVmaW5lIFBDTV8wZEIgMHhmZgorI2RlZmluZSBQQ01fUkVTIDEyOAkvKiAtNjRkQiAqLworI2RlZmluZSBQQ01fTUlOIChQQ01fMGRCIC0gUENNX1JFUykKK3N0YXRpYyBpbnQgd21fcGNtX3ZvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJLyogbXV0ZSAoLTY0ZEIpICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gUENNX1JFUzsJLyogMGRCICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fcGNtX3ZvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl2YWwgPSB3bV9nZXQoaWNlLCBXTV9EQUNfRElHX01BU1RFUl9BVFRFTikgJiAweGZmOworCXZhbCA9IHZhbCA+IFBDTV9NSU4gPyAodmFsIC0gUENNX01JTikgOiAwOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX3BjbV92b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IG92b2wsIG52b2w7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJbnZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW52b2wgPSAobnZvbCA/IChudm9sICsgUENNX01JTikgOiAwKSAmIDB4ZmY7CisJb3ZvbCA9IHdtX2dldChpY2UsIFdNX0RBQ19ESUdfTUFTVEVSX0FUVEVOKSAmIDB4ZmY7CisJaWYgKG92b2wgIT0gbnZvbCkgeworCQl3bV9wdXQoaWNlLCBXTV9EQUNfRElHX01BU1RFUl9BVFRFTiwgbnZvbCk7IC8qIHByZWxhdGNoICovCisJCXdtX3B1dF9ub2NhY2hlKGljZSwgV01fREFDX0RJR19NQVNURVJfQVRURU4sIG52b2wgfCAweDEwMCk7IC8qIHVwZGF0ZSAqLworCQljaGFuZ2UgPSAxOworCX0KKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIEFEQyBtdXRlIGNvbnRyb2wKKyAqLworc3RhdGljIGludCB3bV9hZGNfbXV0ZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fYWRjX211dGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwlpbnQgaTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl2YWwgPSB3bV9nZXQoaWNlLCBXTV9BRENfR0FJTiArIGkpOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IH52YWw+PjUgJiAweDE7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2FkY19tdXRlX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IG5ldywgb2xkOworCWludCBpLCBjaGFuZ2UgPSAwOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJb2xkID0gd21fZ2V0KGljZSwgV01fQURDX0dBSU4gKyBpKTsKKwkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTw8NSYweDIwKSB8IChvbGQmfjB4MjApOworCQlpZiAobmV3ICE9IG9sZCkgeworCQkJd21fcHV0KGljZSwgV01fQURDX0dBSU4gKyBpLCBuZXcpOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogQURDIGdhaW4gbWl4ZXIgY29udHJvbAorICovCitzdGF0aWMgaW50IHdtX2FkY192b2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsJCS8qIC0xMmRCICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHgxZjsJLyogMTlkQiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2FkY192b2xfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpLCBpZHg7CisJdW5zaWduZWQgc2hvcnQgdm9sOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlkeCA9IFdNX0FEQ19HQUlOICsgaTsKKwkJdm9sID0gd21fZ2V0KGljZSwgaWR4KSAmIDB4MWY7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gdm9sOworCX0KKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9hZGNfdm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSwgaWR4OworCXVuc2lnbmVkIHNob3J0IG92b2wsIG52b2w7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZHggID0gV01fQURDX0dBSU4gKyBpOworCQludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCW92b2wgPSB3bV9nZXQoaWNlLCBpZHgpOworCQlpZiAoKG92b2wgJiAweDFmKSAhPSBudm9sKSB7CisJCQl3bV9wdXQoaWNlLCBpZHgsIG52b2wgfCAob3ZvbCAmIH4weDFmKSk7CisJCQljaGFuZ2UgPSAxOworCQl9CisJfQorCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogQURDIGlucHV0IG11eCBtaXhlciBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgd21fYWRjX211eF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJCSJDRCIsCQkvL0FJTjEKKwkJIkF1eCIsCQkvL0FJTjIKKwkJIkxpbmUiLAkJLy9BSU4zCisJCSJNaWMiLAkJLy9BSU40CisJCSJBQzk3IgkJLy9BSU41CisJfTsKKwlzdGF0aWMgY2hhciAqdW5pdmVyc2VfdGV4dHNbXSA9IHsKKwkJIkF1eDEiLAkJLy9BSU4xCisJCSJDRCIsCQkvL0FJTjIKKwkJIlBob25vIiwJLy9BSU4zCisJCSJMaW5lIiwJCS8vQUlONAorCQkiQXV4MiIsCQkvL0FJTjUKKwkJIk1pYyIsCQkvL0FJTjYKKwkJIkF1eDMiLAkJLy9BSU43CisJCSJBQzk3IgkJLy9BSU44CisJfTsKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDI7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1VOSVZFUlNFKSB7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gODsKKwkJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdW5pdmVyc2VfdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0KKwllbHNlIHsKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA1OworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2FkY19tdXhfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCXZhbCA9IHdtX2dldChpY2UsIFdNX0FEQ19NVVgpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsICYgNzsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9ICh2YWwgPj4gNCkgJiA3OworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2FkY19tdXhfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCBvdmFsLCBudmFsOworCWludCBjaGFuZ2U7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJb3ZhbCA9IHdtX2dldChpY2UsIFdNX0FEQ19NVVgpOworCW52YWwgPSBvdmFsICYgfjB4Nzc7CisJbnZhbCB8PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDc7CisJbnZhbCB8PSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiA3KSA8PCA0OworCWNoYW5nZSA9IChvdmFsICE9IG52YWwpOworCWlmIChjaGFuZ2UpCisJCXdtX3B1dChpY2UsIFdNX0FEQ19NVVgsIG52YWwpOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENTODQxNSBJbnB1dCBtdXgKKyAqLworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X211eF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RhdGljIGNoYXIgKmF1cmVvbl90ZXh0c1tdID0geworCQkiQ0QiLAkJLy9SWFAwCisJCSJPcHRpY2FsIgkvL1JYUDEKKwl9OworCXN0YXRpYyBjaGFyICpwcm9kaWd5X3RleHRzW10gPSB7CisJCSJDRCIsCisJCSJDb2F4IgorCX07CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MSkKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHByb2RpZ3lfdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCWVsc2UKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGF1cmVvbl90ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9tdXhfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCS8vc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCS8vdmFsID0gYXVyZW9uX2NzODQxNV9nZXQoaWNlLCBDUzg0MTVfQ1RSTDIpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaWNlLT5zcGVjLmF1cmVvbi5jczg0MTVfbXV4OworCS8vc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfbXV4X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgb3ZhbCwgbnZhbDsKKwlpbnQgY2hhbmdlOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCW92YWwgPSBhdXJlb25fY3M4NDE1X2dldChpY2UsIENTODQxNV9DVFJMMik7CisJbnZhbCA9IG92YWwgJiB+MHgwNzsKKwludmFsIHw9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgNzsKKwljaGFuZ2UgPSAob3ZhbCAhPSBudmFsKTsKKwlpZiAoY2hhbmdlKQorCQlhdXJlb25fY3M4NDE1X3B1dChpY2UsIENTODQxNV9DVFJMMiwgbnZhbCk7CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCWljZS0+c3BlYy5hdXJlb24uY3M4NDE1X211eCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9yYXRlX2luZm8gKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE5MjAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X3JhdGVfZ2V0IChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHJhdGlvOworCXJhdGlvID0gYXVyZW9uX2NzODQxNV9nZXQoaWNlLCBDUzg0MTVfUkFUSU8pOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGludCkoKHVuc2lnbmVkIGludClyYXRpbyAqIDc1MCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDUzg0MTVBIE11dGUKKyAqLworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X211dGVfaW5mbyAoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfbXV0ZV9nZXQgKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChhdXJlb25fY3M4NDE1X2dldChpY2UsIENTODQxNV9DVFJMMSkgJiAweDIwKSA/IDAgOiAxOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X211dGVfcHV0IChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG92YWwsIG52YWw7CisJaW50IGNoYW5nZTsKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJb3ZhbCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0NUUkwxKTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCW52YWwgPSBvdmFsICYgfjB4MjA7CisJZWxzZQorCQludmFsID0gb3ZhbCB8IDB4MjA7CisJaWYgKChjaGFuZ2UgPSAob3ZhbCAhPSBudmFsKSkpCisJCWF1cmVvbl9jczg0MTVfcHV0KGljZSwgQ1M4NDE1X0NUUkwxLCBudmFsKTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIENTODQxNUEgUS1TdWIgaW5mbworICovCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfcXN1Yl9pbmZvIChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKSB7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTOworCXVpbmZvLT5jb3VudCA9IDEwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfcXN1Yl9nZXQgKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKSB7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCWF1cmVvbl9jczg0MTVfcmVhZChpY2UsIENTODQxNV9RU1VCLCB1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwgMTApOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfc3BkaWZfaW5mbyAoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykgeworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X21hc2tfZ2V0IChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkgeworCW1lbXNldCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1cywgMHhGRiwgMjQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfc3BkaWZfZ2V0IChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkgeworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCWF1cmVvbl9jczg0MTVfcmVhZChpY2UsIENTODQxNV9DX0JVRkZFUiwgdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXMsIDI0KTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIZWFkcGhvbmUgQW1wbGlmaWVyCisgKi8KK3N0YXRpYyBpbnQgYXVyZW9uX3NldF9oZWFkcGhvbmVfYW1wKGljZTE3MTJfdCAqaWNlLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB0bXAsIHRtcDI7CisKKwl0bXAyID0gdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisJaWYgKGVuYWJsZSkKKwkJdG1wIHw9IEFVUkVPTl9IUF9TRUw7CisJZWxzZQorCQl0bXAgJj0gfiBBVVJFT05fSFBfU0VMOworCWlmICh0bXAgIT0gdG1wMikgeworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9nZXRfaGVhZHBob25lX2FtcChpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisKKwlyZXR1cm4gKCB0bXAgJiBBVVJFT05fSFBfU0VMICkhPSAwOworfQorCisjZGVmaW5lIGF1cmVvbl9ocGFtcF9pbmZvCWF1cmVvbl9tb25vX2Jvb2xfaW5mbworCitzdGF0aWMgaW50IGF1cmVvbl9ocGFtcF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGF1cmVvbl9nZXRfaGVhZHBob25lX2FtcChpY2UpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXVyZW9uX2hwYW1wX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXJldHVybiBhdXJlb25fc2V0X2hlYWRwaG9uZV9hbXAoaWNlLHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKK30KKworLyoKKyAqIERlZW1waGFzaXMKKyAqLworCisjZGVmaW5lIGF1cmVvbl9kZWVtcF9pbmZvCWF1cmVvbl9tb25vX2Jvb2xfaW5mbworCitzdGF0aWMgaW50IGF1cmVvbl9kZWVtcF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAod21fZ2V0KGljZSwgV01fREFDX0NUUkwyKSAmIDB4ZikgPT0gMHhmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9kZWVtcF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHRlbXAsIHRlbXAyOworCXRlbXAyID0gdGVtcCA9IHdtX2dldChpY2UsIFdNX0RBQ19DVFJMMik7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl0ZW1wIHw9IDB4ZjsKKwllbHNlCisJCXRlbXAgJj0gfjB4ZjsKKwlpZiAodGVtcCAhPSB0ZW1wMikgeworCQl3bV9wdXQoaWNlLCBXTV9EQUNfQ1RSTDIsIHRlbXApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBREMgT3ZlcnNhbXBsaW5nCisgKi8KK3N0YXRpYyBpbnQgYXVyZW9uX292ZXJzYW1wbGluZ19pbmZvKHNuZF9rY29udHJvbF90ICprLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICIxMjh4IiwgIjY0eCIJfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fb3ZlcnNhbXBsaW5nX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHdtX2dldChpY2UsIFdNX01BU1RFUikgJiAweDgpID09IDB4ODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fb3ZlcnNhbXBsaW5nX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpbnQgdGVtcCwgdGVtcDI7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl0ZW1wMiA9IHRlbXAgPSB3bV9nZXQoaWNlLCBXTV9NQVNURVIpOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pCisJCXRlbXAgfD0gMHg4OworCWVsc2UKKwkJdGVtcCAmPSB+MHg4OworCisJaWYgKHRlbXAgIT0gdGVtcDIpIHsKKwkJd21fcHV0KGljZSwgV01fTUFTVEVSLCB0ZW1wKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogbWl4ZXJzCisgKi8KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBhdXJlb25fZGFjX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9tYXN0ZXJfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gd21fbWFzdGVyX211dGVfZ2V0LAorCQkucHV0ID0gd21fbWFzdGVyX211dGVfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSB3bV9tYXN0ZXJfdm9sX2luZm8sCisJCS5nZXQgPSB3bV9tYXN0ZXJfdm9sX2dldCwKKwkJLnB1dCA9IHdtX21hc3Rlcl92b2xfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJGcm9udCBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IHdtX211dGVfaW5mbywKKwkJLmdldCA9IHdtX211dGVfZ2V0LAorCQkucHV0ID0gd21fbXV0ZV9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gKDIgPDwgOCkgfCAwCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJGcm9udCBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IHdtX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd21fdm9sX2dldCwKKwkJLnB1dCA9IHdtX3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gKDIgPDwgOCkgfCAwCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJSZWFyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gd21fbXV0ZV9pbmZvLAorCQkuZ2V0ID0gd21fbXV0ZV9nZXQsCisJCS5wdXQgPSB3bV9tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAoMiA8PCA4KSB8IDIKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlJlYXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSB3bV92b2xfaW5mbywKKwkJLmdldCA9IHdtX3ZvbF9nZXQsCisJCS5wdXQgPSB3bV92b2xfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9ICgyIDw8IDgpIHwgMgorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gd21fbXV0ZV9pbmZvLAorCQkuZ2V0ID0gd21fbXV0ZV9nZXQsCisJCS5wdXQgPSB3bV9tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAoMSA8PCA4KSB8IDQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IHdtX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd21fdm9sX2dldCwKKwkJLnB1dCA9IHdtX3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gKDEgPDwgOCkgfCA0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9tdXRlX2luZm8sCisJCS5nZXQgPSB3bV9tdXRlX2dldCwKKwkJLnB1dCA9IHdtX211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9ICgxIDw8IDgpIHwgNQorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTEZFIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gd21fdm9sX2luZm8sCisJCS5nZXQgPSB3bV92b2xfZ2V0LAorCQkucHV0ID0gd21fdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAoMSA8PCA4KSB8IDUKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9tdXRlX2luZm8sCisJCS5nZXQgPSB3bV9tdXRlX2dldCwKKwkJLnB1dCA9IHdtX211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9ICgyIDw8IDgpIHwgNgorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiU2lkZSBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IHdtX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd21fdm9sX2dldCwKKwkJLnB1dCA9IHdtX3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gKDIgPDwgOCkgfCA2CisJfQorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJQQ00gUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9wY21fbXV0ZV9pbmZvLAorCQkuZ2V0ID0gd21fcGNtX211dGVfZ2V0LAorCQkucHV0ID0gd21fcGNtX211dGVfcHV0CisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJQQ00gUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSB3bV9wY21fdm9sX2luZm8sCisJCS5nZXQgPSB3bV9wY21fdm9sX2dldCwKKwkJLnB1dCA9IHdtX3BjbV92b2xfcHV0CisgCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTd2l0Y2giLAorCQkuaW5mbyA9IHdtX2FkY19tdXRlX2luZm8sCisJCS5nZXQgPSB3bV9hZGNfbXV0ZV9nZXQsCisJCS5wdXQgPSB3bV9hZGNfbXV0ZV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCisJCS5pbmZvID0gd21fYWRjX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd21fYWRjX3ZvbF9nZXQsCisJCS5wdXQgPSB3bV9hZGNfdm9sX3B1dAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IHdtX2FkY19tdXhfaW5mbywKKwkJLmdldCA9IHdtX2FkY19tdXhfZ2V0LAorCQkucHV0ID0gd21fYWRjX211eF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gNQorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRXh0ZXJuYWwgQW1wbGlmaWVyIiwKKwkJLmluZm8gPSBhdXJlb25faHBhbXBfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9ocGFtcF9nZXQsCisJCS5wdXQgPSBhdXJlb25faHBhbXBfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQUMgRGVlbXBoYXNpcyBTd2l0Y2giLAorCQkuaW5mbyA9IGF1cmVvbl9kZWVtcF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2RlZW1wX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9kZWVtcF9wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkFEQyBPdmVyc2FtcGxpbmciLAorCQkuaW5mbyA9IGF1cmVvbl9vdmVyc2FtcGxpbmdfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9vdmVyc2FtcGxpbmdfZ2V0LAorCQkucHV0ID0gYXVyZW9uX292ZXJzYW1wbGluZ19wdXQKKwl9Cit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IGFjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X21tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tbXV0ZV9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVIKKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJBQzk3IFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVJ8QVVSRU9OX0FDOTdfU1RFUkVPCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiQ0QgUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0NECisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiQ0QgUGxheWJhY2sgVm9sdW1lIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCisgCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKyAJCS5wdXQgPSBhdXJlb25fYWM5N192b2xfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0NEfEFVUkVPTl9BQzk3X1NURVJFTworIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBTd2l0Y2giLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisgCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQVVYLAorIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBWb2x1bWUiLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKyAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQVVYfEFVUkVPTl9BQzk3X1NURVJFTworIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0xJTkUKKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19MSU5FfEFVUkVPTl9BQzk3X1NURVJFTworIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIk1pYyBQbGF5YmFjayBTd2l0Y2giLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisgCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiTWljIFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NSUMKKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJNaWMgQm9vc3QgKCsyMGRCKSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2luZm8sCisgCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbWljYm9vc3RfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X3B1dAorIAl9Cit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHVuaXZlcnNlX2FjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X21tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tbXV0ZV9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVIKKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJBQzk3IFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVJ8QVVSRU9OX0FDOTdfU1RFUkVPCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiQ0QgUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0FVWAorIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIkNEIFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19BVVh8QVVSRU9OX0FDOTdfU1RFUkVPCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiUGhvbm8gUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0NELAorIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIlBob25vIFBsYXliYWNrIFZvbHVtZSIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisgCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19DRHxBVVJFT05fQUM5N19TVEVSRU8KKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFN3aXRjaCIsCisgCQkuaW5mbyA9IGF1cmVvbl9hYzk3X211dGVfaW5mbywKKyAJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKKyAJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKKyAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19MSU5FCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBWb2x1bWUiLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKyAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTElORXxBVVJFT05fQUM5N19TVEVSRU8KKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJNaWMgUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01JQworIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIk1pYyBQbGF5YmFjayBWb2x1bWUiLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKyAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDCisgCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorIAkJLm5hbWUgPSAiTWljIEJvb3N0ICgrMjBkQikiLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N19taWNib29zdF9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2dldCwKKyAJCS5wdXQgPSBhdXJlb25fYWM5N19taWNib29zdF9wdXQKKyAJfSwKKyAJeworIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgCQkubmFtZSA9ICJBdXggUGxheWJhY2sgU3dpdGNoIiwKKyAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X1ZJREVPLAorIAl9LAorIAl7CisgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBWb2x1bWUiLAorIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKyAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisgCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfVklERU98QVVSRU9OX0FDOTdfU1RFUkVPCisgCX0KK307CisKKwkKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgY3M4NDE1X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksCisJCS5pbmZvID0gYXVyZW9uX2NzODQxNV9tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fY3M4NDE1X211dGVfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2NzODQxNV9tdXRlX3B1dAorCX0sCisgCXsKKyAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLE5PTkUpICJTb3VyY2UiLAorCQkuaW5mbyA9IGF1cmVvbl9jczg0MTVfbXV4X2luZm8sCisJCS5nZXQgPSBhdXJlb25fY3M4NDE1X211eF9nZXQsCisJCS5wdXQgPSBhdXJlb25fY3M4NDE1X211eF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIlEtc3ViY29kZSAiLENBUFRVUkUsREVGQVVMVCksCisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKKwkJLmluZm8gPSBhdXJlb25fY3M4NDE1X3FzdWJfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9jczg0MTVfcXN1Yl9nZXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxNQVNLKSwKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaW5mbyA9IGF1cmVvbl9jczg0MTVfc3BkaWZfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9jczg0MTVfbWFza19nZXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLERFRkFVTFQpLAorCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJCS5pbmZvID0gYXVyZW9uX2NzODQxNV9zcGRpZl9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2NzODQxNV9zcGRpZl9nZXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLE5PTkUpICJSYXRlIiwKKwkJLmFjY2VzcyA9U05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJCS5pbmZvID0gYXVyZW9uX2NzODQxNV9yYXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fY3M4NDE1X3JhdGVfZ2V0CisJfQorfTsKKworIAorc3RhdGljIGludCBfX2RldmluaXQgYXVyZW9uX2FkZF9jb250cm9scyhpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgY291bnRzOworCWludCBlcnI7CisKKwljb3VudHMgPSBBUlJBWV9TSVpFKGF1cmVvbl9kYWNfY29udHJvbHMpOworCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9BVVJFT041MV9TS1kpCisJCWNvdW50cyAtPSAyOyAvKiBubyBzaWRlICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50czsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZhdXJlb25fZGFjX2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtX2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ3bV9jb250cm9sc1tpXSwgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1VOSVZFUlNFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVuaXZlcnNlX2FjOTdfY29udHJvbHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjOTdfY29udHJvbHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZhYzk3X2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgaWQ7CisJCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwkJaWQgPSBhdXJlb25fY3M4NDE1X2dldChpY2UsIENTODQxNV9JRCk7CisJCWlmIChpZCAhPSAweDQxKQorCQkJc25kX3ByaW50aygiTm8gQ1M4NDE1IGNoaXAuIFNraXBwaW5nIENTODQxNSBjb250cm9scy5cbiIpOworCQllbHNlIGlmICgoaWQgJiAweDBGKSAhPSAweDAxKQorCQkJc25kX3ByaW50aygiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgQ1M4NDE1IHJldi4gKCVjKVxuIiwgKGNoYXIpKChpZCAmIDB4MEYpICsgJ0EnIC0gMSkpOworCQllbHNlIHsKKwkJCWZvciAoaSA9IDA7IGk8IEFSUkFZX1NJWkUoY3M4NDE1X2NvbnRyb2xzKTsgaSsrKSB7CisJCQkJc25kX2tjb250cm9sX3QgKmtjdGw7CisJCQkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCAoa2N0bCA9IHNuZF9jdGxfbmV3MSgmY3M4NDE1X2NvbnRyb2xzW2ldLCBpY2UpKSk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQkJaWYgKGkgPiAxKQorCQkJCQlrY3RsLT5pZC5kZXZpY2UgPSBpY2UtPnBjbS0+ZGV2aWNlOworCQkJfQorCQl9CisJCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNoaXAKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgYXVyZW9uX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX2F1cmVvbltdID0geworCQkvKiBUaGVzZSBjb21lIGZpcnN0IHRvIHJlZHVjZSBpbml0IHBvcCBub2lzZSAqLworCQkweDFiLCAweDA0NCwJCS8qIEFEQyBNdXggKEFDJzk3IHNvdXJjZSkgKi8KKwkJMHgxYywgMHgwMEIsCQkvKiBPdXQgTXV4MSAoVk9VVDEgPSBEQUMrQVVYLCBWT1VUMiA9IERBQykgKi8KKwkJMHgxZCwgMHgwMDksCQkvKiBPdXQgTXV4MiAoVk9VVDIgPSBEQUMsIFZPVVQzID0gREFDKSAqLworCisJCTB4MTgsIDB4MDAwLAkJLyogQWxsIHBvd2VyLXVwICovCisKKwkJMHgxNiwgMHgxMjIsCQkvKiBJMlMsIG5vcm1hbCBwb2xhcml0eSwgMjRiaXQgKi8KKwkJMHgxNywgMHgwMjIsCQkvKiAyNTZmcywgc2xhdmUgbW9kZSAqLworCQkweDAwLCAwLAkJLyogREFDMSBhbmFsb2cgbXV0ZSAqLworCQkweDAxLCAwLAkJLyogREFDMiBhbmFsb2cgbXV0ZSAqLworCQkweDAyLCAwLAkJLyogREFDMyBhbmFsb2cgbXV0ZSAqLworCQkweDAzLCAwLAkJLyogREFDNCBhbmFsb2cgbXV0ZSAqLworCQkweDA0LCAwLAkJLyogREFDNSBhbmFsb2cgbXV0ZSAqLworCQkweDA1LCAwLAkJLyogREFDNiBhbmFsb2cgbXV0ZSAqLworCQkweDA2LCAwLAkJLyogREFDNyBhbmFsb2cgbXV0ZSAqLworCQkweDA3LCAwLAkJLyogREFDOCBhbmFsb2cgbXV0ZSAqLworCQkweDA4LCAweDEwMCwJCS8qIG1hc3RlciBhbmFsb2cgbXV0ZSAqLworCQkweDA5LCAweGZmLAkJLyogREFDMSBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgwYSwgMHhmZiwJCS8qIERBQzIgZGlnaXRhbCBmdWxsICovCisJCTB4MGIsIDB4ZmYsCQkvKiBEQUMzIGRpZ2l0YWwgZnVsbCAqLworCQkweDBjLCAweGZmLAkJLyogREFDNCBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgwZCwgMHhmZiwJCS8qIERBQzUgZGlnaXRhbCBmdWxsICovCisJCTB4MGUsIDB4ZmYsCQkvKiBEQUM2IGRpZ2l0YWwgZnVsbCAqLworCQkweDBmLCAweGZmLAkJLyogREFDNyBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgxMCwgMHhmZiwJCS8qIERBQzggZGlnaXRhbCBmdWxsICovCisJCTB4MTEsIDB4MWZmLAkJLyogbWFzdGVyIGRpZ2l0YWwgZnVsbCAqLworCQkweDEyLCAweDAwMCwJCS8qIHBoYXNlIG5vcm1hbCAqLworCQkweDEzLCAweDA5MCwJCS8qIHVubXV0ZSBEQUMgTC9SICovCisJCTB4MTQsIDB4MDAwLAkJLyogYWxsIHVubXV0ZSAqLworCQkweDE1LCAweDAwMCwJCS8qIG5vIGRlZW1waGFzaXMsIG5vIFpGTEcgKi8KKwkJMHgxOSwgMHgwMDAsCQkvKiAtMTJkQiBBREMvTCAqLworCQkweDFhLCAweDAwMCwJCS8qIC0xMmRCIEFEQy9SICovCisJCSh1bnNpZ25lZCBzaG9ydCktMQorCX07CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX3Byb2RpZ3lbXSA9IHsKKworCQkvKiBUaGVzZSBjb21lIGZpcnN0IHRvIHJlZHVjZSBpbml0IHBvcCBub2lzZSAqLworCQkweDFiLCAweDAwMCwJCS8qIEFEQyBNdXggKi8KKwkJMHgxYywgMHgwMDksCQkvKiBPdXQgTXV4MSAqLworCQkweDFkLCAweDAwOSwJCS8qIE91dCBNdXgyICovCisKKwkJMHgxOCwgMHgwMDAsCQkvKiBBbGwgcG93ZXItdXAgKi8KKworCQkweDE2LCAweDAyMiwJCS8qIEkyUywgbm9ybWFsIHBvbGFyaXR5LCAyNGJpdCwgaGlnaC1wYXNzIG9uICovCisJCTB4MTcsIDB4MDA2LAkJLyogMTI4ZnMsIHNsYXZlIG1vZGUgKi8KKworCQkweDAwLCAwLAkJLyogREFDMSBhbmFsb2cgbXV0ZSAqLworCQkweDAxLCAwLAkJLyogREFDMiBhbmFsb2cgbXV0ZSAqLworCQkweDAyLCAwLAkJLyogREFDMyBhbmFsb2cgbXV0ZSAqLworCQkweDAzLCAwLAkJLyogREFDNCBhbmFsb2cgbXV0ZSAqLworCQkweDA0LCAwLAkJLyogREFDNSBhbmFsb2cgbXV0ZSAqLworCQkweDA1LCAwLAkJLyogREFDNiBhbmFsb2cgbXV0ZSAqLworCQkweDA2LCAwLAkJLyogREFDNyBhbmFsb2cgbXV0ZSAqLworCQkweDA3LCAwLAkJLyogREFDOCBhbmFsb2cgbXV0ZSAqLworCQkweDA4LCAweDEwMCwJCS8qIG1hc3RlciBhbmFsb2cgbXV0ZSAqLworCisJCTB4MDksIDB4N2YsCQkvKiBEQUMxIGRpZ2l0YWwgZnVsbCAqLworCQkweDBhLCAweDdmLAkJLyogREFDMiBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgwYiwgMHg3ZiwJCS8qIERBQzMgZGlnaXRhbCBmdWxsICovCisJCTB4MGMsIDB4N2YsCQkvKiBEQUM0IGRpZ2l0YWwgZnVsbCAqLworCQkweDBkLCAweDdmLAkJLyogREFDNSBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgwZSwgMHg3ZiwJCS8qIERBQzYgZGlnaXRhbCBmdWxsICovCisJCTB4MGYsIDB4N2YsCQkvKiBEQUM3IGRpZ2l0YWwgZnVsbCAqLworCQkweDEwLCAweDdmLAkJLyogREFDOCBkaWdpdGFsIGZ1bGwgKi8KKwkJMHgxMSwgMHgxRkYsCQkvKiBtYXN0ZXIgZGlnaXRhbCBmdWxsICovCisKKwkJMHgxMiwgMHgwMDAsCQkvKiBwaGFzZSBub3JtYWwgKi8KKwkJMHgxMywgMHgwOTAsCQkvKiB1bm11dGUgREFDIEwvUiAqLworCQkweDE0LCAweDAwMCwJCS8qIGFsbCB1bm11dGUgKi8KKwkJMHgxNSwgMHgwMDAsCQkvKiBubyBkZWVtcGhhc2lzLCBubyBaRkxHICovCisKKwkJMHgxOSwgMHgwMDAsCQkvKiAtMTJkQiBBREMvTCAqLworCQkweDFhLCAweDAwMCwJCS8qIC0xMmRCIEFEQy9SICovCisJCSh1bnNpZ25lZCBzaG9ydCktMQorCisJfTsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3NfaW5pdHNbXSA9IHsKKwkJMHgwNDQxLCAvKiBSVU4gKi8KKwkJMHgwMTgwLCAvKiBubyBtdXRlLCBPTUNLIG91dHB1dCBvbiBSTUNLIHBpbiAqLworCQkweDAyMDEsIC8qIFMvUERJRiBzb3VyY2Ugb24gUlhQMSAqLworCQkweDA2MDUsIC8qIHNsYXZlLCAyNGJpdCwgTVNCIG9uIHNlY29uZCBPU0NMSywgU0RPVVQgZm9yIHJpZ2h0IGNoYW5uZWwgd2hlbiBPTFJDSyBpcyBoaWdoICovCisJCSh1bnNpZ25lZCBzaG9ydCktMQorCX07CisJdW5zaWduZWQgaW50IHRtcDsKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKwlpbnQgZXJyLCBpOworCisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjUxX1NLWSkgeworCQlpY2UtPm51bV90b3RhbF9kYWNzID0gNjsKKwkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJfSBlbHNlIHsKKwkJLyogYXVyZW9uIDcuMSBhbmQgcHJvZGlneSA3LjEgKi8KKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOworCX0KKworCS8qIHRvIHJlbWViZXIgdGhlIHJlZ2lzdGVyIHZhbHVlcyBvZiBDUzg0MTUgKi8KKwlpY2UtPmFrbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKGFrbTR4eHhfdCksIEdGUF9LRVJORUwpOworCWlmICghIGljZS0+YWttKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpY2UtPmFrbV9jb2RlY3MgPSAxOworCQorCWlmICgoZXJyID0gYXVyZW9uX2FjOTdfaW5pdChpY2UpKSAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgMHg1ZmZmZmYpOyAvKiBmaXggdGhpcyBmb3IgdGhlIHRpbWUgYmVpbmcgKi8KKworCS8qIHJlc2V0IHRoZSB3bSBjb2RlYyBhcyB0aGUgU1BJIG1vZGUgKi8KKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH4oQVVSRU9OX1dNX1JFU0VUfEFVUkVPTl9XTV9DU3xBVVJFT05fQ1M4NDE1X0NTfEFVUkVPTl9IUF9TRUwpKTsKKworCXRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCXRtcCAmPSB+QVVSRU9OX1dNX1JFU0VUOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKwl0bXAgfD0gQVVSRU9OX1dNX0NTIHwgQVVSRU9OX0NTODQxNV9DUzsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMSk7CisJdG1wIHw9IEFVUkVPTl9XTV9SRVNFVDsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBpbml0aWFsaXplIFdNODc3MCBjb2RlYyAqLworCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzEpCisJCXAgPSB3bV9pbml0c19wcm9kaWd5OworCWVsc2UKKwkJcCA9IHdtX2luaXRzX2F1cmVvbjsKKwlmb3IgKDsgKnAgIT0gKHVuc2lnbmVkIHNob3J0KS0xOyBwICs9IDIpCisJCXdtX3B1dChpY2UsIHBbMF0sIHBbMV0pOworCisJLyogaW5pdGlhbGl6ZSBDUzg0MTVBIGNvZGVjICovCisJZm9yIChwID0gY3NfaW5pdHM7ICpwICE9ICh1bnNpZ25lZCBzaG9ydCktMTsgcCsrKQorCQlhdXJlb25fc3BpX3dyaXRlKGljZSwgQVVSRU9OX0NTODQxNV9DUywgKnAgfCAweDIwMDAwMCwgMjQpOworCWljZS0+c3BlYy5hdXJlb24uY3M4NDE1X211eCA9IDE7CisKKwlhdXJlb25fc2V0X2hlYWRwaG9uZV9hbXAoaWNlLCAxKTsKKworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwkKKwlpY2UtPnNwZWMuYXVyZW9uLm1hc3RlclswXSA9IFdNX1ZPTF9NVVRFOworCWljZS0+c3BlYy5hdXJlb24ubWFzdGVyWzFdID0gV01fVk9MX01VVEU7CisJZm9yIChpID0gMDsgaSA8IGljZS0+bnVtX3RvdGFsX2RhY3M7IGkrKykgeworCQlpY2UtPnNwZWMuYXVyZW9uLnZvbFtpXSA9IFdNX1ZPTF9NVVRFOworCQl3bV9zZXRfdm9sKGljZSwgaSwgaWNlLT5zcGVjLmF1cmVvbi52b2xbaV0sIGljZS0+c3BlYy5hdXJlb24ubWFzdGVyW2kgJSAyXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEF1cmVvbiBib2FyZHMgZG9uJ3QgcHJvdmlkZSB0aGUgRUVQUk9NIGRhdGEgZXhjZXB0IGZvciB0aGUgdmVuZG9yIElEcy4KKyAqIGhlbmNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gc2V0cyB1cCBpdCBwcm9wZXJseS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdXJlb241MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCTB4MGEsCS8qIFNZU0NPTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCAzREFDcyAqLworCTB4ODAsCS8qIEFDTElOSzogSTJTICovCisJMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KKwkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCTB4ZmYsCS8qIEdQSU9fRElSICovCisJMHhmZiwJLyogR1BJT19ESVIxICovCisJMHg1ZiwJLyogR1BJT19ESVIyICovCisJMHgwMCwJLyogR1BJT19NQVNLICovCisJMHgwMCwJLyogR1BJT19NQVNLMSAqLworCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFICovCisJMHgwMCwJLyogR1BJT19TVEFURTEgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uNzFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwkweDBiLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLworCTB4ZmMsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwkweGZmLAkvKiBHUElPX0RJUiAqLworCTB4ZmYsCS8qIEdQSU9fRElSMSAqLworCTB4NWYsCS8qIEdQSU9fRElSMiAqLworCTB4MDAsCS8qIEdQSU9fTUFTSyAqLworCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KKwkweDAwLAkvKiBHUElPX01BU0syICovCisJMHgwMCwJLyogR1BJT19TVEFURSAqLworCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCisJMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCTB4MGIsCS8qIFNZU0NPTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLworCTB4ODAsCS8qIEFDTElOSzogSTJTICovCisJMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KKwkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCTB4ZmYsCS8qIEdQSU9fRElSICovCisJMHhmZiwJLyogR1BJT19ESVIxICovCisJMHg1ZiwJLyogR1BJT19ESVIyICovCisJMHgwMCwJLyogR1BJT19NQVNLICovCisJMHgwMCwJLyogR1BJT19NQVNLMSAqLworCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFICovCisJMHgwMCwJLyogR1BJT19TVEFURTEgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworfTsKKworLyogZW50cnkgcG9pbnQgKi8KK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONTFfU0tZLAorCQkubmFtZSA9ICJUZXJyYXRlYyBBdXJlb24gNS4xLVNreSIsCisJCS5tb2RlbCA9ICJhdXJlb241MSIsCisJCS5jaGlwX2luaXQgPSBhdXJlb25faW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gYXVyZW9uX2FkZF9jb250cm9scywKKwkJLmVlcHJvbV9zaXplID0gc2l6ZW9mKGF1cmVvbjUxX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IGF1cmVvbjUxX2VlcHJvbSwKKwkJLmRyaXZlciA9ICJBdXJlb241MSIsCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1NQQUNFLAorCQkubmFtZSA9ICJUZXJyYXRlYyBBdXJlb24gNy4xLVNwYWNlIiwKKwkJLm1vZGVsID0gImF1cmVvbjcxIiwKKwkJLmNoaXBfaW5pdCA9IGF1cmVvbl9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBhdXJlb25fYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2YoYXVyZW9uNzFfZWVwcm9tKSwKKwkJLmVlcHJvbV9kYXRhID0gYXVyZW9uNzFfZWVwcm9tLAorCQkuZHJpdmVyID0gIkF1cmVvbjcxIiwKKwl9LAorIAl7CisgCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9VTklWRVJTRSwKKyAJCS5uYW1lID0gIlRlcnJhdGVjIEF1cmVvbiA3LjEtVW5pdmVyc2UiLAorCQkubW9kZWwgPSAidW5pdmVyc2UiLAorIAkJLmNoaXBfaW5pdCA9IGF1cmVvbl9pbml0LAorIAkJLmJ1aWxkX2NvbnRyb2xzID0gYXVyZW9uX2FkZF9jb250cm9scywKKyAJCS5lZXByb21fc2l6ZSA9IHNpemVvZihhdXJlb243MV9lZXByb20pLAorIAkJLmVlcHJvbV9kYXRhID0gYXVyZW9uNzFfZWVwcm9tLAorCQkuZHJpdmVyID0gIkF1cmVvbjcxVW5pdmVyc2UiLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzEsCisJCS5uYW1lID0gIkF1ZGlvdHJhayBQcm9kaWd5IDcuMSIsCisJCS5tb2RlbCA9ICJwcm9kaWd5NzEiLAorCQkuY2hpcF9pbml0ID0gYXVyZW9uX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IGF1cmVvbl9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZihwcm9kaWd5NzFfZWVwcm9tKSwKKwkJLmVlcHJvbV9kYXRhID0gcHJvZGlneTcxX2VlcHJvbSwKKwkJLmRyaXZlciA9ICJQcm9kaWd5NzEiLCAvKiBzaG91bGQgYmUgaWRlbnRpY2FsIHdpdGggQXVyZW9uNzEgKi8KKwl9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQ1MTVmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfX1NPVU5EX0FVUkVPTl9ICisjZGVmaW5lIF9fU09VTkRfQVVSRU9OX0gKKworLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIFZJQSBWVDE3MjQgKEVudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBUZXJyYXRlYyBBdXJlb24gY2FyZHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2RlZmluZSAgQVVSRU9OX0RFVklDRV9ERVNDIAkgICAgICAgIntUZXJyYXRlYyxBdXJlb24gNS4xIFNreX0sIlwKKwkJCQkgICAgICAgIntUZXJyYXRlYyxBdXJlb24gNy4xIFNwYWNlfSwiXAorCQkJCSAgICAgICAie1RlcnJhdGVjLEF1cmVvbiA3LjEgVW5pdmVyc2V9LCIgXAorCQkJCQkie0F1ZGlvVHJhayxQcm9kaWd5IDcuMX0sIgorCisjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONTFfU0tZCTB4M2IxNTQ3MTEJLyogQXVyZW9uIDUuMSBTa3kgKi8KKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9TUEFDRQkweDNiMTU0NTExCS8qIEF1cmVvbiA3LjEgU3BhY2UgKi8KKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9VTklWRVJTRQkweDNiMTU1MzExCS8qIEF1cmVvbiA3LjEgVW5pdmVyc2UgKi8KKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzEJMHgzMzQ5NTM0NQkvKiBQUk9ESUdZIDcuMSAqLworCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXTsKKworLyogR1BJTyBiaXRzICovCisjZGVmaW5lIEFVUkVPTl9DUzg0MTVfQ1MJKDEgPDwgMjIpCisjZGVmaW5lIEFVUkVPTl9TUElfTUlTTwkJKDEgPDwgMjEpCisjZGVmaW5lIEFVUkVPTl9XTV9SRVNFVAkJKDEgPDwgMjApCisjZGVmaW5lIEFVUkVPTl9TUElfQ0xLCQkoMSA8PCAxOSkKKyNkZWZpbmUgQVVSRU9OX1NQSV9NT1NJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQVVSRU9OX1dNX1JXCQkoMSA8PCAxNykKKyNkZWZpbmUgQVVSRU9OX0FDOTdfUkVTRVQJKDEgPDwgMTYpCisjZGVmaW5lIEFVUkVPTl9ESUdJVEFMX1NFTDEJKDEgPDwgMTUpCisjZGVmaW5lIEFVUkVPTl9IUF9TRUwJCSgxIDw8IDE0KQorI2RlZmluZSBBVVJFT05fV01fQ1MJCSgxIDw8IDEyKQorI2RlZmluZSBBVVJFT05fQUM5N19DT01NSVQJKDEgPDwgMTEpCisjZGVmaW5lIEFVUkVPTl9BQzk3X0FERFIJKDEgPDwgMTApCisjZGVmaW5lIEFVUkVPTl9BQzk3X0RBVEFfTE9XCSgxIDw8IDkpCisjZGVmaW5lIEFVUkVPTl9BQzk3X0RBVEFfSElHSAkoMSA8PCA4KQorI2RlZmluZSBBVVJFT05fQUM5N19EQVRBX01BU0sJMHhGRgorCisjZW5kaWYgLyogX19TT1VORF9BVVJFT05fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyMGY3MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkKKyAqCisgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgTS1BdWRpbyBEZWx0YSAxMDEwLCA0NCwgNjYsIERpbzI0OTYsIEF1ZGlvcGhpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBEaWdpZ3JhbSBWWDQ0MgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jczg0MjcuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisKKyNkZWZpbmUgU05EX0NTODQwMworI2luY2x1ZGUgPHNvdW5kL2NzODQwMy5oPgorCisKKy8qCisgKiBDUzg0MjcgdmlhIFNQSSBtb2RlIChmb3IgQXVkaW9waGlsZSksIGVtdWxhdGVkIEkyQworICovCisKKy8qIHNlbmQgOCBiaXRzICovCitzdGF0aWMgdm9pZCBhcF9jczg0Mjdfd3JpdGVfYnl0ZShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBjaGFyIHRtcCkKK3sKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSA3OyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJdG1wICY9IH4oSUNFMTcxMl9ERUxUQV9BUF9ET1VUfElDRTE3MTJfREVMVEFfQVBfQ0NMSyk7CisJCWlmIChkYXRhICYgKDEgPDwgaWR4KSkKKwkJCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0RPVVQ7CisJCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wKTsKKwkJdWRlbGF5KDUpOworCQl0bXAgfD0gSUNFMTcxMl9ERUxUQV9BUF9DQ0xLOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIHRtcCk7CisJCXVkZWxheSg1KTsKKwl9Cit9CisKKy8qIHJlYWQgOCBiaXRzICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBhcF9jczg0MjdfcmVhZF9ieXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIHRtcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGEgPSAwOworCWludCBpZHg7CisJCisJZm9yIChpZHggPSA3OyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJdG1wICY9IH5JQ0UxNzEyX0RFTFRBX0FQX0NDTEs7CisJCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wKTsKKwkJdWRlbGF5KDUpOworCQlpZiAoc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpICYgSUNFMTcxMl9ERUxUQV9BUF9ESU4pCisJCQlkYXRhIHw9IDEgPDwgaWR4OworCQl0bXAgfD0gSUNFMTcxMl9ERUxUQV9BUF9DQ0xLOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIHRtcCk7CisJCXVkZWxheSg1KTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIGFzc2VydCBjaGlwIHNlbGVjdCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXBfY3M4NDI3X2NvZGVjX3NlbGVjdChpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwl0bXAgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSk7CisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMExUOgorCQl0bXAgJj0gfklDRTE3MTJfREVMVEFfMTAxMExUX0NTOworCQl0bXAgfD0gSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ0NMSyB8IElDRTE3MTJfREVMVEFfMTAxMExUX0NTX0NTODQyNzsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9BVURJT1BISUxFOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0MTA6CisJCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0NDTEsgfCBJQ0UxNzEyX0RFTFRBX0FQX0NTX0NPREVDOworCQl0bXAgJj0gfklDRTE3MTJfREVMVEFfQVBfQ1NfRElHSVRBTDsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKKwkJdG1wIHw9IElDRTE3MTJfVlg0NDJfQ0NMSyB8IElDRTE3MTJfVlg0NDJfQ09ERUNfQ0hJUF9BIHwgSUNFMTcxMl9WWDQ0Ml9DT0RFQ19DSElQX0I7CisJCXRtcCAmPSB+SUNFMTcxMl9WWDQ0Ml9DU19ESUdJVEFMOworCQlicmVhazsKKwl9CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCB0bXApOworCXVkZWxheSg1KTsKKwlyZXR1cm4gdG1wOworfQorCisvKiBkZWFzc2VydCBjaGlwIHNlbGVjdCAqLworc3RhdGljIHZvaWQgYXBfY3M4NDI3X2NvZGVjX2RlYXNzZXJ0KGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIHRtcCkKK3sKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwTFQ6CisJCXRtcCAmPSB+SUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1M7CisJCXRtcCB8PSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9DU19OT05FOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0FVRElPUEhJTEU6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTQxMDoKKwkJdG1wIHw9IElDRTE3MTJfREVMVEFfQVBfQ1NfRElHSVRBTDsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKKwkJdG1wIHw9IElDRTE3MTJfVlg0NDJfQ1NfRElHSVRBTDsKKwkJYnJlYWs7CisJfQorCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wKTsKK30KKworLyogc2VxdWVudGlhbCB3cml0ZSAqLworc3RhdGljIGludCBhcF9jczg0Mjdfc2VuZGJ5dGVzKHNuZF9pMmNfZGV2aWNlX3QgKmRldmljZSwgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBjb3VudCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IGRldmljZS0+YnVzLT5wcml2YXRlX2RhdGE7CisJaW50IHJlcyA9IGNvdW50OworCXVuc2lnbmVkIGNoYXIgdG1wOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl0bXAgPSBhcF9jczg0MjdfY29kZWNfc2VsZWN0KGljZSk7CisJYXBfY3M4NDI3X3dyaXRlX2J5dGUoaWNlLCAoZGV2aWNlLT5hZGRyIDw8IDEpIHwgMCwgdG1wKTsgLyogYWRkcmVzcyArIHdyaXRlIG1vZGUgKi8KKwl3aGlsZSAoY291bnQtLSA+IDApCisJCWFwX2NzODQyN193cml0ZV9ieXRlKGljZSwgKmJ5dGVzKyssIHRtcCk7CisJYXBfY3M4NDI3X2NvZGVjX2RlYXNzZXJ0KGljZSwgdG1wKTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBzZXF1ZW50aWFsIHJlYWQgKi8KK3N0YXRpYyBpbnQgYXBfY3M4NDI3X3JlYWRieXRlcyhzbmRfaTJjX2RldmljZV90ICpkZXZpY2UsIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgY291bnQpCit7CisJaWNlMTcxMl90ICppY2UgPSBkZXZpY2UtPmJ1cy0+cHJpdmF0ZV9kYXRhOworCWludCByZXMgPSBjb3VudDsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwkKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCXRtcCA9IGFwX2NzODQyN19jb2RlY19zZWxlY3QoaWNlKTsKKwlhcF9jczg0Mjdfd3JpdGVfYnl0ZShpY2UsIChkZXZpY2UtPmFkZHIgPDwgMSkgfCAxLCB0bXApOyAvKiBhZGRyZXNzICsgcmVhZCBtb2RlICovCisJd2hpbGUgKGNvdW50LS0gPiAwKQorCQkqYnl0ZXMrKyA9IGFwX2NzODQyN19yZWFkX2J5dGUoaWNlLCB0bXApOworCWFwX2NzODQyN19jb2RlY19kZWFzc2VydChpY2UsIHRtcCk7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBhcF9jczg0MjdfcHJvYmVhZGRyKHNuZF9pMmNfYnVzX3QgKmJ1cywgdW5zaWduZWQgc2hvcnQgYWRkcikKK3sKKwlpZiAoYWRkciA9PSAweDEwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIHNuZF9pMmNfb3BzX3QgYXBfY3M4NDI3X2kyY19vcHMgPSB7CisJLnNlbmRieXRlcyA9IGFwX2NzODQyN19zZW5kYnl0ZXMsCisJLnJlYWRieXRlcyA9IGFwX2NzODQyN19yZWFkYnl0ZXMsCisJLnByb2JlYWRkciA9IGFwX2NzODQyN19wcm9iZWFkZHIsCit9OworCisvKgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX2RlbHRhX2NzODQwM19zcGRpZl93cml0ZShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgY2hhciBiaXRzKQoreworCXVuc2lnbmVkIGNoYXIgdG1wLCBtYXNrMSwgbWFzazI7CisJaW50IGlkeDsKKwkvKiBzZW5kIGJ5dGUgdG8gdHJhbnNtaXR0ZXIgKi8KKwltYXNrMSA9IElDRTE3MTJfREVMVEFfU1BESUZfT1VUX1NUQVRfQ0xPQ0s7CisJbWFzazIgPSBJQ0UxNzEyX0RFTFRBX1NQRElGX09VVF9TVEFUX0RBVEE7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl0bXAgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSk7CisJZm9yIChpZHggPSA3OyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJdG1wICY9IH4obWFzazEgfCBtYXNrMik7CisJCWlmIChiaXRzICYgKDEgPDwgaWR4KSkKKwkJCXRtcCB8PSBtYXNrMjsKKwkJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCB0bXApOworCQl1ZGVsYXkoMTAwKTsKKwkJdG1wIHw9IG1hc2sxOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIHRtcCk7CisJCXVkZWxheSgxMDApOworCX0KKwl0bXAgJj0gfm1hc2sxOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wKTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKK30KKworCitzdGF0aWMgdm9pZCBkZWx0YV9zcGRpZl9kZWZhdWx0X2dldChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzbmRfY3M4NDAzX2RlY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LCBpY2UtPnNwZGlmLmNzODQwM19iaXRzKTsKK30KKworc3RhdGljIGludCBkZWx0YV9zcGRpZl9kZWZhdWx0X3B1dChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisKKwl2YWwgPSBzbmRfY3M4NDAzX2VuY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4KTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSBpY2UtPnNwZGlmLmNzODQwM19iaXRzICE9IHZhbDsKKwlpY2UtPnNwZGlmLmNzODQwM19iaXRzID0gdmFsOworCWlmIChjaGFuZ2UgJiYgaWNlLT5wbGF5YmFja19wcm9fc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwkJc25kX2ljZTE3MTJfZGVsdGFfY3M4NDAzX3NwZGlmX3dyaXRlKGljZSwgdmFsKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgdm9pZCBkZWx0YV9zcGRpZl9zdHJlYW1fZ2V0KGljZTE3MTJfdCAqaWNlLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXNuZF9jczg0MDNfZGVjb2RlX3NwZGlmX2JpdHMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgsIGljZS0+c3BkaWYuY3M4NDAzX3N0cmVhbV9iaXRzKTsKK30KKworc3RhdGljIGludCBkZWx0YV9zcGRpZl9zdHJlYW1fcHV0KGljZTE3MTJfdCAqaWNlLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKworCXZhbCA9IHNuZF9jczg0MDNfZW5jb2RlX3NwZGlmX2JpdHMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCWNoYW5nZSA9IGljZS0+c3BkaWYuY3M4NDAzX3N0cmVhbV9iaXRzICE9IHZhbDsKKwlpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0cyA9IHZhbDsKKwlpZiAoY2hhbmdlICYmIGljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJCXNuZF9pY2UxNzEyX2RlbHRhX2NzODQwM19zcGRpZl93cml0ZShpY2UsIHZhbCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworCisvKgorICogQUs0NTI0IG9uIERlbHRhIDQ0IGFuZCA2NiB0byBjaG9vc2UgdGhlIGNoaXAgbWFzaworICovCitzdGF0aWMgdm9pZCBkZWx0YV9hazQ1MjRfbG9jayhha200eHh4X3QgKmFrLCBpbnQgY2hpcCkKK3sKKyAgICAgICAgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqcHJpdiA9ICh2b2lkICopYWstPnByaXZhdGVfdmFsdWVbMF07CisgICAgICAgIGljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlwcml2LT5jc19tYXNrID0KKwlwcml2LT5jc19hZGRyID0gY2hpcCA9PSAwID8gSUNFMTcxMl9ERUxUQV9DT0RFQ19DSElQX0EgOgorCQkJCSAgICBJQ0UxNzEyX0RFTFRBX0NPREVDX0NISVBfQjsKK30KKworLyoKKyAqIEFLNDUyNCBvbiBEZWx0YTEwMTBMVCB0byBjaG9vc2UgdGhlIGNoaXAgYWRkcmVzcworICovCitzdGF0aWMgdm9pZCBkZWx0YTEwMTBsdF9hazQ1MjRfbG9jayhha200eHh4X3QgKmFrLCBpbnQgY2hpcCkKK3sKKyAgICAgICAgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqcHJpdiA9ICh2b2lkICopYWstPnByaXZhdGVfdmFsdWVbMF07CisgICAgICAgIGljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlwcml2LT5jc19tYXNrID0gSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1M7CisJcHJpdi0+Y3NfYWRkciA9IGNoaXAgPDwgNDsKK30KKworLyoKKyAqIEFLNDUyOCBvbiBWWDQ0MiB0byBjaG9vc2UgdGhlIGNoaXAgbWFzaworICovCitzdGF0aWMgdm9pZCB2eDQ0Ml9hazQ1MjRfbG9jayhha200eHh4X3QgKmFrLCBpbnQgY2hpcCkKK3sKKyAgICAgICAgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqcHJpdiA9ICh2b2lkICopYWstPnByaXZhdGVfdmFsdWVbMF07CisgICAgICAgIGljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlwcml2LT5jc19tYXNrID0KKwlwcml2LT5jc19hZGRyID0gY2hpcCA9PSAwID8gSUNFMTcxMl9WWDQ0Ml9DT0RFQ19DSElQX0EgOgorCQkJCSAgICBJQ0UxNzEyX1ZYNDQyX0NPREVDX0NISVBfQjsKK30KKworLyoKKyAqIGNoYW5nZSB0aGUgREZTIGJpdCBhY2NvcmRpbmcgcmF0ZSBmb3IgRGVsdGExMDEwCisgKi8KK3N0YXRpYyB2b2lkIGRlbHRhXzEwMTBfc2V0X3JhdGVfdmFsKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcCwgdG1wMjsKKworCWlmIChyYXRlID09IDApCS8qIG5vIGhpbnQgLSBTL1BESUYgaW5wdXQgaXMgbWFzdGVyLCBzaW1wbHkgcmV0dXJuICovCisJCXJldHVybjsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJdG1wID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpOworCXRtcDIgPSB0bXAgJiB+SUNFMTcxMl9ERUxUQV9ERlM7CisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJdG1wMiB8PSBJQ0UxNzEyX0RFTFRBX0RGUzsKKwlpZiAodG1wICE9IHRtcDIpCisJCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wMik7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7Cit9CisKKy8qCisgKiBjaGFuZ2UgdGhlIHJhdGUgb2YgQUs0NTI0IG9uIERlbHRhIDQ0LzY2LCBBUCwgMTAxMExUCisgKi8KK3N0YXRpYyB2b2lkIGRlbHRhX2FrNDUyNF9zZXRfcmF0ZV92YWwoYWttNHh4eF90ICphaywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgY2hhciB0bXAsIHRtcDI7CisJaWNlMTcxMl90ICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCisJaWYgKHJhdGUgPT0gMCkJLyogbm8gaGludCAtIFMvUERJRiBpbnB1dCBpcyBtYXN0ZXIsIHNpbXBseSByZXR1cm4gKi8KKwkJcmV0dXJuOworCisJLyogY2hlY2sgYmVmb3JlIHJlc2V0IGFrNDUyNCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjbGlja3MgKi8KKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCXRtcCA9IHNuZF9pY2UxNzEyX3JlYWQoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBKTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwl0bXAyID0gdG1wICYgfklDRTE3MTJfREVMVEFfREZTOyAKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQl0bXAyIHw9IElDRTE3MTJfREVMVEFfREZTOworCWlmICh0bXAgPT0gdG1wMikKKwkJcmV0dXJuOworCisJLyogZG8gaXQgYWdhaW4gKi8KKwlzbmRfYWttNHh4eF9yZXNldChhaywgMSk7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl0bXAgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSkgJiB+SUNFMTcxMl9ERUxUQV9ERlM7CisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJdG1wIHw9IElDRTE3MTJfREVMVEFfREZTOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgdG1wKTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlzbmRfYWttNHh4eF9yZXNldChhaywgMCk7Cit9CisKKy8qCisgKiBjaGFuZ2UgdGhlIHJhdGUgb2YgQUs0NTI0IG9uIFZYNDQyCisgKi8KK3N0YXRpYyB2b2lkIHZ4NDQyX2FrNDUyNF9zZXRfcmF0ZV92YWwoYWttNHh4eF90ICphaywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwl2YWwgPSAocmF0ZSA+IDQ4MDAwKSA/IDB4NjUgOiAweDYwOworCWlmIChzbmRfYWttNHh4eF9nZXQoYWssIDAsIDB4MDIpICE9IHZhbCB8fAorCSAgICBzbmRfYWttNHh4eF9nZXQoYWssIDEsIDB4MDIpICE9IHZhbCkgeworCQlzbmRfYWttNHh4eF9yZXNldChhaywgMSk7CisJCXNuZF9ha200eHh4X3dyaXRlKGFrLCAwLCAweDAyLCB2YWwpOworCQlzbmRfYWttNHh4eF93cml0ZShhaywgMSwgMHgwMiwgdmFsKTsKKwkJc25kX2FrbTR4eHhfcmVzZXQoYWssIDApOworCX0KK30KKworCisvKgorICogU1BESUYgb3BzIGZvciBEZWx0YSAxMDEwLCBEaW8sIDY2CisgKi8KKworLyogb3BlbiBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgZGVsdGFfb3Blbl9zcGRpZihpY2UxNzEyX3QgKmljZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0cyA9IGljZS0+c3BkaWYuY3M4NDAzX2JpdHM7Cit9CisKKy8qIHNldCB1cCAqLworc3RhdGljIHZvaWQgZGVsdGFfc2V0dXBfc3BkaWYoaWNlMTcxMl90ICppY2UsIGludCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgY2hhbmdlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKwl0bXAgPSBpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0czsKKwlpZiAodG1wICYgMHgwMSkJCS8qIGNvbnN1bWVyICovCisJCXRtcCAmPSAodG1wICYgMHgwMSkgPyB+MHgwNiA6IH4weDE4OworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMzIwMDA6IHRtcCB8PSAodG1wICYgMHgwMSkgPyAweDA0IDogMHgwMDsgYnJlYWs7CisJY2FzZSA0NDEwMDogdG1wIHw9ICh0bXAgJiAweDAxKSA/IDB4MDAgOiAweDEwOyBicmVhazsKKwljYXNlIDQ4MDAwOiB0bXAgfD0gKHRtcCAmIDB4MDEpID8gMHgwMiA6IDB4MDg7IGJyZWFrOworCWRlZmF1bHQ6IHRtcCB8PSAodG1wICYgMHgwMSkgPyAweDAwIDogMHgxODsgYnJlYWs7CisJfQorCWNoYW5nZSA9IGljZS0+c3BkaWYuY3M4NDAzX3N0cmVhbV9iaXRzICE9IHRtcDsKKwlpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0cyA9IHRtcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY2UtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKGNoYW5nZSkKKwkJc25kX2N0bF9ub3RpZnkoaWNlLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmljZS0+c3BkaWYuc3RyZWFtX2N0bC0+aWQpOworCXNuZF9pY2UxNzEyX2RlbHRhX2NzODQwM19zcGRpZl93cml0ZShpY2UsIHRtcCk7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNoaXBzIG9uIE0tQXVkaW8gY2FyZHMKKyAqLworCitzdGF0aWMgYWttNHh4eF90IGFrbV9hdWRpb3BoaWxlIF9fZGV2aW5pdGRhdGEgPSB7CisJLnR5cGUgPSBTTkRfQUs0NTI4LAorCS5udW1fYWRjcyA9IDIsCisJLm51bV9kYWNzID0gMiwKKwkub3BzID0geworCQkuc2V0X3JhdGVfdmFsID0gZGVsdGFfYWs0NTI0X3NldF9yYXRlX3ZhbAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9hdWRpb3BoaWxlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKKwkuY2FkZHIgPSAyLAorCS5jaWYgPSAwLAorCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBX0FQX0RPVVQsCisJLmNsa19tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9DQ0xLLAorCS5jc19tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9DU19DT0RFQywKKwkuY3NfYWRkciA9IElDRTE3MTJfREVMVEFfQVBfQ1NfQ09ERUMsCisJLmNzX25vbmUgPSAwLAorCS5hZGRfZmxhZ3MgPSBJQ0UxNzEyX0RFTFRBX0FQX0NTX0RJR0lUQUwsCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGFrbTR4eHhfdCBha21fZGVsdGE0MTAgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQ1MjksCisJLm51bV9hZGNzID0gMiwKKwkubnVtX2RhY3MgPSA4LAorCS5vcHMgPSB7CisJCS5zZXRfcmF0ZV92YWwgPSBkZWx0YV9hazQ1MjRfc2V0X3JhdGVfdmFsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDEwX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKKwkuY2FkZHIgPSAwLAorCS5jaWYgPSAwLAorCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBX0FQX0RPVVQsCisJLmNsa19tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9DQ0xLLAorCS5jc19tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9DU19DT0RFQywKKwkuY3NfYWRkciA9IElDRTE3MTJfREVMVEFfQVBfQ1NfQ09ERUMsCisJLmNzX25vbmUgPSAwLAorCS5hZGRfZmxhZ3MgPSBJQ0UxNzEyX0RFTFRBX0FQX0NTX0RJR0lUQUwsCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGFrbTR4eHhfdCBha21fZGVsdGExMDEwbHQgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQ1MjQsCisJLm51bV9hZGNzID0gOCwKKwkubnVtX2RhY3MgPSA4LAorCS5vcHMgPSB7CisJCS5sb2NrID0gZGVsdGExMDEwbHRfYWs0NTI0X2xvY2ssCisJCS5zZXRfcmF0ZV92YWwgPSBkZWx0YV9hazQ1MjRfc2V0X3JhdGVfdmFsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhMTAxMGx0X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKKwkuY2FkZHIgPSAyLAorCS5jaWYgPSAwLCAvKiB0aGUgZGVmYXVsdCBsZXZlbCBvZiB0aGUgQ0lGIHBpbiBmcm9tIEFLNDUyNCAqLworCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9ET1VULAorCS5jbGtfbWFzayA9IElDRTE3MTJfREVMVEFfMTAxMExUX0NDTEssCisJLmNzX21hc2sgPSAwLAorCS5jc19hZGRyID0gMCwgLyogc2V0IGxhdGVyICovCisJLmNzX25vbmUgPSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9DU19OT05FLAorCS5hZGRfZmxhZ3MgPSAwLAorCS5tYXNrX2ZsYWdzID0gMCwKK307CisKK3N0YXRpYyBha200eHh4X3QgYWttX2RlbHRhNDQgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQ1MjQsCisJLm51bV9hZGNzID0gNCwKKwkubnVtX2RhY3MgPSA0LAorCS5vcHMgPSB7CisJCS5sb2NrID0gZGVsdGFfYWs0NTI0X2xvY2ssCisJCS5zZXRfcmF0ZV92YWwgPSBkZWx0YV9hazQ1MjRfc2V0X3JhdGVfdmFsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDRfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDIsCisJLmNpZiA9IDAsIC8qIHRoZSBkZWZhdWx0IGxldmVsIG9mIHRoZSBDSUYgcGluIGZyb20gQUs0NTI0ICovCisJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfQ09ERUNfU0VSSUFMX0RBVEEsCisJLmNsa19tYXNrID0gSUNFMTcxMl9ERUxUQV9DT0RFQ19TRVJJQUxfQ0xPQ0ssCisJLmNzX21hc2sgPSAwLAorCS5jc19hZGRyID0gMCwgLyogc2V0IGxhdGVyICovCisJLmNzX25vbmUgPSAwLAorCS5hZGRfZmxhZ3MgPSAwLAorCS5tYXNrX2ZsYWdzID0gMCwKK307CisKK3N0YXRpYyBha200eHh4X3QgYWttX3Z4NDQyIF9fZGV2aW5pdGRhdGEgPSB7CisJLnR5cGUgPSBTTkRfQUs0NTI0LAorCS5udW1fYWRjcyA9IDQsCisJLm51bV9kYWNzID0gNCwKKwkub3BzID0geworCQkubG9jayA9IHZ4NDQyX2FrNDUyNF9sb2NrLAorCQkuc2V0X3JhdGVfdmFsID0gdng0NDJfYWs0NTI0X3NldF9yYXRlX3ZhbAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV92eDQ0Ml9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CisJLmNhZGRyID0gMiwKKwkuY2lmID0gMCwKKwkuZGF0YV9tYXNrID0gSUNFMTcxMl9WWDQ0Ml9ET1VULAorCS5jbGtfbWFzayA9IElDRTE3MTJfVlg0NDJfQ0NMSywKKwkuY3NfbWFzayA9IDAsCisJLmNzX2FkZHIgPSAwLCAvKiBzZXQgbGF0ZXIgKi8KKwkuY3Nfbm9uZSA9IDAsCisJLmFkZF9mbGFncyA9IDAsCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfZGVsdGFfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlpbnQgZXJyOworCWFrbTR4eHhfdCAqYWs7CisKKwkvKiBkZXRlcm1pbmUgSTJDLCBEQUNzIGFuZCBBRENzICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0FVRElPUEhJTEU6CisJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOworCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTQxMDoKKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNDQ6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTY2OgorCQlpY2UtPm51bV90b3RhbF9kYWNzID0gaWNlLT5vbW5pID8gOCA6IDQ7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSBpY2UtPm9tbmkgPyA4IDogNDsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTA6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTBMVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTjoKKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA4OworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBRElPMjQ5NjoKKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDQ7CS8qIHR3byBBSzQzMjQgY29kZWNzICovCisJCWJyZWFrOworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfVlg0NDI6CisJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSA0OworCQlpY2UtPm51bV90b3RhbF9hZGNzID0gNDsKKwkJYnJlYWs7CisJfQorCisJLyogaW5pdGlhbGl6ZSBzcGRpZiAqLworCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9BVURJT1BISUxFOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0MTA6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTBMVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyOgorCQlpZiAoKGVyciA9IHNuZF9pMmNfYnVzX2NyZWF0ZShpY2UtPmNhcmQsICJJQ0UxNzEyIEdQSU8gMSIsIE5VTEwsICZpY2UtPmkyYykpIDwgMCkgeworCQkJc25kX3ByaW50aygidW5hYmxlIHRvIGNyZWF0ZSBJMkMgYnVzXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWNlLT5pMmMtPnByaXZhdGVfZGF0YSA9IGljZTsKKwkJaWNlLT5pMmMtPm9wcyA9ICZhcF9jczg0MjdfaTJjX29wczsKKwkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9pbml0X2NzODQyNyhpY2UsIENTODQyN19CQVNFX0FERFIpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTjoKKwkJaWNlLT5ncGlvLnNldF9wcm9fcmF0ZSA9IGRlbHRhXzEwMTBfc2V0X3JhdGVfdmFsOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBRElPMjQ5NjoKKwkJaWNlLT5ncGlvLnNldF9wcm9fcmF0ZSA9IGRlbHRhXzEwMTBfc2V0X3JhdGVfdmFsOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNjY6CisJCWljZS0+c3BkaWYub3BzLm9wZW4gPSBkZWx0YV9vcGVuX3NwZGlmOworCQlpY2UtPnNwZGlmLm9wcy5zZXR1cF9yYXRlID0gZGVsdGFfc2V0dXBfc3BkaWY7CisJCWljZS0+c3BkaWYub3BzLmRlZmF1bHRfZ2V0ID0gZGVsdGFfc3BkaWZfZGVmYXVsdF9nZXQ7CisJCWljZS0+c3BkaWYub3BzLmRlZmF1bHRfcHV0ID0gZGVsdGFfc3BkaWZfZGVmYXVsdF9wdXQ7CisJCWljZS0+c3BkaWYub3BzLnN0cmVhbV9nZXQgPSBkZWx0YV9zcGRpZl9zdHJlYW1fZ2V0OworCQlpY2UtPnNwZGlmLm9wcy5zdHJlYW1fcHV0ID0gZGVsdGFfc3BkaWZfc3RyZWFtX3B1dDsKKwkJLyogU2V0IHNwZGlmIGRlZmF1bHRzICovCisJCXNuZF9pY2UxNzEyX2RlbHRhX2NzODQwM19zcGRpZl93cml0ZShpY2UsIGljZS0+c3BkaWYuY3M4NDAzX2JpdHMpOworCQlicmVhazsKKwl9CisKKwkvKiBubyBhbmFsb2c/ICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBRElPMjQ5NjoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTjoKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2Vjb25kIHN0YWdlIG9mIGluaXRpYWxpemF0aW9uLCBhbmFsb2cgcGFydHMgYW5kIG90aGVycyAqLworCWFrID0gaWNlLT5ha20gPSBrbWFsbG9jKHNpemVvZihha200eHh4X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBhaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWNlLT5ha21fY29kZWNzID0gMTsKKworCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9BVURJT1BISUxFOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fYXVkaW9waGlsZSwgJmFrbV9hdWRpb3BoaWxlX3ByaXYsIGljZSk7CisJCWJyZWFrOworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0MTA6CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9kZWx0YTQxMCwgJmFrbV9kZWx0YTQxMF9wcml2LCBpY2UpOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMExUOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fZGVsdGExMDEwbHQsICZha21fZGVsdGExMDEwbHRfcHJpdiwgaWNlKTsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTY2OgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0NDoKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2RlbHRhNDQsICZha21fZGVsdGE0NF9wcml2LCBpY2UpOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fdng0NDIsICZha21fdng0NDJfcHJpdiwgaWNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciBNLUF1ZGlvIGNhcmRzCisgKi8KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK0lDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBX1dPUkRfQ0xPQ0tfU0VMRUNULCAxLCAwKTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK0lDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9XT1JEQ0xPQ0ssIDEsIDApOworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3N0YXR1cyBfX2RldmluaXRkYXRhID0KK0lDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJXb3JkIENsb2NrIFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfV09SRF9DTE9DS19TVEFUVVMsIDEsIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFKTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGFkaW8yNDk2X3NwZGlmX2luX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK0lDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJJRUM5NTggSW5wdXQgT3B0aWNhbCIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5QVVRfU0VMRUNULCAwLCAwKTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGFfc3BkaWZfaW5fc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQorSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgIkRlbHRhIElFQzk1OCBJbnB1dCBTdGF0dXMiLCAwLCBJQ0UxNzEyX0RFTFRBX1NQRElGX0lOX1NUQVQsIDEsIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFKTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9kZWx0YV9hZGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpCit7CisJaW50IGVycjsKKworCS8qIDEwMTAgYW5kIGRpbyBzcGVjaWZpYyBjb250cm9scyAqLworCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTA6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9NRURJQVNUQVRJT046CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3NlbGVjdCwgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2RlbHRhMTAxMF93b3JkY2xvY2tfc3RhdHVzLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBRElPMjQ5NjoKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2RlbHRhZGlvMjQ5Nl9zcGRpZl9pbl9zZWxlY3QsIGljZSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwTFQ6CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc2VsZWN0LCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwl9CisKKwkvKiBub3JtYWwgc3BkaWYgY29udHJvbHMgKi8KKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEFESU8yNDk2OgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NjoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTjoKKwkJZXJyID0gc25kX2ljZTE3MTJfc3BkaWZfYnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwl9CisKKwkvKiBzcGRpZiBzdGF0dXMgaW4gKi8KKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEFESU8yNDk2OgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NjoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTjoKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2RlbHRhX3NwZGlmX2luX3N0YXR1cywgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJfQorCisJLyogYWs0NTI0IGNvbnRyb2xzICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMExUOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfQVVESU9QSElMRToKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNDEwOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0NDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNjY6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIGVudHJ5IHBvaW50ICovCitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTAsCisJCS5uYW1lID0gIk0gQXVkaW8gRGVsdGEgMTAxMCIsCisJCS5tb2RlbCA9ICJkZWx0YTEwMTAiLAorCQkuY2hpcF9pbml0ID0gc25kX2ljZTE3MTJfZGVsdGFfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZGVsdGFfYWRkX2NvbnRyb2xzLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfREVMVEFESU8yNDk2LAorCQkubmFtZSA9ICJNIEF1ZGlvIERlbHRhIERpTyAyNDk2IiwKKwkJLm1vZGVsID0gImRpbzI0OTYiLAorCQkuY2hpcF9pbml0ID0gc25kX2ljZTE3MTJfZGVsdGFfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZGVsdGFfYWRkX2NvbnRyb2xzLAorCQkubm9fbXB1NDAxID0gMSwKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNjYsCisJCS5uYW1lID0gIk0gQXVkaW8gRGVsdGEgNjYiLAorCQkubW9kZWwgPSAiZGVsdGE2NiIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9kZWx0YV9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9kZWx0YV9hZGRfY29udHJvbHMsCisJCS5ub19tcHU0MDEgPSAxLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0NCwKKwkJLm5hbWUgPSAiTSBBdWRpbyBEZWx0YSA0NCIsCisJCS5tb2RlbCA9ICJkZWx0YTQ0IiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2RlbHRhX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IHNuZF9pY2UxNzEyX2RlbHRhX2FkZF9jb250cm9scywKKwkJLm5vX21wdTQwMSA9IDEsCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9BVURJT1BISUxFLAorCQkubmFtZSA9ICJNIEF1ZGlvIEF1ZGlvcGhpbGUgMjQvOTYiLAorCQkubW9kZWwgPSAiYXVkaW9waGlsZSIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9kZWx0YV9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9kZWx0YV9hZGRfY29udHJvbHMsCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTQxMCwKKwkJLm5hbWUgPSAiTSBBdWRpbyBEZWx0YSA0MTAiLAorCQkubW9kZWwgPSAiZGVsdGE0MTAiLAorCQkuY2hpcF9pbml0ID0gc25kX2ljZTE3MTJfZGVsdGFfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZGVsdGFfYWRkX2NvbnRyb2xzLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwTFQsCisJCS5uYW1lID0gIk0gQXVkaW8gRGVsdGEgMTAxMExUIiwKKwkJLm1vZGVsID0gImRlbHRhMTAxMGx0IiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2RlbHRhX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IHNuZF9pY2UxNzEyX2RlbHRhX2FkZF9jb250cm9scywKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyLAorCQkubmFtZSA9ICJEaWdpZ3JhbSBWWDQ0MiIsCisJCS5tb2RlbCA9ICJ2eDQ0MiIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9kZWx0YV9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9kZWx0YV9hZGRfY29udHJvbHMsCisJCS5ub19tcHU0MDEgPSAxLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfTUVESUFTVEFUSU9OLAorCQkubmFtZSA9ICJMaW9uc3RyYWNzIE1lZGlhc3RhdGlvbiIsCisJCS5tb2RlbCA9ICJtZWRpYXN0YXRpb24iLAorCQkuY2hpcF9pbml0ID0gc25kX2ljZTE3MTJfZGVsdGFfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZGVsdGFfYWRkX2NvbnRyb2xzLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZlYmRlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaApAQCAtMCwwICsxLDE1MCBAQAorI2lmbmRlZiBfX1NPVU5EX0RFTFRBX0gKKyNkZWZpbmUgX19TT1VORF9ERUxUQV9ICisKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkKKyAqCisgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgTS1BdWRpbyBEZWx0YSAxMDEwLCA0NCwgNjYsIERpbzI0OTYsIEF1ZGlvcGhpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBEaWdpZ3JhbSBWWDQ0MgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjZGVmaW5lIERFTFRBX0RFVklDRV9ERVNDIFwKKwkJIntNaWRpTWFuIE0gQXVkaW8sRGVsdGEgMTAxMH0sIlwKKwkJIntNaWRpTWFuIE0gQXVkaW8sRGVsdGEgMTAxMExUfSwiXAorCQkie01pZGlNYW4gTSBBdWRpbyxEZWx0YSBEaU8gMjQ5Nn0sIlwKKwkJIntNaWRpTWFuIE0gQXVkaW8sRGVsdGEgNjZ9LCJcCisJCSJ7TWlkaU1hbiBNIEF1ZGlvLERlbHRhIDQ0fSwiXAorCQkie01pZGlNYW4gTSBBdWRpbyxBdWRpb3BoaWxlIDI0Lzk2fSwiXAorCQkie0RpZ2lncmFtLFZYNDQyfSwiXAorCQkie0xpb25zdHJhY3MsTWVkaWFzdGF0aW9ufSwiCisKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwCTB4MTIxNDMwZDYKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEFESU8yNDk2CTB4MTIxNDMxZDYKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NgkweDEyMTQzMmQ2CisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNDQJMHgxMjE0MzNkNgorI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9BVURJT1BISUxFCTB4MTIxNDM0ZDYKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE0MTAJMHgxMjE0MzhkNgorI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTBMVAkweDEyMTQzYmQ2CisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyCQkweDEyMTQzY2Q2CisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTgkweDY5NGMwMTAwCisKKy8qIGVudHJ5IHBvaW50ICovCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9kZWx0YV9jYXJkc1tdOworCisKKy8qCisgKiAgTWlkaU1hbiBNLUF1ZGlvIERlbHRhIEdQSU8gZGVmaW5pdGlvbnMKKyAqLworCisvKiBNaWRpTWFuIE0tQXVkaW8gRGVsdGEgc2hhcmVkIHBpbnMgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9ERlMgMHgwMQkJLyogZmFzdC9zbG93IHNhbXBsZSByYXRlIG1vZGUgKi8KKwkJCQkJLyogKD40OGtIeiBtdXN0IGJlIDEpICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfU1BESUZfSU5fU1RBVCAweDAyCisJCQkJCS8qIFMvUERJRiBpbnB1dCBzdGF0dXMgKi8KKwkJCQkJLyogMCA9IHZhbGlkIHNpZ25hbCBpcyBwcmVzZW50ICovCisJCQkJCS8qIGFsbCBleGNlcHQgRGVsdGE0NCAqLworCQkJCQkvKiBsb29rIHRvIENTODQxNCBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9TUERJRl9PVVRfU1RBVF9DTE9DSyAweDA0CisJCQkJCS8qIFMvUERJRiBvdXRwdXQgc3RhdHVzIGNsb2NrICovCisJCQkJCS8qICh3cml0dGluZyBvbiByaXNpbmcgZWRnZSAtIDAtPjEpICovCisJCQkJCS8qIGFsbCBleGNlcHQgRGVsdGE0NCAqLworCQkJCQkvKiBsb29rIHRvIENTODQwNEEgZGF0YXNoZWV0ICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfU1BESUZfT1VUX1NUQVRfREFUQSAweDA4CisJCQkJCS8qIFMvUERJRiBvdXRwdXQgc3RhdHVzIGRhdGEgKi8KKwkJCQkJLyogYWxsIGV4Y2VwdCBEZWx0YTQ0ICovCisJCQkJCS8qIGxvb2sgdG8gQ1M4NDA0QSBkYXRhc2hlZXQgKi8KKy8qIE1pZGlNYW4gTS1BdWRpbyBEZWx0YURpTyAqLworLyogMHgwMSA9IERGUyAqLworLyogMHgwMiA9IFNQRElGX0lOX1NUQVQgKi8KKy8qIDB4MDQgPSBTUERJRl9PVVRfU1RBVF9DTE9DSyAqLworLyogMHgwOCA9IFNQRElGX09VVF9TVEFUX0RBVEEgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9TUERJRl9JTlBVVF9TRUxFQ1QgMHgxMAorCQkJCQkvKiBjb2F4aWFsICgwKSwgb3B0aWNhbCAoMSkgKi8KKwkJCQkJLyogUy9QRElGIGlucHV0IHNlbGVjdCovCisKKy8qIE1pZGlNYW4gTS1BdWRpbyBEZWx0YTEwMTAgKi8KKy8qIDB4MDEgPSBERlMgKi8KKy8qIDB4MDIgPSBTUERJRl9JTl9TVEFUICovCisvKiAweDA0ID0gU1BESUZfT1VUX1NUQVRfQ0xPQ0sgKi8KKy8qIDB4MDggPSBTUERJRl9PVVRfU1RBVF9EQVRBICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfV09SRF9DTE9DS19TRUxFQ1QgMHgxMAorCQkJCQkvKiAxIC0gY2xvY2sgYXJlIHRha2VuIGZyb20gUy9QRElGIGlucHV0ICovCisJCQkJCS8qIDAgLSBjbG9jayBhcmUgdGFrZW4gZnJvbSBXb3JkIENsb2NrIGlucHV0ICovCisJCQkJCS8qIGFmZmVjdGVkIFNQTUNMS0lOIHBpbiBvZiBFbnZ5MjQgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9XT1JEX0NMT0NLX1NUQVRVUwkweDIwCisJCQkJCS8qIDAgPSB2YWxpZCB3b3JkIGNsb2NrIHNpZ25hbCBpcyBwcmVzZW50ICovCisKKy8qIE1pZGlNYW4gTS1BdWRpbyBEZWx0YTY2ICovCisvKiAweDAxID0gREZTICovCisvKiAweDAyID0gU1BESUZfSU5fU1RBVCAqLworLyogMHgwNCA9IFNQRElGX09VVF9TVEFUX0NMT0NLICovCisvKiAweDA4ID0gU1BESUZfT1VUX1NUQVRfREFUQSAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBX0NPREVDX1NFUklBTF9EQVRBIDB4MTAKKwkJCQkJLyogQUtNNDUyNCBzZXJpYWwgZGF0YSAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBX0NPREVDX1NFUklBTF9DTE9DSyAweDIwCisJCQkJCS8qIEFLTTQ1MjQgc2VyaWFsIGNsb2NrICovCisJCQkJCS8qICh3cml0dGluZyBvbiByaXNpbmcgZWRnZSAtIDAtPjEgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9DT0RFQ19DSElQX0EJMHg0MAorI2RlZmluZSBJQ0UxNzEyX0RFTFRBX0NPREVDX0NISVBfQgkweDgwCisJCQkJCS8qIDEgLSBzZWxlY3QgY2hpcCBBIG9yIEIgKi8KKworLyogTWlkaU1hbiBNLUF1ZGlvIERlbHRhNDQgKi8KKy8qIDB4MDEgPSBERlMgKi8KKy8qIDB4MTAgPSBDT0RFQ19TRVJJQUxfREFUQSAqLworLyogMHgyMCA9IENPREVDX1NFUklBTF9DTE9DSyAqLworLyogMHg0MCA9IENPREVDX0NISVBfQSAqLworLyogMHg4MCA9IENPREVDX0NISVBfQiAqLworCisvKiBNaWRpTWFuIE0tQXVkaW8gQXVkaW9waGlsZS9EZWx0YTQxMCBkZWZpbml0aW9ucyAqLworLyogdGhhbmtzIHRvIEtyaXN0b2YgUGVsY2ttYW5zIDxLcmlzdG9mLlBlbGNrbWFuc0BhbnR3ZXJwZW4uYmU+IGZvciBEZWx0YTQxMCBpbmZvICovCisvKiAweDAxID0gREZTICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfQVBfQ0NMSwkweDAyCS8qIFNQSSBjbG9jayAqLworCQkJCQkvKiAoY2xvY2tpbmcgb24gcmlzaW5nIGVkZ2UgLSAwLT4xKSAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBX0FQX0RJTgkweDA0CS8qIGRhdGEgaW5wdXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9BUF9ET1VUCTB4MDgJLyogZGF0YSBvdXRwdXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9BUF9DU19ESUdJVEFMIDB4MTAgLyogQ1M4NDI3IGNoaXAgc2VsZWN0ICovCisJCQkJCS8qIGxvdyBzaWduYWwgPSBzZWxlY3QgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV9BUF9DU19DT0RFQyAweDIwCS8qIEFLNDUyOCAoYXVkaW9waGlsZSksIEFLNDUyOSAoRGVsdGE0MTApIGNoaXAgc2VsZWN0ICovCisJCQkJCS8qIGxvdyBzaWduYWwgPSBzZWxlY3QgKi8KKworLyogTWlkaU1hbiBNLUF1ZGlvIERlbHRhMTAxMExUIGRlZmluaXRpb25zICovCisvKiB0aGFua3MgdG8gQW5kZXJzIEpvaGFuc3NvbiA8YWpoQHdhdHJpLnV3YS5lZHUuYXU+ICovCisvKiAweDAxID0gREZTICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfMTAxMExUX0NDTEsJMHgwMgkvKiBTUEkgY2xvY2sgKEFLNDUyNCArIENTODQyNykgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfRElOCTB4MDQJLyogZGF0YSBpbnB1dCAoQ1M4NDI3KSAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9ET1VUCTB4MDgJLyogZGF0YSBvdXRwdXQgKEFLNDUyNCArIENTODQyNykgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1MJCTB4NzAJLyogbWFzayBmb3IgQ1MgYWRkcmVzcyAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9DU19DSElQX0EJMHgwMAkvKiBBSzQ1MjQgIzAgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1NfQ0hJUF9CCTB4MTAJLyogQUs0NTI0ICMxICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfMTAxMExUX0NTX0NISVBfQwkweDIwCS8qIEFLNDUyNCAjMiAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9DU19DSElQX0QJMHgzMAkvKiBBSzQ1MjQgIzMgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1NfQ1M4NDI3CTB4NDAJLyogQ1M4NDI3ICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfMTAxMExUX0NTX05PTkUJMHg1MAkvKiBub3RoaW5nICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfMTAxMExUX1dPUkRDTE9DSyAweDgwCS8qIHNhbXBsZSBjbG9jayBzb3VyY2U6IDAgPSBXb3JkIENsb2NrIElucHV0LCAxID0gUy9QRElGIElucHV0ID8/PyAqLworCisvKiBEaWdpZ3JhbSBWWDQ0MiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJQ0UxNzEyX1ZYNDQyX0NDTEsJCTB4MDIJLyogU1BJIGNsb2NrICovCisjZGVmaW5lIElDRTE3MTJfVlg0NDJfRElOCQkweDA0CS8qIGRhdGEgaW5wdXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9WWDQ0Ml9ET1VUCQkweDA4CS8qIGRhdGEgb3V0cHV0ICovCisjZGVmaW5lIElDRTE3MTJfVlg0NDJfQ1NfRElHSVRBTAkweDEwCS8qIGNoaXAgc2VsZWN0LCBsb3cgPSBDUzg0MjcgKi8KKyNkZWZpbmUgSUNFMTcxMl9WWDQ0Ml9DT0RFQ19DSElQX0EJMHgyMAkvKiBzZWxlY3QgY2hpcCBBICovCisjZGVmaW5lIElDRTE3MTJfVlg0NDJfQ09ERUNfQ0hJUF9CCTB4NDAJLyogc2VsZWN0IGNoaXAgQiAqLworCisjZW5kaWYgLyogX19TT1VORF9ERUxUQV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9lbnZ5MjRodC5oIGIvc291bmQvcGNpL2ljZTE3MTIvZW52eTI0aHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzg3ODAyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZW52eTI0aHQuaApAQCAtMCwwICsxLDIxNSBAQAorI2lmbmRlZiBfX1NPVU5EX1ZUMTcyNF9ICisjZGVmaW5lIF9fU09VTkRfVlQxNzI0X0gKKworLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgVlQxNzI0IChFbnZ5MjQpCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9pMmMuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKworZW51bSB7CisJSUNFX0VFUDJfU1lTQ09ORiA9IDAsCS8qIDA2ICovCisJSUNFX0VFUDJfQUNMSU5LLAkvKiAwNyAqLworCUlDRV9FRVAyX0kyUywJCS8qIDA4ICovCisJSUNFX0VFUDJfU1BESUYsCQkvKiAwOSAqLworCUlDRV9FRVAyX0dQSU9fRElSLAkvKiAwYSAqLworCUlDRV9FRVAyX0dQSU9fRElSMSwJLyogMGIgKi8KKwlJQ0VfRUVQMl9HUElPX0RJUjIsCS8qIDBjICovCisJSUNFX0VFUDJfR1BJT19NQVNLLAkvKiAwZCAqLworCUlDRV9FRVAyX0dQSU9fTUFTSzEsCS8qIDBlICovCisJSUNFX0VFUDJfR1BJT19NQVNLMiwJLyogMGYgKi8KKwlJQ0VfRUVQMl9HUElPX1NUQVRFLAkvKiAxMCAqLworCUlDRV9FRVAyX0dQSU9fU1RBVEUxLAkvKiAxMSAqLworCUlDRV9FRVAyX0dQSU9fU1RBVEUyCS8qIDEyICovCit9OworCQorLyoKKyAqICBEaXJlY3QgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBJQ0VSRUcxNzI0KGljZSwgeCkgKChpY2UpLT5wb3J0ICsgVlQxNzI0X1JFR18jI3gpCisKKyNkZWZpbmUgVlQxNzI0X1JFR19DT05UUk9MCQkweDAwCS8qIGJ5dGUgKi8KKyNkZWZpbmUgICBWVDE3MjRfUkVTRVQJCQkweDgwCS8qIHJlc2V0IHdob2xlIGNoaXAgKi8KKyNkZWZpbmUgVlQxNzI0X1JFR19JUlFNQVNLCQkweDAxCS8qIGJ5dGUgKi8KKyNkZWZpbmUgICBWVDE3MjRfSVJRX01QVV9SWAkJMHg4MAorI2RlZmluZSAgIFZUMTcyNF9JUlFfTVBVX1RYCQkweDIwCisjZGVmaW5lICAgVlQxNzI0X0lSUV9NVFBDTQkJMHgxMAorI2RlZmluZSBWVDE3MjRfUkVHX0lSUVNUQVQJCTB4MDIJLyogYnl0ZSAqLworLyogbG9vayB0byBWVDE3MjRfSVJRXyogKi8KKyNkZWZpbmUgVlQxNzI0X1JFR19TWVNfQ0ZHCQkweDA0CS8qIGJ5dGUgLSBzeXN0ZW0gY29uZmlndXJhdGlvbiBQQ0k2MCBvbiBFbnZ5MjQqLworI2RlZmluZSAgIFZUMTcyNF9DRkdfQ0xPQ0sJMHhjMAorI2RlZmluZSAgICAgVlQxNzI0X0NGR19DTE9DSzUxMgkweDAwCS8qIDIyLjU2OTJNaHosIDQ0LjFrSHoqNTEyICovCisjZGVmaW5lICAgICBWVDE3MjRfQ0ZHX0NMT0NLMzg0ICAweDQwCS8qIDE2LjkzNDRNaHosIDQ0LjFrSHoqMzg0ICovCisjZGVmaW5lICAgVlQxNzI0X0NGR19NUFU0MDEJMHgyMAkJLyogTVBVNDAxIFVBUlRzICovCisjZGVmaW5lICAgVlQxNzI0X0NGR19BRENfTUFTSwkweDBjCS8qIG9uZSwgdHdvIG9yIG9uZSBhbmQgUy9QRElGLCBzdGVyZW8gQURDcyAqLworI2RlZmluZSAgIFZUMTcyNF9DRkdfREFDX01BU0sJMHgwMwkvKiBvbmUsIHR3bywgdGhyZWUsIGZvdXIgc3RlcmVvIERBQ3MgKi8KKworI2RlZmluZSBWVDE3MjRfUkVHX0FDOTdfQ0ZHCQkweDA1CS8qIGJ5dGUgKi8KKyNkZWZpbmUgICBWVDE3MjRfQ0ZHX1BST19JMlMJMHg4MAkvKiBtdWx0aXRyYWNrIGNvbnZlcnRlcjogSTJTIG9yIEFDJzk3ICovCisjZGVmaW5lICAgVlQxNzI0X0NGR19BQzk3X1BBQ0tFRAkweDAxCS8qIHNwbGl0IG9yIHBhY2tlZCBtb2RlIC0gQUMnOTcgKi8KKworI2RlZmluZSBWVDE3MjRfUkVHX0kyU19GRUFUVVJFUwkJMHgwNgkvKiBieXRlICovCisjZGVmaW5lICAgVlQxNzI0X0NGR19JMlNfVk9MVU1FCTB4ODAJLyogdm9sdW1lL211dGUgY2FwYWJpbGl0eSAqLworI2RlZmluZSAgIFZUMTcyNF9DRkdfSTJTXzk2S0haCTB4NDAJLyogc3VwcG9ydHMgOTZrSHogc2FtcGxpbmcgKi8KKyNkZWZpbmUgICBWVDE3MjRfQ0ZHX0kyU19SRVNNQVNLCTB4MzAJLyogcmVzb2x1dGlvbiBtYXNrLCAxNiwxOCwyMCwyNC1iaXQgKi8KKyNkZWZpbmUgICBWVDE3MjRfQ0ZHX0kyU18xOTJLSFoJMHgwOAkvKiBzdXBwb3J0cyAxOTJrSHogc2FtcGxpbmcgKi8KKyNkZWZpbmUgICBWVDE3MjRfQ0ZHX0kyU19PVEhFUgkweDA3CS8qIG90aGVyIEkyUyBJRHMgKi8KKworI2RlZmluZSBWVDE3MjRfUkVHX1NQRElGX0NGRwkJMHgwNwkvKiBieXRlICovCisjZGVmaW5lICAgVlQxNzI0X0NGR19TUERJRl9PVVRfRU4JMHg4MAkvKkludGVybmFsIFMvUERJRiBvdXRwdXQgaXMgZW5hYmxlZCovCisjZGVmaW5lICAgVlQxNzI0X0NGR19TUERJRl9PVVRfSU5UCTB4NDAJLypJbnRlcm5hbCBTL1BESUYgb3V0cHV0IGlzIGltcGxlbWVudGVkKi8KKyNkZWZpbmUgICBWVDE3MjRfQ0ZHX0kyU19DSElQSUQJMHgzYwkvKiBJMlMgY2hpcCBJRCAqLworI2RlZmluZSAgIFZUMTcyNF9DRkdfU1BESUZfSU4JMHgwMgkvKiBTL1BESUYgaW5wdXQgaXMgcHJlc2VudCAqLworI2RlZmluZSAgIFZUMTcyNF9DRkdfU1BESUZfT1VUCTB4MDEJLyogRXh0ZXJuYWwgUy9QRElGIG91dHB1dCBpcyBwcmVzZW50ICovCisKKy8qdGhlcmUgaXMgbm8gY29uc3VtZXIgQUM5NyBjb2RlYyB3aXRoIHRoZSBWVDE3MjQqLworLy8jZGVmaW5lIFZUMTcyNF9SRUdfQUM5N19JTkRFWAkJMHgwOAkvKiBieXRlICovCisvLyNkZWZpbmUgVlQxNzI0X1JFR19BQzk3X0NNRAkJMHgwOQkvKiBieXRlICovCisKKyNkZWZpbmUgVlQxNzI0X1JFR19NUFVfVFhGSUZPCQkweDBhCS8qYnl0ZSByby4gbnVtYmVyIG9mIGJ5dGVzIGluIFRYIGZpZm8qLworI2RlZmluZSBWVDE3MjRfUkVHX01QVV9SWEZJRk8JCTB4MGIJLypieXRlIHJvLiBudW1iZXIgb2YgYnl0ZXMgaW4gUlggZmlmbyovCisKKy8vYXJlIHRoZXNlIDIgdGhlIHdyb25nIHdheSBhcm91bmQ/IHRoZXkgZG9uJ3Qgc2VlbSB0byBiZSB1c2VkIHlldCBhbnl3YXkKKyNkZWZpbmUgVlQxNzI0X1JFR19NUFVfQ1RSTAkJMHgwYwkvKiBieXRlICovCisjZGVmaW5lIFZUMTcyNF9SRUdfTVBVX0RBVEEJCTB4MGQJLyogYnl0ZSAqLworCisjZGVmaW5lIFZUMTcyNF9SRUdfTVBVX0ZJRk9fV00JMHgwZQkvKmJ5dGUgc2V0IHRoZSBoaWdoL2xvdyB3YXRlcm1hcmtzIGZvciBSWC9UWCBmaWZvcyovCisjZGVmaW5lICAgVlQxNzI0X01QVV9SWF9GSUZPCTB4MjAJLy8xPXJ4IGZpZm8gd2F0ZXJtYXJrIDA9dHggZmlmbyB3YXRlcm1hcmsKKyNkZWZpbmUgICBWVDE3MjRfTVBVX0ZJRk9fTUFTSwkweDFmCQorCisjZGVmaW5lIFZUMTcyNF9SRUdfSTJDX0RFVl9BRERSCTB4MTAJLyogYnl0ZSAqLworI2RlZmluZSAgIFZUMTcyNF9JMkNfV1JJVEUJCTB4MDEJLyogd3JpdGUgZGlyZWN0aW9uICovCisjZGVmaW5lIFZUMTcyNF9SRUdfSTJDX0JZVEVfQUREUgkweDExCS8qIGJ5dGUgKi8KKyNkZWZpbmUgVlQxNzI0X1JFR19JMkNfREFUQQkJMHgxMgkvKiBieXRlICovCisjZGVmaW5lIFZUMTcyNF9SRUdfSTJDX0NUUkwJCTB4MTMJLyogYnl0ZSAqLworI2RlZmluZSAgIFZUMTcyNF9JMkNfRUVQUk9NCQkweDgwCS8qIDEgPSBFRVBST00gZXhpc3RzICovCisjZGVmaW5lICAgVlQxNzI0X0kyQ19CVVNZCQkweDAxCS8qIGJ1c3kgYml0ICovCisKKyNkZWZpbmUgVlQxNzI0X1JFR19HUElPX0RBVEEJMHgxNAkvKiB3b3JkICovCisjZGVmaW5lIFZUMTcyNF9SRUdfR1BJT19XUklURV9NQVNLCTB4MTYgLyogd29yZCAqLworI2RlZmluZSBWVDE3MjRfUkVHX0dQSU9fRElSRUNUSU9OCTB4MTggLyogZHdvcmQ/ICgzIGJ5dGVzKSAwPWlucHV0IDE9b3V0cHV0LiAKKwkJCQkJCWJpdDMgLSBkdXJpbmcgcmVzZXQgdXNlZCBmb3IgRWVwcm9tIHBvd2VyLW9uIHN0cmFwcGluZworCQkJCQkJaWYgVEVTVEVOIyBwaW4gYWN0aXZlLCBiaXQgMiBhbHdheXMgaW5wdXQqLworI2RlZmluZSBWVDE3MjRfUkVHX1BPV0VSRE9XTgkweDFjCisjZGVmaW5lIFZUMTcyNF9SRUdfR1BJT19EQVRBXzIyCTB4MWUgLyogYnl0ZSBkaXJlY3Rpb24gZm9yIEdQSU8gMTY6MjIgKi8KKyNkZWZpbmUgVlQxNzI0X1JFR19HUElPX1dSSVRFX01BU0tfMjIJMHgxZiAvKiBieXRlIHdyaXRlIG1hc2sgZm9yIEdQSU8gMTY6MjIgKi8KKworCisvKiAKKyAqICBQcm9mZXNzaW9uYWwgbXVsdGktdHJhY2sgZGlyZWN0IGNvbnRyb2wgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBJQ0VNVDE3MjQoaWNlLCB4KSAoKGljZSktPnByb2ZpX3BvcnQgKyBWVDE3MjRfTVRfIyN4KQorCisjZGVmaW5lIFZUMTcyNF9NVF9JUlEJCQkweDAwCS8qIGJ5dGUgLSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgIFZUMTcyNF9NVUxUSV9QRE1BNAkweDgwCS8qIFNQRElGIE91dCAvIFBETUE0ICovCisjZGVmaW5lCSAgVlQxNzI0X01VTFRJX1BETUEzCTB4NDAJLyogUERNQTMgKi8KKyNkZWZpbmUgICBWVDE3MjRfTVVMVElfUERNQTIJMHgyMAkvKiBQRE1BMiAqLworI2RlZmluZSAgIFZUMTcyNF9NVUxUSV9QRE1BMQkweDEwCS8qIFBETUExICovCisjZGVmaW5lICAgVlQxNzI0X01VTFRJX0ZJRk9fRVJSIDB4MDgJLyogRE1BIEZJRk8gdW5kZXJydW4vb3ZlcnJ1bi4gKi8KKyNkZWZpbmUgICBWVDE3MjRfTVVMVElfUkRNQTEJMHgwNAkvKiBSRE1BMSAoUy9QRElGIGlucHV0KSAqLworI2RlZmluZSAgIFZUMTcyNF9NVUxUSV9SRE1BMAkweDAyCS8qIFJNREEwICovCisjZGVmaW5lICAgVlQxNzI0X01VTFRJX1BETUEwCTB4MDEJLyogTUMgSW50ZXJsZWF2ZS9QRE1BMCAqLworCisjZGVmaW5lIFZUMTcyNF9NVF9SQVRFCQkJMHgwMQkvKiBieXRlIC0gc2FtcGxpbmcgcmF0ZSBzZWxlY3QgKi8KKyNkZWZpbmUgICBWVDE3MjRfU1BESUZfTUFTVEVSCQkweDEwCS8qIFMvUERJRiBpbnB1dCBpcyBtYXN0ZXIgY2xvY2sgKi8KKyNkZWZpbmUgVlQxNzI0X01UX0kyU19GT1JNQVQJCTB4MDIJLyogYnl0ZSAtIEkyUyBkYXRhIGZvcm1hdCAqLworI2RlZmluZSAgIFZUMTcyNF9NVF9JMlNfTUNMS18xMjhYCTB4MDgKKyNkZWZpbmUgICBWVDE3MjRfTVRfSTJTX0ZPUk1BVF9NQVNLCTB4MDMKKyNkZWZpbmUgICBWVDE3MjRfTVRfSTJTX0ZPUk1BVF9JMlMJMHgwMAorI2RlZmluZSBWVDE3MjRfTVRfRE1BX0lOVF9NQVNLCQkweDAzCS8qIGJ5dGUgLURNQSBJbnRlcnJ1cHQgTWFzayAqLworLyogbG9vbCB0byBWVDE3MjRfTVVMVElfKiAqLworI2RlZmluZSBWVDE3MjRfTVRfQUM5N19JTkRFWAkJMHgwNAkvKiBieXRlIC0gQUMnOTcgaW5kZXggKi8KKyNkZWZpbmUgVlQxNzI0X01UX0FDOTdfQ01ECQkweDA1CS8qIGJ5dGUgLSBBQyc5NyBjb21tYW5kICYgc3RhdHVzICovCisjZGVmaW5lICAgVlQxNzI0X0FDOTdfQ09MRAkweDgwCS8qIGNvbGQgcmVzZXQgKi8KKyNkZWZpbmUgICBWVDE3MjRfQUM5N19XQVJNCTB4NDAJLyogd2FybSByZXNldCAqLworI2RlZmluZSAgIFZUMTcyNF9BQzk3X1dSSVRFCTB4MjAJLyogVzogd3JpdGUsIFI6IHdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lICAgVlQxNzI0X0FDOTdfUkVBRAkweDEwCS8qIFc6IHJlYWQsIFI6IHJlYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgICBWVDE3MjRfQUM5N19SRUFEWQkweDA4CS8qIGNvZGVjIHJlYWR5IHN0YXR1cyBiaXQgKi8KKyNkZWZpbmUgICBWVDE3MjRfQUM5N19JRF9NQVNLCTB4MDMJLyogY29kZWMgaWQgbWFzayAqLworI2RlZmluZSBWVDE3MjRfTVRfQUM5N19EQVRBCQkweDA2CS8qIHdvcmQgLSBBQyc5NyBkYXRhICovCisjZGVmaW5lIFZUMTcyNF9NVF9QTEFZQkFDS19BRERSCQkweDEwCS8qIGR3b3JkIC0gcGxheWJhY2sgYWRkcmVzcyAqLworI2RlZmluZSBWVDE3MjRfTVRfUExBWUJBQ0tfU0laRQkJMHgxNAkvKiBkd29yZCAtIHBsYXliYWNrIHNpemUgKi8KKyNkZWZpbmUgVlQxNzI0X01UX0RNQV9DT05UUk9MCQkweDE4CS8qIGJ5dGUgLSBjb250cm9sICovCisjZGVmaW5lICAgVlQxNzI0X1BETUE0X1NUQVJUCTB4ODAJLyogU1BESUYgb3V0IC8gUERNQTQgc3RhcnQgKi8KKyNkZWZpbmUgICBWVDE3MjRfUERNQTNfU1RBUlQJMHg0MAkvKiBQRE1BMyBzdGFydCAqLworI2RlZmluZSAgIFZUMTcyNF9QRE1BMl9TVEFSVAkweDIwCS8qIFBETUEyIHN0YXJ0ICovCisjZGVmaW5lICAgVlQxNzI0X1BETUExX1NUQVJUCTB4MTAJLyogUERNQTEgc3RhcnQgKi8KKyNkZWZpbmUgICBWVDE3MjRfUkRNQTFfU1RBUlQJMHgwNAkvKiBSRE1BMSBzdGFydCAqLworI2RlZmluZSAgIFZUMTcyNF9SRE1BMF9TVEFSVAkweDAyCS8qIFJNREEwIHN0YXJ0ICovCisjZGVmaW5lICAgVlQxNzI0X1BETUEwX1NUQVJUCTB4MDEJLyogTUMgSW50ZXJsZWF2ZSAvIFBETUEwIHN0YXJ0ICovCisjZGVmaW5lIFZUMTcyNF9NVF9CVVJTVAkJCTB4MTkJLyogSW50ZXJsZWF2ZWQgcGxheWJhY2sgRE1BIEFjdGl2ZSBzdHJlYW1zIC8gUENJIGJ1cnN0IHNpemUgKi8KKyNkZWZpbmUgVlQxNzI0X01UX0RNQV9GSUZPX0VSUgkJMHgxYQkvKkdsb2JhbCBwbGF5YmFjayBhbmQgcmVjb3JkIERNQSBGSUZPIFVuZGVycnVuL092ZXJydW4gKi8KKyNkZWZpbmUgICBWVDE3MjRfUERNQTRfVU5ERVJSVU4JCTB4ODAKKyNkZWZpbmUgICBWVDE3MjRfUERNQTJfVU5ERVJSVU4JCTB4NDAKKyNkZWZpbmUgICBWVDE3MjRfUERNQTNfVU5ERVJSVU4JCTB4MjAKKyNkZWZpbmUgICBWVDE3MjRfUERNQTFfVU5ERVJSVU4JCTB4MTAKKyNkZWZpbmUgICBWVDE3MjRfUkRNQTFfVU5ERVJSVU4JCTB4MDQKKyNkZWZpbmUgICBWVDE3MjRfUkRNQTBfVU5ERVJSVU4JCTB4MDIKKyNkZWZpbmUgICBWVDE3MjRfUERNQTBfVU5ERVJSVU4JCTB4MDEKKyNkZWZpbmUgVlQxNzI0X01UX0RNQV9QQVVTRQkJMHgxYgkvKkdsb2JhbCBwbGF5YmFjayBhbmQgcmVjb3JkIERNQSBGSUZPIHBhdXNlL3Jlc3VtZSAqLworI2RlZmluZQkgIFZUMTcyNF9QRE1BNF9QQVVTRQkweDgwCisjZGVmaW5lCSAgVlQxNzI0X1BETUEzX1BBVVNFCTB4NDAKKyNkZWZpbmUJICBWVDE3MjRfUERNQTJfUEFVU0UJMHgyMAorI2RlZmluZQkgIFZUMTcyNF9QRE1BMV9QQVVTRQkweDEwCisjZGVmaW5lCSAgVlQxNzI0X1JETUExX1BBVVNFCTB4MDQKKyNkZWZpbmUJICBWVDE3MjRfUkRNQTBfUEFVU0UJMHgwMgorI2RlZmluZQkgIFZUMTcyNF9QRE1BMF9QQVVTRQkweDAxCisjZGVmaW5lIFZUMTcyNF9NVF9QTEFZQkFDS19DT1VOVAkweDFjCS8qIHdvcmQgLSBwbGF5YmFjayBjb3VudCAqLworI2RlZmluZSBWVDE3MjRfTVRfQ0FQVFVSRV9BRERSCQkweDIwCS8qIGR3b3JkIC0gY2FwdHVyZSBhZGRyZXNzICovCisjZGVmaW5lIFZUMTcyNF9NVF9DQVBUVVJFX1NJWkUJCTB4MjQJLyogd29yZCAtIGNhcHR1cmUgc2l6ZSAqLworI2RlZmluZSBWVDE3MjRfTVRfQ0FQVFVSRV9DT1VOVAkJMHgyNgkvKiB3b3JkIC0gY2FwdHVyZSBjb3VudCAqLworCisjZGVmaW5lIFZUMTcyNF9NVF9ST1VURV9QTEFZQkFDSwkweDJjCS8qIHdvcmQgKi8KKworI2RlZmluZSBWVDE3MjRfTVRfUkRNQTFfQUREUgkJMHgzMAkvKiBkd29yZCAtIFJETUExIGNhcHR1cmUgYWRkcmVzcyAqLworI2RlZmluZSBWVDE3MjRfTVRfUkRNQTFfU0laRQkJMHgzNAkvKiB3b3JkIC0gUkRNQTEgY2FwdHVyZSBzaXplICovCisjZGVmaW5lIFZUMTcyNF9NVF9SRE1BMV9DT1VOVAkJMHgzNgkvKiB3b3JkIC0gUkRNQTEgY2FwdHVyZSBjb3VudCAqLworCisjZGVmaW5lIFZUMTcyNF9NVF9TUERJRl9DVFJMCQkweDNjCS8qIHdvcmQgKi8KKyNkZWZpbmUgVlQxNzI0X01UX01PTklUT1JfUEVBS0lOREVYCTB4M2UJLyogYnl0ZSAqLworI2RlZmluZSBWVDE3MjRfTVRfTU9OSVRPUl9QRUFLREFUQQkweDNmCS8qIGJ5dGUgKi8KKworLyogY29uY3VycmVudCBzdGVyZW8gY2hhbm5lbHMgKi8KKyNkZWZpbmUgVlQxNzI0X01UX1BETUE0X0FERFIJCTB4NDAJLyogZHdvcmQgKi8KKyNkZWZpbmUgVlQxNzI0X01UX1BETUE0X1NJWkUJCTB4NDQJLyogd29yZCAqLworI2RlZmluZSBWVDE3MjRfTVRfUERNQTRfQ09VTlQJCTB4NDYJLyogd29yZCAqLworI2RlZmluZSBWVDE3MjRfTVRfUERNQTNfQUREUgkJMHg1MAkvKiBkd29yZCAqLworI2RlZmluZSBWVDE3MjRfTVRfUERNQTNfU0laRQkJMHg1NAkvKiB3b3JkICovCisjZGVmaW5lIFZUMTcyNF9NVF9QRE1BM19DT1VOVAkJMHg1NgkvKiB3b3JkICovCisjZGVmaW5lIFZUMTcyNF9NVF9QRE1BMl9BRERSCQkweDYwCS8qIGR3b3JkICovCisjZGVmaW5lIFZUMTcyNF9NVF9QRE1BMl9TSVpFCQkweDY0CS8qIHdvcmQgKi8KKyNkZWZpbmUgVlQxNzI0X01UX1BETUEyX0NPVU5UCQkweDY2CS8qIHdvcmQgKi8KKyNkZWZpbmUgVlQxNzI0X01UX1BETUExX0FERFIJCTB4NzAJLyogZHdvcmQgKi8KKyNkZWZpbmUgVlQxNzI0X01UX1BETUExX1NJWkUJCTB4NzQJLyogd29yZCAqLworI2RlZmluZSBWVDE3MjRfTVRfUERNQTFfQ09VTlQJCTB4NzYJLyogd29yZCAqLworCisKK3Vuc2lnbmVkIGNoYXIgc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgY2hhciBkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcik7Cit2b2lkIHNuZF92dDE3MjRfd3JpdGVfaTJjKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIGRldiwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworCisjZW5kaWYgLyogX19TT1VORF9WVDE3MjRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZlZmExCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMKQEAgLTAsMCArMSwxMDM2IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIFRlcnJhdGVjIEVXUzg4TVQvRCwgRVdYMjQvOTYsIERNWCA2RmlyZQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jczg0MjcuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImV3cy5oIgorCisjZGVmaW5lIFNORF9DUzg0MDQKKyNpbmNsdWRlIDxzb3VuZC9jczg0MDMuaD4KKworZW51bSB7CisJRVdTX0kyQ19DUzg0MDQgPSAwLCBFV1NfSTJDX1BDRjEsIEVXU19JMkNfUENGMiwKKwlFV1NfSTJDXzg4RCA9IDAsCisJRVdTX0kyQ182RklSRSA9IDAKK307CisJCisKKy8qCisgKiBhY2Nlc3MgdmlhIGkyYyBtb2RlIChmb3IgRVdYIDI0Lzk2LCBFV1MgODhNVCZEKQorICovCisKKy8qIHNlbmQgU0RBIGFuZCBTQ0wgKi8KK3N0YXRpYyB2b2lkIGV3eF9pMmNfc2V0bGluZXMoc25kX2kyY19idXNfdCAqYnVzLCBpbnQgY2xrLCBpbnQgZGF0YSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgdG1wID0gMDsKKwlpZiAoY2xrKQorCQl0bXAgfD0gSUNFMTcxMl9FV1gyNDk2X1NFUklBTF9DTE9DSzsKKwlpZiAoZGF0YSkKKwkJdG1wIHw9IElDRTE3MTJfRVdYMjQ5Nl9TRVJJQUxfREFUQTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIHRtcCk7CisJdWRlbGF5KDUpOworfQorCitzdGF0aWMgaW50IGV3eF9pMmNfZ2V0Y2xvY2soc25kX2kyY19idXNfdCAqYnVzKQoreworCWljZTE3MTJfdCAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIHNuZF9pY2UxNzEyX3JlYWQoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBKSAmIElDRTE3MTJfRVdYMjQ5Nl9TRVJJQUxfQ0xPQ0sgPyAxIDogMDsKK30KKworc3RhdGljIGludCBld3hfaTJjX2dldGRhdGEoc25kX2kyY19idXNfdCAqYnVzLCBpbnQgYWNrKQoreworCWljZTE3MTJfdCAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJaW50IGJpdDsKKwkvKiBzZXQgUlcgcGluIHRvIGxvdyAqLworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSywgfklDRTE3MTJfRVdYMjQ5Nl9SVyk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCAwKTsKKwlpZiAoYWNrKQorCQl1ZGVsYXkoNSk7CisJYml0ID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpICYgSUNFMTcxMl9FV1gyNDk2X1NFUklBTF9EQVRBID8gMSA6IDA7CisJLyogc2V0IFJXIHBpbiB0byBoaWdoICovCisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCBJQ0UxNzEyX0VXWDI0OTZfUlcpOworCS8qIHJlc2V0IHdyaXRlIG1hc2sgKi8KKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX1dSSVRFX01BU0ssIH5JQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0NMT0NLKTsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgdm9pZCBld3hfaTJjX3N0YXJ0KHNuZF9pMmNfYnVzX3QgKmJ1cykKK3sKKwlpY2UxNzEyX3QgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgbWFzazsKKworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwkvKiBzZXQgUlcgaGlnaCAqLworCW1hc2sgPSBJQ0UxNzEyX0VXWDI0OTZfUlc7CisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXWDI0OTY6CisJCW1hc2sgfD0gSUNFMTcxMl9FV1gyNDk2X0FLNDUyNF9DUzsgLyogQ1MgaGlnaCBhbHNvICovCisJCWJyZWFrOworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRE1YNkZJUkU6CisJCW1hc2sgfD0gSUNFMTcxMl82RklSRV9BSzQ1MjRfQ1NfTUFTSzsgLyogQ1MgaGlnaCBhbHNvICovCisJCWJyZWFrOworCX0KKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlX2JpdHMoaWNlLCBtYXNrLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZXd4X2kyY19zdG9wKHNuZF9pMmNfYnVzX3QgKmJ1cykKK3sKKwlpY2UxNzEyX3QgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKK30KKworc3RhdGljIHZvaWQgZXd4X2kyY19kaXJlY3Rpb24oc25kX2kyY19idXNfdCAqYnVzLCBpbnQgY2xvY2ssIGludCBkYXRhKQoreworCWljZTE3MTJfdCAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBtYXNrID0gMDsKKworCWlmIChjbG9jaykKKwkJbWFzayB8PSBJQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0NMT0NLOyAvKiB3cml0ZSBTQ0wgKi8KKwlpZiAoZGF0YSkKKwkJbWFzayB8PSBJQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0RBVEE7IC8qIHdyaXRlIFNEQSAqLworCWljZS0+Z3Bpby5kaXJlY3Rpb24gJj0gfihJQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0NMT0NLfElDRTE3MTJfRVdYMjQ5Nl9TRVJJQUxfREFUQSk7CisJaWNlLT5ncGlvLmRpcmVjdGlvbiB8PSBtYXNrOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fRElSRUNUSU9OLCBpY2UtPmdwaW8uZGlyZWN0aW9uKTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX1dSSVRFX01BU0ssIH5tYXNrKTsKK30KKworc3RhdGljIHNuZF9pMmNfYml0X29wc190IHNuZF9pY2UxNzEyX2V3eF9jczg0MjdfYml0X29wcyA9IHsKKwkuc3RhcnQgPSBld3hfaTJjX3N0YXJ0LAorCS5zdG9wID0gZXd4X2kyY19zdG9wLAorCS5kaXJlY3Rpb24gPSBld3hfaTJjX2RpcmVjdGlvbiwKKwkuc2V0bGluZXMgPSBld3hfaTJjX3NldGxpbmVzLAorCS5nZXRjbG9jayA9IGV3eF9pMmNfZ2V0Y2xvY2ssCisJLmdldGRhdGEgPSBld3hfaTJjX2dldGRhdGEsCit9OworCisKKy8qCisgKiBBSzQ1MjQgYWNjZXNzCisgKi8KKworLyogQUs0NTI0IGNoaXAgc2VsZWN0OyBhZGRyZXNzIDB4NDggYml0IDAtMyAqLworc3RhdGljIGludCBzbmRfaWNlMTcxMl9ld3M4OG10X2NoaXBfc2VsZWN0KGljZTE3MTJfdCAqaWNlLCBpbnQgY2hpcF9tYXNrKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSwgbmRhdGE7CisKKwlzbmRfYXNzZXJ0KGNoaXBfbWFzayA+PSAwICYmIGNoaXBfbWFzayA8PSAweDBmLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlpZiAoc25kX2kyY19yZWFkYnl0ZXMoaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19QQ0YyXSwgJmRhdGEsIDEpICE9IDEpCisJCWdvdG8gX19lcnJvcjsKKwluZGF0YSA9IChkYXRhICYgMHhmMCkgfCBjaGlwX21hc2s7CisJaWYgKG5kYXRhICE9IGRhdGEpCisJCWlmIChzbmRfaTJjX3NlbmRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDX1BDRjJdLCAmbmRhdGEsIDEpICE9IDEpCisJCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCXJldHVybiAwOworCisgICAgIF9fZXJyb3I6CisJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCXNuZF9wcmludGsoS0VSTl9FUlIgIkFLNDUyNCBjaGlwIHNlbGVjdCBmYWlsZWQsIGNoZWNrIGNhYmxlIHRvIHRoZSBmcm9udCBtb2R1bGVcbiIpOworCXJldHVybiAtRUlPOworfQorCisvKiBzdGFydCBjYWxsYmFjayBmb3IgRVdTODhNVCwgbmVlZHMgdG8gc2VsZWN0IGEgY2VydGFpbiBjaGlwIG1hc2sgKi8KK3N0YXRpYyB2b2lkIGV3czg4bXRfYWs0NTI0X2xvY2soYWttNHh4eF90ICphaywgaW50IGNoaXApCit7CisJaWNlMTcxMl90ICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCXVuc2lnbmVkIGNoYXIgdG1wOworCS8qIGFzc2VydCBBSzQ1MjQgQ1MgKi8KKwlpZiAoc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIH4oMSA8PCBjaGlwKSAmIDB4MGYpIDwgMCkKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmF0YWwgZXJyb3IgKGV3czg4bXQgY2hpcCBzZWxlY3QpXG4iKTsKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdG1wID0gSUNFMTcxMl9FV1M4OF9TRVJJQUxfREFUQSB8CisJCUlDRTE3MTJfRVdTODhfU0VSSUFMX0NMT0NLIHwKKwkJSUNFMTcxMl9FV1M4OF9SVzsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RJUkVDVElPTiwKKwkJCSAgaWNlLT5ncGlvLmRpcmVjdGlvbiB8IHRtcCk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19XUklURV9NQVNLLCB+dG1wKTsKK30KKworLyogc3RvcCBjYWxsYmFjayBmb3IgRVdTODhNVCwgbmVlZHMgdG8gZGVzZWxlY3QgY2hpcCBtYXNrICovCitzdGF0aWMgdm9pZCBld3M4OG10X2FrNDUyNF91bmxvY2soYWttNHh4eF90ICphaywgaW50IGNoaXApCit7CisJaWNlMTcxMl90ICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl1ZGVsYXkoMSk7CisJc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIDB4MGYpOworfQorCisvKiBzdGFydCBjYWxsYmFjayBmb3IgRVdYMjQvOTYgKi8KK3N0YXRpYyB2b2lkIGV3eDI0OTZfYWs0NTI0X2xvY2soYWttNHh4eF90ICphaywgaW50IGNoaXApCit7CisJaWNlMTcxMl90ICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCXVuc2lnbmVkIGNoYXIgdG1wOworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl0bXAgPSAgSUNFMTcxMl9FV1gyNDk2X1NFUklBTF9EQVRBIHwKKwkJSUNFMTcxMl9FV1gyNDk2X1NFUklBTF9DTE9DSyB8CisJCUlDRTE3MTJfRVdYMjQ5Nl9BSzQ1MjRfQ1MgfAorCQlJQ0UxNzEyX0VXWDI0OTZfUlc7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sCisJCQkgIGljZS0+Z3Bpby5kaXJlY3Rpb24gfCB0bXApOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSywgfnRtcCk7Cit9CisKKy8qIHN0YXJ0IGNhbGxiYWNrIGZvciBETVggNmZpcmUgKi8KK3N0YXRpYyB2b2lkIGRteDZmaXJlX2FrNDUyNF9sb2NrKGFrbTR4eHhfdCAqYWssIGludCBjaGlwKQoreworCXN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgKnByaXYgPSAodm9pZCAqKWFrLT5wcml2YXRlX3ZhbHVlWzBdOworCWljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdG1wID0gcHJpdi0+Y3NfbWFzayA9IHByaXYtPmNzX2FkZHIgPSAoMSA8PCBjaGlwKSAmIElDRTE3MTJfNkZJUkVfQUs0NTI0X0NTX01BU0s7CisJdG1wIHw9IElDRTE3MTJfNkZJUkVfU0VSSUFMX0RBVEEgfAorCQlJQ0UxNzEyXzZGSVJFX1NFUklBTF9DTE9DSyB8CisJCUlDRTE3MTJfNkZJUkVfUlc7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sCisJCQkgIGljZS0+Z3Bpby5kaXJlY3Rpb24gfCB0bXApOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSywgfnRtcCk7Cit9CisKKy8qCisgKiBDUzg0MDQgaW50ZXJmYWNlIG9uIEVXUzg4TVQvRAorICovCisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX2V3c19jczg0MDRfc3BkaWZfd3JpdGUoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGNoYXIgYml0cykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzWzJdOworCisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdTODhNVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVRfTkVXOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4ODoKKwkJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfQ1M4NDA0XSwgJmJpdHMsIDEpICE9IDEpCisJCQlnb3RvIF9lcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OEQ6CisJCWlmIChzbmRfaTJjX3JlYWRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzg4RF0sIGJ5dGVzLCAyKSAhPSAyKQorCQkJZ290byBfZXJyb3I7CisJCWlmIChiaXRzICE9IGJ5dGVzWzFdKSB7CisJCQlieXRlc1sxXSA9IGJpdHM7CisJCQlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ184OERdLCBieXRlcywgMikgIT0gMikKKwkJCQlnb3RvIF9lcnJvcjsKKwkJfQorCQlicmVhazsKKwl9CisgX2Vycm9yOgorCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKK30KKworLyoKKyAqLworCitzdGF0aWMgdm9pZCBld3M4OF9zcGRpZl9kZWZhdWx0X2dldChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzbmRfY3M4NDA0X2RlY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LCBpY2UtPnNwZGlmLmNzODQwM19iaXRzKTsKK30KKworc3RhdGljIGludCBld3M4OF9zcGRpZl9kZWZhdWx0X3B1dChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisKKwl2YWwgPSBzbmRfY3M4NDA0X2VuY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4KTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSBpY2UtPnNwZGlmLmNzODQwM19iaXRzICE9IHZhbDsKKwlpY2UtPnNwZGlmLmNzODQwM19iaXRzID0gdmFsOworCWlmIChjaGFuZ2UgJiYgaWNlLT5wbGF5YmFja19wcm9fc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwkJc25kX2ljZTE3MTJfZXdzX2NzODQwNF9zcGRpZl93cml0ZShpY2UsIHZhbCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHZvaWQgZXdzODhfc3BkaWZfc3RyZWFtX2dldChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzbmRfY3M4NDA0X2RlY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LCBpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgZXdzODhfc3BkaWZfc3RyZWFtX3B1dChpY2UxNzEyX3QgKmljZSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisKKwl2YWwgPSBzbmRfY3M4NDA0X2VuY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4KTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSBpY2UtPnNwZGlmLmNzODQwM19zdHJlYW1fYml0cyAhPSB2YWw7CisJaWNlLT5zcGRpZi5jczg0MDNfc3RyZWFtX2JpdHMgPSB2YWw7CisJaWYgKGNoYW5nZSAmJiBpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCQlzbmRfaWNlMTcxMl9ld3NfY3M4NDA0X3NwZGlmX3dyaXRlKGljZSwgdmFsKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCisKKy8qIG9wZW4gY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIGV3czg4X29wZW5fc3BkaWYoaWNlMTcxMl90ICppY2UsIHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlLT5zcGRpZi5jczg0MDNfc3RyZWFtX2JpdHMgPSBpY2UtPnNwZGlmLmNzODQwM19iaXRzOworfQorCisvKiBzZXQgdXAgU1BESUYgZm9yIEVXUzg4TVQgLyBFV1M4OEQgKi8KK3N0YXRpYyB2b2lkIGV3czg4X3NldHVwX3NwZGlmKGljZTE3MTJfdCAqaWNlLCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdG1wOworCWludCBjaGFuZ2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWNlLT5yZWdfbG9jaywgZmxhZ3MpOworCXRtcCA9IGljZS0+c3BkaWYuY3M4NDAzX3N0cmVhbV9iaXRzOworCWlmICh0bXAgJiAweDEwKQkJLyogY29uc3VtZXIgKi8KKwkJdG1wICY9ICh0bXAgJiAweDAxKSA/IH4weDA2IDogfjB4NjA7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAzMjAwMDogdG1wIHw9ICh0bXAgJiAweDAxKSA/IDB4MDIgOiAweDAwOyBicmVhazsKKwljYXNlIDQ0MTAwOiB0bXAgfD0gKHRtcCAmIDB4MDEpID8gMHgwNiA6IDB4NDA7IGJyZWFrOworCWNhc2UgNDgwMDA6IHRtcCB8PSAodG1wICYgMHgwMSkgPyAweDA0IDogMHgyMDsgYnJlYWs7CisJZGVmYXVsdDogdG1wIHw9ICh0bXAgJiAweDAxKSA/IDB4MDYgOiAweDQwOyBicmVhazsKKwl9CisJY2hhbmdlID0gaWNlLT5zcGRpZi5jczg0MDNfc3RyZWFtX2JpdHMgIT0gdG1wOworCWljZS0+c3BkaWYuY3M4NDAzX3N0cmVhbV9iaXRzID0gdG1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoY2hhbmdlKQorCQlzbmRfY3RsX25vdGlmeShpY2UtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmaWNlLT5zcGRpZi5zdHJlYW1fY3RsLT5pZCk7CisJc25kX2ljZTE3MTJfZXdzX2NzODQwNF9zcGRpZl93cml0ZShpY2UsIHRtcCk7Cit9CisKKworLyoKKyAqLworc3RhdGljIGFrbTR4eHhfdCBha21fZXdzODhtdCBfX2RldmluaXRkYXRhID0geworCS5udW1fYWRjcyA9IDgsCisJLm51bV9kYWNzID0gOCwKKwkudHlwZSA9IFNORF9BSzQ1MjQsCisJLm9wcyA9IHsKKwkJLmxvY2sgPSBld3M4OG10X2FrNDUyNF9sb2NrLAorCQkudW5sb2NrID0gZXdzODhtdF9hazQ1MjRfdW5sb2NrCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3czg4bXRfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDIsCisJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCisJLmRhdGFfbWFzayA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEsCisJLmNsa19tYXNrID0gSUNFMTcxMl9FV1M4OF9TRVJJQUxfQ0xPQ0ssCisJLmNzX21hc2sgPSAwLAorCS5jc19hZGRyID0gMCwKKwkuY3Nfbm9uZSA9IDAsIC8qIG5vIGNoaXAgc2VsZWN0IG9uIGdwaW8gKi8KKwkuYWRkX2ZsYWdzID0gSUNFMTcxMl9FV1M4OF9SVywgLyogc2V0IHJ3IGJpdCBoaWdoICovCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworc3RhdGljIGFrbTR4eHhfdCBha21fZXd4MjQ5NiBfX2RldmluaXRkYXRhID0geworCS5udW1fYWRjcyA9IDIsCisJLm51bV9kYWNzID0gMiwKKwkudHlwZSA9IFNORF9BSzQ1MjQsCisJLm9wcyA9IHsKKwkJLmxvY2sgPSBld3gyNDk2X2FrNDUyNF9sb2NrCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3eDI0OTZfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDIsCisJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCisJLmRhdGFfbWFzayA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEsCisJLmNsa19tYXNrID0gSUNFMTcxMl9FV1M4OF9TRVJJQUxfQ0xPQ0ssCisJLmNzX21hc2sgPSBJQ0UxNzEyX0VXWDI0OTZfQUs0NTI0X0NTLAorCS5jc19hZGRyID0gSUNFMTcxMl9FV1gyNDk2X0FLNDUyNF9DUywKKwkuY3Nfbm9uZSA9IDAsCisJLmFkZF9mbGFncyA9IElDRTE3MTJfRVdTODhfUlcsIC8qIHNldCBydyBiaXQgaGlnaCAqLworCS5tYXNrX2ZsYWdzID0gMCwKK307CisKK3N0YXRpYyBha200eHh4X3QgYWttXzZmaXJlIF9fZGV2aW5pdGRhdGEgPSB7CisJLm51bV9hZGNzID0gNiwKKwkubnVtX2RhY3MgPSA2LAorCS50eXBlID0gU05EX0FLNDUyNCwKKwkub3BzID0geworCQkubG9jayA9IGRteDZmaXJlX2FrNDUyNF9sb2NrCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttXzZmaXJlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKKwkuY2FkZHIgPSAyLAorCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLworCS5kYXRhX21hc2sgPSBJQ0UxNzEyXzZGSVJFX1NFUklBTF9EQVRBLAorCS5jbGtfbWFzayA9IElDRTE3MTJfNkZJUkVfU0VSSUFMX0NMT0NLLAorCS5jc19tYXNrID0gMCwKKwkuY3NfYWRkciA9IDAsIC8qIHNldCBsYXRlciAqLworCS5jc19ub25lID0gMCwKKwkuYWRkX2ZsYWdzID0gSUNFMTcxMl82RklSRV9SVywgLyogc2V0IHJ3IGJpdCBoaWdoICovCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNoaXAKKyAqLworCisvKiA2ZmlyZSBzcGVjaWZpYyAqLworI2RlZmluZSBQQ0Y5NTU0X1JFR19JTlBVVCAgICAgIDAKKyNkZWZpbmUgUENGOTU1NF9SRUdfT1VUUFVUICAgICAxCisjZGVmaW5lIFBDRjk1NTRfUkVHX1BPTEFSSVRZICAgMgorI2RlZmluZSBQQ0Y5NTU0X1JFR19DT05GSUcgICAgIDMKKworc3RhdGljIGludCBzbmRfaWNlMTcxMl82ZmlyZV93cml0ZV9wY2EoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9ld3NfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlpbnQgZXJyOworCWFrbTR4eHhfdCAqYWs7CisKKwkvKiBzZXQgdGhlIGFuYWxvZyBEQUNzICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXWDI0OTY6CisJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOworCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKKwkJYnJlYWs7CQorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdTODhNVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVRfTkVXOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4ODoKKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA4OworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4RDoKKwkJLyogTm90ZTogbm90IGFuYWxvZyBidXQgQURBVCBJL08gKi8KKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA4OworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RNWDZGSVJFOgorCQlpY2UtPm51bV90b3RhbF9kYWNzID0gNjsKKwkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDY7CisJCWJyZWFrOworCX0KKworCS8qIGNyZWF0ZSBpMmMgKi8KKwlpZiAoKGVyciA9IHNuZF9pMmNfYnVzX2NyZWF0ZShpY2UtPmNhcmQsICJJQ0UxNzEyIEdQSU8gMSIsIE5VTEwsICZpY2UtPmkyYykpIDwgMCkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlpY2UtPmkyYy0+cHJpdmF0ZV9kYXRhID0gaWNlOworCWljZS0+aTJjLT5od19vcHMuYml0ID0gJnNuZF9pY2UxNzEyX2V3eF9jczg0MjdfYml0X29wczsKKworCS8qIGNyZWF0ZSBpMmMgZGV2aWNlcyAqLworCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRToKKwkJaWYgKChlcnIgPSBzbmRfaTJjX2RldmljZV9jcmVhdGUoaWNlLT5pMmMsICJQQ0Y5NTU0IiwgSUNFMTcxMl82RklSRV9QQ0Y5NTU0X0FERFIsICZpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzZGSVJFXSkpIDwgMCkgeworCQkJc25kX3ByaW50aygiUENGOTU1NCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzbmRfaWNlMTcxMl82ZmlyZV93cml0ZV9wY2EoaWNlLCBQQ0Y5NTU0X1JFR19DT05GSUcsIDB4ODApOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVQ6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OE1UX05FVzoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX1BIQVNFODg6CisJCWlmICgoZXJyID0gc25kX2kyY19kZXZpY2VfY3JlYXRlKGljZS0+aTJjLCAiQ1M4NDA0IiwgSUNFMTcxMl9FV1M4OE1UX0NTODQwNF9BRERSLCAmaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19DUzg0MDRdKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBzbmRfaTJjX2RldmljZV9jcmVhdGUoaWNlLT5pMmMsICJQQ0Y4NTc0ICgxc3QpIiwgSUNFMTcxMl9FV1M4OE1UX0lOUFVUX0FERFIsICZpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDX1BDRjFdKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBzbmRfaTJjX2RldmljZV9jcmVhdGUoaWNlLT5pMmMsICJQQ0Y4NTc0ICgybmQpIiwgSUNFMTcxMl9FV1M4OE1UX09VVFBVVF9BRERSLCAmaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19QQ0YyXSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCS8qIENoZWNrIGlmIHRoZSBmcm9udCBtb2R1bGUgaXMgY29ubmVjdGVkICovCisJCWlmICgoZXJyID0gc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIDB4MGYpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4RDoKKwkJaWYgKChlcnIgPSBzbmRfaTJjX2RldmljZV9jcmVhdGUoaWNlLT5pMmMsICJQQ0Y4NTc1IiwgSUNFMTcxMl9FV1M4OERfUENGX0FERFIsICZpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzg4RF0pKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwl9CisKKwkvKiBzZXQgdXAgU1BESUYgaW50ZXJmYWNlICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXWDI0OTY6CisJCWlmICgoZXJyID0gc25kX2ljZTE3MTJfaW5pdF9jczg0MjcoaWNlLCBDUzg0MjdfQkFTRV9BRERSKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJc25kX2NzODQyN19yZWdfd3JpdGUoaWNlLT5jczg0MjcsIENTODQyN19SRUdfUkVDVkVSUk1BU0ssIENTODQyN19VTkxPQ0sgfCBDUzg0MjdfQ09ORiB8IENTODQyN19CSVAgfCBDUzg0MjdfUEFSKTsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRToKKwkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9pbml0X2NzODQyNyhpY2UsIElDRTE3MTJfNkZJUkVfQ1M4NDI3X0FERFIpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzbmRfY3M4NDI3X3JlZ193cml0ZShpY2UtPmNzODQyNywgQ1M4NDI3X1JFR19SRUNWRVJSTUFTSywgQ1M4NDI3X1VOTE9DSyB8IENTODQyN19DT05GIHwgQ1M4NDI3X0JJUCB8IENTODQyN19QQVIpOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVQ6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OE1UX05FVzoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX1BIQVNFODg6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OEQ6CisJCS8qIHNldCB1cCBDUzg0MDQgKi8KKwkJaWNlLT5zcGRpZi5vcHMub3BlbiA9IGV3czg4X29wZW5fc3BkaWY7CisJCWljZS0+c3BkaWYub3BzLnNldHVwX3JhdGUgPSBld3M4OF9zZXR1cF9zcGRpZjsKKwkJaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9nZXQgPSBld3M4OF9zcGRpZl9kZWZhdWx0X2dldDsKKwkJaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9wdXQgPSBld3M4OF9zcGRpZl9kZWZhdWx0X3B1dDsKKwkJaWNlLT5zcGRpZi5vcHMuc3RyZWFtX2dldCA9IGV3czg4X3NwZGlmX3N0cmVhbV9nZXQ7CisJCWljZS0+c3BkaWYub3BzLnN0cmVhbV9wdXQgPSBld3M4OF9zcGRpZl9zdHJlYW1fcHV0OworCQkvKiBTZXQgc3BkaWYgZGVmYXVsdHMgKi8KKwkJc25kX2ljZTE3MTJfZXdzX2NzODQwNF9zcGRpZl93cml0ZShpY2UsIGljZS0+c3BkaWYuY3M4NDAzX2JpdHMpOworCQlicmVhazsKKwl9CisKKwkvKiBubyBhbmFsb2c/ICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4RDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYW5hbG9nIHNlY3Rpb24gKi8KKwlhayA9IGljZS0+YWttID0ga21hbGxvYyhzaXplb2YoYWttNHh4eF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgYWspCisJCXJldHVybiAtRU5PTUVNOworCWljZS0+YWttX2NvZGVjcyA9IDE7CisKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdTODhNVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVRfTkVXOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4ODoKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2V3czg4bXQsICZha21fZXdzODhtdF9wcml2LCBpY2UpOworCQlicmVhazsKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXWDI0OTY6CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9ld3gyNDk2LCAmYWttX2V3eDI0OTZfcHJpdiwgaWNlKTsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRToKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttXzZmaXJlLCAmYWttXzZmaXJlX3ByaXYsIGljZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEVXWCAyNC85NiBzcGVjaWZpYyBjb250cm9scworICovCisKKy8qIGkvbyBzZW5zaXRpdml0eSAtIHRoaXMgY2FsbGJhY2sgaXMgc2hhcmVkIGFtb25nIG90aGVyIGRldmljZXMsIHRvbyAqLworc3RhdGljIGludCBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKXsKKworCXN0YXRpYyBjaGFyICp0ZXh0c1syXSA9IHsKKwkJIis0ZEJ1IiwgIi0xMGRCViIsCisJfTsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSAyKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3eF9pb19zZW5zZV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSkgJiBtYXNrID8gMSA6IDA7CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3eF9pb19zZW5zZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHZhbCwgbnZhbDsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmICgxIDw8IDMxKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwludmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA/IG1hc2sgOiAwOworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl2YWwgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSk7CisJbnZhbCB8PSB2YWwgJiB+bWFzazsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIG52YWwpOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gdmFsICE9IG52YWw7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZXd4MjQ5Nl9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSW5wdXQgU2Vuc2l0aXZpdHkgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbywKKwkJLmdldCA9IHNuZF9pY2UxNzEyX2V3eF9pb19zZW5zZV9nZXQsCisJCS5wdXQgPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IElDRTE3MTJfRVdYMjQ5Nl9BSU5fU0VMLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiT3V0cHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCisJCS5pbmZvID0gc25kX2ljZTE3MTJfZXd4X2lvX3NlbnNlX2luZm8sCisJCS5nZXQgPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfZ2V0LAorCQkucHV0ID0gc25kX2ljZTE3MTJfZXd4X2lvX3NlbnNlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBJQ0UxNzEyX0VXWDI0OTZfQU9VVF9TRUwsCisJfSwKK307CisKKworLyoKKyAqIEVXUzg4TVQgc3BlY2lmaWMgY29udHJvbHMKKyAqLworLyogYW5hbG9nIG91dHB1dCBzZW5zaXRpdml0eTs7IGFkZHJlc3MgMHg0OCBiaXQgNiAqLworc3RhdGljIGludCBzbmRfaWNlMTcxMl9ld3M4OG10X291dHB1dF9zZW5zZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlpZiAoc25kX2kyY19yZWFkYnl0ZXMoaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19QQ0YyXSwgJmRhdGEsIDEpICE9IDEpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBkYXRhICYgSUNFMTcxMl9FV1M4OE1UX09VVFBVVF9TRU5TRSA/IDEgOiAwOyAvKiBoaWdoID0gLTEwZEJWLCBsb3cgPSArNGRCdSAqLworCXJldHVybiAwOworfQorCisvKiBhbmFsb2cgb3V0cHV0IHNlbnNpdGl2aXR5OzsgYWRkcmVzcyAweDQ4IGJpdCA2ICovCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3czg4bXRfb3V0cHV0X3NlbnNlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIG5kYXRhOworCisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlpZiAoc25kX2kyY19yZWFkYnl0ZXMoaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19QQ0YyXSwgJmRhdGEsIDEpICE9IDEpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbmRhdGEgPSAoZGF0YSAmIH5JQ0UxNzEyX0VXUzg4TVRfT1VUUFVUX1NFTlNFKSB8ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID8gSUNFMTcxMl9FV1M4OE1UX09VVFBVVF9TRU5TRSA6IDApOworCWlmIChuZGF0YSAhPSBkYXRhICYmIHNuZF9pMmNfc2VuZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfUENGMl0sICZuZGF0YSwgMSkgIT0gMSkgeworCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJCXJldHVybiAtRUlPOworCX0KKwlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJcmV0dXJuIG5kYXRhICE9IGRhdGE7Cit9CisKKy8qIGFuYWxvZyBpbnB1dCBzZW5zaXRpdml0eTsgYWRkcmVzcyAweDQ2ICovCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2VfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFubmVsID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJc25kX2Fzc2VydChjaGFubmVsID49IDAgJiYgY2hhbm5lbCA8PSA3LCByZXR1cm4gMCk7CisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlpZiAoc25kX2kyY19yZWFkYnl0ZXMoaWNlLT5zcGVjLmkyY2RldnNbRVdTX0kyQ19QQ0YxXSwgJmRhdGEsIDEpICE9IDEpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogcmV2ZXJzZWQ7IGhpZ2ggPSArNGRCdSwgbG93ID0gLTEwZEJWICovCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGRhdGEgJiAoMSA8PCBjaGFubmVsKSA/IDAgOiAxOworCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKKwlyZXR1cm4gMDsKK30KKworLyogYW5hbG9nIG91dHB1dCBzZW5zaXRpdml0eTsgYWRkcmVzcyAweDQ2ICovCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2VfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFubmVsID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJdW5zaWduZWQgY2hhciBkYXRhLCBuZGF0YTsKKworCXNuZF9hc3NlcnQoY2hhbm5lbCA+PSAwICYmIGNoYW5uZWwgPD0gNywgcmV0dXJuIDApOworCXNuZF9pMmNfbG9jayhpY2UtPmkyYyk7CisJaWYgKHNuZF9pMmNfcmVhZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfUENGMV0sICZkYXRhLCAxKSAhPSAxKSB7CisJCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW5kYXRhID0gKGRhdGEgJiB+KDEgPDwgY2hhbm5lbCkpIHwgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPyAwIDogKDEgPDwgY2hhbm5lbCkpOworCWlmIChuZGF0YSAhPSBkYXRhICYmIHNuZF9pMmNfc2VuZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfUENGMV0sICZuZGF0YSwgMSkgIT0gMSkgeworCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJCXJldHVybiAtRUlPOworCX0KKwlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJcmV0dXJuIG5kYXRhICE9IGRhdGE7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZXdzODhtdF9pbnB1dF9zZW5zZSBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIklucHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbywKKwkuZ2V0ID0gc25kX2ljZTE3MTJfZXdzODhtdF9pbnB1dF9zZW5zZV9nZXQsCisJLnB1dCA9IHNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2VfcHV0LAorCS5jb3VudCA9IDgsCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX2V3czg4bXRfb3V0cHV0X3NlbnNlIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiT3V0cHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbywKKwkuZ2V0ID0gc25kX2ljZTE3MTJfZXdzODhtdF9vdXRwdXRfc2Vuc2VfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9ld3M4OG10X291dHB1dF9zZW5zZV9wdXQsCit9OworCisKKy8qCisgKiBFV1M4OEQgc3BlY2lmaWMgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2V3czg4ZF9jb250cm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9ld3M4OGRfY29udHJvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOworCXVuc2lnbmVkIGNoYXIgZGF0YVsyXTsKKwkKKwlzbmRfaTJjX2xvY2soaWNlLT5pMmMpOworCWlmIChzbmRfaTJjX3JlYWRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzg4RF0sIGRhdGEsIDIpICE9IDIpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCWRhdGFbMF0gPSAoZGF0YVtzaGlmdCA+PiAzXSA+PiAoc2hpZnQgJiA3KSkgJiAweDAxOworCWlmIChpbnZlcnQpCisJCWRhdGFbMF0gXj0gMHgwMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhdGFbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOworCXVuc2lnbmVkIGNoYXIgZGF0YVsyXSwgbmRhdGFbMl07CisJaW50IGNoYW5nZTsKKworCXNuZF9pMmNfbG9jayhpY2UtPmkyYyk7CisJaWYgKHNuZF9pMmNfcmVhZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfODhEXSwgZGF0YSwgMikgIT0gMikgeworCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJCXJldHVybiAtRUlPOworCX0KKwluZGF0YVtzaGlmdCA+PiAzXSA9IGRhdGFbc2hpZnQgPj4gM10gJiB+KDEgPDwgKHNoaWZ0ICYgNykpOworCWlmIChpbnZlcnQpIHsKKwkJaWYgKCEgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCQluZGF0YVtzaGlmdCA+PiAzXSB8PSAoMSA8PCAoc2hpZnQgJiA3KSk7CisJfSBlbHNlIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQkJbmRhdGFbc2hpZnQgPj4gM10gfD0gKDEgPDwgKHNoaWZ0ICYgNykpOworCX0KKwljaGFuZ2UgPSAoZGF0YVtzaGlmdCA+PiAzXSAhPSBuZGF0YVtzaGlmdCA+PiAzXSk7CisJaWYgKGNoYW5nZSAmJiBzbmRfaTJjX3NlbmRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzg4RF0sIGRhdGEsIDIpICE9IDIpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgRVdTODhEX0NPTlRST0woeGlmYWNlLCB4bmFtZSwgeHNoaWZ0LCB4aW52ZXJ0LCB4YWNjZXNzKSBcCit7IC5pZmFjZSA9IHhpZmFjZSxcCisgIC5uYW1lID0geG5hbWUsXAorICAuYWNjZXNzID0geGFjY2VzcyxcCisgIC5pbmZvID0gc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xfaW5mbyxcCisgIC5nZXQgPSBzbmRfaWNlMTcxMl9ld3M4OGRfY29udHJvbF9nZXQsXAorICAucHV0ID0gc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xfcHV0LFwKKyAgLnByaXZhdGVfdmFsdWUgPSB4c2hpZnQgfCAoeGludmVydCA8PCA4KSxcCit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlFV1M4OERfQ09OVFJPTChTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIklFQzk1OCBJbnB1dCBPcHRpY2FsIiwgMCwgMSwgMCksIC8qIGludmVydGVkICovCisJRVdTODhEX0NPTlRST0woU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJBREFUIE91dHB1dCBPcHRpY2FsIiwgMSwgMCwgMCksCisJRVdTODhEX0NPTlRST0woU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJBREFUIEV4dGVybmFsIE1hc3RlciBDbG9jayIsIDIsIDAsIDApLAorCUVXUzg4RF9DT05UUk9MKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiRW5hYmxlIEFEQVQiLCAzLCAwLCAwKSwKKwlFV1M4OERfQ09OVFJPTChTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIkFEQVQgVGhyb3VnaCIsIDQsIDEsIDApLAorfTsKKworCisvKgorICogRE1YIDZGaXJlIHNwZWNpZmljIGNvbnRyb2xzCisgKi8KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl82ZmlyZV9yZWFkX3BjYShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgY2hhciByZWcpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCXNuZF9pMmNfbG9jayhpY2UtPmkyYyk7CisJYnl0ZSA9IHJlZzsKKwlzbmRfaTJjX3NlbmRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzZGSVJFXSwgJmJ5dGUsIDEpOworCWJ5dGUgPSAwOworCWlmIChzbmRfaTJjX3JlYWRieXRlcyhpY2UtPnNwZWMuaTJjZGV2c1tFV1NfSTJDXzZGSVJFXSwgJmJ5dGUsIDEpICE9IDEpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlwcmludGsoImNhbm5vdCByZWFkIHBjYVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfNmZpcmVfd3JpdGVfcGNhKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgYnl0ZXNbMl07CisJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKKwlieXRlc1swXSA9IHJlZzsKKwlieXRlc1sxXSA9IGRhdGE7CisJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKGljZS0+c3BlYy5pMmNkZXZzW0VXU19JMkNfNkZJUkVdLCBieXRlcywgMikgIT0gMikgeworCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJCXJldHVybiAtRUlPOworCX0KKwlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfNmZpcmVfY29udHJvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfNmZpcmVfY29udHJvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOworCWludCBkYXRhOworCQorCWlmICgoZGF0YSA9IHNuZF9pY2UxNzEyXzZmaXJlX3JlYWRfcGNhKGljZSwgUENGOTU1NF9SRUdfT1VUUFVUKSkgPCAwKQorCQlyZXR1cm4gZGF0YTsKKwlkYXRhID0gKGRhdGEgPj4gc2hpZnQpICYgMTsKKwlpZiAoaW52ZXJ0KQorCQlkYXRhIF49IDE7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzaGlmdCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMTsKKwlpbnQgZGF0YSwgbmRhdGE7CisJCisJaWYgKChkYXRhID0gc25kX2ljZTE3MTJfNmZpcmVfcmVhZF9wY2EoaWNlLCBQQ0Y5NTU0X1JFR19PVVRQVVQpKSA8IDApCisJCXJldHVybiBkYXRhOworCW5kYXRhID0gZGF0YSAmIH4oMSA8PCBzaGlmdCk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQluZGF0YSB8PSAoMSA8PCBzaGlmdCk7CisJaWYgKGludmVydCkKKwkJbmRhdGEgXj0gKDEgPDwgc2hpZnQpOworCWlmIChkYXRhICE9IG5kYXRhKSB7CisJCXNuZF9pY2UxNzEyXzZmaXJlX3dyaXRlX3BjYShpY2UsIFBDRjk1NTRfUkVHX09VVFBVVCwgKHVuc2lnbmVkIGNoYXIpbmRhdGEpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfNmZpcmVfc2VsZWN0X2lucHV0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7CisJCSJJbnRlcm5hbCIsICJGcm9udCBJbnB1dCIsICJSZWFyIElucHV0IiwgIldhdmUgVGFibGUiCisJfTsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNDsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSA0KQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorICAgICAKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfNmZpcmVfc2VsZWN0X2lucHV0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgZGF0YTsKKwkKKwlpZiAoKGRhdGEgPSBzbmRfaWNlMTcxMl82ZmlyZV9yZWFkX3BjYShpY2UsIFBDRjk1NTRfUkVHX09VVFBVVCkpIDwgMCkKKwkJcmV0dXJuIGRhdGE7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkYXRhICYgMzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl82ZmlyZV9zZWxlY3RfaW5wdXRfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBkYXRhLCBuZGF0YTsKKwkKKwlpZiAoKGRhdGEgPSBzbmRfaWNlMTcxMl82ZmlyZV9yZWFkX3BjYShpY2UsIFBDRjk1NTRfUkVHX09VVFBVVCkpIDwgMCkKKwkJcmV0dXJuIGRhdGE7CisJbmRhdGEgPSBkYXRhICYgfjM7CisJbmRhdGEgfD0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMyk7CisJaWYgKGRhdGEgIT0gbmRhdGEpIHsKKwkJc25kX2ljZTE3MTJfNmZpcmVfd3JpdGVfcGNhKGljZSwgUENGOTU1NF9SRUdfT1VUUFVULCAodW5zaWduZWQgY2hhciluZGF0YSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIERNWDZGSVJFX0NPTlRST0woeG5hbWUsIHhzaGlmdCwgeGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUixcCisgIC5uYW1lID0geG5hbWUsXAorICAuaW5mbyA9IHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xfaW5mbyxcCisgIC5nZXQgPSBzbmRfaWNlMTcxMl82ZmlyZV9jb250cm9sX2dldCxcCisgIC5wdXQgPSBzbmRfaWNlMTcxMl82ZmlyZV9jb250cm9sX3B1dCxcCisgIC5wcml2YXRlX3ZhbHVlID0geHNoaWZ0IHwgKHhpbnZlcnQgPDwgOCksXAorfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBbmFsb2cgSW5wdXQgU2VsZWN0IiwKKwkJLmluZm8gPSBzbmRfaWNlMTcxMl82ZmlyZV9zZWxlY3RfaW5wdXRfaW5mbywKKwkJLmdldCA9IHNuZF9pY2UxNzEyXzZmaXJlX3NlbGVjdF9pbnB1dF9nZXQsCisJCS5wdXQgPSBzbmRfaWNlMTcxMl82ZmlyZV9zZWxlY3RfaW5wdXRfcHV0LAorCX0sCisJRE1YNkZJUkVfQ09OVFJPTCgiRnJvbnQgRGlnaXRhbCBJbnB1dCBTd2l0Y2giLCAyLCAwKSwKKwkvLyBETVg2RklSRV9DT05UUk9MKCJNYXN0ZXIgQ2xvY2sgU2VsZWN0IiwgMywgMCksCisJRE1YNkZJUkVfQ09OVFJPTCgiT3B0aWNhbCBEaWdpdGFsIElucHV0IFN3aXRjaCIsIDQsIDApLAorCURNWDZGSVJFX0NPTlRST0woIlBob25vIEFuYWxvZyBJbnB1dCBTd2l0Y2giLCA1LCAwKSwKKwlETVg2RklSRV9DT05UUk9MKCJCcmVha2JveCBMRUQiLCA2LCAwKSwKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfZXdzX2FkZF9jb250cm9scyhpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJCisJLyogYWxsIHRlcnJhdGVjIGNhcmRzIGhhdmUgc3BkaWYsIGJ1dCBjczg0MjcgbW9kdWxlIGJ1aWxkcyBpdCdzIG93biBjb250cm9scyAqLworCWlmIChpY2UtPmNzODQyNyA9PSBOVUxMKSB7CisJCWVyciA9IHNuZF9pY2UxNzEyX3NwZGlmX2J1aWxkX2NvbnRyb2xzKGljZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBhazQ1MjQgY29udHJvbHMgKi8KKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdYMjQ5NjoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVQ6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OE1UX05FVzoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX1BIQVNFODg6CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRToKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCX0KKworCS8qIGNhcmQgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdYMjQ5NjoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9pY2UxNzEyX2V3eDI0OTZfY29udHJvbHMpOyBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2V3eDI0OTZfY29udHJvbHNbaWR4XSwgaWNlKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfRVdTODhNVDoKKwljYXNlIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVRfTkVXOgorCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4ODoKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2UsIGljZSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaWNlMTcxMl9ld3M4OG10X291dHB1dF9zZW5zZSwgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OEQ6CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfaWNlMTcxMl9ld3M4OGRfY29udHJvbHMpOyBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX2V3czg4ZF9jb250cm9sc1tpZHhdLCBpY2UpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRToKKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xzKTsgaWR4KyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaWNlMTcxMl82ZmlyZV9jb250cm9sc1tpZHhdLCBpY2UpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIGVudHJ5IHBvaW50ICovCitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2V3c19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfRVdYMjQ5NiwKKwkJLm5hbWUgPSAiVGVycmFUZWMgRVdYMjQvOTYiLAorCQkubW9kZWwgPSAiZXd4MjQ5NiIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9ld3NfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZXdzX2FkZF9jb250cm9scywKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVQsCisJCS5uYW1lID0gIlRlcnJhVGVjIEVXUzg4TVQiLAorCQkubW9kZWwgPSAiZXdzODhtdCIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9ld3NfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gc25kX2ljZTE3MTJfZXdzX2FkZF9jb250cm9scywKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVRfTkVXLAorCQkubmFtZSA9ICJUZXJyYVRlYyBFV1M4OE1UIiwKKwkJLm1vZGVsID0gImV3czg4bXRfbmV3IiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2V3c19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9ld3NfYWRkX2NvbnRyb2xzLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4OCwKKwkJLm5hbWUgPSAiVGVycmFUZWMgUGhhc2U4OCIsCisJCS5tb2RlbCA9ICJwaGFzZTg4IiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2V3c19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9ld3NfYWRkX2NvbnRyb2xzLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfRVdTODhELAorCQkubmFtZSA9ICJUZXJyYVRlYyBFV1M4OEQiLAorCQkubW9kZWwgPSAiZXdzODhkIiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2V3c19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9ld3NfYWRkX2NvbnRyb2xzLAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfRE1YNkZJUkUsCisJCS5uYW1lID0gIlRlcnJhVGVjIERNWDZGaXJlIiwKKwkJLm1vZGVsID0gImRteDZmaXJlIiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2V3c19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBzbmRfaWNlMTcxMl9ld3NfYWRkX2NvbnRyb2xzLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmEwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaApAQCAtMCwwICsxLDg0IEBACisjaWZuZGVmIF9fU09VTkRfRVdTX0gKKyNkZWZpbmUgX19TT1VORF9FV1NfSAorCisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIFRlcnJhdGVjIEVXUzg4TVQvRCwgRVdYMjQvOTYsIERNWCA2RmlyZQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjZGVmaW5lIEVXU19ERVZJQ0VfREVTQyBcCisJCSJ7VGVycmFUZWMsRVdYIDI0Lzk2fSwiXAorCQkie1RlcnJhVGVjLEVXUyA4OE1UfSwiXAorCQkie1RlcnJhVGVjLEVXUyA4OER9LCJcCisJCSJ7VGVycmFUZWMsRE1YIDZGaXJlfSwiXAorCQkie1RlcnJhVGVjLFBoYXNlIDg4fSwiCisKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfRVdYMjQ5NgkweDNiMTUzMDExCisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4TVQJMHgzYjE1MTUxMQorI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9FV1M4OE1UX05FVwkweDNiMTUyNTExCisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX0VXUzg4RAkweDNiMTUyYjExCisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX0RNWDZGSVJFCTB4M2IxNTM4MTEKKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4OAkweDNiMTU1MTExCisKKy8qIGVudHJ5IHBvaW50ICovCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ld3NfY2FyZHNbXTsKKworCisvKiBUZXJyYVRlYyBFV1ggMjQvOTYgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIElDRTE3MTJfRVdYMjQ5Nl9BSzQ1MjRfQ1MJMHgwMQkvKiBBSzQ1MjQgY2hpcCBzZWxlY3Q7IGxvdyA9IGFjdGl2ZSAqLworI2RlZmluZSBJQ0UxNzEyX0VXWDI0OTZfQUlOX1NFTAkJMHgwMgkvKiBpbnB1dCBzZW5zaXRpdml0eSBzd2l0Y2g7IGhpZ2ggPSBsb3VkZXIgKi8KKyNkZWZpbmUgSUNFMTcxMl9FV1gyNDk2X0FPVVRfU0VMCTB4MDQJLyogb3V0cHV0IHNlbnNpdGl2aXR5IHN3aXRjaDsgaGlnaCA9IGxvdWRlciAqLworI2RlZmluZSBJQ0UxNzEyX0VXWDI0OTZfUlcJCTB4MDgJLyogcmVhZC93cml0ZSBzd2l0Y2ggZm9yIGkyYzsgaGlnaCA9IHdyaXRlICAqLworI2RlZmluZSBJQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0RBVEEJMHgxMAkvKiBpMmMgJiBhazQ1MjQgZGF0YSAqLworI2RlZmluZSBJQ0UxNzEyX0VXWDI0OTZfU0VSSUFMX0NMT0NLCTB4MjAJLyogaTJjICYgYWs0NTI0IGNsb2NrICovCisjZGVmaW5lIElDRTE3MTJfRVdYMjQ5Nl9UWDIJCTB4NDAJLyogTUlESTIgKG5vdCB1c2VkKSAqLworI2RlZmluZSBJQ0UxNzEyX0VXWDI0OTZfUlgyCQkweDgwCS8qIE1JREkyIChub3QgdXNlZCkgKi8KKworLyogVGVycmFUZWMgRVdTIDg4TVQvRCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zICovCisvKiBSVywgU0RBIHNuZCBTQ0xLIGFyZSBpZGVudGljYWwgd2l0aCBFV1gyNC85NiAqLworI2RlZmluZSBJQ0UxNzEyX0VXUzg4X0NTODQxNF9SQVRFCTB4MDcJLyogQ1M4NDE0IHNhbXBsZSByYXRlOiBncGlvIDAtMiAqLworI2RlZmluZSBJQ0UxNzEyX0VXUzg4X1JXCQkweDA4CS8qIHJlYWQvd3JpdGUgc3dpdGNoIGZvciBpMmM7IGhpZ2ggPSB3cml0ZSAgKi8KKyNkZWZpbmUgSUNFMTcxMl9FV1M4OF9TRVJJQUxfREFUQQkweDEwCS8qIGkyYyAmIGFrNDUyNCBkYXRhICovCisjZGVmaW5lIElDRTE3MTJfRVdTODhfU0VSSUFMX0NMT0NLCTB4MjAJLyogaTJjICYgYWs0NTI0IGNsb2NrICovCisjZGVmaW5lIElDRTE3MTJfRVdTODhfVFgyCQkweDQwCS8qIE1JREkyIChvbmx5IG9uIDg4RCkgKi8KKyNkZWZpbmUgSUNFMTcxMl9FV1M4OF9SWDIJCTB4ODAJLyogTUlESTIgKG9ubHkgb24gODhEKSAqLworCisvKiBpMmMgYWRkcmVzcyAqLworI2RlZmluZSBJQ0UxNzEyX0VXUzg4TVRfQ1M4NDA0X0FERFIJKDB4NDA+PjEpCisjZGVmaW5lIElDRTE3MTJfRVdTODhNVF9JTlBVVF9BRERSCSgweDQ2Pj4xKQorI2RlZmluZSBJQ0UxNzEyX0VXUzg4TVRfT1VUUFVUX0FERFIJKDB4NDg+PjEpCisjZGVmaW5lIElDRTE3MTJfRVdTODhNVF9PVVRQVVRfU0VOU0UJMHg0MAkvKiBtYXNrICovCisjZGVmaW5lIElDRTE3MTJfRVdTODhEX1BDRl9BRERSCQkoMHg0MD4+MSkKKworLyogVGVycmFUZWMgRE1YIDZGaXJlIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSUNFMTcxMl82RklSRV9BSzQ1MjRfQ1NfTUFTSwkweDA3CS8qIEFLNDUyNCBjaGlwIHNlbGVjdCAjMS0jMyAqLworI2RlZmluZSBJQ0UxNzEyXzZGSVJFX1JXCQkweDA4CS8qIHJlYWQvd3JpdGUgc3dpdGNoIGZvciBpMmM7IGhpZ2ggPSB3cml0ZSAgKi8KKyNkZWZpbmUgSUNFMTcxMl82RklSRV9TRVJJQUxfREFUQQkweDEwCS8qIGkyYyAmIGFrNDUyNCBkYXRhICovCisjZGVmaW5lIElDRTE3MTJfNkZJUkVfU0VSSUFMX0NMT0NLCTB4MjAJLyogaTJjICYgYWs0NTI0IGNsb2NrICovCisjZGVmaW5lIElDRTE3MTJfNkZJUkVfVFgyCQkweDQwCS8qIE1JREkyICovCisjZGVmaW5lIElDRTE3MTJfNkZJUkVfUlgyCQkweDgwCS8qIE1JREkyICovCisKKyNkZWZpbmUgSUNFMTcxMl82RklSRV9QQ0Y5NTU0X0FERFIJKDB4NDA+PjEpCisjZGVmaW5lIElDRTE3MTJfNkZJUkVfQ1M4NDI3X0FERFIJKDB4MjIpCisKKyNlbmRpZiAvKiBfX1NPVU5EX0VXU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVmYmQwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgSUNFMTcxMiAoRW52eTI0KQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBIb29udGVjaCBTVERTUDI0CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImhvb250ZWNoLmgiCisKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgY2hhciBieXRlKQoreworCWJ5dGUgfD0gSUNFMTcxMl9TVERTUDI0X0NMT0NLX0JJVDsKKwl1ZGVsYXkoMTAwKTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIGJ5dGUpOworCWJ5dGUgJj0gfklDRTE3MTJfU1REU1AyNF9DTE9DS19CSVQ7CisJdWRlbGF5KDEwMCk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCBieXRlKTsKKwlieXRlIHw9IElDRTE3MTJfU1REU1AyNF9DTE9DS19CSVQ7CisJdWRlbGF5KDEwMCk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCBieXRlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3N0ZHNwMjRfZGFyZWFyKGljZTE3MTJfdCAqaWNlLCBpbnQgYWN0aXZhdGUpCit7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlJQ0UxNzEyX1NURFNQMjRfMF9EQVJFQVIoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIGFjdGl2YXRlKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1swXSk7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9zdGRzcDI0X211dGUoaWNlMTcxMl90ICppY2UsIGludCBhY3RpdmF0ZSkKK3sKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCUlDRTE3MTJfU1REU1AyNF8zX01VVEUoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIGFjdGl2YXRlKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1szXSk7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9zdGRzcDI0X2luc2VsKGljZTE3MTJfdCAqaWNlLCBpbnQgYWN0aXZhdGUpCit7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlJQ0UxNzEyX1NURFNQMjRfM19JTlNFTChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgYWN0aXZhdGUpOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzNdKTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3N0ZHNwMjRfYm94X2NoYW5uZWwoaWNlMTcxMl90ICppY2UsIGludCBib3gsIGludCBjaG4sIGludCBhY3RpdmF0ZSkKK3sKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCisJLyogc2VsZWN0IGJveCAqLworCUlDRTE3MTJfU1REU1AyNF8wX0JPWChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgYm94KTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1swXSk7CisKKwkvKiBwcmVwYXJlIGZvciB3cml0ZSAqLworCWlmIChjaG4gPT0gMykKKwkJSUNFMTcxMl9TVERTUDI0XzJfQ0hONChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMCk7CisJSUNFMTcxMl9TVERTUDI0XzJfTUlESTEoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIGFjdGl2YXRlKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1syXSk7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9ncGlvX3dyaXRlKGljZSwgaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbM10pOworCisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMShpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMihpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMyhpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzJfQ0hONChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9ncGlvX3dyaXRlKGljZSwgaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbMV0pOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzJdKTsKKwl1ZGVsYXkoMTAwKTsKKwlpZiAoY2huID09IDMpIHsKKwkJSUNFMTcxMl9TVERTUDI0XzJfQ0hONChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMCk7CisJCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzJdKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNobikgeworCQljYXNlIDA6CUlDRTE3MTJfU1REU1AyNF8xX0NITjEoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDApOyBicmVhazsKKwkJY2FzZSAxOglJQ0UxNzEyX1NURFNQMjRfMV9DSE4yKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAwKTsgYnJlYWs7CisJCWNhc2UgMjoJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMyhpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMCk7IGJyZWFrOworCQl9CisJCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzFdKTsKKwl9CisJdWRlbGF5KDEwMCk7CisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMShpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMihpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzFfQ0hOMyhpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzJfQ0hONChpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9ncGlvX3dyaXRlKGljZSwgaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbMV0pOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzJdKTsKKwl1ZGVsYXkoMTAwKTsKKworCUlDRTE3MTJfU1REU1AyNF8yX01JREkxKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAwKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1syXSk7CisKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3N0ZHNwMjRfYm94X21pZGkoaWNlMTcxMl90ICppY2UsIGludCBib3gsIGludCBtYXN0ZXIpCit7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKworCS8qIHNlbGVjdCBib3ggKi8KKwlJQ0UxNzEyX1NURFNQMjRfMF9CT1goaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIGJveCk7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9ncGlvX3dyaXRlKGljZSwgaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbMF0pOworCisJSUNFMTcxMl9TVERTUDI0XzJfTUlESUlOKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAxKTsKKwlJQ0UxNzEyX1NURFNQMjRfMl9NSURJMShpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgbWFzdGVyKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1syXSk7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9ncGlvX3dyaXRlKGljZSwgaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbM10pOworCisJdWRlbGF5KDEwMCk7CisJCisJSUNFMTcxMl9TVERTUDI0XzJfTUlESUlOKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAwKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1syXSk7CisJCisJbWRlbGF5KDEwKTsKKwkKKwlJQ0UxNzEyX1NURFNQMjRfMl9NSURJSU4oaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEpOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfZ3Bpb193cml0ZShpY2UsIGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzJdKTsKKworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2ljZTE3MTJfc3Rkc3AyNF9taWRpMihpY2UxNzEyX3QgKmljZSwgaW50IGFjdGl2YXRlKQoreworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJSUNFMTcxMl9TVERTUDI0XzNfTUlESTIoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIGFjdGl2YXRlKTsKKwlzbmRfaWNlMTcxMl9zdGRzcDI0X2dwaW9fd3JpdGUoaWNlLCBpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1szXSk7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2hvb250ZWNoX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJaW50IGJveCwgY2huOworCisJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CisJaWNlLT5udW1fdG90YWxfYWRjcyA9IDg7CisKKwlpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1swXSA9IAorCWljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzWzFdID0gCisJaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHNbMl0gPSAKKwlpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0c1szXSA9IDA7CS8qIHNob3VsZCBiZSBhbHJlYWR5ICovCisKKwlJQ0UxNzEyX1NURFNQMjRfU0VUX0FERFIoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDApOworCUlDRTE3MTJfU1REU1AyNF9DTE9DSyhpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMCwgMSk7CisJSUNFMTcxMl9TVERTUDI0XzBfQk9YKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAwKTsKKwlJQ0UxNzEyX1NURFNQMjRfMF9EQVJFQVIoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDApOworCisJSUNFMTcxMl9TVERTUDI0X1NFVF9BRERSKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAxKTsKKwlJQ0UxNzEyX1NURFNQMjRfQ0xPQ0soaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEsIDEpOworCUlDRTE3MTJfU1REU1AyNF8xX0NITjEoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEpOworCUlDRTE3MTJfU1REU1AyNF8xX0NITjIoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEpOworCUlDRTE3MTJfU1REU1AyNF8xX0NITjMoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEpOworCQorCUlDRTE3MTJfU1REU1AyNF9TRVRfQUREUihpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMik7CisJSUNFMTcxMl9TVERTUDI0X0NMT0NLKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAyLCAxKTsKKwlJQ0UxNzEyX1NURFNQMjRfMl9DSE40KGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAxKTsKKwlJQ0UxNzEyX1NURFNQMjRfMl9NSURJSU4oaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDEpOworCUlDRTE3MTJfU1REU1AyNF8yX01JREkxKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAwKTsKKworCUlDRTE3MTJfU1REU1AyNF9TRVRfQUREUihpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMyk7CisJSUNFMTcxMl9TVERTUDI0X0NMT0NLKGljZS0+c3BlYy5ob29udGVjaC5ib3hiaXRzLCAzLCAxKTsKKwlJQ0UxNzEyX1NURFNQMjRfM19NSURJMihpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMCk7CisJSUNFMTcxMl9TVERTUDI0XzNfTVVURShpY2UtPnNwZWMuaG9vbnRlY2guYm94Yml0cywgMSk7CisJSUNFMTcxMl9TVERTUDI0XzNfSU5TRUwoaWNlLT5zcGVjLmhvb250ZWNoLmJveGJpdHMsIDApOworCisJLyogbGV0J3MgZ28gLSBhY3RpdmF0ZSBvbmx5IGZ1bmN0aW9ucyBpbiBmaXJzdCBib3ggKi8KKwlpY2UtPnNwZWMuaG9vbnRlY2guY29uZmlnID0gMDsKKwkJCSAgICAvKiBJQ0UxNzEyX1NURFNQMjRfTVVURSB8CisJCQkgICAgICAgSUNFMTcxMl9TVERTUDI0X0lOU0VMIHwKKwkJCSAgICAgICBJQ0UxNzEyX1NURFNQMjRfREFSRUFSOyAqLworCWljZS0+c3BlYy5ob29udGVjaC5ib3hjb25maWdbMF0gPSBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjEgfAorCQkJCSAgICAgSUNFMTcxMl9TVERTUDI0X0JPWF9DSE4yIHwKKwkJCQkgICAgIElDRTE3MTJfU1REU1AyNF9CT1hfQ0hOMyB8CisJCQkJICAgICBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjQgfAorCQkJCSAgICAgSUNFMTcxMl9TVERTUDI0X0JPWF9NSURJMSB8CisJCQkJICAgICBJQ0UxNzEyX1NURFNQMjRfQk9YX01JREkyOworCWljZS0+c3BlYy5ob29udGVjaC5ib3hjb25maWdbMV0gPSAKKwlpY2UtPnNwZWMuaG9vbnRlY2guYm94Y29uZmlnWzJdID0gCisJaWNlLT5zcGVjLmhvb250ZWNoLmJveGNvbmZpZ1szXSA9IDA7CisJc25kX2ljZTE3MTJfc3Rkc3AyNF9kYXJlYXIoaWNlLCAoaWNlLT5zcGVjLmhvb250ZWNoLmNvbmZpZyAmIElDRTE3MTJfU1REU1AyNF9EQVJFQVIpID8gMSA6IDApOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfbXV0ZShpY2UsIChpY2UtPnNwZWMuaG9vbnRlY2guY29uZmlnICYgSUNFMTcxMl9TVERTUDI0X01VVEUpID8gMSA6IDApOworCXNuZF9pY2UxNzEyX3N0ZHNwMjRfaW5zZWwoaWNlLCAoaWNlLT5zcGVjLmhvb250ZWNoLmNvbmZpZyAmIElDRTE3MTJfU1REU1AyNF9JTlNFTCkgPyAxIDogMCk7CisJZm9yIChib3ggPSAwOyBib3ggPCA0OyBib3grKykgeworCQlmb3IgKGNobiA9IDA7IGNobiA8IDQ7IGNobisrKQorCQkJc25kX2ljZTE3MTJfc3Rkc3AyNF9ib3hfY2hhbm5lbChpY2UsIGJveCwgY2huLCAoaWNlLT5zcGVjLmhvb250ZWNoLmJveGNvbmZpZ1tib3hdICYgKDEgPDwgY2huKSkgPyAxIDogMCk7CisJCXNuZF9pY2UxNzEyX3N0ZHNwMjRfYm94X21pZGkoaWNlLCBib3gsCisJCQkJKGljZS0+c3BlYy5ob29udGVjaC5ib3hjb25maWdbYm94XSAmIElDRTE3MTJfU1REU1AyNF9CT1hfTUlESTEpID8gMSA6IDApOworCQlpZiAoaWNlLT5zcGVjLmhvb250ZWNoLmJveGNvbmZpZ1tib3hdICYgSUNFMTcxMl9TVERTUDI0X0JPWF9NSURJMikKKwkJCXNuZF9pY2UxNzEyX3N0ZHNwMjRfbWlkaTIoaWNlLCAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFLNDUyNCBhY2Nlc3MKKyAqLworCisvKiBzdGFydCBjYWxsYmFjayBmb3IgU1REU1AyNCB3aXRoIG1vZGlmaWVkIGhhcmR3YXJlICovCitzdGF0aWMgdm9pZCBzdGRzcDI0X2FrNDUyNF9sb2NrKGFrbTR4eHhfdCAqYWssIGludCBjaGlwKQoreworCWljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdG1wID0JSUNFMTcxMl9TVERTUDI0X1NFUklBTF9EQVRBIHwKKwkJSUNFMTcxMl9TVERTUDI0X1NFUklBTF9DTE9DSyB8CisJCUlDRTE3MTJfU1REU1AyNF9BSzQ1MjRfQ1M7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sCisJCQkgIGljZS0+Z3Bpby5kaXJlY3Rpb24gfCB0bXApOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSywgfnRtcCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3ZhbHVlX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJLyogSG9vbnRlY2ggU1REU1AyNCB3aXRoIG1vZGlmaWVkIGhhcmR3YXJlICovCisJc3RhdGljIGFrbTR4eHhfdCBha21fc3Rkc3AyNF9tdiBfX2RldmluaXRkYXRhID0geworCQkubnVtX2FkY3MgPSAyLAorCQkubnVtX2RhY3MgPSAyLAorCQkudHlwZSA9IFNORF9BSzQ1MjQsCisJCS5vcHMgPSB7CisJCQkubG9jayA9IHN0ZHNwMjRfYWs0NTI0X2xvY2sKKwkJfQorCX07CisKKwlzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fc3Rkc3AyNF9tdl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CisJCS5jYWRkciA9IDIsCisJCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLworCQkuZGF0YV9tYXNrID0gSUNFMTcxMl9TVERTUDI0X1NFUklBTF9EQVRBLAorCQkuY2xrX21hc2sgPSBJQ0UxNzEyX1NURFNQMjRfU0VSSUFMX0NMT0NLLAorCQkuY3NfbWFzayA9IElDRTE3MTJfU1REU1AyNF9BSzQ1MjRfQ1MsCisJCS5jc19hZGRyID0gSUNFMTcxMl9TVERTUDI0X0FLNDUyNF9DUywKKwkJLmNzX25vbmUgPSAwLAorCQkuYWRkX2ZsYWdzID0gMCwKKwl9OworCisJaW50IGVycjsKKwlha200eHh4X3QgKmFrOworCisJLyogc2V0IHRoZSBhbmFsb2cgREFDcyAqLworCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOworCisJLyogc2V0IHRoZSBhbmFsb2cgQURDcyAqLworCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOworCQorCS8qIGFuYWxvZyBzZWN0aW9uICovCisJYWsgPSBpY2UtPmFrbSA9IGttYWxsb2Moc2l6ZW9mKGFrbTR4eHhfdCksIEdGUF9LRVJORUwpOworCWlmICghIGFrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpY2UtPmFrbV9jb2RlY3MgPSAxOworCisJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX3N0ZHNwMjRfbXYsICZha21fc3Rkc3AyNF9tdl9wcml2LCBpY2UpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogYWs0NTI0IGNvbnRyb2xzICovCisJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2V6OF9pbml0KGljZTE3MTJfdCAqaWNlKQoreworCWljZS0+Z3Bpby53cml0ZV9tYXNrID0gaWNlLT5lZXByb20uZ3Bpb21hc2s7CisJaWNlLT5ncGlvLmRpcmVjdGlvbiA9IGljZS0+ZWVwcm9tLmdwaW9kaXI7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19XUklURV9NQVNLLCBpY2UtPmVlcHJvbS5ncGlvbWFzayk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sIGljZS0+ZWVwcm9tLmdwaW9kaXIpOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSwgaWNlLT5lZXByb20uZ3Bpb3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBlbnRyeSBwb2ludCAqLworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfU1REU1AyNCwKKwkJLm5hbWUgPSAiSG9vbnRlY2ggU291bmRUcmFjayBBdWRpbyBEU1AyNCIsCisJCS5tb2RlbCA9ICJkc3AyNCIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9ob29udGVjaF9pbml0LAorCX0sCisJeworCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfU1REU1AyNF9WQUxVRSwJLyogYSBkdW1teSBpZCAqLworCQkubmFtZSA9ICJIb29udGVjaCBTb3VuZFRyYWNrIEF1ZGlvIERTUDI0IFZhbHVlIiwKKwkJLm1vZGVsID0gImRzcDI0X3ZhbHVlIiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX3ZhbHVlX2luaXQsCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9TVERTUDI0X01FRElBN18xLAorCQkubmFtZSA9ICJIb29udGVjaCBTVEEgRFNQMjQgTWVkaWEgNy4xIiwKKwkJLm1vZGVsID0gImRzcDI0XzcxIiwKKwkJLmNoaXBfaW5pdCA9IHNuZF9pY2UxNzEyX2hvb250ZWNoX2luaXQsCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9FVkVOVF9FWjgsCS8qIGEgZHVtbXkgaWQgKi8KKwkJLm5hbWUgPSAiRXZlbnQgRWxlY3Ryb25pY3MgRVo4IiwKKwkJLm1vZGVsID0gImV6OCIsCisJCS5jaGlwX2luaXQgPSBzbmRfaWNlMTcxMl9lejhfaW5pdCwKKwl9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5oIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU1MzhiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9fU09VTkRfSE9PTlRFQ0hfSAorI2RlZmluZSBfX1NPVU5EX0hPT05URUNIX0gKKworLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgSUNFMTcxMiAoRW52eTI0KQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBIb29udGVjaCBTVERTUDI0CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNkZWZpbmUgIEhPT05URUNIX0RFVklDRV9ERVNDIFwKKwkie0hvb250ZWNoLFNvdW5kVHJhY2sgRFNQIDI0fSwiIFwKKwkie0hvb250ZWNoLFNvdW5kVHJhY2sgRFNQIDI0IFZhbHVlfSwiIFwKKwkie0hvb250ZWNoLFNvdW5kVHJhY2sgRFNQIDI0IE1lZGlhIDcuMX0sIiBcCisJIntFdmVudCBFbGVjdHJvbmljcyxFWjh9LCIKKworI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9TVERTUDI0CQkweDEyMTQxMjE3CS8qIEhvb250ZWNoIFNvdW5kVHJhY2sgQXVkaW8gRFNQIDI0ICovCisjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX1NURFNQMjRfVkFMVUUJCTB4MDAwMTAwMTAJLyogQSBkdW1teSBpZCBmb3IgSG9vbnRlY2ggU291bmRUcmFjayBBdWRpbyBEU1AgMjQgVmFsdWUgKi8KKyNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfU1REU1AyNF9NRURJQTdfMQkweDE2MTQxMjE3CS8qIEhvb250ZWNoIFNUIEF1ZGlvIERTUDI0IE1lZGlhIDcuMSAqLworI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9FVkVOVF9FWjgJCTB4MDAwMTAwMDEJLyogQSBkdW1teSBpZCBmb3IgRVo4ICovCisKK2V4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzW107CisKKworLyogSG9vbnRlY2ggU291bmRUcmFjayBBdWRpbyBEU1AgMjQgR1BJTyBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF8wX0JPWChyLCB4KQlyWzBdID0gKChyWzBdICYgfjMpIHwgKCh4KSYzKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0XzBfREFSRUFSKHIsIHgpCXJbMF0gPSAoKHJbMF0gJiB+NCkgfCAoKCh4KSYxKTw8MikpCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF8xX0NITjEociwgeCkJclsxXSA9ICgoclsxXSAmIH4xKSB8ICgoeCkmMSkpCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF8xX0NITjIociwgeCkJclsxXSA9ICgoclsxXSAmIH4yKSB8ICgoKHgpJjEpPDwxKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0XzFfQ0hOMyhyLCB4KQlyWzFdID0gKChyWzFdICYgfjQpIHwgKCgoeCkmMSk8PDIpKQorI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfMl9DSE40KHIsIHgpCXJbMl0gPSAoKHJbMl0gJiB+MSkgfCAoKHgpJjEpKQorI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfMl9NSURJSU4ociwgeCkJclsyXSA9ICgoclsyXSAmIH4yKSB8ICgoKHgpJjEpPDwxKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0XzJfTUlESTEociwgeCkJclsyXSA9ICgoclsyXSAmIH40KSB8ICgoKHgpJjEpPDwyKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0XzNfTUlESTIociwgeCkJclszXSA9ICgoclszXSAmIH4xKSB8ICgoeCkmMSkpCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF8zX01VVEUociwgeCkJclszXSA9ICgoclszXSAmIH4yKSB8ICgoKHgpJjEpPDwxKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0XzNfSU5TRUwociwgeCkJclszXSA9ICgoclszXSAmIH40KSB8ICgoKHgpJjEpPDwyKSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0X1NFVF9BRERSKHIsIGEpCXJbYSYzXSA9ICgoclthJjNdICYgfjB4MTgpIHwgKCgoYSkmMyk8PDMpKQorI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQ0xPQ0sociwgYSwgYykJclthJjNdID0gKChyW2EmM10gJiB+MHgyMCkgfCAoKChjKSYxKTw8NSkpCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF9DTE9DS19CSVQJKDE8PDUpCisKKy8qIEhvb250ZWNoIFNvdW5kVHJhY2sgQXVkaW8gRFNQIDI0IGJveCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0X0RBUkVBUgkJKDE8PDApCisjZGVmaW5lIElDRTE3MTJfU1REU1AyNF9NVVRFCQkoMTw8MSkKKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0X0lOU0VMCQkoMTw8MikKKworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjEJKDE8PDApCS8qIGlucHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjIJKDE8PDEpCS8qIGlucHV0IGNoYW5uZWwgMiAqLworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjMJKDE8PDIpCS8qIGlucHV0IGNoYW5uZWwgMyAqLworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX0NITjQJKDE8PDMpCS8qIGlucHV0IGNoYW5uZWwgNCAqLworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX01JREkxCSgxPDw4KQorI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQk9YX01JREkyCSgxPDw5KQorCisvKiBIb29udGVjaCBTb3VuZFRyYWNrIEF1ZGlvIERTUCAyNCBWYWx1ZSBkZWZpbml0aW9ucyBmb3IgbW9kaWZpZWQgaGFyZHdhcmUgKi8KKworI2RlZmluZSBJQ0UxNzEyX1NURFNQMjRfQUs0NTI0X0NTCTB4MDMJLyogQUs0NTI0IGNoaXAgc2VsZWN0OyBsb3cgPSBhY3RpdmUgKi8KKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0X1NFUklBTF9EQVRBCTB4MGMJLyogYWs0NTI0IGRhdGEgKi8KKyNkZWZpbmUgSUNFMTcxMl9TVERTUDI0X1NFUklBTF9DTE9DSwkweDMwCS8qIGFrNDUyNCBjbG9jayAqLworCisjZW5kaWYgLyogX19TT1VORF9IT09OVEVDSF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmYmE2YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtMCwwICsxLDI3NjAgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworLyoKKyAgTk9URVM6CisgIC0gc3BkaWYgbm9uYXVkaW8gY29uc3VtZXIgbW9kZSBkb2VzIG5vdCB3b3JrIChhdCBsZWFzdCB3aXRoIG15CisgICAgU29ueSBTVFItREI4MzApCisqLworCisvKgorICogQ2hhbmdlczoKKyAqCisgKiAgMjAwMi4wOS4wOQlUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKglzcGxpdCB0aGUgY29kZSB0byBzZXZlcmFsIGZpbGVzLiAgZWFjaCBsb3ctbGV2ZWwgcm91dGluZQorICoJaXMgc3RvcmVkIGluIHRoZSBsb2NhbCBmaWxlIGFuZCBjYWxsZWQgZnJvbSByZWdpc3RyYXRpb24KKyAqCWZ1bmN0aW9uIGZyb20gY2FyZF9pbmZvIHN0cnVjdC4KKyAqCisgKiAgMjAwMi4xMS4yNglKYW1lcyBTdGFmZm9yZCA8anN0YWZmb3JkQGFtcGx0ZC5jb20+CisgKglBZGRlZCBzdXBwb3J0IGZvciBWVDE3MjQgKEVudnkyNEhUKQorICoJSSBoYXZlIGxlZnQgb3V0IHN1cHBvcnQgZm9yIDE3Ni40IGFuZCAxOTIgS0h6IGZvciB0aGUgbW9tZW50LiAKKyAqICBJIGFsc28gaGF2ZW4ndCBkb25lIGFueXRoaW5nIHdpdGggdGhlIGludGVybmFsIFMvUERJRiB0cmFuc21pdHRlciBvciB0aGUgTVBVLTQwMQorICoKKyAqICAyMDAzLjAyLjIwICBUYWtzYWhpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKglTcGxpdCB2dDE3MjQgcGFydCB0byBhbiBpbmRlcGVuZGVudCBkcml2ZXIuCisgKglUaGUgR1BJTyBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgbm93LgorICoKKyAqIDIwMDQuMDMuMzEgRG91ZyBNY0xhaW4gPG5vc3RhckBjb21jYXN0Lm5ldD4KKyAqICAgIEFkZGVkIHN1cHBvcnQgZm9yIEV2ZW50IEVsZWN0cm9uaWNzIEVaOCBjYXJkIHRvIGhvb250ZWNoLmMuCisgKi8KKworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NzODQyNy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorCisvKiBsb3dsZXZlbCByb3V0aW5lcyAqLworI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAiZXdzLmgiCisjaW5jbHVkZSAiaG9vbnRlY2guaCIKKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQ0Vuc2VtYmxlIElDRTE3MTIgKEVudnkyNCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7IgorCSAgICAgICBIT09OVEVDSF9ERVZJQ0VfREVTQworCSAgICAgICBERUxUQV9ERVZJQ0VfREVTQworCSAgICAgICBFV1NfREVWSUNFX0RFU0MKKwkgICAgICAgIntJQ0Vuc2VtYmxlLEdlbmVyaWMgSUNFMTcxMn0sIgorCSAgICAgICAie0lDRW5zZW1ibGUsR2VuZXJpYyBFbnZ5MjR9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CQkvKiBFbmFibGUgdGhpcyBjYXJkICovCitzdGF0aWMgY2hhciAqbW9kZWxbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBvbW5pW1NORFJWX0NBUkRTXTsJLyogRGVsdGE0NCAmIDY2IE9tbmkgSS9PIHN1cHBvcnQgKi8KK3N0YXRpYyBpbnQgY3M4NDI3X3RpbWVvdXRbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gNTAwfTsgLyogQ1M4NDI3IFMvUERJRiB0cmFuc2NpZXZlciByZXNldCB0aW1lb3V0IHZhbHVlIGluIG1zZWMgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBJQ0UxNzEyIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgSUNFMTcxMiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIElDRTE3MTIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KG9tbmksIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhvbW5pLCAiRW5hYmxlIE1pZGltYW4gTS1BdWRpbyBEZWx0YSBPbW5pIEkvTyBzdXBwb3J0LiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGNzODQyN190aW1lb3V0LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjczg0MjdfdGltZW91dCwgIkRlZmluZSByZXNldCB0aW1lb3V0IGZvciBjczg0MjcgY2hpcCBpbiBtc2VjIHJlc29sdXRpb24uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobW9kZWwsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZWwsICJVc2UgdGhlIGdpdmVuIGJvYXJkIG1vZGVsLiIpOworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfSUNFCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSUNFCQkweDE0MTIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lDRV8xNzEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUNFXzE3MTIJCTB4MTcxMgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfaWNlMTcxMl9pZHNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSUNFLCBQQ0lfREVWSUNFX0lEX0lDRV8xNzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sICAgLyogSUNFMTcxMiAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9pY2UxNzEyX2lkcyk7CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfYnVpbGRfcHJvX21peGVyKGljZTE3MTJfdCAqaWNlKTsKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfYnVpbGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpOworCitzdGF0aWMgaW50IFBST19SQVRFX0xPQ0tFRDsKK3N0YXRpYyBpbnQgUFJPX1JBVEVfUkVTRVQgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBQUk9fUkFURV9ERUZBVUxUID0gNDQxMDA7CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKyAKKy8qIGNoZWNrIHdoZXRoZXIgdGhlIGNsb2NrIG1vZGUgaXMgc3BkaWYtaW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NwZGlmX21hc3RlcihpY2UxNzEyX3QgKmljZSkKK3sKKwlyZXR1cm4gKGluYihJQ0VNVChpY2UsIFJBVEUpKSAmIElDRTE3MTJfU1BESUZfTUFTVEVSKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19wcm9fcmF0ZV9sb2NrZWQoaWNlMTcxMl90ICppY2UpCit7CisJcmV0dXJuIGlzX3NwZGlmX21hc3RlcihpY2UpIHx8IFBST19SQVRFX0xPQ0tFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9pY2UxNzEyX2RzX3dyaXRlKGljZTE3MTJfdCAqIGljZSwgdTggY2hhbm5lbCwgdTggYWRkciwgdTMyIGRhdGEpCit7CisJb3V0YigoY2hhbm5lbCA8PCA0KSB8IGFkZHIsIElDRURTKGljZSwgSU5ERVgpKTsKKwlvdXRsKGRhdGEsIElDRURTKGljZSwgREFUQSkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzbmRfaWNlMTcxMl9kc19yZWFkKGljZTE3MTJfdCAqIGljZSwgdTggY2hhbm5lbCwgdTggYWRkcikKK3sKKwlvdXRiKChjaGFubmVsIDw8IDQpIHwgYWRkciwgSUNFRFMoaWNlLCBJTkRFWCkpOworCXJldHVybiBpbmwoSUNFRFMoaWNlLCBEQVRBKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX2FjOTdfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaWNlMTcxMl90ICppY2UgPSAoaWNlMTcxMl90ICopYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCB0bTsKKwl1bnNpZ25lZCBjaGFyIG9sZF9jbWQgPSAwOworCisJZm9yICh0bSA9IDA7IHRtIDwgMHgxMDAwMDsgdG0rKykgeworCQlvbGRfY21kID0gaW5iKElDRVJFRyhpY2UsIEFDOTdfQ01EKSk7CisJCWlmIChvbGRfY21kICYgKElDRTE3MTJfQUM5N19XUklURSB8IElDRTE3MTJfQUM5N19SRUFEKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShvbGRfY21kICYgSUNFMTcxMl9BQzk3X1JFQURZKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJb3V0YihyZWcsIElDRVJFRyhpY2UsIEFDOTdfSU5ERVgpKTsKKwlvdXR3KHZhbCwgSUNFUkVHKGljZSwgQUM5N19EQVRBKSk7CisJb2xkX2NtZCAmPSB+KElDRTE3MTJfQUM5N19QQktfVlNSIHwgSUNFMTcxMl9BQzk3X0NBUF9WU1IpOworCW91dGIob2xkX2NtZCB8IElDRTE3MTJfQUM5N19XUklURSwgSUNFUkVHKGljZSwgQUM5N19DTUQpKTsKKwlmb3IgKHRtID0gMDsgdG0gPCAweDEwMDAwOyB0bSsrKQorCQlpZiAoKGluYihJQ0VSRUcoaWNlLCBBQzk3X0NNRCkpICYgSUNFMTcxMl9BQzk3X1dSSVRFKSA9PSAwKQorCQkJYnJlYWs7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfaWNlMTcxMl9hYzk3X3JlYWQoYWM5N190ICphYzk3LAorCQkJCQkgICAgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWljZTE3MTJfdCAqaWNlID0gKGljZTE3MTJfdCAqKWFjOTctPnByaXZhdGVfZGF0YTsKKwlpbnQgdG07CisJdW5zaWduZWQgY2hhciBvbGRfY21kID0gMDsKKworCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspIHsKKwkJb2xkX2NtZCA9IGluYihJQ0VSRUcoaWNlLCBBQzk3X0NNRCkpOworCQlpZiAob2xkX2NtZCAmIChJQ0UxNzEyX0FDOTdfV1JJVEUgfCBJQ0UxNzEyX0FDOTdfUkVBRCkpCisJCQljb250aW51ZTsKKwkJaWYgKCEob2xkX2NtZCAmIElDRTE3MTJfQUM5N19SRUFEWSkpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCW91dGIocmVnLCBJQ0VSRUcoaWNlLCBBQzk3X0lOREVYKSk7CisJb3V0YihvbGRfY21kIHwgSUNFMTcxMl9BQzk3X1JFQUQsIElDRVJFRyhpY2UsIEFDOTdfQ01EKSk7CisJZm9yICh0bSA9IDA7IHRtIDwgMHgxMDAwMDsgdG0rKykKKwkJaWYgKChpbmIoSUNFUkVHKGljZSwgQUM5N19DTUQpKSAmIElDRTE3MTJfQUM5N19SRUFEKSA9PSAwKQorCQkJYnJlYWs7CisJaWYgKHRtID49IDB4MTAwMDApCQkvKiB0aW1lb3V0ICovCisJCXJldHVybiB+MDsKKwlyZXR1cm4gaW53KElDRVJFRyhpY2UsIEFDOTdfREFUQSkpOworfQorCisvKgorICogcHJvIGFjOTcgc2VjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3Byb19hYzk3X3dyaXRlKGFjOTdfdCAqYWM5NywKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaWNlMTcxMl90ICppY2UgPSAoaWNlMTcxMl90ICopYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCB0bTsKKwl1bnNpZ25lZCBjaGFyIG9sZF9jbWQgPSAwOworCisJZm9yICh0bSA9IDA7IHRtIDwgMHgxMDAwMDsgdG0rKykgeworCQlvbGRfY21kID0gaW5iKElDRU1UKGljZSwgQUM5N19DTUQpKTsKKwkJaWYgKG9sZF9jbWQgJiAoSUNFMTcxMl9BQzk3X1dSSVRFIHwgSUNFMTcxMl9BQzk3X1JFQUQpKQorCQkJY29udGludWU7CisJCWlmICghKG9sZF9jbWQgJiBJQ0UxNzEyX0FDOTdfUkVBRFkpKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlvdXRiKHJlZywgSUNFTVQoaWNlLCBBQzk3X0lOREVYKSk7CisJb3V0dyh2YWwsIElDRU1UKGljZSwgQUM5N19EQVRBKSk7CisJb2xkX2NtZCAmPSB+KElDRTE3MTJfQUM5N19QQktfVlNSIHwgSUNFMTcxMl9BQzk3X0NBUF9WU1IpOworCW91dGIob2xkX2NtZCB8IElDRTE3MTJfQUM5N19XUklURSwgSUNFTVQoaWNlLCBBQzk3X0NNRCkpOworCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspCisJCWlmICgoaW5iKElDRU1UKGljZSwgQUM5N19DTUQpKSAmIElDRTE3MTJfQUM5N19XUklURSkgPT0gMCkKKwkJCWJyZWFrOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfaWNlMTcxMl9wcm9fYWM5N19yZWFkKGFjOTdfdCAqYWM5NywKKwkJCQkJCXVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpY2UxNzEyX3QgKmljZSA9IChpY2UxNzEyX3QgKilhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IHRtOworCXVuc2lnbmVkIGNoYXIgb2xkX2NtZCA9IDA7CisKKwlmb3IgKHRtID0gMDsgdG0gPCAweDEwMDAwOyB0bSsrKSB7CisJCW9sZF9jbWQgPSBpbmIoSUNFTVQoaWNlLCBBQzk3X0NNRCkpOworCQlpZiAob2xkX2NtZCAmIChJQ0UxNzEyX0FDOTdfV1JJVEUgfCBJQ0UxNzEyX0FDOTdfUkVBRCkpCisJCQljb250aW51ZTsKKwkJaWYgKCEob2xkX2NtZCAmIElDRTE3MTJfQUM5N19SRUFEWSkpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCW91dGIocmVnLCBJQ0VNVChpY2UsIEFDOTdfSU5ERVgpKTsKKwlvdXRiKG9sZF9jbWQgfCBJQ0UxNzEyX0FDOTdfUkVBRCwgSUNFTVQoaWNlLCBBQzk3X0NNRCkpOworCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspCisJCWlmICgoaW5iKElDRU1UKGljZSwgQUM5N19DTUQpKSAmIElDRTE3MTJfQUM5N19SRUFEKSA9PSAwKQorCQkJYnJlYWs7CisJaWYgKHRtID49IDB4MTAwMDApCQkvKiB0aW1lb3V0ICovCisJCXJldHVybiB+MDsKKwlyZXR1cm4gaW53KElDRU1UKGljZSwgQUM5N19EQVRBKSk7Cit9CisKKy8qCisgKiBjb25zdW1lciBhYzk3IGRpZ2l0YWwgbWl4CisgKi8KK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZGlnbWl4X3JvdXRlX2FjOTdfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGluYihJQ0VNVChpY2UsIE1PTklUT1JfUk9VVEVDVFJMKSkgJiBJQ0UxNzEyX1JPVVRFX0FDOTcgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9kaWdtaXhfcm91dGVfYWM5N19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWwsIG52YWw7CisJCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJdmFsID0gaW5iKElDRU1UKGljZSwgTU9OSVRPUl9ST1VURUNUUkwpKTsKKwludmFsID0gdmFsICYgfklDRTE3MTJfUk9VVEVfQUM5NzsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIG52YWwgfD0gSUNFMTcxMl9ST1VURV9BQzk3OworCW91dGIobnZhbCwgSUNFTVQoaWNlLCBNT05JVE9SX1JPVVRFQ1RSTCkpOworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIHZhbCAhPSBudmFsOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX21peGVyX2RpZ21peF9yb3V0ZV9hYzk3IF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiRGlnaXRhbCBNaXhlciBUbyBBQzk3IiwKKwkuaW5mbyA9IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2dldCwKKwkucHV0ID0gc25kX2ljZTE3MTJfZGlnbWl4X3JvdXRlX2FjOTdfcHV0LAorfTsKKworCisvKgorICogZ3BpbyBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3NldF9ncGlvX2RpcihpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sIGRhdGEpOworCWluYihJQ0VSRUcoaWNlLCBEQVRBKSk7IC8qIGR1bW15IHJlYWQgZm9yIHBjaS1wb3N0aW5nICovCit9CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3NldF9ncGlvX21hc2soaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBkYXRhKQoreworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSywgZGF0YSk7CisJaW5iKElDRVJFRyhpY2UsIERBVEEpKTsgLyogZHVtbXkgcmVhZCBmb3IgcGNpLXBvc3RpbmcgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfaWNlMTcxMl9nZXRfZ3Bpb19kYXRhKGljZTE3MTJfdCAqaWNlKQoreworCXJldHVybiBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3NldF9ncGlvX2RhdGEoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCB2YWwpCit7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19EQVRBLCB2YWwpOworCWluYihJQ0VSRUcoaWNlLCBEQVRBKSk7IC8qIGR1bW15IHJlYWQgZm9yIHBjaS1wb3N0aW5nICovCit9CisKKworLyoKKyAqCisgKiBDUzg0MjcgaW50ZXJmYWNlCisgKgorICovCisKKy8qCisgKiBjaGFuZ2UgdGhlIGlucHV0IGNsb2NrIHNlbGVjdGlvbgorICogc3BkaWZfY2xvY2sgPSAxIC0gSUVDOTU4IGlucHV0LCAwIC0gRW52eTI0CisgKi8KK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfY3M4NDI3X3NldF9pbnB1dF9jbG9jayhpY2UxNzEyX3QgKmljZSwgaW50IHNwZGlmX2Nsb2NrKQoreworCXVuc2lnbmVkIGNoYXIgcmVnWzJdID0geyAweDgwIHwgNCwgMCB9OyAgIC8qIENTODQyNyBhdXRvIGluY3JlbWVudCB8IHJlZ2lzdGVyIG51bWJlciA0ICsgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgdmFsLCBudmFsOworCWludCByZXMgPSAwOworCQorCXNuZF9pMmNfbG9jayhpY2UtPmkyYyk7CisJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKGljZS0+Y3M4NDI3LCByZWcsIDEpICE9IDEpIHsKKwkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHNuZF9pMmNfcmVhZGJ5dGVzKGljZS0+Y3M4NDI3LCAmdmFsLCAxKSAhPSAxKSB7CisJCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW52YWwgPSB2YWwgJiAweGYwOworCWlmIChzcGRpZl9jbG9jaykKKwkJbnZhbCB8PSAweDAxOworCWVsc2UKKwkJbnZhbCB8PSAweDA0OworCWlmICh2YWwgIT0gbnZhbCkgeworCQlyZWdbMV0gPSBudmFsOworCQlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsIHJlZywgMikgIT0gMikgeworCQkJcmVzID0gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXJlcysrOworCQl9CisJfQorCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogc3BkaWYgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyB2b2lkIG9wZW5fY3M4NDI3KGljZTE3MTJfdCAqaWNlLCBzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNuZF9jczg0MjdfaWVjOTU4X2FjdGl2ZShpY2UtPmNzODQyNywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2NzODQyNyhpY2UxNzEyX3QgKmljZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzbmRfY3M4NDI3X2llYzk1OF9hY3RpdmUoaWNlLT5jczg0MjcsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9jczg0MjcoaWNlMTcxMl90ICppY2UsIGludCByYXRlKQoreworCXNuZF9jczg0MjdfaWVjOTU4X3BjbShpY2UtPmNzODQyNywgcmF0ZSk7Cit9CisKKy8qCisgKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgY2FsbGJhY2tzIGZvciBjczg0MjcgaW50ZXJmYWNlCisgKi8KK2ludCBfX2RldmluaXQgc25kX2ljZTE3MTJfaW5pdF9jczg0MjcoaWNlMTcxMl90ICppY2UsIGludCBhZGRyKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9jczg0MjdfY3JlYXRlKGljZS0+aTJjLCBhZGRyLAorCQkJCSAgICAgKGljZS0+Y3M4NDI3X3RpbWVvdXQgKiBIWikgLyAxMDAwLAorCQkJCSAgICAgJmljZS0+Y3M4NDI3KSkgPCAwKSB7CisJCXNuZF9wcmludGsoIkNTODQyNyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlpY2UtPnNwZGlmLm9wcy5vcGVuID0gb3Blbl9jczg0Mjc7CisJaWNlLT5zcGRpZi5vcHMuY2xvc2UgPSBjbG9zZV9jczg0Mjc7CisJaWNlLT5zcGRpZi5vcHMuc2V0dXBfcmF0ZSA9IHNldHVwX2NzODQyNzsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIEludGVycnVwdCBoYW5kbGVyCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHNuZF9pY2UxNzEyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWljZTE3MTJfdCAqaWNlID0gZGV2X2lkOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCXdoaWxlICgxKSB7CisJCXN0YXR1cyA9IGluYihJQ0VSRUcoaWNlLCBJUlFTVEFUKSk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCWJyZWFrOworCQloYW5kbGVkID0gMTsKKwkJaWYgKHN0YXR1cyAmIElDRTE3MTJfSVJRX01QVTEpIHsKKwkJCWlmIChpY2UtPnJtaWRpWzBdKQorCQkJCXNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaXJxLCBpY2UtPnJtaWRpWzBdLT5wcml2YXRlX2RhdGEsIHJlZ3MpOworCQkJb3V0YihJQ0UxNzEyX0lSUV9NUFUxLCBJQ0VSRUcoaWNlLCBJUlFTVEFUKSk7CisJCQlzdGF0dXMgJj0gfklDRTE3MTJfSVJRX01QVTE7CisJCX0KKwkJaWYgKHN0YXR1cyAmIElDRTE3MTJfSVJRX1RJTUVSKQorCQkJb3V0YihJQ0UxNzEyX0lSUV9USU1FUiwgSUNFUkVHKGljZSwgSVJRU1RBVCkpOworCQlpZiAoc3RhdHVzICYgSUNFMTcxMl9JUlFfTVBVMikgeworCQkJaWYgKGljZS0+cm1pZGlbMV0pCisJCQkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIGljZS0+cm1pZGlbMV0tPnByaXZhdGVfZGF0YSwgcmVncyk7CisJCQlvdXRiKElDRTE3MTJfSVJRX01QVTIsIElDRVJFRyhpY2UsIElSUVNUQVQpKTsKKwkJCXN0YXR1cyAmPSB+SUNFMTcxMl9JUlFfTVBVMjsKKwkJfQorCQlpZiAoc3RhdHVzICYgSUNFMTcxMl9JUlFfUFJPUENNKSB7CisJCQl1bnNpZ25lZCBjaGFyIG10c3RhdCA9IGluYihJQ0VNVChpY2UsIElSUSkpOworCQkJaWYgKG10c3RhdCAmIElDRTE3MTJfTVVMVElfUEJLU1RBVFVTKSB7CisJCQkJaWYgKGljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSkKKwkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0pOworCQkJCW91dGIoSUNFMTcxMl9NVUxUSV9QQktTVEFUVVMsIElDRU1UKGljZSwgSVJRKSk7CisJCQl9CisJCQlpZiAobXRzdGF0ICYgSUNFMTcxMl9NVUxUSV9DQVBTVEFUVVMpIHsKKwkJCQlpZiAoaWNlLT5jYXB0dXJlX3Byb19zdWJzdHJlYW0pCisJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoaWNlLT5jYXB0dXJlX3Byb19zdWJzdHJlYW0pOworCQkJCW91dGIoSUNFMTcxMl9NVUxUSV9DQVBTVEFUVVMsIElDRU1UKGljZSwgSVJRKSk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXR1cyAmIElDRTE3MTJfSVJRX0ZNKQorCQkJb3V0YihJQ0UxNzEyX0lSUV9GTSwgSUNFUkVHKGljZSwgSVJRU1RBVCkpOworCQlpZiAoc3RhdHVzICYgSUNFMTcxMl9JUlFfUEJLRFMpIHsKKwkJCXUzMiBpZHg7CisJCQl1MTYgcGJrc3RhdHVzOworCQkJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCQkJcGJrc3RhdHVzID0gaW53KElDRURTKGljZSwgSU5UU1RBVCkpOworCQkJLy9wcmludGsoInBia3N0YXR1cyA9IDB4JXhcbiIsIHBia3N0YXR1cyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7CisJCQkJaWYgKChwYmtzdGF0dXMgJiAoMyA8PCAoaWR4ICogMikpKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKHN1YnN0cmVhbSA9IGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1tpZHhdKSAhPSBOVUxMKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCQkJb3V0dygzIDw8IChpZHggKiAyKSwgSUNFRFMoaWNlLCBJTlRTVEFUKSk7CisJCQl9CisJCQlvdXRiKElDRTE3MTJfSVJRX1BCS0RTLCBJQ0VSRUcoaWNlLCBJUlFTVEFUKSk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIElDRTE3MTJfSVJRX0NPTkNBUCkgeworCQkJaWYgKGljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtKQorCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoaWNlLT5jYXB0dXJlX2Nvbl9zdWJzdHJlYW0pOworCQkJb3V0YihJQ0UxNzEyX0lSUV9DT05DQVAsIElDRVJFRyhpY2UsIElSUVNUQVQpKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgSUNFMTcxMl9JUlFfQ09OUEJLKSB7CisJCQlpZiAoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtKQorCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtKTsKKwkJCW91dGIoSUNFMTcxMl9JUlFfQ09OUEJLLCBJQ0VSRUcoaWNlLCBJUlFTVEFUKSk7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworLyoKKyAqICBQQ00gcGFydCAtIG1pc2MKKyAqLworCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCisvKgorICogIFBDTSBwYXJ0IC0gY29uc3VtZXIgSS9PCisgKi8KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wbGF5YmFja190cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCWludCBjbWQpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHJlc3VsdCA9IDA7CisJdTMyIHRtcDsKKwkKKwlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOworCXRtcCA9IHNuZF9pY2UxNzEyX3JlYWQoaWNlLCBJQ0UxNzEyX0lSRUdfUEJLX0NUUkwpOworCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpIHsKKwkJdG1wIHw9IDE7CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQl0bXAgJj0gfjE7CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCkgeworCQl0bXAgfD0gMjsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFKSB7CisJCXRtcCAmPSB+MjsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19QQktfQ1RSTCwgdG1wKTsKKwlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wbGF5YmFja19kc190cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCSAgIGludCBjbWQpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHJlc3VsdCA9IDA7CisJdTMyIHRtcDsKKwkKKwlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOworCXRtcCA9IHNuZF9pY2UxNzEyX2RzX3JlYWQoaWNlLCBzdWJzdHJlYW0tPm51bWJlciAqIDIsIElDRTE3MTJfRFNDX0NPTlRST0wpOworCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpIHsKKwkJdG1wIHw9IDE7CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQl0bXAgJj0gfjE7CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCkgeworCQl0bXAgfD0gMjsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFKSB7CisJCXRtcCAmPSB+MjsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKwlzbmRfaWNlMTcxMl9kc193cml0ZShpY2UsIHN1YnN0cmVhbS0+bnVtYmVyICogMiwgSUNFMTcxMl9EU0NfQ09OVFJPTCwgdG1wKTsKKwlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9jYXB0dXJlX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgICAgaW50IGNtZCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1OCB0bXA7CisJCisJc3Bpbl9sb2NrKCZpY2UtPnJlZ19sb2NrKTsKKwl0bXAgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0NBUF9DVFJMKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CisJCXRtcCB8PSAxOworCX0gZWxzZSBpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUT1ApIHsKKwkJdG1wICY9IH4xOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfQorCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX0NBUF9DVFJMLCB0bXApOworCXNwaW5fdW5sb2NrKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1MzIgcGVyaW9kX3NpemUsIGJ1Zl9zaXplLCByYXRlLCB0bXA7CisKKwlwZXJpb2Rfc2l6ZSA9IChzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDE7CisJYnVmX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSAtIDE7CisJdG1wID0gMHgwMDAwOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQl0bXAgfD0gMHgxMDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMikKKwkJdG1wIHw9IDB4MDg7CisJcmF0ZSA9IChydW50aW1lLT5yYXRlICogODE5MikgLyAzNzU7CisJaWYgKHJhdGUgPiAweDAwMGZmZmZmKQorCQlyYXRlID0gMHgwMDBmZmZmZjsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlvdXRiKDAsIGljZS0+ZGRtYV9wb3J0ICsgMTUpOworCW91dGIoSUNFMTcxMl9ETUFfTU9ERV9XUklURSB8IElDRTE3MTJfRE1BX0FVVE9JTklULCBpY2UtPmRkbWFfcG9ydCArIDB4MGIpOworCW91dGwocnVudGltZS0+ZG1hX2FkZHIsIGljZS0+ZGRtYV9wb3J0ICsgMCk7CisJb3V0dyhidWZfc2l6ZSwgaWNlLT5kZG1hX3BvcnQgKyA0KTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19QQktfUkFURV9MTywgcmF0ZSAmIDB4ZmYpOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX1BCS19SQVRFX01JRCwgKHJhdGUgPj4gOCkgJiAweGZmKTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19QQktfUkFURV9ISSwgKHJhdGUgPj4gMTYpICYgMHhmZik7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfUEJLX0NUUkwsIHRtcCk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfUEJLX0NPVU5UX0xPLCBwZXJpb2Rfc2l6ZSAmIDB4ZmYpOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX1BCS19DT1VOVF9ISSwgcGVyaW9kX3NpemUgPj4gOCk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfUEJLX0xFRlQsIDApOworCXNuZF9pY2UxNzEyX3dyaXRlKGljZSwgSUNFMTcxMl9JUkVHX1BCS19SSUdIVCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wbGF5YmFja19kc19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdTMyIHBlcmlvZF9zaXplLCBidWZfc2l6ZSwgcmF0ZSwgdG1wLCBjaG47CisKKwlwZXJpb2Rfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pIC0gMTsKKwlidWZfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pIC0gMTsKKwl0bXAgPSAweDAwNjQ7CisJaWYgKHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYpCisJCXRtcCAmPSB+MHgwNDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMikKKwkJdG1wIHw9IDB4MDg7CisJcmF0ZSA9IChydW50aW1lLT5yYXRlICogODE5MikgLyAzNzU7CisJaWYgKHJhdGUgPiAweDAwMGZmZmZmKQorCQlyYXRlID0gMHgwMDBmZmZmZjsKKwlpY2UtPnBsYXliYWNrX2Nvbl9hY3RpdmVfYnVmW3N1YnN0cmVhbS0+bnVtYmVyXSA9IDA7CisJaWNlLT5wbGF5YmFja19jb25fdmlydF9hZGRyW3N1YnN0cmVhbS0+bnVtYmVyXSA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCWNobiA9IHN1YnN0cmVhbS0+bnVtYmVyICogMjsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlzbmRfaWNlMTcxMl9kc193cml0ZShpY2UsIGNobiwgSUNFMTcxMl9EU0NfQUREUjAsIHJ1bnRpbWUtPmRtYV9hZGRyKTsKKwlzbmRfaWNlMTcxMl9kc193cml0ZShpY2UsIGNobiwgSUNFMTcxMl9EU0NfQ09VTlQwLCBwZXJpb2Rfc2l6ZSk7CisJc25kX2ljZTE3MTJfZHNfd3JpdGUoaWNlLCBjaG4sIElDRTE3MTJfRFNDX0FERFIxLCBydW50aW1lLT5kbWFfYWRkciArIChydW50aW1lLT5wZXJpb2RzID4gMSA/IHBlcmlvZF9zaXplICsgMSA6IDApKTsKKwlzbmRfaWNlMTcxMl9kc193cml0ZShpY2UsIGNobiwgSUNFMTcxMl9EU0NfQ09VTlQxLCBwZXJpb2Rfc2l6ZSk7CisJc25kX2ljZTE3MTJfZHNfd3JpdGUoaWNlLCBjaG4sIElDRTE3MTJfRFNDX1JBVEUsIHJhdGUpOworCXNuZF9pY2UxNzEyX2RzX3dyaXRlKGljZSwgY2huLCBJQ0UxNzEyX0RTQ19WT0xVTUUsIDApOworCXNuZF9pY2UxNzEyX2RzX3dyaXRlKGljZSwgY2huLCBJQ0UxNzEyX0RTQ19DT05UUk9MLCB0bXApOworCWlmIChydW50aW1lLT5jaGFubmVscyA9PSAyKSB7CisJCXNuZF9pY2UxNzEyX2RzX3dyaXRlKGljZSwgY2huICsgMSwgSUNFMTcxMl9EU0NfUkFURSwgcmF0ZSk7CisJCXNuZF9pY2UxNzEyX2RzX3dyaXRlKGljZSwgY2huICsgMSwgSUNFMTcxMl9EU0NfVk9MVU1FLCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1MzIgcGVyaW9kX3NpemUsIGJ1Zl9zaXplOworCXU4IHRtcDsKKworCXBlcmlvZF9zaXplID0gKHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pID4+IDIpIC0gMTsKKwlidWZfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pIC0gMTsKKwl0bXAgPSAweDA2OworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQl0bXAgJj0gfjB4MDQ7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDIpCisJCXRtcCAmPSB+MHgwMjsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlvdXRsKGljZS0+Y2FwdHVyZV9jb25fdmlydF9hZGRyID0gcnVudGltZS0+ZG1hX2FkZHIsIElDRVJFRyhpY2UsIENPTkNBUF9BRERSKSk7CisJb3V0dyhidWZfc2l6ZSwgSUNFUkVHKGljZSwgQ09OQ0FQX0NPVU5UKSk7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfQ0FQX0NPVU5UX0hJLCBwZXJpb2Rfc2l6ZSA+PiA4KTsKKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19DQVBfQ09VTlRfTE8sIHBlcmlvZF9zaXplICYgMHhmZik7CisJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfQ0FQX0NUUkwsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlzbmRfYWM5N19zZXRfcmF0ZShpY2UtPmFjOTcsIEFDOTdfUENNX0xSX0FEQ19SQVRFLCBydW50aW1lLT5yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9pY2UxNzEyX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19QQktfQ1RSTCkgJiAxKSkKKwkJcmV0dXJuIDA7CisJcHRyID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBpbncoaWNlLT5kZG1hX3BvcnQgKyA0KTsKKwlpZiAocHRyID09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQlwdHIgPSAwOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXU4IGFkZHI7CisJc2l6ZV90IHB0cjsKKworCWlmICghKHNuZF9pY2UxNzEyX2RzX3JlYWQoaWNlLCBzdWJzdHJlYW0tPm51bWJlciAqIDIsIElDRTE3MTJfRFNDX0NPTlRST0wpICYgMSkpCisJCXJldHVybiAwOworCWlmIChpY2UtPnBsYXliYWNrX2Nvbl9hY3RpdmVfYnVmW3N1YnN0cmVhbS0+bnVtYmVyXSkKKwkJYWRkciA9IElDRTE3MTJfRFNDX0FERFIxOworCWVsc2UKKwkJYWRkciA9IElDRTE3MTJfRFNDX0FERFIwOworCXB0ciA9IHNuZF9pY2UxNzEyX2RzX3JlYWQoaWNlLCBzdWJzdHJlYW0tPm51bWJlciAqIDIsIGFkZHIpIC0KKwkJaWNlLT5wbGF5YmFja19jb25fdmlydF9hZGRyW3N1YnN0cmVhbS0+bnVtYmVyXTsKKwlpZiAocHRyID09IHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpCisJCXB0ciA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfaWNlMTcxMl9jYXB0dXJlX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19DQVBfQ1RSTCkgJiAxKSkKKwkJcmV0dXJuIDA7CisJcHRyID0gaW5sKElDRVJFRyhpY2UsIENPTkNBUF9BRERSKSkgLSBpY2UtPmNhcHR1cmVfY29uX3ZpcnRfYWRkcjsKKwlpZiAocHRyID09IHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpCisJCXB0ciA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2ljZTE3MTJfcGxheWJhY2sgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoNjQqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg2NCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9pY2UxNzEyX2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDY0KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoNjQqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfaWNlMTcxMl9wbGF5YmFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wbGF5YmFja19kc19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdTMyIHRtcDsKKworCWljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1tzdWJzdHJlYW0tPm51bWJlcl0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfaWNlMTcxMl9wbGF5YmFja19kczsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsgCisJdG1wID0gaW53KElDRURTKGljZSwgSU5UTUFTSykpICYgfigxIDw8IChzdWJzdHJlYW0tPm51bWJlciAqIDIpKTsKKwlvdXR3KHRtcCwgSUNFRFMoaWNlLCBJTlRNQVNLKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2ljZTE3MTJfY2FwdHVyZTsKKwlydW50aW1lLT5ody5yYXRlcyA9IGljZS0+YWM5Ny0+cmF0ZXNbQUM5N19SQVRFU19BRENdOworCWlmICghKHJ1bnRpbWUtPmh3LnJhdGVzICYgU05EUlZfUENNX1JBVEVfODAwMCkpCisJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gNDgwMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1MzIgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7IAorCXRtcCA9IGludyhJQ0VEUyhpY2UsIElOVE1BU0spKSB8ICgzIDw8IChzdWJzdHJlYW0tPm51bWJlciAqIDIpKTsKKwlvdXR3KHRtcCwgSUNFRFMoaWNlLCBJTlRNQVNLKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbc3Vic3RyZWFtLT5udW1iZXJdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpY2UtPmNhcHR1cmVfY29uX3N1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pY2UxNzEyX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaWNlMTcxMl9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaWNlMTcxMl9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaWNlMTcxMl9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfb3BzID0geworCS5vcGVuID0JCXNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX29wZW4sCisJLmNsb3NlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pY2UxNzEyX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pY2UxNzEyX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19kc19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaWNlMTcxMl9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaWNlMTcxMl9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2ljZTE3MTJfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ljZTE3MTJfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ljZTE3MTJfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCWljZTE3MTJfdCAqaWNlID0gcGNtLT5wcml2YXRlX2RhdGE7CisJaWNlLT5wY20gPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9wY20oaWNlMTcxMl90ICogaWNlLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKwllcnIgPSBzbmRfcGNtX25ldyhpY2UtPmNhcmQsICJJQ0UxNzEyIGNvbnN1bWVyIiwgZGV2aWNlLCAxLCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfaWNlMTcxMl9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9pY2UxNzEyX2NhcHR1cmVfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gaWNlOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2ljZTE3MTJfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiSUNFMTcxMiBjb25zdW1lciIpOworCWljZS0+cGNtID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShpY2UtPnBjaSksIDY0KjEwMjQsIDY0KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiQ29uc3VtZXIgUENNIGNvZGUgZG9lcyBub3Qgd29yayB3ZWxsIGF0IHRoZSBtb21lbnQgLS1qa1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2ljZTE3MTJfcGNtX2ZyZWVfZHMoc25kX3BjbV90ICpwY20pCit7CisJaWNlMTcxMl90ICppY2UgPSBwY20tPnByaXZhdGVfZGF0YTsKKwlpY2UtPnBjbV9kcyA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3BjbV9kcyhpY2UxNzEyX3QgKiBpY2UsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWVyciA9IHNuZF9wY21fbmV3KGljZS0+Y2FyZCwgIklDRTE3MTIgY29uc3VtZXIgKERTKSIsIGRldmljZSwgNiwgMCwgJnBjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfb3BzKTsKKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gaWNlOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2ljZTE3MTJfcGNtX2ZyZWVfZHM7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiSUNFMTcxMiBjb25zdW1lciAoRFMpIik7CisJaWNlLT5wY21fZHMgPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGljZS0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUENNIGNvZGUgLSBwcm9mZXNzaW9uYWwgcGFydCAobXVsdGl0cmFjaykKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzW10gPSB7IDgwMDAsIDk2MDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwKKwkJCQkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwIH07CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXMpLAorCS5saXN0ID0gcmF0ZXMsCisJLm1hc2sgPSAwLAorfTsKKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgaW50IGNtZCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJeworCQl1bnNpZ25lZCBpbnQgd2hhdDsKKwkJdW5zaWduZWQgaW50IG9sZDsKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJd2hhdCA9IElDRTE3MTJfUExBWUJBQ0tfUEFVU0U7CisJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHN1YnN0cmVhbSwgc3Vic3RyZWFtKTsKKwkJc3Bpbl9sb2NrKCZpY2UtPnJlZ19sb2NrKTsKKwkJb2xkID0gaW5sKElDRU1UKGljZSwgUExBWUJBQ0tfQ09OVFJPTCkpOworCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0gpCisJCQlvbGQgfD0gd2hhdDsKKwkJZWxzZQorCQkJb2xkICY9IH53aGF0OworCQlvdXRsKG9sZCwgSUNFTVQoaWNlLCBQTEFZQkFDS19DT05UUk9MKSk7CisJCXNwaW5fdW5sb2NrKCZpY2UtPnJlZ19sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCXsKKwkJdW5zaWduZWQgaW50IHdoYXQgPSAwOworCQl1bnNpZ25lZCBpbnQgb2xkOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCXNuZF9wY21fc3Vic3RyZWFtX3QgKnM7CisKKwkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgeworCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCQlpZiAocyA9PSBpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0pIHsKKwkJCQl3aGF0IHw9IElDRTE3MTJfUExBWUJBQ0tfU1RBUlQ7CisJCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJCX0gZWxzZSBpZiAocyA9PSBpY2UtPmNhcHR1cmVfcHJvX3N1YnN0cmVhbSkgeworCQkJCXdoYXQgfD0gSUNFMTcxMl9DQVBUVVJFX1NUQVJUX1NIQURPVzsKKwkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOworCQkJfQorCQl9CisJCXNwaW5fbG9jaygmaWNlLT5yZWdfbG9jayk7CisJCW9sZCA9IGlubChJQ0VNVChpY2UsIFBMQVlCQUNLX0NPTlRST0wpKTsKKwkJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkKKwkJCW9sZCB8PSB3aGF0OworCQllbHNlCisJCQlvbGQgJj0gfndoYXQ7CisJCW91dGwob2xkLCBJQ0VNVChpY2UsIFBMQVlCQUNLX0NPTlRST0wpKTsKKwkJc3Bpbl91bmxvY2soJmljZS0+cmVnX2xvY2spOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICovCitzdGF0aWMgdm9pZCBzbmRfaWNlMTcxMl9zZXRfcHJvX3JhdGUoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCByYXRlLCBpbnQgZm9yY2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZhbCwgb2xkOworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA4MDAwOiB2YWwgPSA2OyBicmVhazsKKwljYXNlIDk2MDA6IHZhbCA9IDM7IGJyZWFrOworCWNhc2UgMTEwMjU6IHZhbCA9IDEwOyBicmVhazsKKwljYXNlIDEyMDAwOiB2YWwgPSAyOyBicmVhazsKKwljYXNlIDE2MDAwOiB2YWwgPSA1OyBicmVhazsKKwljYXNlIDIyMDUwOiB2YWwgPSA5OyBicmVhazsKKwljYXNlIDI0MDAwOiB2YWwgPSAxOyBicmVhazsKKwljYXNlIDMyMDAwOiB2YWwgPSA0OyBicmVhazsKKwljYXNlIDQ0MTAwOiB2YWwgPSA4OyBicmVhazsKKwljYXNlIDQ4MDAwOiB2YWwgPSAwOyBicmVhazsKKwljYXNlIDY0MDAwOiB2YWwgPSAxNTsgYnJlYWs7CisJY2FzZSA4ODIwMDogdmFsID0gMTE7IGJyZWFrOworCWNhc2UgOTYwMDA6IHZhbCA9IDc7IGJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJdmFsID0gMDsKKwkJcmF0ZSA9IDQ4MDAwOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWNlLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChpbmIoSUNFTVQoaWNlLCBQTEFZQkFDS19DT05UUk9MKSkgJiAoSUNFMTcxMl9DQVBUVVJFX1NUQVJUX1NIQURPV3wKKwkJCQkJCSBJQ0UxNzEyX1BMQVlCQUNLX1BBVVNFfAorCQkJCQkJIElDRTE3MTJfUExBWUJBQ0tfU1RBUlQpKSB7CisJICAgICAgX19vdXQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWZvcmNlICYmIGlzX3Byb19yYXRlX2xvY2tlZChpY2UpKQorCQlnb3RvIF9fb3V0OworCisgICAgICAgIG9sZCA9IGluYihJQ0VNVChpY2UsIFJBVEUpKTsKKwlpZiAoIWZvcmNlICYmIG9sZCA9PSB2YWwpCisJCWdvdG8gX19vdXQ7CisJb3V0Yih2YWwsIElDRU1UKGljZSwgUkFURSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWlmIChpY2UtPmdwaW8uc2V0X3Byb19yYXRlKQorCQlpY2UtPmdwaW8uc2V0X3Byb19yYXRlKGljZSwgcmF0ZSk7CisJZm9yIChpID0gMDsgaSA8IGljZS0+YWttX2NvZGVjczsgaSsrKSB7CisJCWlmIChpY2UtPmFrbVtpXS5vcHMuc2V0X3JhdGVfdmFsKQorCQkJaWNlLT5ha21baV0ub3BzLnNldF9yYXRlX3ZhbCgmaWNlLT5ha21baV0sIHJhdGUpOworCX0KKwlpZiAoaWNlLT5zcGRpZi5vcHMuc2V0dXBfcmF0ZSkKKwkJaWNlLT5zcGRpZi5vcHMuc2V0dXBfcmF0ZShpY2UsIHJhdGUpOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpY2UtPnBsYXliYWNrX3Byb19zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJb3V0bChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLCBJQ0VNVChpY2UsIFBMQVlCQUNLX0FERFIpKTsKKwlvdXR3KChpY2UtPnBsYXliYWNrX3Byb19zaXplID4+IDIpIC0gMSwgSUNFTVQoaWNlLCBQTEFZQkFDS19TSVpFKSk7CisJb3V0dygoc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSkgPj4gMikgLSAxLCBJQ0VNVChpY2UsIFBMQVlCQUNLX0NPVU5UKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJICAgICAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNuZF9pY2UxNzEyX3NldF9wcm9fcmF0ZShpY2UsIHBhcmFtc19yYXRlKGh3X3BhcmFtcyksIDApOworCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWljZS0+Y2FwdHVyZV9wcm9fc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCW91dGwoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkciwgSUNFTVQoaWNlLCBDQVBUVVJFX0FERFIpKTsKKwlvdXR3KChpY2UtPmNhcHR1cmVfcHJvX3NpemUgPj4gMikgLSAxLCBJQ0VNVChpY2UsIENBUFRVUkVfU0laRSkpOworCW91dHcoKHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pID4+IDIpIC0gMSwgSUNFTVQoaWNlLCBDQVBUVVJFX0NPVU5UKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJICAgICBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc25kX2ljZTE3MTJfc2V0X3Byb19yYXRlKGljZSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSwgMCk7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisKKwlpZiAoIShpbmwoSUNFTVQoaWNlLCBQTEFZQkFDS19DT05UUk9MKSkgJiBJQ0UxNzEyX1BMQVlCQUNLX1NUQVJUKSkKKwkJcmV0dXJuIDA7CisJcHRyID0gaWNlLT5wbGF5YmFja19wcm9fc2l6ZSAtIChpbncoSUNFTVQoaWNlLCBQTEFZQkFDS19TSVpFKSkgPDwgMik7CisJaWYgKHB0ciA9PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQlwdHIgPSAwOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisKKwlpZiAoIShpbmwoSUNFTVQoaWNlLCBQTEFZQkFDS19DT05UUk9MKSkgJiBJQ0UxNzEyX0NBUFRVUkVfU1RBUlRfU0hBRE9XKSkKKwkJcmV0dXJuIDA7CisJcHRyID0gaWNlLT5jYXB0dXJlX3Byb19zaXplIC0gKGludyhJQ0VNVChpY2UsIENBUFRVUkVfU0laRSkpIDw8IDIpOworCWlmIChwdHIgPT0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJcHRyID0gMDsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm8gPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTk2MDAwLAorCS5jaGFubmVsc19taW4gPQkJMTAsCisJLmNoYW5uZWxzX21heCA9CQkxMCwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgyNTYqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMCAqIDQgKiAyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTMxMDQwLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm8gPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTk2MDAwLAorCS5jaGFubmVsc19taW4gPQkJMTIsCisJLmNoYW5uZWxzX21heCA9CQkxMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgyNTYqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMiAqIDQgKiAyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTMxMDQwLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9pY2UxNzEyX3BsYXliYWNrX3BybzsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaHdfY29uc3RyYWludHNfcmF0ZXMpOworCisJaWYgKGljZS0+c3BkaWYub3BzLm9wZW4pCisJCWljZS0+c3BkaWYub3BzLm9wZW4oaWNlLCBzdWJzdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWNlLT5jYXB0dXJlX3Byb19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfaWNlMTcxMl9jYXB0dXJlX3BybzsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaHdfY29uc3RyYWludHNfcmF0ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKFBST19SQVRFX1JFU0VUKQorCQlzbmRfaWNlMTcxMl9zZXRfcHJvX3JhdGUoaWNlLCBQUk9fUkFURV9ERUZBVUxULCAwKTsKKwlpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0gPSBOVUxMOworCWlmIChpY2UtPnNwZGlmLm9wcy5jbG9zZSkKKwkJaWNlLT5zcGRpZi5vcHMuY2xvc2UoaWNlLCBzdWJzdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChQUk9fUkFURV9SRVNFVCkKKwkJc25kX2ljZTE3MTJfc2V0X3Byb19yYXRlKGljZSwgUFJPX1JBVEVfREVGQVVMVCwgMCk7CisJaWNlLT5jYXB0dXJlX3Byb19zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfaWNlMTcxMl9wY21fcHJvZmlfZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWljZS0+cGNtX3BybyA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX29wZW4sCisJLmNsb3NlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9faHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ljZTE3MTJfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ljZTE3MTJfcHJvX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19vcGVuLAorCS5jbG9zZSA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaWNlMTcxMl9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pY2UxNzEyX3Byb190cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fcG9pbnRlciwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3BjbV9wcm9maShpY2UxNzEyX3QgKiBpY2UsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWVyciA9IHNuZF9wY21fbmV3KGljZS0+Y2FyZCwgIklDRTE3MTIgbXVsdGkiLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX29wcyk7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGljZTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9pY2UxNzEyX3BjbV9wcm9maV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIklDRTE3MTIgbXVsdGkiKTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoaWNlLT5wY2kpLCAyNTYqMTAyNCwgMjU2KjEwMjQpOworCisJaWNlLT5wY21fcHJvID0gcGNtOworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKwkKKwlpZiAoaWNlLT5jczg0MjcpIHsKKwkJLyogYXNzaWduIGNoYW5uZWxzIHRvIGllYzk1OCAqLworCQllcnIgPSBzbmRfY3M4NDI3X2llYzk1OF9idWlsZChpY2UtPmNzODQyNywKKwkJCQkJICAgICAgcGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbSwKKwkJCQkJICAgICAgcGNtLT5zdHJlYW1zWzFdLnN1YnN0cmVhbSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2J1aWxkX3Byb19taXhlcihpY2UpKSA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTWl4ZXIgc2VjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3VwZGF0ZV92b2x1bWUoaWNlMTcxMl90ICppY2UsIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgdm9sID0gaWNlLT5wcm9fdm9sdW1lc1tpbmRleF07CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKworCXZhbCB8PSAodm9sICYgMHg4MDAwKSA9PSAwID8gKDk2IC0gKHZvbCAmIDB4N2YpKSA6IDB4N2Y7CisJdmFsIHw9ICgodm9sICYgMHg4MDAwMDAwMCkgPT0gMCA/ICg5NiAtICgodm9sID4+IDE2KSAmIDB4N2YpKSA6IDB4N2YpIDw8IDg7CisJb3V0YihpbmRleCwgSUNFTVQoaWNlLCBNT05JVE9SX0lOREVYKSk7CisJb3V0dyh2YWwsIElDRU1UKGljZSwgTU9OSVRPUl9WT0xVTUUpKTsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX21peGVyX3N3aXRjaF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaW5kZXggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKSArIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCQorCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gISgoaWNlLT5wcm9fdm9sdW1lc1tpbmRleF0gPj4gMTUpICYgMSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAhKChpY2UtPnByb192b2x1bWVzW2luZGV4XSA+PiAzMSkgJiAxKTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGluZGV4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCkgKyBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgbnZhbCwgY2hhbmdlOworCisJbnZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDAgOiAweDAwMDA4MDAwKSB8CisJICAgICAgICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA/IDAgOiAweDgwMDAwMDAwKTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwludmFsIHw9IGljZS0+cHJvX3ZvbHVtZXNbaW5kZXhdICYgfjB4ODAwMDgwMDA7CisJY2hhbmdlID0gbnZhbCAhPSBpY2UtPnByb192b2x1bWVzW2luZGV4XTsKKwlpY2UtPnByb192b2x1bWVzW2luZGV4XSA9IG52YWw7CisJc25kX2ljZTE3MTJfdXBkYXRlX3ZvbHVtZShpY2UsIGluZGV4KTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX21peGVyX3ZvbHVtZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA5NjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpbmRleCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICsga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoaWNlLT5wcm9fdm9sdW1lc1tpbmRleF0gPj4gMCkgJiAxMjc7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAoaWNlLT5wcm9fdm9sdW1lc1tpbmRleF0gPj4gMTYpICYgMTI3OworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX21peGVyX3ZvbHVtZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaW5kZXggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKSArIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCBudmFsLCBjaGFuZ2U7CisKKwludmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTI3KSB8CisJICAgICAgICgodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiAxMjcpIDw8IDE2KTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwludmFsIHw9IGljZS0+cHJvX3ZvbHVtZXNbaW5kZXhdICYgfjB4MDA3ZjAwN2Y7CisJY2hhbmdlID0gbnZhbCAhPSBpY2UtPnByb192b2x1bWVzW2luZGV4XTsKKwlpY2UtPnByb192b2x1bWVzW2luZGV4XSA9IG52YWw7CisJc25kX2ljZTE3MTJfdXBkYXRlX3ZvbHVtZShpY2UsIGluZGV4KTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9tdWx0aV9wbGF5YmFja19jdHJsc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTXVsdGkgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCisJCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2dldCwKKwkJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDAsCisJCS5jb3VudCA9IDEwLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTXVsdGkgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2luZm8sCisJCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2dldCwKKwkJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDAsCisJCS5jb3VudCA9IDEwLAorCX0sCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3N3aXRjaCBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkgvVyBNdWx0aSBDYXB0dXJlIFN3aXRjaCIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IDEwLAorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIklFQzk1OCBNdWx0aSBDYXB0dXJlIFN3aXRjaCIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IDE4LAorCS5jb3VudCA9IDIsCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3ZvbHVtZSBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkgvVyBNdWx0aSBDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IDEwLAorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3ZvbHVtZSBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIklFQzk1OCBNdWx0aSBDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IDE4LAorCS5jb3VudCA9IDIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9idWlsZF9wcm9fbWl4ZXIoaWNlMTcxMl90ICppY2UpCit7CisJc25kX2NhcmRfdCAqIGNhcmQgPSBpY2UtPmNhcmQ7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJLyogbXVsdGktY2hhbm5lbCBtaXhlciAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfaWNlMTcxMl9tdWx0aV9wbGF5YmFja19jdHJscyk7IGlkeCsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbXVsdGlfcGxheWJhY2tfY3RybHNbaWR4XSwgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJCisJaWYgKGljZS0+bnVtX3RvdGFsX2FkY3MgPiAwKSB7CisJCXNuZF9rY29udHJvbF9uZXdfdCB0bXAgPSBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ19zd2l0Y2g7CisJCXRtcC5jb3VudCA9IGljZS0+bnVtX3RvdGFsX2FkY3M7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmdG1wLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl9zd2l0Y2gsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGljZS0+bnVtX3RvdGFsX2FkY3MgPiAwKSB7CisJCXNuZF9rY29udHJvbF9uZXdfdCB0bXAgPSBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ192b2x1bWU7CisJCXRtcC5jb3VudCA9IGljZS0+bnVtX3RvdGFsX2FkY3M7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmdG1wLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl92b2x1bWUsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogaW5pdGlhbGl6ZSB2b2x1bWVzICovCisJZm9yIChpZHggPSAwOyBpZHggPCAxMDsgaWR4KyspIHsKKwkJaWNlLT5wcm9fdm9sdW1lc1tpZHhdID0gMHg4MDAwODAwMDsJLyogbXV0ZSAqLworCQlzbmRfaWNlMTcxMl91cGRhdGVfdm9sdW1lKGljZSwgaWR4KTsKKwl9CisJZm9yIChpZHggPSAxMDsgaWR4IDwgMTAgKyBpY2UtPm51bV90b3RhbF9hZGNzOyBpZHgrKykgeworCQlpY2UtPnByb192b2x1bWVzW2lkeF0gPSAweDgwMDA4MDAwOwkvKiBtdXRlICovCisJCXNuZF9pY2UxNzEyX3VwZGF0ZV92b2x1bWUoaWNlLCBpZHgpOworCX0KKwlmb3IgKGlkeCA9IDE4OyBpZHggPCAyMDsgaWR4KyspIHsKKwkJaWNlLT5wcm9fdm9sdW1lc1tpZHhdID0gMHg4MDAwODAwMDsJLyogbXV0ZSAqLworCQlzbmRfaWNlMTcxMl91cGRhdGVfdm9sdW1lKGljZSwgaWR4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJaWNlMTcxMl90ICppY2UgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaWNlLT5hYzk3ID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfYWM5N19taXhlcihpY2UxNzEyX3QgKiBpY2UpCit7CisJaW50IGVyciwgYnVzX251bSA9IDA7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJYWM5N19idXNfdCAqcGJ1czsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3QgY29uX29wcyA9IHsKKwkJLndyaXRlID0gc25kX2ljZTE3MTJfYWM5N193cml0ZSwKKwkJLnJlYWQgPSBzbmRfaWNlMTcxMl9hYzk3X3JlYWQsCisJfTsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3QgcHJvX29wcyA9IHsKKwkJLndyaXRlID0gc25kX2ljZTE3MTJfcHJvX2FjOTdfd3JpdGUsCisJCS5yZWFkID0gc25kX2ljZTE3MTJfcHJvX2FjOTdfcmVhZCwKKwl9OworCisJaWYgKGljZV9oYXNfY29uX2FjOTcoaWNlKSkgeworCQlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhpY2UtPmNhcmQsIGJ1c19udW0rKywgJmNvbl9vcHMsIE5VTEwsICZwYnVzKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCQlhYzk3LnByaXZhdGVfZGF0YSA9IGljZTsKKwkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7CisJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpKSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBhYzk3IGZvciBjb25zdW1lciwgc2tpcHBlZFxuIik7CisJCWVsc2UgeworCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCEgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQUNMSU5LXSAmIElDRTE3MTJfQ0ZHX1BST19JMlMpKSB7CisJCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGljZS0+Y2FyZCwgYnVzX251bSwgJnByb19vcHMsIE5VTEwsICZwYnVzKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCQlhYzk3LnByaXZhdGVfZGF0YSA9IGljZTsKKwkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7CisJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpKSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwkvKiBJMlMgbWl4ZXIgb25seSAqLworCXN0cmNhdChpY2UtPmNhcmQtPm1peGVybmFtZSwgIklDRTE3MTIgLSBtdWx0aXRyYWNrIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVlcHJvbV9kb3VibGUoaWNlMTcxMl90ICppY2UsIGludCBpZHgpCit7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpaWNlLT5lZXByb20uZGF0YVtpZHhdIHwgKCh1bnNpZ25lZCBpbnQpaWNlLT5lZXByb20uZGF0YVtpZHggKyAxXSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgc25kX2ljZTE3MTJfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCWljZTE3MTJfdCAqaWNlID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCisJc25kX2lwcmludGYoYnVmZmVyLCAiJXNcblxuIiwgaWNlLT5jYXJkLT5sb25nbmFtZSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiRUVQUk9NOlxuIik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIFN1YnZlbmRvciAgICAgICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgU2l6ZSAgICAgICAgICAgICA6ICVpIGJ5dGVzXG4iLCBpY2UtPmVlcHJvbS5zaXplKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIFZlcnNpb24gICAgICAgICAgOiAlaVxuIiwgaWNlLT5lZXByb20udmVyc2lvbik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBDb2RlYyAgICAgICAgICAgIDogMHgleFxuIiwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9DT0RFQ10pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgQUNMaW5rICAgICAgICAgICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQUNMSU5LXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBJMlMgSUQgICAgICAgICAgIDogMHgleFxuIiwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9JMlNJRF0pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgUy9QRElGICAgICAgICAgICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfU1BESUZdKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEdQSU8gbWFzayAgICAgICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5ncGlvbWFzayk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBHUElPIHN0YXRlICAgICAgIDogMHgleFxuIiwgaWNlLT5lZXByb20uZ3Bpb3N0YXRlKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEdQSU8gZGlyZWN0aW9uICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5ncGlvZGlyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEFDJzk3IG1haW4gICAgICAgOiAweCV4XG4iLCBlZXByb21fZG91YmxlKGljZSwgSUNFX0VFUDFfQUM5N19NQUlOX0xPKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBBQyc5NyBwY20gICAgICAgIDogMHgleFxuIiwgZWVwcm9tX2RvdWJsZShpY2UsIElDRV9FRVAxX0FDOTdfUENNX0xPKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBBQyc5NyByZWNvcmQgICAgIDogMHgleFxuIiwgZWVwcm9tX2RvdWJsZShpY2UsIElDRV9FRVAxX0FDOTdfUkVDX0xPKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBBQyc5NyByZWNvcmQgc3JjIDogMHgleFxuIiwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9BQzk3X1JFQ1NSQ10pOworCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgREFDIElEICMlaSAgICAgICAgOiAweCV4XG4iLCBpZHgsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfREFDX0lEICsgaWR4XSk7CisJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBBREMgSUQgIyVpICAgICAgICA6IDB4JXhcbiIsIGlkeCwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9BRENfSUQgKyBpZHhdKTsKKwlmb3IgKGlkeCA9IDB4MWM7IGlkeCA8IGljZS0+ZWVwcm9tLnNpemU7IGlkeCsrKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgIEV4dHJhICMlMDJpICAgICAgICA6IDB4JXhcbiIsIGlkeCwgaWNlLT5lZXByb20uZGF0YVtpZHhdKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuUmVnaXN0ZXJzOlxuIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBQU0RPVVQwMyAgICAgICAgIDogMHglMDR4XG4iLCAodW5zaWduZWQpaW53KElDRU1UKGljZSwgUk9VVEVfUFNET1VUMDMpKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBDQVBUVVJFICAgICAgICAgIDogMHglMDh4XG4iLCBpbmwoSUNFTVQoaWNlLCBST1VURV9DQVBUVVJFKSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgU1BET1VUICAgICAgICAgICA6IDB4JTA0eFxuIiwgKHVuc2lnbmVkKWludyhJQ0VNVChpY2UsIFJPVVRFX1NQRE9VVCkpKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIFJBVEUgICAgICAgICAgICAgOiAweCUwMnhcbiIsICh1bnNpZ25lZClpbmIoSUNFTVQoaWNlLCBSQVRFKSkpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2ljZTE3MTJfcHJvY19pbml0KGljZTE3MTJfdCAqIGljZSkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGljZS0+Y2FyZCwgImljZTE3MTIiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGljZSwgMTAyNCwgc25kX2ljZTE3MTJfcHJvY19yZWFkKTsKK30KKworLyoKKyAqCisgKi8KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9lZXByb21faW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CisJdWluZm8tPmNvdW50ID0gc2l6ZW9mKGljZTE3MTJfZWVwcm9tX3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2VlcHJvbV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsICZpY2UtPmVlcHJvbSwgc2l6ZW9mKGljZS0+ZWVwcm9tKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKKwkubmFtZSA9ICJJQ0UxNzEyIEVFUFJPTSIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pbmZvID0gc25kX2ljZTE3MTJfZWVwcm9tX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX2VlcHJvbV9nZXQKK307CisKKy8qCisgKi8KK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaWYgKGljZS0+c3BkaWYub3BzLmRlZmF1bHRfZ2V0KQorCQlpY2UtPnNwZGlmLm9wcy5kZWZhdWx0X2dldChpY2UsIHVjb250cm9sKTsgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaWYgKGljZS0+c3BkaWYub3BzLmRlZmF1bHRfcHV0KQorCQlyZXR1cm4gaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9wdXQoaWNlLCB1Y29udHJvbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKKwkuaW5mbyA9CQlzbmRfaWNlMTcxMl9zcGRpZl9pbmZvLAorCS5nZXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdF9nZXQsCisJLnB1dCA9CQlzbmRfaWNlMTcxMl9zcGRpZl9kZWZhdWx0X3B1dAorfTsKKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrY19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpZiAoaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9nZXQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBJRUM5NThfQUVTMF9OT05BVURJTyB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTOworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTCB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMxX0NPTl9DQVRFR09SWTsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSBJRUM5NThfQUVTM19DT05fRlM7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAweGZmOworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0gMHhmZjsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAweGZmOworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1s0XSA9IDB4ZmY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3NwZGlmX21hc2twX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWlmIChpY2UtPnNwZGlmLm9wcy5kZWZhdWx0X2dldCkgeworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IElFQzk1OF9BRVMwX05PTkFVRElPIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzBfUFJPX0ZTIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTOworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IElFQzk1OF9BRVMxX1BST19NT0RFOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAweGZmOworCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IDB4ZmY7CisJCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwkJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbNF0gPSAweGZmOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrYyBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxDT05fTUFTSyksCisJLmluZm8gPQkJc25kX2ljZTE3MTJfc3BkaWZfaW5mbywKKwkuZ2V0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX21hc2tjX2dldCwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUFJPX01BU0spLAorCS5pbmZvID0JCXNuZF9pY2UxNzEyX3NwZGlmX2luZm8sCisJLmdldCA9CQlzbmRfaWNlMTcxMl9zcGRpZl9tYXNrcF9nZXQsCit9OworCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpZiAoaWNlLT5zcGRpZi5vcHMuc3RyZWFtX2dldCkKKwkJaWNlLT5zcGRpZi5vcHMuc3RyZWFtX2dldChpY2UsIHVjb250cm9sKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9zcGRpZl9zdHJlYW1fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaWYgKGljZS0+c3BkaWYub3BzLnN0cmVhbV9wdXQpCisJCXJldHVybiBpY2UtPnNwZGlmLm9wcy5zdHJlYW1fcHV0KGljZSwgdWNvbnRyb2wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbSBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQQ01fU1RSRUFNKSwKKwkuaW5mbyA9CQlzbmRfaWNlMTcxMl9zcGRpZl9pbmZvLAorCS5nZXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfc3RyZWFtX2dldCwKKwkucHV0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbV9wdXQKK307CisKK2ludCBzbmRfaWNlMTcxMl9ncGlvX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfaWNlMTcxMl9ncGlvX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgKDE8PDI0KSkgPyAxIDogMDsKKwkKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSkgJiBtYXNrID8gMSA6IDApIF4gaW52ZXJ0OworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9pY2UxNzEyX2dwaW9fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBtYXNrID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAoMTw8MjQpKSA/IG1hc2sgOiAwOworCXVuc2lnbmVkIGludCB2YWwsIG52YWw7CisKKwlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAoMSA8PCAzMSkpCisJCXJldHVybiAtRVBFUk07CisJbnZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IG1hc2sgOiAwKSBeIGludmVydDsKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdmFsID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisJbnZhbCB8PSB2YWwgJiB+bWFzazsKKwlpZiAodmFsICE9IG52YWwpCisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBudmFsKTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisJcmV0dXJuIHZhbCAhPSBudmFsOworfQorCisvKgorICogIHJhdGUKKyAqLworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwkJIjgwMDAiLAkJLyogMDogNiAqLworCQkiOTYwMCIsCQkvKiAxOiAzICovCisJCSIxMTAyNSIsCS8qIDI6IDEwICovCisJCSIxMjAwMCIsCS8qIDM6IDIgKi8KKwkJIjE2MDAwIiwJLyogNDogNSAqLworCQkiMjIwNTAiLAkvKiA1OiA5ICovCisJCSIyNDAwMCIsCS8qIDY6IDEgKi8KKwkJIjMyMDAwIiwJLyogNzogNCAqLworCQkiNDQxMDAiLAkvKiA4OiA4ICovCisJCSI0ODAwMCIsCS8qIDk6IDAgKi8KKwkJIjY0MDAwIiwJLyogMTA6IDE1ICovCisJCSI4ODIwMCIsCS8qIDExOiAxMSAqLworCQkiOTYwMDAiLAkvKiAxMjogNyAqLworCQkiSUVDOTU4IElucHV0IiwJLyogMTM6IC0tICovCisJfTsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMTQ7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgeGxhdGVbMTZdID0geworCQk5LCA2LCAzLCAxLCA3LCA0LCAwLCAxMiwgOCwgNSwgMiwgMTEsIDI1NSwgMjU1LCAyNTUsIDEwCisJfTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwkKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlpZiAoaXNfc3BkaWZfbWFzdGVyKGljZSkpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDEzOworCX0gZWxzZSB7CisJCXZhbCA9IHhsYXRlW2luYihJQ0VNVChpY2UsIFJBVEUpKSAmIDE1XTsKKwkJaWYgKHZhbCA9PSAyNTUpIHsKKwkJCXNuZF9CVUcoKTsKKwkJCXZhbCA9IDA7CisJCX0KKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RhdGljIHVuc2lnbmVkIGludCB4cmF0ZVsxM10gPSB7CisJCTgwMDAsIDk2MDAsIDExMDI1LCAxMjAwMCwgMTYwMCwgMjIwNTAsIDI0MDAwLAorCQkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwCisJfTsKKwl1bnNpZ25lZCBjaGFyIG92YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlvdmFsID0gaW5iKElDRU1UKGljZSwgUkFURSkpOworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IDEzKSB7CisJCW91dGIob3ZhbCB8IElDRTE3MTJfU1BESUZfTUFTVEVSLCBJQ0VNVChpY2UsIFJBVEUpKTsKKwl9IGVsc2UgeworCQlQUk9fUkFURV9ERUZBVUxUID0geHJhdGVbdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJSAxM107CisJCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJCXNuZF9pY2UxNzEyX3NldF9wcm9fcmF0ZShpY2UsIFBST19SQVRFX0RFRkFVTFQsIDEpOworCQlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwl9CisJY2hhbmdlID0gaW5iKElDRU1UKGljZSwgUkFURSkpICE9IG92YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKworCWlmICgob3ZhbCAmIElDRTE3MTJfU1BESUZfTUFTVEVSKSAhPSAoaW5iKElDRU1UKGljZSwgUkFURSkpICYgSUNFMTcxMl9TUERJRl9NQVNURVIpKSB7CisJCS8qIGNoYW5nZSBDUzg0MjcgY2xvY2sgc291cmNlIHRvbyAqLworCQlpZiAoaWNlLT5jczg0MjcpIHsKKwkJCXNuZF9pY2UxNzEyX2NzODQyN19zZXRfaW5wdXRfY2xvY2soaWNlLCBpc19zcGRpZl9tYXN0ZXIoaWNlKSk7CisJCX0KKwkJLyogbm90aWZ5IGFrNDUyNCBjaGlwIGFzIHdlbGwgKi8KKwkJaWYgKGlzX3NwZGlmX21hc3RlcihpY2UpKSB7CisJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpY2UtPmFrbV9jb2RlY3M7IGkrKykgeworCQkJCWlmIChpY2UtPmFrbVtpXS5vcHMuc2V0X3JhdGVfdmFsKQorCQkJCQlpY2UtPmFrbVtpXS5vcHMuc2V0X3JhdGVfdmFsKCZpY2UtPmFrbVtpXSwgMCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9jayBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIk11bHRpIFRyYWNrIEludGVybmFsIENsb2NrIiwKKwkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19pbmZvLAorCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19kZWZhdWx0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJCSI4MDAwIiwJCS8qIDA6IDYgKi8KKwkJIjk2MDAiLAkJLyogMTogMyAqLworCQkiMTEwMjUiLAkvKiAyOiAxMCAqLworCQkiMTIwMDAiLAkvKiAzOiAyICovCisJCSIxNjAwMCIsCS8qIDQ6IDUgKi8KKwkJIjIyMDUwIiwJLyogNTogOSAqLworCQkiMjQwMDAiLAkvKiA2OiAxICovCisJCSIzMjAwMCIsCS8qIDc6IDQgKi8KKwkJIjQ0MTAwIiwJLyogODogOCAqLworCQkiNDgwMDAiLAkvKiA5OiAwICovCisJCSI2NDAwMCIsCS8qIDEwOiAxNSAqLworCQkiODgyMDAiLAkvKiAxMTogMTEgKi8KKwkJIjk2MDAwIiwJLyogMTI6IDcgKi8KKwkJLy8gIklFQzk1OCBJbnB1dCIsCS8qIDEzOiAtLSAqLworCX07CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDEzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IHZhbDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHhyYXRlWzEzXSA9IHsKKwkJODAwMCwgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwLCAyMjA1MCwgMjQwMDAsCisJCTMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAKKwl9OworCisJZm9yICh2YWwgPSAwOyB2YWwgPCAxMzsgdmFsKyspIHsKKwkJaWYgKHhyYXRlW3ZhbF0gPT0gUFJPX1JBVEVfREVGQVVMVCkKKwkJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCB4cmF0ZVsxM10gPSB7CisJCTgwMDAsIDk2MDAsIDExMDI1LCAxMjAwMCwgMTYwMCwgMjIwNTAsIDI0MDAwLAorCQkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwCisJfTsKKwl1bnNpZ25lZCBjaGFyIG92YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlvdmFsID0gUFJPX1JBVEVfREVGQVVMVDsKKwlQUk9fUkFURV9ERUZBVUxUID0geHJhdGVbdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJSAxM107CisJY2hhbmdlID0gUFJPX1JBVEVfREVGQVVMVCAhPSBvdmFsOworCisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdCBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIk11bHRpIFRyYWNrIEludGVybmFsIENsb2NrIERlZmF1bHQiLAorCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfaW5mbywKKwkuZ2V0ID0gc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfZ2V0LAorCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdF9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZ19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmdfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBQUk9fUkFURV9MT0NLRUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZ19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlID0gMCwgbnZhbDsKKworCW52YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDEgOiAwOworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCWNoYW5nZSA9IFBST19SQVRFX0xPQ0tFRCAhPSBudmFsOworCVBST19SQVRFX0xPQ0tFRCA9IG52YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmcgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIExvY2tpbmciLAorCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZ19pbmZvLAorCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9sb2NraW5nX2dldCwKKwkucHV0ID0gc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZ19wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JhdGVfcmVzZXRfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IFBST19SQVRFX1JFU0VUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwLCBudmFsOworCisJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJY2hhbmdlID0gUFJPX1JBVEVfUkVTRVQgIT0gbnZhbDsKKwlQUk9fUkFURV9SRVNFVCA9IG52YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0IF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBSZXNldCIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldF9pbmZvLAorCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldF9nZXQsCisJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0X3B1dAorfTsKKworLyoKKyAqIHJvdXRpbmcKKyAqLworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fcm91dGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwkJIlBDTSBPdXQiLCAvKiAwICovCisJCSJIL1cgSW4gMCIsICJIL1cgSW4gMSIsICJIL1cgSW4gMiIsICJIL1cgSW4gMyIsIC8qIDEtNCAqLworCQkiSC9XIEluIDQiLCAiSC9XIEluIDUiLCAiSC9XIEluIDYiLCAiSC9XIEluIDciLCAvKiA1LTggKi8KKwkJIklFQzk1OCBJbiBMIiwgIklFQzk1OCBJbiBSIiwgLyogOS0xMCAqLworCQkiRGlnaXRhbCBNaXhlciIsIC8qIDExIC0gb3B0aW9uYWwgKi8KKwl9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWluZm8tPmlkKSA8IDIgPyAxMiA6IDExOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JvdXRlX2FuYWxvZ19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBjdmFsOworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJdmFsID0gaW53KElDRU1UKGljZSwgUk9VVEVfUFNET1VUMDMpKTsKKwljdmFsID0gaW5sKElDRU1UKGljZSwgUk9VVEVfQ0FQVFVSRSkpOworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisKKwl2YWwgPj49ICgoaWR4ICUgMikgKiA4KSArICgoaWR4IC8gMikgKiAyKTsKKwl2YWwgJj0gMzsKKwljdmFsID4+PSAoKGlkeCAvIDIpICogOCkgKyAoKGlkeCAlIDIpICogNCk7CisJaWYgKHZhbCA9PSAxICYmIGlkeCA8IDIpCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAxMTsKKwllbHNlIGlmICh2YWwgPT0gMikKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IChjdmFsICYgNykgKyAxOworCWVsc2UgaWYgKHZhbCA9PSAzKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKChjdmFsID4+IDMpICYgMSkgKyA5OworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JvdXRlX2FuYWxvZ19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UsIHNoaWZ0OworCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBvbGRfdmFsLCBudmFsOworCQorCS8qIHVwZGF0ZSBQU0RPVVQgKi8KKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSAxMSkKKwkJbnZhbCA9IGlkeCA8IDIgPyAxIDogMDsgLyogZGlnIG1peGVyIChvciBwY20pICovCisJZWxzZSBpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSA5KQorCQludmFsID0gMzsgLyogc3BkaWYgaW4gKi8KKwllbHNlIGlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IDEpCisJCW52YWwgPSAyOyAvKiBhbmFsb2cgaW4gKi8KKwllbHNlCisJCW52YWwgPSAwOyAvKiBwY20gKi8KKwlzaGlmdCA9ICgoaWR4ICUgMikgKiA4KSArICgoaWR4IC8gMikgKiAyKTsKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwl2YWwgPSBvbGRfdmFsID0gaW53KElDRU1UKGljZSwgUk9VVEVfUFNET1VUMDMpKTsKKwl2YWwgJj0gfigweDAzIDw8IHNoaWZ0KTsKKwl2YWwgfD0gbnZhbCA8PCBzaGlmdDsKKwljaGFuZ2UgPSB2YWwgIT0gb2xkX3ZhbDsKKwlpZiAoY2hhbmdlKQorCQlvdXR3KHZhbCwgSUNFTVQoaWNlLCBST1VURV9QU0RPVVQwMykpOworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJaWYgKG52YWwgPCAyKSAvKiBkaWcgbWl4ZXIgb2YgcGNtICovCisJCXJldHVybiBjaGFuZ2U7CisKKwkvKiB1cGRhdGUgQ0FQVFVSRSAqLworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXZhbCA9IG9sZF92YWwgPSBpbmwoSUNFTVQoaWNlLCBST1VURV9DQVBUVVJFKSk7CisJc2hpZnQgPSAoKGlkeCAvIDIpICogOCkgKyAoKGlkeCAlIDIpICogNCk7CisJaWYgKG52YWwgPT0gMikgeyAvKiBhbmFsb2cgaW4gKi8KKwkJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gLSAxOworCQl2YWwgJj0gfigweDA3IDw8IHNoaWZ0KTsKKwkJdmFsIHw9IG52YWwgPDwgc2hpZnQ7CisJfSBlbHNlIHsgLyogc3BkaWYgaW4gKi8KKwkJbnZhbCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIC0gOSkgPDwgMzsKKwkJdmFsICY9IH4oMHgwOCA8PCBzaGlmdCk7CisJCXZhbCB8PSBudmFsIDw8IHNoaWZ0OworCX0KKwlpZiAodmFsICE9IG9sZF92YWwpIHsKKwkJY2hhbmdlID0gMTsKKwkJb3V0bCh2YWwsIElDRU1UKGljZSwgUk9VVEVfQ0FQVFVSRSkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3JvdXRlX3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXVuc2lnbmVkIGludCB2YWwsIGN2YWw7CisJdmFsID0gaW53KElDRU1UKGljZSwgUk9VVEVfU1BET1VUKSk7CisJY3ZhbCA9ICh2YWwgPj4gKGlkeCAqIDQgKyA4KSkgJiAweDBmOworCXZhbCA9ICh2YWwgPj4gKGlkeCAqIDIpKSAmIDB4MDM7CisJaWYgKHZhbCA9PSAxKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTE7CisJZWxzZSBpZiAodmFsID09IDIpCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAoY3ZhbCAmIDcpICsgMTsKKwllbHNlIGlmICh2YWwgPT0gMykKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICgoY3ZhbCA+PiAzKSAmIDEpICsgOTsKKwllbHNlCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UsIHNoaWZ0OworCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBvbGRfdmFsLCBudmFsOworCQorCS8qIHVwZGF0ZSBTUERPVVQgKi8KKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwl2YWwgPSBvbGRfdmFsID0gaW53KElDRU1UKGljZSwgUk9VVEVfU1BET1VUKSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gMTEpCisJCW52YWwgPSAxOworCWVsc2UgaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gOSkKKwkJbnZhbCA9IDM7CisJZWxzZSBpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSAxKQorCQludmFsID0gMjsKKwllbHNlCisJCW52YWwgPSAwOworCXNoaWZ0ID0gaWR4ICogMjsKKwl2YWwgJj0gfigweDAzIDw8IHNoaWZ0KTsKKwl2YWwgfD0gbnZhbCA8PCBzaGlmdDsKKwlzaGlmdCA9IGlkeCAqIDQgKyA4OworCWlmIChudmFsID09IDIpIHsKKwkJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gLSAxOworCQl2YWwgJj0gfigweDA3IDw8IHNoaWZ0KTsKKwkJdmFsIHw9IG52YWwgPDwgc2hpZnQ7CisJfSBlbHNlIGlmIChudmFsID09IDMpIHsKKwkJbnZhbCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIC0gOSkgPDwgMzsKKwkJdmFsICY9IH4oMHgwOCA8PCBzaGlmdCk7CisJCXZhbCB8PSBudmFsIDw8IHNoaWZ0OworCX0KKwljaGFuZ2UgPSB2YWwgIT0gb2xkX3ZhbDsKKwlpZiAoY2hhbmdlKQorCQlvdXR3KHZhbCwgSUNFTVQoaWNlLCBST1VURV9TUERPVVQpKTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkgvVyBQbGF5YmFjayBSb3V0ZSIsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcm91dGVfaW5mbywKKwkuZ2V0ID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2FuYWxvZ19nZXQsCisJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9hbmFsb2dfcHV0LAorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJJRUM5NTggUGxheWJhY2sgUm91dGUiLAorCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9zcGRpZl9nZXQsCisJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9zcGRpZl9wdXQsCisJLmNvdW50ID0gMiwKK307CisKKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fdm9sdW1lX3JhdGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMjU1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb192b2x1bWVfcmF0ZV9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGluYihJQ0VNVChpY2UsIE1PTklUT1JfUkFURSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb192b2x1bWVfcmF0ZV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJY2hhbmdlID0gaW5iKElDRU1UKGljZSwgTU9OSVRPUl9SQVRFKSkgIT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJb3V0Yih1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgSUNFTVQoaWNlLCBNT05JVE9SX1JBVEUpKTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3ZvbHVtZV9yYXRlIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTXVsdGkgVHJhY2sgVm9sdW1lIFJhdGUiLAorCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3ZvbHVtZV9yYXRlX2luZm8sCisJLmdldCA9IHNuZF9pY2UxNzEyX3Byb192b2x1bWVfcmF0ZV9nZXQsCisJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb192b2x1bWVfcmF0ZV9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX3BlYWtfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fcGVha19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4OworCQorCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCWZvciAoaWR4ID0gMDsgaWR4IDwgMjI7IGlkeCsrKSB7CisJCW91dGIoaWR4LCBJQ0VNVChpY2UsIE1PTklUT1JfUEVBS0lOREVYKSk7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gPSBpbmIoSUNFTVQoaWNlLCBNT05JVE9SX1BFQUtEQVRBKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcGVha19pbmZvLAorCS5nZXQgPSBzbmRfaWNlMTcxMl9wcm9fcGVha19nZXQKK307CisKKy8qCisgKgorICovCisKKy8qCisgKiBsaXN0IG9mIGF2YWlsYWJsZSBib2FyZHMKKyAqLworc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKmNhcmRfdGFibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkcywKKwlzbmRfaWNlMTcxMl9kZWx0YV9jYXJkcywKKwlzbmRfaWNlMTcxMl9ld3NfY2FyZHMsCisJTlVMTCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9yZWFkX2kyYyhpY2UxNzEyX3QgKmljZSwKKwkJCQkJCSB1bnNpZ25lZCBjaGFyIGRldiwKKwkJCQkJCSB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJbG9uZyB0ID0gMHgxMDAwMDsKKworCW91dGIoYWRkciwgSUNFUkVHKGljZSwgSTJDX0JZVEVfQUREUikpOworCW91dGIoZGV2ICYgfklDRTE3MTJfSTJDX1dSSVRFLCBJQ0VSRUcoaWNlLCBJMkNfREVWX0FERFIpKTsKKwl3aGlsZSAodC0tID4gMCAmJiAoaW5iKElDRVJFRyhpY2UsIEkyQ19DVFJMKSkgJiBJQ0UxNzEyX0kyQ19CVVNZKSkgOworCXJldHVybiBpbmIoSUNFUkVHKGljZSwgSTJDX0RBVEEpKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfcmVhZF9lZXByb20oaWNlMTcxMl90ICppY2UsIGNvbnN0IGNoYXIgKm1vZGVsbmFtZSkKK3sKKwlpbnQgZGV2ID0gMHhhMDsJCS8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBpLCBzaXplOworCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCisJaWYgKCEgbW9kZWxuYW1lIHx8ICEgKm1vZGVsbmFtZSkgeworCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOworCQlpZiAoKGluYihJQ0VSRUcoaWNlLCBJMkNfQ1RSTCkpICYgSUNFMTcxMl9JMkNfRUVQUk9NKSAhPSAwKQorCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAwKSA8PCAwKSB8CisJCQkJKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAxKSA8PCA4KSB8IAorCQkJCShzbmRfaWNlMTcxMl9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMikgPDwgMTYpIHwgCisJCQkJKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAzKSA8PCAyNCk7CisJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gMCB8fCBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gKHVuc2lnbmVkIGludCktMSkgeworCQkJLyogaW52YWxpZCBzdWJ2ZW5kb3IgZnJvbSBFRVBST00sIHRyeSB0aGUgUENJIHN1YnN0c3RlbSBJRCBpbnN0ZWFkICovCisJCQl1MTYgdmVuZG9yLCBkZXZpY2U7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChpY2UtPnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ2ZW5kb3IpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWNlLT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZkZXZpY2UpOworCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKCh1bnNpZ25lZCBpbnQpc3dhYjE2KHZlbmRvcikgPDwgMTYpIHwgc3dhYjE2KGRldmljZSk7CisJCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwgaWNlLT5lZXByb20uc3VidmVuZG9yID09ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MTI6IE5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQl9CisJfQorCWZvciAodGJsID0gY2FyZF90YWJsZXM7ICp0Ymw7IHRibCsrKSB7CisJCWZvciAoYyA9ICp0Ymw7IGMtPnN1YnZlbmRvcjsgYysrKSB7CisJCQlpZiAobW9kZWxuYW1lICYmIGMtPm1vZGVsICYmICEgc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcxMjogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsIGMtPm5hbWUpOworCQkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9IGMtPnN1YnZlbmRvcjsKKwkJCX0gZWxzZSBpZiAoYy0+c3VidmVuZG9yICE9IGljZS0+ZWVwcm9tLnN1YnZlbmRvcikKKwkJCQljb250aW51ZTsKKwkJCWlmICghIGMtPmVlcHJvbV9zaXplIHx8ICEgYy0+ZWVwcm9tX2RhdGEpCisJCQkJZ290byBmb3VuZDsKKwkJCS8qIGlmIHRoZSBFRVBST00gaXMgZ2l2ZW4gYnkgdGhlIGRyaXZlciwgdXNlIGl0ICovCisJCQlzbmRfcHJpbnRkZCgidXNpbmcgdGhlIGRlZmluZWQgZWVwcm9tLi5cbiIpOworCQkJaWNlLT5lZXByb20udmVyc2lvbiA9IDE7CisJCQlpY2UtPmVlcHJvbS5zaXplID0gYy0+ZWVwcm9tX3NpemUgKyA2OworCQkJbWVtY3B5KGljZS0+ZWVwcm9tLmRhdGEsIGMtPmVlcHJvbV9kYXRhLCBjLT5lZXByb21fc2l6ZSk7CisJCQlnb3RvIHJlYWRfc2tpcHBlZDsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBObyBtYXRjaGluZyBtb2RlbCBmb3VuZCBmb3IgSUQgMHgleFxuIiwgaWNlLT5lZXByb20uc3VidmVuZG9yKTsKKworIGZvdW5kOgorCWljZS0+ZWVwcm9tLnNpemUgPSBzbmRfaWNlMTcxMl9yZWFkX2kyYyhpY2UsIGRldiwgMHgwNCk7CisJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQorCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7IC8qIEZJWE1FOiBhbnkgY2FyZHMgd2l0aG91dCB0aGUgY29ycmVjdCBzaXplPyAqLworCWVsc2UgaWYgKGljZS0+ZWVwcm9tLnNpemUgPiAzMikgeworCQlzbmRfcHJpbnRrKCJpbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwgaWNlLT5lZXByb20uc2l6ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpY2UtPmVlcHJvbS52ZXJzaW9uID0gc25kX2ljZTE3MTJfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDUpOworCWlmIChpY2UtPmVlcHJvbS52ZXJzaW9uICE9IDEpIHsKKwkJc25kX3ByaW50aygiaW52YWxpZCBFRVBST00gdmVyc2lvbiAlaVxuIiwgaWNlLT5lZXByb20udmVyc2lvbik7CisJCS8qIHJldHVybiAtRUlPOyAqLworCX0KKwlzaXplID0gaWNlLT5lZXByb20uc2l6ZSAtIDY7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWNlLT5lZXByb20uZGF0YVtpXSA9IHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCBpICsgNik7CisKKyByZWFkX3NraXBwZWQ6CisJaWNlLT5lZXByb20uZ3Bpb21hc2sgPSBpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0dQSU9fTUFTS107CisJaWNlLT5lZXByb20uZ3Bpb3N0YXRlID0gaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9HUElPX1NUQVRFXTsKKwlpY2UtPmVlcHJvbS5ncGlvZGlyID0gaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9HUElPX0RJUl07CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2NoaXBfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlvdXRiKElDRTE3MTJfUkVTRVQgfCBJQ0UxNzEyX05BVElWRSwgSUNFUkVHKGljZSwgQ09OVFJPTCkpOworCXVkZWxheSgyMDApOworCW91dGIoSUNFMTcxMl9OQVRJVkUsIElDRVJFRyhpY2UsIENPTlRST0wpKTsKKwl1ZGVsYXkoMjAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWNlLT5wY2ksIDB4NjAsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQ09ERUNdKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWNlLT5wY2ksIDB4NjEsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQUNMSU5LXSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGljZS0+cGNpLCAweDYyLCBpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0kyU0lEXSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGljZS0+cGNpLCAweDYzLCBpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX1NQRElGXSk7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBJQ0UxNzEyX1NVQkRFVklDRV9TVERTUDI0KSB7CisJCWljZS0+Z3Bpby53cml0ZV9tYXNrID0gaWNlLT5lZXByb20uZ3Bpb21hc2s7CisJCWljZS0+Z3Bpby5kaXJlY3Rpb24gPSBpY2UtPmVlcHJvbS5ncGlvZGlyOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX1dSSVRFX01BU0ssIGljZS0+ZWVwcm9tLmdwaW9tYXNrKTsKKwkJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sIGljZS0+ZWVwcm9tLmdwaW9kaXIpOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIGljZS0+ZWVwcm9tLmdwaW9zdGF0ZSk7CisJfSBlbHNlIHsKKwkJaWNlLT5ncGlvLndyaXRlX21hc2sgPSAweGMwOworCQlpY2UtPmdwaW8uZGlyZWN0aW9uID0gMHhmZjsKKwkJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19XUklURV9NQVNLLCAweGMwKTsKKwkJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04sIDB4ZmYpOworCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEsIElDRTE3MTJfU1REU1AyNF9DTE9DS19CSVQpOworCX0KKwlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19QUk9fUE9XRVJET1dOLCAwKTsKKwlpZiAoIShpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSkgeworCQlvdXRiKElDRTE3MTJfQUM5N19XQVJNLCBJQ0VSRUcoaWNlLCBBQzk3X0NNRCkpOworCQl1ZGVsYXkoMTAwKTsKKwkJb3V0YigwLCBJQ0VSRUcoaWNlLCBBQzk3X0NNRCkpOworCQl1ZGVsYXkoMjAwKTsKKwkJc25kX2ljZTE3MTJfd3JpdGUoaWNlLCBJQ0UxNzEyX0lSRUdfQ09OU1VNRVJfUE9XRVJET1dOLCAwKTsKKwl9CisJc25kX2ljZTE3MTJfc2V0X3Byb19yYXRlKGljZSwgNDgwMDAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2RldmluaXQgc25kX2ljZTE3MTJfc3BkaWZfYnVpbGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpCit7CisJaW50IGVycjsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKworCXNuZF9hc3NlcnQoaWNlLT5wY21fcHJvICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX3NwZGlmX2RlZmF1bHQsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWtjdGwtPmlkLmRldmljZSA9IGljZS0+cGNtX3Byby0+ZGV2aWNlOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfc3BkaWZfbWFza2MsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWtjdGwtPmlkLmRldmljZSA9IGljZS0+cGNtX3Byby0+ZGV2aWNlOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfc3BkaWZfbWFza3AsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWtjdGwtPmlkLmRldmljZSA9IGljZS0+cGNtX3Byby0+ZGV2aWNlOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfc3BkaWZfc3RyZWFtLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlrY3RsLT5pZC5kZXZpY2UgPSBpY2UtPnBjbV9wcm8tPmRldmljZTsKKwlpY2UtPnNwZGlmLnN0cmVhbV9jdGwgPSBrY3RsOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2J1aWxkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfZWVwcm9tLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHQsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmcsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldCwgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoaWNlLT5udW1fdG90YWxfZGFjcyA+IDApIHsKKwkJc25kX2tjb250cm9sX25ld190IHRtcCA9IHNuZF9pY2UxNzEyX21peGVyX3Byb19hbmFsb2dfcm91dGU7CisJCXRtcC5jb3VudCA9IGljZS0+bnVtX3RvdGFsX2RhY3M7CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ0bXAsIGljZSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX21peGVyX3Byb19zcGRpZl9yb3V0ZSwgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3ZvbHVtZV9yYXRlLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3BlYWssIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZnJlZShpY2UxNzEyX3QgKmljZSkKK3sKKwlpZiAoISBpY2UtPnBvcnQpCisJCWdvdG8gX19od19lbmQ7CisJLyogbWFzayBhbGwgaW50ZXJydXB0cyAqLworCW91dGIoMHhjMCwgSUNFTVQoaWNlLCBJUlEpKTsKKwlvdXRiKDB4ZmYsIElDRVJFRyhpY2UsIElSUU1BU0spKTsKKwkvKiAtLS0gKi8KKyAgICAgIF9faHdfZW5kOgorCWlmIChpY2UtPmlycSA+PSAwKSB7CisJCXN5bmNocm9uaXplX2lycShpY2UtPmlycSk7CisJCWZyZWVfaXJxKGljZS0+aXJxLCAodm9pZCAqKSBpY2UpOworCX0KKwlpZiAoaWNlLT5wb3J0KQorCQlwY2lfcmVsZWFzZV9yZWdpb25zKGljZS0+cGNpKTsKKwlzbmRfaWNlMTcxMl9ha200eHh4X2ZyZWUoaWNlKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoaWNlLT5wY2kpOworCWtmcmVlKGljZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJaWNlMTcxMl90ICppY2UgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfaWNlMTcxMl9mcmVlKGljZSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkJc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJY29uc3QgY2hhciAqbW9kZWxuYW1lLAorCQkJCQlpbnQgb21uaSwKKwkJCQkJaW50IGNzODQyN190aW1lb3V0LAorCQkJCQlpY2UxNzEyX3QgKiogcl9pY2UxNzEyKQoreworCWljZTE3MTJfdCAqaWNlOworCWludCBlcnI7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfaWNlMTcxMl9kZXZfZnJlZSwKKwl9OworCisJKnJfaWNlMTcxMiA9IE5VTEw7CisKKyAgICAgICAgLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI4IGJpdHMgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIDB4MGZmZmZmZmYpIDwgMCB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCAweDBmZmZmZmZmKSA8IDApIHsKKwkJc25kX3ByaW50aygiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpY2UgPSBrY2FsbG9jKDEsIHNpemVvZigqaWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGljZSA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWNlLT5vbW5pID0gb21uaSA/IDEgOiAwOworCWlmIChjczg0MjdfdGltZW91dCA8IDEpCisJCWNzODQyN190aW1lb3V0ID0gMTsKKwllbHNlIGlmIChjczg0MjdfdGltZW91dCA+IDEwMDApCisJCWNzODQyN190aW1lb3V0ID0gMTAwMDsKKwlpY2UtPmNzODQyN190aW1lb3V0ID0gY3M4NDI3X3RpbWVvdXQ7CisJc3Bpbl9sb2NrX2luaXQoJmljZS0+cmVnX2xvY2spOworCWluaXRfTVVURVgoJmljZS0+Z3Bpb19tdXRleCk7CisJaW5pdF9NVVRFWCgmaWNlLT5pMmNfbXV0ZXgpOworCWluaXRfTVVURVgoJmljZS0+b3Blbl9tdXRleCk7CisJaWNlLT5ncGlvLnNldF9tYXNrID0gc25kX2ljZTE3MTJfc2V0X2dwaW9fbWFzazsKKwlpY2UtPmdwaW8uc2V0X2RpciA9IHNuZF9pY2UxNzEyX3NldF9ncGlvX2RpcjsKKwlpY2UtPmdwaW8uc2V0X2RhdGEgPSBzbmRfaWNlMTcxMl9zZXRfZ3Bpb19kYXRhOworCWljZS0+Z3Bpby5nZXRfZGF0YSA9IHNuZF9pY2UxNzEyX2dldF9ncGlvX2RhdGE7CisKKwlpY2UtPnNwZGlmLmNzODQwM19iaXRzID0KKwkJaWNlLT5zcGRpZi5jczg0MDNfc3RyZWFtX2JpdHMgPSAoMHgwMSB8CS8qIGNvbnN1bWVyIGZvcm1hdCAqLworCQkJCQkJIDB4MTAgfAkvKiBubyBlbXBoYXNpcyAqLworCQkJCQkJIDB4MjApOwkvKiBQQ00gZW5jb2Rlci9kZWNvZGVyICovCisJaWNlLT5jYXJkID0gY2FyZDsKKwlpY2UtPnBjaSA9IHBjaTsKKwlpY2UtPmlycSA9IC0xOworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGljZS0+cGNpLCAweDQwLCAweDgwN2YpOworCXBjaV93cml0ZV9jb25maWdfd29yZChpY2UtPnBjaSwgMHg0MiwgMHgwMDA2KTsKKwlzbmRfaWNlMTcxMl9wcm9jX2luaXQoaWNlKTsKKwlzeW5jaHJvbml6ZV9pcnEocGNpLT5pcnEpOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIklDRTE3MTIiKSkgPCAwKSB7CisJCWtmcmVlKGljZSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKwlpY2UtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwlpY2UtPmRkbWFfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCWljZS0+ZG1hcGF0aF9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJaWNlLT5wcm9maV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMyk7CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pY2UxNzEyX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiSUNFMTcxMiIsICh2b2lkICopIGljZSkpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF9pY2UxNzEyX2ZyZWUoaWNlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCQorCWljZS0+aXJxID0gcGNpLT5pcnE7CisKKwlpZiAoc25kX2ljZTE3MTJfcmVhZF9lZXByb20oaWNlLCBtb2RlbG5hbWUpIDwgMCkgeworCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoc25kX2ljZTE3MTJfY2hpcF9pbml0KGljZSkgPCAwKSB7CisJCXNuZF9pY2UxNzEyX2ZyZWUoaWNlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLworCW91dGIoKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQ09ERUNdICYgSUNFMTcxMl9DRkdfMnhNUFU0MDEpID09IDAgPyBJQ0UxNzEyX0lSUV9NUFUyIDogMCB8CisJICAgICAoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9DT0RFQ10gJiBJQ0UxNzEyX0NGR19OT19DT05fQUM5NykgPyBJQ0UxNzEyX0lSUV9QQktEUyB8IElDRTE3MTJfSVJRX0NPTkNBUCB8IElDRTE3MTJfSVJRX0NPTlBCSyA6IDAsCisJICAgICBJQ0VSRUcoaWNlLCBJUlFNQVNLKSk7CisJb3V0YigweDAwLCBJQ0VNVChpY2UsIElSUSkpOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcykpIDwgMCkgeworCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CisgCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyX2ljZTE3MTIgPSBpY2U7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCisgKiBSZWdpc3RyYXRpb24KKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gbm9fbWF0Y2hlZCBfX2RldmluaXRkYXRhOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJaWNlMTcxMl90ICppY2U7CisJaW50IHBjbV9kZXYgPSAwLCBlcnI7CisJc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0UxNzEyIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIklDRW5zZW1ibGUgSUNFMTcxMiIpOworCQorCWlmICgoZXJyID0gc25kX2ljZTE3MTJfY3JlYXRlKGNhcmQsIHBjaSwgbW9kZWxbZGV2XSwgb21uaVtkZXZdLCBjczg0MjdfdGltZW91dFtkZXZdLCAmaWNlKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yICh0YmwgPSBjYXJkX3RhYmxlczsgKnRibDsgdGJsKyspIHsKKwkJZm9yIChjID0gKnRibDsgYy0+c3VidmVuZG9yOyBjKyspIHsKKwkJCWlmIChjLT5zdWJ2ZW5kb3IgPT0gaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJCQkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgYy0+bmFtZSk7CisJCQkJaWYgKGMtPmRyaXZlcikgLyogc3BlY2lmaWMgZHJpdmVyPyAqLworCQkJCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBjLT5kcml2ZXIpOworCQkJCWlmIChjLT5jaGlwX2luaXQpIHsKKwkJCQkJaWYgKChlcnIgPSBjLT5jaGlwX2luaXQoaWNlKSkgPCAwKSB7CisJCQkJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJCQkJcmV0dXJuIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCQlnb3RvIF9fZm91bmQ7CisJCQl9CisJCX0KKwl9CisJYyA9ICZub19tYXRjaGVkOworIF9fZm91bmQ6CisKKwlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX3BjbV9wcm9maShpY2UsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoaWNlX2hhc19jb25fYWM5NyhpY2UpKQorCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX3BjbShpY2UsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCWlmICgoZXJyID0gc25kX2ljZTE3MTJfYWM5N19taXhlcihpY2UpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2J1aWxkX2NvbnRyb2xzKGljZSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChjLT5idWlsZF9jb250cm9scykgeworCQlpZiAoKGVyciA9IGMtPmJ1aWxkX2NvbnRyb2xzKGljZSkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoaWNlX2hhc19jb25fYWM5NyhpY2UpKQorCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX3BjbV9kcyhpY2UsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCWlmICghIGMtPm5vX21wdTQwMSkgeworCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0lDRTE3MTIsCisJCQkJCSAgICAgICBJQ0VSRUcoaWNlLCBNUFUxX0NUUkwpLCAxLAorCQkJCQkgICAgICAgaWNlLT5pcnEsIDAsCisJCQkJCSAgICAgICAmaWNlLT5ybWlkaVswXSkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9DT0RFQ10gJiBJQ0UxNzEyX0NGR18yeE1QVTQwMSkKKwkJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKKwkJCQkJCSAgICAgICBJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLCAxLAorCQkJCQkJICAgICAgIGljZS0+aXJxLCAwLAorCQkJCQkJICAgICAgICZpY2UtPnJtaWRpWzFdKSkgPCAwKSB7CisJCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCX0KKworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBpY2UtPnBvcnQsIGljZS0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9pY2UxNzEyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIklDRTE3MTIiLAorCS5pZF90YWJsZSA9IHNuZF9pY2UxNzEyX2lkcywKKwkucHJvYmUgPSBzbmRfaWNlMTcxMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2ljZTE3MTJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9pY2UxNzEyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2ljZTE3MTJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2ljZTE3MTJfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9pY2UxNzEyX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMWM1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaApAQCAtMCwwICsxLDQ5NCBAQAorI2lmbmRlZiBfX1NPVU5EX0lDRTE3MTJfSAorI2RlZmluZSBfX1NPVU5EX0lDRTE3MTJfSAorCisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9pMmMuaD4KKyNpbmNsdWRlIDxzb3VuZC9hazR4eHgtYWRkYS5oPgorI2luY2x1ZGUgPHNvdW5kL2FrNDExNC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorCisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgSUNFUkVHKGljZSwgeCkgKChpY2UpLT5wb3J0ICsgSUNFMTcxMl9SRUdfIyN4KQorCisjZGVmaW5lIElDRTE3MTJfUkVHX0NPTlRST0wJCTB4MDAJLyogYnl0ZSAqLworI2RlZmluZSAgIElDRTE3MTJfUkVTRVQJCQkweDgwCS8qIHJlc2V0IHdob2xlIGNoaXAgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX1NFUlJfTEVWRUwJCTB4MDQJLyogU0VSUiMgbGV2ZWwgb3RoZXJ3aXNlIGVkZ2UgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX05BVElWRQkJMHgwMQkvKiBuYXRpdmUgbW9kZSBvdGhlcndpc2UgU0IgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfSVJRTUFTSwkJMHgwMQkvKiBieXRlICovCisjZGVmaW5lICAgSUNFMTcxMl9JUlFfTVBVMQkJMHg4MAorI2RlZmluZSAgIElDRTE3MTJfSVJRX1RJTUVSCQkweDQwCisjZGVmaW5lICAgSUNFMTcxMl9JUlFfTVBVMgkJMHgyMAorI2RlZmluZSAgIElDRTE3MTJfSVJRX1BST1BDTQkJMHgxMAorI2RlZmluZSAgIElDRTE3MTJfSVJRX0ZNCQkweDA4CS8qIEZNL01JREkgLSBsZWdhY3kgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0lSUV9QQktEUwkJMHgwNAkvKiBwbGF5YmFjayBEUyBjaGFubmVscyAqLworI2RlZmluZSAgIElDRTE3MTJfSVJRX0NPTkNBUAkJMHgwMgkvKiBjb25zdW1lciBjYXB0dXJlICovCisjZGVmaW5lICAgSUNFMTcxMl9JUlFfQ09OUEJLCQkweDAxCS8qIGNvbnN1bWVyIHBsYXliYWNrICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0lSUVNUQVQJCTB4MDIJLyogYnl0ZSAqLworLyogbG9vayB0byBJQ0UxNzEyX0lSUV8qICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0lOREVYCQkweDAzCS8qIGJ5dGUgLSBpbmRpcmVjdCBDQ0l4eCByZWdzICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0RBVEEJCTB4MDQJLyogYnl0ZSAtIGluZGlyZWN0IENDSXh4IHJlZ3MgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfTk1JX1NUQVQxCQkweDA1CS8qIGJ5dGUgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfTk1JX0RBVEEJCTB4MDYJLyogYnl0ZSAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19OTUlfSU5ERVgJCTB4MDcJLyogYnl0ZSAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19BQzk3X0lOREVYCQkweDA4CS8qIGJ5dGUgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfQUM5N19DTUQJCTB4MDkJLyogYnl0ZSAqLworI2RlZmluZSAgIElDRTE3MTJfQUM5N19DT0xECQkweDgwCS8qIGNvbGQgcmVzZXQgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0FDOTdfV0FSTQkJMHg0MAkvKiB3YXJtIHJlc2V0ICovCisjZGVmaW5lICAgSUNFMTcxMl9BQzk3X1dSSVRFCQkweDIwCS8qIFc6IHdyaXRlLCBSOiB3cml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSAgIElDRTE3MTJfQUM5N19SRUFECQkweDEwCS8qIFc6IHJlYWQsIFI6IHJlYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0FDOTdfUkVBRFkJCTB4MDgJLyogY29kZWMgcmVhZHkgc3RhdHVzIGJpdCAqLworI2RlZmluZSAgIElDRTE3MTJfQUM5N19QQktfVlNSCQkweDAyCS8qIHBsYXliYWNrIFZTUiAqLworI2RlZmluZSAgIElDRTE3MTJfQUM5N19DQVBfVlNSCQkweDAxCS8qIGNhcHR1cmUgVlNSICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0FDOTdfREFUQQkJMHgwYQkvKiB3b3JkIChsaXR0bGUgZW5kaWFuKSAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19NUFUxX0NUUkwJCTB4MGMJLyogYnl0ZSAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19NUFUxX0RBVEEJCTB4MGQJLyogYnl0ZSAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19JMkNfREVWX0FERFIJMHgxMAkvKiBieXRlICovCisjZGVmaW5lICAgSUNFMTcxMl9JMkNfV1JJVEUJCTB4MDEJLyogd3JpdGUgZGlyZWN0aW9uICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0kyQ19CWVRFX0FERFIJMHgxMQkvKiBieXRlICovCisjZGVmaW5lIElDRTE3MTJfUkVHX0kyQ19EQVRBCQkweDEyCS8qIGJ5dGUgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfSTJDX0NUUkwJCTB4MTMJLyogYnl0ZSAqLworI2RlZmluZSAgIElDRTE3MTJfSTJDX0VFUFJPTQkJMHg4MAkvKiBFRVBST00gZXhpc3RzICovCisjZGVmaW5lICAgSUNFMTcxMl9JMkNfQlVTWQkJMHgwMQkvKiBidXN5IGJpdCAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19DT05DQVBfQUREUgkJMHgxNAkvKiBkd29yZCAtIGNvbnN1bWVyIGNhcHR1cmUgKi8KKyNkZWZpbmUgSUNFMTcxMl9SRUdfQ09OQ0FQX0NPVU5UCTB4MTgJLyogd29yZCAtIGN1cnJlbnQvYmFzZSBjb3VudCAqLworI2RlZmluZSBJQ0UxNzEyX1JFR19TRVJSX1NIQURPVwkJMHgxYgkvKiBieXRlICovCisjZGVmaW5lIElDRTE3MTJfUkVHX01QVTJfQ1RSTAkJMHgxYwkvKiBieXRlICovCisjZGVmaW5lIElDRTE3MTJfUkVHX01QVTJfREFUQQkJMHgxZAkvKiBieXRlICovCisjZGVmaW5lIElDRTE3MTJfUkVHX1RJTUVSCQkweDFlCS8qIHdvcmQgKi8KKworLyoKKyAqICBJbmRpcmVjdCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIElDRTE3MTJfSVJFR19QQktfQ09VTlRfTE8JMHgwMAorI2RlZmluZSBJQ0UxNzEyX0lSRUdfUEJLX0NPVU5UX0hJCTB4MDEKKyNkZWZpbmUgSUNFMTcxMl9JUkVHX1BCS19DVFJMCQkweDAyCisjZGVmaW5lIElDRTE3MTJfSVJFR19QQktfTEVGVAkJMHgwMwkvKiBsZWZ0IHZvbHVtZSAqLworI2RlZmluZSBJQ0UxNzEyX0lSRUdfUEJLX1JJR0hUCQkweDA0CS8qIHJpZ2h0IHZvbHVtZSAqLworI2RlZmluZSBJQ0UxNzEyX0lSRUdfUEJLX1NPRlQJCTB4MDUJLyogc29mdCB2b2x1bWUgKi8KKyNkZWZpbmUgSUNFMTcxMl9JUkVHX1BCS19SQVRFX0xPCTB4MDYKKyNkZWZpbmUgSUNFMTcxMl9JUkVHX1BCS19SQVRFX01JRAkweDA3CisjZGVmaW5lIElDRTE3MTJfSVJFR19QQktfUkFURV9ISQkweDA4CisjZGVmaW5lIElDRTE3MTJfSVJFR19DQVBfQ09VTlRfTE8JMHgxMAorI2RlZmluZSBJQ0UxNzEyX0lSRUdfQ0FQX0NPVU5UX0hJCTB4MTEKKyNkZWZpbmUgSUNFMTcxMl9JUkVHX0NBUF9DVFJMCQkweDEyCisjZGVmaW5lIElDRTE3MTJfSVJFR19HUElPX0RBVEEJCTB4MjAKKyNkZWZpbmUgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSwkweDIxCisjZGVmaW5lIElDRTE3MTJfSVJFR19HUElPX0RJUkVDVElPTgkweDIyCisjZGVmaW5lIElDRTE3MTJfSVJFR19DT05TVU1FUl9QT1dFUkRPV04JMHgzMAorI2RlZmluZSBJQ0UxNzEyX0lSRUdfUFJPX1BPV0VSRE9XTgkweDMxCisKKy8qCisgKiAgQ29uc3VtZXIgc2VjdGlvbiBkaXJlY3QgRE1BIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgSUNFRFMoaWNlLCB4KSAoKGljZSktPmRtYXBhdGhfcG9ydCArIElDRTE3MTJfRFNfIyN4KQorIAorI2RlZmluZSBJQ0UxNzEyX0RTX0lOVE1BU0sJCTB4MDAJLyogd29yZCAtIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIElDRTE3MTJfRFNfSU5UU1RBVAkJMHgwMgkvKiB3b3JkIC0gaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJQ0UxNzEyX0RTX0RBVEEJCQkweDA0CS8qIGR3b3JkIC0gY2hhbm5lbCBkYXRhICovCisjZGVmaW5lIElDRTE3MTJfRFNfSU5ERVgJCTB4MDgJLyogZHdvcmQgLSBjaGFubmVsIGluZGV4ICovCisKKy8qCisgKiAgQ29uc3VtZXIgc2VjdGlvbiBjaGFubmVsIHJlZ2lzdGVycworICovCisgCisjZGVmaW5lIElDRTE3MTJfRFNDX0FERFIwCQkweDAwCS8qIGR3b3JkIC0gYmFzZSBhZGRyZXNzIDAgKi8KKyNkZWZpbmUgSUNFMTcxMl9EU0NfQ09VTlQwCQkweDAxCS8qIHdvcmQgLSBjb3VudCAwICovCisjZGVmaW5lIElDRTE3MTJfRFNDX0FERFIxCQkweDAyCS8qIGR3b3JkIC0gYmFzZSBhZGRyZXNzIDEgKi8KKyNkZWZpbmUgSUNFMTcxMl9EU0NfQ09VTlQxCQkweDAzCS8qIHdvcmQgLSBjb3VudCAxICovCisjZGVmaW5lIElDRTE3MTJfRFNDX0NPTlRST0wJCTB4MDQJLyogYnl0ZSAtIGNvbnRyb2wgJiBzdGF0dXMgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0JVRkZFUjEJCTB4ODAJLyogYnVmZmVyMSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0JVRkZFUjFfQVVUTwkJMHg0MAkvKiBidWZmZXIxIGF1dG8gaW5pdCAqLworI2RlZmluZSAgIElDRTE3MTJfQlVGRkVSMF9BVVRPCQkweDIwCS8qIGJ1ZmZlcjAgYXV0byBpbml0ICovCisjZGVmaW5lICAgSUNFMTcxMl9GTFVTSAkJCTB4MTAJLyogZmx1c2ggRklGTyAqLworI2RlZmluZSAgIElDRTE3MTJfU1RFUkVPCQkweDA4CS8qIHN0ZXJlbyAqLworI2RlZmluZSAgIElDRTE3MTJfMTZCSVQJCQkweDA0CS8qIDE2LWJpdCBkYXRhICovCisjZGVmaW5lICAgSUNFMTcxMl9QQVVTRQkJCTB4MDIJLyogcGF1c2UgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX1NUQVJUCQkJMHgwMQkvKiBzdGFydCAqLworI2RlZmluZSBJQ0UxNzEyX0RTQ19SQVRFCQkweDA1CS8qIGR3b3JkIC0gcmF0ZSAqLworI2RlZmluZSBJQ0UxNzEyX0RTQ19WT0xVTUUJCTB4MDYJLyogd29yZCAtIHZvbHVtZSBjb250cm9sICovCisKKy8qIAorICogIFByb2Zlc3Npb25hbCBtdWx0aS10cmFjayBkaXJlY3QgY29udHJvbCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIElDRU1UKGljZSwgeCkgKChpY2UpLT5wcm9maV9wb3J0ICsgSUNFMTcxMl9NVF8jI3gpCisKKyNkZWZpbmUgSUNFMTcxMl9NVF9JUlEJCQkweDAwCS8qIGJ5dGUgLSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgIElDRTE3MTJfTVVMVElfQ0FQVFVSRQkJMHg4MAkvKiBjYXB0dXJlIElSUSAqLworI2RlZmluZSAgIElDRTE3MTJfTVVMVElfUExBWUJBQ0sJMHg0MAkvKiBwbGF5YmFjayBJUlEgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX01VTFRJX0NBUFNUQVRVUwkweDAyCS8qIGNhcHR1cmUgSVJRIHN0YXR1cyAqLworI2RlZmluZSAgIElDRTE3MTJfTVVMVElfUEJLU1RBVFVTCTB4MDEJLyogcGxheWJhY2sgSVJRIHN0YXR1cyAqLworI2RlZmluZSBJQ0UxNzEyX01UX1JBVEUJCQkweDAxCS8qIGJ5dGUgLSBzYW1wbGluZyByYXRlIHNlbGVjdCAqLworI2RlZmluZSAgIElDRTE3MTJfU1BESUZfTUFTVEVSCQkweDEwCS8qIFMvUERJRiBpbnB1dCBpcyBtYXN0ZXIgY2xvY2sgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9JMlNfRk9STUFUCQkweDAyCS8qIGJ5dGUgLSBJMlMgZGF0YSBmb3JtYXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9BQzk3X0lOREVYCQkweDA0CS8qIGJ5dGUgLSBBQyc5NyBpbmRleCAqLworI2RlZmluZSBJQ0UxNzEyX01UX0FDOTdfQ01ECQkweDA1CS8qIGJ5dGUgLSBBQyc5NyBjb21tYW5kICYgc3RhdHVzICovCisvKiBsb29rIHRvIElDRTE3MTJfQUM5N18qICovCisjZGVmaW5lIElDRTE3MTJfTVRfQUM5N19EQVRBCQkweDA2CS8qIHdvcmQgLSBBQyc5NyBkYXRhICovCisjZGVmaW5lIElDRTE3MTJfTVRfUExBWUJBQ0tfQUREUgkweDEwCS8qIGR3b3JkIC0gcGxheWJhY2sgYWRkcmVzcyAqLworI2RlZmluZSBJQ0UxNzEyX01UX1BMQVlCQUNLX1NJWkUJMHgxNAkvKiB3b3JkIC0gcGxheWJhY2sgc2l6ZSAqLworI2RlZmluZSBJQ0UxNzEyX01UX1BMQVlCQUNLX0NPVU5UCTB4MTYJLyogd29yZCAtIHBsYXliYWNrIGNvdW50ICovCisjZGVmaW5lIElDRTE3MTJfTVRfUExBWUJBQ0tfQ09OVFJPTAkweDE4CS8qIGJ5dGUgLSBjb250cm9sICovCisjZGVmaW5lICAgSUNFMTcxMl9DQVBUVVJFX1NUQVJUX1NIQURPVwkweDA0CS8qIGNhcHR1cmUgc3RhcnQgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX1BMQVlCQUNLX1BBVVNFCTB4MDIJLyogcGxheWJhY2sgcGF1c2UgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX1BMQVlCQUNLX1NUQVJUCTB4MDEJLyogcGxheWJhY2sgc3RhcnQgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9DQVBUVVJFX0FERFIJCTB4MjAJLyogZHdvcmQgLSBjYXB0dXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9DQVBUVVJFX1NJWkUJCTB4MjQJLyogd29yZCAtIGNhcHR1cmUgc2l6ZSAqLworI2RlZmluZSBJQ0UxNzEyX01UX0NBUFRVUkVfQ09VTlQJMHgyNgkvKiB3b3JkIC0gY2FwdHVyZSBjb3VudCAqLworI2RlZmluZSBJQ0UxNzEyX01UX0NBUFRVUkVfQ09OVFJPTAkweDI4CS8qIGJ5dGUgLSBjb250cm9sICovCisjZGVmaW5lICAgSUNFMTcxMl9DQVBUVVJFX1NUQVJUCQkweDAxCS8qIGNhcHR1cmUgc3RhcnQgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9ST1VURV9QU0RPVVQwMwkweDMwCS8qIHdvcmQgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9ST1VURV9TUERPVVQJCTB4MzIJLyogd29yZCAqLworI2RlZmluZSBJQ0UxNzEyX01UX1JPVVRFX0NBUFRVUkUJMHgzNAkvKiBkd29yZCAqLworI2RlZmluZSBJQ0UxNzEyX01UX01PTklUT1JfVk9MVU1FCTB4MzgJLyogd29yZCAqLworI2RlZmluZSBJQ0UxNzEyX01UX01PTklUT1JfSU5ERVgJMHgzYQkvKiBieXRlICovCisjZGVmaW5lIElDRTE3MTJfTVRfTU9OSVRPUl9SQVRFCQkweDNiCS8qIGJ5dGUgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9NT05JVE9SX1JPVVRFQ1RSTAkweDNjCS8qIGJ5dGUgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX1JPVVRFX0FDOTcJCTB4MDEJLyogcm91dGUgZGlnaXRhbCBtaXhlciBvdXRwdXQgdG8gQUMnOTcgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9NT05JVE9SX1BFQUtJTkRFWAkweDNlCS8qIGJ5dGUgKi8KKyNkZWZpbmUgSUNFMTcxMl9NVF9NT05JVE9SX1BFQUtEQVRBCTB4M2YJLyogYnl0ZSAqLworCisvKgorICogIENvZGVjIGNvbmZpZ3VyYXRpb24gYml0cworICovCisKKy8qIFBDSVs2MF0gU3lzdGVtIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSUNFMTcxMl9DRkdfQ0xPQ0sJMHhjMAorI2RlZmluZSAgIElDRTE3MTJfQ0ZHX0NMT0NLNTEyCTB4MDAJLyogMjIuNTY5Mk1oeiwgNDQuMWtIeio1MTIgKi8KKyNkZWZpbmUgICBJQ0UxNzEyX0NGR19DTE9DSzM4NCAgMHg0MAkvKiAxNi45MzQ0TWh6LCA0NC4xa0h6KjM4NCAqLworI2RlZmluZSAgIElDRTE3MTJfQ0ZHX0VYVAkweDgwCS8qIGV4dGVybmFsIGNsb2NrICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxCTB4MjAJLyogdHdvIE1QVTQwMSBVQVJUcyAqLworI2RlZmluZSBJQ0UxNzEyX0NGR19OT19DT05fQUM5NyAweDEwCS8qIGNvbnN1bWVyIEFDJzk3IGNvZGVjIGlzIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHX0FEQ19NQVNLCTB4MGMJLyogb25lLCB0d28sIHRocmVlLCBmb3VyIHN0ZXJlbyBBRENzICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHX0RBQ19NQVNLCTB4MDMJLyogb25lLCB0d28sIHRocmVlLCBmb3VyIHN0ZXJlbyBEQUNzICovCisvKiBQQ0lbNjFdIEFDLUxpbmsgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBJQ0UxNzEyX0NGR19QUk9fSTJTCTB4ODAJLyogbXVsdGl0cmFjayBjb252ZXJ0ZXI6IEkyUyBvciBBQyc5NyAqLworI2RlZmluZSBJQ0UxNzEyX0NGR19BQzk3X1BBQ0tFRAkweDAxCS8qIHNwbGl0IG9yIHBhY2tlZCBtb2RlIC0gQUMnOTcgKi8KKy8qIFBDSVs2Ml0gSTJTIEZlYXR1cmVzICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHX0kyU19WT0xVTUUJMHg4MAkvKiB2b2x1bWUvbXV0ZSBjYXBhYmlsaXR5ICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHX0kyU185NktIWgkweDQwCS8qIHN1cHBvcnRzIDk2a0h6IHNhbXBsaW5nICovCisjZGVmaW5lIElDRTE3MTJfQ0ZHX0kyU19SRVNNQVNLCTB4MzAJLyogcmVzb2x1dGlvbiBtYXNrLCAxNiwxOCwyMCwyNC1iaXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9DRkdfSTJTX09USEVSCTB4MGYJLyogb3RoZXIgSTJTIElEcyAqLworLyogUENJWzYzXSBTL1BESUYgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBJQ0UxNzEyX0NGR19JMlNfQ0hJUElECTB4ZmMJLyogSTJTIGNoaXAgSUQgKi8KKyNkZWZpbmUgSUNFMTcxMl9DRkdfU1BESUZfSU4JMHgwMgkvKiBTL1BESUYgaW5wdXQgaXMgcHJlc2VudCAqLworI2RlZmluZSBJQ0UxNzEyX0NGR19TUERJRl9PVVQJMHgwMQkvKiBTL1BESUYgb3V0cHV0IGlzIHByZXNlbnQgKi8KKworLyoKKyAqIERNQSBtb2RlIHZhbHVlcworICogaWRlbnRpY2FsIHdpdGggRE1BX1hYWCBvbiBpMzg2IGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBJQ0UxNzEyX0RNQV9NT0RFX1dSSVRFCQkweDQ4CisjZGVmaW5lIElDRTE3MTJfRE1BX0FVVE9JTklUCQkweDEwCisKKworLyoKKyAqICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfc25kX2ljZTE3MTIgaWNlMTcxMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YnZlbmRvcjsJLyogUENJWzJjLTJmXSAqLworCXVuc2lnbmVkIGNoYXIgc2l6ZTsJLyogc2l6ZSBvZiBFRVBST00gaW1hZ2UgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CS8qIG11c3QgYmUgMSAob3IgMiBmb3IgdnQxNzI0KSAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVszMl07CisJdW5zaWduZWQgaW50IGdwaW9tYXNrOworCXVuc2lnbmVkIGludCBncGlvc3RhdGU7CisJdW5zaWduZWQgaW50IGdwaW9kaXI7Cit9IGljZTE3MTJfZWVwcm9tX3Q7CisKK2VudW0geworCUlDRV9FRVAxX0NPREVDID0gMCwJLyogMDYgKi8KKwlJQ0VfRUVQMV9BQ0xJTkssCS8qIDA3ICovCisJSUNFX0VFUDFfSTJTSUQsCQkvKiAwOCAqLworCUlDRV9FRVAxX1NQRElGLAkJLyogMDkgKi8KKwlJQ0VfRUVQMV9HUElPX01BU0ssCS8qIDBhICovCisJSUNFX0VFUDFfR1BJT19TVEFURSwJLyogMGIgKi8KKwlJQ0VfRUVQMV9HUElPX0RJUiwJLyogMGMgKi8KKwlJQ0VfRUVQMV9BQzk3X01BSU5fTE8sCS8qIDBkICovCisJSUNFX0VFUDFfQUM5N19NQUlOX0hJLAkvKiAwZSAqLworCUlDRV9FRVAxX0FDOTdfUENNX0xPLAkvKiAwZiAqLworCUlDRV9FRVAxX0FDOTdfUENNX0hJLAkvKiAxMCAqLworCUlDRV9FRVAxX0FDOTdfUkVDX0xPLAkvKiAxMSAqLworCUlDRV9FRVAxX0FDOTdfUkVDX0hJLAkvKiAxMiAqLworCUlDRV9FRVAxX0FDOTdfUkVDU1JDLAkvKiAxMyAqLworCUlDRV9FRVAxX0RBQ19JRCwJLyogMTQgKi8KKwlJQ0VfRUVQMV9EQUNfSUQxLAorCUlDRV9FRVAxX0RBQ19JRDIsCisJSUNFX0VFUDFfREFDX0lEMywKKwlJQ0VfRUVQMV9BRENfSUQsCS8qIDE4ICovCisJSUNFX0VFUDFfQURDX0lEMSwKKwlJQ0VfRUVQMV9BRENfSUQyLAorCUlDRV9FRVAxX0FEQ19JRDMKK307CisJCisjZGVmaW5lIGljZV9oYXNfY29uX2FjOTcoaWNlKQkoISgoaWNlKS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQ09ERUNdICYgSUNFMTcxMl9DRkdfTk9fQ09OX0FDOTcpKQorCisKK3N0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBjaWY6IDE7CQkvKiBDSUYgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIgY2FkZHI7CQkvKiBDMCBhbmQgQzEgYml0cyAqLworCXVuc2lnbmVkIGludCBkYXRhX21hc2s7CQkvKiBEQVRBIGdwaW8gYml0ICovCisJdW5zaWduZWQgaW50IGNsa19tYXNrOwkJLyogQ0xLIGdwaW8gYml0ICovCisJdW5zaWduZWQgaW50IGNzX21hc2s7CQkvKiBiaXQgbWFzayBmb3Igc2VsZWN0L2Rlc2VsZWN0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgY3NfYWRkcjsJCS8qIGJpdHMgdG8gc2VsZWN0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgY3Nfbm9uZTsJCS8qIGJpdHMgdG8gZGVzZWxlY3QgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBhZGRfZmxhZ3M7CQkvKiBhZGRpdGlvbmFsIGJpdHMgYXQgaW5pdCAqLworCXVuc2lnbmVkIGludCBtYXNrX2ZsYWdzOwkvKiB0b3RhbCBtYXNrIGJpdHMgKi8KKwlzdHJ1Y3Qgc25kX2FrbTR4eHhfb3BzIHsKKwkJdm9pZCAoKnNldF9yYXRlX3ZhbCkoYWttNHh4eF90ICphaywgdW5zaWduZWQgaW50IHJhdGUpOworCX0gb3BzOworfTsKKworc3RydWN0IHNuZF9pY2UxNzEyX3NwZGlmIHsKKwl1bnNpZ25lZCBjaGFyIGNzODQwM19iaXRzOworCXVuc2lnbmVkIGNoYXIgY3M4NDAzX3N0cmVhbV9iaXRzOworCXNuZF9rY29udHJvbF90ICpzdHJlYW1fY3RsOworCisJc3RydWN0IHNuZF9pY2UxNzEyX3NwZGlmX29wcyB7CisJCXZvaWQgKCpvcGVuKShpY2UxNzEyX3QgKiwgc25kX3BjbV9zdWJzdHJlYW1fdCAqKTsKKwkJdm9pZCAoKnNldHVwX3JhdGUpKGljZTE3MTJfdCAqLCBpbnQgcmF0ZSk7CisJCXZvaWQgKCpjbG9zZSkoaWNlMTcxMl90ICosIHNuZF9wY21fc3Vic3RyZWFtX3QgKik7CisJCXZvaWQgKCpkZWZhdWx0X2dldCkoaWNlMTcxMl90ICosIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworCQlpbnQgKCpkZWZhdWx0X3B1dCkoaWNlMTcxMl90ICosIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworCQl2b2lkICgqc3RyZWFtX2dldCkoaWNlMTcxMl90ICosIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworCQlpbnQgKCpzdHJlYW1fcHV0KShpY2UxNzEyX3QgKiwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCk7CisJfSBvcHM7Cit9OworCisKK3N0cnVjdCBfc25kX2ljZTE3MTIgeworCXVuc2lnbmVkIGxvbmcgY29ucF9kbWFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGNvbmNfZG1hX3NpemU7CisJdW5zaWduZWQgbG9uZyBwcm9wX2RtYV9zaXplOworCXVuc2lnbmVkIGxvbmcgcHJvY19kbWFfc2l6ZTsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBwb3J0OworCXVuc2lnbmVkIGxvbmcgZGRtYV9wb3J0OworCXVuc2lnbmVkIGxvbmcgZG1hcGF0aF9wb3J0OworCXVuc2lnbmVkIGxvbmcgcHJvZmlfcG9ydDsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfcGNtX3QgKnBjbV9kczsKKwlzbmRfcGNtX3QgKnBjbV9wcm87CisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX2Nvbl9zdWJzdHJlYW07CisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbNl07CisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKmNhcHR1cmVfY29uX3N1YnN0cmVhbTsKKyAgICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqcGxheWJhY2tfcHJvX3N1YnN0cmVhbTsKKyAgICAgICAgc25kX3BjbV9zdWJzdHJlYW1fdCAqY2FwdHVyZV9wcm9fc3Vic3RyZWFtOworCXVuc2lnbmVkIGludCBwbGF5YmFja19wcm9fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY2FwdHVyZV9wcm9fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfY29uX3ZpcnRfYWRkcls2XTsKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfY29uX2FjdGl2ZV9idWZbNl07CisJdW5zaWduZWQgaW50IGNhcHR1cmVfY29uX3ZpcnRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYWM5N19leHRfaWQ7CisJYWM5N190ICphYzk3OworCXNuZF9yYXdtaWRpX3QgKnJtaWRpWzJdOworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzbmRfaW5mb19lbnRyeV90ICpwcm9jX2VudHJ5OworCisJaWNlMTcxMl9lZXByb21fdCBlZXByb207CisKKwl1bnNpZ25lZCBpbnQgcHJvX3ZvbHVtZXNbMjBdOworCXVuc2lnbmVkIGludCBvbW5pOiAxOwkJLyogRGVsdGEgT21uaSBJL08gKi8KKwl1bnNpZ25lZCBpbnQgdnQxNzI0OiAxOworCXVuc2lnbmVkIGludCB2dDE3MjA6IDE7CisJdW5zaWduZWQgaW50IGhhc19zcGRpZjogMTsJLyogVlQxNzIwLzQgLSBoYXMgU1BESUYgSS9PICovCisJdW5zaWduZWQgaW50IGZvcmNlX3BkbWE0OiAxOwkvKiBWVDE3MjAvNCAtIFBETUE0IGFzIG5vbi1zcGRpZiAqLworCXVuc2lnbmVkIGludCBmb3JjZV9yZG1hMTogMTsJLyogVlQxNzIwLzQgLSBSRE1BMSBhcyBub24tc3BkaWYgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX3RvdGFsX2RhY3M7CS8qIHRvdGFsIERBQ3MgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX3RvdGFsX2FkY3M7CS8qIHRvdGFsIEFEQ3MgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3JhdGU7CQkvKiBjdXJyZW50IHJhdGUgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9tdXRleDsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpwY21fcmVzZXJ2ZWRbNF07CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCAqaHdfcmF0ZXM7IC8qIGNhcmQtc3BlY2lmaWMgcmF0ZSBjb25zdHJhaW50cyAqLworCisJdW5zaWduZWQgaW50IGFrbV9jb2RlY3M7CisJYWttNHh4eF90ICpha207CisJc3RydWN0IHNuZF9pY2UxNzEyX3NwZGlmIHNwZGlmOworCisJc3RydWN0IHNlbWFwaG9yZSBpMmNfbXV0ZXg7CS8qIEkyQyBtdXRleCBmb3IgSUNFMTcyNCByZWdpc3RlcnMgKi8KKwlzbmRfaTJjX2J1c190ICppMmM7CQkvKiBJMkMgYnVzICovCisJc25kX2kyY19kZXZpY2VfdCAqY3M4NDI3OwkvKiBDUzg0MjcgSTJDIGRldmljZSAqLworCXVuc2lnbmVkIGludCBjczg0MjdfdGltZW91dDsJLyogQ1M4NDI3IHJlc2V0IHRpbWVvdXQgaW4gSFovMTAwICovCisJCisJc3RydWN0IGljZTE3MTJfZ3BpbyB7CisJCXVuc2lnbmVkIGludCBkaXJlY3Rpb247CQkvKiBjdXJyZW50IGRpcmVjdGlvbiBiaXRzICovCisJCXVuc2lnbmVkIGludCB3cml0ZV9tYXNrOwkvKiBjdXJyZW50IG1hc2sgYml0cyAqLworCQl1bnNpZ25lZCBpbnQgc2F2ZWRbMl07CQkvKiBmb3IgZXd4X2kyYyAqLworCQkvKiBvcGVyYXRvcnMgKi8KKwkJdm9pZCAoKnNldF9tYXNrKShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGRhdGEpOworCQl2b2lkICgqc2V0X2RpcikoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBkYXRhKTsKKwkJdm9pZCAoKnNldF9kYXRhKShpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGRhdGEpOworCQl1bnNpZ25lZCBpbnQgKCpnZXRfZGF0YSkoaWNlMTcxMl90ICppY2UpOworCQkvKiBtaXNjIG9wZXJhdG9ycyAtIG1vdmUgdG8gYW5vdGhlciBwbGFjZT8gKi8KKwkJdm9pZCAoKnNldF9wcm9fcmF0ZSkoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCByYXRlKTsKKwkJdm9pZCAoKmkyc19tY2xrX2NoYW5nZWQpKGljZTE3MTJfdCAqaWNlKTsKKwl9IGdwaW87CisJc3RydWN0IHNlbWFwaG9yZSBncGlvX211dGV4OworCisJLyogb3RoZXIgYm9hcmQtc3BlY2lmaWMgZGF0YSAqLworCXVuaW9uIHsKKwkJLyogYWRkaXRpb25hbCBpMmMgZGV2aWNlcyBmb3IgRVdTIGJvYXJkcyAqLworCQlzbmRfaTJjX2RldmljZV90ICppMmNkZXZzWzNdOworCQkvKiBBQzk3IHJlZ2lzdGVyIGNhY2hlIGZvciBBdXJlb24gKi8KKwkJc3RydWN0IGF1cmVvbl9zcGVjIHsKKwkJCXVuc2lnbmVkIHNob3J0IHN0YWM5NzQ0WzY0XTsKKwkJCXVuc2lnbmVkIGludCBjczg0MTVfbXV4OworCQkJdW5zaWduZWQgc2hvcnQgbWFzdGVyWzJdOworCQkJdW5zaWduZWQgc2hvcnQgdm9sWzhdOworCQl9IGF1cmVvbjsKKwkJLyogSG9vbnRlY2gtc3BlY2lmaWMgc2V0dGluZyAqLworCQlzdHJ1Y3QgaG9vbnRlY2hfc3BlYyB7CisJCQl1bnNpZ25lZCBjaGFyIGJveGJpdHNbNF07CisJCQl1bnNpZ25lZCBpbnQgY29uZmlnOworCQkJdW5zaWduZWQgc2hvcnQgYm94Y29uZmlnWzRdOworCQl9IGhvb250ZWNoOworCQlzdHJ1Y3QgeworCQkJYWs0MTE0X3QgKmFrNDExNDsKKwkJCXVuc2lnbmVkIGludCBhbmFsb2c6IDE7CisJCX0ganVsaTsKKwl9IHNwZWM7CisKK307CisKKworLyoKKyAqIGdwaW8gYWNjZXNzIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlpY2UtPmdwaW8uc2V0X2RpcihpY2UsIGJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJaWNlLT5ncGlvLnNldF9tYXNrKGljZSwgYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWljZS0+Z3Bpby5zZXRfZGF0YShpY2UsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UxNzEyX3QgKmljZSkKK3sKKwlyZXR1cm4gaWNlLT5ncGlvLmdldF9kYXRhKGljZSk7Cit9CisKKy8qCisgKiBzYXZlIGFuZCByZXN0b3JlIGdwaW8gc3RhdHVzCisgKiBUaGUgYWNjZXNzIHRvIGdwaW8gd2lsbCBiZSBwcm90ZWN0ZWQgYnkgbXV0ZXgsIHNvIGRvbid0IGZvcmdldCB0bworICogcmVzdG9yZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlMTcxMl90ICppY2UpCit7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlpY2UtPmdwaW8uc2F2ZWRbMF0gPSBpY2UtPmdwaW8uZGlyZWN0aW9uOworCWljZS0+Z3Bpby5zYXZlZFsxXSA9IGljZS0+Z3Bpby53cml0ZV9tYXNrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UxNzEyX3QgKmljZSkKK3sKKwlpY2UtPmdwaW8uc2V0X2RpcihpY2UsIGljZS0+Z3Bpby5zYXZlZFswXSk7CisJaWNlLT5ncGlvLnNldF9tYXNrKGljZSwgaWNlLT5ncGlvLnNhdmVkWzFdKTsKKwlpY2UtPmdwaW8uZGlyZWN0aW9uID0gaWNlLT5ncGlvLnNhdmVkWzBdOworCWljZS0+Z3Bpby53cml0ZV9tYXNrID0gaWNlLT5ncGlvLnNhdmVkWzFdOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworfQorCisvKiBmb3IgYml0IGNvbnRyb2xzICovCisjZGVmaW5lIElDRTE3MTJfR1BJTyh4aWZhY2UsIHhuYW1lLCB4aW5kZXgsIG1hc2ssIGludmVydCwgeGFjY2VzcykgXAoreyAuaWZhY2UgPSB4aWZhY2UsIC5uYW1lID0geG5hbWUsIC5hY2Nlc3MgPSB4YWNjZXNzLCAuaW5mbyA9IHNuZF9pY2UxNzEyX2dwaW9faW5mbywgXAorICAuZ2V0ID0gc25kX2ljZTE3MTJfZ3Bpb19nZXQsIC5wdXQgPSBzbmRfaWNlMTcxMl9ncGlvX3B1dCwgXAorICAucHJpdmF0ZV92YWx1ZSA9IG1hc2sgfCAoaW52ZXJ0IDw8IDI0KSB9CisKK2ludCBzbmRfaWNlMTcxMl9ncGlvX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pOworaW50IHNuZF9pY2UxNzEyX2dwaW9fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworaW50IHNuZF9pY2UxNzEyX2dwaW9fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpOworCisvKgorICogc2V0IGdwaW8gZGlyZWN0aW9uLCB3cml0ZSBtYXNrIGFuZCBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaWNlMTcxMl9ncGlvX3dyaXRlX2JpdHMoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlpY2UtPmdwaW8uZGlyZWN0aW9uIHw9IG1hc2s7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgaWNlLT5ncGlvLmRpcmVjdGlvbik7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH5tYXNrKTsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgbWFzayAmIGJpdHMpOworfQorCitpbnQgc25kX2ljZTE3MTJfc3BkaWZfYnVpbGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpOworCitpbnQgc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrbTR4eHhfdCAqYWssIGNvbnN0IGFrbTR4eHhfdCAqdGVtcGxhdGUsIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgKnByaXYsIGljZTE3MTJfdCAqaWNlKTsKK3ZvaWQgc25kX2ljZTE3MTJfYWttNHh4eF9mcmVlKGljZTE3MTJfdCAqaWNlKTsKK2ludCBzbmRfaWNlMTcxMl9ha200eHh4X2J1aWxkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKTsKKworaW50IHNuZF9pY2UxNzEyX2luaXRfY3M4NDI3KGljZTE3MTJfdCAqaWNlLCBpbnQgYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaWNlMTcxMl93cml0ZShpY2UxNzEyX3QgKiBpY2UsIHU4IGFkZHIsIHU4IGRhdGEpCit7CisJb3V0YihhZGRyLCBJQ0VSRUcoaWNlLCBJTkRFWCkpOworCW91dGIoZGF0YSwgSUNFUkVHKGljZSwgREFUQSkpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNuZF9pY2UxNzEyX3JlYWQoaWNlMTcxMl90ICogaWNlLCB1OCBhZGRyKQoreworCW91dGIoYWRkciwgSUNFUkVHKGljZSwgSU5ERVgpKTsKKwlyZXR1cm4gaW5iKElDRVJFRyhpY2UsIERBVEEpKTsKK30KKworCisvKgorICogZW50cnkgcG9pbnRlcgorICovCisKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8geworCXVuc2lnbmVkIGludCBzdWJ2ZW5kb3I7CisJY2hhciAqbmFtZTsKKwljaGFyICptb2RlbDsKKwljaGFyICpkcml2ZXI7CisJaW50ICgqY2hpcF9pbml0KShpY2UxNzEyX3QgKik7CisJaW50ICgqYnVpbGRfY29udHJvbHMpKGljZTE3MTJfdCAqKTsKKwl1bnNpZ25lZCBpbnQgbm9fbXB1NDAxOiAxOworCXVuc2lnbmVkIGludCBlZXByb21fc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICplZXByb21fZGF0YTsKK307CisKKworI2VuZGlmIC8qIF9fU09VTkRfSUNFMTcxMl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1MDBmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMCwwICsxLDIzNDAgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBWVDE3MjQgSUNFbnNlbWJsZSBJQ0UxNzI0IC8gVklBIFZUMTcyNCAoRW52eTI0SFQpCisgKiAgICAgICAgICAgICAgICAgICBWSUEgVlQxNzIwIChFbnZ5MjRQVCkKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogICAgICAgICAgICAgICAgICAgIDIwMDIgSmFtZXMgU3RhZmZvcmQgPGpzdGFmZm9yZEBhbXBsdGQuY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgorCisvKiBsb3dsZXZlbCByb3V0aW5lcyAqLworI2luY2x1ZGUgImFtcC5oIgorI2luY2x1ZGUgInJldm8uaCIKKyNpbmNsdWRlICJhdXJlb24uaCIKKyNpbmNsdWRlICJ2dDE3MjBfbW9iby5oIgorI2luY2x1ZGUgInBvbnRpcy5oIgorI2luY2x1ZGUgInByb2RpZ3kxOTIuaCIKKyNpbmNsdWRlICJqdWxpLmgiCisjaW5jbHVkZSAicGhhc2UuaCIKKworCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJQ0Vuc2VtYmxlIElDRTE3MjQvMTcyMCAoRW52eTI0SFQvUFQpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgieyIKKwkgICAgICAgUkVWT19ERVZJQ0VfREVTQworCSAgICAgICBBTVBfQVVESU8yMDAwX0RFVklDRV9ERVNDCisJICAgICAgIEFVUkVPTl9ERVZJQ0VfREVTQworCSAgICAgICBWVDE3MjBfTU9CT19ERVZJQ0VfREVTQworCSAgICAgICBQT05USVNfREVWSUNFX0RFU0MKKwkgICAgICAgUFJPRElHWTE5Ml9ERVZJQ0VfREVTQworCSAgICAgICBKVUxJX0RFVklDRV9ERVNDCisJICAgICAgIFBIQVNFX0RFVklDRV9ERVNDCisJCSJ7VklBLFZUMTcyMH0sIgorCQkie1ZJQSxWVDE3MjR9LCIKKwkJIntJQ0Vuc2VtYmxlLEdlbmVyaWMgSUNFMTcyNH0sIgorCQkie0lDRW5zZW1ibGUsR2VuZXJpYyBFbnZ5MjRIVH0iCisJCSJ7SUNFbnNlbWJsZSxHZW5lcmljIEVudnkyNFBUfX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGNoYXIgKm1vZGVsW1NORFJWX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBJQ0UxNzI0IHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgSUNFMTcyNCBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIElDRTE3MjQgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1vZGVsLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVsLCAiVXNlIHRoZSBnaXZlbiBib2FyZCBtb2RlbC4iKTsKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0lDRQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDRQkJMHgxNDEyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WVDE3MjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WVDE3MjQJCTB4MTcyNAorI2VuZGlmCisKKy8qIEJvdGggVlQxNzIwIGFuZCBWVDE3MjQgaGF2ZSB0aGUgc2FtZSBQQ0kgSURzICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3Z0MTcyNF9pZHNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSUNFLCBQQ0lfREVWSUNFX0lEX1ZUMTcyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF92dDE3MjRfaWRzKTsKKworCitzdGF0aWMgaW50IFBST19SQVRFX0xPQ0tFRDsKK3N0YXRpYyBpbnQgUFJPX1JBVEVfUkVTRVQgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBQUk9fUkFURV9ERUZBVUxUID0gNDQxMDA7CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKyAKKy8qIGNoZWNrIHdoZXRoZXIgdGhlIGNsb2NrIG1vZGUgaXMgc3BkaWYtaW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NwZGlmX21hc3RlcihpY2UxNzEyX3QgKmljZSkKK3sKKwlyZXR1cm4gKGluYihJQ0VNVDE3MjQoaWNlLCBSQVRFKSkgJiBWVDE3MjRfU1BESUZfTUFTVEVSKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19wcm9fcmF0ZV9sb2NrZWQoaWNlMTcxMl90ICppY2UpCit7CisJcmV0dXJuIGlzX3NwZGlmX21hc3RlcihpY2UpIHx8IFBST19SQVRFX0xPQ0tFRDsKK30KKworLyoKKyAqIGFjOTcgc2VjdGlvbgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF92dDE3MjRfYWM5N19yZWFkeShpY2UxNzEyX3QgKmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZF9jbWQ7CisJaW50IHRtOworCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspIHsKKwkJb2xkX2NtZCA9IGluYihJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpOworCQlpZiAob2xkX2NtZCAmIChWVDE3MjRfQUM5N19XUklURSB8IFZUMTcyNF9BQzk3X1JFQUQpKQorCQkJY29udGludWU7CisJCWlmICghKG9sZF9jbWQgJiBWVDE3MjRfQUM5N19SRUFEWSkpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG9sZF9jbWQ7CisJfQorCXNuZF9wcmludGQoS0VSTl9FUlIgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CisJcmV0dXJuIG9sZF9jbWQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9hYzk3X3dhaXRfYml0KGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwlpbnQgdG07CisJZm9yICh0bSA9IDA7IHRtIDwgMHgxMDAwMDsgdG0rKykKKwkJaWYgKChpbmIoSUNFTVQxNzI0KGljZSwgQUM5N19DTUQpKSAmIGJpdCkgPT0gMCkKKwkJCXJldHVybiAwOworCXNuZF9wcmludGQoS0VSTl9FUlIgInNuZF92dDE3MjRfYWM5N193YWl0X2JpdDogdGltZW91dFxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92dDE3MjRfYWM5N193cml0ZShhYzk3X3QgKmFjOTcsCisJCQkJICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaWNlMTcxMl90ICppY2UgPSAoaWNlMTcxMl90ICopYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgb2xkX2NtZDsKKworCW9sZF9jbWQgPSBzbmRfdnQxNzI0X2FjOTdfcmVhZHkoaWNlKTsKKwlvbGRfY21kICY9IH5WVDE3MjRfQUM5N19JRF9NQVNLOworCW9sZF9jbWQgfD0gYWM5Ny0+bnVtOworCW91dGIocmVnLCBJQ0VNVDE3MjQoaWNlLCBBQzk3X0lOREVYKSk7CisJb3V0dyh2YWwsIElDRU1UMTcyNChpY2UsIEFDOTdfREFUQSkpOworCW91dGIob2xkX2NtZCB8IFZUMTcyNF9BQzk3X1dSSVRFLCBJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpOworCXNuZF92dDE3MjRfYWM5N193YWl0X2JpdChpY2UsIFZUMTcyNF9BQzk3X1dSSVRFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF92dDE3MjRfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWljZTE3MTJfdCAqaWNlID0gKGljZTE3MTJfdCAqKWFjOTctPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIG9sZF9jbWQ7CisKKwlvbGRfY21kID0gc25kX3Z0MTcyNF9hYzk3X3JlYWR5KGljZSk7CisJb2xkX2NtZCAmPSB+VlQxNzI0X0FDOTdfSURfTUFTSzsKKwlvbGRfY21kIHw9IGFjOTctPm51bTsKKwlvdXRiKHJlZywgSUNFTVQxNzI0KGljZSwgQUM5N19JTkRFWCkpOworCW91dGIob2xkX2NtZCB8IFZUMTcyNF9BQzk3X1JFQUQsIElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSk7CisJaWYgKHNuZF92dDE3MjRfYWM5N193YWl0X2JpdChpY2UsIFZUMTcyNF9BQzk3X1JFQUQpIDwgMCkKKwkJcmV0dXJuIH4wOworCXJldHVybiBpbncoSUNFTVQxNzI0KGljZSwgQUM5N19EQVRBKSk7Cit9CisKKworLyoKKyAqIEdQSU8gb3BlcmF0aW9ucworICovCisKKy8qIHNldCBncGlvIGRpcmVjdGlvbiAwID0gcmVhZCwgMSA9IHdyaXRlICovCitzdGF0aWMgdm9pZCBzbmRfdnQxNzI0X3NldF9ncGlvX2RpcihpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJb3V0bChkYXRhLCBJQ0VSRUcxNzI0KGljZSwgR1BJT19ESVJFQ1RJT04pKTsKKwlpbncoSUNFUkVHMTcyNChpY2UsIEdQSU9fRElSRUNUSU9OKSk7IC8qIGR1bW15IHJlYWQgZm9yIHBjaS1wb3N0aW5nICovCit9CisKKy8qIHNldCB0aGUgZ3BpbyBtYXNrICgwID0gd3JpdGFibGUpICovCitzdGF0aWMgdm9pZCBzbmRfdnQxNzI0X3NldF9ncGlvX21hc2soaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCBkYXRhKQoreworCW91dHcoZGF0YSwgSUNFUkVHMTcyNChpY2UsIEdQSU9fV1JJVEVfTUFTSykpOworCWlmICghIGljZS0+dnQxNzIwKSAvKiBWVDE3MjAgc3VwcG9ydHMgb25seSAxNiBHUElPIGJpdHMgKi8KKwkJb3V0YigoZGF0YSA+PiAxNikgJiAweGZmLCBJQ0VSRUcxNzI0KGljZSwgR1BJT19XUklURV9NQVNLXzIyKSk7CisJaW53KElDRVJFRzE3MjQoaWNlLCBHUElPX1dSSVRFX01BU0spKTsgLyogZHVtbXkgcmVhZCBmb3IgcGNpLXBvc3RpbmcgKi8KK30KKworc3RhdGljIHZvaWQgc25kX3Z0MTcyNF9zZXRfZ3Bpb19kYXRhKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlvdXR3KGRhdGEsIElDRVJFRzE3MjQoaWNlLCBHUElPX0RBVEEpKTsKKwlpZiAoISBpY2UtPnZ0MTcyMCkKKwkJb3V0YihkYXRhID4+IDE2LCBJQ0VSRUcxNzI0KGljZSwgR1BJT19EQVRBXzIyKSk7CisJaW53KElDRVJFRzE3MjQoaWNlLCBHUElPX0RBVEEpKTsgLyogZHVtbXkgcmVhZCBmb3IgcGNpLXBvc3RpbmcgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfdnQxNzI0X2dldF9ncGlvX2RhdGEoaWNlMTcxMl90ICppY2UpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJaWYgKCEgaWNlLT52dDE3MjApCisJCWRhdGEgPSAodW5zaWduZWQgaW50KWluYihJQ0VSRUcxNzI0KGljZSwgR1BJT19EQVRBXzIyKSk7CisJZWxzZQorCQlkYXRhID0gMDsKKwlkYXRhID0gKGRhdGEgPDwgMTYpIHwgaW53KElDRVJFRzE3MjQoaWNlLCBHUElPX0RBVEEpKTsKKwlyZXR1cm4gZGF0YTsKK30KKworLyoKKyAqICBJbnRlcnJ1cHQgaGFuZGxlcgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfdnQxNzI0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWljZTE3MTJfdCAqaWNlID0gZGV2X2lkOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCXdoaWxlICgxKSB7CisJCXN0YXR1cyA9IGluYihJQ0VSRUcxNzI0KGljZSwgSVJRU1RBVCkpOworCQlpZiAoc3RhdHVzID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsJCQorCQkvKiAgdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIHNlcGFyYXRlZCBhdCBzb21lIHBvaW50LCAKKwkJCWJ1dCBhcyB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBNUFUgc3VwcG9ydCBvbiB0aGUgYm9hcmQgSSB3aWxsIGxlYXZlIGl0ICovCisJCWlmICgoc3RhdHVzICYgVlQxNzI0X0lSUV9NUFVfUlgpfHwoc3RhdHVzICYgVlQxNzI0X0lSUV9NUFVfVFgpKSB7CisJCQlpZiAoaWNlLT5ybWlkaVswXSkKKwkJCQlzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KGlycSwgaWNlLT5ybWlkaVswXS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKwkJCW91dGIoc3RhdHVzICYgKFZUMTcyNF9JUlFfTVBVX1JYfFZUMTcyNF9JUlFfTVBVX1RYKSwgSUNFUkVHMTcyNChpY2UsIElSUVNUQVQpKTsKKwkJCXN0YXR1cyAmPSB+KFZUMTcyNF9JUlFfTVBVX1JYfFZUMTcyNF9JUlFfTVBVX1RYKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgVlQxNzI0X0lSUV9NVFBDTSkgeworCQkJLyoKKwkJCSAqIE11bHRpLXRyYWNrIFBDTQorCQkJICogUENNIGFzc2lnbm1lbnQgYXJlOgorCQkJICogUGxheWJhY2sgRE1BMCAoTS9DKSA9IHBsYXliYWNrX3Byb19zdWJzdHJlYW0KKwkJCSAqIFBsYXliYWNrIERNQTEgPSBwbGF5YmFja19jb25fc3Vic3RyZWFtX2RzWzBdCisJCQkgKiBQbGF5YmFjayBETUEyID0gcGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1sxXQorCQkJICogUGxheWJhY2sgRE1BMyA9IHBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbMl0KKwkJCSAqIFBsYXliYWNrIERNQTQgKFNQRElGKSA9IHBsYXliYWNrX2Nvbl9zdWJzdHJlYW0KKwkJCSAqIFJlY29yZCBETUEwID0gY2FwdHVyZV9wcm9fc3Vic3RyZWFtCisJCQkgKiBSZWNvcmQgRE1BMSA9IGNhcHR1cmVfY29uX3N1YnN0cmVhbQorCQkJICovCisJCQl1bnNpZ25lZCBjaGFyIG10c3RhdCA9IGluYihJQ0VNVDE3MjQoaWNlLCBJUlEpKTsKKwkJCWlmIChtdHN0YXQgJiBWVDE3MjRfTVVMVElfUERNQTApIHsKKwkJCQlpZiAoaWNlLT5wbGF5YmFja19wcm9fc3Vic3RyZWFtKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSk7CisJCQl9CisJCQlpZiAobXRzdGF0ICYgVlQxNzI0X01VTFRJX1JETUEwKSB7CisJCQkJaWYgKGljZS0+Y2FwdHVyZV9wcm9fc3Vic3RyZWFtKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljZS0+Y2FwdHVyZV9wcm9fc3Vic3RyZWFtKTsKKwkJCX0KKwkJCWlmIChtdHN0YXQgJiBWVDE3MjRfTVVMVElfUERNQTEpIHsKKwkJCQlpZiAoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtX2RzWzBdKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1swXSk7CisJCQl9CisJCQlpZiAobXRzdGF0ICYgVlQxNzI0X01VTFRJX1BETUEyKSB7CisJCQkJaWYgKGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1sxXSkKKwkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbMV0pOworCQkJfQorCQkJaWYgKG10c3RhdCAmIFZUMTcyNF9NVUxUSV9QRE1BMykgeworCQkJCWlmIChpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbMl0pCisJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtX2RzWzJdKTsKKwkJCX0KKwkJCWlmIChtdHN0YXQgJiBWVDE3MjRfTVVMVElfUERNQTQpIHsKKwkJCQlpZiAoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbSk7CisJCQl9CisJCQlpZiAobXRzdGF0ICYgVlQxNzI0X01VTFRJX1JETUExKSB7CisJCQkJaWYgKGljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtKTsKKwkJCX0KKwkJCS8qIGFjayBhbnl3YXkgdG8gYXZvaWQgZnJlZXplICovCisJCQlvdXRiKG10c3RhdCwgSUNFTVQxNzI0KGljZSwgSVJRKSk7CisJCQkvKiBvdWdodCB0byByZWFsbHkgaGFuZGxlIHRoaXMgcHJvcGVybHkgKi8KKwkJCWlmIChtdHN0YXQgJiBWVDE3MjRfTVVMVElfRklGT19FUlIpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGZzdGF0ID0gaW5iKElDRU1UMTcyNChpY2UsIERNQV9GSUZPX0VSUikpOworCQkJCW91dGIoZnN0YXQsIElDRU1UMTcyNChpY2UsIERNQV9GSUZPX0VSUikpOwkKKwkJCQlvdXRiKFZUMTcyNF9NVUxUSV9GSUZPX0VSUiB8IGluYihJQ0VNVDE3MjQoaWNlLCBETUFfSU5UX01BU0spKSwgSUNFTVQxNzI0KGljZSwgRE1BX0lOVF9NQVNLKSk7CQorCQkJCS8qIElmIEkgZG9uJ3QgZG8gdGhpcywgSSBnZXQgbWFjaGluZSBsb2NrdXAgZHVlIHRvIGNvbnRpbnVhbCBpbnRlcnJ1cHRzICovCisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqICBQQ00gY29kZSAtIHByb2Zlc3Npb25hbCBwYXJ0IChtdWx0aXRyYWNrKQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsKKwk4MDAwLCA5NjAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsCisJMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMCwKKwkxNzY0MDAsIDE5MjAwMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzXzk2ID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXMpIC0gMiwgLyogdXAgdG8gOTYwMDAgKi8KKwkubGlzdCA9IHJhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzXzQ4ID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXMpIC0gNSwgLyogdXAgdG8gNDgwMDAgKi8KKwkubGlzdCA9IHJhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzXzE5MiA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzKSwKKwkubGlzdCA9IHJhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0cnVjdCB2dDE3MjRfcGNtX3JlZyB7CisJdW5zaWduZWQgaW50IGFkZHI7CS8qIEFERFIgcmVnaXN0ZXIgb2Zmc2V0ICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIFNJWkUgcmVnaXN0ZXIgb2Zmc2V0ICovCisJdW5zaWduZWQgaW50IGNvdW50OwkvKiBDT1VOVCByZWdpc3RlciBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CS8qIHN0YXJ0ICYgcGF1c2UgYml0ICovCit9OworCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcGNtX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXVuc2lnbmVkIGNoYXIgd2hhdDsKKwl1bnNpZ25lZCBjaGFyIG9sZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqczsKKworCXdoYXQgPSAwOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKKwkJc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWc7CisJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlyZWcgPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCXdoYXQgfD0gcmVnLT5zdGFydDsKKwkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNwaW5fbG9jaygmaWNlLT5yZWdfbG9jayk7CisJCW9sZCA9IGluYihJQ0VNVDE3MjQoaWNlLCBETUFfUEFVU0UpKTsKKwkJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIKQorCQkJb2xkIHw9IHdoYXQ7CisJCWVsc2UKKwkJCW9sZCAmPSB+d2hhdDsKKwkJb3V0YihvbGQsIElDRU1UMTcyNChpY2UsIERNQV9QQVVTRSkpOworCQlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNwaW5fbG9jaygmaWNlLT5yZWdfbG9jayk7CisJCW9sZCA9IGluYihJQ0VNVDE3MjQoaWNlLCBETUFfQ09OVFJPTCkpOworCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKQorCQkJb2xkIHw9IHdoYXQ7CisJCWVsc2UKKwkJCW9sZCAmPSB+d2hhdDsKKwkJb3V0YihvbGQsIElDRU1UMTcyNChpY2UsIERNQV9DT05UUk9MKSk7CisJCXNwaW5fdW5sb2NrKCZpY2UtPnJlZ19sb2NrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKi8KKworI2RlZmluZSBETUFfU1RBUlRTCShWVDE3MjRfUkRNQTBfU1RBUlR8VlQxNzI0X1BETUEwX1NUQVJUfFZUMTcyNF9SRE1BMV9TVEFSVHxcCisJVlQxNzI0X1BETUExX1NUQVJUfFZUMTcyNF9QRE1BMl9TVEFSVHxWVDE3MjRfUERNQTNfU1RBUlR8VlQxNzI0X1BETUE0X1NUQVJUKQorI2RlZmluZSBETUFfUEFVU0VTCShWVDE3MjRfUkRNQTBfUEFVU0V8VlQxNzI0X1BETUEwX1BBVVNFfFZUMTcyNF9SRE1BMV9QQVVTRXxcCisJVlQxNzI0X1BETUExX1BBVVNFfFZUMTcyNF9QRE1BMl9QQVVTRXxWVDE3MjRfUERNQTNfUEFVU0V8VlQxNzI0X1BETUE0X1BBVVNFKQorCitzdGF0aWMgaW50IGdldF9tYXhfcmF0ZShpY2UxNzEyX3QgKmljZSkKK3sKKwlpZiAoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9BQ0xJTktdICYgVlQxNzI0X0NGR19QUk9fSTJTKSB7CisJCWlmICgoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9JMlNdICYgMHgwOCkgJiYgIWljZS0+dnQxNzIwKQorCQkJcmV0dXJuIDE5MjAwMDsKKwkJZWxzZQorCQkJcmV0dXJuIDk2MDAwOworCX0gZWxzZQorCQlyZXR1cm4gNDgwMDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92dDE3MjRfc2V0X3Byb19yYXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgcmF0ZSwgaW50IGZvcmNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB2YWwsIG9sZDsKKwl1bnNpZ25lZCBpbnQgaSwgbWNsa19jaGFuZ2U7CisKKwlpZiAocmF0ZSA+IGdldF9tYXhfcmF0ZShpY2UpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDgwMDA6IHZhbCA9IDY7IGJyZWFrOworCWNhc2UgOTYwMDogdmFsID0gMzsgYnJlYWs7CisJY2FzZSAxMTAyNTogdmFsID0gMTA7IGJyZWFrOworCWNhc2UgMTIwMDA6IHZhbCA9IDI7IGJyZWFrOworCWNhc2UgMTYwMDA6IHZhbCA9IDU7IGJyZWFrOworCWNhc2UgMjIwNTA6IHZhbCA9IDk7IGJyZWFrOworCWNhc2UgMjQwMDA6IHZhbCA9IDE7IGJyZWFrOworCWNhc2UgMzIwMDA6IHZhbCA9IDQ7IGJyZWFrOworCWNhc2UgNDQxMDA6IHZhbCA9IDg7IGJyZWFrOworCWNhc2UgNDgwMDA6IHZhbCA9IDA7IGJyZWFrOworCWNhc2UgNjQwMDA6IHZhbCA9IDE1OyBicmVhazsKKwljYXNlIDg4MjAwOiB2YWwgPSAxMTsgYnJlYWs7CisJY2FzZSA5NjAwMDogdmFsID0gNzsgYnJlYWs7CisJY2FzZSAxNzY0MDA6IHZhbCA9IDEyOyBicmVhazsKKwljYXNlIDE5MjAwMDogdmFsID0gMTQ7IGJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoKGluYihJQ0VNVDE3MjQoaWNlLCBETUFfQ09OVFJPTCkpICYgRE1BX1NUQVJUUykgfHwgCisJICAgIChpbmIoSUNFTVQxNzI0KGljZSwgRE1BX1BBVVNFKSkgJiBETUFfUEFVU0VTKSkgeworCQkvKiBydW5uaW5nPyB3ZSBjYW5ub3QgY2hhbmdlIHRoZSByYXRlIG5vdy4uLiAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY2UtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCFmb3JjZSAmJiBpc19wcm9fcmF0ZV9sb2NrZWQoaWNlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY2UtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlvbGQgPSBpbmIoSUNFTVQxNzI0KGljZSwgUkFURSkpOworCWlmIChmb3JjZSB8fCBvbGQgIT0gdmFsKQorCQlvdXRiKHZhbCwgSUNFTVQxNzI0KGljZSwgUkFURSkpOworCWVsc2UgaWYgKHJhdGUgPT0gaWNlLT5jdXJfcmF0ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY2UtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpY2UtPmN1cl9yYXRlID0gcmF0ZTsKKworCS8qIGNoZWNrIE1UMDIgKi8KKwltY2xrX2NoYW5nZSA9IDA7CisJaWYgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfQUNMSU5LXSAmIFZUMTcyNF9DRkdfUFJPX0kyUykgeworCQl2YWwgPSBvbGQgPSBpbmIoSUNFTVQxNzI0KGljZSwgSTJTX0ZPUk1BVCkpOworCQlpZiAocmF0ZSA+IDk2MDAwKQorCQkJdmFsIHw9IFZUMTcyNF9NVF9JMlNfTUNMS18xMjhYOyAvKiAxMjh4IE1DTEsgKi8KKwkJZWxzZQorCQkJdmFsICY9IH5WVDE3MjRfTVRfSTJTX01DTEtfMTI4WDsgLyogMjU2eCBNQ0xLICovCisJCWlmICh2YWwgIT0gb2xkKSB7CisJCQlvdXRiKHZhbCwgSUNFTVQxNzI0KGljZSwgSTJTX0ZPUk1BVCkpOworCQkJbWNsa19jaGFuZ2UgPSAxOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWlmIChtY2xrX2NoYW5nZSAmJiBpY2UtPmdwaW8uaTJzX21jbGtfY2hhbmdlZCkKKwkJaWNlLT5ncGlvLmkyc19tY2xrX2NoYW5nZWQoaWNlKTsKKwlpZiAoaWNlLT5ncGlvLnNldF9wcm9fcmF0ZSkKKwkJaWNlLT5ncGlvLnNldF9wcm9fcmF0ZShpY2UsIHJhdGUpOworCisJLyogc2V0IHVwIGNvZGVjcyAqLworCWZvciAoaSA9IDA7IGkgPCBpY2UtPmFrbV9jb2RlY3M7IGkrKykgeworCQlpZiAoaWNlLT5ha21baV0ub3BzLnNldF9yYXRlX3ZhbCkKKwkJCWljZS0+YWttW2ldLm9wcy5zZXRfcmF0ZV92YWwoJmljZS0+YWttW2ldLCByYXRlKTsKKwl9CisJaWYgKGljZS0+c3BkaWYub3BzLnNldHVwX3JhdGUpCisJCWljZS0+c3BkaWYub3BzLnNldHVwX3JhdGUoaWNlLCByYXRlKTsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BjbV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgaSwgY2hzOworCisJY2hzID0gcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcyk7CisJZG93bigmaWNlLT5vcGVuX211dGV4KTsKKwkvKiBtYXJrIHN1cnJvdW5kIGNoYW5uZWxzICovCisJaWYgKHN1YnN0cmVhbSA9PSBpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0pIHsKKwkJLyogUERNQTAgY2FuIGJlIG11bHRpLWNoYW5uZWwgdXAgdG8gOCAqLworCQljaHMgPSBjaHMgLyAyIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IGNoczsgaSsrKSB7CisJCQlpZiAoaWNlLT5wY21fcmVzZXJ2ZWRbaV0gJiYgaWNlLT5wY21fcmVzZXJ2ZWRbaV0gIT0gc3Vic3RyZWFtKSB7CisJCQkJdXAoJmljZS0+b3Blbl9tdXRleCk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWljZS0+cGNtX3Jlc2VydmVkW2ldID0gc3Vic3RyZWFtOworCQl9CisJCWZvciAoOyBpIDwgMzsgaSsrKSB7CisJCQlpZiAoaWNlLT5wY21fcmVzZXJ2ZWRbaV0gPT0gc3Vic3RyZWFtKQorCQkJCWljZS0+cGNtX3Jlc2VydmVkW2ldID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCS8qIGNoZWNrIGluZGl2aWR1YWwgcGxheWJhY2sgc3RyZWFtICovCisJCQlpZiAoaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtX2RzW2ldID09IHN1YnN0cmVhbSkgeworCQkJCWlmIChpY2UtPnBjbV9yZXNlcnZlZFtpXSAmJiBpY2UtPnBjbV9yZXNlcnZlZFtpXSAhPSBzdWJzdHJlYW0pIHsKKwkJCQkJdXAoJmljZS0+b3Blbl9tdXRleCk7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJCWljZS0+cGNtX3Jlc2VydmVkW2ldID0gc3Vic3RyZWFtOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXVwKCZpY2UtPm9wZW5fbXV0ZXgpOworCXNuZF92dDE3MjRfc2V0X3Byb19yYXRlKGljZSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSwgMCk7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wY21faHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBpOworCisJZG93bigmaWNlLT5vcGVuX211dGV4KTsKKwkvKiB1bm1hcmsgc3Vycm91bmQgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpZiAoaWNlLT5wY21fcmVzZXJ2ZWRbaV0gPT0gc3Vic3RyZWFtKQorCQkJaWNlLT5wY21fcmVzZXJ2ZWRbaV0gPSBOVUxMOworCXVwKCZpY2UtPm9wZW5fbXV0ZXgpOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGludCBzaXplOworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJdmFsID0gKDggLSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzKSA+PiAxOworCW91dGIodmFsLCBJQ0VNVDE3MjQoaWNlLCBCVVJTVCkpOworCisJb3V0bChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLCBJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19BRERSKSk7CisKKwlzaXplID0gKHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pID4+IDIpIC0gMTsKKwkvLyBvdXRsKHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpKTsKKwlvdXR3KHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpKTsKKwlvdXRiKHNpemUgPj4gMTYsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpICsgMik7CisJc2l6ZSA9IChzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDE7CisJLy8gb3V0bChzaXplLCBJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19DT1VOVCkpOworCW91dHcoc2l6ZSwgSUNFTVQxNzI0KGljZSwgUExBWUJBQ0tfQ09VTlQpKTsKKwlvdXRiKHNpemUgPj4gMTYsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX0NPVU5UKSArIDIpOworCisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKworCS8vIHByaW50aygicHJvIHByZXBhcmU6IGNoID0gJWQsIGFkZHIgPSAweCV4LCBidWZmZXIgPSAweCV4LCBwZXJpb2QgPSAweCV4XG4iLCBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzLCAodW5zaWduZWQgaW50KXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIsIHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pLCBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjsKKworCWlmICghKGlubChJQ0VNVDE3MjQoaWNlLCBETUFfQ09OVFJPTCkpICYgVlQxNzI0X1BETUEwX1NUQVJUKSkKKwkJcmV0dXJuIDA7CisjaWYgMCAvKiByZWFkIFBMQVlCQUNLX0FERFIgKi8KKwlwdHIgPSBpbmwoSUNFTVQxNzI0KGljZSwgUExBWUJBQ0tfQUREUikpOworCWlmIChwdHIgPCBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyKSB7CisJCXNuZF9wcmludGQoImljZTE3MjQ6IGludmFsaWQgbmVnYXRpdmUgcHRyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXB0ciAtPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCXB0ciA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7CisJaWYgKHB0ciA+PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CisJCXNuZF9wcmludGQoImljZTE3MjQ6IGludmFsaWQgcHRyICVkIChzaXplPSVkKVxuIiwgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJCXJldHVybiAwOworCX0KKyNlbHNlIC8qIHJlYWQgUExBWUJBQ0tfU0laRSAqLworCXB0ciA9IGlubChJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19TSVpFKSkgJiAweGZmZmZmZjsKKwlwdHIgPSAocHRyICsgMSkgPDwgMjsKKwlwdHIgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworCWlmICghIHB0cikKKwkJOworCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOworCWVsc2UgeworCQlzbmRfcHJpbnRkKCJpY2UxNzI0OiBpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsIChpbnQpcHRyLCAoaW50KXN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpOworCQlwdHIgPSAwOworCX0KKyNlbmRpZgorCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wY21fcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWcgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCW91dGwoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkciwgaWNlLT5wcm9maV9wb3J0ICsgcmVnLT5hZGRyKTsKKwlvdXR3KChzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDEsIGljZS0+cHJvZmlfcG9ydCArIHJlZy0+c2l6ZSk7CisJb3V0dygoc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSkgPj4gMikgLSAxLCBpY2UtPnByb2ZpX3BvcnQgKyByZWctPmNvdW50KTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3Z0MTcyNF9wY21fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWcgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoaW5sKElDRU1UMTcyNChpY2UsIERNQV9DT05UUk9MKSkgJiByZWctPnN0YXJ0KSkKKwkJcmV0dXJuIDA7CisjaWYgMCAvKiB1c2UgQUREUiByZWdpc3RlciAqLworCXB0ciA9IGlubChpY2UtPnByb2ZpX3BvcnQgKyByZWctPmFkZHIpOworCXB0ciAtPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworI2Vsc2UgLyogdXNlIFNJWkUgcmVnaXN0ZXIgKi8KKwlwdHIgPSBpbncoaWNlLT5wcm9maV9wb3J0ICsgcmVnLT5zaXplKTsKKwlwdHIgPSAocHRyICsgMSkgPDwgMjsKKwlwdHIgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworCWlmICghIHB0cikKKwkJOworCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOworCWVsc2UgeworCQlzbmRfcHJpbnRkKCJpY2UxNzI0OiBpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsIChpbnQpcHRyLCAoaW50KXN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpOworCQlwdHIgPSAwOworCX0KKwlyZXR1cm4gcHRyOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X3BsYXliYWNrX3Byb19yZWcgPSB7CisJLmFkZHIgPSBWVDE3MjRfTVRfUExBWUJBQ0tfQUREUiwKKwkuc2l6ZSA9IFZUMTcyNF9NVF9QTEFZQkFDS19TSVpFLAorCS5jb3VudCA9IFZUMTcyNF9NVF9QTEFZQkFDS19DT1VOVCwKKwkuc3RhcnQgPSBWVDE3MjRfUERNQTBfU1RBUlQsCit9OworCitzdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9jYXB0dXJlX3Byb19yZWcgPSB7CisJLmFkZHIgPSBWVDE3MjRfTVRfQ0FQVFVSRV9BRERSLAorCS5zaXplID0gVlQxNzI0X01UX0NBUFRVUkVfU0laRSwKKwkuY291bnQgPSBWVDE3MjRfTVRfQ0FQVFVSRV9DT1VOVCwKKwkuc3RhcnQgPSBWVDE3MjRfUkRNQTBfU1RBUlQsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkucmF0ZV9taW4gPQkJODAwMCwKKwkucmF0ZV9tYXggPQkJMTkyMDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTgsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMVVMIDw8IDIxKSwJLyogMTliaXRzIGR3b3JkICovCisJLnBlcmlvZF9ieXRlc19taW4gPQk4ICogNCAqIDIsCS8qIEZJWE1FOiBjb25zdHJhaW50cyBuZWVkZWQgKi8KKwkucGVyaW9kX2J5dGVzX21heCA9CSgxVUwgPDwgMjEpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdnQxNzI0X3NwZGlmID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnJhdGVzID0JICAgICAgICBTTkRSVl9QQ01fUkFURV8zMjAwMHxTTkRSVl9QQ01fUkFURV80NDEwMHxTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJMzIwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMVVMIDw8IDE4KSwJLyogMTZiaXRzIGR3b3JkICovCisJLnBlcmlvZF9ieXRlc19taW4gPQkyICogNCAqIDIsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMVVMIDw8IDE4KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3Z0MTcyNF8yY2hfc3RlcmVvID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkucmF0ZV9taW4gPQkJODAwMCwKKwkucmF0ZV9tYXggPQkJMTkyMDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMVVMIDw8IDE4KSwJLyogMTZiaXRzIGR3b3JkICovCisJLnBlcmlvZF9ieXRlc19taW4gPQkyICogNCAqIDIsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMVVMIDw8IDE4KSwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKK307CisKKy8qCisgKiBzZXQgcmF0ZSBjb25zdHJhaW50cworICovCitzdGF0aWMgaW50IHNldF9yYXRlX2NvbnN0cmFpbnRzKGljZTE3MTJfdCAqaWNlLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWYgKGljZS0+aHdfcmF0ZXMpIHsKKwkJLyogaGFyZHdhcmUgc3BlY2lmaWMgKi8KKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBpY2UtPmh3X3JhdGVzLT5saXN0WzBdOworCQlydW50aW1lLT5ody5yYXRlX21heCA9IGljZS0+aHdfcmF0ZXMtPmxpc3RbaWNlLT5od19yYXRlcy0+Y291bnQgLSAxXTsKKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UOworCQlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsIGljZS0+aHdfcmF0ZXMpOworCX0KKwlpZiAoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9BQ0xJTktdICYgVlQxNzI0X0NGR19QUk9fSTJTKSB7CisJCS8qIEkyUyAqLworCQkvKiBWVDE3MjAgZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiA5NmtIeiAqLworCQlpZiAoKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfSTJTXSAmIDB4MDgpICYmICFpY2UtPnZ0MTcyMCkKKwkJCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX3JhdGVzXzE5Mik7CisJCWVsc2UgeworCQkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfODAwMF85NjAwMDsKKwkJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gOTYwMDA7CisJCQlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsICZod19jb25zdHJhaW50c19yYXRlc185Nik7CisJCX0KKwl9IGVsc2UgaWYgKGljZS0+YWM5NykgeworCQkvKiBBQ0xJTksgKi8KKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPSA0ODAwMDsKKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMDsKKwkJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaHdfY29uc3RyYWludHNfcmF0ZXNfNDgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbXVsdGktY2hhbm5lbCBwbGF5YmFjayBuZWVkcyBhbGlnbm1lbnQgOHgzMmJpdCByZWdhcmRsZXNzIG9mIHRoZSBjaGFubmVscworICogYWN0dWFsbHkgdXNlZAorICovCisjZGVmaW5lIFZUMTcyNF9CVUZGRVJfQUxJR04JMHgyMAorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgY2hzOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9wbGF5YmFja19wcm9fcmVnOworCWljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJc2V0X3JhdGVfY29uc3RyYWludHMoaWNlLCBzdWJzdHJlYW0pOworCWRvd24oJmljZS0+b3Blbl9tdXRleCk7CisJLyogY2FsY3VsYXRlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGNoYW5uZWxzICovCisJZm9yIChjaHMgPSAwOyBjaHMgPCAzOyBjaHMrKykgeworCQlpZiAoaWNlLT5wY21fcmVzZXJ2ZWRbY2hzXSkKKwkJCWJyZWFrOworCX0KKwljaHMgPSAoY2hzICsgMSkgKiAyOworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNoczsKKwlpZiAoY2hzID4gMikgLyogY2hhbm5lbHMgbXVzdCBiZSBldmVuICovCisJCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgMik7CisJdXAoJmljZS0+b3Blbl9tdXRleCk7CisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKKwkJCQkgICBWVDE3MjRfQlVGRkVSX0FMSUdOKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQkJCSAgIFZUMTcyNF9CVUZGRVJfQUxJR04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfY2FwdHVyZV9wcm9fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9jYXB0dXJlX3Byb19yZWc7CisJaWNlLT5jYXB0dXJlX3Byb19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0XzJjaF9zdGVyZW87CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCXNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMocnVudGltZSwgMCwgMzIsIDI0KTsKKwlzZXRfcmF0ZV9jb25zdHJhaW50cyhpY2UsIHN1YnN0cmVhbSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKKwkJCQkgICBWVDE3MjRfQlVGRkVSX0FMSUdOKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQkJCSAgIFZUMTcyNF9CVUZGRVJfQUxJR04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoUFJPX1JBVEVfUkVTRVQpCisJCXNuZF92dDE3MjRfc2V0X3Byb19yYXRlKGljZSwgUFJPX1JBVEVfREVGQVVMVCwgMCk7CisJaWNlLT5wbGF5YmFja19wcm9fc3Vic3RyZWFtID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfY2FwdHVyZV9wcm9fY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChQUk9fUkFURV9SRVNFVCkKKwkJc25kX3Z0MTcyNF9zZXRfcHJvX3JhdGUoaWNlLCBQUk9fUkFURV9ERUZBVUxULCAwKTsKKwlpY2UtPmNhcHR1cmVfcHJvX3N1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19vcGVuLAorCS5jbG9zZSA9CXNuZF92dDE3MjRfcGxheWJhY2tfcHJvX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdnQxNzI0X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdnQxNzI0X3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92dDE3MjRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcGVuLAorCS5jbG9zZSA9CXNuZF92dDE3MjRfY2FwdHVyZV9wcm9fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92dDE3MjRfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92dDE3MjRfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdnQxNzI0X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3Z0MTcyNF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF92dDE3MjRfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X3BjbV9wcm9maShpY2UxNzEyX3QgKiBpY2UsIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGljZS0+Y2FyZCwgIklDRTE3MjQiLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBpY2U7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiSUNFMTcyNCIpOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShpY2UtPnBjaSksIDI1NioxMDI0LCAyNTYqMTAyNCk7CisKKwlpY2UtPnBjbV9wcm8gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU1BESUYgUENNCisgKi8KKworc3RhdGljIHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfc3BkaWZfcmVnID0geworCS5hZGRyID0gVlQxNzI0X01UX1BETUE0X0FERFIsCisJLnNpemUgPSBWVDE3MjRfTVRfUERNQTRfU0laRSwKKwkuY291bnQgPSBWVDE3MjRfTVRfUERNQTRfQ09VTlQsCisJLnN0YXJ0ID0gVlQxNzI0X1BETUE0X1NUQVJULAorfTsKKworc3RhdGljIHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfY2FwdHVyZV9zcGRpZl9yZWcgPSB7CisJLmFkZHIgPSBWVDE3MjRfTVRfUkRNQTFfQUREUiwKKwkuc2l6ZSA9IFZUMTcyNF9NVF9SRE1BMV9TSVpFLAorCS5jb3VudCA9IFZUMTcyNF9NVF9SRE1BMV9DT1VOVCwKKwkuc3RhcnQgPSBWVDE3MjRfUkRNQTFfU1RBUlQsCit9OworCisvKiB1cGRhdGUgc3BkaWYgY29udHJvbCBiaXRzOyBjYWxsIHdpdGggcmVnX2xvY2sgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zcGRpZl9iaXRzKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGNoYXIgY2JpdCwgZGlzYWJsZWQ7CisKKwljYml0ID0gaW5iKElDRVJFRzE3MjQoaWNlLCBTUERJRl9DRkcpKTsKKwlkaXNhYmxlZCA9IGNiaXQgJiB+VlQxNzI0X0NGR19TUERJRl9PVVRfRU47CisJaWYgKGNiaXQgIT0gZGlzYWJsZWQpCisJCW91dGIoZGlzYWJsZWQsIElDRVJFRzE3MjQoaWNlLCBTUERJRl9DRkcpKTsKKwlvdXR3KHZhbCwgSUNFTVQxNzI0KGljZSwgU1BESUZfQ1RSTCkpOworCWlmIChjYml0ICE9IGRpc2FibGVkKQorCQlvdXRiKGNiaXQsIElDRVJFRzE3MjQoaWNlLCBTUERJRl9DRkcpKTsKKwlvdXR3KHZhbCwgSUNFTVQxNzI0KGljZSwgU1BESUZfQ1RSTCkpOworfQorCisvKiB1cGRhdGUgU1BESUYgY29udHJvbCBiaXRzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcmF0ZSAqLworc3RhdGljIHZvaWQgdXBkYXRlX3NwZGlmX3JhdGUoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGludCB2YWwsIG52YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpY2UtPnJlZ19sb2NrLCBmbGFncyk7CisJbnZhbCA9IHZhbCA9IGludyhJQ0VNVDE3MjQoaWNlLCBTUERJRl9DVFJMKSk7CisJbnZhbCAmPSB+KDcgPDwgMTIpOworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgNDQxMDA6IGJyZWFrOworCWNhc2UgNDgwMDA6IG52YWwgfD0gMiA8PCAxMjsgYnJlYWs7CisJY2FzZSAzMjAwMDogbnZhbCB8PSAzIDw8IDEyOyBicmVhazsKKwl9CisJaWYgKHZhbCAhPSBudmFsKQorCQl1cGRhdGVfc3BkaWZfYml0cyhpY2UsIG52YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpZiAoISBpY2UtPmZvcmNlX3BkbWE0KQorCQl1cGRhdGVfc3BkaWZfcmF0ZShpY2UsIHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSk7CisJcmV0dXJuIHNuZF92dDE3MjRfcGNtX3ByZXBhcmUoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9wbGF5YmFja19zcGRpZl9yZWc7CisJaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWlmIChpY2UtPmZvcmNlX3BkbWE0KSB7CisJCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOworCQlzZXRfcmF0ZV9jb25zdHJhaW50cyhpY2UsIHN1YnN0cmVhbSk7CisJfSBlbHNlCisJCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF9zcGRpZjsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCisJCQkJICAgVlQxNzI0X0JVRkZFUl9BTElHTik7CisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCQkgICBWVDE3MjRfQlVGRkVSX0FMSUdOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoUFJPX1JBVEVfUkVTRVQpCisJCXNuZF92dDE3MjRfc2V0X3Byb19yYXRlKGljZSwgUFJPX1JBVEVfREVGQVVMVCwgMCk7CisJaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICZ2dDE3MjRfY2FwdHVyZV9zcGRpZl9yZWc7CisJaWNlLT5jYXB0dXJlX2Nvbl9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJaWYgKGljZS0+Zm9yY2VfcmRtYTEpIHsKKwkJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0XzJjaF9zdGVyZW87CisJCXNldF9yYXRlX2NvbnN0cmFpbnRzKGljZSwgc3Vic3RyZWFtKTsKKwl9IGVsc2UKKwkJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0X3NwZGlmOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKKwkJCQkgICBWVDE3MjRfQlVGRkVSX0FMSUdOKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQkJCSAgIFZUMTcyNF9CVUZGRVJfQUxJR04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKFBST19SQVRFX1JFU0VUKQorCQlzbmRfdnQxNzI0X3NldF9wcm9fcmF0ZShpY2UsIFBST19SQVRFX0RFRkFVTFQsIDApOworCWljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19zcGRpZl9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3Z0MTcyNF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX3Z0MTcyNF9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92dDE3MjRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdnQxNzI0X3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92dDE3MjRfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92dDE3MjRfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdnQxNzI0X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3Z0MTcyNF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF92dDE3MjRfcGNtX3BvaW50ZXIsCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX3NwZGlmKGljZTE3MTJfdCAqIGljZSwgaW50IGRldmljZSkKK3sKKwljaGFyICpuYW1lOworCXNuZF9wY21fdCAqcGNtOworCWludCBwbGF5LCBjYXB0OworCWludCBlcnI7CisKKwlpZiAoaWNlLT5mb3JjZV9wZG1hNCB8fAorCSAgICAoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9TUERJRl0gJiBWVDE3MjRfQ0ZHX1NQRElGX09VVF9JTlQpKSB7CisJCXBsYXkgPSAxOworCQlpY2UtPmhhc19zcGRpZiA9IDE7CisJfSBlbHNlCisJCXBsYXkgPSAwOworCWlmIChpY2UtPmZvcmNlX3JkbWExIHx8CisJICAgIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX1NQRElGXSAmIFZUMTcyNF9DRkdfU1BESUZfSU4pKSB7CisJCWNhcHQgPSAxOworCQlpY2UtPmhhc19zcGRpZiA9IDE7CisJfSBlbHNlCisJCWNhcHQgPSAwOworCWlmICghIHBsYXkgJiYgISBjYXB0KQorCQlyZXR1cm4gMDsgLyogbm8gc3BkaWYgZGV2aWNlICovCisKKwlpZiAoaWNlLT5mb3JjZV9wZG1hNCB8fCBpY2UtPmZvcmNlX3JkbWExKQorCQluYW1lID0gIklDRTE3MjQgU2Vjb25kYXJ5IjsKKwllbHNlCisJCW5hbWUgPSAiSUVDMTcyNCBJRUM5NTgiOworCWVyciA9IHNuZF9wY21fbmV3KGljZS0+Y2FyZCwgbmFtZSwgZGV2aWNlLCBwbGF5LCBjYXB0LCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChwbGF5KQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJCSZzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wcyk7CisJaWYgKGNhcHQpCisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkJCQkmc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX29wcyk7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGljZTsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsIG5hbWUpOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShpY2UtPnBjaSksIDY0KjEwMjQsIDY0KjEwMjQpOworCisJaWNlLT5wY20gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogaW5kZXBlbmRlbnQgc3Vycm91bmQgUENNcworICovCisKK3N0YXRpYyBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X3BsYXliYWNrX2RtYV9yZWdzWzNdID0geworCXsKKwkJLmFkZHIgPSBWVDE3MjRfTVRfUERNQTFfQUREUiwKKwkJLnNpemUgPSBWVDE3MjRfTVRfUERNQTFfU0laRSwKKwkJLmNvdW50ID0gVlQxNzI0X01UX1BETUExX0NPVU5ULAorCQkuc3RhcnQgPSBWVDE3MjRfUERNQTFfU1RBUlQsCisJfSwKKwl7CisJCS5hZGRyID0gVlQxNzI0X01UX1BETUEyX0FERFIsCisJCS5zaXplID0gVlQxNzI0X01UX1BETUEyX1NJWkUsCisJCS5jb3VudCA9IFZUMTcyNF9NVF9QRE1BMl9DT1VOVCwKKwkJLnN0YXJ0ID0gVlQxNzI0X1BETUEyX1NUQVJULAorCX0sCisJeworCQkuYWRkciA9IFZUMTcyNF9NVF9QRE1BM19BRERSLAorCQkuc2l6ZSA9IFZUMTcyNF9NVF9QRE1BM19TSVpFLAorCQkuY291bnQgPSBWVDE3MjRfTVRfUERNQTNfQ09VTlQsCisJCS5zdGFydCA9IFZUMTcyNF9QRE1BM19TVEFSVCwKKwl9LAorfTsKKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXZhbCA9IDMgLSBzdWJzdHJlYW0tPm51bWJlcjsKKwlpZiAoaW5iKElDRU1UMTcyNChpY2UsIEJVUlNUKSkgPCB2YWwpCisJCW91dGIodmFsLCBJQ0VNVDE3MjQoaWNlLCBCVVJTVCkpOworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIHNuZF92dDE3MjRfcGNtX3ByZXBhcmUoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJZG93bigmaWNlLT5vcGVuX211dGV4KTsKKwkvKiBhbHJlYWR5IHVzZWQgYnkgUERNQTA/ICovCisJaWYgKGljZS0+cGNtX3Jlc2VydmVkW3N1YnN0cmVhbS0+bnVtYmVyXSkgeworCQl1cCgmaWNlLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsgLyogRklYTUU6IHNob3VsZCBoYW5kbGUgYmxvY2tpbmcgbW9kZSBwcm9wZXJseSAqLworCX0KKwl1cCgmaWNlLT5vcGVuX211dGV4KTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSAmdnQxNzI0X3BsYXliYWNrX2RtYV9yZWdzW3N1YnN0cmVhbS0+bnVtYmVyXTsKKwlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbc3Vic3RyZWFtLT5udW1iZXJdID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJc2V0X3JhdGVfY29uc3RyYWludHMoaWNlLCBzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChQUk9fUkFURV9SRVNFVCkKKwkJc25kX3Z0MTcyNF9zZXRfcHJvX3JhdGUoaWNlLCBQUk9fUkFURV9ERUZBVUxULCAwKTsKKwlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbc3Vic3RyZWFtLT5udW1iZXJdID0gTlVMTDsKKwlpY2UtPnBjbV9yZXNlcnZlZFtzdWJzdHJlYW0tPm51bWJlcl0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfb3BzID0geworCS5vcGVuID0JCXNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdnQxNzI0X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdnQxNzI0X3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3Z0MTcyNF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF92dDE3MjRfcGNtX3BvaW50ZXIsCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX2luZGVwKGljZTE3MTJfdCAqIGljZSwgaW50IGRldmljZSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgcGxheTsKKwlpbnQgZXJyOworCisJcGxheSA9IGljZS0+bnVtX3RvdGFsX2RhY3MgLyAyIC0gMTsKKwlpZiAocGxheSA8PSAwKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHNuZF9wY21fbmV3KGljZS0+Y2FyZCwgIklDRTE3MjQgU3Vycm91bmRzIiwgZGV2aWNlLCBwbGF5LCAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkmc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBpY2U7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiSUNFMTcyNCBTdXJyb3VuZCBQQ00iKTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoaWNlLT5wY2kpLCA2NCoxMDI0LCA2NCoxMDI0KTsKKworCWljZS0+cGNtX2RzID0gcGNtOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBNaXhlciBzZWN0aW9uCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3Z0MTcyNF9hYzk3X21peGVyKGljZTE3MTJfdCAqIGljZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfQUNMSU5LXSAmIFZUMTcyNF9DRkdfUFJPX0kyUykpIHsKKwkJYWM5N19idXNfdCAqcGJ1czsKKwkJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCQkud3JpdGUgPSBzbmRfdnQxNzI0X2FjOTdfd3JpdGUsCisJCQkucmVhZCA9IHNuZF92dDE3MjRfYWM5N19yZWFkLAorCQl9OworCisJCS8qIGNvbGQgcmVzZXQgKi8KKwkJb3V0YihpbmIoSUNFTVQxNzI0KGljZSwgQUM5N19DTUQpKSB8IDB4ODAsIElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSk7CisJCW1kZWxheSg1KTsgLyogRklYTUUgKi8KKwkJb3V0YihpbmIoSUNFTVQxNzI0KGljZSwgQUM5N19DTUQpKSAmIH4weDgwLCBJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpOworCisJCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGljZS0+Y2FyZCwgMCwgJm9wcywgTlVMTCwgJnBidXMpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJCWFjOTcucHJpdmF0ZV9kYXRhID0gaWNlOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KSkgPCAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWNlMTcxMjogY2Fubm90IGluaXRpYWxpemUgcHJvIGFjOTcsIHNraXBwZWRcbiIpOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJLyogSTJTIG1peGVyIG9ubHkgKi8KKwlzdHJjYXQoaWNlLT5jYXJkLT5taXhlcm5hbWUsICJJQ0UxNzI0IC0gbXVsdGl0cmFjayIpOworCXJldHVybiAwOworfQorCisvKgorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlZXByb21fdHJpcGxlKGljZTE3MTJfdCAqaWNlLCBpbnQgaWR4KQoreworCXJldHVybiAodW5zaWduZWQgaW50KWljZS0+ZWVwcm9tLmRhdGFbaWR4XSB8IFwKKwkJKCh1bnNpZ25lZCBpbnQpaWNlLT5lZXByb20uZGF0YVtpZHggKyAxXSA8PCA4KSB8IFwKKwkJKCh1bnNpZ25lZCBpbnQpaWNlLT5lZXByb20uZGF0YVtpZHggKyAyXSA8PCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92dDE3MjRfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJaWNlMTcxMl90ICppY2UgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpZHg7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuXG4iLCBpY2UtPmNhcmQtPmxvbmduYW1lKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJFRVBST006XG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgU3VidmVuZG9yICAgICAgICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLnN1YnZlbmRvcik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBTaXplICAgICAgICAgICAgIDogJWkgYnl0ZXNcbiIsIGljZS0+ZWVwcm9tLnNpemUpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgVmVyc2lvbiAgICAgICAgICA6ICVpXG4iLCBpY2UtPmVlcHJvbS52ZXJzaW9uKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIFN5c3RlbSBDb25maWcgICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX1NZU0NPTkZdKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEFDTGluayAgICAgICAgICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX0FDTElOS10pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgSTJTICAgICAgICAgICAgICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfSTJTXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBTL1BESUYgICAgICAgICAgIDogMHgleFxuIiwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9TUERJRl0pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgR1BJTyBkaXJlY3Rpb24gICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLmdwaW9kaXIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgR1BJTyBtYXNrICAgICAgICA6IDB4JXhcbiIsIGljZS0+ZWVwcm9tLmdwaW9tYXNrKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEdQSU8gc3RhdGUgICAgICAgOiAweCV4XG4iLCBpY2UtPmVlcHJvbS5ncGlvc3RhdGUpOworCWZvciAoaWR4ID0gMHgxMjsgaWR4IDwgaWNlLT5lZXByb20uc2l6ZTsgaWR4KyspCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgRXh0cmEgIyUwMmkgICAgICAgIDogMHgleFxuIiwgaWR4LCBpY2UtPmVlcHJvbS5kYXRhW2lkeF0pOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5SZWdpc3RlcnM6XG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgUFNET1VUMDMgOiAweCUwOHhcbiIsICh1bnNpZ25lZClpbmwoSUNFTVQxNzI0KGljZSwgUk9VVEVfUExBWUJBQ0spKSk7CisJZm9yIChpZHggPSAweDA7IGlkeCA8IDB4MjAgOyBpZHgrKykKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBDQ1MlMDJ4ICAgIDogMHglMDJ4XG4iLCBpZHgsIGluYihpY2UtPnBvcnQraWR4KSk7CisJZm9yIChpZHggPSAweDA7IGlkeCA8IDB4MzAgOyBpZHgrKykKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBNVCUwMnggICAgIDogMHglMDJ4XG4iLCBpZHgsIGluYihpY2UtPnByb2ZpX3BvcnQraWR4KSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfdnQxNzI0X3Byb2NfaW5pdChpY2UxNzEyX3QgKiBpY2UpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhpY2UtPmNhcmQsICJpY2UxNzI0IiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIDEwMjQsIHNuZF92dDE3MjRfcHJvY19yZWFkKTsKK30KKworLyoKKyAqCisgKi8KKworc3RhdGljIGludCBzbmRfdnQxNzI0X2VlcHJvbV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKwl1aW5mby0+Y291bnQgPSBzaXplb2YoaWNlMTcxMl9lZXByb21fdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9lZXByb21fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAmaWNlLT5lZXByb20sIHNpemVvZihpY2UtPmVlcHJvbSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF92dDE3MjRfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKKwkubmFtZSA9ICJJQ0UxNzI0IEVFUFJPTSIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pbmZvID0gc25kX3Z0MTcyNF9lZXByb21faW5mbywKKwkuZ2V0ID0gc25kX3Z0MTcyNF9lZXByb21fZ2V0Cit9OworCisvKgorICovCitzdGF0aWMgaW50IHNuZF92dDE3MjRfc3BkaWZfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW5jb2RlX3NwZGlmX2JpdHMoc25kX2Flc19pZWM5NThfdCAqZGlnYSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gZGlnYS0+c3RhdHVzWzBdICYgMHgwMzsgLyogcHJvZmVzc2lvbmFsLCBub24tYXVkaW8gKi8KKwlpZiAodmFsICYgMHgwMSkgeworCQkvKiBwcm9mZXNzaW9uYWwgKi8KKwkJaWYgKChkaWdhLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMpID09IElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1KQorCQkJdmFsIHw9IDFVIDw8IDM7CisJCXN3aXRjaCAoZGlnYS0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPX0ZTKSB7CisJCWNhc2UgSUVDOTU4X0FFUzBfUFJPX0ZTXzQ0MTAwOgorCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwOgorCQkJdmFsIHw9IDNVIDw8IDEyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2YWwgfD0gMlUgPDwgMTI7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGNvbnN1bWVyICovCisJCXZhbCB8PSBkaWdhLT5zdGF0dXNbMV0gJiAweDA0OyAvKiBjb3B5cmlnaHQgKi8KKwkJaWYgKChkaWdhLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVMpPT0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpCisJCQl2YWwgfD0gMVUgPDwgMzsKKwkJdmFsIHw9ICh1bnNpZ25lZCBpbnQpKGRpZ2EtPnN0YXR1c1sxXSAmIDB4M2YpIDw8IDQ7IC8qIGNhdGVnb3J5ICovCisJCXZhbCB8PSAodW5zaWduZWQgaW50KShkaWdhLT5zdGF0dXNbM10gJiBJRUM5NThfQUVTM19DT05fRlMpIDw8IDEyOyAvKiBmcyAqLworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfc3BkaWZfYml0cyhzbmRfYWVzX2llYzk1OF90ICpkaWdhLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1lbXNldChkaWdhLT5zdGF0dXMsIDAsIHNpemVvZihkaWdhLT5zdGF0dXMpKTsKKwlkaWdhLT5zdGF0dXNbMF0gPSB2YWwgJiAweDAzOyAvKiBwcm9mZXNzaW9uYWwsIG5vbi1hdWRpbyAqLworCWlmICh2YWwgJiAweDAxKSB7CisJCS8qIHByb2Zlc3Npb25hbCAqLworCQlpZiAodmFsICYgKDFVIDw8IDMpKQorCQkJZGlnYS0+c3RhdHVzWzBdIHw9IElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1OworCQlzd2l0Y2ggKCh2YWwgPj4gMTIpICYgMHg3KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkaWdhLT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkaWdhLT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0ZTXzQ4MDAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjb25zdW1lciAqLworCQlkaWdhLT5zdGF0dXNbMF0gfD0gdmFsICYgKDFVIDw8IDIpOyAvKiBjb3B5cmlnaHQgKi8KKwkJaWYgKHZhbCAmICgxVSA8PCAzKSkKKwkJCWRpZ2EtPnN0YXR1c1swXSB8PSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNTsKKwkJZGlnYS0+c3RhdHVzWzFdIHw9ICh2YWwgPj4gNCkgJiAweDNmOyAvKiBjYXRlZ29yeSAqLworCQlkaWdhLT5zdGF0dXNbM10gfD0gKHZhbCA+PiAxMikgJiAweDA3OyAvKiBmcyAqLworCX0KK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3NwZGlmX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwl2YWwgPSBpbncoSUNFTVQxNzI0KGljZSwgU1BESUZfQ1RSTCkpOworCWRlY29kZV9zcGRpZl9iaXRzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfc3BkaWZfZGVmYXVsdF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbCwgb2xkOworCisJdmFsID0gZW5jb2RlX3NwZGlmX2JpdHMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCW9sZCA9IGludyhJQ0VNVDE3MjQoaWNlLCBTUERJRl9DVFJMKSk7CisJaWYgKHZhbCAhPSBvbGQpCisJCXVwZGF0ZV9zcGRpZl9iaXRzKGljZSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiAodmFsICE9IG9sZCk7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5pbmZvID0JCXNuZF92dDE3MjRfc3BkaWZfaW5mbywKKwkuZ2V0ID0JCXNuZF92dDE3MjRfc3BkaWZfZGVmYXVsdF9nZXQsCisJLnB1dCA9CQlzbmRfdnQxNzI0X3NwZGlmX2RlZmF1bHRfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF92dDE3MjRfc3BkaWZfbWFza2NfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBJRUM5NThfQUVTMF9OT05BVURJTyB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gSUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMIHwKKwkJCQkJCSAgICAgSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gSUVDOTU4X0FFUzNfQ09OX0ZTOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfc3BkaWZfbWFza3BfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBJRUM5NThfQUVTMF9OT05BVURJTyB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX1BST19GUyB8CisJCQkJCQkgICAgIElFQzk1OF9BRVMwX1BST19FTVBIQVNJUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdnQxNzI0X3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkuaW5mbyA9CQlzbmRfdnQxNzI0X3NwZGlmX2luZm8sCisJLmdldCA9CQlzbmRfdnQxNzI0X3NwZGlmX21hc2tjX2dldCwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9zcGRpZl9tYXNrcCBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCisJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9pbmZvLAorCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrcF9nZXQsCit9OworCitzdGF0aWMgaW50IHNuZF92dDE3MjRfc3BkaWZfc3dfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3NwZGlmX3N3X2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaW5iKElDRVJFRzE3MjQoaWNlLCBTUERJRl9DRkcpKSAmIFZUMTcyNF9DRkdfU1BESUZfT1VUX0VOID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9zcGRpZl9zd19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG9sZCwgdmFsOworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJb2xkID0gdmFsID0gaW5iKElDRVJFRzE3MjQoaWNlLCBTUERJRl9DRkcpKTsKKwl2YWwgJj0gflZUMTcyNF9DRkdfU1BESUZfT1VUX0VOOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJdmFsIHw9IFZUMTcyNF9DRkdfU1BESUZfT1VUX0VOOworCWlmIChvbGQgIT0gdmFsKQorCQlvdXRiKHZhbCwgSUNFUkVHMTcyNChpY2UsIFNQRElGX0NGRykpOworCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJcmV0dXJuIG9sZCAhPSB2YWw7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLyogRklYTUU6IHRoZSBmb2xsb3dpbmcgY29uZmxpY3Qgd2l0aCBJRUM5NTggUGxheWJhY2sgUm91dGUgKi8KKwkvLyAubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFNXSVRDSCksCisJLm5hbWUgPSAgICAgICAgICJJRUM5NTggT3V0cHV0IFN3aXRjaCIsCisJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9zd19pbmZvLAorCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9zd19nZXQsCisJLnB1dCA9CQlzbmRfdnQxNzI0X3NwZGlmX3N3X3B1dAorfTsKKworCisjaWYgMCAvKiBOT1QgVVNFRCBZRVQgKi8KKy8qCisgKiBHUElPIGFjY2VzcyBmcm9tIGV4dGVybgorICovCisKK2ludCBzbmRfdnQxNzI0X2dwaW9faW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF92dDE3MjRfZ3Bpb19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgc2hpZnQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmICgxPDwyNCkpID8gMSA6IDA7CisJCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpICYgKDEgPDwgc2hpZnQpID8gMSA6IDApIF4gaW52ZXJ0OworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9pY2UxNzEyX2dwaW9fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAoMTw8MjQpKSA/IG1hc2sgOiAwOworCXVuc2lnbmVkIGludCB2YWwsIG52YWw7CisKKwlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAoMSA8PCAzMSkpCisJCXJldHVybiAtRVBFUk07CisJbnZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/ICgxIDw8IHNoaWZ0KSA6IDApIF4gaW52ZXJ0OworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwl2YWwgPSBzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKTsKKwludmFsIHw9IHZhbCAmIH4oMSA8PCBzaGlmdCk7CisJaWYgKHZhbCAhPSBudmFsKQorCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgbnZhbCk7CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCXJldHVybiB2YWwgIT0gbnZhbDsKK30KKyNlbmRpZiAvKiBOT1QgVVNFRCBZRVQgKi8KKworLyoKKyAqICByYXRlCisgKi8KK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNfMTcyNFtdID0geworCQkiODAwMCIsCQkvKiAwOiA2ICovCisJCSI5NjAwIiwJCS8qIDE6IDMgKi8KKwkJIjExMDI1IiwJLyogMjogMTAgKi8KKwkJIjEyMDAwIiwJLyogMzogMiAqLworCQkiMTYwMDAiLAkvKiA0OiA1ICovCisJCSIyMjA1MCIsCS8qIDU6IDkgKi8KKwkJIjI0MDAwIiwJLyogNjogMSAqLworCQkiMzIwMDAiLAkvKiA3OiA0ICovCisJCSI0NDEwMCIsCS8qIDg6IDggKi8KKwkJIjQ4MDAwIiwJLyogOTogMCAqLworCQkiNjQwMDAiLAkvKiAxMDogMTUgKi8KKwkJIjg4MjAwIiwJLyogMTE6IDExICovCisJCSI5NjAwMCIsCS8qIDEyOiA3ICovCisJCSIxNzY0MDAiLAkvKiAxMzogMTIgKi8KKwkJIjE5MjAwMCIsCS8qIDE0OiAxNCAqLworCQkiSUVDOTU4IElucHV0IiwJLyogMTU6IC0tICovCisJfTsKKwlzdGF0aWMgY2hhciAqdGV4dHNfMTcyMFtdID0geworCQkiODAwMCIsCQkvKiAwOiA2ICovCisJCSI5NjAwIiwJCS8qIDE6IDMgKi8KKwkJIjExMDI1IiwJLyogMjogMTAgKi8KKwkJIjEyMDAwIiwJLyogMzogMiAqLworCQkiMTYwMDAiLAkvKiA0OiA1ICovCisJCSIyMjA1MCIsCS8qIDU6IDkgKi8KKwkJIjI0MDAwIiwJLyogNjogMSAqLworCQkiMzIwMDAiLAkvKiA3OiA0ICovCisJCSI0NDEwMCIsCS8qIDg6IDggKi8KKwkJIjQ4MDAwIiwJLyogOTogMCAqLworCQkiNjQwMDAiLAkvKiAxMDogMTUgKi8KKwkJIjg4MjAwIiwJLyogMTE6IDExICovCisJCSI5NjAwMCIsCS8qIDEyOiA3ICovCisJCSJJRUM5NTggSW5wdXQiLAkvKiAxMzogLS0gKi8KKwl9OworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGljZS0+dnQxNzIwID8gMTQgOiAxNjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgaWNlLT52dDE3MjAgPyB0ZXh0c18xNzIwW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dIDoKKwkgICAgICAgdGV4dHNfMTcyNFt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgeGxhdGVbMTZdID0geworCQk5LCA2LCAzLCAxLCA3LCA0LCAwLCAxMiwgOCwgNSwgMiwgMTEsIDEzLCAyNTUsIDE0LCAxMAorCX07CisJdW5zaWduZWQgY2hhciB2YWw7CisJCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJaWYgKGlzX3NwZGlmX21hc3RlcihpY2UpKSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpY2UtPnZ0MTcyMCA/IDEzIDogMTU7CisJfSBlbHNlIHsKKwkJdmFsID0geGxhdGVbaW5iKElDRU1UMTcyNChpY2UsIFJBVEUpKSAmIDE1XTsKKwkJaWYgKHZhbCA9PSAyNTUpIHsKKwkJCXNuZF9CVUcoKTsKKwkJCXZhbCA9IDA7CisJCX0KKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9ja19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG92YWw7CisJaW50IHJhdGU7CisJaW50IGNoYW5nZSA9IDA7CisJaW50IHNwZGlmID0gaWNlLT52dDE3MjAgPyAxMyA6IDE1OworCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJb3ZhbCA9IGluYihJQ0VNVDE3MjQoaWNlLCBSQVRFKSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gc3BkaWYpIHsKKwkJb3V0YihvdmFsIHwgVlQxNzI0X1NQRElGX01BU1RFUiwgSUNFTVQxNzI0KGljZSwgUkFURSkpOworCX0gZWxzZSB7CisJCXJhdGUgPSByYXRlc1t1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAlIDE1XTsKKwkJaWYgKHJhdGUgPD0gZ2V0X21heF9yYXRlKGljZSkpIHsKKwkJCVBST19SQVRFX0RFRkFVTFQgPSByYXRlOworCQkJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwkJCXNuZF92dDE3MjRfc2V0X3Byb19yYXRlKGljZSwgUFJPX1JBVEVfREVGQVVMVCwgMSk7CisJCQlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwkJfQorCX0KKwljaGFuZ2UgPSBpbmIoSUNFTVQxNzI0KGljZSwgUkFURSkpICE9IG92YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKworCWlmICgob3ZhbCAmIFZUMTcyNF9TUERJRl9NQVNURVIpICE9IChpbmIoSUNFTVQxNzI0KGljZSwgUkFURSkpICYgVlQxNzI0X1NQRElGX01BU1RFUikpIHsKKwkJLyogbm90aWZ5IGFrbSBjaGlwcyBhcyB3ZWxsICovCisJCWlmIChpc19zcGRpZl9tYXN0ZXIoaWNlKSkgeworCQkJdW5zaWduZWQgaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaWNlLT5ha21fY29kZWNzOyBpKyspIHsKKwkJCQlpZiAoaWNlLT5ha21baV0ub3BzLnNldF9yYXRlX3ZhbCkKKwkJCQkJaWNlLT5ha21baV0ub3BzLnNldF9yYXRlX3ZhbCgmaWNlLT5ha21baV0sIDApOworCQkJfQorCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2sgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNdWx0aSBUcmFjayBJbnRlcm5hbCBDbG9jayIsCisJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9ja19pbmZvLAorCS5nZXQgPSBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9ja19nZXQsCisJLnB1dCA9IHNuZF92dDE3MjRfcHJvX2ludGVybmFsX2Nsb2NrX3B1dAorfTsKKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmdfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmdfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBQUk9fUkFURV9MT0NLRUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwLCBudmFsOworCisJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJY2hhbmdlID0gUFJPX1JBVEVfTE9DS0VEICE9IG52YWw7CisJUFJPX1JBVEVfTE9DS0VEID0gbnZhbDsKKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nIF9fZGV2aW5pdGRhdGEgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBMb2NraW5nIiwKKwkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JhdGVfbG9ja2luZ19pbmZvLAorCS5nZXQgPSBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmdfZ2V0LAorCS5wdXQgPSBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmdfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXRfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19yYXRlX3Jlc2V0X2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gUFJPX1JBVEVfUkVTRVQgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19yYXRlX3Jlc2V0X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwLCBudmFsOworCisJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJY2hhbmdlID0gUFJPX1JBVEVfUkVTRVQgIT0gbnZhbDsKKwlQUk9fUkFURV9SRVNFVCA9IG52YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXQgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIFJlc2V0IiwKKwkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXRfaW5mbywKKwkuZ2V0ID0gc25kX3Z0MTcyNF9wcm9fcmF0ZV9yZXNldF9nZXQsCisJLnB1dCA9IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXRfcHV0Cit9OworCisKKy8qCisgKiByb3V0aW5nCisgKi8KK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9fcm91dGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwkJIlBDTSBPdXQiLCAvKiAwICovCisJCSJIL1cgSW4gMCIsICJIL1cgSW4gMSIsIC8qIDEtMiAqLworCQkiSUVDOTU4IEluIEwiLCAiSUVDOTU4IEluIFIiLCAvKiAzLTQgKi8KKwl9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA1OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFuYWxvZ19yb3V0ZV9zaGlmdChpbnQgaWR4KQoreworCXJldHVybiAoaWR4ICUgMikgKiAxMiArICgoaWR4IC8gMikgKiAzKSArIDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpZ2l0YWxfcm91dGVfc2hpZnQoaW50IGlkeCkKK3sKKwlyZXR1cm4gaWR4ICogMzsKK30KKworc3RhdGljIGludCBnZXRfcm91dGVfdmFsKGljZTE3MTJfdCAqaWNlLCBpbnQgc2hpZnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgY2hhciBlaXRlbTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB4bGF0ZVs4XSA9IHsKKwkJMCwgMjU1LCAxLCAyLCAyNTUsIDI1NSwgMywgNCwKKwl9OworCisJdmFsID0gaW5sKElDRU1UMTcyNChpY2UsIFJPVVRFX1BMQVlCQUNLKSk7CisJdmFsID4+PSBzaGlmdDsKKwl2YWwgJj0gNzsJLy93ZSBub3cgaGF2ZSAzIGJpdHMgcGVyIG91dHB1dAorCWVpdGVtID0geGxhdGVbdmFsXTsKKwlpZiAoZWl0ZW0gPT0gMjU1KSB7CisJCXNuZF9CVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBlaXRlbTsKK30KKworc3RhdGljIGludCBwdXRfcm91dGVfdmFsKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgc2hpZnQpCit7CisJdW5zaWduZWQgaW50IG9sZF92YWwsIG52YWw7CisJaW50IGNoYW5nZTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB4cm91dGVbOF0gPSB7CisJCTAsIC8qIFBDTSAqLworCQkyLCAvKiBQU0RJTjAgTGVmdCAqLworCQkzLCAvKiBQU0RJTjAgUmlnaHQgKi8KKwkJNiwgLyogU1BESU4gTGVmdCAqLworCQk3LCAvKiBTUERJTiBSaWdodCAqLworCX07CisKKwludmFsID0geHJvdXRlW3ZhbCAlIDVdOworCXZhbCA9IG9sZF92YWwgPSBpbmwoSUNFTVQxNzI0KGljZSwgUk9VVEVfUExBWUJBQ0spKTsKKwl2YWwgJj0gfigweDA3IDw8IHNoaWZ0KTsKKwl2YWwgfD0gbnZhbCA8PCBzaGlmdDsKKwljaGFuZ2UgPSB2YWwgIT0gb2xkX3ZhbDsKKwlpZiAoY2hhbmdlKQorCQlvdXRsKHZhbCwgSUNFTVQxNzI0KGljZSwgUk9VVEVfUExBWUJBQ0spKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcHJvX3JvdXRlX2FuYWxvZ19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZ2V0X3JvdXRlX3ZhbChpY2UsIGFuYWxvZ19yb3V0ZV9zaGlmdChpZHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19yb3V0ZV9hbmFsb2dfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJcmV0dXJuIHB1dF9yb3V0ZV92YWwoaWNlLCB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdLAorCQkJICAgICBhbmFsb2dfcm91dGVfc2hpZnQoaWR4KSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9fcm91dGVfc3BkaWZfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGdldF9yb3V0ZV92YWwoaWNlLCBkaWdpdGFsX3JvdXRlX3NoaWZ0KGlkeCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfcHJvX3JvdXRlX3NwZGlmX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXJldHVybiBwdXRfcm91dGVfdmFsKGljZSwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSwKKwkJCSAgICAgZGlnaXRhbF9yb3V0ZV9zaGlmdChpZHgpKTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdnQxNzI0X21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJIL1cgUGxheWJhY2sgUm91dGUiLAorCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfaW5mbywKKwkuZ2V0ID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfYW5hbG9nX2dldCwKKwkucHV0ID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfYW5hbG9nX3B1dCwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3Z0MTcyNF9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiUm91dGUiLAorCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfaW5mbywKKwkuZ2V0ID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfc3BkaWZfZ2V0LAorCS5wdXQgPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9zcGRpZl9wdXQsCisJLmNvdW50ID0gMiwKK307CisKKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19wZWFrX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjI7IC8qIEZJWE1FOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGljZTE3MTIuLi4gKi8KKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X3Byb19wZWFrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHg7CisJCisJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CisJZm9yIChpZHggPSAwOyBpZHggPCAyMjsgaWR4KyspIHsKKwkJb3V0YihpZHgsIElDRU1UMTcyNChpY2UsIE1PTklUT1JfUEVBS0lOREVYKSk7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2lkeF0gPSBpbmIoSUNFTVQxNzI0KGljZSwgTU9OSVRPUl9QRUFLREFUQSkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19wZWFrX2luZm8sCisJLmdldCA9IHNuZF92dDE3MjRfcHJvX3BlYWtfZ2V0Cit9OworCisvKgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBub19tYXRjaGVkIF9fZGV2aW5pdGRhdGE7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJc25kX3Z0MTcyNF9yZXZvX2NhcmRzLAorCXNuZF92dDE3MjRfYW1wX2NhcmRzLCAKKwlzbmRfdnQxNzI0X2F1cmVvbl9jYXJkcywKKwlzbmRfdnQxNzIwX21vYm9fY2FyZHMsCisJc25kX3Z0MTcyMF9wb250aXNfY2FyZHMsCisJc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzLAorCXNuZF92dDE3MjRfanVsaV9jYXJkcywKKwlzbmRfdnQxNzI0X3BoYXNlX2NhcmRzLAorCU5VTEwsCit9OworCisKKy8qCisgKi8KKworc3RhdGljIHZvaWQgd2FpdF9pMmNfYnVzeShpY2UxNzEyX3QgKmljZSkKK3sKKwlpbnQgdCA9IDB4MTAwMDA7CisJd2hpbGUgKChpbmIoSUNFUkVHMTcyNChpY2UsIEkyQ19DVFJMKSkgJiBWVDE3MjRfSTJDX0JVU1kpICYmIHQtLSkKKwkJOworCWlmICh0ID09IC0xKQorCQlwcmludGsoS0VSTl9FUlIgImljZTE3MjQ6IGkyYyBidXN5IHRpbWVvdXRcbiIpOworfQorCit1bnNpZ25lZCBjaGFyIHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlMTcxMl90ICppY2UsIHVuc2lnbmVkIGNoYXIgZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlkb3duKCZpY2UtPmkyY19tdXRleCk7CisJb3V0YihhZGRyLCBJQ0VSRUcxNzI0KGljZSwgSTJDX0JZVEVfQUREUikpOworCW91dGIoZGV2ICYgflZUMTcyNF9JMkNfV1JJVEUsIElDRVJFRzE3MjQoaWNlLCBJMkNfREVWX0FERFIpKTsKKwl3YWl0X2kyY19idXN5KGljZSk7CisJdmFsID0gaW5iKElDRVJFRzE3MjQoaWNlLCBJMkNfREFUQSkpOworCXVwKCZpY2UtPmkyY19tdXRleCk7CisJLy9wcmludGsoImkyY19yZWFkOiBbMHgleCwweCV4XSA9IDB4JXhcbiIsIGRldiwgYWRkciwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCit2b2lkIHNuZF92dDE3MjRfd3JpdGVfaTJjKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIGRldiwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJZG93bigmaWNlLT5pMmNfbXV0ZXgpOworCXdhaXRfaTJjX2J1c3koaWNlKTsKKwkvL3ByaW50aygiaTJjX3dyaXRlOiBbMHgleCwweCV4XSA9IDB4JXhcbiIsIGRldiwgYWRkciwgZGF0YSk7CisJb3V0YihhZGRyLCBJQ0VSRUcxNzI0KGljZSwgSTJDX0JZVEVfQUREUikpOworCW91dGIoZGF0YSwgSUNFUkVHMTcyNChpY2UsIEkyQ19EQVRBKSk7CisJb3V0YihkZXYgfCBWVDE3MjRfSTJDX1dSSVRFLCBJQ0VSRUcxNzI0KGljZSwgSTJDX0RFVl9BRERSKSk7CisJd2FpdF9pMmNfYnVzeShpY2UpOworCXVwKCZpY2UtPmkyY19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcmVhZF9lZXByb20oaWNlMTcxMl90ICppY2UsIGNvbnN0IGNoYXIgKm1vZGVsbmFtZSkKK3sKKwljb25zdCBpbnQgZGV2ID0gMHhhMDsJCS8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBpLCBzaXplOworCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCisJaWYgKCEgbW9kZWxuYW1lIHx8ICEgKm1vZGVsbmFtZSkgeworCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOworCQlpZiAoKGluYihJQ0VSRUcxNzI0KGljZSwgSTJDX0NUUkwpKSAmIFZUMTcyNF9JMkNfRUVQUk9NKSAhPSAwKQorCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0KKwkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMCkgPDwgMCkgfAorCQkJCShzbmRfdnQxNzI0X3JlYWRfaTJjKGljZSwgZGV2LCAweDAxKSA8PCA4KSB8IAorCQkJCShzbmRfdnQxNzI0X3JlYWRfaTJjKGljZSwgZGV2LCAweDAyKSA8PCAxNikgfCAKKwkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMykgPDwgMjQpOworCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwgaWNlLT5lZXByb20uc3VidmVuZG9yID09ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJCS8qIGludmFsaWQgc3VidmVuZG9yIGZyb20gRUVQUk9NLCB0cnkgdGhlIFBDSSBzdWJzdHN0ZW0gSUQgaW5zdGVhZCAqLworCQkJdTE2IHZlbmRvciwgZGV2aWNlOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWNlLT5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdmVuZG9yKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGljZS0+cGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmZGV2aWNlKTsKKwkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9ICgodW5zaWduZWQgaW50KXN3YWIxNih2ZW5kb3IpIDw8IDE2KSB8IHN3YWIxNihkZXZpY2UpOworCQkJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAwIHx8IGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBObyB2YWxpZCBJRCBpcyBmb3VuZFxuIik7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKHRibCA9IGNhcmRfdGFibGVzOyAqdGJsOyB0YmwrKykgeworCQlmb3IgKGMgPSAqdGJsOyBjLT5zdWJ2ZW5kb3I7IGMrKykgeworCQkJaWYgKG1vZGVsbmFtZSAmJiBjLT5tb2RlbCAmJiAhIHN0cmNtcChtb2RlbG5hbWUsIGMtPm1vZGVsKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gImljZTE3MjQ6IFVzaW5nIGJvYXJkIG1vZGVsICVzXG4iLCBjLT5uYW1lKTsKKwkJCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSBjLT5zdWJ2ZW5kb3I7CisJCQl9IGVsc2UgaWYgKGMtPnN1YnZlbmRvciAhPSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpCisJCQkJY29udGludWU7CisJCQlpZiAoISBjLT5lZXByb21fc2l6ZSB8fCAhIGMtPmVlcHJvbV9kYXRhKQorCQkJCWdvdG8gZm91bmQ7CisJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLworCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKKwkJCWljZS0+ZWVwcm9tLnZlcnNpb24gPSAyOworCQkJaWNlLT5lZXByb20uc2l6ZSA9IGMtPmVlcHJvbV9zaXplICsgNjsKKwkJCW1lbWNweShpY2UtPmVlcHJvbS5kYXRhLCBjLT5lZXByb21fZGF0YSwgYy0+ZWVwcm9tX3NpemUpOworCQkJZ290byByZWFkX3NraXBwZWQ7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiaWNlMTcyNDogTm8gbWF0Y2hpbmcgbW9kZWwgZm91bmQgZm9yIElEIDB4JXhcbiIsIGljZS0+ZWVwcm9tLnN1YnZlbmRvcik7CisKKyBmb3VuZDoKKwlpY2UtPmVlcHJvbS5zaXplID0gc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwNCk7CisJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQorCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7CisJZWxzZSBpZiAoaWNlLT5lZXByb20uc2l6ZSA+IDMyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogSW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsIGljZS0+ZWVwcm9tLnNpemUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDUpOworCWlmIChpY2UtPmVlcHJvbS52ZXJzaW9uICE9IDIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MjQ6IEludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsIGljZS0+ZWVwcm9tLnZlcnNpb24pOworCXNpemUgPSBpY2UtPmVlcHJvbS5zaXplIC0gNjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlpY2UtPmVlcHJvbS5kYXRhW2ldID0gc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgaSArIDYpOworCisgcmVhZF9za2lwcGVkOgorCWljZS0+ZWVwcm9tLmdwaW9tYXNrID0gZWVwcm9tX3RyaXBsZShpY2UsIElDRV9FRVAyX0dQSU9fTUFTSyk7CisJaWNlLT5lZXByb20uZ3Bpb3N0YXRlID0gZWVwcm9tX3RyaXBsZShpY2UsIElDRV9FRVAyX0dQSU9fU1RBVEUpOworCWljZS0+ZWVwcm9tLmdwaW9kaXIgPSBlZXByb21fdHJpcGxlKGljZSwgSUNFX0VFUDJfR1BJT19ESVIpOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X2NoaXBfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlvdXRiKFZUMTcyNF9SRVNFVCAsIElDRVJFRzE3MjQoaWNlLCBDT05UUk9MKSk7CisJdWRlbGF5KDIwMCk7CisJb3V0YigwLCBJQ0VSRUcxNzI0KGljZSwgQ09OVFJPTCkpOworCXVkZWxheSgyMDApOworCW91dGIoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9TWVNDT05GXSwgSUNFUkVHMTcyNChpY2UsIFNZU19DRkcpKTsKKwlvdXRiKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfQUNMSU5LXSwgSUNFUkVHMTcyNChpY2UsIEFDOTdfQ0ZHKSk7CisJb3V0YihpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX0kyU10sIElDRVJFRzE3MjQoaWNlLCBJMlNfRkVBVFVSRVMpKTsKKwlvdXRiKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfU1BESUZdLCBJQ0VSRUcxNzI0KGljZSwgU1BESUZfQ0ZHKSk7CisKKwlpY2UtPmdwaW8ud3JpdGVfbWFzayA9IGljZS0+ZWVwcm9tLmdwaW9tYXNrOworCWljZS0+Z3Bpby5kaXJlY3Rpb24gPSBpY2UtPmVlcHJvbS5ncGlvZGlyOworCXNuZF92dDE3MjRfc2V0X2dwaW9fbWFzayhpY2UsIGljZS0+ZWVwcm9tLmdwaW9tYXNrKTsKKwlzbmRfdnQxNzI0X3NldF9ncGlvX2RpcihpY2UsIGljZS0+ZWVwcm9tLmdwaW9kaXIpOworCXNuZF92dDE3MjRfc2V0X2dwaW9fZGF0YShpY2UsIGljZS0+ZWVwcm9tLmdwaW9zdGF0ZSk7CisKKwlvdXRiKDAsIElDRVJFRzE3MjQoaWNlLCBQT1dFUkRPV04pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X3NwZGlmX2J1aWxkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCWludCBlcnI7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisKKwlzbmRfYXNzZXJ0KGljZS0+cGNtICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdnQxNzI0X21peGVyX3Byb19zcGRpZl9yb3V0ZSwgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9zcGRpZl9zd2l0Y2gsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdnQxNzI0X3NwZGlmX2RlZmF1bHQsIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWtjdGwtPmlkLmRldmljZSA9IGljZS0+cGNtLT5kZXZpY2U7CisJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdnQxNzI0X3NwZGlmX21hc2tjLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlrY3RsLT5pZC5kZXZpY2UgPSBpY2UtPnBjbS0+ZGV2aWNlOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9zcGRpZl9tYXNrcCwgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJa2N0bC0+aWQuZGV2aWNlID0gaWNlLT5wY20tPmRldmljZTsKKyNpZiAwIC8qIHVzZSBkZWZhdWx0IG9ubHkgKi8KKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF92dDE3MjRfc3BkaWZfc3RyZWFtLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlrY3RsLT5pZC5kZXZpY2UgPSBpY2UtPnBjbS0+ZGV2aWNlOworCWljZS0+c3BkaWYuc3RyZWFtX2N0bCA9IGtjdGw7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X2J1aWxkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9lZXByb20sIGljZSkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9jaywgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9wcm9fcmF0ZV9yZXNldCwgaWNlKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoaWNlLT5udW1fdG90YWxfZGFjcyA+IDApIHsKKwkJc25kX2tjb250cm9sX25ld190IHRtcCA9IHNuZF92dDE3MjRfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZTsKKwkJdG1wLmNvdW50ID0gaWNlLT5udW1fdG90YWxfZGFjczsKKwkJaWYgKGljZS0+dnQxNzIwICYmIHRtcC5jb3VudCA+IDIpCisJCQl0bXAuY291bnQgPSAyOworCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmdG1wLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdnQxNzI0X21peGVyX3Byb19wZWFrLCBpY2UpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92dDE3MjRfZnJlZShpY2UxNzEyX3QgKmljZSkKK3sKKwlpZiAoISBpY2UtPnBvcnQpCisJCWdvdG8gX19od19lbmQ7CisJLyogbWFzayBhbGwgaW50ZXJydXB0cyAqLworCW91dGIoMHhmZiwgSUNFTVQxNzI0KGljZSwgRE1BX0lOVF9NQVNLKSk7CisJb3V0YigweGZmLCBJQ0VSRUcxNzI0KGljZSwgSVJRTUFTSykpOworCS8qIC0tLSAqLworICAgICAgX19od19lbmQ6CisJaWYgKGljZS0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGljZS0+aXJxKTsKKwkJZnJlZV9pcnEoaWNlLT5pcnEsICh2b2lkICopIGljZSk7CisJfQorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaWNlLT5wY2kpOworCXNuZF9pY2UxNzEyX2FrbTR4eHhfZnJlZShpY2UpOworCXBjaV9kaXNhYmxlX2RldmljZShpY2UtPnBjaSk7CisJa2ZyZWUoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdnQxNzI0X2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWljZTE3MTJfdCAqaWNlID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX3Z0MTcyNF9mcmVlKGljZSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgICBjb25zdCBjaGFyICptb2RlbG5hbWUsCisJCQkJICAgICAgIGljZTE3MTJfdCAqKiByX2ljZTE3MTIpCit7CisJaWNlMTcxMl90ICppY2U7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfdnQxNzI0X2Rldl9mcmVlLAorCX07CisKKwkqcl9pY2UxNzEyID0gTlVMTDsKKworICAgICAgICAvKiBlbmFibGUgUENJIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWNlID0ga2NhbGxvYygxLCBzaXplb2YoKmljZSksIEdGUF9LRVJORUwpOworCWlmIChpY2UgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWljZS0+dnQxNzI0ID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmaWNlLT5yZWdfbG9jayk7CisJaW5pdF9NVVRFWCgmaWNlLT5ncGlvX211dGV4KTsKKwlpbml0X01VVEVYKCZpY2UtPm9wZW5fbXV0ZXgpOworCWluaXRfTVVURVgoJmljZS0+aTJjX211dGV4KTsKKwlpY2UtPmdwaW8uc2V0X21hc2sgPSBzbmRfdnQxNzI0X3NldF9ncGlvX21hc2s7CisJaWNlLT5ncGlvLnNldF9kaXIgPSBzbmRfdnQxNzI0X3NldF9ncGlvX2RpcjsKKwlpY2UtPmdwaW8uc2V0X2RhdGEgPSBzbmRfdnQxNzI0X3NldF9ncGlvX2RhdGE7CisJaWNlLT5ncGlvLmdldF9kYXRhID0gc25kX3Z0MTcyNF9nZXRfZ3Bpb19kYXRhOworCWljZS0+Y2FyZCA9IGNhcmQ7CisJaWNlLT5wY2kgPSBwY2k7CisJaWNlLT5pcnEgPSAtMTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCXNuZF92dDE3MjRfcHJvY19pbml0KGljZSk7CisJc3luY2hyb25pemVfaXJxKHBjaS0+aXJxKTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJJQ0UxNzI0IikpIDwgMCkgeworCQlrZnJlZShpY2UpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWNlLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWNlLT5wcm9maV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92dDE3MjRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJJQ0UxNzI0IiwgKHZvaWQgKikgaWNlKSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX3Z0MTcyNF9mcmVlKGljZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWljZS0+aXJxID0gcGNpLT5pcnE7CisKKwlpZiAoc25kX3Z0MTcyNF9yZWFkX2VlcHJvbShpY2UsIG1vZGVsbmFtZSkgPCAwKSB7CisJCXNuZF92dDE3MjRfZnJlZShpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHNuZF92dDE3MjRfY2hpcF9pbml0KGljZSkgPCAwKSB7CisJCXNuZF92dDE3MjRfZnJlZShpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB1bm1hc2sgdXNlZCBpbnRlcnJ1cHRzICovCisJaWYgKCEgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfU1lTQ09ORl0gJiBWVDE3MjRfQ0ZHX01QVTQwMSkpCisJCW1hc2sgPSBWVDE3MjRfSVJRX01QVV9SWCB8IFZUMTcyNF9JUlFfTVBVX1RYOworCWVsc2UKKwkJbWFzayA9IDA7CisJb3V0YihtYXNrLCBJQ0VSRUcxNzI0KGljZSwgSVJRTUFTSykpOworCS8qIGRvbid0IGhhbmRsZSBGSUZPIG92ZXJydW4vdW5kZXJydW5zIChqdXN0IHlldCksIHNpbmNlIHRoZXkgY2F1c2UgbWFjaGluZSBsb2NrdXBzICovCisJb3V0YihWVDE3MjRfTVVMVElfRklGT19FUlIsIElDRU1UMTcyNChpY2UsIERNQV9JTlRfTUFTSykpOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcykpIDwgMCkgeworCQlzbmRfdnQxNzI0X2ZyZWUoaWNlKTsKKyAJCXJldHVybiBlcnI7CisJfQorCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJKnJfaWNlMTcxMiA9IGljZTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoKKyAqIFJlZ2lzdHJhdGlvbgorICoKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWljZTE3MTJfdCAqaWNlOworCWludCBwY21fZGV2ID0gMCwgZXJyOworCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSUNFMTcyNCIpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJJQ0Vuc2VtYmxlIElDRTE3MjQiKTsKKwkKKwlpZiAoKGVyciA9IHNuZF92dDE3MjRfY3JlYXRlKGNhcmQsIHBjaSwgbW9kZWxbZGV2XSwgJmljZSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAodGJsID0gY2FyZF90YWJsZXM7ICp0Ymw7IHRibCsrKSB7CisJCWZvciAoYyA9ICp0Ymw7IGMtPnN1YnZlbmRvcjsgYysrKSB7CisJCQlpZiAoYy0+c3VidmVuZG9yID09IGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCQkJCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIGMtPm5hbWUpOworCQkJCWlmIChjLT5kcml2ZXIpIC8qIHNwZWNpZmljIGRyaXZlcj8gKi8KKwkJCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgYy0+ZHJpdmVyKTsKKwkJCQlpZiAoYy0+Y2hpcF9pbml0KSB7CisJCQkJCWlmICgoZXJyID0gYy0+Y2hpcF9pbml0KGljZSkpIDwgMCkgeworCQkJCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCQkJCXJldHVybiBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQkJZ290byBfX2ZvdW5kOworCQkJfQorCQl9CisJfQorCWMgPSAmbm9fbWF0Y2hlZDsKKyBfX2ZvdW5kOgorCisJaWYgKChlcnIgPSBzbmRfdnQxNzI0X3BjbV9wcm9maShpY2UsIHBjbV9kZXYrKykpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoKGVyciA9IHNuZF92dDE3MjRfcGNtX3NwZGlmKGljZSwgcGNtX2RldisrKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCQorCWlmICgoZXJyID0gc25kX3Z0MTcyNF9wY21faW5kZXAoaWNlLCBwY21fZGV2KyspKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF92dDE3MjRfYWM5N19taXhlcihpY2UpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF92dDE3MjRfYnVpbGRfY29udHJvbHMoaWNlKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGljZS0+cGNtICYmIGljZS0+aGFzX3NwZGlmKSB7IC8qIGhhcyBTUERJRiBJL08gKi8KKwkJaWYgKChlcnIgPSBzbmRfdnQxNzI0X3NwZGlmX2J1aWxkX2NvbnRyb2xzKGljZSkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoYy0+YnVpbGRfY29udHJvbHMpIHsKKwkJaWYgKChlcnIgPSBjLT5idWlsZF9jb250cm9scyhpY2UpKSA8IDApIHsKKwkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKCEgYy0+bm9fbXB1NDAxKSB7CisJCWlmIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX1NZU0NPTkZdICYgVlQxNzI0X0NGR19NUFU0MDEpIHsKKwkJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfSUNFMTcxMiwKKwkJCQkJCSAgICAgICBJQ0VSRUcxNzI0KGljZSwgTVBVX0NUUkwpLCAxLAorCQkJCQkJICAgICAgIGljZS0+aXJxLCAwLAorCQkJCQkJICAgICAgICZpY2UtPnJtaWRpWzBdKSkgPCAwKSB7CisJCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJfQorCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsIGljZS0+cG9ydCwgaWNlLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3Z0MTcyNF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJJQ0UxNzI0IiwKKwkuaWRfdGFibGUgPSBzbmRfdnQxNzI0X2lkcywKKwkucHJvYmUgPSBzbmRfdnQxNzI0X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfdnQxNzI0X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfaWNlMTcyNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9pY2UxNzI0X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9pY2UxNzI0X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfaWNlMTcyNF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjI5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIFZUMTcyNCAoRW52eTI0SFQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIEVTSSBKdWxpQCBjYXJkcworICoKKyAqCUNvcHlyaWdodCAoYykgMjAwNCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgorI2luY2x1ZGUgImp1bGkuaCIKKworLyoKKyAqIGNoaXAgYWRkcmVzc2VzIG9uIEkyQyBidXMKKyAqLworI2RlZmluZSBBSzQxMTRfQUREUgkJMHgyMAkJLyogUy9QRElGIHJlY2VpdmVyICovCisjZGVmaW5lIEFLNDM1OF9BRERSCQkweDIyCQkvKiBEQUMgKi8KKworLyoKKyAqIEdQSU8gcGlucworICovCisjZGVmaW5lIEdQSU9fRlJFUV9NQVNLCQkoMzw8MCkKKyNkZWZpbmUgR1BJT19GUkVRXzMyS0haCQkoMDw8MCkKKyNkZWZpbmUgR1BJT19GUkVRXzQ0S0haCQkoMTw8MCkKKyNkZWZpbmUgR1BJT19GUkVRXzQ4S0haCQkoMjw8MCkKKyNkZWZpbmUgR1BJT19NVUxUSV9NQVNLCQkoMzw8MikKKyNkZWZpbmUgR1BJT19NVUxUSV80WAkJKDA8PDIpCisjZGVmaW5lIEdQSU9fTVVMVElfMlgJCSgxPDwyKQorI2RlZmluZSBHUElPX01VTFRJXzFYCQkoMjw8MikJCS8qIGFsc28gZXh0ZXJuYWwgKi8KKyNkZWZpbmUgR1BJT19NVUxUSV9IQUxGCQkoMzw8MikKKyNkZWZpbmUgR1BJT19JTlRFUk5BTF9DTE9DSwkoMTw8NCkKKyNkZWZpbmUgR1BJT19BTkFMT0dfUFJFU0VOVAkoMTw8NSkJCS8qIFJPIG9ubHk6IDAgPSBwcmVzZW50ICovCisjZGVmaW5lIEdQSU9fUlhNQ0xLX1NFTAkJKDE8PDcpCQkvKiBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgR1BJT19BSzUzODVBX0NLUzAJKDE8PDgpCisjZGVmaW5lIEdQSU9fQUs1Mzg1QV9ERlMwCSgxPDw5KQkJLyogc3dhcHBlZCB3aXRoIERGUzEgYWNjb3JkaW5nIGRvYz8gKi8KKyNkZWZpbmUgR1BJT19BSzUzODVBX0RGUzEJKDE8PDEwKQorI2RlZmluZSBHUElPX0RJR09VVF9NT05JVE9SCSgxPDwxMSkJCS8qIDEgPSBhY3RpdmUgKi8KKyNkZWZpbmUgR1BJT19ESUdJTl9NT05JVE9SCSgxPDwxMikJCS8qIDEgPSBhY3RpdmUgKi8KKyNkZWZpbmUgR1BJT19BTkFJTl9NT05JVE9SCSgxPDwxMykJCS8qIDEgPSBhY3RpdmUgKi8KKyNkZWZpbmUgR1BJT19BSzUzODVBX01DTEsJKDE8PDE0KQkJLyogbXVzdCBiZSAwICovCisjZGVmaW5lIEdQSU9fTVVURV9DT05UUk9MCSgxPDwxNSkJCS8qIDAgPSBvZmYsIDEgPSBvbiAqLworCitzdGF0aWMgdm9pZCBqdWxpX2FrNDExNF93cml0ZSh2b2lkICpwcml2YXRlX2RhdGEsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzbmRfdnQxNzI0X3dyaXRlX2kyYygoaWNlMTcxMl90ICopcHJpdmF0ZV9kYXRhLCBBSzQxMTRfQUREUiwgcmVnLCB2YWwpOworfQorICAgICAgICAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGp1bGlfYWs0MTE0X3JlYWQodm9pZCAqcHJpdmF0ZV9kYXRhLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlyZXR1cm4gc25kX3Z0MTcyNF9yZWFkX2kyYygoaWNlMTcxMl90ICopcHJpdmF0ZV9kYXRhLCBBSzQxMTRfQUREUiwgcmVnKTsKK30KKworLyoKKyAqIEFLNDM1OCBzZWN0aW9uCisgKi8KKworc3RhdGljIHZvaWQganVsaV9ha21fbG9jayhha200eHh4X3QgKmFrLCBpbnQgY2hpcCkKK3sKK30KKworc3RhdGljIHZvaWQganVsaV9ha21fdW5sb2NrKGFrbTR4eHhfdCAqYWssIGludCBjaGlwKQoreworfQorCitzdGF0aWMgdm9pZCBqdWxpX2FrbV93cml0ZShha200eHh4X3QgKmFrLCBpbnQgY2hpcCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCWljZTE3MTJfdCAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKwkgCisJc25kX2Fzc2VydChjaGlwID09IDAsIHJldHVybik7CisJc25kX3Z0MTcyNF93cml0ZV9pMmMoaWNlLCBBSzQzNThfQUREUiwgYWRkciwgZGF0YSk7Cit9CisKKy8qCisgKiBjaGFuZ2UgdGhlIHJhdGUgb2YgZW52eTI0SFQsIEFLNDM1OAorICovCitzdGF0aWMgdm9pZCBqdWxpX2FrbV9zZXRfcmF0ZV92YWwoYWttNHh4eF90ICphaywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgY2hhciBvbGQsIHRtcCwgZGZzOworCisJaWYgKHJhdGUgPT0gMCkgIC8qIG5vIGhpbnQgLSBTL1BESUYgaW5wdXQgaXMgbWFzdGVyLCBzaW1wbHkgcmV0dXJuICovCisJCXJldHVybjsKKwkKKwkvKiBhZGp1c3QgREZTIG9uIGNvZGVjcyAqLworCWlmIChyYXRlID4gOTYwMDApIAorCQlkZnMgPSAyOworCWVsc2UgaWYgKHJhdGUgPiA0ODAwMCkKKwkJZGZzID0gMTsKKwllbHNlCisJCWRmcyA9IDA7CisJCisJdG1wID0gc25kX2FrbTR4eHhfZ2V0KGFrLCAwLCAyKTsKKwlvbGQgPSAodG1wID4+IDQpICYgMHgwMzsKKwlpZiAob2xkID09IGRmcykKKwkJcmV0dXJuOworCS8qIHJlc2V0IERGUyAqLworCXNuZF9ha200eHh4X3Jlc2V0KGFrLCAxKTsKKwl0bXAgPSBzbmRfYWttNHh4eF9nZXQoYWssIDAsIDIpOworCXRtcCAmPSB+KDB4MDMgPDwgNCk7CisJdG1wIHw9IGRmcyA8PCA0OworCXNuZF9ha200eHh4X3NldChhaywgMCwgMiwgdG1wKTsKKwlzbmRfYWttNHh4eF9yZXNldChhaywgMCk7Cit9CisKK3N0YXRpYyBha200eHh4X3QgYWttX2p1bGlfZGFjIF9fZGV2aW5pdGRhdGEgPSB7CisJLnR5cGUgPSBTTkRfQUs0MzU4LAorCS5udW1fZGFjcyA9IDIsCisJLm9wcyA9IHsKKwkJLmxvY2sgPSBqdWxpX2FrbV9sb2NrLAorCQkudW5sb2NrID0ganVsaV9ha21fdW5sb2NrLAorCQkud3JpdGUgPSBqdWxpX2FrbV93cml0ZSwKKwkJLnNldF9yYXRlX3ZhbCA9IGp1bGlfYWttX3NldF9yYXRlX3ZhbAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGp1bGlfYWRkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCXJldHVybiBzbmRfaWNlMTcxMl9ha200eHh4X2J1aWxkX2NvbnRyb2xzKGljZSk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIHRoZSBjaGlwCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGp1bGlfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF92YWxzW10gPSB7CisJCS8qIEFLNDExN19SRUdfUFdSRE4gKi8JQUs0MTE0X1JTVCB8IEFLNDExNF9QV04gfCBBSzQxMTRfT0NLUzAgfCBBSzQxMTRfT0NLUzEsCisJCS8qIEFLNDExNF9SRVFfRk9STUFUICovCUFLNDExNF9ESUZfSTI0STJTLAorCQkvKiBBSzQxMTRfUkVHX0lPMCAqLwlBSzQxMTRfVFgxRSwKKwkJLyogQUs0MTE0X1JFR19JTzEgKi8JQUs0MTE0X0VGSF8xMDI0IHwgQUs0MTE0X0RJVCB8IEFLNDExNF9JUFMoMSksCisJCS8qIEFLNDExNF9SRUdfSU5UMF9NQVNLICovIDAsCisJCS8qIEFLNDExNF9SRUdfSU5UMV9NQVNLICovIDAKKwl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFrNDExNF9pbml0X3R4Y3NiW10gPSB7CisJCTB4NDEsIDB4MDIsIDB4MmMsIDB4MDAsIDB4MDAKKwl9OworCWludCBlcnI7CisJYWttNHh4eF90ICphazsKKworI2lmIDAKKwlmb3IgKGVyciA9IDA7IGVyciA8IDB4MjA7IGVycisrKQorCQlqdWxpX2FrNDExNF9yZWFkKGljZSwgZXJyKTsKKwlqdWxpX2FrNDExNF93cml0ZShpY2UsIDAsIDB4MGYpOworCWp1bGlfYWs0MTE0X3JlYWQoaWNlLCAwKTsKKwlqdWxpX2FrNDExNF9yZWFkKGljZSwgMSk7CisjZW5kaWYKKwllcnIgPSBzbmRfYWs0MTE0X2NyZWF0ZShpY2UtPmNhcmQsCisJCQkJanVsaV9hazQxMTRfcmVhZCwKKwkJCQlqdWxpX2FrNDExNF93cml0ZSwKKwkJCQlhazQxMTRfaW5pdF92YWxzLCBhazQxMTRfaW5pdF90eGNzYiwKKwkJCQlpY2UsICZpY2UtPnNwZWMuanVsaS5hazQxMTQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWNlLT5zcGVjLmp1bGkuYW5hbG9nID0gaWNlLT5ncGlvLmdldF9kYXRhKGljZSkgJiBHUElPX0FOQUxPR19QUkVTRU5UOworCisJaWYgKGljZS0+c3BlYy5qdWxpLmFuYWxvZykgeworCQlwcmludGsoS0VSTl9JTkZPICJqdWxpQDogYW5hbG9nIEkvTyBkZXRlY3RlZFxuIik7CisJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOworCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKKworCQlhayA9IGljZS0+YWttID0ga2NhbGxvYygxLCBzaXplb2YoYWttNHh4eF90KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghIGFrKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWljZS0+YWttX2NvZGVjcyA9IDE7CisJCWlmICgoZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2p1bGlfZGFjLCBOVUxMLCBpY2UpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogSnVsaUAgYm9hcmRzIGRvbid0IHByb3ZpZGUgdGhlIEVFUFJPTSBkYXRhIGV4Y2VwdCBmb3IgdGhlIHZlbmRvciBJRHMuCisgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIganVsaV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCTB4MjAsCS8qIFNZU0NPTkY6IGNsb2NrIDUxMiwgbXB1NDAxLCAxeEFEQywgMXhEQUNzICovCisJMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KKwkweGY4LAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJMHg5ZiwJLyogR1BJT19ESVIgKi8KKwkweGZmLAkvKiBHUElPX0RJUjEgKi8KKwkweDdmLAkvKiBHUElPX0RJUjIgKi8KKwkweDlmLAkvKiBHUElPX01BU0sgKi8KKwkweGZmLAkvKiBHUElPX01BU0sxICovCisJMHg3ZiwJLyogR1BJT19NQVNLMiAqLworCTB4MTYsCS8qIEdQSU9fU1RBVEU6IGludGVybmFsIGNsb2NrLCBtdWx0aXBsZSAxeCwgNDhrSHogKi8KKwkweDgwLAkvKiBHUElPX1NUQVRFMTogbXV0ZSAqLworCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCit9OworCisvKiBlbnRyeSBwb2ludCAqLworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2p1bGlfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfSlVMSSwKKwkJLm5hbWUgPSAiRVNJIEp1bGlAIiwKKwkJLm1vZGVsID0gImp1bGkiLAorCQkuY2hpcF9pbml0ID0ganVsaV9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBqdWxpX2FkZF9jb250cm9scywKKwkJLmVlcHJvbV9zaXplID0gc2l6ZW9mKGp1bGlfZWVwcm9tKSwKKwkJLmVlcHJvbV9kYXRhID0ganVsaV9lZXByb20sCisJfSwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY4NTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19TT1VORF9KVUxJX0gKKyNkZWZpbmUgX19TT1VORF9KVUxJX0gKKworI2RlZmluZSBKVUxJX0RFVklDRV9ERVNDCQkie0VTSSxKdWxpQH0sIgorCisjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfSlVMSQkJMHgzMTMwNTM0NQkvKiBKdWxpQCAqLworCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9qdWxpX2NhcmRzW107CisKKyNlbmRpZgkvKiBfX1NPVU5EX0pVTElfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmOTA4MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIElDRTE3MjQgKEVudnkyNCkKKyAqCisgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgVGVycmF0ZWMgUEhBU0UgMjIKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDUgTWlzaGEgWmhpbGluIDxtaXNoYUBlcGlwaGFuLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIFBIQVNFIDIyIG92ZXJ2aWV3OgorICogICBBdWRpbyBjb250cm9sbGVyOiBWSUEgRW52eTI0SFQtUyAoc2xpZ2h0bHkgdHJpbW1lZCBkb3duIHZlcnNpb24gb2YgRW52eTI0SFQpCisgKiAgIEFuYWxvZyBjaGlwOiBBSzQ1MjQgKHBhcnRpYWxseSB2aWEgUGhpbGlwJ3MgNzRIQ1QxMjUpCisgKiAgIERpZ2l0YWwgcmVjZWl2ZXI6IENTODQxNC1DUyAobm90IHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UpCisgKgorICogICBFbnZ5IGNvbm5lY3RzIHRvIEFLNDUyNAorICoJLSBDUyBkaXJlY3RseSBmcm9tIEdQSU8gMTAKKyAqCS0gQ0NMSyB2aWEgNzRIQ1QxMjUncyBnYXRlICM0IGZyb20gR1BJTyA0CisgKgktIENEVEkgdmlhIDc0SENUMTI1J3MgZ2F0ZSAjMiBmcm9tIEdQSU8gNQorICoJCUNEVEkgbWF5IGJlIGNvbXBsZXRlbHkgYmxvY2tlZCBieSA3NEhDVDEyNSdzIGdhdGUgIzEgY29udHJvbGxlZCBieSBHUElPIDMKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgorI2luY2x1ZGUgInBoYXNlLmgiCisKK3N0YXRpYyBha200eHh4X3QgYWttX3BoYXNlMjIgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQ1MjQsCisJLm51bV9kYWNzID0gMiwKKwkubnVtX2FkY3MgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3BoYXNlMjJfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9CTIsCisJLmNpZiA9CQkxLAorCS5kYXRhX21hc2sgPQkxIDw8IDQsCisJLmNsa19tYXNrID0JMSA8PCA1LAorCS5jc19tYXNrID0JMSA8PCAxMCwKKwkuY3NfYWRkciA9CTEgPDwgMTAsCisJLmNzX25vbmUgPQkwLAorCS5hZGRfZmxhZ3MgPSAJMSA8PCAzLAorCS5tYXNrX2ZsYWdzID0JMCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBoYXNlMjJfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlha200eHh4X3QgKmFrOworCWludCBlcnI7CisKKwkvLyBDb25maWd1cmUgREFDL0FEQyBkZXNjcmlwdGlvbiBmb3IgZ2VuZXJpYyBwYXJ0IG9mIGljZTE3MjQKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyOgorCQlpY2UtPm51bV90b3RhbF9kYWNzID0gMjsKKwkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJCWljZS0+dnQxNzIwID0gMTsgLy8gRW52eTI0SFQtUyBoYXZlIDE2IGJpdCB3aWRlIEdQSU8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBJbml0aWFsaXplIGFuYWxvZyBjaGlwcworCWFrID0gaWNlLT5ha20gPSBrY2FsbG9jKDEsIHNpemVvZihha200eHh4X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBhaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWNlLT5ha21fY29kZWNzID0gMTsKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyOgorCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9waGFzZTIyLCAmYWttX3BoYXNlMjJfcHJpdiwgaWNlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBoYXNlMjJfYWRkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUEhBU0UyMjoKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwaGFzZTIyX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHgwMCwJLyogU1lTQ09ORjogMXhBREMsIDF4REFDcyAqLworCTB4ODAsCS8qIEFDTElOSzogSTJTICovCisJMHhmOCwJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQqLworCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJMHhGRiwJLyogR1BJT19ESVIgKi8KKwkweEZGLAkvKiBHUElPX0RJUjEgKi8KKwkweEZGLAkvKiBHUElPX0RJUjIgKi8KKwkweDAwLAkvKiBHUElPX01BU0sgKi8KKwkweDAwLAkvKiBHUElPX01BU0sxICovCisJMHgwMCwJLyogR1BJT19NQVNLMiAqLworCTB4MDAsCS8qIEdQSU9fU1RBVEU6ICovCisJMHgwMCwJLyogR1BJT19TVEFURTE6ICovCisJMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK307CisKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9waGFzZV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyLAorCQkubmFtZSA9ICJUZXJyYXRlYyBQSEFTRSAyMiIsCisJCS5tb2RlbCA9ICJwaGFzZTIyIiwKKwkJLmNoaXBfaW5pdCA9IHBoYXNlMjJfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gcGhhc2UyMl9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZihwaGFzZTIyX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IHBoYXNlMjJfZWVwcm9tLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMwY2YxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9fU09VTkRfUEhBU0VfSAorI2RlZmluZSBfX1NPVU5EX1BIQVNFX0gKKworLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgSUNFMTcxMiAoRW52eTI0KQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBUZXJyYXRlYyBQSEFTRSAyMgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwNSBNaXNoYSBaaGlsaW4gPG1pc2hhQGVwaXBoYW4uY29tPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2RlZmluZSBQSEFTRV9ERVZJQ0VfREVTQyAie1RlcnJhdGVjLFBoYXNlIDIyfSwiCisKKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyCTB4M2IxNTUwMTEKKworLyogZW50cnkgcG9pbnQgKi8KK2V4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcGhhc2VfY2FyZHNbXTsKKworI2VuZGlmIC8qIF9fU09VTkRfUEhBU0UgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmODI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCkBAIC0wLDAgKzEsODQ5IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBWVDE3MjQgKEVudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBQb250aXMgTVMzMDAKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImVudnkyNGh0LmgiCisjaW5jbHVkZSAicG9udGlzLmgiCisKKy8qIEkyQyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgV01fREVWCQkweDM0CisjZGVmaW5lIENTX0RFVgkJMHgyMAorCisvKiBXTTg3NzYgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdNX0hQX0FUVEVOX0wJCTB4MDAJLyogaGVhZHBob25lIGxlZnQgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgV01fSFBfQVRURU5fUgkJMHgwMQkvKiBoZWFkcGhvbmUgbGVmdCBhdHRlbnVhdGlvbiAqLworI2RlZmluZSBXTV9IUF9NQVNURVIJCTB4MDIJLyogaGVhZHBob25lIG1hc3RlciAoYm90aCBjaGFubmVscyksIG92ZXJyaWRlIExMUiAqLworI2RlZmluZSBXTV9EQUNfQVRURU5fTAkJMHgwMwkvKiBkaWdpdGFsIGxlZnQgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgV01fREFDX0FUVEVOX1IJCTB4MDQKKyNkZWZpbmUgV01fREFDX01BU1RFUgkJMHgwNQorI2RlZmluZSBXTV9QSEFTRV9TV0FQCQkweDA2CS8qIERBQyBwaGFzZSBzd2FwICovCisjZGVmaW5lIFdNX0RBQ19DVFJMMQkJMHgwNworI2RlZmluZSBXTV9EQUNfTVVURQkJMHgwOAorI2RlZmluZSBXTV9EQUNfQ1RSTDIJCTB4MDkKKyNkZWZpbmUgV01fREFDX0lOVAkJMHgwYQorI2RlZmluZSBXTV9BRENfSU5UCQkweDBiCisjZGVmaW5lIFdNX01BU1RFUl9DVFJMCQkweDBjCisjZGVmaW5lIFdNX1BPV0VSRE9XTgkJMHgwZAorI2RlZmluZSBXTV9BRENfQVRURU5fTAkJMHgwZQorI2RlZmluZSBXTV9BRENfQVRURU5fUgkJMHgwZgorI2RlZmluZSBXTV9BTENfQ1RSTDEJCTB4MTAKKyNkZWZpbmUgV01fQUxDX0NUUkwyCQkweDExCisjZGVmaW5lIFdNX0FMQ19DVFJMMwkJMHgxMgorI2RlZmluZSBXTV9OT0lTRV9HQVRFCQkweDEzCisjZGVmaW5lIFdNX0xJTUlURVIJCTB4MTQKKyNkZWZpbmUgV01fQURDX01VWAkJMHgxNQorI2RlZmluZSBXTV9PVVRfTVVYCQkweDE2CisjZGVmaW5lIFdNX1JFU0VUCQkweDE3CisKKy8qCisgKiBHUElPCisgKi8KKyNkZWZpbmUgUE9OVElTX0NTX0NTCQkoMTw8NCkJLyogQ1MgKi8KKyNkZWZpbmUgUE9OVElTX0NTX0NMSwkJKDE8PDUpCS8qIENMSyAqLworI2RlZmluZSBQT05USVNfQ1NfUkRBVEEJCSgxPDw2KQkvKiBDUzg0MTYgLT4gVlQxNzIwICovCisjZGVmaW5lIFBPTlRJU19DU19XREFUQQkJKDE8PDcpCS8qIFZUMTcyMCAtPiBDUzg0MTYgKi8KKworCisvKgorICogZ2V0IHRoZSBjdXJyZW50IHJlZ2lzdGVyIHZhbHVlIG9mIFdNIGNvZGVjCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB3bV9nZXQoaWNlMTcxMl90ICppY2UsIGludCByZWcpCit7CisJcmVnIDw8PSAxOworCXJldHVybiAoKHVuc2lnbmVkIHNob3J0KWljZS0+YWttWzBdLmltYWdlc1tyZWddIDw8IDgpIHwKKwkJaWNlLT5ha21bMF0uaW1hZ2VzW3JlZyArIDFdOworfQorCisvKgorICogc2V0IHRoZSByZWdpc3RlciB2YWx1ZSBvZiBXTSBjb2RlYyBhbmQgcmVtZW1iZXIgaXQKKyAqLworc3RhdGljIHZvaWQgd21fcHV0X25vY2FjaGUoaWNlMTcxMl90ICppY2UsIGludCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjdmFsOworCWN2YWwgPSAocmVnIDw8IDkpIHwgdmFsOworCXNuZF92dDE3MjRfd3JpdGVfaTJjKGljZSwgV01fREVWLCBjdmFsID4+IDgsIGN2YWwgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgd21fcHV0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJd21fcHV0X25vY2FjaGUoaWNlLCByZWcsIHZhbCk7CisJcmVnIDw8PSAxOworCWljZS0+YWttWzBdLmltYWdlc1tyZWddID0gdmFsID4+IDg7CisJaWNlLT5ha21bMF0uaW1hZ2VzW3JlZyArIDFdID0gdmFsOworfQorCisvKgorICogREFDIHZvbHVtZSBhdHRlbnVhdGlvbiBtaXhlciBjb250cm9sICgtNjRkQiB0byAwZEIpCisgKi8KKworI2RlZmluZSBEQUNfMGRCCTB4ZmYKKyNkZWZpbmUgREFDX1JFUwkxMjgKKyNkZWZpbmUgREFDX01JTgkoREFDXzBkQiAtIERBQ19SRVMpCisKK3N0YXRpYyBpbnQgd21fZGFjX3ZvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkvKiBtdXRlICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gREFDX1JFUzsJLyogMGRCLCAwLjVkQiBzdGVwICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fZGFjX3ZvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCWludCBpOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXZhbCA9IHdtX2dldChpY2UsIFdNX0RBQ19BVFRFTl9MICsgaSkgJiAweGZmOworCQl2YWwgPSB2YWwgPiBEQUNfTUlOID8gKHZhbCAtIERBQ19NSU4pIDogMDsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSB2YWw7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2RhY192b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IG92YWwsIG52YWw7CisJaW50IGksIGlkeCwgY2hhbmdlID0gMDsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQludmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCW52YWwgPSAobnZhbCA/IChudmFsICsgREFDX01JTikgOiAwKSAmIDB4ZmY7CisJCWlkeCA9IFdNX0RBQ19BVFRFTl9MICsgaTsKKwkJb3ZhbCA9IHdtX2dldChpY2UsIGlkeCkgJiAweGZmOworCQlpZiAob3ZhbCAhPSBudmFsKSB7CisJCQl3bV9wdXQoaWNlLCBpZHgsIG52YWwpOworCQkJd21fcHV0X25vY2FjaGUoaWNlLCBpZHgsIG52YWwgfCAweDEwMCk7CisJCQljaGFuZ2UgPSAxOworCQl9CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBBREMgZ2FpbiBtaXhlciBjb250cm9sICgtNjRkQiB0byAwZEIpCisgKi8KKworI2RlZmluZSBBRENfMGRCCTB4Y2YKKyNkZWZpbmUgQURDX1JFUwkxMjgKKyNkZWZpbmUgQURDX01JTgkoQURDXzBkQiAtIEFEQ19SRVMpCisKK3N0YXRpYyBpbnQgd21fYWRjX3ZvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkvKiBtdXRlICgtNjRkQikgKi8KKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBBRENfUkVTOwkvKiAwZEIsIDAuNWRCIHN0ZXAgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9hZGNfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJaW50IGk7CisKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdmFsID0gd21fZ2V0KGljZSwgV01fQURDX0FUVEVOX0wgKyBpKSAmIDB4ZmY7CisJCXZhbCA9IHZhbCA+IEFEQ19NSU4gPyAodmFsIC0gQURDX01JTikgOiAwOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IHZhbDsKKwl9CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fYWRjX3ZvbF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgb3ZvbCwgbnZvbDsKKwlpbnQgaSwgaWR4LCBjaGFuZ2UgPSAwOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW52b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKKwkJbnZvbCA9IG52b2wgPyAobnZvbCArIEFEQ19NSU4pIDogMDsKKwkJaWR4ICA9IFdNX0FEQ19BVFRFTl9MICsgaTsKKwkJb3ZvbCA9IHdtX2dldChpY2UsIGlkeCkgJiAweGZmOworCQlpZiAob3ZvbCAhPSBudm9sKSB7CisJCQl3bV9wdXQoaWNlLCBpZHgsIG52b2wpOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogQURDIGlucHV0IG11eCBtaXhlciBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgd21fYWRjX211eF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21fYWRjX211eF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBiaXQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAod21fZ2V0KGljZSwgV01fQURDX01VWCkgJiAoMSA8PCBiaXQpKSA/IDEgOiAwOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2FkY19tdXhfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgYml0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgb3ZhbCwgbnZhbDsKKwlpbnQgY2hhbmdlOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwludmFsID0gb3ZhbCA9IHdtX2dldChpY2UsIFdNX0FEQ19NVVgpOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJbnZhbCB8PSAoMSA8PCBiaXQpOworCWVsc2UKKwkJbnZhbCAmPSB+KDEgPDwgYml0KTsKKwljaGFuZ2UgPSBudmFsICE9IG92YWw7CisJaWYgKGNoYW5nZSkgeworCQl3bV9wdXQoaWNlLCBXTV9BRENfTVVYLCBudmFsKTsKKwl9CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbmFsb2cgYnlwYXNzIChJbiAtPiBPdXQpCisgKi8KK3N0YXRpYyBpbnQgd21fYnlwYXNzX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9ieXBhc3NfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAod21fZ2V0KGljZSwgV01fT1VUX01VWCkgJiAweDA0KSA/IDEgOiAwOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2J5cGFzc19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbCwgb3ZhbDsKKwlpbnQgY2hhbmdlID0gMDsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJdmFsID0gb3ZhbCA9IHdtX2dldChpY2UsIFdNX09VVF9NVVgpOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJdmFsIHw9IDB4MDQ7CisJZWxzZQorCQl2YWwgJj0gfjB4MDQ7CisJaWYgKHZhbCAhPSBvdmFsKSB7CisJCXdtX3B1dChpY2UsIFdNX09VVF9NVVgsIHZhbCk7CisJCWNoYW5nZSA9IDE7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBMZWZ0L1JpZ2h0IHN3YXAKKyAqLworc3RhdGljIGludCB3bV9jaHN3YXBfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtX2Noc3dhcF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9EQUNfQ1RSTDEpICYgMHhmMCkgIT0gMHg5MDsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bV9jaHN3YXBfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIG92YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCW92YWwgPSB3bV9nZXQoaWNlLCBXTV9EQUNfQ1RSTDEpOworCXZhbCA9IG92YWwgJiAweDBmOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJdmFsIHw9IDB4NjA7CisJZWxzZQorCQl2YWwgfD0gMHg5MDsKKwlpZiAodmFsICE9IG92YWwpIHsKKwkJd21fcHV0KGljZSwgV01fREFDX0NUUkwxLCB2YWwpOworCQl3bV9wdXRfbm9jYWNoZShpY2UsIFdNX0RBQ19DVFJMMSwgdmFsKTsKKwkJY2hhbmdlID0gMTsKKwl9CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIHdyaXRlIGRhdGEgaW4gdGhlIFNQSSBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHNldF9ncGlvX2JpdChpY2UxNzEyX3QgKmljZSwgdW5zaWduZWQgaW50IGJpdCwgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisJaWYgKHZhbCkKKwkJdG1wIHw9IGJpdDsKKwllbHNlCisJCXRtcCAmPSB+Yml0OworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworfQorCitzdGF0aWMgdm9pZCBzcGlfc2VuZF9ieXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfQ0xLLCAwKTsKKwkJdWRlbGF5KDEpOworCQlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfV0RBVEEsIGRhdGEgJiAweDgwKTsKKwkJdWRlbGF5KDEpOworCQlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfQ0xLLCAxKTsKKwkJdWRlbGF5KDEpOworCQlkYXRhIDw8PSAxOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcGlfcmVhZF9ieXRlKGljZTE3MTJfdCAqaWNlKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl2YWwgPDw9IDE7CisJCXNldF9ncGlvX2JpdChpY2UsIFBPTlRJU19DU19DTEssIDApOworCQl1ZGVsYXkoMSk7CisJCWlmIChzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIFBPTlRJU19DU19SREFUQSkKKwkJCXZhbCB8PSAxOworCQl1ZGVsYXkoMSk7CisJCXNldF9ncGlvX2JpdChpY2UsIFBPTlRJU19DU19DTEssIDEpOworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIHZvaWQgc3BpX3dyaXRlKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlzbmRfaWNlMTcxMl9ncGlvX3NldF9kaXIoaWNlLCBQT05USVNfQ1NfQ1N8UE9OVElTX0NTX1dEQVRBfFBPTlRJU19DU19DTEspOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCB+KFBPTlRJU19DU19DU3xQT05USVNfQ1NfV0RBVEF8UE9OVElTX0NTX0NMSykpOworCXNldF9ncGlvX2JpdChpY2UsIFBPTlRJU19DU19DUywgMCk7CisJc3BpX3NlbmRfYnl0ZShpY2UsIGRldiAmIH4xKTsgLyogV1JJVEUgKi8KKwlzcGlfc2VuZF9ieXRlKGljZSwgcmVnKTsgLyogTUFQICovCisJc3BpX3NlbmRfYnl0ZShpY2UsIGRhdGEpOyAvKiBEQVRBICovCisJLyogdHJpZ2dlciAqLworCXNldF9ncGlvX2JpdChpY2UsIFBPTlRJU19DU19DUywgMSk7CisJdWRlbGF5KDEpOworCS8qIHJlc3RvcmUgKi8KKwlzbmRfaWNlMTcxMl9ncGlvX3NldF9tYXNrKGljZSwgaWNlLT5ncGlvLndyaXRlX21hc2spOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIGljZS0+Z3Bpby5kaXJlY3Rpb24pOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwaV9yZWFkKGljZTE3MTJfdCAqaWNlLCB1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgUE9OVElTX0NTX0NTfFBPTlRJU19DU19XREFUQXxQT05USVNfQ1NfQ0xLKTsKKwlzbmRfaWNlMTcxMl9ncGlvX3NldF9tYXNrKGljZSwgfihQT05USVNfQ1NfQ1N8UE9OVElTX0NTX1dEQVRBfFBPTlRJU19DU19DTEspKTsKKwlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfQ1MsIDApOworCXNwaV9zZW5kX2J5dGUoaWNlLCBkZXYgJiB+MSk7IC8qIFdSSVRFICovCisJc3BpX3NlbmRfYnl0ZShpY2UsIHJlZyk7IC8qIE1BUCAqLworCS8qIHRyaWdnZXIgKi8KKwlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfQ1MsIDEpOworCXVkZWxheSgxKTsKKwlzZXRfZ3Bpb19iaXQoaWNlLCBQT05USVNfQ1NfQ1MsIDApOworCXNwaV9zZW5kX2J5dGUoaWNlLCBkZXYgfCAxKTsgLyogUkVBRCAqLworCXZhbCA9IHNwaV9yZWFkX2J5dGUoaWNlKTsKKwkvKiB0cmlnZ2VyICovCisJc2V0X2dwaW9fYml0KGljZSwgUE9OVElTX0NTX0NTLCAxKTsKKwl1ZGVsYXkoMSk7CisJLyogcmVzdG9yZSAqLworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCBpY2UtPmdwaW8ud3JpdGVfbWFzayk7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgaWNlLT5ncGlvLmRpcmVjdGlvbik7CisJcmV0dXJuIHZhbDsKK30KKworCisvKgorICogU1BESUYgaW5wdXQgc291cmNlCisgKi8KK3N0YXRpYyBpbnQgY3Nfc291cmNlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwkJIkNvYXgiLAkJLyogUlhQMCAqLworCQkiT3B0aWNhbCIsCS8qIFJYUDEgKi8KKwkJIkNEIiwJCS8qIFJYUDIgKi8KKwl9OworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3Nfc291cmNlX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGljZS0+Z3Bpby5zYXZlZFswXTsKKwl1cCgmaWNlLT5ncGlvX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19zb3VyY2VfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCBjaGFuZ2UgPSAwOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAhPSBpY2UtPmdwaW8uc2F2ZWRbMF0pIHsKKwkJaWNlLT5ncGlvLnNhdmVkWzBdID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAmIDM7CisJCXZhbCA9IDB4ODAgfCAoaWNlLT5ncGlvLnNhdmVkWzBdIDw8IDMpOworCQlzcGlfd3JpdGUoaWNlLCBDU19ERVYsIDB4MDQsIHZhbCk7CisJCWNoYW5nZSA9IDE7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBHUElPIGNvbnRyb2xzCisgKi8KK3N0YXRpYyBpbnQgcG9udGlzX2dwaW9fbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4ZmZmZjsgLyogMTZiaXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb250aXNfZ3Bpb19tYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwkvKiA0LTcgcmVzZXJ2ZWQgKi8KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh+aWNlLT5ncGlvLndyaXRlX21hc2sgJiAweGZmZmYpIHwgMHgwMGYwOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCQorc3RhdGljIGludCBwb250aXNfZ3Bpb19tYXNrX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlZDsKKwlkb3duKCZpY2UtPmdwaW9fbXV0ZXgpOworCS8qIDQtNyByZXNlcnZlZCAqLworCXZhbCA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweGZmZmYpIHwgMHgwMGYwOworCWNoYW5nZWQgPSB2YWwgIT0gaWNlLT5ncGlvLndyaXRlX21hc2s7CisJaWNlLT5ncGlvLndyaXRlX21hc2sgPSB2YWw7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBpbnQgcG9udGlzX2dwaW9fZGlyX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwkvKiA0LTcgcmVzZXJ2ZWQgKi8KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGljZS0+Z3Bpby5kaXJlY3Rpb24gJiAweGZmMGY7CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgaW50IHBvbnRpc19ncGlvX2Rpcl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZWQ7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwkvKiA0LTcgcmVzZXJ2ZWQgKi8KKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4ZmYwZjsKKwljaGFuZ2VkID0gKHZhbCAhPSBpY2UtPmdwaW8uZGlyZWN0aW9uKTsKKwlpY2UtPmdwaW8uZGlyZWN0aW9uID0gdmFsOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgaW50IHBvbnRpc19ncGlvX2RhdGFfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgaWNlLT5ncGlvLmRpcmVjdGlvbik7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIGljZS0+Z3Bpby53cml0ZV9tYXNrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpICYgMHhmZmZmOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvbnRpc19ncGlvX2RhdGFfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWwsIG52YWw7CisJaW50IGNoYW5nZWQgPSAwOworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgaWNlLT5ncGlvLmRpcmVjdGlvbik7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIGljZS0+Z3Bpby53cml0ZV9tYXNrKTsKKwl2YWwgPSBzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIDB4ZmZmZjsKKwludmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweGZmZmY7CisJaWYgKHZhbCAhPSBudmFsKSB7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBudmFsKTsKKwkJY2hhbmdlZCA9IDE7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCisvKgorICogbWl4ZXJzCisgKi8KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBwb250aXNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlBDTSBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IHdtX2RhY192b2xfaW5mbywKKwkJLmdldCA9IHdtX2RhY192b2xfZ2V0LAorCQkucHV0ID0gd21fZGFjX3ZvbF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCisJCS5pbmZvID0gd21fYWRjX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd21fYWRjX3ZvbF9nZXQsCisJCS5wdXQgPSB3bV9hZGNfdm9sX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNEIENhcHR1cmUgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9hZGNfbXV4X2luZm8sCisJCS5nZXQgPSB3bV9hZGNfbXV4X2dldCwKKwkJLnB1dCA9IHdtX2FkY19tdXhfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJMaW5lIENhcHR1cmUgU3dpdGNoIiwKKwkJLmluZm8gPSB3bV9hZGNfbXV4X2luZm8sCisJCS5nZXQgPSB3bV9hZGNfbXV4X2dldCwKKwkJLnB1dCA9IHdtX2FkY19tdXhfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBbmFsb2cgQnlwYXNzIFN3aXRjaCIsCisJCS5pbmZvID0gd21fYnlwYXNzX2luZm8sCisJCS5nZXQgPSB3bV9ieXBhc3NfZ2V0LAorCQkucHV0ID0gd21fYnlwYXNzX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlN3YXAgT3V0cHV0IENoYW5uZWxzIiwKKwkJLmluZm8gPSB3bV9jaHN3YXBfaW5mbywKKwkJLmdldCA9IHdtX2Noc3dhcF9nZXQsCisJCS5wdXQgPSB3bV9jaHN3YXBfcHV0LAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSUVDOTU4IElucHV0IFNvdXJjZSIsCisJCS5pbmZvID0gY3Nfc291cmNlX2luZm8sCisJCS5nZXQgPSBjc19zb3VyY2VfZ2V0LAorCQkucHV0ID0gY3Nfc291cmNlX3B1dCwKKwl9LAorCS8qIEZJWE1FOiB3aGljaCBpbnRlcmZhY2U/ICovCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9DQVJELAorCQkubmFtZSA9ICJHUElPIE1hc2siLAorCQkuaW5mbyA9IHBvbnRpc19ncGlvX21hc2tfaW5mbywKKwkJLmdldCA9IHBvbnRpc19ncGlvX21hc2tfZ2V0LAorCQkucHV0ID0gcG9udGlzX2dwaW9fbWFza19wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0NBUkQsCisJCS5uYW1lID0gIkdQSU8gRGlyZWN0aW9uIiwKKwkJLmluZm8gPSBwb250aXNfZ3Bpb19tYXNrX2luZm8sCisJCS5nZXQgPSBwb250aXNfZ3Bpb19kaXJfZ2V0LAorCQkucHV0ID0gcG9udGlzX2dwaW9fZGlyX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKKwkJLm5hbWUgPSAiR1BJTyBEYXRhIiwKKwkJLmluZm8gPSBwb250aXNfZ3Bpb19tYXNrX2luZm8sCisJCS5nZXQgPSBwb250aXNfZ3Bpb19kYXRhX2dldCwKKwkJLnB1dCA9IHBvbnRpc19ncGlvX2RhdGFfcHV0LAorCX0sCit9OworCisKKy8qCisgKiBXTSBjb2RlYyByZWdpc3RlcnMKKyAqLworc3RhdGljIHZvaWQgd21fcHJvY19yZWdzX3dyaXRlKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWljZTE3MTJfdCAqaWNlID0gKGljZTE3MTJfdCAqKWVudHJ5LT5wcml2YXRlX2RhdGE7CisJY2hhciBsaW5lWzY0XTsKKwl1bnNpZ25lZCBpbnQgcmVnLCB2YWw7CisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwl3aGlsZSAoIXNuZF9pbmZvX2dldF9saW5lKGJ1ZmZlciwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgeworCQlpZiAoc3NjYW5mKGxpbmUsICIleCAleCIsICZyZWcsICZ2YWwpICE9IDIpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZyA8PSAweDE3ICYmIHZhbCA8PSAweGZmZmYpCisJCQl3bV9wdXQoaWNlLCByZWcsIHZhbCk7CisJfQorCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB3bV9wcm9jX3JlZ3NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlcikKK3sKKwlpY2UxNzEyX3QgKmljZSA9IChpY2UxNzEyX3QgKillbnRyeS0+cHJpdmF0ZV9kYXRhOworCWludCByZWcsIHZhbDsKKworCWRvd24oJmljZS0+Z3Bpb19tdXRleCk7CisJZm9yIChyZWcgPSAwOyByZWcgPD0gMHgxNzsgcmVnKyspIHsKKwkJdmFsID0gd21fZ2V0KGljZSwgcmVnKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeCA9ICUwNHhcbiIsIHJlZywgdmFsKTsKKwl9CisJdXAoJmljZS0+Z3Bpb19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHdtX3Byb2NfaW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhpY2UtPmNhcmQsICJ3bV9jb2RlYyIsICZlbnRyeSkpIHsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIDEwMjQsIHdtX3Byb2NfcmVnc19yZWFkKTsKKwkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKKwkJZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gMTAyNDsKKwkJZW50cnktPmMudGV4dC53cml0ZSA9IHdtX3Byb2NfcmVnc193cml0ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNzX3Byb2NfcmVnc19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWljZTE3MTJfdCAqaWNlID0gKGljZTE3MTJfdCAqKWVudHJ5LT5wcml2YXRlX2RhdGE7CisJaW50IHJlZywgdmFsOworCisJZG93bigmaWNlLT5ncGlvX211dGV4KTsKKwlmb3IgKHJlZyA9IDA7IHJlZyA8PSAweDI2OyByZWcrKykgeworCQl2YWwgPSBzcGlfcmVhZChpY2UsIENTX0RFViwgcmVnKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeCA9ICUwMnhcbiIsIHJlZywgdmFsKTsKKwl9CisJdmFsID0gc3BpX3JlYWQoaWNlLCBDU19ERVYsIDB4N2YpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMnggPSAlMDJ4XG4iLCAweDdmLCB2YWwpOworCXVwKCZpY2UtPmdwaW9fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjc19wcm9jX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoaWNlLT5jYXJkLCAiY3NfY29kZWMiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgaWNlLCAxMDI0LCBjc19wcm9jX3JlZ3NfcmVhZCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBvbnRpc19hZGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvbnRpc19jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmcG9udGlzX2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXdtX3Byb2NfaW5pdChpY2UpOworCWNzX3Byb2NfaW5pdChpY2UpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNoaXAKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcG9udGlzX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzW10gPSB7CisJCS8qIFRoZXNlIGNvbWUgZmlyc3QgdG8gcmVkdWNlIGluaXQgcG9wIG5vaXNlICovCisJCVdNX0FEQ19NVVgsCTB4MDBjMCwJLyogQURDIG11dGUgKi8KKwkJV01fREFDX01VVEUsCTB4MDAwMSwJLyogREFDIHNvZnRtdXRlICovCisJCVdNX0RBQ19DVFJMMSwJMHgwMDAwLAkvKiBEQUMgbXV0ZSAqLworCisJCVdNX1BPV0VSRE9XTiwJMHgwMDA4LAkvKiBBbGwgcG93ZXItdXAgZXhjZXB0IEhQICovCisJCVdNX1JFU0VULAkweDAwMDAsCS8qIHJlc2V0ICovCisJfTsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHMyW10gPSB7CisJCVdNX01BU1RFUl9DVFJMLAkweDAwMjIsCS8qIDI1NmZzLCBzbGF2ZSBtb2RlICovCisJCVdNX0RBQ19JTlQsCTB4MDAyMiwJLyogSTJTLCBub3JtYWwgcG9sYXJpdHksIDI0Yml0ICovCisJCVdNX0FEQ19JTlQsCTB4MDAyMiwJLyogSTJTLCBub3JtYWwgcG9sYXJpdHksIDI0Yml0ICovCisJCVdNX0RBQ19DVFJMMSwJMHgwMDkwLAkvKiBEQUMgTC9SICovCisJCVdNX09VVF9NVVgsCTB4MDAwMSwJLyogT1VUIERBQyAqLworCQlXTV9IUF9BVFRFTl9MLAkweDAxNzksCS8qIEhQIDBkQiAqLworCQlXTV9IUF9BVFRFTl9SLAkweDAxNzksCS8qIEhQIDBkQiAqLworCQlXTV9EQUNfQVRURU5fTCwJMHgwMDAwLAkvKiBEQUMgMGRCICovCisJCVdNX0RBQ19BVFRFTl9MLAkweDAxMDAsCS8qIERBQyAwZEIgKi8KKwkJV01fREFDX0FUVEVOX1IsCTB4MDAwMCwJLyogREFDIDBkQiAqLworCQlXTV9EQUNfQVRURU5fUiwJMHgwMTAwLAkvKiBEQUMgMGRCICovCisJCS8vIFdNX0RBQ19NQVNURVIsCTB4MDEwMCwJLyogREFDIG1hc3RlciBtdXRlZCAqLworCQlXTV9QSEFTRV9TV0FQLAkweDAwMDAsCS8qIHBoYXNlIG5vcm1hbCAqLworCQlXTV9EQUNfQ1RSTDIsCTB4MDAwMCwJLyogbm8gZGVlbXBoYXNpcywgbm8gWkZMRyAqLworCQlXTV9BRENfQVRURU5fTCwJMHgwMDAwLAkvKiBBREMgbXV0ZWQgKi8KKwkJV01fQURDX0FUVEVOX1IsCTB4MDAwMCwJLyogQURDIG11dGVkICovCisjaWYgMAorCQlXTV9BTENfQ1RSTDEsCTB4MDA3YiwJLyogKi8KKwkJV01fQUxDX0NUUkwyLAkweDAwMDAsCS8qICovCisJCVdNX0FMQ19DVFJMMywJMHgwMDAwLAkvKiAqLworCQlXTV9OT0lTRV9HQVRFLAkweDAwMDAsCS8qICovCisjZW5kaWYKKwkJV01fREFDX01VVEUsCTB4MDAwMCwJLyogREFDIHVubXV0ZSAqLworCQlXTV9BRENfTVVYLAkweDAwMDMsCS8qIEFEQyB1bm11dGUsIGJvdGggQ0QvTGluZSBPbiAqLworCX07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgY3NfaW5pdHNbXSA9IHsKKwkJMHgwNCwJMHg4MCwJLyogUlVOLCBSWFAwICovCisJCTB4MDUsCTB4MDUsCS8qIHNsYXZlLCAyNGJpdCAqLworCQkweDAxLAkweDAwLAorCQkweDAyLAkweDAwLAorCQkweDAzLAkweDAwLAorCX07CisJdW5zaWduZWQgaW50IGk7CisKKwlpY2UtPnZ0MTcyMCA9IDE7CisJaWNlLT5udW1fdG90YWxfZGFjcyA9IDI7CisJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisKKwkvKiB0byByZW1lYmVyIHRoZSByZWdpc3RlciB2YWx1ZXMgKi8KKwlpY2UtPmFrbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKGFrbTR4eHhfdCksIEdGUF9LRVJORUwpOworCWlmICghIGljZS0+YWttKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpY2UtPmFrbV9jb2RlY3MgPSAxOworCisJLyogSEFDSyAtIHVzZSB0aGlzIGFzIHRoZSBTUERJRiBzb3VyY2UuCisJICogZG9uJ3QgY2FsbCBzbmRfaWNlMTcxMl9ncGlvX2dldC9wdXQoKSwgb3RoZXJ3aXNlIGl0J3Mgb3ZlcndyaXR0ZW4KKwkgKi8KKwlpY2UtPmdwaW8uc2F2ZWRbMF0gPSAwOworCisJLyogaW5pdGlhbGl6ZSBXTTg3NzYgY29kZWMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bV9pbml0cyk7IGkgKz0gMikKKwkJd21fcHV0KGljZSwgd21faW5pdHNbaV0sIHdtX2luaXRzW2krMV0pOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KDEpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtX2luaXRzMik7IGkgKz0gMikKKwkJd21fcHV0KGljZSwgd21faW5pdHMyW2ldLCB3bV9pbml0czJbaSsxXSk7CisKKwkvKiBpbml0aWFsaXplIENTODQxNiBjb2RlYyAqLworCS8qIGFzc2VydCBQUlNUIzsgTVQwNSBiaXQgNyAqLworCW91dGIoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgfCAweDgwLCBJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpOworCW1kZWxheSg1KTsKKwkvKiBkZWFzc2VydCBQUlNUIyAqLworCW91dGIoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgJiB+MHg4MCwgSUNFTVQxNzI0KGljZSwgQUM5N19DTUQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzX2luaXRzKTsgaSArPSAyKQorCQlzcGlfd3JpdGUoaWNlLCBDU19ERVYsIGNzX2luaXRzW2ldLCBjc19pbml0c1tpKzFdKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQb250aXMgYm9hcmRzIGRvbid0IHByb3ZpZGUgdGhlIEVFUFJPTSBkYXRhIGF0IGFsbC4KKyAqIGhlbmNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gc2V0cyB1cCBpdCBwcm9wZXJseS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwb250aXNfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwkweDA4LAkvKiBTWVNDT05GOiBjbG9jayAyNTYsIG1wdTQwMSwgc3BkaWYtaW4vQURDLCAxREFDICovCisJMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KKwkweGY4LAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJMHgwNywJLyogR1BJT19ESVIgKi8KKwkweDAwLAkvKiBHUElPX0RJUjEgKi8KKwkweDAwLAkvKiBHUElPX0RJUjIgKGlnbm9yZWQpICovCisJMHgwZiwJLyogR1BJT19NQVNLICg0LTcgcmVzZXJ2ZWQgZm9yIENTODQxNikgKi8KKwkweGZmLAkvKiBHUElPX01BU0sxICovCisJMHgwMCwJLyogR1BJT19NQVNLMiAoaWdub3JlZCkgKi8KKwkweDA2LAkvKiBHUElPX1NUQVRFICgwLWxvdywgMS1oaWdoLCAyLWhpZ2gpICovCisJMHgwMCwJLyogR1BJT19TVEFURTEgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFMiAoaWdub3JlZCkgKi8KK307CisKKy8qIGVudHJ5IHBvaW50ICovCitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfcG9udGlzX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFX1BPTlRJU19NUzMwMCwKKwkJLm5hbWUgPSAiUG9udGlzIE1TMzAwIiwKKwkJLm1vZGVsID0gIm1zMzAwIiwKKwkJLmNoaXBfaW5pdCA9IHBvbnRpc19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBwb250aXNfYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2YocG9udGlzX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IHBvbnRpc19lZXByb20sCisJfSwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkMTM3OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX19TT1VORF9QT05USVNfSAorI2RlZmluZSBfX1NPVU5EX1BPTlRJU19ICisKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBWSUEgVlQxNzI0IChFbnZ5MjRIVCkKKyAqCisgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgUG9udGlzIE1TMzAwIGJvYXJkcworICoKKyAqCUNvcHlyaWdodCAoYykgMjAwNCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjZGVmaW5lIFBPTlRJU19ERVZJQ0VfREVTQyAJICAgICAgICJ7UG9udGlzLE1TMzAwfSwiCisKKyNkZWZpbmUgVlQxNzIwX1NVQkRFVklDRV9QT05USVNfTVMzMDAJMHgwMDAyMDAwMgkvKiBhIGR1bW15IGlkIGZvciBNUzMwMCAqLworCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9wb250aXNfY2FyZHNbXTsKKworI2VuZGlmIC8qIF9fU09VTkRfUE9OVElTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM1OTYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBWVDE3MjQgKEVudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBBdWRpb1RyYWsgUHJvZGlneSAxOTIgY2FyZHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDMgRGltaXRyb21hbm9sYWtpcyBBcG9zdG9sb3MgPGFwb3N0b2xAY3MudXRvcm9udG8uY2E+CisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwNCBLb3VpY2hpIE9OTyA8Y28yYkBjZXJlcy5kdGkubmUuanA+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgorI2luY2x1ZGUgInByb2RpZ3kxOTIuaCIKKyNpbmNsdWRlICJzdGFjOTQ2eC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhYzk0NjBfcHV0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzbmRfdnQxNzI0X3dyaXRlX2kyYyhpY2UsIFBST0RJR1kxOTJfU1RBQzk0NjBfQUREUiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc3RhYzk0NjBfZ2V0KGljZTE3MTJfdCAqaWNlLCBpbnQgcmVnKQoreworCXJldHVybiBzbmRfdnQxNzI0X3JlYWRfaTJjKGljZSwgUFJPRElHWTE5Ml9TVEFDOTQ2MF9BRERSLCByZWcpOworfQorCisvKgorICogREFDIG11dGUgY29udHJvbAorICovCitzdGF0aWMgaW50IHN0YWM5NDYwX2RhY19tdXRlX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCBpZHg7CisKKwlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpCisJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CisJZWxzZQorCQlpZHggID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCkgKyBTVEFDOTQ2WF9MRl9WT0xVTUU7CisJdmFsID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh+dmFsID4+IDcpICYgMHgxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2RhY19tdXRlX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CisJaW50IGlkeDsKKwlpbnQgY2hhbmdlOworCisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKQorCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCWVsc2UKKwkJaWR4ICA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICsgU1RBQzk0NlhfTEZfVk9MVU1FOworCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTw8IDcgJiAweDgwKSB8IChvbGQgJiB+MHg4MCk7CisJY2hhbmdlID0gKG5ldyAhPSBvbGQpOworCWlmIChjaGFuZ2UpCisJCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgbmV3KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBEQUMgdm9sdW1lIGF0dGVudWF0aW9uIG1peGVyIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfdm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CQkJLyogbXV0ZSAqLworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4N2Y7CQkvKiAwZEIgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGNoYXIgdm9sOworCisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKQorCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCWVsc2UKKwkJaWR4ICA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICsgU1RBQzk0NlhfTEZfVk9MVU1FOworCXZvbCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCkgJiAweDdmOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMHg3ZiAtIHZvbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2RhY192b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHg7CisJdW5zaWduZWQgY2hhciB0bXAsIG92b2wsIG52b2w7CisJaW50IGNoYW5nZTsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkKKwkJaWR4ID0gU1RBQzk0NlhfTUFTVEVSX1ZPTFVNRTsKKwllbHNlCisJCWlkeCAgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKSArIFNUQUM5NDZYX0xGX1ZPTFVNRTsKKwludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdG1wID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwlvdm9sID0gMHg3ZiAtICh0bXAgJiAweDdmKTsKKwljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKKwlpZiAoY2hhbmdlKSB7CisJCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgKDB4N2YgLSBudm9sKSB8ICh0bXAgJiAweDgwKSk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBBREMgbXV0ZSBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX211dGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGkpOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IH52YWw+PjcgJiAweDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX211dGVfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBuZXcsIG9sZDsKKwlpbnQgaSwgcmVnOworCWludCBjaGFuZ2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCXJlZyA9IFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGk7CisJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIHJlZyk7CisJCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV08PDcmMHg4MCkgfCAob2xkJn4weDgwKTsKKwkJY2hhbmdlID0gKG5ldyAhPSBvbGQpOworCQlpZiAoY2hhbmdlKQorCQkJc3RhYzk0NjBfcHV0KGljZSwgcmVnLCBuZXcpOworCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBBREMgZ2FpbiBtaXhlciBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX3ZvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJLyogMGRCICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHgwZjsJLyogMjIuNWRCICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX3ZvbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGksIHJlZzsKKwl1bnNpZ25lZCBjaGFyIHZvbDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJdm9sID0gc3RhYzk0NjBfZ2V0KGljZSwgcmVnKSAmIDB4MGY7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gMHgwZiAtIHZvbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSwgcmVnOworCXVuc2lnbmVkIGNoYXIgb3ZvbCwgbnZvbDsKKwlpbnQgY2hhbmdlOworCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOworCQludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCW92b2wgPSAweDBmIC0gc3RhYzk0NjBfZ2V0KGljZSwgcmVnKTsKKwkJY2hhbmdlID0gKChvdm9sICYgMHgwZikgICE9IG52b2wpOworCQlpZiAoY2hhbmdlKQorCQkJc3RhYzk0NjBfcHV0KGljZSwgcmVnLCAoMHgwZiAtIG52b2wpIHwgKG92b2wgJiB+MHgwZikpOworCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNpZiAwCisvKgorICogSGVhZHBob25lIEFtcGxpZmllcgorICovCitzdGF0aWMgaW50IGF1cmVvbl9zZXRfaGVhZHBob25lX2FtcChpY2UxNzEyX3QgKmljZSwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wLCB0bXAyOworCisJdG1wMiA9IHRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCWlmIChlbmFibGUpCisJCXRtcCB8PSBBVVJFT05fSFBfU0VMOworCWVsc2UKKwkJdG1wICY9IH4gQVVSRU9OX0hQX1NFTDsKKwlpZiAodG1wICE9IHRtcDIpIHsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fZ2V0X2hlYWRwaG9uZV9hbXAoaWNlMTcxMl90ICppY2UpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCisJcmV0dXJuICggdG1wICYgQVVSRU9OX0hQX1NFTCApIT0gMDsKK30KKworc3RhdGljIGludCBhdXJlb25fYm9vbF9pbmZvKHNuZF9rY29udHJvbF90ICprLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXJlb25faHBhbXBfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhdXJlb25fZ2V0X2hlYWRwaG9uZV9hbXAoaWNlKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGF1cmVvbl9ocGFtcF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJaWNlMTcxMl90ICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlyZXR1cm4gYXVyZW9uX3NldF9oZWFkcGhvbmVfYW1wKGljZSx1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Cit9CisKKy8qCisgKiBEZWVtcGhhc2lzCisgKi8KK3N0YXRpYyBpbnQgYXVyZW9uX2RlZW1wX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9EQUNfQ1RSTDIpICYgMHhmKSA9PSAweGY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVyZW9uX2RlZW1wX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgdGVtcCwgdGVtcDI7CisJdGVtcDIgPSB0ZW1wID0gd21fZ2V0KGljZSwgV01fREFDX0NUUkwyKTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXRlbXAgfD0gMHhmOworCWVsc2UKKwkJdGVtcCAmPSB+MHhmOworCWlmICh0ZW1wICE9IHRlbXAyKSB7CisJCXdtX3B1dChpY2UsIFdNX0RBQ19DVFJMMiwgdGVtcCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFEQyBPdmVyc2FtcGxpbmcKKyAqLworc3RhdGljIGludCBhdXJlb25fb3ZlcnNhbXBsaW5nX2luZm8oc25kX2tjb250cm9sX3QgKmssIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1syXSA9IHsgIjEyOHgiLCAiNjR4Igl9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9vdmVyc2FtcGxpbmdfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWljZTE3MTJfdCAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAod21fZ2V0KGljZSwgV01fTUFTVEVSKSAmIDB4OCkgPT0gMHg4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1cmVvbl9vdmVyc2FtcGxpbmdfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCWludCB0ZW1wLCB0ZW1wMjsKKwlpY2UxNzEyX3QgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXRlbXAyID0gdGVtcCA9IHdtX2dldChpY2UsIFdNX01BU1RFUik7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKKwkJdGVtcCB8PSAweDg7CisJZWxzZQorCQl0ZW1wICY9IH4weDg7CisKKwlpZiAodGVtcCAhPSB0ZW1wMikgeworCQl3bV9wdXQoaWNlLCBXTV9NQVNURVIsIHRlbXApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIG1peGVycworICovCisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc3RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX211dGVfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2RhY19tdXRlX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2RhY19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX3ZvbF9pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfZGFjX3ZvbF9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9kYWNfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiREFDIFN3aXRjaCIsCisJCS5jb3VudCA9IDYsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX211dGVfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2RhY19tdXRlX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2RhY19tdXRlX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRBQyBWb2x1bWUiLAorCQkuY291bnQgPSA2LAorCQkuaW5mbyA9IHN0YWM5NDYwX2RhY192b2xfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2RhY192b2xfZ2V0LAorCQkucHV0ID0gc3RhYzk0NjBfZGFjX3ZvbF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgU3dpdGNoIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBzdGFjOTQ2MF9hZGNfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfYWRjX211dGVfZ2V0LAorCQkucHV0ID0gc3RhYzk0NjBfYWRjX211dGVfcHV0LAorCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgVm9sdW1lIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBzdGFjOTQ2MF9hZGNfdm9sX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9hZGNfdm9sX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2FkY192b2xfcHV0LAorCX0sCisjaWYgMAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNhcHR1cmUgUm91dGUiLAorCQkuaW5mbyA9IHdtX2FkY19tdXhfaW5mbywKKwkJLmdldCA9IHdtX2FkY19tdXhfZ2V0LAorCQkucHV0ID0gd21fYWRjX211eF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJIZWFkcGhvbmUgQW1wbGlmaWVyIFN3aXRjaCIsCisJCS5pbmZvID0gYXVyZW9uX2Jvb2xfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9ocGFtcF9nZXQsCisJCS5wdXQgPSBhdXJlb25faHBhbXBfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQUMgRGVlbXBoYXNpcyBTd2l0Y2giLAorCQkuaW5mbyA9IGF1cmVvbl9ib29sX2luZm8sCisJCS5nZXQgPSBhdXJlb25fZGVlbXBfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2RlZW1wX3B1dAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQURDIE92ZXJzYW1wbGluZyIsCisJCS5pbmZvID0gYXVyZW9uX292ZXJzYW1wbGluZ19pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX292ZXJzYW1wbGluZ19nZXQsCisJCS5wdXQgPSBhdXJlb25fb3ZlcnNhbXBsaW5nX3B1dAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHByb2RpZ3kxOTJfYWRkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGFjX2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzdGFjX2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogaW5pdGlhbGl6ZSB0aGUgY2hpcAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwcm9kaWd5MTkyX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHN0YWNfaW5pdHNfcHJvZGlneVtdID0geworCQlTVEFDOTQ2WF9SRVNFVCwgMCwKKy8qCQlTVEFDOTQ2WF9NQVNURVJfVk9MVU1FLCAwLAorCQlTVEFDOTQ2WF9MRl9WT0xVTUUsIDAsCisJCVNUQUM5NDZYX1JGX1ZPTFVNRSwgMCwKKwkJU1RBQzk0NlhfTFJfVk9MVU1FLCAwLAorCQlTVEFDOTQ2WF9SUl9WT0xVTUUsIDAsCisJCVNUQUM5NDZYX0NFTlRFUl9WT0xVTUUsIDAsCisJCVNUQUM5NDZYX0xGRV9WT0xVTUUsIDAsKi8KKwkJKHVuc2lnbmVkIHNob3J0KS0xCisJfTsKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKworCS8qIHByb2RpZ3kgMTkyICovCisJaWNlLT5udW1fdG90YWxfZGFjcyA9IDY7CisJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJCisJLyogaW5pdGlhbGl6ZSBjb2RlYyAqLworCXAgPSBzdGFjX2luaXRzX3Byb2RpZ3k7CisJZm9yICg7ICpwICE9ICh1bnNpZ25lZCBzaG9ydCktMTsgcCArPSAyKQorCQlzdGFjOTQ2MF9wdXQoaWNlLCBwWzBdLCBwWzFdKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBBdXJlb24gYm9hcmRzIGRvbid0IHByb3ZpZGUgdGhlIEVFUFJPTSBkYXRhIGV4Y2VwdCBmb3IgdGhlIHZlbmRvciBJRHMuCisgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHgyYiwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBtcHU0MDEsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLworCTB4ZjgsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwkweGZmLAkvKiBHUElPX0RJUiAqLworCTB4ZmYsCS8qIEdQSU9fRElSMSAqLworCTB4YmYsCS8qIEdQSU9fRElSMiAqLworCTB4MDAsCS8qIEdQSU9fTUFTSyAqLworCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KKwkweDAwLAkvKiBHUElPX01BU0syICovCisJMHgwMCwJLyogR1BJT19TVEFURSAqLworCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCisJMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK307CisKKworLyogZW50cnkgcG9pbnQgKi8KK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1kxOTJWRSwKKwkJLm5hbWUgPSAiQXVkaW90cmFrIFByb2RpZ3kgMTkyIiwKKwkJLm1vZGVsID0gInByb2RpZ3kxOTIiLAorCQkuY2hpcF9pbml0ID0gcHJvZGlneTE5Ml9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBwcm9kaWd5MTkyX2FkZF9jb250cm9scywKKwkJLmVlcHJvbV9zaXplID0gc2l6ZW9mKHByb2RpZ3k3MV9lZXByb20pLAorCQkuZWVwcm9tX2RhdGEgPSBwcm9kaWd5NzFfZWVwcm9tLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjODI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fU09VTkRfUFJPRElHWTE5Ml9ICisjZGVmaW5lIF9fU09VTkRfUFJPRElHWTE5Ml9ICisKKyNkZWZpbmUgUFJPRElHWTE5Ml9ERVZJQ0VfREVTQyAJICAgICAgICJ7QXVkaW9UcmFrLFByb2RpZ3kgMTkyfSwiCisjZGVmaW5lIFBST0RJR1kxOTJfU1RBQzk0NjBfQUREUgkweDU0CisKKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZMTkyVkUJIDB4MzQ0OTUzNDUJLyogUFJPRElHWSAxOTIgVkUgKi8KKworZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfcHJvZGlneTE5Ml9jYXJkc1tdOworCisjZW5kaWYJLyogX19TT1VORF9QUk9ESUdZMTkyX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhkNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIE0tQXVkaW8gUmV2b2x1dGlvbiA3LjEKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKKyNpbmNsdWRlICJpY2UxNzEyLmgiCisjaW5jbHVkZSAiZW52eTI0aHQuaCIKKyNpbmNsdWRlICJyZXZvLmgiCisKK3N0YXRpYyB2b2lkIHJldm9faTJzX21jbGtfY2hhbmdlZChpY2UxNzEyX3QgKmljZSkKK3sKKwkvKiBhc3NlcnQgUFJTVCMgdG8gY29udmVydGVyczsgTVQwNSBiaXQgNyAqLworCW91dGIoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgfCAweDgwLCBJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpOworCW1kZWxheSg1KTsKKwkvKiBkZWFzc2VydCBQUlNUIyAqLworCW91dGIoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgJiB+MHg4MCwgSUNFTVQxNzI0KGljZSwgQUM5N19DTUQpKTsKK30KKworLyoKKyAqIGNoYW5nZSB0aGUgcmF0ZSBvZiBlbnZ5MjRIVCwgQUs0MzU1IGFuZCBBSzQzODEKKyAqLworc3RhdGljIHZvaWQgcmV2b19zZXRfcmF0ZV92YWwoYWttNHh4eF90ICphaywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgY2hhciBvbGQsIHRtcCwgZGZzOworCWludCByZWcsIHNoaWZ0OworCisJaWYgKHJhdGUgPT0gMCkJLyogbm8gaGludCAtIFMvUERJRiBpbnB1dCBpcyBtYXN0ZXIsIHNpbXBseSByZXR1cm4gKi8KKwkJcmV0dXJuOworCisJLyogYWRqdXN0IERGUyBvbiBjb2RlY3MgKi8KKwlpZiAocmF0ZSA+IDk2MDAwKQorCQlkZnMgPSAyOworCWVsc2UgaWYgKHJhdGUgPiA0ODAwMCkKKwkJZGZzID0gMTsKKwllbHNlCisJCWRmcyA9IDA7CisKKwlpZiAoYWstPnR5cGUgPT0gU05EX0FLNDM1NSkgeworCQlyZWcgPSAyOworCQlzaGlmdCA9IDQ7CisJfSBlbHNlIHsKKwkJcmVnID0gMTsKKwkJc2hpZnQgPSAzOworCX0KKwl0bXAgPSBzbmRfYWttNHh4eF9nZXQoYWssIDAsIHJlZyk7CisJb2xkID0gKHRtcCA+PiBzaGlmdCkgJiAweDAzOworCWlmIChvbGQgPT0gZGZzKQorCQlyZXR1cm47CisKKwkvKiByZXNldCBERlMgKi8KKwlzbmRfYWttNHh4eF9yZXNldChhaywgMSk7CisJdG1wID0gc25kX2FrbTR4eHhfZ2V0KGFrLCAwLCByZWcpOworCXRtcCAmPSB+KDB4MDMgPDwgc2hpZnQpOworCXRtcCB8PSBkZnMgPDwgc2hpZnQ7CisJLy8gc25kX2FrbTR4eHhfd3JpdGUoYWssIDAsIHJlZywgdG1wKTsKKwlzbmRfYWttNHh4eF9zZXQoYWssIDAsIHJlZywgdG1wKTsgLyogdGhlIHZhbHVlIGlzIHdyaXR0ZW4gaW4gcmVzZXQoMCkgKi8KKwlzbmRfYWttNHh4eF9yZXNldChhaywgMCk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIHRoZSBjaGlwcyBvbiBNLUF1ZGlvIFJldm9sdXRpb24gY2FyZHMKKyAqLworCitzdGF0aWMgYWttNHh4eF90IGFrbV9yZXZvX2Zyb250IF9fZGV2aW5pdGRhdGEgPSB7CisJLnR5cGUgPSBTTkRfQUs0MzgxLAorCS5udW1fZGFjcyA9IDIsCisJLm9wcyA9IHsKKwkJLnNldF9yYXRlX3ZhbCA9IHJldm9fc2V0X3JhdGVfdmFsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fZnJvbnRfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDEsCisJLmNpZiA9IDAsCisJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULAorCS5jbGtfbWFzayA9IFZUMTcyNF9SRVZPX0NDTEssCisJLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzIsCisJLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmFkZF9mbGFncyA9IFZUMTcyNF9SRVZPX0NDTEssIC8qIGhpZ2ggYXQgaW5pdCAqLworCS5tYXNrX2ZsYWdzID0gMCwKK307CisKK3N0YXRpYyBha200eHh4X3QgYWttX3Jldm9fc3Vycm91bmQgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQzNTUsCisJLmlkeF9vZmZzZXQgPSAxLAorCS5udW1fZGFjcyA9IDYsCisJLm9wcyA9IHsKKwkJLnNldF9yYXRlX3ZhbCA9IHJldm9fc2V0X3JhdGVfdmFsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fc3Vycm91bmRfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDMsCisJLmNpZiA9IDAsCisJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULAorCS5jbGtfbWFzayA9IFZUMTcyNF9SRVZPX0NDTEssCisJLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEsCisJLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmFkZF9mbGFncyA9IFZUMTcyNF9SRVZPX0NDTEssIC8qIGhpZ2ggYXQgaW5pdCAqLworCS5tYXNrX2ZsYWdzID0gMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsKKwkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLAorCTE3NjQwMCwgMTkyMDAwLAorfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgcmV2b19yYXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzKSwKKwkubGlzdCA9IHJhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJldm9faW5pdChpY2UxNzEyX3QgKmljZSkKK3sKKwlha200eHh4X3QgKmFrOworCWludCBlcnI7CisKKwkvKiBkZXRlcm1pbmUgSTJDLCBEQUNzIGFuZCBBRENzICovCisJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKKwljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjcxOgorCQlpY2UtPm51bV90b3RhbF9kYWNzID0gODsKKwkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWNlLT5ncGlvLmkyc19tY2xrX2NoYW5nZWQgPSByZXZvX2kyc19tY2xrX2NoYW5nZWQ7CisKKwkvKiBzZWNvbmQgc3RhZ2Ugb2YgaW5pdGlhbGl6YXRpb24sIGFuYWxvZyBwYXJ0cyBhbmQgb3RoZXJzICovCisJYWsgPSBpY2UtPmFrbSA9IGtjYWxsb2MoMiwgc2l6ZW9mKGFrbTR4eHhfdCksIEdGUF9LRVJORUwpOworCWlmICghIGFrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpY2UtPmFrbV9jb2RlY3MgPSAyOworCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CisJY2FzZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MToKKwkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fcmV2b19mcm9udCwgJmFrbV9yZXZvX2Zyb250X3ByaXYsIGljZSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrICsgMSwgJmFrbV9yZXZvX3N1cnJvdW5kLCAmYWttX3Jldm9fc3Vycm91bmRfcHJpdiwgaWNlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJLyogdW5tdXRlIGFsbCBjb2RlY3MgKi8KKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZV9iaXRzKGljZSwgVlQxNzI0X1JFVk9fTVVURSwgVlQxNzI0X1JFVk9fTVVURSk7CisJCWJyZWFrOworCX0KKworCWljZS0+aHdfcmF0ZXMgPSAmcmV2b19yYXRlczsgLyogQUsgY29kZWNzIGRvbid0IHN1cHBvcnQgbG93ZXIgdGhhbiAzMmsgKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJldm9fYWRkX2NvbnRyb2xzKGljZTE3MTJfdCAqaWNlKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgeworCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9SRVZPTFVUSU9ONzE6CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZW50cnkgcG9pbnQgKi8KK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MSwKKwkJLm5hbWUgPSAiTSBBdWRpbyBSZXZvbHV0aW9uLTcuMSIsCisJCS5tb2RlbCA9ICJyZXZvNzEiLAorCQkuY2hpcF9pbml0ID0gcmV2b19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSByZXZvX2FkZF9jb250cm9scywKKwl9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDQyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfX1NPVU5EX1JFVk9fSAorI2RlZmluZSBfX1NPVU5EX1JFVk9fSAorCisvKgorICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIE0tQXVkaW8gUmV2b2x1dGlvbiA3LjEKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDMgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2RlZmluZSBSRVZPX0RFVklDRV9ERVNDIFwKKwkJIntNaWRpTWFuIE0gQXVkaW8sUmV2b2x1dGlvbiA3LjF9LCIKKworI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MQkweDEyMTQzMDM2CisKKy8qIGVudHJ5IHBvaW50ICovCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Jldm9fY2FyZHNbXTsKKworCisvKgorICogIE1pZGlNYW4gTS1BdWRpbyBSZXZvbHV0aW9uIEdQSU8gZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFZUMTcyNF9SRVZPX0NDTEsJMHgwMgorI2RlZmluZSBWVDE3MjRfUkVWT19DRElOCTB4MDQJLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgVlQxNzI0X1JFVk9fQ0RPVVQJMHgwOAorI2RlZmluZSBWVDE3MjRfUkVWT19DUzAJCTB4MTAJLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgVlQxNzI0X1JFVk9fQ1MxCQkweDIwCS8qIGZyb250IEFLTTQzODEgY2hpcHNlbGVjdCAqLworI2RlZmluZSBWVDE3MjRfUkVWT19DUzIJCTB4NDAJLyogc3Vycm91bmQgQUtNNDM1NSBjaGlwc2VsZWN0ICovCisjZGVmaW5lIFZUMTcyNF9SRVZPX01VVEUJKDE8PDIyKQkvKiAwID0gYWxsIG11dGUsIDEgPSBub3JtYWwgb3BlcmF0aW9uICovCisKKyNlbmRpZiAvKiBfX1NPVU5EX1JFVk9fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvc3RhYzk0NnguaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3N0YWM5NDZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzOTA5NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3N0YWM5NDZ4LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX1NPVU5EX1NUQUM5NDZYX0gKKyNkZWZpbmUgX19TT1VORF9TVEFDOTQ2WF9ICisKKyNkZWZpbmUgU1RBQzk0NlhfUkVTRVQJCQkweDAwCisjZGVmaW5lIFNUQUM5NDZYX1NUQVRVUwkJCTB4MDEKKyNkZWZpbmUgU1RBQzk0NlhfTUFTVEVSX1ZPTFVNRQkJMHgwMgorI2RlZmluZSBTVEFDOTQ2WF9MRl9WT0xVTUUJCTB4MDMKKyNkZWZpbmUgU1RBQzk0NlhfUkZfVk9MVU1FCQkweDA0CisjZGVmaW5lIFNUQUM5NDZYX0xSX1ZPTFVNRQkJMHgwNQorI2RlZmluZSBTVEFDOTQ2WF9SUl9WT0xVTUUJCTB4MDYKKyNkZWZpbmUgU1RBQzk0NlhfQ0VOVEVSX1ZPTFVNRQkJMHgwNworI2RlZmluZSBTVEFDOTQ2WF9MRkVfVk9MVU1FCQkweDA4CisjZGVmaW5lIFNUQUM5NDZYX01JQ19MX1ZPTFVNRQkJMHgwOQorI2RlZmluZSBTVEFDOTQ2WF9NSUNfUl9WT0xVTUUJCTB4MGEKKyNkZWZpbmUgU1RBQzk0NlhfREVFTVBIQVNJUwkJMHgwYworI2RlZmluZSBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UJMHgwZAorI2RlZmluZSBTVEFDOTQ2WF9BVURJT19QT1JUX0NPTlRST0wJMHgwZQorI2RlZmluZSBTVEFDOTQ2WF9NQVNURVJfQ0xPQ0tJTkcJMHgwZgorI2RlZmluZSBTVEFDOTQ2WF9QT1dFUkRPV05fQ1RSTDEJMHgxMAorI2RlZmluZSBTVEFDOTQ2WF9QT1dFUkRPV05fQ1RSTDIJMHgxMQorI2RlZmluZSBTVEFDOTQ2WF9SRVZJU0lPTl9DT0RFCQkweDEyCisjZGVmaW5lIFNUQUM5NDZYX0FERFJFU1NfQ09OVFJPTAkweDEzCisjZGVmaW5lIFNUQUM5NDZYX0FERFJFU1MJCTB4MTQKKworI2VuZGlmICAvKiAgX19TT1VORF9TVEFDOTQ2WF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5jIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ5MjYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIFZUMTcyMC9WVDE3MjQgKEVudnkyNFBUL0VudnkyNEhUKQorICoKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBWVDE3MjAtYmFzZWQgbW90aGVyYm9hcmRzCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorCisjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgInZ0MTcyMF9tb2JvLmgiCisKKworc3RhdGljIGludCBfX2RldmluaXQgazh4ODAwX2luaXQoaWNlMTcxMl90ICppY2UpCit7CisJaWNlLT52dDE3MjAgPSAxOworCisJLyogVlQxNjE2IGNvZGVjICovCisJaWNlLT5udW1fdG90YWxfZGFjcyA9IDY7CisJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisKKwkvKiBXTTg3MjggY29kZWMgKi8KKwkvKiBGSVhNRTogVE9ETyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGs4eDgwMF9hZGRfY29udHJvbHMoaWNlMTcxMl90ICppY2UpCit7CisJLyogRklYTUU6IG5lZWRzIHNvbWUgcXVpcmtzIGZvciBWVDE2MTY/ICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEVFUFJPTSBpbWFnZSAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBrOHg4MDBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwkweDAxLAkvKiBTWVNDT05GOiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCisJMHgwMiwJLyogQUNMSU5LOiBBQ0xJTkssIHBhY2tlZCAqLworCTB4MDAsCS8qIEkyUzogLSAqLworCTB4MDAsCS8qIFNQRElGOiAtICovCisJMHhmZiwJLyogR1BJT19ESVIgKi8KKwkweGZmLAkvKiBHUElPX0RJUjEgKi8KKwkweDAwLAkvKiAtICovCisJMHhmZiwJLyogR1BJT19NQVNLICovCisJMHhmZiwJLyogR1BJT19NQVNLMSAqLworCTB4MDAsCS8qIC0gKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFICovCisJMHgwMCwJLyogR1BJT19TVEFURTEgKi8KKwkweDAwLAkvKiAtICovCit9OworCisKKy8qIGVudHJ5IHBvaW50ICovCitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfbW9ib19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gVlQxNzIwX1NVQkRFVklDRV9LOFg4MDAsCisJCS5uYW1lID0gIkFsYmF0cm9uIEs4WDgwMCBQcm8gSUkiLAorCQkubW9kZWwgPSAiazh4ODAwIiwKKwkJLmNoaXBfaW5pdCA9IGs4eDgwMF9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBrOHg4MDBfYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2Yoazh4ODAwX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IGs4eDgwMF9lZXByb20sCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFX1pORjNfMTUwLAorCQkubmFtZSA9ICJDaGFpbnRlY2ggWk5GMy0xNTAiLAorCQkvKiBpZGVudGljYWwgd2l0aCBrOHg4MDAgKi8KKwkJLmNoaXBfaW5pdCA9IGs4eDgwMF9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBrOHg4MDBfYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2Yoazh4ODAwX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IGs4eDgwMF9lZXByb20sCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFX1pORjNfMjUwLAorCQkubmFtZSA9ICJDaGFpbnRlY2ggWk5GMy0yNTAiLAorCQkvKiBpZGVudGljYWwgd2l0aCBrOHg4MDAgKi8KKwkJLmNoaXBfaW5pdCA9IGs4eDgwMF9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSBrOHg4MDBfYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2Yoazh4ODAwX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IGs4eDgwMF9lZXByb20sCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFXzlDSlMsCisJCS5uYW1lID0gIkNoYWludGVjaCA5Q0pTIiwKKwkJLyogaWRlbnRpY2FsIHdpdGggazh4ODAwICovCisJCS5jaGlwX2luaXQgPSBrOHg4MDBfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gazh4ODAwX2FkZF9jb250cm9scywKKwkJLmVlcHJvbV9zaXplID0gc2l6ZW9mKGs4eDgwMF9lZXByb20pLAorCQkuZWVwcm9tX2RhdGEgPSBrOHg4MDBfZWVwcm9tLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmggYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDllYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19TT1VORF9WVDE3MjBfTU9CT19ICisjZGVmaW5lIF9fU09VTkRfVlQxNzIwX01PQk9fSAorCisvKgorICogICBBTFNBIGRyaXZlciBmb3IgVlQxNzIwL1ZUMTcyNCAoRW52eTI0UFQvRW52eTI0SFQpCisgKgorICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIFZUMTcyMC1iYXNlZCBtb3RoZXJib2FyZHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDQgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2RlZmluZSBWVDE3MjBfTU9CT19ERVZJQ0VfREVTQyAgICAgICAgIntBbGJhdHJvbixLOFg4MDAgUHJvIElJfSwiXAorCQkJCSAgICAgICAie0NoYWludGVjaCxaTkYzLTE1MH0sIlwKKwkJCQkgICAgICAgIntDaGFpbnRlY2gsWk5GMy0yNTB9LCJcCisJCQkJICAgICAgICJ7Q2hhaW50ZWNoLDlDSlN9LCIKKworI2RlZmluZSBWVDE3MjBfU1VCREVWSUNFX0s4WDgwMAkJMHhmMjE3MDUyYworI2RlZmluZSBWVDE3MjBfU1VCREVWSUNFX1pORjNfMTUwCTB4MGYyNzQxZjYKKyNkZWZpbmUgVlQxNzIwX1NVQkRFVklDRV9aTkYzXzI1MAkweDBmMjc0NWY2CisjZGVmaW5lIFZUMTcyMF9TVUJERVZJQ0VfOUNKUwkJMHgwZjI3MjMyNworCitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9tb2JvX2NhcmRzW107CisKKyNlbmRpZiAvKiBfX1NPVU5EX1ZUMTcyMF9NT0JPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViOTQwZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCkBAIC0wLDAgKzEsMjg1NSBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIEludGVsIElDSCAoaTh4MCkgY2hpcHNldHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqCisgKiAgIFRoaXMgY29kZSBhbHNvIGNvbnRhaW5zIGFscGhhIHN1cHBvcnQgZm9yIFNpUyA3MzUgY2hpcHNldHMgcHJvdmlkZWQKKyAqICAgYnkgTWlrZSBQaWVwZXIgPG1wdGVpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uIFdlIGhhdmUgbm8gZGF0YXNoZWV0CisgKiAgIGZvciBTaVM3MzUsIHNvIHRoZSBjb2RlIGlzIG5vdCBmdWxseSBmdW5jdGlvbmFsLgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKy8qIGZvciA0NDBNWCB3b3JrYXJvdW5kICovCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIDgyODAxQUEsODI5MDFBQixpODEwLGk4MjAsaTgzMCxpODQwLGk4NDUsTVg0NDA7IFNpUyA3MDEyOyBBbGkgNTQ1NSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7SW50ZWwsODI4MDFBQS1JQ0h9LCIKKwkJIntJbnRlbCw4MjkwMUFCLUlDSDB9LCIKKwkJIntJbnRlbCw4MjgwMUJBLUlDSDJ9LCIKKwkJIntJbnRlbCw4MjgwMUNBLUlDSDN9LCIKKwkJIntJbnRlbCw4MjgwMURCLUlDSDR9LCIKKwkJIntJbnRlbCxJQ0g1fSwiCisJCSJ7SW50ZWwsSUNINn0sIgorCQkie0ludGVsLElDSDd9LCIKKwkJIntJbnRlbCw2MzAwRVNCfSwiCisJCSJ7SW50ZWwsTVg0NDB9LCIKKwkJIntTaVMsU0k3MDEyfSwiCisJCSJ7TlZpZGlhLG5Gb3JjZSBBdWRpb30sIgorCQkie05WaWRpYSxuRm9yY2UyIEF1ZGlvfSwiCisJCSJ7QU1ELEFNRDc2OH0sIgorCQkie0FNRCxBTUQ4MTExfSwiCisJICAgICAgICAie0FMSSxNNTQ1NX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBhYzk3X2Nsb2NrW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07CitzdGF0aWMgY2hhciAqYWM5N19xdWlya1tTTkRSVl9DQVJEU107CitzdGF0aWMgaW50IGJ1Z2d5X2lycVtTTkRSVl9DQVJEU107CitzdGF0aWMgaW50IHhib3hbU05EUlZfQ0FSRFNdOworCisjaWZkZWYgU1VQUE9SVF9NSURJCitzdGF0aWMgaW50IG1wdV9wb3J0W1NORFJWX0NBUkRTXTsgLyogZGlzYWJsZWQgKi8KKyNlbmRpZgorCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBJbnRlbCBpOHgwIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgSW50ZWwgaTh4MCBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYWM5N19jbG9jaywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19jbG9jaywgIkFDJzk3IGNvZGVjIGNsb2NrICgwID0gYXV0by1kZXRlY3QpLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGFjOTdfcXVpcmssIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19xdWlyaywgIkFDJzk3IHdvcmthcm91bmQgZm9yIHN0cmFuZ2UgaGFyZHdhcmUuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnVnZ3lfaXJxLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVnZ3lfaXJxLCAiRW5hYmxlIHdvcmthcm91bmQgZm9yIGJ1Z2d5IGludGVycnVwdHMgb24gc29tZSBtb3RoZXJib2FyZHMuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoeGJveCwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHhib3gsICJTZXQgdG8gMSBmb3IgWGJveCwgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGUgQUMnOTcgY29kZWMgZGV0ZWN0aW9uLiIpOworCisvKgorICogIERpcmVjdCByZWdpc3RlcnMKKyAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMSAgICAgICAweDI0MTUKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MDEgICAgICAgMHgyNDI1CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQSAgICAgMHgyNDQ1CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF80NDBNWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzQ0ME1YICAgICAgIDB4NzE5NQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDMJMHgyNDg1CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINAkweDI0YzUKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g1CTB4MjRkNQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfNQkweDI1YTYKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzE4CTB4MjY2ZQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18yMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMjAJMHgyN2RlCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83MDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAxMgkJMHg3MDEyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfTUNQX0FVRElPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUF9BVURJTwkweDAxYjEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzgwNF9BVURJTworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzgwNF9BVURJTyAweDAwNTkKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AyX0FVRElPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDJfQVVESU8JMHgwMDZhCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfQ0s4X0FVRElPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLOF9BVURJTwkweDAwOGEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AzX0FVRElPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDNfQVVESU8JMHgwMGRhCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfQ0s4U19BVURJTworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzhTX0FVRElPCTB4MDBlYQorI2VuZGlmCisKK2VudW0geyBERVZJQ0VfSU5URUwsIERFVklDRV9JTlRFTF9JQ0g0LCBERVZJQ0VfU0lTLCBERVZJQ0VfQUxJLCBERVZJQ0VfTkZPUkNFIH07CisKKyNkZWZpbmUgSUNIUkVHKHgpIElDSF9SRUdfIyN4CisKKyNkZWZpbmUgREVGSU5FX1JFR1NFVChuYW1lLGJhc2UpIFwKK2VudW0geyBcCisJSUNIX1JFR18jI25hbWUjI19CREJBUgk9IGJhc2UgKyAweDAsCS8qIGR3b3JkIC0gYnVmZmVyIGRlc2NyaXB0b3IgbGlzdCBiYXNlIGFkZHJlc3MgKi8gXAorCUlDSF9SRUdfIyNuYW1lIyNfQ0lWCT0gYmFzZSArIDB4MDQsCS8qIGJ5dGUgLSBjdXJyZW50IGluZGV4IHZhbHVlICovIFwKKwlJQ0hfUkVHXyMjbmFtZSMjX0xWSQk9IGJhc2UgKyAweDA1LAkvKiBieXRlIC0gbGFzdCB2YWxpZCBpbmRleCAqLyBcCisJSUNIX1JFR18jI25hbWUjI19TUgk9IGJhc2UgKyAweDA2LAkvKiBieXRlIC0gc3RhdHVzIHJlZ2lzdGVyICovIFwKKwlJQ0hfUkVHXyMjbmFtZSMjX1BJQ0IJPSBiYXNlICsgMHgwOCwJLyogd29yZCAtIHBvc2l0aW9uIGluIGN1cnJlbnQgYnVmZmVyICovIFwKKwlJQ0hfUkVHXyMjbmFtZSMjX1BJVgk9IGJhc2UgKyAweDBhLAkvKiBieXRlIC0gcHJlZmV0Y2hlZCBpbmRleCB2YWx1ZSAqLyBcCisJSUNIX1JFR18jI25hbWUjI19DUgk9IGJhc2UgKyAweDBiLAkvKiBieXRlIC0gY29udHJvbCByZWdpc3RlciAqLyBcCit9OworCisvKiBidXNtYXN0ZXIgYmxvY2tzICovCitERUZJTkVfUkVHU0VUKE9GRiwgMCk7CQkvKiBvZmZzZXQgKi8KK0RFRklORV9SRUdTRVQoUEksIDB4MDApOwkvKiBQQ00gaW4gKi8KK0RFRklORV9SRUdTRVQoUE8sIDB4MTApOwkvKiBQQ00gb3V0ICovCitERUZJTkVfUkVHU0VUKE1DLCAweDIwKTsJLyogTWljIGluICovCisKKy8qIElDSDQgYnVzbWFzdGVyIGJsb2NrcyAqLworREVGSU5FX1JFR1NFVChNQzIsIDB4NDApOwkvKiBNaWMgaW4gMiAqLworREVGSU5FX1JFR1NFVChQSTIsIDB4NTApOwkvKiBQQ00gaW4gMiAqLworREVGSU5FX1JFR1NFVChTUCwgMHg2MCk7CS8qIFNQRElGIG91dCAqLworCisvKiB2YWx1ZXMgZm9yIGVhY2ggYnVzbWFzdGVyIGJsb2NrICovCisKKy8qIExWSSAqLworI2RlZmluZSBJQ0hfUkVHX0xWSV9NQVNLCQkweDFmCisKKy8qIFNSICovCisjZGVmaW5lIElDSF9GSUZPRQkJCTB4MTAJLyogRklGTyBlcnJvciAqLworI2RlZmluZSBJQ0hfQkNJUwkJCTB4MDgJLyogYnVmZmVyIGNvbXBsZXRpb24gaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJQ0hfTFZCQ0kJCQkweDA0CS8qIGxhc3QgdmFsaWQgYnVmZmVyIGNvbXBsZXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lIElDSF9DRUxWCQkJMHgwMgkvKiBjdXJyZW50IGVxdWFscyBsYXN0IHZhbGlkICovCisjZGVmaW5lIElDSF9EQ0gJCQkJMHgwMQkvKiBETUEgY29udHJvbGxlciBoYWx0ZWQgKi8KKworLyogUElWICovCisjZGVmaW5lIElDSF9SRUdfUElWX01BU0sJCTB4MWYJLyogbWFzayAqLworCisvKiBDUiAqLworI2RlZmluZSBJQ0hfSU9DRQkJCTB4MTAJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gZW5hYmxlICovCisjZGVmaW5lIElDSF9GRUlFCQkJMHgwOAkvKiBmaWZvIGVycm9yIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUNIX0xWQklFCQkJMHgwNAkvKiBsYXN0IHZhbGlkIGJ1ZmZlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElDSF9SRVNFVFJFR1MJCQkweDAyCS8qIHJlc2V0IGJ1c21hc3RlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSUNIX1NUQVJUQk0JCQkweDAxCS8qIHN0YXJ0IGJ1c21hc3RlciBvcGVyYXRpb24gKi8KKworCisvKiBnbG9iYWwgYmxvY2sgKi8KKyNkZWZpbmUgSUNIX1JFR19HTE9CX0NOVAkJMHgyYwkvKiBkd29yZCAtIGdsb2JhbCBjb250cm9sICovCisjZGVmaW5lICAgSUNIX1BDTV9TUERJRl9NQVNLCTB4YzAwMDAwMDAJLyogcy9wZGlmIHBjbSBzbG90IG1hc2sgKElDSDQpICovCisjZGVmaW5lICAgSUNIX1BDTV9TUERJRl9OT05FCTB4MDAwMDAwMDAJLyogcmVzZXJ2ZWQgLSB1bmRlZmluZWQgKi8KKyNkZWZpbmUgICBJQ0hfUENNX1NQRElGXzc4CTB4NDAwMDAwMDAJLyogcy9wZGlmIHBjbSBvbiBzbG90cyA3JjggKi8KKyNkZWZpbmUgICBJQ0hfUENNX1NQRElGXzY5CTB4ODAwMDAwMDAJLyogcy9wZGlmIHBjbSBvbiBzbG90cyA2JjkgKi8KKyNkZWZpbmUgICBJQ0hfUENNX1NQRElGXzEwMTEJMHhjMDAwMDAwMAkvKiBzL3BkaWYgcGNtIG9uIHNsb3RzIDEwJjExICovCisjZGVmaW5lICAgSUNIX1BDTV8yMEJJVAkJMHgwMDQwMDAwMAkvKiAyMC1iaXQgc2FtcGxlcyAoSUNINCkgKi8KKyNkZWZpbmUgICBJQ0hfUENNXzI0Nl9NQVNLCTB4MDAzMDAwMDAJLyogNiBjaGFubmVscyAobm90IGFsbCBjaGlwcykgKi8KKyNkZWZpbmUgICBJQ0hfUENNXzYJCTB4MDAyMDAwMDAJLyogNiBjaGFubmVscyAobm90IGFsbCBjaGlwcykgKi8KKyNkZWZpbmUgICBJQ0hfUENNXzQJCTB4MDAxMDAwMDAJLyogNCBjaGFubmVscyAobm90IGFsbCBjaGlwcykgKi8KKyNkZWZpbmUgICBJQ0hfUENNXzIJCTB4MDAwMDAwMDAJLyogMiBjaGFubmVscyAoc3RlcmVvKSAqLworI2RlZmluZSAgIElDSF9TSVNfUENNXzI0Nl9NQVNLCTB4MDAwMDAwYzAJLyogNiBjaGFubmVscyAoU0lTNzAxMikgKi8KKyNkZWZpbmUgICBJQ0hfU0lTX1BDTV82CQkweDAwMDAwMDgwCS8qIDYgY2hhbm5lbHMgKFNJUzcwMTIpICovCisjZGVmaW5lICAgSUNIX1NJU19QQ01fNAkJMHgwMDAwMDA0MAkvKiA0IGNoYW5uZWxzIChTSVM3MDEyKSAqLworI2RlZmluZSAgIElDSF9TSVNfUENNXzIJCTB4MDAwMDAwMDAJLyogMiBjaGFubmVscyAoU0lTNzAxMikgKi8KKyNkZWZpbmUgICBJQ0hfVFJJRQkJMHgwMDAwMDA0MAkvKiB0ZXJ0aWFyeSByZXN1bWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIElDSF9TUklFCQkweDAwMDAwMDIwCS8qIHNlY29uZGFyeSByZXN1bWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIElDSF9QUklFCQkweDAwMDAwMDEwCS8qIHByaW1hcnkgcmVzdW1lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICBJQ0hfQUNMSU5LCQkweDAwMDAwMDA4CS8qIEFDbGluayBzaHV0IG9mZiAqLworI2RlZmluZSAgIElDSF9BQzk3V0FSTQkJMHgwMDAwMDAwNAkvKiBBQyc5NyB3YXJtIHJlc2V0ICovCisjZGVmaW5lICAgSUNIX0FDOTdDT0xECQkweDAwMDAwMDAyCS8qIEFDJzk3IGNvbGQgcmVzZXQgKi8KKyNkZWZpbmUgICBJQ0hfR0lFCQkweDAwMDAwMDAxCS8qIEdQSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElDSF9SRUdfR0xPQl9TVEEJCTB4MzAJLyogZHdvcmQgLSBnbG9iYWwgc3RhdHVzICovCisjZGVmaW5lICAgSUNIX1RSSQkJMHgyMDAwMDAwMAkvKiBJQ0g0OiB0ZXJ0aWFyeSAoQUNfU0RJTjIpIHJlc3VtZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfVENSCQkweDEwMDAwMDAwCS8qIElDSDQ6IHRlcnRpYXJ5IChBQ19TRElOMikgY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgICBJQ0hfQkNTCQkweDA4MDAwMDAwCS8qIElDSDQ6IGJpdCBjbG9jayBzdG9wcGVkICovCisjZGVmaW5lICAgSUNIX1NQSU5UCQkweDA0MDAwMDAwCS8qIElDSDQ6IFMvUERJRiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfUDJJTlQJCTB4MDIwMDAwMDAJLyogSUNINDogUENNMi1JbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfTTJJTlQJCTB4MDEwMDAwMDAJLyogSUNINDogTWljMi1JbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfU0FNUExFX0NBUAkweDAwYzAwMDAwCS8qIElDSDQ6IHNhbXBsZSBjYXBhYmlsaXR5IGJpdHMgKFJPKSAqLworI2RlZmluZSAgIElDSF9TQU1QTEVfMTZfMjAJMHgwMDQwMDAwMAkvKiBJQ0g0OiAxNi0gYW5kIDIwLWJpdCBzYW1wbGVzICovCisjZGVmaW5lICAgSUNIX01VTFRJQ0hBTl9DQVAJMHgwMDMwMDAwMAkvKiBJQ0g0OiBtdWx0aS1jaGFubmVsIGNhcGFiaWxpdHkgYml0cyAoUk8pICovCisjZGVmaW5lICAgSUNIX01EMwkJMHgwMDAyMDAwMAkvKiBtb2RlbSBwb3dlciBkb3duIHNlbWFwaG9yZSAqLworI2RlZmluZSAgIElDSF9BRDMJCTB4MDAwMTAwMDAJLyogYXVkaW8gcG93ZXIgZG93biBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgICBJQ0hfUkNTCQkweDAwMDA4MDAwCS8qIHJlYWQgY29tcGxldGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgICBJQ0hfQklUMwkJMHgwMDAwNDAwMAkvKiBiaXQgMyBzbG90IDEyICovCisjZGVmaW5lICAgSUNIX0JJVDIJCTB4MDAwMDIwMDAJLyogYml0IDIgc2xvdCAxMiAqLworI2RlZmluZSAgIElDSF9CSVQxCQkweDAwMDAxMDAwCS8qIGJpdCAxIHNsb3QgMTIgKi8KKyNkZWZpbmUgICBJQ0hfU1JJCQkweDAwMDAwODAwCS8qIHNlY29uZGFyeSAoQUNfU0RJTjEpIHJlc3VtZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfUFJJCQkweDAwMDAwNDAwCS8qIHByaW1hcnkgKEFDX1NESU4wKSByZXN1bWUgaW50ZXJydXB0ICovCisjZGVmaW5lICAgSUNIX1NDUgkJMHgwMDAwMDIwMAkvKiBzZWNvbmRhcnkgKEFDX1NESU4xKSBjb2RlYyByZWFkeSAqLworI2RlZmluZSAgIElDSF9QQ1IJCTB4MDAwMDAxMDAJLyogcHJpbWFyeSAoQUNfU0RJTjApIGNvZGVjIHJlYWR5ICovCisjZGVmaW5lICAgSUNIX01DSU5UCQkweDAwMDAwMDgwCS8qIE1JQyBjYXB0dXJlIGludGVycnVwdCAqLworI2RlZmluZSAgIElDSF9QT0lOVAkJMHgwMDAwMDA0MAkvKiBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfUElJTlQJCTB4MDAwMDAwMjAJLyogY2FwdHVyZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfTlZTUElOVAkJMHgwMDAwMDAxMAkvKiBuZm9yY2Ugc3BkaWYgaW50ZXJydXB0ICovCisjZGVmaW5lICAgSUNIX01PSU5UCQkweDAwMDAwMDA0CS8qIG1vZGVtIHBsYXliYWNrIGludGVycnVwdCAqLworI2RlZmluZSAgIElDSF9NSUlOVAkJMHgwMDAwMDAwMgkvKiBtb2RlbSBjYXB0dXJlIGludGVycnVwdCAqLworI2RlZmluZSAgIElDSF9HU0NJCQkweDAwMDAwMDAxCS8qIEdQSSBzdGF0dXMgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBJQ0hfUkVHX0FDQ19TRU1BCQkweDM0CS8qIGJ5dGUgLSBjb2RlYyB3cml0ZSBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgICBJQ0hfQ0FTCQkweDAxCQkvKiBjb2RlYyBhY2Nlc3Mgc2VtYXBob3JlICovCisjZGVmaW5lIElDSF9SRUdfU0RNCQkweDgwCisjZGVmaW5lICAgSUNIX0RJMkxfTUFTSwkJMHgwMDAwMDBjMAkvKiBQQ00gSW4gMiwgTWljIEluIDIgZGF0YSBpbiBsaW5lICovCisjZGVmaW5lICAgSUNIX0RJMkxfU0hJRlQJNgorI2RlZmluZSAgIElDSF9ESTFMX01BU0sJCTB4MDAwMDAwMzAJLyogUENNIEluIDEsIE1pYyBJbiAxIGRhdGEgaW4gbGluZSAqLworI2RlZmluZSAgIElDSF9ESTFMX1NISUZUCTQKKyNkZWZpbmUgICBJQ0hfU0UJCTB4MDAwMDAwMDgJLyogc3RlZXIgZW5hYmxlICovCisjZGVmaW5lICAgSUNIX0xESV9NQVNLCQkweDAwMDAwMDAzCS8qIGxhc3QgY29kZWMgcmVhZCBkYXRhIGlucHV0ICovCisKKyNkZWZpbmUgSUNIX01BWF9GUkFHUwkJMzIJCS8qIG1heCBodyBmcmFncyAqLworCisKKy8qCisgKiByZWdpc3RlcnMgZm9yIEFsaTU0NTUKKyAqLworCisvKiBBTGkgNTQ1NSBidXNtYXN0ZXIgYmxvY2tzICovCitERUZJTkVfUkVHU0VUKEFMX1BJLCAweDQwKTsJLyogQUxpIFBDTSBpbiAqLworREVGSU5FX1JFR1NFVChBTF9QTywgMHg1MCk7CS8qIEFsaSBQQ00gb3V0ICovCitERUZJTkVfUkVHU0VUKEFMX01DLCAweDYwKTsJLyogQWxpIE1pYyBpbiAqLworREVGSU5FX1JFR1NFVChBTF9DRENfU1BPLCAweDcwKTsJLyogQWxpIENvZGVjIFNQRElGIG91dCAqLworREVGSU5FX1JFR1NFVChBTF9DRU5URVIsIDB4ODApOwkJLyogQWxpIGNlbnRlciBvdXQgKi8KK0RFRklORV9SRUdTRVQoQUxfTEZFLCAweDkwKTsJCS8qIEFsaSBjZW50ZXIgb3V0ICovCitERUZJTkVfUkVHU0VUKEFMX0NMUl9TUEksIDB4YTApOwkvKiBBbGkgQ29udHJvbGxlciBTUERJRiBpbiAqLworREVGSU5FX1JFR1NFVChBTF9DTFJfU1BPLCAweGIwKTsJLyogQWxpIENvbnRyb2xsZXIgU1BESUYgb3V0ICovCitERUZJTkVfUkVHU0VUKEFMX0kyUywgMHhjMCk7CS8qIEFsaSBJMlMgaW4gKi8KK0RFRklORV9SRUdTRVQoQUxfUEkyLCAweGQwKTsJLyogQWxpIFBDTTIgaW4gKi8KK0RFRklORV9SRUdTRVQoQUxfTUMyLCAweGUwKTsJLyogQWxpIE1pYzIgaW4gKi8KKworZW51bSB7CisJSUNIX1JFR19BTElfU0NSID0gMHgwMCwJCS8qIFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisJSUNIX1JFR19BTElfU1NSID0gMHgwNCwJCS8qIFN5c3RlbSBTdGF0dXMgUmVnaXN0ZXIgICovCisJSUNIX1JFR19BTElfRE1BQ1IgPSAweDA4LAkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAgICAqLworCUlDSF9SRUdfQUxJX0ZJRk9DUjEgPSAweDBjLAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgMSAgKi8KKwlJQ0hfUkVHX0FMSV9JTlRFUkZBQ0VDUiA9IDB4MTAsCS8qIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisJSUNIX1JFR19BTElfSU5URVJSVVBUQ1IgPSAweDE0LAkvKiBJbnRlcnJ1cHQgY29udHJvbCBSZWdpc3RlciAqLworCUlDSF9SRUdfQUxJX0lOVEVSUlVQVFNSID0gMHgxOCwJLyogSW50ZXJydXB0ICBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlJQ0hfUkVHX0FMSV9GSUZPQ1IyID0gMHgxYywJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIDIgICAqLworCUlDSF9SRUdfQUxJX0NQUiA9IDB4MjAsCQkvKiBDb21tYW5kIFBvcnQgUmVnaXN0ZXIgICAgICovCisJSUNIX1JFR19BTElfQ1BSX0FERFIgPSAweDIyLAkvKiBhYzk3IGFkZHIgd3JpdGUgKi8KKwlJQ0hfUkVHX0FMSV9TUFIgPSAweDI0LAkJLyogU3RhdHVzIFBvcnQgUmVnaXN0ZXIgICAgICAqLworCUlDSF9SRUdfQUxJX1NQUl9BRERSID0gMHgyNiwJLyogYWM5NyBhZGRyIHJlYWQgKi8KKwlJQ0hfUkVHX0FMSV9GSUZPQ1IzID0gMHgyYywJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIDMgICovCisJSUNIX1JFR19BTElfVFRTUiA9IDB4MzAsCS8qIFRyYW5zbWl0IFRhZyBTbG90IFJlZ2lzdGVyICovCisJSUNIX1JFR19BTElfUlRTUiA9IDB4MzQsCS8qIFJlY2VpdmUgVGFnIFNsb3QgIFJlZ2lzdGVyICovCisJSUNIX1JFR19BTElfQ1NQU1IgPSAweDM4LAkvKiBDb21tYW5kL1N0YXR1cyBQb3J0IFN0YXR1cyBSZWdpc3RlciAqLworCUlDSF9SRUdfQUxJX0NBUyA9IDB4M2MsCQkvKiBDb2RlYyBXcml0ZSBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KKwlJQ0hfUkVHX0FMSV9IV1ZPTCA9IDB4ZjAsCS8qIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sL3N0YXR1cyAqLworCUlDSF9SRUdfQUxJX0kyU0NSID0gMHhmNCwJLyogSTJTIGNvbnRyb2wvc3RhdHVzICovCisJSUNIX1JFR19BTElfU1BESUZDU1IgPSAweGY4LAkvKiBzcGRpZiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciAgKi8KKwlJQ0hfUkVHX0FMSV9TUERJRklDUyA9IDB4ZmMsCS8qIHNwZGlmIGludGVyZmFjZSBjb250cm9sL3N0YXR1cyAgKi8KK307CisKKyNkZWZpbmUgQUxJX0NBU19TRU1fQlVTWQkweDgwMDAwMDAwCisjZGVmaW5lIEFMSV9DUFJfQUREUl9TRUNPTkRBUlkJMHgxMDAKKyNkZWZpbmUgQUxJX0NQUl9BRERSX1JFQUQJMHg4MAorI2RlZmluZSBBTElfQ1NQU1JfQ09ERUNfUkVBRFkJMHgwOAorI2RlZmluZSBBTElfQ1NQU1JfUkVBRF9PSwkweDAyCisjZGVmaW5lIEFMSV9DU1BTUl9XUklURV9PSwkweDAxCisKKy8qIGludGVycnVwdHMgZm9yIHRoZSB3aG9sZSBjaGlwIGJ5IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgZmluaXNoICovCisgCisjZGVmaW5lIEFMSV9JTlRfTUlDSU4yCQkoMTw8MjYpCisjZGVmaW5lIEFMSV9JTlRfUENNSU4yCQkoMTw8MjUpCisjZGVmaW5lIEFMSV9JTlRfSTJTSU4JCSgxPDwyNCkKKyNkZWZpbmUgQUxJX0lOVF9TUERJRk9VVAkoMTw8MjMpCS8qIGNvbnRyb2xsZXIgc3BkaWYgb3V0IElOVEVSUlVQVCAqLworI2RlZmluZSBBTElfSU5UX1NQRElGSU4JCSgxPDwyMikKKyNkZWZpbmUgQUxJX0lOVF9MRkVPVVQJCSgxPDwyMSkKKyNkZWZpbmUgQUxJX0lOVF9DRU5URVJPVVQJKDE8PDIwKQorI2RlZmluZSBBTElfSU5UX0NPREVDU1BESUZPVVQJKDE8PDE5KQorI2RlZmluZSBBTElfSU5UX01JQ0lOCQkoMTw8MTgpCisjZGVmaW5lIEFMSV9JTlRfUENNT1VUCQkoMTw8MTcpCisjZGVmaW5lIEFMSV9JTlRfUENNSU4JCSgxPDwxNikKKyNkZWZpbmUgQUxJX0lOVF9DUFJBSVMJCSgxPDw3KQkvKiBjb21tYW5kIHBvcnQgYXZhaWxhYmxlICovCisjZGVmaW5lIEFMSV9JTlRfU1BSQUlTCQkoMTw8NSkJLyogc3RhdHVzIHBvcnQgYXZhaWxhYmxlICovCisjZGVmaW5lIEFMSV9JTlRfR1BJTwkJKDE8PDEpCisjZGVmaW5lIEFMSV9JTlRfTUFTSwkJKEFMSV9JTlRfU1BESUZPVVR8QUxJX0lOVF9DT0RFQ1NQRElGT1VUfEFMSV9JTlRfTUlDSU58QUxJX0lOVF9QQ01PVVR8QUxJX0lOVF9QQ01JTikKKworI2RlZmluZSBJQ0hfQUxJX1NDX1JFU0VUCSgxPDwzMSkJLyogbWFzdGVyIHJlc2V0ICovCisjZGVmaW5lIElDSF9BTElfU0NfQUM5N19EQkwJKDE8PDMwKQorI2RlZmluZSBJQ0hfQUxJX1NDX0NPREVDX1NQREYJKDM8PDIwKQkvKiAxPTcvOCwgMj02LzksIDM9MTAvMTEgKi8KKyNkZWZpbmUgSUNIX0FMSV9TQ19JTl9CSVRTCSgzPDwxOCkKKyNkZWZpbmUgSUNIX0FMSV9TQ19PVVRfQklUUwkoMzw8MTYpCisjZGVmaW5lIElDSF9BTElfU0NfNkNIX0NGRwkoMzw8MTQpCisjZGVmaW5lIElDSF9BTElfU0NfUENNXzQJKDE8PDgpCisjZGVmaW5lIElDSF9BTElfU0NfUENNXzYJKDI8PDgpCisjZGVmaW5lIElDSF9BTElfU0NfUENNXzI0Nl9NQVNLCSgzPDw4KQorCisjZGVmaW5lIElDSF9BTElfU1NfU0VDX0lECSgzPDw1KQorI2RlZmluZSBJQ0hfQUxJX1NTX1BSSV9JRAkoMzw8MykKKworI2RlZmluZSBJQ0hfQUxJX0lGX0FDOTdTUAkoMTw8MjEpCisjZGVmaW5lIElDSF9BTElfSUZfTUMJCSgxPDwyMCkKKyNkZWZpbmUgSUNIX0FMSV9JRl9QSQkJKDE8PDE5KQorI2RlZmluZSBJQ0hfQUxJX0lGX01DMgkJKDE8PDE4KQorI2RlZmluZSBJQ0hfQUxJX0lGX1BJMgkJKDE8PDE3KQorI2RlZmluZSBJQ0hfQUxJX0lGX0xJTkVfU1JDCSgxPDwxNSkJLyogMC8xID0gc2xvdCAzLzYgKi8KKyNkZWZpbmUgSUNIX0FMSV9JRl9NSUNfU1JDCSgxPDwxNCkJLyogMC8xID0gc2xvdCAzLzYgKi8KKyNkZWZpbmUgSUNIX0FMSV9JRl9TUERGX1NSQwkoMzw8MTIpCS8qIDAwID0gUENNLCAwMSA9IEFDOTctaW4sIDEwID0gc3BkaWYtaW4sIDExID0gaTJzICovCisjZGVmaW5lIElDSF9BTElfSUZfQUM5N19PVVQJKDM8PDgpCS8qIDAwID0gUENNLCAxMCA9IHNwZGlmLWluLCAxMSA9IGkycyAqLworI2RlZmluZSBJQ0hfQUxJX0lGX1BPX1NQREYJKDE8PDMpCisjZGVmaW5lIElDSF9BTElfSUZfUE8JCSgxPDwxKQorCisvKgorICogIAorICovCisKK2VudW0geyBJQ0hEX1BDTUlOLCBJQ0hEX1BDTU9VVCwgSUNIRF9NSUMsIElDSERfTUlDMiwgSUNIRF9QQ00ySU4sIElDSERfU1BCQVIsIElDSERfTEFTVCA9IElDSERfU1BCQVIgfTsKK2VudW0geyBOVkRfUENNSU4sIE5WRF9QQ01PVVQsIE5WRF9NSUMsIE5WRF9TUEJBUiwgTlZEX0xBU1QgPSBOVkRfU1BCQVIgfTsKK2VudW0geyBBTElEX1BDTUlOLCBBTElEX1BDTU9VVCwgQUxJRF9NSUMsIEFMSURfQUM5N1NQRElGT1VULCBBTElEX1NQRElGSU4sIEFMSURfU1BESUZPVVQsIEFMSURfTEFTVCA9IEFMSURfU1BESUZPVVQgfTsKKworI2RlZmluZSBnZXRfaWNoZGV2KHN1YnN0cmVhbSkgKGljaGRldl90ICopKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGljaGQ7CQkJLyogaWNoIGRldmljZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7CQkvKiBvZmZzZXQgdG8gYm1hZGRyICovCisJdTMyICpiZGJhcjsJCQkJLyogQ1BVIGFkZHJlc3MgKDMyYml0KSAqLworCXVuc2lnbmVkIGludCBiZGJhcl9hZGRyOwkJLyogUENJIGJ1cyBhZGRyZXNzICgzMmJpdCkgKi8KKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJdW5zaWduZWQgaW50IHBoeXNidWY7CQkJLyogcGh5c2ljYWwgYWRkcmVzcyAoMzJiaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgZnJhZ3NpemU7CisgICAgICAgIHVuc2lnbmVkIGludCBmcmFnc2l6ZTE7CisgICAgICAgIHVuc2lnbmVkIGludCBwb3NpdGlvbjsKKwl1bnNpZ25lZCBpbnQgcG9zX3NoaWZ0OworICAgICAgICBpbnQgZnJhZ3M7CisgICAgICAgIGludCBsdmk7CisgICAgICAgIGludCBsdmlfZnJhZzsKKwlpbnQgY2l2OworCWludCBhY2s7CisJaW50IGFja19yZWxvYWQ7CisJdW5zaWduZWQgaW50IGFja19iaXQ7CisJdW5zaWduZWQgaW50IHJvZmZfc3I7CisJdW5zaWduZWQgaW50IHJvZmZfcGljYjsKKwl1bnNpZ25lZCBpbnQgaW50X3N0YV9tYXNrOwkJLyogaW50ZXJydXB0IHN0YXR1cyBtYXNrICovCisJdW5zaWduZWQgaW50IGFsaV9zbG90OwkJCS8qIEFMSSBETUEgc2xvdCAqLworCXN0cnVjdCBhYzk3X3BjbSAqcGNtOworCWludCBwY21fb3Blbl9mbGFnOworCXVuc2lnbmVkIGludCBwYWdlX2F0dHJfY2hhbmdlZDogMTsKK30gaWNoZGV2X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9zbmRfaW50ZWw4eDAgaW50ZWw4eDBfdDsKKworc3RydWN0IF9zbmRfaW50ZWw4eDAgeworCXVuc2lnbmVkIGludCBkZXZpY2VfdHlwZTsKKworCWludCBpcnE7CisKKwl1bnNpZ25lZCBpbnQgbW1pbzsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOworCXVuc2lnbmVkIGludCBibV9tbWlvOworCXVuc2lnbmVkIGxvbmcgYm1hZGRyOworCXZvaWQgX19pb21lbSAqcmVtYXBfYm1hZGRyOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfY2FyZF90ICpjYXJkOworCisJaW50IHBjbV9kZXZzOworCXNuZF9wY21fdCAqcGNtWzZdOworCWljaGRldl90IGljaGRbNl07CisKKwl1bnNpZ25lZCBtdWx0aTQ6IDEsCisJCSBtdWx0aTY6IDEsCisJCSBkcmE6IDEsCisJCSBzbXAyMGJpdDogMTsKKwl1bnNpZ25lZCBpbl9hYzk3X2luaXQ6IDEsCisJCSBpbl9zZGluX2luaXQ6IDE7CisJdW5zaWduZWQgaW5fbWVhc3VyZW1lbnQ6IDE7CS8qIGR1cmluZyBhYzk3IGNsb2NrIG1lYXN1cmVtZW50ICovCisJdW5zaWduZWQgZml4X25vY2FjaGU6IDE7IAkvKiB3b3JrYXJvdW5kIGZvciA0NDBNWCAqLworCXVuc2lnbmVkIGJ1Z2d5X2lycTogMTsJCS8qIHdvcmthcm91bmQgZm9yIGJ1Z2d5IG1vYm9zICovCisJdW5zaWduZWQgeGJveDogMTsJCS8qIHdvcmthcm91bmQgZm9yIFhib3ggQUMnOTcgZGV0ZWN0aW9uICovCisKKwlpbnQgc3BkaWZfaWR4OwkvKiBTUERJRiBCQVIgaW5kZXg7ICpfU1BCQVIgb3IgLTEgaWYgdXNlIFBDTU9VVCAqLworCisJYWM5N19idXNfdCAqYWM5N19idXM7CisJYWM5N190ICphYzk3WzNdOworCXVuc2lnbmVkIGludCBhYzk3X3NkaW5bM107CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCQorCXUzMiBiZGJhcnNfY291bnQ7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkYmFyczsKKwl1MzIgaW50X3N0YV9yZWc7CQkvKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisJdTMyIGludF9zdGFfbWFzazsJCS8qIGludGVycnVwdCBzdGF0dXMgbWFzayAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9pbnRlbDh4MF9pZHNbXSA9IHsKKwl7IDB4ODA4NiwgMHgyNDE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogODI4MDFBQSAqLworCXsgMHg4MDg2LCAweDI0MjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTCB9LAkvKiA4MjkwMUFCICovCisJeyAweDgwODYsIDB4MjQ0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sCS8qIDgyODAxQkEgKi8KKwl7IDB4ODA4NiwgMHgyNDg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogSUNIMyAqLworCXsgMHg4MDg2LCAweDI0YzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTF9JQ0g0IH0sIC8qIElDSDQgKi8KKwl7IDB4ODA4NiwgMHgyNGQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUxfSUNINCB9LCAvKiBJQ0g1ICovCisJeyAweDgwODYsIDB4MjVhNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMX0lDSDQgfSwgLyogRVNCICovCisJeyAweDgwODYsIDB4MjY2ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMX0lDSDQgfSwgLyogSUNINiAqLworCXsgMHg4MDg2LCAweDI3ZGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTF9JQ0g0IH0sIC8qIElDSDcgKi8KKwl7IDB4ODA4NiwgMHg3MTk1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogNDQwTVggKi8KKwl7IDB4MTAzOSwgMHg3MDEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfU0lTIH0sCS8qIFNJNzAxMiAqLworCXsgMHgxMGRlLCAweDAxYjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwJLyogTkZPUkNFICovCisJeyAweDEwZGUsIDB4MDAzYSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX05GT1JDRSB9LAkvKiBNQ1AwNCAqLworCXsgMHgxMGRlLCAweDAwNmEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwJLyogTkZPUkNFMiAqLworCXsgMHgxMGRlLCAweDAwNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwJLyogQ0s4MDQgKi8KKwl7IDB4MTBkZSwgMHgwMDhhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfTkZPUkNFIH0sCS8qIENLOCAqLworCXsgMHgxMGRlLCAweDAwZGEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwJLyogTkZPUkNFMyAqLworCXsgMHgxMGRlLCAweDAwZWEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwJLyogQ0s4UyAqLworCXsgMHgxMDIyLCAweDc0NmQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTCB9LAkvKiBBTUQ4MTExICovCisJeyAweDEwMjIsIDB4NzQ0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sCS8qIEFNRDc2OCAqLworCXsgMHgxMGI5LCAweDU0NTUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9BTEkgfSwgICAvKiBBbGk1NDU1ICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2ludGVsOHgwX2lkcyk7CisKKy8qCisgKiAgTG93bGV2ZWwgSS9PIC0gYnVzbWFzdGVyCisgKi8KKworc3RhdGljIHU4IGlnZXRieXRlKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXJldHVybiByZWFkYihjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIGluYihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTE2IGlnZXR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXJldHVybiByZWFkdyhjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIGludyhjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTMyIGlnZXRkd29yZChpbnRlbDh4MF90ICpjaGlwLCB1MzIgb2Zmc2V0KQoreworCWlmIChjaGlwLT5ibV9tbWlvKQorCQlyZXR1cm4gcmVhZGwoY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKKwllbHNlCisJCXJldHVybiBpbmwoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgaXB1dGJ5dGUoaW50ZWw4eDBfdCAqY2hpcCwgdTMyIG9mZnNldCwgdTggdmFsKQoreworCWlmIChjaGlwLT5ibV9tbWlvKQorCQl3cml0ZWIodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJb3V0Yih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwdXR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXdyaXRldyh2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXR3KHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgaXB1dGR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXdyaXRlbCh2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXRsKHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworLyoKKyAqICBMb3dsZXZlbCBJL08gLSBBQyc5NyByZWdpc3RlcnMKKyAqLworCitzdGF0aWMgdTE2IGlhZ2V0d29yZChpbnRlbDh4MF90ICpjaGlwLCB1MzIgb2Zmc2V0KQoreworCWlmIChjaGlwLT5tbWlvKQorCQlyZXR1cm4gcmVhZHcoY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlyZXR1cm4gaW53KGNoaXAtPmFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBpYXB1dHdvcmQoaW50ZWw4eDBfdCAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKK3sKKwlpZiAoY2hpcC0+bW1pbykKKwkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXR3KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7Cit9CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKworLyoKKyAqIGFjY2VzcyB0byBBQzk3IGNvZGVjIHZpYSBub3JtYWwgaS9vIChmb3IgSUNIIGFuZCBTSVM3MDEyKQorICovCisKKy8qIHJldHVybiB0aGUgR0xPQl9TVEEgYml0IGZvciB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfaWNoX2NvZGVjX2JpdChpbnRlbDh4MF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgY29kZWMpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBjb2RlY19iaXRbM10gPSB7CisJCUlDSF9QQ1IsIElDSF9TQ1IsIElDSF9UQ1IKKwl9OworCXNuZF9hc3NlcnQoY29kZWMgPCAzLCByZXR1cm4gSUNIX1BDUik7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KQorCQljb2RlYyA9IGNoaXAtPmFjOTdfc2Rpbltjb2RlY107CisJcmV0dXJuIGNvZGVjX2JpdFtjb2RlY107Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2NvZGVjX3NlbWFwaG9yZShpbnRlbDh4MF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgY29kZWMpCit7CisJaW50IHRpbWU7CisJCisJaWYgKGNvZGVjID4gMikKKwkJcmV0dXJuIC1FSU87CisJaWYgKGNoaXAtPmluX3NkaW5faW5pdCkgeworCQkvKiB3ZSBkb24ndCBrbm93IHRoZSByZWFkeSBiaXQgYXNzaWdubWVudCBhdCB0aGUgbW9tZW50ICovCisJCS8qIHNvIHdlIGNoZWNrIGFueSAqLworCQljb2RlYyA9IElDSF9QQ1IgfCBJQ0hfU0NSIHwgSUNIX1RDUjsKKwl9IGVsc2UgeworCQljb2RlYyA9IGdldF9pY2hfY29kZWNfYml0KGNoaXAsIGNvZGVjKTsKKwl9CisKKwkvKiBjb2RlYyByZWFkeSA/ICovCisJaWYgKChpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkgJiBjb2RlYykgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBBbnlvbmUgaG9sZGluZyBhIHNlbWFwaG9yZSBmb3IgMSBtc2VjIHNob3VsZCBiZSBzaG90Li4uICovCisJdGltZSA9IDEwMDsKKyAgICAgIAlkbyB7CisgICAgICAJCWlmICghKGlnZXRieXRlKGNoaXAsIElDSFJFRyhBQ0NfU0VNQSkpICYgSUNIX0NBUykpCisgICAgICAJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEwKTsKKwl9IHdoaWxlICh0aW1lLS0pOworCisJLyogYWNjZXNzIHRvIHNvbWUgZm9yYmlkZGVuIChub24gZXhpc3RhbnQpIGFjOTcgcmVnaXN0ZXJzIHdpbGwgbm90CisJICogcmVzZXQgdGhlIHNlbWFwaG9yZS4gU28gZXZlbiBpZiB5b3UgZG9uJ3QgZ2V0IHRoZSBzZW1hcGhvcmUsIHN0aWxsCisJICogY29udGludWUgdGhlIGFjY2Vzcy4gV2UgZG9uJ3QgbmVlZCB0aGUgc2VtYXBob3JlIGFueXdheS4gKi8KKwlzbmRfcHJpbnRrKCJjb2RlY19zZW1hcGhvcmU6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgWzB4JXhdWzB4JXhdXG4iLAorCQkJaWdldGJ5dGUoY2hpcCwgSUNIUkVHKEFDQ19TRU1BKSksIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CisJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLworCS8qIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgc2VtYXBob3JlICovCisJcmV0dXJuIC1FQlVTWTsKK30KKyAKK3N0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MF9jb2RlY193cml0ZShhYzk3X3QgKmFjOTcsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwkKKwlpZiAoc25kX2ludGVsOHgwX2NvZGVjX3NlbWFwaG9yZShjaGlwLCBhYzk3LT5udW0pIDwgMCkgeworCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCisJCQlzbmRfcHJpbnRrKCJjb2RlY193cml0ZSAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCX0KKwlpYXB1dHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCwgdmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9pbnRlbDh4MF9jb2RlY19yZWFkKGFjOTdfdCAqYWM5NywKKwkJCQkJICAgICAgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgcmVzOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlpZiAoc25kX2ludGVsOHgwX2NvZGVjX3NlbWFwaG9yZShjaGlwLCBhYzk3LT5udW0pIDwgMCkgeworCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCisJCQlzbmRfcHJpbnRrKCJjb2RlY19yZWFkICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCXJlcyA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCQlyZXMgPSBpYWdldHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCk7CisJCWlmICgodG1wID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKSAmIElDSF9SQ1MpIHsKKwkJCS8qIHJlc2V0IFJDUyBhbmQgcHJlc2VydmUgb3RoZXIgUi9XQyBiaXRzICovCisJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgdG1wICYgfihJQ0hfU1JJfElDSF9QUkl8SUNIX1RSSXxJQ0hfR1NDSSkpOworCQkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQorCQkJCXNuZF9wcmludGsoImNvZGVjX3JlYWQgJWQ6IHJlYWQgdGltZW91dCBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJcmVzID0gMHhmZmZmOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MF9jb2RlY19yZWFkX3Rlc3QoaW50ZWw4eDBfdCAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlpZiAoc25kX2ludGVsOHgwX2NvZGVjX3NlbWFwaG9yZShjaGlwLCBjb2RlYykgPj0gMCkgeworCQlpYWdldHdvcmQoY2hpcCwgY29kZWMgKiAweDgwKTsKKwkJaWYgKCh0bXAgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkpICYgSUNIX1JDUykgeworCQkJLyogcmVzZXQgUkNTIGFuZCBwcmVzZXJ2ZSBvdGhlciBSL1dDIGJpdHMgKi8KKwkJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpLCB0bXAgJiB+KElDSF9TUkl8SUNIX1BSSXxJQ0hfVFJJfElDSF9HU0NJKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBhY2Nlc3MgdG8gQUM5NyBmb3IgQWxpNTQ1NQorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9hbGlfY29kZWNfcmVhZHkoaW50ZWw4eDBfdCAqY2hpcCwgaW50IG1hc2spCit7CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAweDdmOyBjb3VudCsrKSB7CisJCWludCB2YWwgPSBpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoQUxJX0NTUFNSKSk7CisJCWlmICh2YWwgJiBtYXNrKQorCQkJcmV0dXJuIDA7CisJfQorCXNuZF9wcmludGQoS0VSTl9XQVJOSU5HICJpbnRlbDh4MDogQUM5NyBjb2RlYyByZWFkeSB0aW1lb3V0LlxuIik7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3NlbWFwaG9yZShpbnRlbDh4MF90ICpjaGlwKQoreworCWludCB0aW1lID0gMTAwOworCXdoaWxlICh0aW1lLS0gJiYgKGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0NBUykpICYgQUxJX0NBU19TRU1fQlVTWSkpCisJCXVkZWxheSgxKTsKKwlpZiAoISB0aW1lKQorCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2NvZGVjX3NlbWFwaG9yZSB0aW1lb3V0XG4iKTsKKwlyZXR1cm4gc25kX2ludGVsOHgwX2FsaV9jb2RlY19yZWFkeShjaGlwLCBBTElfQ1NQU1JfQ09ERUNfUkVBRFkpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2ludGVsOHgwX2FsaV9jb2RlY19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgZGF0YSA9IDB4ZmZmZjsKKworCWlmIChzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3NlbWFwaG9yZShjaGlwKSkKKwkJZ290byBfX2VycjsKKwlyZWcgfD0gQUxJX0NQUl9BRERSX1JFQUQ7CisJaWYgKGFjOTctPm51bSkKKwkJcmVnIHw9IEFMSV9DUFJfQUREUl9TRUNPTkRBUlk7CisJaXB1dHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9DUFJfQUREUiksIHJlZyk7CisJaWYgKHNuZF9pbnRlbDh4MF9hbGlfY29kZWNfcmVhZHkoY2hpcCwgQUxJX0NTUFNSX1JFQURfT0spKQorCQlnb3RvIF9fZXJyOworCWRhdGEgPSBpZ2V0d29yZChjaGlwLCBJQ0hSRUcoQUxJX1NQUikpOworIF9fZXJyOgorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKworCWlmIChzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3NlbWFwaG9yZShjaGlwKSkKKwkJcmV0dXJuOworCWlwdXR3b3JkKGNoaXAsIElDSFJFRyhBTElfQ1BSKSwgdmFsKTsKKwlpZiAoYWM5Ny0+bnVtKQorCQlyZWcgfD0gQUxJX0NQUl9BRERSX1NFQ09OREFSWTsKKwlpcHV0d29yZChjaGlwLCBJQ0hSRUcoQUxJX0NQUl9BRERSKSwgcmVnKTsKKwlzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3JlYWR5KGNoaXAsIEFMSV9DU1BTUl9XUklURV9PSyk7Cit9CisKKworLyoKKyAqIERNQSBJL08KKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoaW50ZWw4eDBfdCAqY2hpcCwgaWNoZGV2X3QgKmljaGRldikgCit7CisJaW50IGlkeDsKKwl1MzIgKmJkYmFyID0gaWNoZGV2LT5iZGJhcjsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSBpY2hkZXYtPnJlZ19vZmZzZXQ7CisKKwlpcHV0ZHdvcmQoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0JEQkFSLCBpY2hkZXYtPmJkYmFyX2FkZHIpOworCWlmIChpY2hkZXYtPnNpemUgPT0gaWNoZGV2LT5mcmFnc2l6ZSkgeworCQlpY2hkZXYtPmFja19yZWxvYWQgPSBpY2hkZXYtPmFjayA9IDI7CisJCWljaGRldi0+ZnJhZ3NpemUxID0gaWNoZGV2LT5mcmFnc2l6ZSA+PiAxOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IChJQ0hfUkVHX0xWSV9NQVNLICsgMSkgKiAyOyBpZHggKz0gNCkgeworCQkJYmRiYXJbaWR4ICsgMF0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYpOworCQkJYmRiYXJbaWR4ICsgMV0gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKwkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEgPj4gaWNoZGV2LT5wb3Nfc2hpZnQpOworCQkJYmRiYXJbaWR4ICsgMl0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYgKyAoaWNoZGV2LT5zaXplID4+IDEpKTsKKwkJCWJkYmFyW2lkeCArIDNdID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCB8IC8qIGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisJCQkJCQkgICAgIGljaGRldi0+ZnJhZ3NpemUxID4+IGljaGRldi0+cG9zX3NoaWZ0KTsKKwkJfQorCQlpY2hkZXYtPmZyYWdzID0gMjsKKwl9IGVsc2UgeworCQlpY2hkZXYtPmFja19yZWxvYWQgPSBpY2hkZXYtPmFjayA9IDE7CisJCWljaGRldi0+ZnJhZ3NpemUxID0gaWNoZGV2LT5mcmFnc2l6ZTsKKwkJZm9yIChpZHggPSAwOyBpZHggPCAoSUNIX1JFR19MVklfTUFTSyArIDEpICogMjsgaWR4ICs9IDIpIHsKKwkJCWJkYmFyW2lkeCArIDBdID0gY3B1X3RvX2xlMzIoaWNoZGV2LT5waHlzYnVmICsgKCgoaWR4ID4+IDEpICogaWNoZGV2LT5mcmFnc2l6ZSkgJSBpY2hkZXYtPnNpemUpKTsKKwkJCWJkYmFyW2lkeCArIDFdID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCB8IC8qIGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisJCQkJCQkgICAgIGljaGRldi0+ZnJhZ3NpemUgPj4gaWNoZGV2LT5wb3Nfc2hpZnQpOworCQkJLy8gcHJpbnRrKCJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwgaWR4ICsgMCwgYmRiYXJbaWR4ICsgMF0sIGJkYmFyW2lkeCArIDFdKTsKKwkJfQorCQlpY2hkZXYtPmZyYWdzID0gaWNoZGV2LT5zaXplIC8gaWNoZGV2LT5mcmFnc2l6ZTsKKwl9CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0xWSSwgaWNoZGV2LT5sdmkgPSBJQ0hfUkVHX0xWSV9NQVNLKTsKKwlpY2hkZXYtPmNpdiA9IDA7CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NJViwgMCk7CisJaWNoZGV2LT5sdmlfZnJhZyA9IElDSF9SRUdfTFZJX01BU0sgJSBpY2hkZXYtPmZyYWdzOworCWljaGRldi0+cG9zaXRpb24gPSAwOworI2lmIDAKKwlwcmludGsoImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwkJCWljaGRldi0+bHZpX2ZyYWcsIGljaGRldi0+ZnJhZ3MsIGljaGRldi0+ZnJhZ3NpemUsIGljaGRldi0+ZnJhZ3NpemUxKTsKKyNlbmRpZgorCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgaWNoZGV2LT5yb2ZmX3NyLCBJQ0hfRklGT0UgfCBJQ0hfQkNJUyB8IElDSF9MVkJDSSk7Cit9CisKKyNpZmRlZiBfX2kzODZfXworLyoKKyAqIEludGVsIDgyNDQzTVggcnVubmluZyBhIDEwME1IeiBwcm9jZXNzb3Igc3lzdGVtIGJ1cyBoYXMgYSBoYXJkd2FyZSBidWcsCisgKiB3aGljaCBhYm9ydHMgUENJIGJ1c21hc3RlciBmb3IgYXVkaW8gdHJhbnNmZXIuICBBIHdvcmthcm91bmQgaXMgdG8gc2V0CisgKiB0aGUgcGFnZXMgYXMgbm9uLWNhY2hlZC4gIEZvciBkZXRhaWxzLCBzZWUgdGhlIGVycmF0YSBpbgorICoJaHR0cDovL3d3dy5pbnRlbC5jb20vZGVzaWduL2NoaXBzZXRzL3NwZWN1cGR0LzI0NTA1MS5odG0KKyAqLworc3RhdGljIHZvaWQgZmlsbF9ub2NhY2hlKHZvaWQgKmJ1ZiwgaW50IHNpemUsIGludCBub2NhY2hlKQoreworCXNpemUgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJY2hhbmdlX3BhZ2VfYXR0cih2aXJ0X3RvX3BhZ2UoYnVmKSwgc2l6ZSwgbm9jYWNoZSA/IFBBR0VfS0VSTkVMX05PQ0FDSEUgOiBQQUdFX0tFUk5FTCk7CisJZ2xvYmFsX2ZsdXNoX3RsYigpOworfQorI2Vsc2UKKyNkZWZpbmUgZmlsbF9ub2NhY2hlKGJ1ZixzaXplLG5vY2FjaGUpCisjZW5kaWYKKworLyoKKyAqICBJbnRlcnJ1cHQgaGFuZGxlcgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaW50ZWw4eDBfdXBkYXRlKGludGVsOHgwX3QgKmNoaXAsIGljaGRldl90ICppY2hkZXYpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gaWNoZGV2LT5yZWdfb2Zmc2V0OworCWludCBzdGF0dXMsIGNpdiwgaSwgc3RlcDsKKwlpbnQgYWNrID0gMDsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXN0YXR1cyA9IGlnZXRieXRlKGNoaXAsIHBvcnQgKyBpY2hkZXYtPnJvZmZfc3IpOworCWNpdiA9IGlnZXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DSVYpOworCWlmICghKHN0YXR1cyAmIElDSF9CQ0lTKSkgeworCQlzdGVwID0gMDsKKwl9IGVsc2UgaWYgKGNpdiA9PSBpY2hkZXYtPmNpdikgeworCQkvLyBzbmRfcHJpbnRkKCJjaXYgc2FtZSAlZFxuIiwgY2l2KTsKKwkJc3RlcCA9IDE7CisJCWljaGRldi0+Y2l2Kys7CisJCWljaGRldi0+Y2l2ICY9IElDSF9SRUdfTFZJX01BU0s7CisJfSBlbHNlIHsKKwkJc3RlcCA9IGNpdiAtIGljaGRldi0+Y2l2OworCQlpZiAoc3RlcCA8IDApCisJCQlzdGVwICs9IElDSF9SRUdfTFZJX01BU0sgKyAxOworCQkvLyBpZiAoc3RlcCAhPSAxKQorCQkvLwlzbmRfcHJpbnRkKCJzdGVwID0gJWQsICVkIC0+ICVkXG4iLCBzdGVwLCBpY2hkZXYtPmNpdiwgY2l2KTsKKwkJaWNoZGV2LT5jaXYgPSBjaXY7CisJfQorCisJaWNoZGV2LT5wb3NpdGlvbiArPSBzdGVwICogaWNoZGV2LT5mcmFnc2l6ZTE7CisJaWYgKCEgY2hpcC0+aW5fbWVhc3VyZW1lbnQpCisJCWljaGRldi0+cG9zaXRpb24gJT0gaWNoZGV2LT5zaXplOworCWljaGRldi0+bHZpICs9IHN0ZXA7CisJaWNoZGV2LT5sdmkgJj0gSUNIX1JFR19MVklfTUFTSzsKKwlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfTFZJLCBpY2hkZXYtPmx2aSk7CisJZm9yIChpID0gMDsgaSA8IHN0ZXA7IGkrKykgeworCQlpY2hkZXYtPmx2aV9mcmFnKys7CisJCWljaGRldi0+bHZpX2ZyYWcgJT0gaWNoZGV2LT5mcmFnczsKKwkJaWNoZGV2LT5iZGJhcltpY2hkZXYtPmx2aSAqIDJdID0gY3B1X3RvX2xlMzIoaWNoZGV2LT5waHlzYnVmICsgaWNoZGV2LT5sdmlfZnJhZyAqIGljaGRldi0+ZnJhZ3NpemUxKTsKKwkvLyBwcmludGsoIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sIHByZWZldGNoID0gJWksIGFsbCA9IDB4JXgsIDB4JXhcbiIsIGljaGRldi0+bHZpICogMiwgaWNoZGV2LT5iZGJhcltpY2hkZXYtPmx2aSAqIDJdLCBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksIGlubChwb3J0ICsgNCksIGluYihwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKTsKKwkJaWYgKC0taWNoZGV2LT5hY2sgPT0gMCkgeworCQkJaWNoZGV2LT5hY2sgPSBpY2hkZXYtPmFja19yZWxvYWQ7CisJCQlhY2sgPSAxOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGFjayAmJiBpY2hkZXYtPnN1YnN0cmVhbSkgeworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljaGRldi0+c3Vic3RyZWFtKTsKKwl9CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIGljaGRldi0+cm9mZl9zciwKKwkJIHN0YXR1cyAmIChJQ0hfRklGT0UgfCBJQ0hfQkNJUyB8IElDSF9MVkJDSSkpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2ludGVsOHgwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBkZXZfaWQ7CisJaWNoZGV2X3QgKmljaGRldjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCisJc3RhdHVzID0gaWdldGR3b3JkKGNoaXAsIGNoaXAtPmludF9zdGFfcmVnKTsKKwlpZiAoc3RhdHVzID09IDB4ZmZmZmZmZmYpCS8qIHdlIGFyZSBub3QgeWV0IHJlc3VtZWQgKi8KKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKChzdGF0dXMgJiBjaGlwLT5pbnRfc3RhX21hc2spID09IDApIHsKKwkJaWYgKHN0YXR1cykgeworCQkJLyogYWNrICovCisJCQlpcHV0ZHdvcmQoY2hpcCwgY2hpcC0+aW50X3N0YV9yZWcsIHN0YXR1cyk7CisJCQlpZiAoISBjaGlwLT5idWdneV9pcnEpCisJCQkJc3RhdHVzID0gMDsKKwkJfQorCQlyZXR1cm4gSVJRX1JFVFZBTChzdGF0dXMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykgeworCQlpY2hkZXYgPSAmY2hpcC0+aWNoZFtpXTsKKwkJaWYgKHN0YXR1cyAmIGljaGRldi0+aW50X3N0YV9tYXNrKQorCQkJc25kX2ludGVsOHgwX3VwZGF0ZShjaGlwLCBpY2hkZXYpOworCX0KKworCS8qIGFjayB0aGVtICovCisJaXB1dGR3b3JkKGNoaXAsIGNoaXAtPmludF9zdGFfcmVnLCBzdGF0dXMgJiBjaGlwLT5pbnRfc3RhX21hc2spOworCQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqICBQQ00gcGFydAorICovCisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWljaGRldl90ICppY2hkZXYgPSBnZXRfaWNoZGV2KHN1YnN0cmVhbSk7CisJdW5zaWduZWQgY2hhciB2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgcG9ydCA9IGljaGRldi0+cmVnX29mZnNldDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJdmFsID0gSUNIX0lPQ0UgfCBJQ0hfU1RBUlRCTTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQl2YWwgPSBJQ0hfSU9DRTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQl2YWwgPSBJQ0hfSU9DRSB8IElDSF9TVEFSVEJNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NSLCB2YWwpOworCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQkvKiB3YWl0IHVudGlsIERNQSBzdG9wcGVkICovCisJCXdoaWxlICghKGlnZXRieXRlKGNoaXAsIHBvcnQgKyBpY2hkZXYtPnJvZmZfc3IpICYgSUNIX0RDSCkpIDsKKwkJLyogcmVzZXQgd2hvbGUgRE1BIHRoaW5ncyAqLworCQlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfQ1IsIElDSF9SRVNFVFJFR1MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaWNoZGV2X3QgKmljaGRldiA9IGdldF9pY2hkZXYoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSBpY2hkZXYtPnJlZ19vZmZzZXQ7CisJc3RhdGljIGludCBmaWZvcmVnW10gPSB7IElDSFJFRyhBTElfRklGT0NSMSksIElDSFJFRyhBTElfRklGT0NSMiksIElDSFJFRyhBTElfRklGT0NSMykgfTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBmaWZvOworCisJdmFsID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfRE1BQ1IpKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJLyogY2xlYXIgRklGTyBmb3Igc3luY2hyb25pemF0aW9uIG9mIGNoYW5uZWxzICovCisJCQlmaWZvID0gaWdldGR3b3JkKGNoaXAsIGZpZm9yZWdbaWNoZGV2LT5hbGlfc2xvdCAvIDRdKTsKKwkJCWZpZm8gJj0gfigweGZmIDw8IChpY2hkZXYtPmFsaV9zbG90ICUgNCkpOyAgCisJCQlmaWZvIHw9IDB4ODMgPDwgKGljaGRldi0+YWxpX3Nsb3QgJSA0KTsgCisJCQlpcHV0ZHdvcmQoY2hpcCwgZmlmb3JlZ1tpY2hkZXYtPmFsaV9zbG90IC8gNF0sIGZpZm8pOworCQl9CisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgSUNIX0lPQ0UpOworCQl2YWwgJj0gfigxIDw8IChpY2hkZXYtPmFsaV9zbG90ICsgMTYpKTsgLyogY2xlYXIgUEFVU0UgZmxhZyAqLworCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9ETUFDUiksIHZhbCB8ICgxIDw8IGljaGRldi0+YWxpX3Nsb3QpKTsgLyogc3RhcnQgRE1BICovCisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9ETUFDUiksIHZhbCB8ICgxIDw8IChpY2hkZXYtPmFsaV9zbG90ICsgMTYpKSk7IC8qIHBhdXNlICovCisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgMCk7CisJCXdoaWxlIChpZ2V0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKQorCQkJOworCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0gpCisJCQlicmVhazsKKwkJLyogcmVzZXQgd2hvbGUgRE1BIHRoaW5ncyAqLworCQlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfQ1IsIElDSF9SRVNFVFJFR1MpOworCQkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9TUiwgaWdldGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX1NSKSB8IDB4MWUpOworCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9JTlRFUlJVUFRTUiksCisJCQkgIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0lOVEVSUlVQVFNSKSkgJiBpY2hkZXYtPmludF9zdGFfbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaWNoZGV2X3QgKmljaGRldiA9IGdldF9pY2hkZXYoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZGJsID0gcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSA+IDQ4MDAwOworCWludCBlcnI7CisKKwlpZiAoY2hpcC0+Zml4X25vY2FjaGUgJiYgaWNoZGV2LT5wYWdlX2F0dHJfY2hhbmdlZCkgeworCQlmaWxsX25vY2FjaGUocnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMCk7IC8qIGNsZWFyICovCisJCWljaGRldi0+cGFnZV9hdHRyX2NoYW5nZWQgPSAwOworCX0KKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChjaGlwLT5maXhfbm9jYWNoZSkgeworCQlpZiAocnVudGltZS0+ZG1hX2FyZWEgJiYgISBpY2hkZXYtPnBhZ2VfYXR0cl9jaGFuZ2VkKSB7CisJCQlmaWxsX25vY2FjaGUocnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMSk7CisJCQlpY2hkZXYtPnBhZ2VfYXR0cl9jaGFuZ2VkID0gMTsKKwkJfQorCX0KKwlpZiAoaWNoZGV2LT5wY21fb3Blbl9mbGFnKSB7CisJCXNuZF9hYzk3X3BjbV9jbG9zZShpY2hkZXYtPnBjbSk7CisJCWljaGRldi0+cGNtX29wZW5fZmxhZyA9IDA7CisJfQorCWVyciA9IHNuZF9hYzk3X3BjbV9vcGVuKGljaGRldi0+cGNtLCBwYXJhbXNfcmF0ZShod19wYXJhbXMpLAorCQkJCXBhcmFtc19jaGFubmVscyhod19wYXJhbXMpLAorCQkJCWljaGRldi0+cGNtLT5yW2RibF0uc2xvdHMpOworCWlmIChlcnIgPj0gMCkgeworCQlpY2hkZXYtPnBjbV9vcGVuX2ZsYWcgPSAxOworCQkvKiBGb3JjZSBTUERJRiBzZXR0aW5nICovCisJCWlmIChpY2hkZXYtPmljaGQgPT0gSUNIRF9QQ01PVVQgJiYgY2hpcC0+c3BkaWZfaWR4IDwgMCkKKwkJCXNuZF9hYzk3X3NldF9yYXRlKGljaGRldi0+cGNtLT5yWzBdLmNvZGVjWzBdLCBBQzk3X1NQRElGLCBwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaWNoZGV2X3QgKmljaGRldiA9IGdldF9pY2hkZXYoc3Vic3RyZWFtKTsKKworCWlmIChpY2hkZXYtPnBjbV9vcGVuX2ZsYWcpIHsKKwkJc25kX2FjOTdfcGNtX2Nsb3NlKGljaGRldi0+cGNtKTsKKwkJaWNoZGV2LT5wY21fb3Blbl9mbGFnID0gMDsKKwl9CisJaWYgKGNoaXAtPmZpeF9ub2NhY2hlICYmIGljaGRldi0+cGFnZV9hdHRyX2NoYW5nZWQpIHsKKwkJZmlsbF9ub2NhY2hlKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzLCAwKTsKKwkJaWNoZGV2LT5wYWdlX2F0dHJfY2hhbmdlZCA9IDA7CisJfQorCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MF9zZXR1cF9wY21fb3V0KGludGVsOHgwX3QgKmNoaXAsCisJCQkJICAgICAgIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworCXVuc2lnbmVkIGludCBjbnQ7CisJaW50IGRibCA9IHJ1bnRpbWUtPnJhdGUgPiA0ODAwMDsKKwlzd2l0Y2ggKGNoaXAtPmRldmljZV90eXBlKSB7CisJY2FzZSBERVZJQ0VfQUxJOgorCQljbnQgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9TQ1IpKTsKKwkJY250ICY9IH5JQ0hfQUxJX1NDX1BDTV8yNDZfTUFTSzsKKwkJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDQgfHwgZGJsKQorCQkJY250IHw9IElDSF9BTElfU0NfUENNXzQ7CisJCWVsc2UgaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDYpCisJCQljbnQgfD0gSUNIX0FMSV9TQ19QQ01fNjsKKwkJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhBTElfU0NSKSwgY250KTsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfU0lTOgorCQljbnQgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSk7CisJCWNudCAmPSB+SUNIX1NJU19QQ01fMjQ2X01BU0s7CisJCWlmIChydW50aW1lLT5jaGFubmVscyA9PSA0IHx8IGRibCkKKwkJCWNudCB8PSBJQ0hfU0lTX1BDTV80OworCQllbHNlIGlmIChydW50aW1lLT5jaGFubmVscyA9PSA2KQorCQkJY250IHw9IElDSF9TSVNfUENNXzY7CisJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpLCBjbnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbnQgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSk7CisJCWNudCAmPSB+KElDSF9QQ01fMjQ2X01BU0sgfCBJQ0hfUENNXzIwQklUKTsKKwkJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDQgfHwgZGJsKQorCQkJY250IHw9IElDSF9QQ01fNDsKKwkJZWxzZSBpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gNikKKwkJCWNudCB8PSBJQ0hfUENNXzY7CisJCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJCQkvKiByZXNldCB0byAyY2ggb25jZSB0byBrZWVwIHRoZSA2IGNoYW5uZWwgZGF0YSBpbiBhbGlnbm1lbnQsCisJCQkgKiB0byBzdGFydCBmcm9tIEZyb250IExlZnQgYWx3YXlzCisJCQkgKi8KKwkJCWlmIChjbnQgJiBJQ0hfUENNXzI0Nl9NQVNLKSB7CisJCQkJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCksIGNudCAmIH5JQ0hfUENNXzI0Nl9NQVNLKTsKKwkJCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJCQltc2xlZXAoNTApOyAvKiBncnJyLi4uICovCisJCQkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQkJfQorCQl9IGVsc2UgaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJCQlpZiAocnVudGltZS0+c2FtcGxlX2JpdHMgPiAxNikKKwkJCQljbnQgfD0gSUNIX1BDTV8yMEJJVDsKKwkJfQorCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSwgY250KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWNoZGV2X3QgKmljaGRldiA9IGdldF9pY2hkZXYoc3Vic3RyZWFtKTsKKworCWljaGRldi0+cGh5c2J1ZiA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCWljaGRldi0+c2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWljaGRldi0+ZnJhZ3NpemUgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGljaGRldi0+aWNoZCA9PSBJQ0hEX1BDTU9VVCkgeworCQlzbmRfaW50ZWw4eDBfc2V0dXBfcGNtX291dChjaGlwLCBydW50aW1lKTsKKwkJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJCQlpY2hkZXYtPnBvc19zaGlmdCA9IChydW50aW1lLT5zYW1wbGVfYml0cyA+IDE2KSA/IDIgOiAxOworCQl9CisJfQorCXNuZF9pbnRlbDh4MF9zZXR1cF9wZXJpb2RzKGNoaXAsIGljaGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWljaGRldl90ICppY2hkZXYgPSBnZXRfaWNoZGV2KHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjEsIHB0cjsKKwlpbnQgY2l2LCB0aW1lb3V0ID0gMTAwOworCXVuc2lnbmVkIGludCBwb3NpdGlvbjsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWRvIHsKKwkJY2l2ID0gaWdldGJ5dGUoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgSUNIX1JFR19PRkZfQ0lWKTsKKwkJcHRyMSA9IGlnZXR3b3JkKGNoaXAsIGljaGRldi0+cmVnX29mZnNldCArIGljaGRldi0+cm9mZl9waWNiKTsKKwkJcG9zaXRpb24gPSBpY2hkZXYtPnBvc2l0aW9uOworCQlpZiAocHRyMSA9PSAwKSB7CisJCQl1ZGVsYXkoMTApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNpdiA9PSBpZ2V0Ynl0ZShjaGlwLCBpY2hkZXYtPnJlZ19vZmZzZXQgKyBJQ0hfUkVHX09GRl9DSVYpICYmCisJCSAgICBwdHIxID09IGlnZXR3b3JkKGNoaXAsIGljaGRldi0+cmVnX29mZnNldCArIGljaGRldi0+cm9mZl9waWNiKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKHRpbWVvdXQtLSk7CisJcHRyMSA8PD0gaWNoZGV2LT5wb3Nfc2hpZnQ7CisJcHRyID0gaWNoZGV2LT5mcmFnc2l6ZTEgLSBwdHIxOworCXB0ciArPSBwb3NpdGlvbjsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmIChwdHIgPj0gaWNoZGV2LT5zaXplKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfaW50ZWw4eDBfc3RyZWFtID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTIsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNoYW5uZWxzNFtdID0geworCTIsIDQsCit9OworCitzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCBod19jb25zdHJhaW50c19jaGFubmVsczQgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShjaGFubmVsczQpLAorCS5saXN0ID0gY2hhbm5lbHM0LAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hhbm5lbHM2W10gPSB7CisJMiwgNCwgNiwKK307CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX2NoYW5uZWxzNiA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKGNoYW5uZWxzNiksCisJLmxpc3QgPSBjaGFubmVsczYsCisJLm1hc2sgPSAwLAorfTsKKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfcGNtX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaWNoZGV2X3QgKmljaGRldikKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlpY2hkZXYtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9pbnRlbDh4MF9zdHJlYW07CisJcnVudGltZS0+aHcucmF0ZXMgPSBpY2hkZXYtPnBjbS0+cmF0ZXM7CisJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX1NJUykgeworCQlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gNjQqMTAyNDsKKwkJcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21heCA9IDY0KjEwMjQ7CisJfQorCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpKSA8IDApCisJCXJldHVybiBlcnI7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gaWNoZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2ludGVsOHgwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmljaGRbSUNIRF9QQ01PVVRdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChjaGlwLT5tdWx0aTYpIHsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gNjsKKwkJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAmaHdfY29uc3RyYWludHNfY2hhbm5lbHM2KTsKKwl9IGVsc2UgaWYgKGNoaXAtPm11bHRpNCkgeworCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSA0OworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsICZod19jb25zdHJhaW50c19jaGFubmVsczQpOworCX0KKwlpZiAoY2hpcC0+ZHJhKSB7CisJCXNuZF9hYzk3X3BjbV9kb3VibGVfcmF0ZV9ydWxlcyhydW50aW1lKTsKKwl9CisJaWYgKGNoaXAtPnNtcDIwYml0KSB7CisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMocnVudGltZSwgMCwgMzIsIDIwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbSUNIRF9QQ01PVVRdLnN1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gc25kX2ludGVsOHgwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmljaGRbSUNIRF9QQ01JTl0pOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbSUNIRF9QQ01JTl0uc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfbWljX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcmV0dXJuIHNuZF9pbnRlbDh4MF9wY21fb3BlbihzdWJzdHJlYW0sICZjaGlwLT5pY2hkW0lDSERfTUlDXSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX21pY19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5pY2hkW0lDSERfTUlDXS5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9taWMyX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcmV0dXJuIHNuZF9pbnRlbDh4MF9wY21fb3BlbihzdWJzdHJlYW0sICZjaGlwLT5pY2hkW0lDSERfTUlDMl0pOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9taWMyX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbSUNIRF9NSUMyXS5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9jYXB0dXJlMl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXJldHVybiBzbmRfaW50ZWw4eDBfcGNtX29wZW4oc3Vic3RyZWFtLCAmY2hpcC0+aWNoZFtJQ0hEX1BDTTJJTl0pOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9jYXB0dXJlMl9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5pY2hkW0lDSERfUENNMklOXS5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgaWR4ID0gY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX05GT1JDRSA/IE5WRF9TUEJBUiA6IElDSERfU1BCQVI7CisKKwlyZXR1cm4gc25kX2ludGVsOHgwX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmljaGRbaWR4XSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX3NwZGlmX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgaWR4ID0gY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX05GT1JDRSA/IE5WRF9TUEJBUiA6IElDSERfU1BCQVI7CisKKwljaGlwLT5pY2hkW2lkeF0uc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX2FjOTdzcGRpZm91dF9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXZhbCA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0lOVEVSRkFDRUNSKSk7CisJdmFsIHw9IElDSF9BTElfSUZfQUM5N1NQOworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0lOVEVSRkFDRUNSKSwgdmFsKTsKKwkvKiBhbHNvIG5lZWRzIHRvIHNldCBBTElfU0NfQ09ERUNfU1BERiBjb3JyZWN0bHkgKi8KKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBzbmRfaW50ZWw4eDBfcGNtX29wZW4oc3Vic3RyZWFtLCAmY2hpcC0+aWNoZFtBTElEX0FDOTdTUERJRk9VVF0pOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9hbGlfYWM5N3NwZGlmb3V0X2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJY2hpcC0+aWNoZFtBTElEX0FDOTdTUERJRk9VVF0uc3Vic3RyZWFtID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJdmFsID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfSU5URVJGQUNFQ1IpKTsKKwl2YWwgJj0gfklDSF9BTElfSUZfQUM5N1NQOworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0lOVEVSRkFDRUNSKSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9hbGlfc3BkaWZpbl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXJldHVybiBzbmRfaW50ZWw4eDBfcGNtX29wZW4oc3Vic3RyZWFtLCAmY2hpcC0+aWNoZFtBTElEX1NQRElGSU5dKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX3NwZGlmaW5fY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJY2hpcC0+aWNoZFtBTElEX1NQRElGSU5dLnN1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwIC8vIE5ZSQorc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX3NwZGlmb3V0X29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcmV0dXJuIHNuZF9pbnRlbDh4MF9wY21fb3BlbihzdWJzdHJlYW0sICZjaGlwLT5pY2hkW0FMSURfU1BESUZPVVRdKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX3NwZGlmb3V0X2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbQUxJRF9TUERJRk9VVF0uc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9pbnRlbDh4MF9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsOHgwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pbnRlbDh4MF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsOHgwX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ludGVsOHgwX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2ludGVsOHgwX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ludGVsOHgwX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pbnRlbDh4MF9jYXB0dXJlX21pY19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsOHgwX21pY19vcGVuLAorCS5jbG9zZSA9CXNuZF9pbnRlbDh4MF9taWNfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pbnRlbDh4MF9jYXB0dXJlX21pYzJfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9taWMyX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwX21pYzJfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pbnRlbDh4MF9jYXB0dXJlMl9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsOHgwX2NhcHR1cmUyX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwX2NhcHR1cmUyX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaW50ZWw4eDBfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ludGVsOHgwX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfaW50ZWw4eDBfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9zcGRpZl9vcGVuLAorCS5jbG9zZSA9CXNuZF9pbnRlbDh4MF9zcGRpZl9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsOHgwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pbnRlbDh4MF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsOHgwX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ludGVsOHgwX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2ludGVsOHgwX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ludGVsOHgwX2FsaV9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsOHgwX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaW50ZWw4eDBfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ludGVsOHgwX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfaW50ZWw4eDBfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfaW50ZWw4eDBfYWxpX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBfYWxpX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9hbGlfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9pbnRlbDh4MF9hbGlfY2FwdHVyZV9taWNfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MF9taWNfb3BlbiwKKwkuY2xvc2UgPQlzbmRfaW50ZWw4eDBfbWljX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaW50ZWw4eDBfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ludGVsOHgwX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfaW50ZWw4eDBfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfaW50ZWw4eDBfYWxpX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBfYWxpX2FjOTdzcGRpZm91dF9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsOHgwX2FsaV9hYzk3c3BkaWZvdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfaW50ZWw4eDBfYWxpX2FjOTdzcGRpZm91dF9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsOHgwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pbnRlbDh4MF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsOHgwX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2ludGVsOHgwX2FsaV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX2ludGVsOHgwX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ludGVsOHgwX2FsaV9zcGRpZmluX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaW50ZWw4eDBfYWxpX3NwZGlmaW5fb3BlbiwKKwkuY2xvc2UgPQlzbmRfaW50ZWw4eDBfYWxpX3NwZGlmaW5fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisKKyNpZiAwIC8vIE5ZSQorc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2ludGVsOHgwX2FsaV9zcGRpZm91dF9vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsOHgwX2FsaV9zcGRpZm91dF9vcGVuLAorCS5jbG9zZSA9CXNuZF9pbnRlbDh4MF9hbGlfc3BkaWZvdXRfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbDh4MF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWw4eDBfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbDh4MF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbDh4MF9wY21fcG9pbnRlciwKK307CisjZW5kaWYgLy8gTllJCisKK3N0cnVjdCBpY2hfcGNtX3RhYmxlIHsKKwljaGFyICpzdWZmaXg7CisJc25kX3BjbV9vcHNfdCAqcGxheWJhY2tfb3BzOworCXNuZF9wY21fb3BzX3QgKmNhcHR1cmVfb3BzOworCXNpemVfdCBwcmVhbGxvY19zaXplOworCXNpemVfdCBwcmVhbGxvY19tYXhfc2l6ZTsKKwlpbnQgYWM5N19pZHg7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBfcGNtMShpbnRlbDh4MF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3QgaWNoX3BjbV90YWJsZSAqcmVjKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisJY2hhciBuYW1lWzMyXTsKKworCWlmIChyZWMtPnN1ZmZpeCkKKwkJc3ByaW50ZihuYW1lLCAiSW50ZWwgSUNIIC0gJXMiLCByZWMtPnN1ZmZpeCk7CisJZWxzZQorCQlzdHJjcHkobmFtZSwgIkludGVsIElDSCIpOworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIGRldmljZSwKKwkJCSAgcmVjLT5wbGF5YmFja19vcHMgPyAxIDogMCwKKwkJCSAgcmVjLT5jYXB0dXJlX29wcyA/IDEgOiAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChyZWMtPnBsYXliYWNrX29wcykKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgcmVjLT5wbGF5YmFja19vcHMpOworCWlmIChyZWMtPmNhcHR1cmVfb3BzKQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIHJlYy0+Y2FwdHVyZV9vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJaWYgKHJlYy0+c3VmZml4KQorCQlzcHJpbnRmKHBjbS0+bmFtZSwgIiVzIC0gJXMiLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUsIHJlYy0+c3VmZml4KTsKKwllbHNlCisJCXN0cmNweShwY20tPm5hbWUsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSk7CisJY2hpcC0+cGNtW2RldmljZV0gPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCSAgICAgIHJlYy0+cHJlYWxsb2Nfc2l6ZSwgcmVjLT5wcmVhbGxvY19tYXhfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpY2hfcGNtX3RhYmxlIGludGVsX3BjbXNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnBsYXliYWNrX29wcyA9ICZzbmRfaW50ZWw4eDBfcGxheWJhY2tfb3BzLAorCQkuY2FwdHVyZV9vcHMgPSAmc25kX2ludGVsOHgwX2NhcHR1cmVfb3BzLAorCQkucHJlYWxsb2Nfc2l6ZSA9IDY0ICogMTAyNCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gMTI4ICogMTAyNCwKKwl9LAorCXsKKwkJLnN1ZmZpeCA9ICJNSUMgQURDIiwKKwkJLmNhcHR1cmVfb3BzID0gJnNuZF9pbnRlbDh4MF9jYXB0dXJlX21pY19vcHMsCisJCS5wcmVhbGxvY19zaXplID0gMCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gMTI4ICogMTAyNCwKKwkJLmFjOTdfaWR4ID0gSUNIRF9NSUMsCisJfSwKKwl7CisJCS5zdWZmaXggPSAiTUlDMiBBREMiLAorCQkuY2FwdHVyZV9vcHMgPSAmc25kX2ludGVsOHgwX2NhcHR1cmVfbWljMl9vcHMsCisJCS5wcmVhbGxvY19zaXplID0gMCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gMTI4ICogMTAyNCwKKwkJLmFjOTdfaWR4ID0gSUNIRF9NSUMyLAorCX0sCisJeworCQkuc3VmZml4ID0gIkFEQzIiLAorCQkuY2FwdHVyZV9vcHMgPSAmc25kX2ludGVsOHgwX2NhcHR1cmUyX29wcywKKwkJLnByZWFsbG9jX3NpemUgPSAwLAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCQkuYWM5N19pZHggPSBJQ0hEX1BDTTJJTiwKKwl9LAorCXsKKwkJLnN1ZmZpeCA9ICJJRUM5NTgiLAorCQkucGxheWJhY2tfb3BzID0gJnNuZF9pbnRlbDh4MF9zcGRpZl9vcHMsCisJCS5wcmVhbGxvY19zaXplID0gNjQgKiAxMDI0LAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCQkuYWM5N19pZHggPSBJQ0hEX1NQQkFSLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGljaF9wY21fdGFibGUgbmZvcmNlX3BjbXNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnBsYXliYWNrX29wcyA9ICZzbmRfaW50ZWw4eDBfcGxheWJhY2tfb3BzLAorCQkuY2FwdHVyZV9vcHMgPSAmc25kX2ludGVsOHgwX2NhcHR1cmVfb3BzLAorCQkucHJlYWxsb2Nfc2l6ZSA9IDY0ICogMTAyNCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gMTI4ICogMTAyNCwKKwl9LAorCXsKKwkJLnN1ZmZpeCA9ICJNSUMgQURDIiwKKwkJLmNhcHR1cmVfb3BzID0gJnNuZF9pbnRlbDh4MF9jYXB0dXJlX21pY19vcHMsCisJCS5wcmVhbGxvY19zaXplID0gMCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gMTI4ICogMTAyNCwKKwkJLmFjOTdfaWR4ID0gTlZEX01JQywKKwl9LAorCXsKKwkJLnN1ZmZpeCA9ICJJRUM5NTgiLAorCQkucGxheWJhY2tfb3BzID0gJnNuZF9pbnRlbDh4MF9zcGRpZl9vcHMsCisJCS5wcmVhbGxvY19zaXplID0gNjQgKiAxMDI0LAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCQkuYWM5N19pZHggPSBOVkRfU1BCQVIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWNoX3BjbV90YWJsZSBhbGlfcGNtc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkucGxheWJhY2tfb3BzID0gJnNuZF9pbnRlbDh4MF9hbGlfcGxheWJhY2tfb3BzLAorCQkuY2FwdHVyZV9vcHMgPSAmc25kX2ludGVsOHgwX2FsaV9jYXB0dXJlX29wcywKKwkJLnByZWFsbG9jX3NpemUgPSA2NCAqIDEwMjQsCisJCS5wcmVhbGxvY19tYXhfc2l6ZSA9IDEyOCAqIDEwMjQsCisJfSwKKwl7CisJCS5zdWZmaXggPSAiTUlDIEFEQyIsCisJCS5jYXB0dXJlX29wcyA9ICZzbmRfaW50ZWw4eDBfYWxpX2NhcHR1cmVfbWljX29wcywKKwkJLnByZWFsbG9jX3NpemUgPSAwLAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCQkuYWM5N19pZHggPSBBTElEX01JQywKKwl9LAorCXsKKwkJLnN1ZmZpeCA9ICJJRUM5NTgiLAorCQkucGxheWJhY2tfb3BzID0gJnNuZF9pbnRlbDh4MF9hbGlfYWM5N3NwZGlmb3V0X29wcywKKwkJLmNhcHR1cmVfb3BzID0gJnNuZF9pbnRlbDh4MF9hbGlfc3BkaWZpbl9vcHMsCisJCS5wcmVhbGxvY19zaXplID0gNjQgKiAxMDI0LAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCQkuYWM5N19pZHggPSBBTElEX0FDOTdTUERJRk9VVCwKKwl9LAorI2lmIDAgLy8gTllJCisJeworCQkuc3VmZml4ID0gIkhXIElFQzk1OCIsCisJCS5wbGF5YmFja19vcHMgPSAmc25kX2ludGVsOHgwX2FsaV9zcGRpZm91dF9vcHMsCisJCS5wcmVhbGxvY19zaXplID0gNjQgKiAxMDI0LAorCQkucHJlYWxsb2NfbWF4X3NpemUgPSAxMjggKiAxMDI0LAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9wY20oaW50ZWw4eDBfdCAqY2hpcCkKK3sKKwlpbnQgaSwgdGJsc2l6ZSwgZGV2aWNlLCBlcnI7CisJc3RydWN0IGljaF9wY21fdGFibGUgKnRibCwgKnJlYzsKKworCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX3R5cGUpIHsKKwljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgorCQl0YmwgPSBpbnRlbF9wY21zOworCQl0YmxzaXplID0gQVJSQVlfU0laRShpbnRlbF9wY21zKTsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfTkZPUkNFOgorCQl0YmwgPSBuZm9yY2VfcGNtczsKKwkJdGJsc2l6ZSA9IEFSUkFZX1NJWkUobmZvcmNlX3BjbXMpOworCQlicmVhazsKKwljYXNlIERFVklDRV9BTEk6CisJCXRibCA9IGFsaV9wY21zOworCQl0YmxzaXplID0gQVJSQVlfU0laRShhbGlfcGNtcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRibCA9IGludGVsX3BjbXM7CisJCXRibHNpemUgPSAyOworCQlicmVhazsKKwl9CisKKwlkZXZpY2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCB0YmxzaXplOyBpKyspIHsKKwkJcmVjID0gdGJsICsgaTsKKwkJaWYgKGkgPiAwICYmIHJlYy0+YWM5N19pZHgpIHsKKwkJCS8qIGFjdGl2YXRlIFBDTSBvbmx5IHdoZW4gYXNzb2NpYXRlZCBBQyc5NyBjb2RlYyAqLworCQkJaWYgKCEgY2hpcC0+aWNoZFtyZWMtPmFjOTdfaWR4XS5wY20pCisJCQkJY29udGludWU7CisJCX0KKwkJZXJyID0gc25kX2ludGVsOHgwX3BjbTEoY2hpcCwgZGV2aWNlLCByZWMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWRldmljZSsrOworCX0KKworCWNoaXAtPnBjbV9kZXZzID0gZGV2aWNlOworCXJldHVybiAwOworfQorCQorCisvKgorICogIE1peGVyIHBhcnQKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfaW50ZWw4eDBfbWl4ZXJfZnJlZV9hYzk3X2J1cyhhYzk3X2J1c190ICpidXMpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPmFjOTdfYnVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc25kX2ludGVsOHgwX21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwljaGlwLT5hYzk3W2FjOTctPm51bV0gPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFjOTdfcGNtIGFjOTdfcGNtX2RlZnNbXSBfX2RldmluaXRkYXRhID0geworCS8qIGZyb250IFBDTSAqLworCXsKKwkJLmV4Y2x1c2l2ZSA9IDEsCisJCS5yID0gewl7CisJCQkJLnNsb3RzID0gKDEgPDwgQUM5N19TTE9UX1BDTV9MRUZUKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX1JJR0hUKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX0NFTlRFUikgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1BDTV9TTEVGVCkgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1BDTV9TUklHSFQpIHwKKwkJCQkJICgxIDw8IEFDOTdfU0xPVF9MRkUpCisJCQl9LAorCQkJeworCQkJCS5zbG90cyA9ICgxIDw8IEFDOTdfU0xPVF9QQ01fTEVGVCkgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1BDTV9SSUdIVCkgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1BDTV9MRUZUXzApIHwKKwkJCQkJICgxIDw8IEFDOTdfU0xPVF9QQ01fUklHSFRfMCkKKwkJCX0KKwkJfQorCX0sCisJLyogUENNIElOICMxICovCisJeworCQkuc3RyZWFtID0gMSwKKwkJLmV4Y2x1c2l2ZSA9IDEsCisJCS5yID0gewl7CisJCQkJLnNsb3RzID0gKDEgPDwgQUM5N19TTE9UX1BDTV9MRUZUKSB8CisJCQkJCSAoMSA8PCBBQzk3X1NMT1RfUENNX1JJR0hUKQorCQkJfQorCQl9CisJfSwKKwkvKiBNSUMgSU4gIzEgKi8KKwl7CisJCS5zdHJlYW0gPSAxLAorCQkuZXhjbHVzaXZlID0gMSwKKwkJLnIgPSB7CXsKKwkJCQkuc2xvdHMgPSAoMSA8PCBBQzk3X1NMT1RfTUlDKQorCQkJfQorCQl9CisJfSwKKwkvKiBTL1BESUYgUENNICovCisJeworCQkuZXhjbHVzaXZlID0gMSwKKwkJLnNwZGlmID0gMSwKKwkJLnIgPSB7CXsKKwkJCQkuc2xvdHMgPSAoMSA8PCBBQzk3X1NMT1RfU1BESUZfTEVGVDIpIHwKKwkJCQkJICgxIDw8IEFDOTdfU0xPVF9TUERJRl9SSUdIVDIpCisJCQl9CisJCX0KKwl9LAorCS8qIFBDTSBJTiAjMiAqLworCXsKKwkJLnN0cmVhbSA9IDEsCisJCS5leGNsdXNpdmUgPSAxLAorCQkuciA9IHsJeworCQkJCS5zbG90cyA9ICgxIDw8IEFDOTdfU0xPVF9QQ01fTEVGVCkgfAorCQkJCQkgKDEgPDwgQUM5N19TTE9UX1BDTV9SSUdIVCkKKwkJCX0KKwkJfQorCX0sCisJLyogTUlDIElOICMyICovCisJeworCQkuc3RyZWFtID0gMSwKKwkJLmV4Y2x1c2l2ZSA9IDEsCisJCS5yID0gewl7CisJCQkJLnNsb3RzID0gKDEgPDwgQUM5N19TTE9UX01JQykKKwkJCX0KKwkJfQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnZlbmRvciA9IDB4MGUxMSwKKwkJLmRldmljZSA9IDB4MDA4YSwKKwkJLm5hbWUgPSAiQ29tcGFxIEV2byBXNDAwMCIsCS8qIEFEMTg4NSAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDBlMTEsCisJCS5kZXZpY2UgPSAweDAwYjgsCisJCS5uYW1lID0gIkNvbXBhcSBFdm8gRDUxMEMiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKyAgICAgICAgeworCQkudmVuZG9yID0gMHgwZTExLAorCQkuZGV2aWNlID0gMHgwODYwLAorCQkubmFtZSA9ICJIUC9Db21wYXEgbng3MDEwIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfTVVURV9MRUQKKyAgICAgICAgfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwMTQsCisJCS5kZXZpY2UgPSAweDFmMDAsCisJCS5uYW1lID0gIk1TLTkxMjgiLAorCQkudHlwZSA9IEFDOTdfVFVORV9BTENfSkFDSworCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMGQ4LAorCQkubmFtZSA9ICJEZWxsIFByZWNpc2lvbiA1MzAiLAkvKiBBRDE4ODUgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTBkLAorCQkubmFtZSA9ICJEZWxsIiwJLyogd2hpY2ggbW9kZWw/ICBBRDE4ODUgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTI2LAorCQkubmFtZSA9ICJEZWxsIE9wdGlwbGV4IEdYMjYwIiwJLyogQUQxOTgxQSAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwMjgsCisJCS5kZXZpY2UgPSAweDAxMmMsCisJCS5uYW1lID0gIkRlbGwgUHJlY2lzaW9uIDY1MCIsCS8qIEFEMTk4MUEgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTJkLAorCQkubmFtZSA9ICJEZWxsIFByZWNpc2lvbiA0NTAiLAkvKiBBRDE5ODFCKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTQ3LAorCQkubmFtZSA9ICJEZWxsIiwJLyogd2hpY2ggbW9kZWw/ICBBRDE5ODFCKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTYzLAorCQkubmFtZSA9ICJEZWxsIFVua25vd24iLAkvKiBTVEFDOTc1MC81MSAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDAwNmQsCisJCS5uYW1lID0gIkhQIHp2NTAwMCIsCisJCS50eXBlID0gQUM5N19UVU5FX01VVEVfTEVECS8qQUQxOTgxQiovCisJfSwKKwl7CS8qIEZJWE1FOiB3aGljaCBjb2RlYz8gKi8KKwkJLnZlbmRvciA9IDB4MTAzYywKKwkJLmRldmljZSA9IDB4MDBjMywKKwkJLm5hbWUgPSAiSFAgeHc2MDAwIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgwODhjLAorCQkubmFtZSA9ICJIUCBuYzgwMDAiLAorCQkudHlwZSA9IEFDOTdfVFVORV9NVVRFX0xFRAorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgwODkwLAorCQkubmFtZSA9ICJIUCBuYzYwMDAiLAorCQkudHlwZSA9IEFDOTdfVFVORV9NVVRFX0xFRAorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgxMjlkLAorCQkubmFtZSA9ICJIUCB4dzgwMDAiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDEyZjEsCisJCS5uYW1lID0gIkhQIHh3ODIwMCIsCS8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDEyZjIsCisJCS5uYW1lID0gIkhQIHh3NjIwMCIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAzYywKKwkJLmRldmljZSA9IDB4MzAwOCwKKwkJLm5hbWUgPSAiSFAgeHc0MjAwIiwJLyogQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTA0ZCwKKwkJLmRldmljZSA9IDB4ODE5NywKKwkJLm5hbWUgPSAiU29ueSBTMVhQIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSU5WX0VBUEQKKwl9LAorIAl7CisJCS52ZW5kb3IgPSAweDEwNDMsCisJCS5kZXZpY2UgPSAweDgwZjMsCisJCS5uYW1lID0gIkFTVVMgSUNINS9BRDE5ODUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9BRF9TSEFSSU5HCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwY2YsCisJCS5kZXZpY2UgPSAweDExYzMsCisJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBFNDAxMCIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTBjZiwKKwkJLmRldmljZSA9IDB4MTI1MywKKwkJLm5hbWUgPSAiRnVqaXRzdSBTNjIxMCIsCS8qIFNUQUM5NzUwLzUxICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTBmMSwKKwkJLmRldmljZSA9IDB4MjY2NSwKKwkJLm5hbWUgPSAiRnVqaXRzdS1TaWVtZW5zIENlbHNpdXMiLAkvKiBBRDE5ODE/ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTBmMSwKKwkJLmRldmljZSA9IDB4Mjg4NSwKKwkJLm5hbWUgPSAiQU1ENjQgTW9ibyIsCS8qIEFMQzY1MCAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDExMGEsCisJCS5kZXZpY2UgPSAweDAwNTYsCisJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBTY2VuaWMiLAkvKiBBRDE5ODE/ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTFkNCwKKwkJLmRldmljZSA9IDB4NTM3NSwKKwkJLm5hbWUgPSAiQURJIEFEMTk4NSAoZGlzY3JldGUpIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxNDYyLAorCQkuZGV2aWNlID0gMHg1NDcwLAorCQkubmFtZSA9ICJNU0kgUDQgQVRYIDY0NSBVbHRyYSIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTczNCwKKwkJLmRldmljZSA9IDB4MDA4OCwKKwkJLm5hbWUgPSAiRnVqaXRzdS1TaWVtZW5zIEQxNTIyIiwJLyogQUQxOTgxICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4ODA4NiwKKwkJLmRldmljZSA9IDB4MjAwMCwKKwkJLm1hc2sgPSAweGZmZjAsCisJCS5uYW1lID0gIkludGVsIElDSDUvQUQxOTg1IiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfQURfU0hBUklORworCX0sCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHg0MDAwLAorCQkubWFzayA9IDB4ZmZmMCwKKwkJLm5hbWUgPSAiSW50ZWwgSUNINS9BRDE5ODUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9BRF9TSEFSSU5HCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDgwODYsCisJCS5kZXZpY2UgPSAweDQ4NTYsCisJCS5uYW1lID0gIkludGVsIEQ4NDVXTiAoODI4MDFCQSkiLAorCQkudHlwZSA9IEFDOTdfVFVORV9TV0FQX0hQCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDgwODYsCisJCS5kZXZpY2UgPSAweDRkNDQsCisJCS5uYW1lID0gIkludGVsIEQ4NTBFTVYyIiwJLyogQUQxODg1ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4ODA4NiwKKwkJLmRldmljZSA9IDB4NGQ1NiwKKwkJLm5hbWUgPSAiSW50ZWwgSUNIL0FEMTg4NSIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4ODA4NiwKKwkJLmRldmljZSA9IDB4NjAwMCwKKwkJLm1hc2sgPSAweGZmZjAsCisJCS5uYW1lID0gIkludGVsIElDSDUvQUQxOTg1IiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfQURfU0hBUklORworCX0sCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHhlMDAwLAorCQkubWFzayA9IDB4ZmZmMCwKKwkJLm5hbWUgPSAiSW50ZWwgSUNINS9BRDE5ODUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9BRF9TSEFSSU5HCisJfSwKKyNpZiAwIC8qIEZJWE1FOiB0aGlzIHNlZW1zIHdyb25nIG9uIG1vc3QgYm9hcmRzICovCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHhhMDAwLAorCQkubWFzayA9IDB4ZmZmMCwKKwkJLm5hbWUgPSAiSW50ZWwgSUNINS9BRDE5ODUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKyNlbmRpZgorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBfbWl4ZXIoaW50ZWw4eDBfdCAqY2hpcCwgaW50IGFjOTdfY2xvY2ssIGNvbnN0IGNoYXIgKnF1aXJrX292ZXJyaWRlKQoreworCWFjOTdfYnVzX3QgKnBidXM7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaSwgY29kZWNzOworCXVuc2lnbmVkIGludCBnbG9iX3N0YSA9IDA7CisJYWM5N19idXNfb3BzX3QgKm9wczsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgc3RhbmRhcmRfYnVzX29wcyA9IHsKKwkJLndyaXRlID0gc25kX2ludGVsOHgwX2NvZGVjX3dyaXRlLAorCQkucmVhZCA9IHNuZF9pbnRlbDh4MF9jb2RlY19yZWFkLAorCX07CisJc3RhdGljIGFjOTdfYnVzX29wc190IGFsaV9idXNfb3BzID0geworCQkud3JpdGUgPSBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3dyaXRlLAorCQkucmVhZCA9IHNuZF9pbnRlbDh4MF9hbGlfY29kZWNfcmVhZCwKKwl9OworCisJY2hpcC0+c3BkaWZfaWR4ID0gLTE7IC8qIHVzZSBQQ01PVVQgKG9yIGRpc2FibGVkKSAqLworCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX3R5cGUpIHsKKwljYXNlIERFVklDRV9ORk9SQ0U6CisJCWNoaXAtPnNwZGlmX2lkeCA9IE5WRF9TUEJBUjsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfQUxJOgorCQljaGlwLT5zcGRpZl9pZHggPSBBTElEX0FDOTdTUERJRk9VVDsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfSU5URUxfSUNINDoKKwkJY2hpcC0+c3BkaWZfaWR4ID0gSUNIRF9TUEJBUjsKKwkJYnJlYWs7CisJfTsKKworCWNoaXAtPmluX2FjOTdfaW5pdCA9IDE7CisJCisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pbnRlbDh4MF9taXhlcl9mcmVlX2FjOTc7CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCWlmIChjaGlwLT54Ym94KQorCQlhYzk3LnNjYXBzIHw9IEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSAhPSBERVZJQ0VfQUxJKSB7CisJCWdsb2Jfc3RhID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpOworCQlvcHMgPSAmc3RhbmRhcmRfYnVzX29wczsKKwkJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJCQljb2RlY3MgPSAwOworCQkJaWYgKGdsb2Jfc3RhICYgSUNIX1BDUikKKwkJCQljb2RlY3MrKzsKKwkJCWlmIChnbG9iX3N0YSAmIElDSF9TQ1IpCisJCQkJY29kZWNzKys7CisJCQlpZiAoZ2xvYl9zdGEgJiBJQ0hfVENSKQorCQkJCWNvZGVjcysrOworCQkJY2hpcC0+aW5fc2Rpbl9pbml0ID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb2RlY3M7IGkrKykgeworCQkJCXNuZF9pbnRlbDh4MF9jb2RlY19yZWFkX3Rlc3QoY2hpcCwgaSk7CisJCQkJY2hpcC0+YWM5N19zZGluW2ldID0gaWdldGJ5dGUoY2hpcCwgSUNIUkVHKFNETSkpICYgSUNIX0xESV9NQVNLOworCQkJfQorCQkJY2hpcC0+aW5fc2Rpbl9pbml0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNvZGVjcyA9IGdsb2Jfc3RhICYgSUNIX1NDUiA/IDIgOiAxOworCQl9CisJfSBlbHNlIHsKKwkJb3BzID0gJmFsaV9idXNfb3BzOworCQljb2RlY3MgPSAxOworCQkvKiBkZXRlY3QgdGhlIHNlY29uZGFyeSBjb2RlYyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCByZWcgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9SVFNSKSk7CisJCQlpZiAocmVnICYgMHg0MCkgeworCQkJCWNvZGVjcyA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9SVFNSKSwgcmVnIHwgMHg0MCk7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2hpcC0+Y2FyZCwgMCwgb3BzLCBjaGlwLCAmcGJ1cykpIDwgMCkKKwkJZ290byBfX2VycjsKKwlwYnVzLT5wcml2YXRlX2ZyZWUgPSBzbmRfaW50ZWw4eDBfbWl4ZXJfZnJlZV9hYzk3X2J1czsKKwlwYnVzLT5zaGFyZWRfdHlwZSA9IEFDOTdfU0hBUkVEX1RZUEVfSUNIOwkvKiBzaGFyZWQgd2l0aCBtb2RlbSBkcml2ZXIgKi8KKwlpZiAoYWM5N19jbG9jayA+PSA4MDAwICYmIGFjOTdfY2xvY2sgPD0gNDgwMDApCisJCXBidXMtPmNsb2NrID0gYWM5N19jbG9jazsKKwkvKiBGSVhNRTogbXkgdGVzdCBib2FyZCBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIFZSQS4uLiAqLworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKQorCQlwYnVzLT5ub192cmEgPSAxOworCWVsc2UKKwkJcGJ1cy0+ZHJhID0gMTsKKwljaGlwLT5hYzk3X2J1cyA9IHBidXM7CisKKwlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWNzOyBpKyspIHsKKwkJYWM5Ny5udW0gPSBpOworCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5N1tpXSkpIDwgMCkgeworCQkJaWYgKGVyciAhPSAtRUFDQ0VTKQorCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpbml0aWFsaXplIGNvZGVjICMlZFxuIiwgaSk7CisJCQlpZiAoaSA9PSAwKQorCQkJCWdvdG8gX19lcnI7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwkvKiB0dW5lIHVwIHRoZSBwcmltYXJ5IGNvZGVjICovCisJc25kX2FjOTdfdHVuZV9oYXJkd2FyZShjaGlwLT5hYzk3WzBdLCBhYzk3X3F1aXJrcywgcXVpcmtfb3ZlcnJpZGUpOworCS8qIGVuYWJsZSBzZXBhcmF0ZSBTRElOcyBmb3IgSUNINCAqLworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkKKwkJcGJ1cy0+aXNkaW4gPSAxOworCS8qIGZpbmQgdGhlIGF2YWlsYWJsZSBQQ00gc3RyZWFtcyAqLworCWkgPSBBUlJBWV9TSVpFKGFjOTdfcGNtX2RlZnMpOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSAhPSBERVZJQ0VfSU5URUxfSUNINCkKKwkJaSAtPSAyOwkJLyogZG8gbm90IGFsbG9jYXRlIFBDTTJJTiBhbmQgTUlDMiAqLworCWlmIChjaGlwLT5zcGRpZl9pZHggPCAwKQorCQlpLS07CQkvKiBkbyBub3QgYWxsb2NhdGUgUy9QRElGICovCisJZXJyID0gc25kX2FjOTdfcGNtX2Fzc2lnbihwYnVzLCBpLCBhYzk3X3BjbV9kZWZzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfX2VycjsKKwljaGlwLT5pY2hkW0lDSERfUENNT1VUXS5wY20gPSAmcGJ1cy0+cGNtc1swXTsKKwljaGlwLT5pY2hkW0lDSERfUENNSU5dLnBjbSA9ICZwYnVzLT5wY21zWzFdOworCWNoaXAtPmljaGRbSUNIRF9NSUNdLnBjbSA9ICZwYnVzLT5wY21zWzJdOworCWlmIChjaGlwLT5zcGRpZl9pZHggPj0gMCkKKwkJY2hpcC0+aWNoZFtjaGlwLT5zcGRpZl9pZHhdLnBjbSA9ICZwYnVzLT5wY21zWzNdOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkgeworCQljaGlwLT5pY2hkW0lDSERfUENNMklOXS5wY20gPSAmcGJ1cy0+cGNtc1s0XTsKKwkJY2hpcC0+aWNoZFtJQ0hEX01JQzJdLnBjbSA9ICZwYnVzLT5wY21zWzVdOworCX0KKwkvKiBlbmFibGUgc2VwYXJhdGUgU0RJTnMgZm9yIElDSDQgKi8KKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX0lOVEVMX0lDSDQpIHsKKwkJc3RydWN0IGFjOTdfcGNtICpwY20gPSBjaGlwLT5pY2hkW0lDSERfUENNMklOXS5wY207CisJCXU4IHRtcCA9IGlnZXRieXRlKGNoaXAsIElDSFJFRyhTRE0pKTsKKwkJdG1wICY9IH4oSUNIX0RJMkxfTUFTS3xJQ0hfREkxTF9NQVNLKTsKKwkJaWYgKHBjbSkgeworCQkJdG1wIHw9IElDSF9TRTsJLyogc3RlZXIgZW5hYmxlIGZvciBtdWx0aXBsZSBTRElOcyAqLworCQkJdG1wIHw9IGNoaXAtPmFjOTdfc2RpblswXSA8PCBJQ0hfREkxTF9TSElGVDsKKwkJCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJCQlpZiAocGNtLT5yWzBdLmNvZGVjW2ldKSB7CisJCQkJCXRtcCB8PSBjaGlwLT5hYzk3X3NkaW5bcGNtLT5yWzBdLmNvZGVjWzFdLT5udW1dIDw8IElDSF9ESTJMX1NISUZUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0bXAgJj0gfklDSF9TRTsgLyogc3RlZXIgZGlzYWJsZSAqLworCQl9CisJCWlwdXRieXRlKGNoaXAsIElDSFJFRyhTRE0pLCB0bXApOworCX0KKwlpZiAocGJ1cy0+cGNtc1swXS5yWzBdLnNsb3RzICYgKDEgPDwgQUM5N19TTE9UX1BDTV9TTEVGVCkpIHsKKwkJY2hpcC0+bXVsdGk0ID0gMTsKKwkJaWYgKHBidXMtPnBjbXNbMF0uclswXS5zbG90cyAmICgxIDw8IEFDOTdfU0xPVF9MRkUpKQorCQkJY2hpcC0+bXVsdGk2ID0gMTsKKwl9CisJaWYgKHBidXMtPnBjbXNbMF0uclsxXS5yc2xvdHNbMF0pIHsKKwkJY2hpcC0+ZHJhID0gMTsKKwl9CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJCWlmICgoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgSUNIX1NBTVBMRV9DQVApID09IElDSF9TQU1QTEVfMTZfMjApCisJCQljaGlwLT5zbXAyMGJpdCA9IDE7CisJfQorCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJCS8qIDQ4a0h6IG9ubHkgKi8KKwkJY2hpcC0+aWNoZFtjaGlwLT5zcGRpZl9pZHhdLnBjbS0+cmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwl9CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJCS8qIHVzZSBzbG90IDEwLzExIGZvciBTUERJRiAqLworCQl1MzIgdmFsOworCQl2YWwgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkgJiB+SUNIX1BDTV9TUERJRl9NQVNLOworCQl2YWwgfD0gSUNIX1BDTV9TUERJRl8xMDExOworCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSwgdmFsKTsKKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoY2hpcC0+YWM5N1swXSwgQUM5N19FWFRFTkRFRF9TVEFUVVMsIDB4MDMgPDwgNCwgMHgwMyA8PCA0KTsKKwl9CisJY2hpcC0+aW5fYWM5N19pbml0ID0gMDsKKwlyZXR1cm4gMDsKKworIF9fZXJyOgorCS8qIGNsZWFyIHRoZSBjb2xkLXJlc2V0IGJpdCBmb3IgdGhlIG5leHQgY2hhbmNlICovCisJaWYgKGNoaXAtPmRldmljZV90eXBlICE9IERFVklDRV9BTEkpCisJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpLCBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkgJiB+SUNIX0FDOTdDT0xEKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKgorICovCisKK3N0YXRpYyB2b2lkIGRvX2FsaV9yZXNldChpbnRlbDh4MF90ICpjaGlwKQoreworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX1NDUiksIElDSF9BTElfU0NfUkVTRVQpOworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0ZJRk9DUjEpLCAweDgzODM4MzgzKTsKKwlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9GSUZPQ1IyKSwgMHg4MzgzODM4Myk7CisJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhBTElfRklGT0NSMyksIDB4ODM4MzgzODMpOworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0lOVEVSRkFDRUNSKSwKKwkJICBJQ0hfQUxJX0lGX01DfElDSF9BTElfSUZfUEl8SUNIX0FMSV9JRl9QTyk7CisJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhBTElfSU5URVJSVVBUQ1IpLCAweDAwMDAwMDAwKTsKKwlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9JTlRFUlJVUFRTUiksIDB4MDAwMDAwMDApOworfQorCisjZGVmaW5lIGRvX2RlbGF5KGNoaXApIGRvIHtcCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpO1wKKwlzY2hlZHVsZV90aW1lb3V0KDEpO1wKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2ljaF9jaGlwX2luaXQoaW50ZWw4eDBfdCAqY2hpcCwgaW50IHByb2JpbmcpCit7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1bnNpZ25lZCBpbnQgY250LCBzdGF0dXMsIG5zdGF0dXM7CisJCisJLyogcHV0IGxvZ2ljIHRvIHJpZ2h0IHN0YXRlICovCisJLyogZmlyc3QgY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwlzdGF0dXMgPSBJQ0hfUkNTIHwgSUNIX01DSU5UIHwgSUNIX1BPSU5UIHwgSUNIX1BJSU5UOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKQorCQlzdGF0dXMgfD0gSUNIX05WU1BJTlQ7CisJY250ID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpOworCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpLCBjbnQgJiBzdGF0dXMpOworCisJLyogQUNMaW5rIG9uLCAyIGNoYW5uZWxzICovCisJY250ID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpOworCWNudCAmPSB+KElDSF9BQ0xJTksgfCBJQ0hfUENNXzI0Nl9NQVNLKTsKKwkvKiBmaW5pc2ggY29sZCBvciBkbyB3YXJtIHJlc2V0ICovCisJY250IHw9IChjbnQgJiBJQ0hfQUM5N0NPTEQpID09IDAgPyBJQ0hfQUM5N0NPTEQgOiBJQ0hfQUM5N1dBUk07CisJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCksIGNudCk7CisJZW5kX3RpbWUgPSAoamlmZmllcyArIChIWiAvIDQpKSArIDE7CisJZG8geworCQlpZiAoKGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpKSAmIElDSF9BQzk3V0FSTSkgPT0gMCkKKwkJCWdvdG8gX19vazsKKwkJZG9fZGVsYXkoY2hpcCk7CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOworCXNuZF9wcmludGsoIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKKwlyZXR1cm4gLUVJTzsKKworICAgICAgX19vazoKKwlpZiAocHJvYmluZykgeworCQkvKiB3YWl0IGZvciBhbnkgY29kZWMgcmVhZHkgc3RhdHVzLgorCQkgKiBPbmNlIGl0IGJlY29tZXMgcmVhZHkgaXQgc2hvdWxkIHJlbWFpbiByZWFkeQorCQkgKiBhcyBsb25nIGFzIHdlIGRvIG5vdCBkaXNhYmxlIHRoZSBhYzk3IGxpbmsuCisJCSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJZG8geworCQkJc3RhdHVzID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgKElDSF9QQ1IgfCBJQ0hfU0NSIHwgSUNIX1RDUik7CisJCQlpZiAoc3RhdHVzKQorCQkJCWJyZWFrOworCQkJZG9fZGVsYXkoY2hpcCk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwkJaWYgKCEgc3RhdHVzKSB7CisJCQkvKiBubyBjb2RlYyBpcyBmb3VuZCAqLworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkKKwkJCS8qIElDSDQgY2FuIGhhdmUgdGhyZWUgY29kZWNzICovCisJCQluc3RhdHVzID0gSUNIX1BDUiB8IElDSF9TQ1IgfCBJQ0hfVENSOworCQllbHNlCisJCQkvKiBvdGhlcnMgdXAgdG8gdHdvIGNvZGVjcyAqLworCQkJbnN0YXR1cyA9IElDSF9QQ1IgfCBJQ0hfU0NSOworCisJCS8qIHdhaXQgZm9yIG90aGVyIGNvZGVjcyByZWFkeSBzdGF0dXMuICovCisJCWVuZF90aW1lID0gamlmZmllcyArIEhaIC8gNDsKKwkJd2hpbGUgKHN0YXR1cyAhPSBuc3RhdHVzICYmIHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKSB7CisJCQlkb19kZWxheShjaGlwKTsKKwkJCXN0YXR1cyB8PSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkgJiBuc3RhdHVzOworCQl9CisKKwl9IGVsc2UgeworCQkvKiByZXN1bWUgcGhhc2UgKi8KKwkJaW50IGk7CisJCXN0YXR1cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlpZiAoY2hpcC0+YWM5N1tpXSkKKwkJCQlzdGF0dXMgfD0gZ2V0X2ljaF9jb2RlY19iaXQoY2hpcCwgaSk7CisJCS8qIHdhaXQgdW50aWwgYWxsIHRoZSBwcm9iZWQgY29kZWNzIGFyZSByZWFkeSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJZG8geworCQkJbnN0YXR1cyA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSAmIChJQ0hfUENSIHwgSUNIX1NDUiB8IElDSF9UQ1IpOworCQkJaWYgKHN0YXR1cyA9PSBuc3RhdHVzKQorCQkJCWJyZWFrOworCQkJZG9fZGVsYXkoY2hpcCk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwl9CisKKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX1NJUykgeworCQkvKiB1bm11dGUgdGhlIG91dHB1dCBvbiBTSVM3MDEyICovCisJCWlwdXR3b3JkKGNoaXAsIDB4NGMsIGlnZXR3b3JkKGNoaXAsIDB4NGMpIHwgMSk7CisJfQorCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJCS8qIGVuYWJsZSBTUERJRiBpbnRlcnJ1cHQgKi8KKwkJdW5zaWduZWQgaW50IHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNoaXAtPnBjaSwgMHg0YywgJnZhbCk7CisJCXZhbCB8PSAweDEwMDAwMDA7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY2hpcC0+cGNpLCAweDRjLCB2YWwpOworCX0KKyAgICAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfYWxpX2NoaXBfaW5pdChpbnRlbDh4MF90ICpjaGlwLCBpbnQgcHJvYmluZykKK3sKKwl1MzIgcmVnOworCWludCBpID0gMDsKKworCXJlZyA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX1NDUikpOworCWlmICgocmVnICYgMikgPT0gMCkJLyogQ29sZCByZXF1aXJlZCAqLworCQlyZWcgfD0gMjsKKwllbHNlCisJCXJlZyB8PSAxOwkvKiBXYXJtICovCisJcmVnICY9IH4weDgwMDAwMDAwOwkvKiBBQ0xpbmsgb24gKi8KKwlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9TQ1IpLCByZWcpOworCisJZm9yIChpID0gMDsgaSA8IEhaIC8gMjsgaSsrKSB7CisJCWlmICghIChpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9JTlRFUlJVUFRTUikpICYgQUxJX0lOVF9HUElPKSkKKwkJCWdvdG8gX19vazsKKwkJZG9fZGVsYXkoY2hpcCk7CisJfQorCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOworCWlmIChwcm9iaW5nKQorCQlyZXR1cm4gLUVJTzsKKworIF9fb2s6CisJZm9yIChpID0gMDsgaSA8IEhaIC8gMjsgaSsrKSB7CisJCXJlZyA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX1JUU1IpKTsKKwkJaWYgKHJlZyAmIDB4ODApIC8qIHByaW1hcnkgY29kZWMgKi8KKwkJCWJyZWFrOworCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9SVFNSKSwgcmVnIHwgMHg4MCk7CisJCWRvX2RlbGF5KGNoaXApOworCX0KKworCWRvX2FsaV9yZXNldChjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfY2hpcF9pbml0KGludGVsOHgwX3QgKmNoaXAsIGludCBwcm9iaW5nKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJCisJaWYgKGNoaXAtPmRldmljZV90eXBlICE9IERFVklDRV9BTEkpIHsKKwkJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBfaWNoX2NoaXBfaW5pdChjaGlwLCBwcm9iaW5nKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLworCX0gZWxzZSB7CisJCWlmICgoZXJyID0gc25kX2ludGVsOHgwX2FsaV9jaGlwX2luaXQoY2hpcCwgcHJvYmluZykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0Ynl0ZShjaGlwLCBJQ0hfUkVHX09GRl9DUiArIGNoaXAtPmljaGRbaV0ucmVnX29mZnNldCwgMHgwMCk7CisJLyogcmVzZXQgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+YmRiYXJzX2NvdW50OyBpKyspCisJCWlwdXRieXRlKGNoaXAsIElDSF9SRUdfT0ZGX0NSICsgY2hpcC0+aWNoZFtpXS5yZWdfb2Zmc2V0LCBJQ0hfUkVTRVRSRUdTKTsKKwkvKiBpbml0aWFsaXplIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3RzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0ZHdvcmQoY2hpcCwgSUNIX1JFR19PRkZfQkRCQVIgKyBjaGlwLT5pY2hkW2ldLnJlZ19vZmZzZXQsIGNoaXAtPmljaGRbaV0uYmRiYXJfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2ZyZWUoaW50ZWw4eDBfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjaGlwLT5pcnEgPCAwKQorCQlnb3RvIF9faHdfZW5kOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykKKwkJaXB1dGJ5dGUoY2hpcCwgSUNIX1JFR19PRkZfQ1IgKyBjaGlwLT5pY2hkW2ldLnJlZ19vZmZzZXQsIDB4MDApOworCS8qIHJlc2V0IGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0Ynl0ZShjaGlwLCBJQ0hfUkVHX09GRl9DUiArIGNoaXAtPmljaGRbaV0ucmVnX29mZnNldCwgSUNIX1JFU0VUUkVHUyk7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9ORk9SQ0UpIHsKKwkJLyogc3RvcCB0aGUgc3BkaWYgaW50ZXJydXB0ICovCisJCXVuc2lnbmVkIGludCB2YWw7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlwLT5wY2ksIDB4NGMsICZ2YWwpOworCQl2YWwgJj0gfjB4MTAwMDAwMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjaGlwLT5wY2ksIDB4NGMsIHZhbCk7CisJfQorCS8qIC0tLSAqLworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworICAgICAgX19od19lbmQ6CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJaWYgKGNoaXAtPmJkYmFycy5hcmVhKSB7CisJCWlmIChjaGlwLT5maXhfbm9jYWNoZSkKKwkJCWZpbGxfbm9jYWNoZShjaGlwLT5iZGJhcnMuYXJlYSwgY2hpcC0+YmRiYXJzLmJ5dGVzLCAwKTsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5iZGJhcnMpOworCX0KKwlpZiAoY2hpcC0+cmVtYXBfYWRkcikKKwkJaW91bm1hcChjaGlwLT5yZW1hcF9hZGRyKTsKKwlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyKQorCQlpb3VubWFwKGNoaXAtPnJlbWFwX2JtYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IGludGVsOHgwX3N1c3BlbmQoc25kX2NhcmRfdCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+cGNtX2RldnM7IGkrKykKKwkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOworCS8qIGNsZWFyIG5vY2FjaGUgKi8KKwlpZiAoY2hpcC0+Zml4X25vY2FjaGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKSB7CisJCQlpY2hkZXZfdCAqaWNoZGV2ID0gJmNoaXAtPmljaGRbaV07CisJCQlpZiAoaWNoZGV2LT5zdWJzdHJlYW0gJiYgaWNoZGV2LT5wYWdlX2F0dHJfY2hhbmdlZCkgeworCQkJCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gaWNoZGV2LT5zdWJzdHJlYW0tPnJ1bnRpbWU7CisJCQkJaWYgKHJ1bnRpbWUtPmRtYV9hcmVhKQorCQkJCQlmaWxsX25vY2FjaGUocnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMCk7CisJCQl9CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJaWYgKGNoaXAtPmFjOTdbaV0pCisJCQlzbmRfYWM5N19zdXNwZW5kKGNoaXAtPmFjOTdbaV0pOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsOHgwX3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKKworCS8qIHJlZmlsbCBub2NhY2hlICovCisJaWYgKGNoaXAtPmZpeF9ub2NhY2hlKQorCQlmaWxsX25vY2FjaGUoY2hpcC0+YmRiYXJzLmFyZWEsIGNoaXAtPmJkYmFycy5ieXRlcywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpZiAoY2hpcC0+YWM5N1tpXSkKKwkJCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3W2ldKTsKKworCS8qIHJlZmlsbCBub2NhY2hlICovCisJaWYgKGNoaXAtPmZpeF9ub2NhY2hlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykgeworCQkJaWNoZGV2X3QgKmljaGRldiA9ICZjaGlwLT5pY2hkW2ldOworCQkJaWYgKGljaGRldi0+c3Vic3RyZWFtICYmIGljaGRldi0+cGFnZV9hdHRyX2NoYW5nZWQpIHsKKwkJCQlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IGljaGRldi0+c3Vic3RyZWFtLT5ydW50aW1lOworCQkJCWlmIChydW50aW1lLT5kbWFfYXJlYSkKKwkJCQkJZmlsbF9ub2NhY2hlKHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYnl0ZXMsIDEpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNkZWZpbmUgSU5URUw4WDBfVEVTVEJVRl9TSVpFCTMyNzY4CS8qIGVub3VnaCBsYXJnZSBmb3Igb25lIHNob3QgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhpbnRlbDh4MF90ICpjaGlwKQoreworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnM7CisJaWNoZGV2X3QgKmljaGRldjsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJdW5zaWduZWQgbG9uZyBwb3MsIHQ7CisJc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZSwgc3RvcF90aW1lOworCisJaWYgKGNoaXAtPmFjOTdfYnVzLT5jbG9jayAhPSA0ODAwMCkKKwkJcmV0dXJuOyAvKiBzcGVjaWZpZWQgaW4gbW9kdWxlIG9wdGlvbiAqLworCisJc3VicyA9IGNoaXAtPnBjbVswXS0+c3RyZWFtc1swXS5zdWJzdHJlYW07CisJaWYgKCEgc3VicyB8fCBzdWJzLT5kbWFfYnVmZmVyLmJ5dGVzIDwgSU5URUw4WDBfVEVTVEJVRl9TSVpFKSB7CisJCXNuZF9wcmludGsoIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOworCQlyZXR1cm47CisJfQorCWljaGRldiA9ICZjaGlwLT5pY2hkW0lDSERfUENNT1VUXTsKKwlpY2hkZXYtPnBoeXNidWYgPSBzdWJzLT5kbWFfYnVmZmVyLmFkZHI7CisJaWNoZGV2LT5zaXplID0gY2hpcC0+aWNoZFtJQ0hEX1BDTU9VVF0uZnJhZ3NpemUgPSBJTlRFTDhYMF9URVNUQlVGX1NJWkU7CisJaWNoZGV2LT5zdWJzdHJlYW0gPSBOVUxMOyAvKiBkb24ndCBwcm9jZXNzIGludGVycnVwdHMgKi8KKworCS8qIHNldCByYXRlICovCisJaWYgKHNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTdbMF0sIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCA0ODAwMCkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzZXQgYWM5NyByYXRlOiBjbG9jayA9ICVkXG4iLCBjaGlwLT5hYzk3X2J1cy0+Y2xvY2spOworCQlyZXR1cm47CisJfQorCXNuZF9pbnRlbDh4MF9zZXR1cF9wZXJpb2RzKGNoaXAsIGljaGRldik7CisJcG9ydCA9IGljaGRldi0+cmVnX29mZnNldDsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+aW5fbWVhc3VyZW1lbnQgPSAxOworCS8qIHRyaWdnZXIgKi8KKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX0FMSSkKKwkJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NSLCBJQ0hfSU9DRSB8IElDSF9TVEFSVEJNKTsKKwllbHNlIHsKKwkJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NSLCBJQ0hfSU9DRSk7CisJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoQUxJX0RNQUNSKSwgMSA8PCBpY2hkZXYtPmFsaV9zbG90KTsKKwl9CisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydF90aW1lKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWiAvIDIwKTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogY2hlY2sgdGhlIHBvc2l0aW9uICovCisJcG9zID0gaWNoZGV2LT5mcmFnc2l6ZTE7CisJcG9zIC09IGlnZXR3b3JkKGNoaXAsIGljaGRldi0+cmVnX29mZnNldCArIGljaGRldi0+cm9mZl9waWNiKSA8PCBpY2hkZXYtPnBvc19zaGlmdDsKKwlwb3MgKz0gaWNoZGV2LT5wb3NpdGlvbjsKKwljaGlwLT5pbl9tZWFzdXJlbWVudCA9IDA7CisJZG9fZ2V0dGltZW9mZGF5KCZzdG9wX3RpbWUpOworCS8qIHN0b3AgKi8KKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX0FMSSkgeworCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9ETUFDUiksIDEgPDwgKGljaGRldi0+YWxpX3Nsb3QgKyA4KSk7CisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgMCk7CisJCXdoaWxlIChpZ2V0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKQorCQkJOworCX0gZWxzZSB7CisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgMCk7CisJCXdoaWxlICghKGlnZXRieXRlKGNoaXAsIHBvcnQgKyBpY2hkZXYtPnJvZmZfc3IpICYgSUNIX0RDSCkpCisJCQk7CisJfQorCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgSUNIX1JFU0VUUkVHUyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwl0ID0gc3RvcF90aW1lLnR2X3NlYyAtIHN0YXJ0X3RpbWUudHZfc2VjOworCXQgKj0gMTAwMDAwMDsKKwl0ICs9IHN0b3BfdGltZS50dl91c2VjIC0gc3RhcnRfdGltZS50dl91c2VjOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBtZWFzdXJlZCAlbHUgdXNlY3NcbiIsIF9fRlVOQ1RJT05fXywgdCk7CisJaWYgKHQgPT0gMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICI/PyBjYWxjdWxhdGlvbiBlcnJvci4uXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwb3MgPSAocG9zIC8gNCkgKiAxMDAwOworCXBvcyA9IChwb3MgLyB0KSAqIDEwMDAgKyAoKHBvcyAlIHQpICogMTAwMCkgLyB0OworCWlmIChwb3MgPCA0MDAwMCB8fCBwb3MgPj0gNjAwMDApIAorCQkvKiBhYm5vcm1hbCB2YWx1ZS4gaHcgcHJvYmxlbT8gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6IG1lYXN1cmVkIGNsb2NrICVsZCByZWplY3RlZFxuIiwgcG9zKTsKKwllbHNlIGlmIChwb3MgPCA0NzUwMCB8fCBwb3MgPiA0ODUwMCkKKwkJLyogbm90IDQ4MDAwSHosIHR1bmluZyB0aGUgY2xvY2suLiAqLworCQljaGlwLT5hYzk3X2J1cy0+Y2xvY2sgPSAoY2hpcC0+YWM5N19idXMtPmNsb2NrICogNDgwMDApIC8gcG9zOworCXByaW50ayhLRVJOX0lORk8gImludGVsOHgwOiBjbG9ja2luZyB0byAlZFxuIiwgY2hpcC0+YWM5N19idXMtPmNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgc25kX2ludGVsOHgwX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICogZW50cnksCisJCQkJICAgc25kX2luZm9fYnVmZmVyX3QgKiBidWZmZXIpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkludGVsOHgwXG5cbiIpOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKQorCQlyZXR1cm47CisJdG1wID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkdsb2JhbCBjb250cm9sICAgICAgICA6IDB4JTA4eFxuIiwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJHbG9iYWwgc3RhdHVzICAgICAgICAgOiAweCUwOHhcbiIsIHRtcCk7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KQorCQlzbmRfaXByaW50ZihidWZmZXIsICJTRE0gICAgICAgICAgICAgICAgICAgOiAweCUwOHhcbiIsIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoU0RNKSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFDJzk3IGNvZGVjcyByZWFkeSAgICA6JXMlcyVzJXNcbiIsCisJCQl0bXAgJiBJQ0hfUENSID8gIiBwcmltYXJ5IiA6ICIiLAorCQkJdG1wICYgSUNIX1NDUiA/ICIgc2Vjb25kYXJ5IiA6ICIiLAorCQkJdG1wICYgSUNIX1RDUiA/ICIgdGVydGlhcnkiIDogIiIsCisJCQkodG1wICYgKElDSF9QQ1IgfCBJQ0hfU0NSIHwgSUNIX1RDUikpID09IDAgPyAiIG5vbmUiIDogIiIpOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQUMnOTcgY29kZWNzIFNESU4gICAgIDogJWkgJWkgJWlcbiIsCisJCQljaGlwLT5hYzk3X3NkaW5bMF0sCisJCQljaGlwLT5hYzk3X3NkaW5bMV0sCisJCQljaGlwLT5hYzk3X3NkaW5bMl0pOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2ludGVsOHgwX3Byb2NfaW5pdChpbnRlbDh4MF90ICogY2hpcCkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJpbnRlbDh4MCIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX2ludGVsOHgwX3Byb2NfcmVhZCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKK30KKworc3RydWN0IGljaF9yZWdfaW5mbyB7CisJdW5zaWduZWQgaW50IGludF9zdGFfbWFzazsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVsOHgwX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSB1bnNpZ25lZCBsb25nIGRldmljZV90eXBlLAorCQkJCQkgaW50ZWw4eDBfdCAqKiByX2ludGVsOHgwKQoreworCWludGVsOHgwX3QgKmNoaXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW50X3N0YV9tYXNrczsKKwlpY2hkZXZfdCAqaWNoZGV2OworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX2ludGVsOHgwX2Rldl9mcmVlLAorCX07CisKKwlzdGF0aWMgdW5zaWduZWQgaW50IGJkYmFyc1tdID0geworCQkzLCAvKiBERVZJQ0VfSU5URUwgKi8KKwkJNiwgLyogREVWSUNFX0lOVEVMX0lDSDQgKi8KKwkJMywgLyogREVWSUNFX1NJUyAqLworCQk2LCAvKiBERVZJQ0VfQUxJICovCisJCTQsIC8qIERFVklDRV9ORk9SQ0UgKi8KKwl9OworCXN0YXRpYyBzdHJ1Y3QgaWNoX3JlZ19pbmZvIGludGVsX3JlZ3NbNl0gPSB7CisJCXsgSUNIX1BJSU5ULCAwIH0sCisJCXsgSUNIX1BPSU5ULCAweDEwIH0sCisJCXsgSUNIX01DSU5ULCAweDIwIH0sCisJCXsgSUNIX00ySU5ULCAweDQwIH0sCisJCXsgSUNIX1AySU5ULCAweDUwIH0sCisJCXsgSUNIX1NQSU5ULCAweDYwIH0sCisJfTsKKwlzdGF0aWMgc3RydWN0IGljaF9yZWdfaW5mbyBuZm9yY2VfcmVnc1s0XSA9IHsKKwkJeyBJQ0hfUElJTlQsIDAgfSwKKwkJeyBJQ0hfUE9JTlQsIDB4MTAgfSwKKwkJeyBJQ0hfTUNJTlQsIDB4MjAgfSwKKwkJeyBJQ0hfTlZTUElOVCwgMHg3MCB9LAorCX07CisJc3RhdGljIHN0cnVjdCBpY2hfcmVnX2luZm8gYWxpX3JlZ3NbNl0gPSB7CisJCXsgQUxJX0lOVF9QQ01JTiwgMHg0MCB9LAorCQl7IEFMSV9JTlRfUENNT1VULCAweDUwIH0sCisJCXsgQUxJX0lOVF9NSUNJTiwgMHg2MCB9LAorCQl7IEFMSV9JTlRfQ09ERUNTUERJRk9VVCwgMHg3MCB9LAorCQl7IEFMSV9JTlRfU1BESUZJTiwgMHhhMCB9LAorCQl7IEFMSV9JTlRfU1BESUZPVVQsIDB4YjAgfSwKKwl9OworCXN0cnVjdCBpY2hfcmVnX2luZm8gKnRibDsKKworCSpyX2ludGVsOHgwID0gTlVMTDsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+ZGV2aWNlX3R5cGUgPSBkZXZpY2VfdHlwZTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+aXJxID0gLTE7CisKKwlpZiAocGNpLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJgorCSAgICBwY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzQ0ME1YKQorCQljaGlwLT5maXhfbm9jYWNoZSA9IDE7IC8qIGVuYWJsZSB3b3JrYXJvdW5kICovCisKKwkvKiBzb21lIE5mb3JjZVsyXSBhbmQgSUNIIGJvYXJkcyBoYXZlIHByb2JsZW1zIHdpdGggSVJRIGhhbmRsaW5nLgorCSAqIE5lZWRzIHRvIHJldHVybiBJUlFfSEFORExFRCBmb3IgdW5rbm93biBpcnFzLgorCSAqLworCWlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKQorCQljaGlwLT5idWdneV9pcnEgPSAxOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgY2FyZC0+c2hvcnRuYW1lKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX0FMSSkgeworCQkvKiBBTEk1NDU1IGhhcyBubyBhYzk3IHJlZ2lvbiAqLworCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwkJZ290byBwb3J0X2luaXRlZDsKKwl9CisKKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMikgJiBJT1JFU09VUkNFX01FTSkgewkvKiBJQ0g0IGFuZCBOZm9yY2UgKi8KKwkJY2hpcC0+bW1pbyA9IDE7CisJCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKKwkJY2hpcC0+cmVtYXBfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5hZGRyLAorCQkJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2ksIDIpKTsKKwkJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgeworCQkJc25kX3ByaW50aygiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJfQorCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAzKSAmIElPUkVTT1VSQ0VfTUVNKSB7CS8qIElDSDQgKi8KKwkJY2hpcC0+Ym1fbW1pbyA9IDE7CisJCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOworCQljaGlwLT5yZW1hcF9ibWFkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+Ym1hZGRyLAorCQkJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMykpOworCQlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyID09IE5VTEwpIHsKKwkJCXNuZF9wcmludGsoIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwl9CisKKyBwb3J0X2luaXRlZDoKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgY2FyZC0+c2hvcnRuYW1lLCAodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKKworCWNoaXAtPmJkYmFyc19jb3VudCA9IGJkYmFyc1tkZXZpY2VfdHlwZV07CisKKwkvKiBpbml0aWFsaXplIG9mZnNldHMgKi8KKwlzd2l0Y2ggKGRldmljZV90eXBlKSB7CisJY2FzZSBERVZJQ0VfTkZPUkNFOgorCQl0YmwgPSBuZm9yY2VfcmVnczsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfQUxJOgorCQl0YmwgPSBhbGlfcmVnczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGJsID0gaW50ZWxfcmVnczsKKwkJYnJlYWs7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykgeworCQlpY2hkZXYgPSAmY2hpcC0+aWNoZFtpXTsKKwkJaWNoZGV2LT5pY2hkID0gaTsKKwkJaWNoZGV2LT5yZWdfb2Zmc2V0ID0gdGJsW2ldLm9mZnNldDsKKwkJaWNoZGV2LT5pbnRfc3RhX21hc2sgPSB0YmxbaV0uaW50X3N0YV9tYXNrOworCQlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1NJUykgeworCQkJLyogU2lTIDcwMTIgc3dhcHMgdGhlIHJlZ2lzdGVycyAqLworCQkJaWNoZGV2LT5yb2ZmX3NyID0gSUNIX1JFR19PRkZfUElDQjsKKwkJCWljaGRldi0+cm9mZl9waWNiID0gSUNIX1JFR19PRkZfU1I7CisJCX0gZWxzZSB7CisJCQlpY2hkZXYtPnJvZmZfc3IgPSBJQ0hfUkVHX09GRl9TUjsKKwkJCWljaGRldi0+cm9mZl9waWNiID0gSUNIX1JFR19PRkZfUElDQjsKKwkJfQorCQlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX0FMSSkKKwkJCWljaGRldi0+YWxpX3Nsb3QgPSAoaWNoZGV2LT5yZWdfb2Zmc2V0IC0gMHg0MCkgLyAweDEwOworCQkvKiBTSVM3MDEyIGhhbmRsZXMgdGhlIHBjbSBkYXRhIGluIGJ5dGVzLCBvdGhlcnMgYXJlIGluIHNhbXBsZXMgKi8KKwkJaWNoZGV2LT5wb3Nfc2hpZnQgPSAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1NJUykgPyAwIDogMTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvciBsaXN0cyAqLworCS8qIHRoZSBzdGFydCBvZiBlYWNoIGxpc3RzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzICovCisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJY2hpcC0+YmRiYXJzX2NvdW50ICogc2l6ZW9mKHUzMikgKiBJQ0hfTUFYX0ZSQUdTICogMiwKKwkJCQkmY2hpcC0+YmRiYXJzKSA8IDApIHsKKwkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImludGVsOHgwOiBjYW5ub3QgYWxsb2NhdGUgYnVmZmVyIGRlc2NyaXB0b3JzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHRhYmxlcyBtdXN0IGJlIGFsaWduZWQgdG8gOCBieXRlcyBoZXJlLCBidXQgdGhlIGtlcm5lbCBwYWdlcworCSAgIGFyZSBtdWNoIGJpZ2dlciwgc28gd2UgZG9uJ3QgY2FyZSAob24gaTM4NikgKi8KKwkvKiB3b3JrYXJvdW5kIGZvciA0NDBNWCAqLworCWlmIChjaGlwLT5maXhfbm9jYWNoZSkKKwkJZmlsbF9ub2NhY2hlKGNoaXAtPmJkYmFycy5hcmVhLCBjaGlwLT5iZGJhcnMuYnl0ZXMsIDEpOworCWludF9zdGFfbWFza3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykgeworCQlpY2hkZXYgPSAmY2hpcC0+aWNoZFtpXTsKKwkJaWNoZGV2LT5iZGJhciA9ICgodTMyICopY2hpcC0+YmRiYXJzLmFyZWEpICsgKGkgKiBJQ0hfTUFYX0ZSQUdTICogMik7CisJCWljaGRldi0+YmRiYXJfYWRkciA9IGNoaXAtPmJkYmFycy5hZGRyICsgKGkgKiBzaXplb2YodTMyKSAqIElDSF9NQVhfRlJBR1MgKiAyKTsKKwkJaW50X3N0YV9tYXNrcyB8PSBpY2hkZXYtPmludF9zdGFfbWFzazsKKwl9CisJY2hpcC0+aW50X3N0YV9yZWcgPSBkZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJID8gSUNIX1JFR19BTElfSU5URVJSVVBUU1IgOiBJQ0hfUkVHX0dMT0JfU1RBOworCWNoaXAtPmludF9zdGFfbWFzayA9IGludF9zdGFfbWFza3M7CisKKwlpZiAoKGVyciA9IHNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMSkpIDwgMCkgeworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2FyZCwgaW50ZWw4eDBfc3VzcGVuZCwgaW50ZWw4eDBfcmVzdW1lLCBjaGlwKTsKKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyX2ludGVsOHgwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaG9ydG5hbWVfdGFibGUgeworCXVuc2lnbmVkIGludCBpZDsKKwljb25zdCBjaGFyICpzOworfSBzaG9ydG5hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDEsICJJbnRlbCA4MjgwMUFBLUlDSCIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MDEsICJJbnRlbCA4MjkwMUFCLUlDSDAiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkEsICJJbnRlbCA4MjgwMUJBLUlDSDIiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzQ0ME1YLCAiSW50ZWwgNDQwTVgiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDMsICJJbnRlbCA4MjgwMUNBLUlDSDMiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDQsICJJbnRlbCA4MjgwMURCLUlDSDQiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDUsICJJbnRlbCBJQ0g1IiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfNSwgIkludGVsIDYzMDBFU0IiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTgsICJJbnRlbCBJQ0g2IiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzIwLCAiSW50ZWwgSUNINyIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0lfNzAxMiwgIlNpUyBTSTcwMTIiIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1BfQVVESU8sICJOVmlkaWEgbkZvcmNlIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMl9BVURJTywgIk5WaWRpYSBuRm9yY2UyIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfTUNQM19BVURJTywgIk5WaWRpYSBuRm9yY2UzIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfQ0s4U19BVURJTywgIk5WaWRpYSBDSzhTIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfQ0s4MDRfQVVESU8sICJOVmlkaWEgQ0s4MDQiIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzhfQVVESU8sICJOVmlkaWEgQ0s4IiB9LAorCXsgMHgwMDNhLCAiTlZpZGlhIE1DUDA0IiB9LAorCXsgMHg3NDZkLCAiQU1EIEFNRDgxMTEiIH0sCisJeyAweDc0NDUsICJBTUQgQU1ENzY4IiB9LAorCXsgMHg1NDU1LCAiQUxpIE01NDU1IiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVsOHgwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlpbnRlbDh4MF90ICpjaGlwOworCWludCBlcnI7CisJc3RydWN0IHNob3J0bmFtZV90YWJsZSAqbmFtZTsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoIChwY2lfaWQtPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBERVZJQ0VfTkZPUkNFOgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiTkZPUkNFIik7CisJCWJyZWFrOworCWNhc2UgREVWSUNFX0lOVEVMX0lDSDQ6CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0g0Iik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0giKTsKKwkJYnJlYWs7CisJfQorCisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkludGVsIElDSCIpOworCWZvciAobmFtZSA9IHNob3J0bmFtZXM7IG5hbWUtPmlkOyBuYW1lKyspIHsKKwkJaWYgKHBjaS0+ZGV2aWNlID09IG5hbWUtPmlkKSB7CisJCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBuYW1lLT5zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBfY3JlYXRlKGNhcmQsIHBjaSwgcGNpX2lkLT5kcml2ZXJfZGF0YSwgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGJ1Z2d5X2lycVtkZXZdKQorCQljaGlwLT5idWdneV9pcnEgPSAxOworCWlmICh4Ym94W2Rldl0pCisJCWNoaXAtPnhib3ggPSAxOworCisJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBfbWl4ZXIoY2hpcCwgYWM5N19jbG9ja1tkZXZdLCBhYzk3X3F1aXJrW2Rldl0pKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBfcGNtKGNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJc25kX2ludGVsOHgwX3Byb2NfaW5pdChjaGlwKTsKKworCXNucHJpbnRmKGNhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+bG9uZ25hbWUpLAorCQkgIiVzIHdpdGggJXMgYXQgJSNseCwgaXJxICVpIiwgY2FyZC0+c2hvcnRuYW1lLAorCQkgc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUoY2hpcC0+YWM5N1swXSksIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CisKKwlpZiAoISBhYzk3X2Nsb2NrW2Rldl0pCisJCWludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhjaGlwKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9pbnRlbDh4MF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJJbnRlbCBJQ0giLAorCS5pZF90YWJsZSA9IHNuZF9pbnRlbDh4MF9pZHMsCisJLnByb2JlID0gc25kX2ludGVsOHgwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfaW50ZWw4eDBfcmVtb3ZlKSwKKwlTTkRfUENJX1BNX0NBTExCQUNLUworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfaW50ZWw4eDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfaW50ZWw4eDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2ludGVsOHgwX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfaW50ZWw4eDBfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RhMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0wLDAgKzEsMTQ2MiBAQAorLyoKKyAqICAgQUxTQSBtb2RlbSBkcml2ZXIgZm9yIEludGVsIElDSCAoaTh4MCkgY2hpcHNldHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoKKyAqICAgVGhpcyBpcyBtb2RpZmllZCAoYnkgU2FzaGEgS2hhcHlvcnNreSA8c2FzaGFrQHNtbGluay5jb20+KSB2ZXJzaW9uCisgKiAgIG9mIEFMU0EgSUNIIHNvdW5kIGRyaXZlciBpbnRlbDh4MC5jIC4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCA4MjgwMUFBLDgyOTAxQUIsaTgxMCxpODIwLGk4MzAsaTg0MCxpODQ1LE1YNDQwOyBTaVMgNzAxMzsgTlZpZGlhIE1DUC8yLzJTLzMgbW9kZW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tJbnRlbCw4MjgwMUFBLUlDSH0sIgorCQkie0ludGVsLDgyOTAxQUItSUNIMH0sIgorCQkie0ludGVsLDgyODAxQkEtSUNIMn0sIgorCQkie0ludGVsLDgyODAxQ0EtSUNIM30sIgorCQkie0ludGVsLDgyODAxREItSUNINH0sIgorCQkie0ludGVsLElDSDV9LCIKKwkJIntJbnRlbCxJQ0g2fSwiCisJCSJ7SW50ZWwsSUNIN30sIgorCSAgICAgICAgIntJbnRlbCxNWDQ0MH0sIgorCQkie1NpUyw3MDEzfSwiCisJCSJ7TlZpZGlhLE5Gb3JjZSBNb2RlbX0sIgorCQkie05WaWRpYSxORm9yY2UyIE1vZGVtfSwiCisJCSJ7TlZpZGlhLE5Gb3JjZTJzIE1vZGVtfSwiCisJCSJ7TlZpZGlhLE5Gb3JjZTMgTW9kZW19LCIKKwkJIntBTUQsQU1ENzY4fX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IC0yfTsgLyogRXhjbHVkZSB0aGUgZmlyc3QgY2FyZCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgYWM5N19jbG9ja1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgbW9kZW1jYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBJbnRlbCBpOHgwIG1vZGVtY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgSW50ZWwgaTh4MCBtb2RlbWNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYWM5N19jbG9jaywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19jbG9jaywgIkFDJzk3IGNvZGVjIGNsb2NrICgwID0gYXV0by1kZXRlY3QpLiIpOworCisvKgorICogIERpcmVjdCByZWdpc3RlcnMKKyAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFfNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxXzYgICAgIDB4MjQxNgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MDFfNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTAxXzYgICAgIDB4MjQyNgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV82CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV82ICAgMHgyNDQ2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF80NDBNWF82CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNDQwTVhfNiAgICAgMHg3MTk2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gzXzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gzXzYJMHgyNDg2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g0XzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g0XzYJMHgyNGM2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g1XzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g1XzYJMHgyNGQ2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzYJMHgyNjZkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzYJMHgyN2RkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83MDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAxMwkJMHg3MDEzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfTUNQX01PREVNCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUF9NT0RFTQkweDAxYzEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AyX01PREVNCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDJfTU9ERU0JMHgwMDY5CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMlNfTU9ERU0KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMlNfTU9ERU0gMHgwMDg5CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OVklESUFfTUNQM19NT0RFTQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AzX01PREVNCTB4MDBkOQorI2VuZGlmCisKKworZW51bSB7IERFVklDRV9JTlRFTCwgREVWSUNFX1NJUywgREVWSUNFX0FMSSwgREVWSUNFX05GT1JDRSB9OworCisjZGVmaW5lIElDSFJFRyh4KSBJQ0hfUkVHXyMjeAorCisjZGVmaW5lIERFRklORV9SRUdTRVQobmFtZSxiYXNlKSBcCitlbnVtIHsgXAorCUlDSF9SRUdfIyNuYW1lIyNfQkRCQVIJPSBiYXNlICsgMHgwLAkvKiBkd29yZCAtIGJ1ZmZlciBkZXNjcmlwdG9yIGxpc3QgYmFzZSBhZGRyZXNzICovIFwKKwlJQ0hfUkVHXyMjbmFtZSMjX0NJVgk9IGJhc2UgKyAweDA0LAkvKiBieXRlIC0gY3VycmVudCBpbmRleCB2YWx1ZSAqLyBcCisJSUNIX1JFR18jI25hbWUjI19MVkkJPSBiYXNlICsgMHgwNSwJLyogYnl0ZSAtIGxhc3QgdmFsaWQgaW5kZXggKi8gXAorCUlDSF9SRUdfIyNuYW1lIyNfU1IJPSBiYXNlICsgMHgwNiwJLyogYnl0ZSAtIHN0YXR1cyByZWdpc3RlciAqLyBcCisJSUNIX1JFR18jI25hbWUjI19QSUNCCT0gYmFzZSArIDB4MDgsCS8qIHdvcmQgLSBwb3NpdGlvbiBpbiBjdXJyZW50IGJ1ZmZlciAqLyBcCisJSUNIX1JFR18jI25hbWUjI19QSVYJPSBiYXNlICsgMHgwYSwJLyogYnl0ZSAtIHByZWZldGNoZWQgaW5kZXggdmFsdWUgKi8gXAorCUlDSF9SRUdfIyNuYW1lIyNfQ1IJPSBiYXNlICsgMHgwYiwJLyogYnl0ZSAtIGNvbnRyb2wgcmVnaXN0ZXIgKi8gXAorfTsKKworLyogYnVzbWFzdGVyIGJsb2NrcyAqLworREVGSU5FX1JFR1NFVChPRkYsIDApOwkJLyogb2Zmc2V0ICovCisKKy8qIHZhbHVlcyBmb3IgZWFjaCBidXNtYXN0ZXIgYmxvY2sgKi8KKworLyogTFZJICovCisjZGVmaW5lIElDSF9SRUdfTFZJX01BU0sJCTB4MWYKKworLyogU1IgKi8KKyNkZWZpbmUgSUNIX0ZJRk9FCQkJMHgxMAkvKiBGSUZPIGVycm9yICovCisjZGVmaW5lIElDSF9CQ0lTCQkJMHgwOAkvKiBidWZmZXIgY29tcGxldGlvbiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIElDSF9MVkJDSQkJCTB4MDQJLyogbGFzdCB2YWxpZCBidWZmZXIgY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNIX0NFTFYJCQkweDAyCS8qIGN1cnJlbnQgZXF1YWxzIGxhc3QgdmFsaWQgKi8KKyNkZWZpbmUgSUNIX0RDSAkJCQkweDAxCS8qIERNQSBjb250cm9sbGVyIGhhbHRlZCAqLworCisvKiBQSVYgKi8KKyNkZWZpbmUgSUNIX1JFR19QSVZfTUFTSwkJMHgxZgkvKiBtYXNrICovCisKKy8qIENSICovCisjZGVmaW5lIElDSF9JT0NFCQkJMHgxMAkvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgSUNIX0ZFSUUJCQkweDA4CS8qIGZpZm8gZXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJQ0hfTFZCSUUJCQkweDA0CS8qIGxhc3QgdmFsaWQgYnVmZmVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUNIX1JFU0VUUkVHUwkJCTB4MDIJLyogcmVzZXQgYnVzbWFzdGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBJQ0hfU1RBUlRCTQkJCTB4MDEJLyogc3RhcnQgYnVzbWFzdGVyIG9wZXJhdGlvbiAqLworCisKKy8qIGdsb2JhbCBibG9jayAqLworI2RlZmluZSBJQ0hfUkVHX0dMT0JfQ05UCQkweDNjCS8qIGR3b3JkIC0gZ2xvYmFsIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBJQ0hfVFJJRQkJMHgwMDAwMDA0MAkvKiB0ZXJ0aWFyeSByZXN1bWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIElDSF9TUklFCQkweDAwMDAwMDIwCS8qIHNlY29uZGFyeSByZXN1bWUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgIElDSF9QUklFCQkweDAwMDAwMDEwCS8qIHByaW1hcnkgcmVzdW1lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICBJQ0hfQUNMSU5LCQkweDAwMDAwMDA4CS8qIEFDbGluayBzaHV0IG9mZiAqLworI2RlZmluZSAgIElDSF9BQzk3V0FSTQkJMHgwMDAwMDAwNAkvKiBBQyc5NyB3YXJtIHJlc2V0ICovCisjZGVmaW5lICAgSUNIX0FDOTdDT0xECQkweDAwMDAwMDAyCS8qIEFDJzk3IGNvbGQgcmVzZXQgKi8KKyNkZWZpbmUgICBJQ0hfR0lFCQkweDAwMDAwMDAxCS8qIEdQSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElDSF9SRUdfR0xPQl9TVEEJCTB4NDAJLyogZHdvcmQgLSBnbG9iYWwgc3RhdHVzICovCisjZGVmaW5lICAgSUNIX1RSSQkJMHgyMDAwMDAwMAkvKiBJQ0g0OiB0ZXJ0aWFyeSAoQUNfU0RJTjIpIHJlc3VtZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfVENSCQkweDEwMDAwMDAwCS8qIElDSDQ6IHRlcnRpYXJ5IChBQ19TRElOMikgY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgICBJQ0hfQkNTCQkweDA4MDAwMDAwCS8qIElDSDQ6IGJpdCBjbG9jayBzdG9wcGVkICovCisjZGVmaW5lICAgSUNIX1NQSU5UCQkweDA0MDAwMDAwCS8qIElDSDQ6IFMvUERJRiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfUDJJTlQJCTB4MDIwMDAwMDAJLyogSUNINDogUENNMi1JbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfTTJJTlQJCTB4MDEwMDAwMDAJLyogSUNINDogTWljMi1JbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfU0FNUExFX0NBUAkweDAwYzAwMDAwCS8qIElDSDQ6IHNhbXBsZSBjYXBhYmlsaXR5IGJpdHMgKFJPKSAqLworI2RlZmluZSAgIElDSF9NVUxUSUNIQU5fQ0FQCTB4MDAzMDAwMDAJLyogSUNINDogbXVsdGktY2hhbm5lbCBjYXBhYmlsaXR5IGJpdHMgKFJPKSAqLworI2RlZmluZSAgIElDSF9NRDMJCTB4MDAwMjAwMDAJLyogbW9kZW0gcG93ZXIgZG93biBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgICBJQ0hfQUQzCQkweDAwMDEwMDAwCS8qIGF1ZGlvIHBvd2VyIGRvd24gc2VtYXBob3JlICovCisjZGVmaW5lICAgSUNIX1JDUwkJMHgwMDAwODAwMAkvKiByZWFkIGNvbXBsZXRpb24gc3RhdHVzICovCisjZGVmaW5lICAgSUNIX0JJVDMJCTB4MDAwMDQwMDAJLyogYml0IDMgc2xvdCAxMiAqLworI2RlZmluZSAgIElDSF9CSVQyCQkweDAwMDAyMDAwCS8qIGJpdCAyIHNsb3QgMTIgKi8KKyNkZWZpbmUgICBJQ0hfQklUMQkJMHgwMDAwMTAwMAkvKiBiaXQgMSBzbG90IDEyICovCisjZGVmaW5lICAgSUNIX1NSSQkJMHgwMDAwMDgwMAkvKiBzZWNvbmRhcnkgKEFDX1NESU4xKSByZXN1bWUgaW50ZXJydXB0ICovCisjZGVmaW5lICAgSUNIX1BSSQkJMHgwMDAwMDQwMAkvKiBwcmltYXJ5IChBQ19TRElOMCkgcmVzdW1lIGludGVycnVwdCAqLworI2RlZmluZSAgIElDSF9TQ1IJCTB4MDAwMDAyMDAJLyogc2Vjb25kYXJ5IChBQ19TRElOMSkgY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgICBJQ0hfUENSCQkweDAwMDAwMTAwCS8qIHByaW1hcnkgKEFDX1NESU4wKSBjb2RlYyByZWFkeSAqLworI2RlZmluZSAgIElDSF9NQ0lOVAkJMHgwMDAwMDA4MAkvKiBNSUMgY2FwdHVyZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfUE9JTlQJCTB4MDAwMDAwNDAJLyogcGxheWJhY2sgaW50ZXJydXB0ICovCisjZGVmaW5lICAgSUNIX1BJSU5UCQkweDAwMDAwMDIwCS8qIGNhcHR1cmUgaW50ZXJydXB0ICovCisjZGVmaW5lICAgSUNIX05WU1BJTlQJCTB4MDAwMDAwMTAJLyogbmZvcmNlIHNwZGlmIGludGVycnVwdCAqLworI2RlZmluZSAgIElDSF9NT0lOVAkJMHgwMDAwMDAwNAkvKiBtb2RlbSBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfTUlJTlQJCTB4MDAwMDAwMDIJLyogbW9kZW0gY2FwdHVyZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBJQ0hfR1NDSQkJMHgwMDAwMDAwMQkvKiBHUEkgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNIX1JFR19BQ0NfU0VNQQkJMHg0NAkvKiBieXRlIC0gY29kZWMgd3JpdGUgc2VtYXBob3JlICovCisjZGVmaW5lICAgSUNIX0NBUwkJMHgwMQkJLyogY29kZWMgYWNjZXNzIHNlbWFwaG9yZSAqLworCisjZGVmaW5lIElDSF9NQVhfRlJBR1MJCTMyCQkvKiBtYXggaHcgZnJhZ3MgKi8KKworCisvKgorICogIAorICovCisKK2VudW0geyBJQ0hEX01ETUlOLCBJQ0hEX01ETU9VVCwgSUNIRF9NRE1MQVNUID0gSUNIRF9NRE1PVVQgfTsKK2VudW0geyBBTElEX01ETUlOLCBBTElEX01ETU9VVCwgQUxJRF9NRE1MQVNUID0gQUxJRF9NRE1PVVQgfTsKKworI2RlZmluZSBnZXRfaWNoZGV2KHN1YnN0cmVhbSkgKGljaGRldl90ICopKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGljaGQ7CQkJLyogaWNoIGRldmljZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7CQkvKiBvZmZzZXQgdG8gYm1hZGRyICovCisJdTMyICpiZGJhcjsJCQkJLyogQ1BVIGFkZHJlc3MgKDMyYml0KSAqLworCXVuc2lnbmVkIGludCBiZGJhcl9hZGRyOwkJLyogUENJIGJ1cyBhZGRyZXNzICgzMmJpdCkgKi8KKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJdW5zaWduZWQgaW50IHBoeXNidWY7CQkJLyogcGh5c2ljYWwgYWRkcmVzcyAoMzJiaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgZnJhZ3NpemU7CisgICAgICAgIHVuc2lnbmVkIGludCBmcmFnc2l6ZTE7CisgICAgICAgIHVuc2lnbmVkIGludCBwb3NpdGlvbjsKKyAgICAgICAgaW50IGZyYWdzOworICAgICAgICBpbnQgbHZpOworICAgICAgICBpbnQgbHZpX2ZyYWc7CisJaW50IGNpdjsKKwlpbnQgYWNrOworCWludCBhY2tfcmVsb2FkOworCXVuc2lnbmVkIGludCBhY2tfYml0OworCXVuc2lnbmVkIGludCByb2ZmX3NyOworCXVuc2lnbmVkIGludCByb2ZmX3BpY2I7CisJdW5zaWduZWQgaW50IGludF9zdGFfbWFzazsJCS8qIGludGVycnVwdCBzdGF0dXMgbWFzayAqLworCXVuc2lnbmVkIGludCBhbGlfc2xvdDsJCQkvKiBBTEkgRE1BIHNsb3QgKi8KKwlhYzk3X3QgKmFjOTc7Cit9IGljaGRldl90OworCit0eXBlZGVmIHN0cnVjdCBfc25kX2ludGVsOHgwbSBpbnRlbDh4MF90OworCitzdHJ1Y3QgX3NuZF9pbnRlbDh4MG0geworCXVuc2lnbmVkIGludCBkZXZpY2VfdHlwZTsKKworCWludCBpcnE7CisKKwl1bnNpZ25lZCBpbnQgbW1pbzsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOworCXVuc2lnbmVkIGludCBibV9tbWlvOworCXVuc2lnbmVkIGxvbmcgYm1hZGRyOworCXZvaWQgX19pb21lbSAqcmVtYXBfYm1hZGRyOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfY2FyZF90ICpjYXJkOworCisJaW50IHBjbV9kZXZzOworCXNuZF9wY21fdCAqcGNtWzJdOworCWljaGRldl90IGljaGRbMl07CisKKwl1bnNpZ25lZCBpbnQgaW5fYWM5N19pbml0OiAxOworCisJYWM5N19idXNfdCAqYWM5N19idXM7CisJYWM5N190ICphYzk3OworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwkKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgYmRiYXJzOworCXUzMiBiZGJhcnNfY291bnQ7CisJdTMyIGludF9zdGFfcmVnOwkJLyogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworCXUzMiBpbnRfc3RhX21hc2s7CQkvKiBpbnRlcnJ1cHQgc3RhdHVzIG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgcGNtX3Bvc19zaGlmdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfaW50ZWw4eDBtX2lkc1tdID0geworCXsgMHg4MDg2LCAweDI0MTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTCB9LAkvKiA4MjgwMUFBICovCisJeyAweDgwODYsIDB4MjQyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sCS8qIDgyOTAxQUIgKi8KKwl7IDB4ODA4NiwgMHgyNDQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogODI4MDFCQSAqLworCXsgMHg4MDg2LCAweDI0ODYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTCB9LAkvKiBJQ0gzICovCisJeyAweDgwODYsIDB4MjRjNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sIC8qIElDSDQgKi8KKwl7IDB4ODA4NiwgMHgyNGQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwgLyogSUNINSAqLworCXsgMHg4MDg2LCAweDI2NmQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9JTlRFTCB9LAkvKiBJQ0g2ICovCisJeyAweDgwODYsIDB4MjdkZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sCS8qIElDSDcgKi8KKwl7IDB4ODA4NiwgMHg3MTk2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogNDQwTVggKi8KKwl7IDB4MTAyMiwgMHg3NDQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfSU5URUwgfSwJLyogQU1ENzY4ICovCisJeyAweDEwMzksIDB4NzAxMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX1NJUyB9LAkvKiBTSTcwMTMgKi8KKwl7IDB4MTBkZSwgMHgwMWMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfTkZPUkNFIH0sIC8qIE5GT1JDRSAqLworCXsgMHgxMGRlLCAweDAwNjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwgLyogTkZPUkNFMiAqLworCXsgMHgxMGRlLCAweDAwODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFVklDRV9ORk9SQ0UgfSwgLyogTkZPUkNFMnMgKi8KKwl7IDB4MTBkZSwgMHgwMGQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfTkZPUkNFIH0sIC8qIE5GT1JDRTMgKi8KKyNpZiAwCisJeyAweDEwMjIsIDB4NzQ2ZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREVWSUNFX0lOVEVMIH0sCS8qIEFNRDgxMTEgKi8KKwl7IDB4MTBiOSwgMHg1NDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERVZJQ0VfQUxJIH0sICAgLyogQWxpNTQ1NSAqLworI2VuZGlmCisJeyAwLCB9Cit9Oworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3N3aXRjaF9kZWZhdWx0X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCQkJCSAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpOworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3N3aXRjaF9kZWZhdWx0X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCQkJCSAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpOworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3N3aXRjaF9kZWZhdWx0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCQkgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKTsKKworI2RlZmluZSBQUklWQVRFX1ZBTFVFX0lOSVRJQUxJWkVSKHIsbSkgKCgocikgJiAweGZmZmYpIDw8IDE2IHwgKChtKSAmIDB4ZmZmZikpCisjZGVmaW5lIFBSSVZBVEVfVkFMVUVfTUFTSyhjb250cm9sKSAoKGNvbnRyb2wpLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmKQorI2RlZmluZSBQUklWQVRFX1ZBTFVFX1JFRyhjb250cm9sKSAoKChjb250cm9sKS0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmZmYpCisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ludGVsOHgwbV9taXhlcl9zd2l0Y2hlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisgIHsgLm5hbWUgID0gIk9mZi1ob29rIFN3aXRjaCIsCisgICAgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgLmluZm8gID0gc25kX2ludGVsOHgwbV9zd2l0Y2hfZGVmYXVsdF9pbmZvLAorICAgIC5nZXQgICA9IHNuZF9pbnRlbDh4MG1fc3dpdGNoX2RlZmF1bHRfZ2V0LAorICAgIC5wdXQgICA9IHNuZF9pbnRlbDh4MG1fc3dpdGNoX2RlZmF1bHRfcHV0LAorICAgIC5wcml2YXRlX3ZhbHVlID0gUFJJVkFURV9WQUxVRV9JTklUSUFMSVpFUihBQzk3X0dQSU9fU1RBVFVTLEFDOTdfR1BJT19MSU5FMV9PSCkKKyAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9pbnRlbDh4MG1faWRzKTsKKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3N3aXRjaF9kZWZhdWx0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCQkgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MG1fc3dpdGNoX2RlZmF1bHRfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwKKwkJCQkJICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gUFJJVkFURV9WQUxVRV9NQVNLKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCByZWcgPSBQUklWQVRFX1ZBTFVFX1JFRyhrY29udHJvbCk7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXN0YXR1cyA9IHNuZF9hYzk3X3JlYWQoY2hpcC0+YWM5NywgcmVnKSAmIG1hc2sgPyAxIDogMDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHN0YXR1czsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9zd2l0Y2hfZGVmYXVsdF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCQkgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXVuc2lnbmVkIHNob3J0IG1hc2sgPSBQUklWQVRFX1ZBTFVFX01BU0soa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHJlZyA9IFBSSVZBVEVfVkFMVUVfUkVHKGtjb250cm9sKTsKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IG5ld19zdGF0dXMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IG1hc2sgOiB+bWFzazsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoY2hpcC0+YWM5NywgcmVnLAorCQkJCSAgICBtYXNrLCBuZXdfc3RhdHVzKTsKK30KKy8qCisgKiAgTG93bGV2ZWwgSS9PIC0gYnVzbWFzdGVyCisgKi8KKworc3RhdGljIHU4IGlnZXRieXRlKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXJldHVybiByZWFkYihjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIGluYihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTE2IGlnZXR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXJldHVybiByZWFkdyhjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIGludyhjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTMyIGlnZXRkd29yZChpbnRlbDh4MF90ICpjaGlwLCB1MzIgb2Zmc2V0KQoreworCWlmIChjaGlwLT5ibV9tbWlvKQorCQlyZXR1cm4gcmVhZGwoY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKKwllbHNlCisJCXJldHVybiBpbmwoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgaXB1dGJ5dGUoaW50ZWw4eDBfdCAqY2hpcCwgdTMyIG9mZnNldCwgdTggdmFsKQoreworCWlmIChjaGlwLT5ibV9tbWlvKQorCQl3cml0ZWIodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJb3V0Yih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwdXR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXdyaXRldyh2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXR3KHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgaXB1dGR3b3JkKGludGVsOHgwX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJaWYgKGNoaXAtPmJtX21taW8pCisJCXdyaXRlbCh2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXRsKHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKK30KKworLyoKKyAqICBMb3dsZXZlbCBJL08gLSBBQyc5NyByZWdpc3RlcnMKKyAqLworCitzdGF0aWMgdTE2IGlhZ2V0d29yZChpbnRlbDh4MF90ICpjaGlwLCB1MzIgb2Zmc2V0KQoreworCWlmIChjaGlwLT5tbWlvKQorCQlyZXR1cm4gcmVhZHcoY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlyZXR1cm4gaW53KGNoaXAtPmFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBpYXB1dHdvcmQoaW50ZWw4eDBfdCAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKK3sKKwlpZiAoY2hpcC0+bW1pbykKKwkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7CisJZWxzZQorCQlvdXR3KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7Cit9CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKworLyoKKyAqIGFjY2VzcyB0byBBQzk3IGNvZGVjIHZpYSBub3JtYWwgaS9vIChmb3IgSUNIIGFuZCBTSVM3MDEzKQorICovCisKKy8qIHJldHVybiB0aGUgR0xPQl9TVEEgYml0IGZvciB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfaWNoX2NvZGVjX2JpdChpbnRlbDh4MF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgY29kZWMpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBjb2RlY19iaXRbM10gPSB7CisJCUlDSF9QQ1IsIElDSF9TQ1IsIElDSF9UQ1IKKwl9OworCXNuZF9hc3NlcnQoY29kZWMgPCAzLCByZXR1cm4gSUNIX1BDUik7CisJcmV0dXJuIGNvZGVjX2JpdFtjb2RlY107Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoaW50ZWw4eDBfdCAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjKQoreworCWludCB0aW1lOworCQorCWlmIChjb2RlYyA+IDEpCisJCXJldHVybiAtRUlPOworCWNvZGVjID0gZ2V0X2ljaF9jb2RlY19iaXQoY2hpcCwgY29kZWMpOworCisJLyogY29kZWMgcmVhZHkgPyAqLworCWlmICgoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgY29kZWMpID09IDApCisJCXJldHVybiAtRUlPOworCisJLyogQW55b25lIGhvbGRpbmcgYSBzZW1hcGhvcmUgZm9yIDEgbXNlYyBzaG91bGQgYmUgc2hvdC4uLiAqLworCXRpbWUgPSAxMDA7CisgICAgICAJZG8geworICAgICAgCQlpZiAoIShpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoQUNDX1NFTUEpKSAmIElDSF9DQVMpKQorICAgICAgCQkJcmV0dXJuIDA7CisJCXVkZWxheSgxMCk7CisJfSB3aGlsZSAodGltZS0tKTsKKworCS8qIGFjY2VzcyB0byBzb21lIGZvcmJpZGRlbiAobm9uIGV4aXN0YW50KSBhYzk3IHJlZ2lzdGVycyB3aWxsIG5vdAorCSAqIHJlc2V0IHRoZSBzZW1hcGhvcmUuIFNvIGV2ZW4gaWYgeW91IGRvbid0IGdldCB0aGUgc2VtYXBob3JlLCBzdGlsbAorCSAqIGNvbnRpbnVlIHRoZSBhY2Nlc3MuIFdlIGRvbid0IG5lZWQgdGhlIHNlbWFwaG9yZSBhbnl3YXkuICovCisJc25kX3ByaW50aygiY29kZWNfc2VtYXBob3JlOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IFsweCV4XVsweCV4XVxuIiwKKwkJCWlnZXRieXRlKGNoaXAsIElDSFJFRyhBQ0NfU0VNQSkpLCBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkpOworCWlhZ2V0d29yZChjaGlwLCAwKTsJLyogY2xlYXIgc2VtYXBob3JlIGZsYWcgKi8KKwkvKiBJIGRvbid0IGNhcmUgYWJvdXQgdGhlIHNlbWFwaG9yZSAqLworCXJldHVybiAtRUJVU1k7Cit9CisgCitzdGF0aWMgdm9pZCBzbmRfaW50ZWw4eDBfY29kZWNfd3JpdGUoYWM5N190ICphYzk3LAorCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWludGVsOHgwX3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJCisJaWYgKHNuZF9pbnRlbDh4MG1fY29kZWNfc2VtYXBob3JlKGNoaXAsIGFjOTctPm51bSkgPCAwKSB7CisJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKKwkJCXNuZF9wcmludGsoImNvZGVjX3dyaXRlICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJfQorCWlhcHV0d29yZChjaGlwLCByZWcgKyBhYzk3LT5udW0gKiAweDgwLCB2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2ludGVsOHgwX2NvZGVjX3JlYWQoYWM5N190ICphYzk3LAorCQkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCByZXM7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWlmIChzbmRfaW50ZWw4eDBtX2NvZGVjX3NlbWFwaG9yZShjaGlwLCBhYzk3LT5udW0pIDwgMCkgeworCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCisJCQlzbmRfcHJpbnRrKCJjb2RlY19yZWFkICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCXJlcyA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCQlyZXMgPSBpYWdldHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCk7CisJCWlmICgodG1wID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKSAmIElDSF9SQ1MpIHsKKwkJCS8qIHJlc2V0IFJDUyBhbmQgcHJlc2VydmUgb3RoZXIgUi9XQyBiaXRzICovCisJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgdG1wICYgfihJQ0hfU1JJfElDSF9QUkl8SUNIX1RSSXxJQ0hfR1NDSSkpOworCQkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQorCQkJCXNuZF9wcmludGsoImNvZGVjX3JlYWQgJWQ6IHJlYWQgdGltZW91dCBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJcmVzID0gMHhmZmZmOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKKworLyoKKyAqIERNQSBJL08KKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoaW50ZWw4eDBfdCAqY2hpcCwgaWNoZGV2X3QgKmljaGRldikgCit7CisJaW50IGlkeDsKKwl1MzIgKmJkYmFyID0gaWNoZGV2LT5iZGJhcjsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSBpY2hkZXYtPnJlZ19vZmZzZXQ7CisKKwlpcHV0ZHdvcmQoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0JEQkFSLCBpY2hkZXYtPmJkYmFyX2FkZHIpOworCWlmIChpY2hkZXYtPnNpemUgPT0gaWNoZGV2LT5mcmFnc2l6ZSkgeworCQlpY2hkZXYtPmFja19yZWxvYWQgPSBpY2hkZXYtPmFjayA9IDI7CisJCWljaGRldi0+ZnJhZ3NpemUxID0gaWNoZGV2LT5mcmFnc2l6ZSA+PiAxOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IChJQ0hfUkVHX0xWSV9NQVNLICsgMSkgKiAyOyBpZHggKz0gNCkgeworCQkJYmRiYXJbaWR4ICsgMF0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYpOworCQkJYmRiYXJbaWR4ICsgMV0gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKwkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEgPj4gY2hpcC0+cGNtX3Bvc19zaGlmdCk7CisJCQliZGJhcltpZHggKyAyXSA9IGNwdV90b19sZTMyKGljaGRldi0+cGh5c2J1ZiArIChpY2hkZXYtPnNpemUgPj4gMSkpOworCQkJYmRiYXJbaWR4ICsgM10gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKwkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEgPj4gY2hpcC0+cGNtX3Bvc19zaGlmdCk7CisJCX0KKwkJaWNoZGV2LT5mcmFncyA9IDI7CisJfSBlbHNlIHsKKwkJaWNoZGV2LT5hY2tfcmVsb2FkID0gaWNoZGV2LT5hY2sgPSAxOworCQlpY2hkZXYtPmZyYWdzaXplMSA9IGljaGRldi0+ZnJhZ3NpemU7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgKElDSF9SRUdfTFZJX01BU0sgKyAxKSAqIDI7IGlkeCArPSAyKSB7CisJCQliZGJhcltpZHggKyAwXSA9IGNwdV90b19sZTMyKGljaGRldi0+cGh5c2J1ZiArICgoKGlkeCA+PiAxKSAqIGljaGRldi0+ZnJhZ3NpemUpICUgaWNoZGV2LT5zaXplKSk7CisJCQliZGJhcltpZHggKyAxXSA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDAgfCAvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworCQkJCQkJICAgICBpY2hkZXYtPmZyYWdzaXplID4+IGNoaXAtPnBjbV9wb3Nfc2hpZnQpOworCQkJLy8gcHJpbnRrKCJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwgaWR4ICsgMCwgYmRiYXJbaWR4ICsgMF0sIGJkYmFyW2lkeCArIDFdKTsKKwkJfQorCQlpY2hkZXYtPmZyYWdzID0gaWNoZGV2LT5zaXplIC8gaWNoZGV2LT5mcmFnc2l6ZTsKKwl9CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0xWSSwgaWNoZGV2LT5sdmkgPSBJQ0hfUkVHX0xWSV9NQVNLKTsKKwlpY2hkZXYtPmNpdiA9IDA7CisJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NJViwgMCk7CisJaWNoZGV2LT5sdmlfZnJhZyA9IElDSF9SRUdfTFZJX01BU0sgJSBpY2hkZXYtPmZyYWdzOworCWljaGRldi0+cG9zaXRpb24gPSAwOworI2lmIDAKKwlwcmludGsoImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwkJCWljaGRldi0+bHZpX2ZyYWcsIGljaGRldi0+ZnJhZ3MsIGljaGRldi0+ZnJhZ3NpemUsIGljaGRldi0+ZnJhZ3NpemUxKTsKKyNlbmRpZgorCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgaWNoZGV2LT5yb2ZmX3NyLCBJQ0hfRklGT0UgfCBJQ0hfQkNJUyB8IElDSF9MVkJDSSk7Cit9CisKKy8qCisgKiAgSW50ZXJydXB0IGhhbmRsZXIKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ludGVsOHgwX3VwZGF0ZShpbnRlbDh4MF90ICpjaGlwLCBpY2hkZXZfdCAqaWNoZGV2KQoreworCXVuc2lnbmVkIGxvbmcgcG9ydCA9IGljaGRldi0+cmVnX29mZnNldDsKKwlpbnQgY2l2LCBpLCBzdGVwOworCWludCBhY2sgPSAwOworCisJY2l2ID0gaWdldGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NJVik7CisJaWYgKGNpdiA9PSBpY2hkZXYtPmNpdikgeworCQkvLyBzbmRfcHJpbnRkKCJjaXYgc2FtZSAlZFxuIiwgY2l2KTsKKwkJc3RlcCA9IDE7CisJCWljaGRldi0+Y2l2Kys7CisJCWljaGRldi0+Y2l2ICY9IElDSF9SRUdfTFZJX01BU0s7CisJfSBlbHNlIHsKKwkJc3RlcCA9IGNpdiAtIGljaGRldi0+Y2l2OworCQlpZiAoc3RlcCA8IDApCisJCQlzdGVwICs9IElDSF9SRUdfTFZJX01BU0sgKyAxOworCQkvLyBpZiAoc3RlcCAhPSAxKQorCQkvLwlzbmRfcHJpbnRkKCJzdGVwID0gJWQsICVkIC0+ICVkXG4iLCBzdGVwLCBpY2hkZXYtPmNpdiwgY2l2KTsKKwkJaWNoZGV2LT5jaXYgPSBjaXY7CisJfQorCisJaWNoZGV2LT5wb3NpdGlvbiArPSBzdGVwICogaWNoZGV2LT5mcmFnc2l6ZTE7CisJaWNoZGV2LT5wb3NpdGlvbiAlPSBpY2hkZXYtPnNpemU7CisJaWNoZGV2LT5sdmkgKz0gc3RlcDsKKwlpY2hkZXYtPmx2aSAmPSBJQ0hfUkVHX0xWSV9NQVNLOworCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9MVkksIGljaGRldi0+bHZpKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3RlcDsgaSsrKSB7CisJCWljaGRldi0+bHZpX2ZyYWcrKzsKKwkJaWNoZGV2LT5sdmlfZnJhZyAlPSBpY2hkZXYtPmZyYWdzOworCQlpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYgKyBpY2hkZXYtPmx2aV9mcmFnICogaWNoZGV2LT5mcmFnc2l6ZTEpOworCS8vIHByaW50aygibmV3OiBiZGJhclslaV0gPSAweCV4IFsweCV4XSwgcHJlZmV0Y2ggPSAlaSwgYWxsID0gMHgleCwgMHgleFxuIiwgaWNoZGV2LT5sdmkgKiAyLCBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0sIGljaGRldi0+YmRiYXJbaWNoZGV2LT5sdmkgKiAyICsgMV0sIGluYihJQ0hfUkVHX09GRl9QSVYgKyBwb3J0KSwgaW5sKHBvcnQgKyA0KSwgaW5iKHBvcnQgKyBJQ0hfUkVHX09GRl9DUikpOworCQlpZiAoLS1pY2hkZXYtPmFjayA9PSAwKSB7CisJCQlpY2hkZXYtPmFjayA9IGljaGRldi0+YWNrX3JlbG9hZDsKKwkJCWFjayA9IDE7CisJCX0KKwl9CisJaWYgKGFjayAmJiBpY2hkZXYtPnN1YnN0cmVhbSkgeworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGljaGRldi0+c3Vic3RyZWFtKTsKKwkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJfQorCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBpY2hkZXYtPnJvZmZfc3IsIElDSF9GSUZPRSB8IElDSF9CQ0lTIHwgSUNIX0xWQkNJKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gZGV2X2lkOworCWljaGRldl90ICppY2hkZXY7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXN0YXR1cyA9IGlnZXRkd29yZChjaGlwLCBjaGlwLT5pbnRfc3RhX3JlZyk7CisJaWYgKHN0YXR1cyA9PSAweGZmZmZmZmZmKSB7IC8qIHdlIGFyZSBub3QgeWV0IHJlc3VtZWQgKi8KKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlpZiAoKHN0YXR1cyAmIGNoaXAtPmludF9zdGFfbWFzaykgPT0gMCkgeworCQlpZiAoc3RhdHVzKQorCQkJaXB1dGR3b3JkKGNoaXAsIGNoaXAtPmludF9zdGFfcmVnLCBzdGF0dXMpOworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKSB7CisJCWljaGRldiA9ICZjaGlwLT5pY2hkW2ldOworCQlpZiAoc3RhdHVzICYgaWNoZGV2LT5pbnRfc3RhX21hc2spCisJCQlzbmRfaW50ZWw4eDBfdXBkYXRlKGNoaXAsIGljaGRldik7CisJfQorCisJLyogYWNrIHRoZW0gKi8KKwlpcHV0ZHdvcmQoY2hpcCwgY2hpcC0+aW50X3N0YV9yZWcsIHN0YXR1cyAmIGNoaXAtPmludF9zdGFfbWFzayk7CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgUENNIHBhcnQKKyAqLworCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MF9wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpY2hkZXZfdCAqaWNoZGV2ID0gZ2V0X2ljaGRldihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSBpY2hkZXYtPnJlZ19vZmZzZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCXZhbCA9IElDSF9JT0NFIHwgSUNIX1NUQVJUQk07CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJdmFsID0gSUNIX0lPQ0U7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJdmFsID0gSUNIX0lPQ0UgfCBJQ0hfU1RBUlRCTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgdmFsKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUT1ApIHsKKwkJLyogd2FpdCB1bnRpbCBETUEgc3RvcHBlZCAqLworCQl3aGlsZSAoIShpZ2V0Ynl0ZShjaGlwLCBwb3J0ICsgaWNoZGV2LT5yb2ZmX3NyKSAmIElDSF9EQ0gpKSA7CisJCS8qIHJlc2V0IHdob2xlIERNQSB0aGluZ3MgKi8KKwkJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0NSLCBJQ0hfUkVTRVRSRUdTKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWljaGRldl90ICppY2hkZXYgPSBnZXRfaWNoZGV2KHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjEsIHB0cjsKKworCXB0cjEgPSBpZ2V0d29yZChjaGlwLCBpY2hkZXYtPnJlZ19vZmZzZXQgKyBpY2hkZXYtPnJvZmZfcGljYikgPDwgY2hpcC0+cGNtX3Bvc19zaGlmdDsKKwlpZiAocHRyMSAhPSAwKQorCQlwdHIgPSBpY2hkZXYtPmZyYWdzaXplMSAtIHB0cjE7CisJZWxzZQorCQlwdHIgPSAwOworCXB0ciArPSBpY2hkZXYtPnBvc2l0aW9uOworCWlmIChwdHIgPj0gaWNoZGV2LT5zaXplKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3BjbV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwkvKiBob29rIG9mZi9vbiBvbiBzdGFydC9zdG9wICovCisJLyogTW92ZWQgdGhpcyB0byBtaXhlciBjb250cm9sICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gc25kX2ludGVsOHgwX3BjbV90cmlnZ2VyKHN1YnN0cmVhbSxjbWQpOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlbDh4MG1fcGNtX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWljaGRldl90ICppY2hkZXYgPSBnZXRfaWNoZGV2KHN1YnN0cmVhbSk7CisKKwlpY2hkZXYtPnBoeXNidWYgPSBydW50aW1lLT5kbWFfYWRkcjsKKwlpY2hkZXYtPnNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlpY2hkZXYtPmZyYWdzaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJc25kX2FjOTdfd3JpdGUoaWNoZGV2LT5hYzk3LCBBQzk3X0xJTkUxX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXNuZF9hYzk3X3dyaXRlKGljaGRldi0+YWM5NywgQUM5N19MSU5FMV9MRVZFTCwgMCk7CisJc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoY2hpcCwgaWNoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfaW50ZWw4eDBtX3N0cmVhbSA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFX0tOT1QsCisJLnJhdGVfbWluID0JCTgwMDAsCisJLnJhdGVfbWF4ID0JCTE2MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTEsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQk2NCAqIDEwMjQsCisJLnBlcmlvZF9ieXRlc19taW4gPQkzMiwKKwkucGVyaW9kX2J5dGVzX21heCA9CTY0ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9wY21fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpY2hkZXZfdCAqaWNoZGV2KQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsgODAwMCwgIDk2MDAsIDEyMDAwLCAxNjAwMCB9OworCXN0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzID0geworCQkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzKSwKKwkJLmxpc3QgPSByYXRlcywKKwkJLm1hc2sgPSAwLAorCX07CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWljaGRldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX2ludGVsOHgwbV9zdHJlYW07CisJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsICZod19jb25zdHJhaW50c19yYXRlcyk7CisJaWYgKCBlcnIgPCAwICkKKwkJcmV0dXJuIGVycjsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBpY2hkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXJldHVybiBzbmRfaW50ZWw4eDBtX3BjbV9vcGVuKHN1YnN0cmVhbSwgJmNoaXAtPmljaGRbSUNIRF9NRE1PVVRdKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbSUNIRF9NRE1PVVRdLnN1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcmV0dXJuIHNuZF9pbnRlbDh4MG1fcGNtX29wZW4oc3Vic3RyZWFtLCAmY2hpcC0+aWNoZFtJQ0hEX01ETUlOXSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwbV9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNoaXAtPmljaGRbSUNIRF9NRE1JTl0uc3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBtX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaW50ZWw4eDBtX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsOHgwbV9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsOHgwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pbnRlbDh4MF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsOHgwbV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MG1fcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaW50ZWw4eDBtX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbDh4MG1fY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CXNuZF9pbnRlbDh4MG1fY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsOHgwX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9pbnRlbDh4MF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsOHgwbV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbDh4MG1fcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWw4eDBfcGNtX3BvaW50ZXIsCit9OworCisKK3N0cnVjdCBpY2hfcGNtX3RhYmxlIHsKKwljaGFyICpzdWZmaXg7CisJc25kX3BjbV9vcHNfdCAqcGxheWJhY2tfb3BzOworCXNuZF9wY21fb3BzX3QgKmNhcHR1cmVfb3BzOworCXNpemVfdCBwcmVhbGxvY19zaXplOworCXNpemVfdCBwcmVhbGxvY19tYXhfc2l6ZTsKKwlpbnQgYWM5N19pZHg7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBfcGNtMShpbnRlbDh4MF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3QgaWNoX3BjbV90YWJsZSAqcmVjKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisJY2hhciBuYW1lWzMyXTsKKworCWlmIChyZWMtPnN1ZmZpeCkKKwkJc3ByaW50ZihuYW1lLCAiSW50ZWwgSUNIIC0gJXMiLCByZWMtPnN1ZmZpeCk7CisJZWxzZQorCQlzdHJjcHkobmFtZSwgIkludGVsIElDSCIpOworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIGRldmljZSwKKwkJCSAgcmVjLT5wbGF5YmFja19vcHMgPyAxIDogMCwKKwkJCSAgcmVjLT5jYXB0dXJlX29wcyA/IDEgOiAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChyZWMtPnBsYXliYWNrX29wcykKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgcmVjLT5wbGF5YmFja19vcHMpOworCWlmIChyZWMtPmNhcHR1cmVfb3BzKQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIHJlYy0+Y2FwdHVyZV9vcHMpOworCisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJaWYgKHJlYy0+c3VmZml4KQorCQlzcHJpbnRmKHBjbS0+bmFtZSwgIiVzIC0gJXMiLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUsIHJlYy0+c3VmZml4KTsKKwllbHNlCisJCXN0cmNweShwY20tPm5hbWUsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSk7CisJY2hpcC0+cGNtW2RldmljZV0gPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCSAgICAgIHJlYy0+cHJlYWxsb2Nfc2l6ZSwKKwkJCQkJICAgICAgcmVjLT5wcmVhbGxvY19tYXhfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpY2hfcGNtX3RhYmxlIGludGVsX3BjbXNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnN1ZmZpeCA9ICJNb2RlbSIsCisJCS5wbGF5YmFja19vcHMgPSAmc25kX2ludGVsOHgwbV9wbGF5YmFja19vcHMsCisJCS5jYXB0dXJlX29wcyA9ICZzbmRfaW50ZWw4eDBtX2NhcHR1cmVfb3BzLAorCQkucHJlYWxsb2Nfc2l6ZSA9IDMyICogMTAyNCwKKwkJLnByZWFsbG9jX21heF9zaXplID0gNjQgKiAxMDI0LAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBfcGNtKGludGVsOHgwX3QgKmNoaXApCit7CisJaW50IGksIHRibHNpemUsIGRldmljZSwgZXJyOworCXN0cnVjdCBpY2hfcGNtX3RhYmxlICp0YmwsICpyZWM7CisKKyNpZiAxCisJdGJsID0gaW50ZWxfcGNtczsKKwl0YmxzaXplID0gMTsKKyNlbHNlCisJc3dpdGNoIChjaGlwLT5kZXZpY2VfdHlwZSkgeworCWNhc2UgREVWSUNFX05GT1JDRToKKwkJdGJsID0gbmZvcmNlX3BjbXM7CisJCXRibHNpemUgPSBBUlJBWV9TSVpFKG5mb3JjZV9wY21zKTsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfQUxJOgorCQl0YmwgPSBhbGlfcGNtczsKKwkJdGJsc2l6ZSA9IEFSUkFZX1NJWkUoYWxpX3BjbXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0YmwgPSBpbnRlbF9wY21zOworCQl0YmxzaXplID0gMjsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJZGV2aWNlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdGJsc2l6ZTsgaSsrKSB7CisJCXJlYyA9IHRibCArIGk7CisJCWlmIChpID4gMCAmJiByZWMtPmFjOTdfaWR4KSB7CisJCQkvKiBhY3RpdmF0ZSBQQ00gb25seSB3aGVuIGFzc29jaWF0ZWQgQUMnOTcgY29kZWMgKi8KKwkJCWlmICghIGNoaXAtPmljaGRbcmVjLT5hYzk3X2lkeF0uYWM5NykKKwkJCQljb250aW51ZTsKKwkJfQorCQllcnIgPSBzbmRfaW50ZWw4eDBfcGNtMShjaGlwLCBkZXZpY2UsIHJlYyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZGV2aWNlKys7CisJfQorCisJY2hpcC0+cGNtX2RldnMgPSBkZXZpY2U7CisJcmV0dXJuIDA7Cit9CisJCisKKy8qCisgKiAgTWl4ZXIgcGFydAorICovCisKK3N0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MF9taXhlcl9mcmVlX2FjOTdfYnVzKGFjOTdfYnVzX3QgKmJ1cykKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+YWM5N19idXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzbmRfaW50ZWw4eDBfbWl4ZXJfZnJlZV9hYzk3KGFjOTdfdCAqYWM5NykKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPmFjOTcgPSBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9taXhlcihpbnRlbDh4MF90ICpjaGlwLCBpbnQgYWM5N19jbG9jaykKK3sKKwlhYzk3X2J1c190ICpwYnVzOworCWFjOTdfdGVtcGxhdGVfdCBhYzk3OworCWFjOTdfdCAqeDk3OworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGdsb2Jfc3RhID0gMDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCS53cml0ZSA9IHNuZF9pbnRlbDh4MF9jb2RlY193cml0ZSwKKwkJLnJlYWQgPSBzbmRfaW50ZWw4eDBfY29kZWNfcmVhZCwKKwl9OworCisJY2hpcC0+aW5fYWM5N19pbml0ID0gMTsKKwkKKwltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOworCWFjOTcucHJpdmF0ZV9mcmVlID0gc25kX2ludGVsOHgwX21peGVyX2ZyZWVfYWM5NzsKKwlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU87CisKKwlnbG9iX3N0YSA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIGNoaXAsICZwYnVzKSkgPCAwKQorCQlnb3RvIF9fZXJyOworCXBidXMtPnByaXZhdGVfZnJlZSA9IHNuZF9pbnRlbDh4MF9taXhlcl9mcmVlX2FjOTdfYnVzOworCXBidXMtPnNoYXJlZF90eXBlID0gQUM5N19TSEFSRURfVFlQRV9JQ0g7CS8qIHNoYXJlZCB3aXRoIGF1ZGlvIGRyaXZlciAqLworCWlmIChhYzk3X2Nsb2NrID49IDgwMDAgJiYgYWM5N19jbG9jayA8PSA0ODAwMCkKKwkJcGJ1cy0+Y2xvY2sgPSBhYzk3X2Nsb2NrOworCWNoaXAtPmFjOTdfYnVzID0gcGJ1czsKKworCWFjOTcucGNpID0gY2hpcC0+cGNpOworCWFjOTcubnVtID0gZ2xvYl9zdGEgJiBJQ0hfU0NSID8gMSA6IDA7CisJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJng5NykpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjb2RlYyAjJWRcbiIsIGFjOTcubnVtKTsKKwkJaWYgKGFjOTcubnVtID09IDApCisJCQlnb3RvIF9fZXJyOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5hYzk3ID0geDk3OworCWlmKGFjOTdfaXNfbW9kZW0oeDk3KSAmJiAhY2hpcC0+aWNoZFtJQ0hEX01ETUlOXS5hYzk3KSB7CisJCWNoaXAtPmljaGRbSUNIRF9NRE1JTl0uYWM5NyA9IHg5NzsKKwkJY2hpcC0+aWNoZFtJQ0hEX01ETU9VVF0uYWM5NyA9IHg5NzsKKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9pbnRlbDh4MG1fbWl4ZXJfc3dpdGNoZXMpOyBpZHgrKykgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ludGVsOHgwbV9taXhlcl9zd2l0Y2hlc1tpZHhdLCBjaGlwKSkpIDwgMCkKKwkJCWdvdG8gX19lcnI7CisJfQorCisJY2hpcC0+aW5fYWM5N19pbml0ID0gMDsKKwlyZXR1cm4gMDsKKworIF9fZXJyOgorCS8qIGNsZWFyIHRoZSBjb2xkLXJlc2V0IGJpdCBmb3IgdGhlIG5leHQgY2hhbmNlICovCisJaWYgKGNoaXAtPmRldmljZV90eXBlICE9IERFVklDRV9BTEkpCisJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpLCBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkgJiB+SUNIX0FDOTdDT0xEKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKgorICovCisKKyNkZWZpbmUgZG9fZGVsYXkoY2hpcCkgZG8ge1wKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7XAorCXNjaGVkdWxlX3RpbWVvdXQoMSk7XAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBtX2ljaF9jaGlwX2luaXQoaW50ZWw4eDBfdCAqY2hpcCwgaW50IHByb2JpbmcpCit7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1bnNpZ25lZCBpbnQgY250LCBzdGF0dXMsIG5zdGF0dXM7CisJCisJLyogcHV0IGxvZ2ljIHRvIHJpZ2h0IHN0YXRlICovCisJLyogZmlyc3QgY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwlzdGF0dXMgPSBJQ0hfUkNTIHwgSUNIX01JSU5UIHwgSUNIX01PSU5UOworCWNudCA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKTsKKwlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgY250ICYgc3RhdHVzKTsKKworCS8qIEFDTGluayBvbiwgMiBjaGFubmVscyAqLworCWNudCA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpKTsKKwljbnQgJj0gfihJQ0hfQUNMSU5LKTsKKwkvKiBmaW5pc2ggY29sZCBvciBkbyB3YXJtIHJlc2V0ICovCisJY250IHw9IChjbnQgJiBJQ0hfQUM5N0NPTEQpID09IDAgPyBJQ0hfQUM5N0NPTEQgOiBJQ0hfQUM5N1dBUk07CisJaXB1dGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCksIGNudCk7CisJZW5kX3RpbWUgPSAoamlmZmllcyArIChIWiAvIDQpKSArIDE7CisJZG8geworCQlpZiAoKGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpKSAmIElDSF9BQzk3V0FSTSkgPT0gMCkKKwkJCWdvdG8gX19vazsKKwkJZG9fZGVsYXkoY2hpcCk7CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOworCXNuZF9wcmludGsoIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKKwlyZXR1cm4gLUVJTzsKKworICAgICAgX19vazoKKwlpZiAocHJvYmluZykgeworCQkvKiB3YWl0IGZvciBhbnkgY29kZWMgcmVhZHkgc3RhdHVzLgorCQkgKiBPbmNlIGl0IGJlY29tZXMgcmVhZHkgaXQgc2hvdWxkIHJlbWFpbiByZWFkeQorCQkgKiBhcyBsb25nIGFzIHdlIGRvIG5vdCBkaXNhYmxlIHRoZSBhYzk3IGxpbmsuCisJCSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJZG8geworCQkJc3RhdHVzID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgKElDSF9QQ1IgfCBJQ0hfU0NSIHwgSUNIX1RDUik7CisJCQlpZiAoc3RhdHVzKQorCQkJCWJyZWFrOworCQkJZG9fZGVsYXkoY2hpcCk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwkJaWYgKCEgc3RhdHVzKSB7CisJCQkvKiBubyBjb2RlYyBpcyBmb3VuZCAqLworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIHVwIHRvIHR3byBjb2RlY3MgKG1vZGVtIGNhbm5vdCBiZSB0ZXJ0aWFyeSB3aXRoIElDSDQpICovCisJCW5zdGF0dXMgPSBJQ0hfUENSIHwgSUNIX1NDUjsKKworCQkvKiB3YWl0IGZvciBvdGhlciBjb2RlY3MgcmVhZHkgc3RhdHVzLiAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWiAvIDQ7CisJCXdoaWxlIChzdGF0dXMgIT0gbnN0YXR1cyAmJiB0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSkgeworCQkJZG9fZGVsYXkoY2hpcCk7CisJCQlzdGF0dXMgfD0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgbnN0YXR1czsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogcmVzdW1lIHBoYXNlICovCisJCXN0YXR1cyA9IDA7CisJCWlmIChjaGlwLT5hYzk3KQorCQkJc3RhdHVzIHw9IGdldF9pY2hfY29kZWNfYml0KGNoaXAsIGNoaXAtPmFjOTctPm51bSk7CisJCS8qIHdhaXQgdW50aWwgYWxsIHRoZSBwcm9iZWQgY29kZWNzIGFyZSByZWFkeSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJZG8geworCQkJbnN0YXR1cyA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSAmIChJQ0hfUENSIHwgSUNIX1NDUiB8IElDSF9UQ1IpOworCQkJaWYgKHN0YXR1cyA9PSBuc3RhdHVzKQorCQkJCWJyZWFrOworCQkJZG9fZGVsYXkoY2hpcCk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwl9CisKKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX1NJUykgeworCQkvKiB1bm11dGUgdGhlIG91dHB1dCBvbiBTSVM3MDEyICovCisJCWlwdXR3b3JkKGNoaXAsIDB4NGMsIGlnZXR3b3JkKGNoaXAsIDB4NGMpIHwgMSk7CisJfQorCisgICAgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2NoaXBfaW5pdChpbnRlbDh4MF90ICpjaGlwLCBpbnQgcHJvYmluZykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCQorCWlmICgoZXJyID0gc25kX2ludGVsOHgwbV9pY2hfY2hpcF9pbml0KGNoaXAsIHByb2JpbmcpKSA8IDApCisJCXJldHVybiBlcnI7CisJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0Ynl0ZShjaGlwLCBJQ0hfUkVHX09GRl9DUiArIGNoaXAtPmljaGRbaV0ucmVnX29mZnNldCwgMHgwMCk7CisJLyogcmVzZXQgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+YmRiYXJzX2NvdW50OyBpKyspCisJCWlwdXRieXRlKGNoaXAsIElDSF9SRUdfT0ZGX0NSICsgY2hpcC0+aWNoZFtpXS5yZWdfb2Zmc2V0LCBJQ0hfUkVTRVRSRUdTKTsKKwkvKiBpbml0aWFsaXplIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3RzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0ZHdvcmQoY2hpcCwgSUNIX1JFR19PRkZfQkRCQVIgKyBjaGlwLT5pY2hkW2ldLnJlZ19vZmZzZXQsIGNoaXAtPmljaGRbaV0uYmRiYXJfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ludGVsOHgwX2ZyZWUoaW50ZWw4eDBfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjaGlwLT5pcnEgPCAwKQorCQlnb3RvIF9faHdfZW5kOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykKKwkJaXB1dGJ5dGUoY2hpcCwgSUNIX1JFR19PRkZfQ1IgKyBjaGlwLT5pY2hkW2ldLnJlZ19vZmZzZXQsIDB4MDApOworCS8qIHJlc2V0IGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQorCQlpcHV0Ynl0ZShjaGlwLCBJQ0hfUkVHX09GRl9DUiArIGNoaXAtPmljaGRbaV0ucmVnX29mZnNldCwgSUNIX1JFU0VUUkVHUyk7CisJLyogLS0tICovCisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisgICAgICBfX2h3X2VuZDoKKwlpZiAoY2hpcC0+YmRiYXJzLmFyZWEpCisJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YmRiYXJzKTsKKwlpZiAoY2hpcC0+cmVtYXBfYWRkcikKKwkJaW91bm1hcChjaGlwLT5yZW1hcF9hZGRyKTsKKwlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyKQorCQlpb3VubWFwKGNoaXAtPnJlbWFwX2JtYWRkcik7CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IGludGVsOHgwbV9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPnBjbV9kZXZzOyBpKyspCisJCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtW2ldKTsKKwlpZiAoY2hpcC0+YWM5NykKKwkJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbDh4MG1fcmVzdW1lKHNuZF9jYXJkX3QgKmNhcmQpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXBjaV9zZXRfbWFzdGVyKGNoaXAtPnBjaSk7CisJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKKwlpZiAoY2hpcC0+YWM5NykKKwkJc25kX2FjOTdfcmVzdW1lKGNoaXAtPmFjOTcpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MG1fcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKiBlbnRyeSwKKwkJCQkgICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlpbnRlbDh4MF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiSW50ZWw4eDBtXG5cbiIpOworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKQorCQlyZXR1cm47CisJdG1wID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkdsb2JhbCBjb250cm9sICAgICAgICA6IDB4JTA4eFxuIiwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJHbG9iYWwgc3RhdHVzICAgICAgICAgOiAweCUwOHhcbiIsIHRtcCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiQUMnOTcgY29kZWNzIHJlYWR5ICAgIDolcyVzJXMlc1xuIiwKKwkJCXRtcCAmIElDSF9QQ1IgPyAiIHByaW1hcnkiIDogIiIsCisJCQl0bXAgJiBJQ0hfU0NSID8gIiBzZWNvbmRhcnkiIDogIiIsCisJCQl0bXAgJiBJQ0hfVENSID8gIiB0ZXJ0aWFyeSIgOiAiIiwKKwkJCSh0bXAgJiAoSUNIX1BDUiB8IElDSF9TQ1IgfCBJQ0hfVENSKSkgPT0gMCA/ICIgbm9uZSIgOiAiIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBtX3Byb2NfaW5pdChpbnRlbDh4MF90ICogY2hpcCkKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJpbnRlbDh4MG0iLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHNuZF9pbnRlbDh4MG1fcHJvY19yZWFkKTsKK30KKworc3RhdGljIGludCBzbmRfaW50ZWw4eDBfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJaW50ZWw4eDBfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworfQorCitzdHJ1Y3QgaWNoX3JlZ19pbmZvIHsKKwl1bnNpZ25lZCBpbnQgaW50X3N0YV9tYXNrOworCXVuc2lnbmVkIGludCBvZmZzZXQ7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZWw4eDBtX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSB1bnNpZ25lZCBsb25nIGRldmljZV90eXBlLAorCQkJCQkgaW50ZWw4eDBfdCAqKiByX2ludGVsOHgwKQoreworCWludGVsOHgwX3QgKmNoaXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW50X3N0YV9tYXNrczsKKwlpY2hkZXZfdCAqaWNoZGV2OworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX2ludGVsOHgwX2Rldl9mcmVlLAorCX07CisJc3RhdGljIHN0cnVjdCBpY2hfcmVnX2luZm8gaW50ZWxfcmVnc1syXSA9IHsKKwkJeyBJQ0hfTUlJTlQsIDAgfSwKKwkJeyBJQ0hfTU9JTlQsIDB4MTAgfSwKKwl9OworCXN0cnVjdCBpY2hfcmVnX2luZm8gKnRibDsKKworCSpyX2ludGVsOHgwID0gTlVMTDsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+ZGV2aWNlX3R5cGUgPSBkZXZpY2VfdHlwZTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+aXJxID0gLTE7CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCBjYXJkLT5zaG9ydG5hbWUpKSA8IDApIHsKKwkJa2ZyZWUoY2hpcCk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKSB7CisJCS8qIEFMSTU0NTUgaGFzIG5vIGFjOTcgcmVnaW9uICovCisJCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCQlnb3RvIHBvcnRfaW5pdGVkOworCX0KKworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAyKSAmIElPUkVTT1VSQ0VfTUVNKSB7CS8qIElDSDQgYW5kIE5mb3JjZSAqLworCQljaGlwLT5tbWlvID0gMTsKKwkJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOworCQljaGlwLT5yZW1hcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmFkZHIsCisJCQkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMikpOworCQlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7CisJCQlzbmRfcHJpbnRrKCJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwl9CisJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDMpICYgSU9SRVNPVVJDRV9NRU0pIHsJLyogSUNINCAqLworCQljaGlwLT5ibV9tbWlvID0gMTsKKwkJY2hpcC0+Ym1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMyk7CisJCWNoaXAtPnJlbWFwX2JtYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5ibWFkZHIsCisJCQkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAzKSk7CisJCWlmIChjaGlwLT5yZW1hcF9ibWFkZHIgPT0gTlVMTCkgeworCQkJc25kX3ByaW50aygiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCX0KKworIHBvcnRfaW5pdGVkOgorCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBjYXJkLT5zaG9ydG5hbWUsICh2b2lkICopY2hpcCkpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJLyogaW5pdGlhbGl6ZSBvZmZzZXRzICovCisJY2hpcC0+YmRiYXJzX2NvdW50ID0gMjsKKwl0YmwgPSBpbnRlbF9yZWdzOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKSB7CisJCWljaGRldiA9ICZjaGlwLT5pY2hkW2ldOworCQlpY2hkZXYtPmljaGQgPSBpOworCQlpY2hkZXYtPnJlZ19vZmZzZXQgPSB0YmxbaV0ub2Zmc2V0OworCQlpY2hkZXYtPmludF9zdGFfbWFzayA9IHRibFtpXS5pbnRfc3RhX21hc2s7CisJCWlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfU0lTKSB7CisJCQkvKiBTaVMgNzAxMyBzd2FwcyB0aGUgcmVnaXN0ZXJzICovCisJCQlpY2hkZXYtPnJvZmZfc3IgPSBJQ0hfUkVHX09GRl9QSUNCOworCQkJaWNoZGV2LT5yb2ZmX3BpY2IgPSBJQ0hfUkVHX09GRl9TUjsKKwkJfSBlbHNlIHsKKwkJCWljaGRldi0+cm9mZl9zciA9IElDSF9SRUdfT0ZGX1NSOworCQkJaWNoZGV2LT5yb2ZmX3BpY2IgPSBJQ0hfUkVHX09GRl9QSUNCOworCQl9CisJCWlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKQorCQkJaWNoZGV2LT5hbGlfc2xvdCA9IChpY2hkZXYtPnJlZ19vZmZzZXQgLSAweDQwKSAvIDB4MTA7CisJfQorCS8qIFNJUzcwMTMgaGFuZGxlcyB0aGUgcGNtIGRhdGEgaW4gYnl0ZXMsIG90aGVycyBhcmUgaW4gd29yZHMgKi8KKwljaGlwLT5wY21fcG9zX3NoaWZ0ID0gKGRldmljZV90eXBlID09IERFVklDRV9TSVMpID8gMCA6IDE7CisKKwkvKiBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvciBsaXN0cyAqLworCS8qIHRoZSBzdGFydCBvZiBlYWNoIGxpc3RzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzICovCisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJY2hpcC0+YmRiYXJzX2NvdW50ICogc2l6ZW9mKHUzMikgKiBJQ0hfTUFYX0ZSQUdTICogMiwKKwkJCQkmY2hpcC0+YmRiYXJzKSA8IDApIHsKKwkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiB0YWJsZXMgbXVzdCBiZSBhbGlnbmVkIHRvIDggYnl0ZXMgaGVyZSwgYnV0IHRoZSBrZXJuZWwgcGFnZXMKKwkgICBhcmUgbXVjaCBiaWdnZXIsIHNvIHdlIGRvbid0IGNhcmUgKG9uIGkzODYpICovCisJaW50X3N0YV9tYXNrcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKSB7CisJCWljaGRldiA9ICZjaGlwLT5pY2hkW2ldOworCQlpY2hkZXYtPmJkYmFyID0gKCh1MzIgKiljaGlwLT5iZGJhcnMuYXJlYSkgKyAoaSAqIElDSF9NQVhfRlJBR1MgKiAyKTsKKwkJaWNoZGV2LT5iZGJhcl9hZGRyID0gY2hpcC0+YmRiYXJzLmFkZHIgKyAoaSAqIHNpemVvZih1MzIpICogSUNIX01BWF9GUkFHUyAqIDIpOworCQlpbnRfc3RhX21hc2tzIHw9IGljaGRldi0+aW50X3N0YV9tYXNrOworCX0KKwljaGlwLT5pbnRfc3RhX3JlZyA9IElDSF9SRUdfR0xPQl9TVEE7CisJY2hpcC0+aW50X3N0YV9tYXNrID0gaW50X3N0YV9tYXNrczsKKworCWlmICgoZXJyID0gc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAxKSkgPCAwKSB7CisJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYXJkX3NldF9wbV9jYWxsYmFjayhjYXJkLCBpbnRlbDh4MG1fc3VzcGVuZCwgaW50ZWw4eDBtX3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgeworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcl9pbnRlbDh4MCA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY29uc3QgY2hhciAqczsKK30gc2hvcnRuYW1lc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxXzYsICJJbnRlbCA4MjgwMUFBLUlDSCIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MDFfNiwgIkludGVsIDgyOTAxQUItSUNIMCIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV82LCAiSW50ZWwgODI4MDFCQS1JQ0gyIiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF80NDBNWF82LCAiSW50ZWwgNDQwTVgiIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDNfNiwgIkludGVsIDgyODAxQ0EtSUNIMyIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINF82LCAiSW50ZWwgODI4MDFEQi1JQ0g0IiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g1XzYsICJJbnRlbCBJQ0g1IiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzYsICJJbnRlbCBJQ0g2IiB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzYsICJJbnRlbCBJQ0g3IiB9LAorCXsgMHg3NDQ2LCAiQU1EIEFNRDc2OCIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0lfNzAxMywgIlNpUyBTSTcwMTMiIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1BfTU9ERU0sICJOVmlkaWEgbkZvcmNlIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMl9NT0RFTSwgIk5WaWRpYSBuRm9yY2UyIiB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMlNfTU9ERU0sICJOVmlkaWEgbkZvcmNlMnMiIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AzX01PREVNLCAiTlZpZGlhIG5Gb3JjZTMiIH0sCisjaWYgMAorCXsgMHg1NDU1LCAiQUxpIE01NDU1IiB9LAorCXsgMHg3NDZkLCAiQU1EIEFNRDgxMTEiIH0sCisjZW5kaWYKKwl7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MG1fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWludGVsOHgwX3QgKmNoaXA7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSUNILU1PREVNIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkludGVsIElDSCIpOworCWZvciAobmFtZSA9IHNob3J0bmFtZXM7IG5hbWUtPmlkOyBuYW1lKyspIHsKKwkJaWYgKHBjaS0+ZGV2aWNlID09IG5hbWUtPmlkKSB7CisJCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBuYW1lLT5zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXN0cmNhdChjYXJkLT5zaG9ydG5hbWUsIiBNb2RlbSIpOworCisJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBtX2NyZWF0ZShjYXJkLCBwY2ksIHBjaV9pZC0+ZHJpdmVyX2RhdGEsICZjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfaW50ZWw4eDBfbWl4ZXIoY2hpcCwgYWM5N19jbG9ja1tkZXZdKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX2ludGVsOHgwX3BjbShjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCQorCXNuZF9pbnRlbDh4MG1fcHJvY19pbml0KGNoaXApOworCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CisJZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfaW50ZWw4eDBtX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIkludGVsIElDSCBNb2RlbSIsCisJLmlkX3RhYmxlID0gc25kX2ludGVsOHgwbV9pZHMsCisJLnByb2JlID0gc25kX2ludGVsOHgwbV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2ludGVsOHgwbV9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9pbnRlbDh4MG1faW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfaW50ZWw4eDBtX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9pbnRlbDh4MG1faW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9pbnRlbDh4MG1fZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9NYWtlZmlsZSBiL3NvdW5kL3BjaS9rb3JnMTIxMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGM5ZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2tvcmcxMjEyL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIworIyBNYWtlZmlsZSBmb3IgQUxTQQorIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorIworCitzbmQta29yZzEyMTItb2JqcyA6PSBrb3JnMTIxMi5vCisKKyMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKK29iai0kKENPTkZJR19TTkRfS09SRzEyMTIpICs9IHNuZC1rb3JnMTIxMi5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTItZmlybXdhcmUuaCBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi1maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjViOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTItZmlybXdhcmUuaApAQCAtMCwwICsxLDk4NyBAQAorc3RhdGljIGNoYXIgZHNwQ29kZSBbXSA9IHsKKzB4MDEsMHhmZiwweDE4LDB4ZmYsMHhmNSwweGZmLDB4Y2YsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgyNiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDM4LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMywweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLDB4NjcsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4YzAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDBjLDB4ZmYsCisweDBjLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgzMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLDB4NDcsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MGEsMHhmZiwKKzB4ODIsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDdhLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLDB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDFjLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxYywweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxYywweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MWMsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4NzIsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4NWYsMHhmZiwweDAyLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHgwMiwweGZmLDB4OTEsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLAorMHgwMiwweGZmLDB4OTEsMHhmZiwweGZmLDB4ZmYsMHg5MCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4YzAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsCisweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHhmZiwweGZmLDB4NDcsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MTcsMHhmZiwweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDE3LDB4ZmYsCisweDgwLDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsMHg4NCwweGZmLDB4M2IsMHhmZiwweGZmLDB4ZmYsMHgwMiwweGZmLAorMHgwMiwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLDB4MDIsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4NGEsMHhmZiwKKzB4MDEsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MmIsMHhmZiwweDAxLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDJiLDB4ZmYsCisweDgwLDB4ZmYsMHg0MywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg4MiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLAorMHg4MSwweGZmLDB4NDMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4ODIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwKKzB4ODQsMHhmZiwweDQzLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDgyLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweDg1LDB4ZmYsMHg0MywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg4MywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhjMCwweGZmLAorMHg4MiwweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHg4MSwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4ODksMHhmZiwKKzB4ODgsMHhmZiwweDQzLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDgyLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg4YywweGZmLDB4NDMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwKKzB4ODMsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YzAsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDhhLDB4ZmYsMHg0MywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg4MiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwKKzB4OGUsMHhmZiwweDQzLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDgyLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg4MywweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4ODksMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MjYsMHhmZiwweDMwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDI2LDB4ZmYsMHgyMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHg4MCwweGZmLDB4NDEsMHhmZiwweGZmLDB4ZmYsMHgwMiwweGZmLDB4ZTAsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YjYsMHhmZiwweDYzLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDYyLDB4ZmYsMHg2YSwweGZmLDB4ZmYsMHhmZiwweGE2LDB4ZmYsMHg2MiwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhNiwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNiwweGZmLDB4MDAsMHhmZiwweDA5LDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwKKzB4NDAsMHhmZiwweDQxLDB4ZmYsMHhmZiwweGZmLDB4MDIsMHhmZiwweGUwLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGI2LDB4ZmYsMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg2MiwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhNiwweGZmLDB4NjIsMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTYsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTYsMHhmZiwweDA1LDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsCisweGUwLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhiYiwweGZmLAorMHgwMiwweGZmLDB4NDEsMHhmZiwweGZmLDB4ZmYsMHg4MiwweGZmLDB4ZTAsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4Y2IsMHhmZiwweDA1LDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweGUyLDB4ZmYsCisweGUwLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLAorMHgyMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MzAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjYsMHhmZiwweDAwLDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsCisweGUwLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4MywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg4MiwweGZmLAorMHg4MywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg5YiwweGZmLDB4MDMsMHhmZiwweDQxLDB4ZmYsMHhmZiwweGZmLDB4MDIsMHhmZiwKKzB4ZTAsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDgzLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGEyLDB4ZmYsCisweDgzLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGJiLDB4ZmYsMHgyMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDQsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDIxLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHg0MCwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMiwweGZmLDB4MzUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4ODUsMHhmZiwweDBhLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweGFlLDB4ZmYsCisweDAwLDB4ZmYsMHhhMCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4MzUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDIsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4MDUsMHhmZiwKKzB4MGEsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweDAwLDB4ZmYsMHhhMCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAzLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMiwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4MGIsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwKKzB4MDAsMHhmZiwweGEwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDAwLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsCisweDc4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDVmLDB4ZmYsMHgwMywweGZmLDB4MzUsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLAorMHg3OCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGZmLDB4NWIsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwweDgwLDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHhkZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLAorMHhmZSwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ODAsMHhmZiwweDQyLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweGMxLDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHgwMywweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLAorMHgwMCwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLDB4MDIsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4MjMsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDU5LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MTgsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MGMsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4ZTQsMHhmZiwweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsCisweDAwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwZCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDEwLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgyNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MTAsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwKKzB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDQ0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgyMiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg5MCwweGZmLAorMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ODQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDIyLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsCisweDBjLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDZmLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4NiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NzYsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4OWYsMHhmZiwKKzB4ODYsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwweDg2LDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDY0LDB4ZmYsCisweDYwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg3NCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg4MSwweGZmLAorMHgwMCwweGZmLDB4MzUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwKKzB4NjEsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4YWYsMHhmZiwweDc3LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGFmLDB4ZmYsCisweDYzLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsMHgwNSwweGZmLDB4MzUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg5MiwweGZmLDB4M2IsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweDY1LDB4ZmYsCisweDBmLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDZlLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDA1LDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDdmLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDAsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4NjUsMHhmZiwKKzB4MTAsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4MGUsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLAorMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4NzksMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDBlLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgxNSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg4NSwweGZmLDB4NzUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4OGYsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweDAyLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgxNiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4MGUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4NzUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4OGYsMHhmZiwweDgwLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0MCwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4MTEsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDg3LDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweDg2LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsMHg5MCwweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMiwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDg5LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHg4OSwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwweDg2LDB4ZmYsMHg5NywweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsCisweDAzLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHg2MywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweDgyLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDg2LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsMHg4MywweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLAorMHg3NSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4ODMsMHhmZiwweDQzLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ODcsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweDZhLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQwLDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg5MCwweGZmLAorMHg4MCwweGZmLDB4NDEsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwKKzB4OGIsMHhmZiwweDg3LDB4ZmYsMHhmZiwweGZmLDB4OTAsMHhmZiwweDdlLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHg1NSwweGZmLDB4MTMsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4YmUsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsCisweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLAorMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDhiLDB4ZmYsMHg5NywweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsMHgwNSwweGZmLDB4NDEsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg5MiwweGZmLDB4NDMsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTEsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDc4LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgxNSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg4NSwweGZmLAorMHg3NSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg4ZiwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwKKzB4NzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDUzLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGI0LDB4ZmYsCisweDcyLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHgzMCwweGZmLDB4MDIsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwKKzB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDE2LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsCisweDM4LDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDUwLDB4ZmYsMHg0OCwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDMwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MWUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MjAsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4Y2YsMHhmZiwweDE2LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4NmEsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwKKzB4NWMsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDE4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsCisweDY3LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZmYsMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHgwOCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4MTgsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweDY5LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDVkLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDJmLDB4ZmYsMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLAorMHg3OSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4NWMsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwKKzB4MTgsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweDVjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweDE4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4NWQsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MmYsMHhmZiwKKzB4MTgsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweDVjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweDE4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4NWMsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwKKzB4MTgsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweDVkLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDJmLDB4ZmYsCisweDE4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4NWMsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwKKzB4MTgsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweDVjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweDE4LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg1ZCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgyZiwweGZmLAorMHgxOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4NjYsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4NWMsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDE2LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsCisweDhiLDB4ZmYsMHg4NywweGZmLDB4ZmYsMHhmZiwweDYxLDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg4OSwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgyNiwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwKKzB4ODMsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA2LDB4ZmYsCisweDgzLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsMHgzOCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgxOSwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHg4NSwweGZmLDB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4NzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDA0LDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg4MywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwKKzB4MDgsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDg2LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg1MSwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4NDYsMHhmZiwKKzB4MDAsMHhmZiwweDA5LDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwweDhiLDB4ZmYsMHg5NywweGZmLDB4ZmYsMHhmZiwweDYxLDB4ZmYsCisweDgzLDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsMHg4MywweGZmLDB4OGIsMHhmZiwweGZmLDB4ZmYsMHhlMSwweGZmLAorMHg4NywweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4NmUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwKKzB4ODcsMHhmZiwweDM3LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDkyLDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsCisweDdmLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg3ZSwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLAorMHgyMywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2UsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ODMsMHhmZiwweDg3LDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweDg2LDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweDQxLDB4ZmYsCisweDZjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDJmLDB4ZmYsMHg4NywweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OGIsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4NDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweDU1LDB4ZmYsCisweDFiLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweGNlLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLAorMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwweDAwLDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsCisweDAwLDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhlMSwweGZmLAorMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDhiLDB4ZmYsMHg5YiwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDhiLDB4ZmYsMHg4NywweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsMHg3ZSwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0MCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4NTUsMHhmZiwweDFkLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDNlLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLAorMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsCisweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweDEzLDB4ZmYsMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHg4YiwweGZmLDB4OTcsMHhmZiwweGZmLDB4ZmYsMHg5MCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4OGIsMHhmZiwweDg3LDB4ZmYsMHhmZiwweGZmLDB4NjEsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDg5LDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDI2LDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwNiwweGZmLAorMHg4MywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwKKzB4ODMsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDUxLDB4ZmYsCisweDc5LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg3NCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhiNCwweGZmLAorMHgzOCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MWUsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4ZDUsMHhmZiwKKzB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwweDc4LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHgwNCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHgzMCwweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLDB4ODMsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwweDA4LDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHg4NiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTEsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4NDYsMHhmZiwweDAwLDB4ZmYsMHgwOSwweGZmLDB4ZmYsMHhmZiwweDA2LDB4ZmYsCisweDhiLDB4ZmYsMHg5NywweGZmLDB4ZmYsMHhmZiwweDYxLDB4ZmYsMHg4MywweGZmLDB4OGIsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLAorMHg4MywweGZmLDB4OGIsMHhmZiwweGZmLDB4ZmYsMHhlMSwweGZmLDB4ODcsMHhmZiwweDM3LDB4ZmYsMHhmZiwweGZmLDB4MDEsMHhmZiwKKzB4NmUsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwweDg3LDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDkyLDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsMHg3ZiwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgyMywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2UsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ODMsMHhmZiwweDg3LDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweDg2LDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweDQxLDB4ZmYsCisweDZjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDJmLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg4ZCwweGZmLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhjNSwweGZmLDB4MjAsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4YWUsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDg0LDB4ZmYsMHgwMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg4YSwweGZmLDB4NjQsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwKKzB4N2UsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsCisweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweGU1LDB4ZmYsMHgyMSwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHg1ZSwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDA4LDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxYywweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxYywweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MWMsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MWMsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAyLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg3OCwweGZmLDB4NDIsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLAorMHg0OCwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHhiMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDUwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg1MSwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsCisweDc4LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwYywweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg5MCwweGZmLAorMHgwYywweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg2ZiwweGZmLDB4MjAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDksMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsCisweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwOSwweGZmLAorMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwNiwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MjYsMHhmZiwKKzB4OTgsMHhmZiwweGNjLDB4ZmYsMHhmZiwweGZmLDB4MzcsMHhmZiwweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweGE1LDB4ZmYsCisweDI0LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHg3MywweGZmLAorMHgwOCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHgxNCwweGZmLDB4OTgsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDUwLDB4ZmYsMHhmZiwweGZmLDB4YzYsMHhmZiwweDY5LDB4ZmYsMHhjYywweGZmLDB4ZmYsMHhmZiwweDM3LDB4ZmYsCisweDAwLDB4ZmYsMHgwNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHhjNiwweGZmLAorMHg5OCwweGZmLDB4MjAsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4NzIsMHhmZiwKKzB4MDgsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwweDAwLDB4ZmYsMHg1MCwweGZmLDB4ZmYsMHhmZiwweGM2LDB4ZmYsCisweDY5LDB4ZmYsMHhjYywweGZmLDB4ZmYsMHhmZiwweDM3LDB4ZmYsMHgwMCwweGZmLDB4MDUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHhjNiwweGZmLDB4OTgsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4NzMsMHhmZiwweDA4LDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDE0LDB4ZmYsCisweDAwLDB4ZmYsMHg1MCwweGZmLDB4ZmYsMHhmZiwweGM2LDB4ZmYsMHg2OSwweGZmLDB4MjAsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MDUsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDU4LDB4ZmYsMHhmZiwweGZmLDB4YzYsMHhmZiwKKzB4MzAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsMHg0NywweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHg1OCwweGZmLAorMHgxMCwweGZmLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4NjYsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MjYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4OTQsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHg4MCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0OSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLDB4MTYsMHhmZiwweDBmLDB4ZmYsMHhmZiwweGZmLDB4MDIsMHhmZiwKKzB4NjYsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDM4LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGI0LDB4ZmYsCisweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsMHg0NywweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgwYSwweGZmLAorMHg4MiwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4N2EsMHhmZiwKKzB4N2EsMHhmZiwweDI2LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDEwLDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDM4LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGI0LDB4ZmYsMHgyNywweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhkMiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLDB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwweDEwLDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDI5LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDkyLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MWMsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MWMsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDFjLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDFjLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDA0LDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwNCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgwMCwweGZmLDB4MDQsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwZCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MTAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MzEsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4MTIsMHhmZiwweDMwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDA4LDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHg4OSwweGZmLAorMHg5MCwweGZmLDB4MzcsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDIsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MzQsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDU1LDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMCwweGZmLDB4MGUsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0ZSwweGZmLDB4YTcsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDE4LDB4ZmYsMHgwMCwweGZmLDB4MGUsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1ZSwweGZmLDB4YWYsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDQ4LDB4ZmYsMHgxMCwweGZmLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHg4NywweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MmUsMHhmZiwKKzB4MDIsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwweGUwLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLDB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLDB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDYzLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLAorMHg0OSwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwweDYzLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsMHg0OSwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwKKzB4NjMsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsCisweDQ5LDB4ZmYsMHg2YSwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLDB4NjMsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGEsMHhmZiwweDQ5LDB4ZmYsMHg2YSwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLAorMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGEsMHhmZiwKKzB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsCisweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGExLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgyOCwweGZmLAorMHgwMCwweGZmLDB4MGUsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwKKzB4YTcsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgzOCwweGZmLAorMHgwMCwweGZmLDB4MGUsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWUsMHhmZiwKKzB4YWYsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLDB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDYzLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLAorMHg0OSwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwweDYzLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsMHg0OSwweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwKKzB4NjMsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRhLDB4ZmYsCisweDQ5LDB4ZmYsMHg2YSwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLDB4NjMsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGEsMHhmZiwweDQ5LDB4ZmYsMHg2YSwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMCwweGZmLAorMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGEsMHhmZiwKKzB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDVhLDB4ZmYsCisweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsMHg2MywweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg0YSwweGZmLDB4NDksMHhmZiwweDZhLDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsCisweGZmLDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHg4NiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4MTAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MzIsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4NDIsMHhmZiwweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGU0LDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg0NCwweGZmLAorMHgwOCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ODksMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4OGEsMHhmZiwweDAwLDB4ZmYsMHgwZSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRlLDB4ZmYsMHhhNywweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4MTAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDM1LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGQyLDB4ZmYsCisweDAwLDB4ZmYsMHg0YywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwYiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLDB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDBhLDB4ZmYsMHg3YSwweGZmLDB4MjYsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgzNSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgyNCwweGZmLDB4MTAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MzMsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4YzUsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGMwLDB4ZmYsCisweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHg4ZCwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4MTAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDM0LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDg1LDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLAorMHg4ZCwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDBkLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwKKzB4ZmYsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweDkwLDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgxMCwweGZmLDB4MjcsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgzNywweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg0MiwweGZmLDB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDg5LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGIwLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHg4OSwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhjMCwweGZmLDB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwKKzB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDg5LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHg1MCwweGZmLAorMHg4OSwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwKKzB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDEwLDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgzOSwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgyMiwweGZmLAorMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgzOCwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHg4NCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgzMCwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDEsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4MzAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGU0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0MiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MGYsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ZDQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ3LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhjNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGI0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0OCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhlMCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MGYsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4YTQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDRhLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg5NCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NGMsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDg0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0ZCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhlMCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MGYsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NzQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDRmLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg2NCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NGYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBlLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MGUsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ZTQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ1LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDUwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwYSwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4M2QsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBhLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDE0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgzZiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MGEsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDNmLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwYSwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgzNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4M2YsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDBhLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDQ0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ0LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MjEsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwKKzB4MjUsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLDB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwweGU5LDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweGVkLDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0NCwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHhmMSwweGZmLDB4NDEsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLAorMHhmZiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4NDYsMHhmZiwweDg0LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweGY3LDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDc0LDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHg0NiwweGZmLDB4ODQsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwMiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgyMiwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYyLDB4ZmYsMHhmNywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4NDYsMHhmZiwweDg4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsCisweDAwLDB4ZmYsMHg1MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweGY3LDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4NDYsMHhmZiwweDg4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsCisweDAwLDB4ZmYsMHg1MCwweGZmLDB4ZmYsMHhmZiwweDIzLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYyLDB4ZmYsCisweGY3LDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLDB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4ZmYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweGZmLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGUyLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYyLDB4ZmYsMHhmNywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4MDMsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwKKzB4MGMsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4ZjcsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZjQsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzQsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwKKzB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhmMiwweGZmLAorMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhlMywweGZmLDB4ZjcsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZjQsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzQsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwKKzB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsCisweDQ2LDB4ZmYsMHg4NCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwNiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHhmZiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhlMCwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MjIsMHhmZiwKKzB4NjcsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NjIsMHhmZiwweGY3LDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDc0LDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHg0NiwweGZmLDB4ODQsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhlMCwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgzMiwweGZmLDB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4NzIsMHhmZiwKKzB4NjcsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NjcsMHhmZiwweGY3LDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGY0LDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDc0LDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQ4LDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDAwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHg0NiwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4MDMsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwYywweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHhmNywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4NDYsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGMwLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGM3LDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2NywweGZmLAorMHhmNywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLDB4NDYsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzQsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLDB4MDAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwweDQ2LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhlNywweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ2LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDY3LDB4ZmYsMHhmNywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLAorMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3NCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0NiwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsCisweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxNCwweGZmLDB4MTgsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4NTEsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4ODEsMHhmZiwweDkwLDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDgwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxNCwweGZmLDB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmEsMHhmZiwweDMwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDE2LDB4ZmYsMHgxMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg5MCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg3MSwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDksMHhmZiwKKzB4MGYsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhmZiwweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDg4LDB4ZmYsMHg2MywweGZmLDB4ZmYsMHhmZiwweDI3LDB4ZmYsMHhlOCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLAorMHg2MiwweGZmLDB4NjEsMHhmZiwweGZmLDB4ZmYsMHgyNywweGZmLDB4ODgsMHhmZiwweDJiLDB4ZmYsMHhmZiwweGZmLDB4OGIsMHhmZiwKKzB4ZTgsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwweDYyLDB4ZmYsMHg2MSwweGZmLDB4ZmYsMHhmZiwweDE3LDB4ZmYsCisweDg4LDB4ZmYsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHg4OSwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg5OCwweGZmLDB4MjAsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4ZWEsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4YWIsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGI4LDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsMHg2MiwweGZmLDB4MjEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgxMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NjIsMHhmZiwweDIxLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwweDkwLDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDgwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg1MSwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhlYiwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDUxLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDhkLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGFjLDB4ZmYsMHg4MiwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHg0NSwweGZmLAorMHg1NCwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHgyZSwweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhmZiwKKzB4NTQsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4MWUsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg1MSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHgwYywweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YTQsMHhmZiwKKzB4ZTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDUzLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGIzLDB4ZmYsCisweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgyNCwweGZmLAorMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4YmEsMHhmZiwKKzB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZiLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDE0LDB4ZmYsMHgxOCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg1NSwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHgyMSwweGZmLDB4OTAsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwKKzB4ODAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhlNCwweGZmLAorMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGZmLDB4MDgsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4NjAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ5LDB4ZmYsMHgyYSwweGZmLDB4ZmYsMHhmZiwweGVhLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRlLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhlZSwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg1YSwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDMxLDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhjOSwweGZmLDB4MmEsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGZmLAorMHg1NCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhkNSwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NWEsMHhmZiwweDgyLDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweGZmLDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHhjOSwweGZmLDB4MmEsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGZmLDB4NTYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4YjQsMHhmZiwKKzB4NTQsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwYywweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLDB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MTYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4NGYsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsMHhhMCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwKKzB4MTgsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDU3LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDkxLDB4ZmYsCisweDkwLDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHg4MCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwKKzB4YTAsMHhmZiwweDIzLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDZhLDB4ZmYsCisweDMwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxNiwweGZmLAorMHgxMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLDB4OTAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4NzEsMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDksMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHg4OCwweGZmLDB4NjMsMHhmZiwweGZmLDB4ZmYsMHgyNywweGZmLAorMHhlOCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLDB4NjIsMHhmZiwweDYxLDB4ZmYsMHhmZiwweGZmLDB4MjcsMHhmZiwKKzB4ODgsMHhmZiwweDJiLDB4ZmYsMHhmZiwweGZmLDB4OGIsMHhmZiwweGU4LDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsCisweDYyLDB4ZmYsMHg2MSwweGZmLDB4ZmYsMHhmZiwweDE3LDB4ZmYsMHg4OCwweGZmLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLAorMHg4OSwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4OTgsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4ZWEsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGFiLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGI4LDB4ZmYsMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHhjZiwweGZmLAorMHg2MiwweGZmLDB4MjEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MTAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4NjIsMHhmZiwweDIxLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsCisweDkwLDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsMHg4MCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg1NywweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZWIsMHhmZiwKKzB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZiwweDVjLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg1NywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGZmLAorMHg4ZCwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhhYywweGZmLDB4ODIsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4NDUsMHhmZiwKKzB4NWEsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwweGZmLDB4ZmYsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsCisweDVhLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDNlLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4NTcsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MWYsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MGMsMHhmZiwweDhkLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGE0LDB4ZmYsCisweGUwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg1OSwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhkMywweGZmLAorMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgzZiwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwweGEwLDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGJhLDB4ZmYsMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGZmLAorMHg1YywweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgzZiwweGZmLDB4MTEsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NmIsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwweDE4LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDViLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDYxLDB4ZmYsMHg5MCwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLAorMHg4MCwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDEsMHhmZiwweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGU0LDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsMHgwOCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg2MCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDksMHhmZiwweDJhLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGVlLDB4ZmYsCisweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZmYsMHg1ZSwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg1YiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4NzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDBkLDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweDA1LDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwOCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxNCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDUsMHhmZiwKKzB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsCisweDYwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg0OSwweGZmLDB4MmEsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZWUsMHhmZiwKKzB4MGMsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDA4LDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgxNCwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwKKzB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweDYwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ5LDB4ZmYsMHgyYSwweGZmLDB4ZmYsMHhmZiwweGVhLDB4ZmYsMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGZmLAorMHg4YiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhlZSwweGZmLDB4MGMsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweDc4LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDVlLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwOCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4NzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDVmLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDU0LDB4ZmYsCisweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsMHg5MCwweGZmLDB4ODAsMHhmZiwweGZmLDB4ZmYsMHhhOCwweGZmLAorMHgxMCwweGZmLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4OTAsMHhmZiwweDgwLDB4ZmYsMHhmZiwweGZmLDB4OTAsMHhmZiwKKzB4ODgsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGI2LDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZmYsMHhmMiwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHgwYSwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTQsMHhmZiwKKzB4ZTIsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDc0LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGUyLDB4ZmYsCisweDM4LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgyNCwweGZmLAorMHhlMiwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NzQsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZTIsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDBmLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZmYsCisweDkwLDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhlMiwweGZmLAorMHg4OCwweGZmLDB4MjcsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4OTgsMHhmZiwweDIwLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MTAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDcsMHhmZiwweGU4LDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGFjLDB4ZmYsMHhmMiwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHgwYSwweGZmLDB4MDEsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4ZTIsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDc0LDB4ZmYsMHgxOCwweGZmLDB4ZmYsMHhmZiwweGUyLDB4ZmYsCisweDM4LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhlMiwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NzQsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZTIsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweGQ0LDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg4NSwweGZmLAorMHhmZiwweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHg4OSwweGZmLDB4MDAsMHhmZiwweDA5LDB4ZmYsMHhmZiwweGZmLDB4MDEsMHhmZiwKKzB4ODksMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YjgsMHhmZiwweDAwLDB4ZmYsMHgwZSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRlLDB4ZmYsMHhhNywweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLDB4ODksMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YTgsMHhmZiwKKzB4MDAsMHhmZiwweDBlLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRlLDB4ZmYsCisweGE3LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLAorMHgwMCwweGZmLDB4MDksMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YjAsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAyLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgyNiwweGZmLDB4ODksMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4ZDgsMHhmZiwKKzB4MDAsMHhmZiwweDBlLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweDRlLDB4ZmYsCisweGE3LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLAorMHg4OSwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhjOCwweGZmLDB4MDAsMHhmZiwweDBlLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4NGUsMHhmZiwweGE3LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGEzLDB4ZmYsMHgwMCwweGZmLDB4MDksMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDIsMHhmZiwKKzB4MDEsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweDMwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ5LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLDB4MDAsMHhmZiwweDkxLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAxLDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweDAwLDB4ZmYsMHg5MSwweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwNywweGZmLDB4NDIsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLAorMHgwMywweGZmLDB4OTEsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MDIsMHhmZiwweDQyLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDkxLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweDA4LDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAzLDB4ZmYsMHg5MSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHgwMSwweGZmLDB4OTEsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDQsMHhmZiwweDkxLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDA0LDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0OSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHg2MiwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDAwLDB4ZmYsMHg5MSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweDAxLDB4ZmYsMHg0MiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg0OSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLAorMHg2MiwweGZmLDB4MWMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsCisweDA1LDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHg5MiwweGZmLDB4M2IsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLDB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwKKzB4MDAsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4NjUsMHhmZiwweDY1LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDllLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLAorMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDEsMHhmZiwweDQyLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDQ5LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsCisweDYyLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4ODEsMHhmZiwweGZmLDB4ZmYsMHhjMCwweGZmLAorMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MjEsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4NzEsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDQ5LDB4ZmYsMHg4MCwweGZmLDB4ZmYsMHhmZiwweDQ4LDB4ZmYsCisweDEwLDB4ZmYsMHgwZiwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHg2NiwweGZmLDB4MjMsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg3NCwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg1NCwweGZmLDB4ODYsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4YzAsMHhmZiwKKzB4NDksMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwweDYyLDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweDg2LDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDgwLDB4ZmYsMHgwMSwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHhlMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4OGEsMHhmZiwKKzB4NjcsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDg2LDB4ZmYsMHg4NywweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZmYsCisweDc1LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4ODIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDA4LDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDg2LDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweGIwLDB4ZmYsMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHhmNCwweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ODksMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweDg5LDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDQ0LDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsMHg4OSwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg1NSwweGZmLAorMHg2MCwweGZmLDB4MjYsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NDksMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwweDEwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweGEwLDB4ZmYsMHg4ZCwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLAorMHg4OSwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHgyNCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDEsMHhmZiwKKzB4ODksMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4MzUsMHhmZiwweDYwLDB4ZmYsMHgyNiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDQ5LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHhhMywweGZmLAorMHgxMCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4YTMsMHhmZiwKKzB4OGQsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweDIwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDA0LDB4ZmYsCisweDYwLDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4ZCwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg2YSwweGZmLAorMHgwYywweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MDgsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDg2LDB4ZmYsMHg4NywweGZmLDB4ZmYsMHhmZiwweGIwLDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMSwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLAorMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgzNSwweGZmLDB4ZmYsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ODksMHhmZiwKKzB4MDAsMHhmZiwweDA5LDB4ZmYsMHhmZiwweGZmLDB4MDEsMHhmZiwweDg3LDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDg4LDB4ZmYsMHgwMCwweGZmLDB4NzAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDcwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDg3LDB4ZmYsMHg5YiwweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsCisweDBjLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMSwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4NmEsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4OWUsMHhmZiwKKzB4NjcsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmZiwweDY5LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDY2LDB4ZmYsMHgxYywweGZmLDB4ZmYsMHhmZiwweDFmLDB4ZmYsMHgzOCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg2YSwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHg4NSwweGZmLDB4OGIsMHhmZiwweDgzLDB4ZmYsMHhmZiwweGZmLDB4NDAsMHhmZiwKKzB4NzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg4MiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NmEsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZjQsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg4NywweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLAorMHg4NiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NjAsMHhmZiwweDgyLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsCisweDg2LDB4ZmYsMHg4NywweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsMHgwMiwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgwOCwweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDAsMHhmZiwweDYwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDg5LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHg4OSwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4ODksMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4ODYsMHhmZiwweDk3LDB4ZmYsMHhmZiwweGZmLDB4OTAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDY0LDB4ZmYsMHgwMCwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHgzNSwweGZmLAorMHgwMSwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg5NiwweGZmLDB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MzQsMHhmZiwKKzB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4NjUsMHhmZiwweDAxLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDk2LDB4ZmYsCisweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMiwweGZmLDB4MzQsMHhmZiwweGZmLDB4ZmYsMHg0OSwweGZmLAorMHgwMiwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHg0OSwweGZmLDB4MTAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDYsMHhmZiwKKzB4MTAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDIsMHhmZiwweDMwLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweDI1LDB4ZmYsMHg2ZCwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHhiZSwweGZmLAorMHg5OCwweGZmLDB4NTAsMHhmZiwweGZmLDB4ZmYsMHg3MywweGZmLDB4ODgsMHhmZiwweDUwLDB4ZmYsMHhmZiwweGZmLDB4NzMsMHhmZiwKKzB4ODMsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YzUsMHhmZiwweDg4LDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsCisweDgzLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGM1LDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhjNiwweGZmLAorMHg5OCwweGZmLDB4NTAsMHhmZiwweGZmLDB4ZmYsMHg3MywweGZmLDB4ODgsMHhmZiwweDUwLDB4ZmYsMHhmZiwweGZmLDB4NzMsMHhmZiwKKzB4ODMsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4YzQsMHhmZiwweDg4LDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweGM1LDB4ZmYsCisweDgzLDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHhjNiwweGZmLAorMHg5OCwweGZmLDB4NTAsMHhmZiwweGZmLDB4ZmYsMHg3MywweGZmLDB4ODgsMHhmZiwweDUwLDB4ZmYsMHhmZiwweGZmLDB4NzMsMHhmZiwKKzB4ODMsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YzUsMHhmZiwweDg4LDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsCisweDgzLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweGM1LDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhjNiwweGZmLAorMHgwMCwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHgyNSwweGZmLDB4NmUsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4OGUsMHhmZiwKKzB4OTgsMHhmZiwweDUwLDB4ZmYsMHhmZiwweGZmLDB4NzMsMHhmZiwweDg4LDB4ZmYsMHg1MCwweGZmLDB4ZmYsMHhmZiwweDczLDB4ZmYsCisweDgzLDB4ZmYsMHg3OCwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsMHg4OCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHhjNCwweGZmLAorMHgwMCwweGZmLDB4NzgsMHhmZiwweGZmLDB4ZmYsMHhjNCwweGZmLDB4MjAsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweGU5LDB4ZmYsCisweDAxLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDI4LDB4ZmYsMHgwMSwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgyOSwweGZmLAorMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHg2NiwweGZmLDB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MzQsMHhmZiwKKzB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4NzUsMHhmZiwweDEwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDA2LDB4ZmYsCisweDAwLDB4ZmYsMHg0MSwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHgzMCwweGZmLDB4MGMsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg5OCwweGZmLDB4NzAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDNjLDB4ZmYsMHhmZiwweGZmLDB4MjUsMHhmZiwKKzB4NzAsMHhmZiwweDE0LDB4ZmYsMHhmZiwweGZmLDB4MmUsMHhmZiwweDgwLDB4ZmYsMHg3MCwweGZmLDB4ZmYsMHhmZiwweDQyLDB4ZmYsCisweDYzLDB4ZmYsMHg3MiwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg4MCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLAorMHgwMCwweGZmLDB4NzAsMHhmZiwweGZmLDB4ZmYsMHg0MSwweGZmLDB4NjMsMHhmZiwweDcyLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwKKzB4ODAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTcsMHhmZiwweDAwLDB4ZmYsMHg3MCwweGZmLDB4ZmYsMHhmZiwweDQ2LDB4ZmYsCisweDYzLDB4ZmYsMHg3MiwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsMHg4MCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLAorMHgwMCwweGZmLDB4NzAsMHhmZiwweGZmLDB4ZmYsMHg0NSwweGZmLDB4NjMsMHhmZiwweDcyLDB4ZmYsMHhmZiwweGZmLDB4MjAsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTcsMHhmZiwweDgwLDB4ZmYsMHg3MCwweGZmLDB4ZmYsMHhmZiwweDQyLDB4ZmYsCisweDYzLDB4ZmYsMHg3MiwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHg4MCwweGZmLDB4NzAsMHhmZiwweGZmLDB4ZmYsMHg0MSwweGZmLAorMHg2MywweGZmLDB4NmEsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLDB4MDAsMHhmZiwweDcwLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwKKzB4ODAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTcsMHhmZiwweDAwLDB4ZmYsMHg3MCwweGZmLDB4ZmYsMHhmZiwweDQ0LDB4ZmYsCisweDYzLDB4ZmYsMHg3MiwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsMHg4MCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLAorMHhmMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwNSwweGZmLDB4MDAsMHhmZiwweDRmLDB4ZmYsMHhmZiwweGZmLDB4MDQsMHhmZiwKKzB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweDgwLDB4ZmYsMHgyNywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDg4LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhlYSwweGZmLDB4MjAsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHg3NCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4YTcsMHhmZiwKKzB4MDAsMHhmZiwweDcwLDB4ZmYsMHhmZiwweGZmLDB4MjQsMHhmZiwweDgwLDB4ZmYsMHg3MCwweGZmLDB4ZmYsMHhmZiwweDQ0LDB4ZmYsCisweDYzLDB4ZmYsMHg3MiwweGZmLDB4ZmYsMHhmZiwweDI0LDB4ZmYsMHg4MCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLAorMHgwMCwweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHgwNCwweGZmLDB4MDAsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwKKzB4ODAsMHhmZiwweDI3LDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDg4LDB4ZmYsMHgyMywweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweGVhLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHg3NCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHhhNywweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4MzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDcyLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDM1LDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDMwLDB4ZmYsMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MGUsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MTAsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwweDA4LDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDEwLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDkwLDB4ZmYsMHgwMiwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MTAsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4YjAsMHhmZiwweGIwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDUwLDB4ZmYsMHgzMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLDB4NzgsMHhmZiwweDQyLDB4ZmYsMHhmZiwweGZmLDB4NTAsMHhmZiwKKzB4NDgsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwweDQwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ5LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgxOCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHg0NywweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg3MCwweGZmLDB4MTgsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4MTAsMHhmZiwKKzB4NDcsMHhmZiwweDkwLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwweDE4LDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHg2MCwweGZmLDB4OGQsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwKKzB4MGIsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwweDExLDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweDAwLDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDEwLDB4ZmYsMHgxMSwweGZmLDB4OTAsMHhmZiwweGZmLDB4ZmYsMHhlMCwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDA4LDB4ZmYsMHg0MCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDQ3LDB4ZmYsMHg5MCwweGZmLDB4ZmYsMHhmZiwweDIwLDB4ZmYsMHgyMiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg5ZiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgxMCwweGZmLDB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4MjIsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4OWYsMHhmZiwweDAwLDB4ZmYsMHg0OCwweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDg2LDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDcwLDB4ZmYsMHgyMiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHg5ZiwweGZmLAorMHgwMCwweGZmLDB4NDgsMHhmZiwweGZmLDB4ZmYsMHgyMCwweGZmLDB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NzAsMHhmZiwKKzB4MjIsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4OWYsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDQ4LDB4ZmYsCisweDAwLDB4ZmYsMHg2MCwweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHg4NiwweGZmLDB4OTMsMHhmZiwweGZmLDB4ZmYsMHhiMCwweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4ODYsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4YzAsMHhmZiwKKzB4ODYsMHhmZiwweDk3LDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhmZiwweDAwLDB4ZmYsMHgwYSwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDgwLDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAyLDB4ZmYsMHg4NCwweGZmLDB4M2IsMHhmZiwweGZmLDB4ZmYsMHgwMiwweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwYiwweGZmLDB4MGMsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4OTAsMHhmZiwKKzB4MDAsMHhmZiwweDcwLDB4ZmYsMHhmZiwweGZmLDB4MGIsMHhmZiwweDBjLDB4ZmYsMHgwZCwweGZmLDB4ZmYsMHhmZiwweGIwLDB4ZmYsCisweDg4LDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAzLDB4ZmYsMHg4YywweGZmLDB4M2IsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMSwweGZmLDB4OGIsMHhmZiwweDkzLDB4ZmYsMHhmZiwweGZmLDB4NTEsMHhmZiwKKzB4ODIsMHhmZiwweDQzLDB4ZmYsMHhmZiwweGZmLDB4ODAsMHhmZiwweDhiLDB4ZmYsMHg5MywweGZmLDB4ZmYsMHhmZiwweDYwLDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDg5LDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwYywweGZmLDB4MGQsMHhmZiwweGZmLDB4ZmYsMHg4MCwweGZmLDB4MGMsMHhmZiwweDBkLDB4ZmYsMHhmZiwweGZmLDB4YTAsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDgwLDB4ZmYsMHgzNywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsCisweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsMHgwMiwweGZmLDB4M2MsMHhmZiwweGZmLDB4ZmYsMHg0NSwweGZmLAorMHg3NiwweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHhkZSwweGZmLDB4MDAsMHhmZiwweGEwLDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwKKzB4ODQsMHhmZiwweDM3LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDA4LDB4ZmYsCisweDAyLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweDQ1LDB4ZmYsMHg3NywweGZmLDB4MTQsMHhmZiwweGZmLDB4ZmYsMHgyZSwweGZmLAorMHgwMCwweGZmLDB4YTAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4N2UsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwKKzB4MDAsMHhmZiwweDM4LDB4ZmYsMHhmZiwweGZmLDB4MDgsMHhmZiwweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweGU1LDB4ZmYsCisweDc3LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDhlLDB4ZmYsMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMCwweGZmLDB4NTgsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4NjQsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4NGYsMHhmZiwweDM4LDB4ZmYsMHgyMiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsCisweDc3LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweGU1LDB4ZmYsMHg4YiwweGZmLDB4ODMsMHhmZiwweGZmLDB4ZmYsMHg0MCwweGZmLAorMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4NjQsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4OGYsMHhmZiwKKzB4MzgsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDc4LDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweDM1LDB4ZmYsCisweDhiLDB4ZmYsMHg4MywweGZmLDB4ZmYsMHhmZiwweDQwLDB4ZmYsMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4MDksMHhmZiwKKzB4MDAsMHhmZiwweDM0LDB4ZmYsMHhmZiwweGZmLDB4ODUsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweDU2LDB4ZmYsCisweDAwLDB4ZmYsMHgwOSwweGZmLDB4ZmYsMHhmZiwweDA2LDB4ZmYsMHgyMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLAorMHgwMSwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhjMSwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4NDQsMHhmZiwKKzB4MDAsMHhmZiwweDY4LDB4ZmYsMHhmZiwweGZmLDB4MDUsMHhmZiwweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDE1LDB4ZmYsCisweDAwLDB4ZmYsMHg2OCwweGZmLDB4ZmYsMHhmZiwweDA1LDB4ZmYsMHgwMCwweGZmLDB4NjgsMHhmZiwweGZmLDB4ZmYsMHg0NSwweGZmLAorMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4ODYsMHhmZiwweDg3LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwKKzB4ODYsMHhmZiwweDhiLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwweDAwLDB4ZmYsMHgzNCwweGZmLDB4ZmYsMHhmZiwweGM4LDB4ZmYsCisweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweGM4LDB4ZmYsMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgwMywweGZmLAorMHgwMCwweGZmLDB4NjAsMHhmZiwweGZmLDB4ZmYsMHgxMywweGZmLDB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MTMsMHhmZiwKKzB4MDAsMHhmZiwweDc4LDB4ZmYsMHhmZiwweGZmLDB4MDMsMHhmZiwweDg2LDB4ZmYsMHg5NywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweDg2LDB4ZmYsMHg5YiwweGZmLDB4ZmYsMHhmZiwweGUwLDB4ZmYsMHgwNSwweGZmLDB4ODEsMHhmZiwweGZmLDB4ZmYsMHhjMCwweGZmLAorMHg3OCwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4MjEsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4NzEsMHhmZiwKKzB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDdmLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDAxLDB4ZmYsCisweDAwLDB4ZmYsMHgzOCwweGZmLDB4ZmYsMHhmZiwweDA5LDB4ZmYsMHgwMCwweGZmLDB4MzgsMHhmZiwweGZmLDB4ZmYsMHgwNiwweGZmLAorMHg3ZSwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHhmZiwweDQwLDB4ZmYsMHhmZiwweGZmLDB4YjEsMHhmZiwKKzB4MDgsMHhmZiwweDBjLDB4ZmYsMHhmZiwweGZmLDB4MDAsMHhmZiwweDAwLDB4ZmYsMHgzYywweGZmLDB4ZmYsMHhmZiwweGM1LDB4ZmYsCisweDdhLDB4ZmYsMHgxNCwweGZmLDB4ZmYsMHhmZiwweGJlLDB4ZmYsMHgwMCwweGZmLDB4NTAsMHhmZiwweGZmLDB4ZmYsMHg0NiwweGZmLAorMHhlMSwweGZmLDB4MjIsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4N2EsMHhmZiwweDFjLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHhmZiwKKzB4NjAsMHhmZiwweDIyLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweDAwLDB4ZmYsMHg1OCwweGZmLDB4ZmYsMHhmZiwweGE3LDB4ZmYsCisweDBjLDB4ZmYsMHgwYywweGZmLDB4ZmYsMHhmZiwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MGEsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLAorMHgwMCwweGZmLDB4NDAsMHhmZiwweGZmLDB4ZmYsMHhjNCwweGZmLDB4MDAsMHhmZiwweDBhLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWRlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMCwwICsxLDI1NTMgQEAKKy8qCisgKiAgIERyaXZlciBmb3IgdGhlIEtvcmcgMTIxMiBJTyBQQ0kgY2FyZAorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMSBIYXJvbGRvIEdhbWFsIDxnYW1hbEBhbHRlcm5leC5jb20uYnI+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWJ1ZyBTdHVmZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBLMTIxMl9ERUJVR19MRVZFTAkJMAorI2RlZmluZSBLMTIxMl9ERUJVR19QUklOVEsJCXByaW50aworLy8jZGVmaW5lIEsxMjEyX0RFQlVHX1BSSU5USyh4Li4uKQlwcmludGsoIjwwPiIgeCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVjb3JkL1BsYXkgQnVmZmVyIEFsbG9jYXRpb24gTWV0aG9kLiBJZiBLMTIxMl9MQVJHRUFMTE9DIGlzIGRlZmluZWQgYWxsIAorLy8gYnVmZmVycyBhcmUgYWxvY2F0ZWQgYXMgYSBsYXJnZSBwaWVjZSBpbnNpZGUgS29yZ1NoYXJlZEJ1ZmZlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vI2RlZmluZSBLMTIxMl9MQVJHRUFMTE9DCQkxCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhbGlkIHN0YXRlcyBvZiB0aGUgS29yZyAxMjEyIEkvTyBjYXJkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBlbnVtIHsKKyAgIEsxMjEyX1NUQVRFX05PTkVYSVNURU5ULAkJLy8gdGhlcmUgaXMgbm8gY2FyZCBoZXJlCisgICBLMTIxMl9TVEFURV9VTklOSVRJQUxJWkVELAkJLy8gdGhlIGNhcmQgaXMgYXdhaXRpbmcgRFNQIGRvd25sb2FkCisgICBLMTIxMl9TVEFURV9EU1BfSU5fUFJPQ0VTUywJCS8vIHRoZSBjYXJkIGlzIGN1cnJlbnRseSBkb3dubG9hZGluZyBpdHMgRFNQIGNvZGUKKyAgIEsxMjEyX1NUQVRFX0RTUF9DT01QTEVURSwJCS8vIHRoZSBjYXJkIGhhcyBmaW5pc2hlZCB0aGUgRFNQIGRvd25sb2FkCisgICBLMTIxMl9TVEFURV9SRUFEWSwJCQkvLyB0aGUgY2FyZCBjYW4gYmUgb3BlbmVkIGJ5IGFuIGFwcGxpY2F0aW9uLiAgQW55IGFwcGxpY2F0aW9uCisJCQkJCS8vICAgIHJlcXVlc3RzIHByaW9yIHRvIHRoaXMgc3RhdGUgc2hvdWxkIGZhaWwuICBPbmx5IGFuIG9wZW4KKwkJCQkJLy8gICAgcmVxdWVzdCBjYW4gYmUgbWFkZSBhdCB0aGlzIHN0YXRlLgorICAgSzEyMTJfU1RBVEVfT1BFTiwJCQkvLyBhbiBhcHBsaWNhdGlvbiBoYXMgb3BlbmVkIHRoZSBjYXJkCisgICBLMTIxMl9TVEFURV9TRVRVUCwJCQkvLyB0aGUgY2FyZCBoYXMgYmVlbiBzZXR1cCBmb3IgcGxheQorICAgSzEyMTJfU1RBVEVfUExBWUlORywJCQkvLyB0aGUgY2FyZCBpcyBwbGF5aW5nCisgICBLMTIxMl9TVEFURV9NT05JVE9SLAkJCS8vIHRoZSBjYXJkIGlzIGluIHRoZSBtb25pdG9yIG1vZGUKKyAgIEsxMjEyX1NUQVRFX0NBTElCUkFUSU5HLAkJLy8gdGhlIGNhcmQgaXMgY3VycmVudGx5IGNhbGlicmF0aW5nCisgICBLMTIxMl9TVEFURV9FUlJPUlNUT1AsCQkvLyB0aGUgY2FyZCBoYXMgc3RvcHBlZCBpdHNlbGYgYmVjYXVzZSBvZiBhbiBlcnJvciBhbmQgd2UKKwkJCQkJLy8gICAgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNsZWFuaW5nIHRoaW5ncyB1cC4KKyAgIEsxMjEyX1NUQVRFX01BWF9TVEFURQkJLy8gc3RhdGUgdmFsdWVzIG9mIHRoaXMgYW5kIGJleW9uZCBhcmUgaW52YWxpZAorfSBDYXJkU3RhdGU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgY29uc3RhbnRzIHdyaXR0ZW4gdG8gdGhlIGNhcmQncworLy8gaG9zdC10by1jYXJkIGRvb3JiZWxsIHRvIGluaXRpYXRlIGEgY29tbWFuZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgZW51bSB7CisgICBLMTIxMl9EQl9SZXF1ZXN0Rm9yRGF0YSAgICAgICAgPSAwLCAgICAvLyBzZW50IGJ5IHRoZSBjYXJkIHRvIHJlcXVlc3QgYSBidWZmZXIgZmlsbC4KKyAgIEsxMjEyX0RCX1RyaWdnZXJQbGF5ICAgICAgICAgICA9IDEsICAgIC8vIHN0YXJ0cyBwbGF5YmFjay9yZWNvcmQgb24gdGhlIGNhcmQuCisgICBLMTIxMl9EQl9TZWxlY3RQbGF5TW9kZSAgICAgICAgPSAyLCAgICAvLyBzZWxlY3QgbW9uaXRvciwgcGxheWJhY2sgc2V0dXAsIG9yIHN0b3AuCisgICBLMTIxMl9EQl9Db25maWd1cmVCdWZmZXJNZW1vcnkgPSAzLCAgICAvLyB0ZWxscyBjYXJkIHdoZXJlIHRoZSBob3N0IGF1ZGlvIGJ1ZmZlcnMgYXJlLgorICAgSzEyMTJfREJfUmVxdWVzdEFkYXRUaW1lY29kZSAgID0gNCwgICAgLy8gYXNrcyB0aGUgY2FyZCBmb3IgdGhlIGxhdGVzdCBBREFUIHRpbWVjb2RlIHZhbHVlLgorICAgSzEyMTJfREJfU2V0Q2xvY2tTb3VyY2VSYXRlICAgID0gNSwgICAgLy8gc2V0cyB0aGUgY2xvY2sgc291cmNlIGFuZCByYXRlIGZvciB0aGUgY2FyZC4KKyAgIEsxMjEyX0RCX0NvbmZpZ3VyZU1pc2NNZW1vcnkgICA9IDYsICAgIC8vIHRlbGxzIGNhcmQgd2hlcmUgb3RoZXIgYnVmZmVycyBhcmUuCisgICBLMTIxMl9EQl9UcmlnZ2VyRnJvbUFkYXQgICAgICAgPSA3LCAgICAvLyB0ZWxscyBjYXJkIHRvIHRyaWdnZXIgZnJvbSBBZGF0IGF0IGEgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRpbWVjb2RlIHZhbHVlLgorICAgSzEyMTJfREJfRE1BRVJST1IgICAgICAgICAgICAgID0gMHg4MCwgLy8gRE1BIEVycm9yIC0gdGhlIFBDSSBidXMgaXMgY29uZ2VzdGlvbmVkLgorICAgSzEyMTJfREJfQ0FSRFNUT1BQRUQgICAgICAgICAgID0gMHg4MSwgLy8gQ2FyZCBoYXMgc3RvcHBlZCBieSB1c2VyIHJlcXVlc3QuCisgICBLMTIxMl9EQl9SZWJvb3RDYXJkICAgICAgICAgICAgPSAweEEwLCAvLyBpbnN0cnVjdHMgdGhlIGNhcmQgdG8gcmVib290LgorICAgSzEyMTJfREJfQm9vdEZyb21EU1BQYWdlNCAgICAgID0gMHhBNCwgLy8gaW5zdHJ1Y3RzIHRoZSBjYXJkIHRvIGJvb3QgZnJvbSB0aGUgRFNQIG1pY3JvY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb24gcGFnZSA0IChsb2NhbCBwYWdlIHRvIGNhcmQpLgorICAgSzEyMTJfREJfRFNQRG93bmxvYWREb25lICAgICAgID0gMHhBRSwgLy8gc2VudCBieSB0aGUgY2FyZCB0byBpbmRpY2F0ZSB0aGUgZG93bmxvYWQgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb21wbGV0ZWQuCisgICBLMTIxMl9EQl9TdGFydERTUERvd25sb2FkICAgICAgPSAweEFGICAvLyB0ZWxscyB0aGUgY2FyZCB0byBkb3dubG9hZCBpdHMgRFNQIGZpcm13YXJlLgorfSBrb3JnMTIxMl9kYmNuc3RfdDsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgcmV0dXJuIGNvZGVzIAorLy8gdG8gdGhlIEtvcmcgMTIxMiBJL08gZHJpdmVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBlbnVtIHsKKyAgIEsxMjEyX0NNRFJFVF9TdWNjZXNzICAgICAgICAgPSAwLCAgIC8vIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWxseSBwbGFjZWQKKyAgIEsxMjEyX0NNRFJFVF9ESU9DRmFpbHVyZSwgICAgICAgICAgIC8vIHRoZSBEZXZpY2VJb0NvbnRyb2wgY2FsbCBmYWlsZWQKKyAgIEsxMjEyX0NNRFJFVF9QTUZhaWx1cmUsICAgICAgICAgICAgIC8vIHRoZSBwcm90ZWN0ZWQgbW9kZSBjYWxsIGZhaWxlZAorICAgSzEyMTJfQ01EUkVUX0ZhaWxVbnNwZWNpZmllZCwgICAgICAgLy8gdW5zcGVjaWZpZWQgZmFpbHVyZQorICAgSzEyMTJfQ01EUkVUX0ZhaWxCYWRTdGF0ZSwgICAgICAgICAgLy8gdGhlIHNwZWNpZmllZCBjb21tYW5kIGNhbiBub3QgYmUgZ2l2ZW4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBjYXJkJ3MgY3VycmVudCBzdGF0ZS4gKG9yIHRoZSB3YXZlIGRldmljZSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGF0ZSkKKyAgIEsxMjEyX0NNRFJFVF9DYXJkVW5pbml0aWFsaXplZCwgICAgIC8vIHRoZSBjYXJkIGlzIHVuaW5pdGlhbGl6ZWQgYW5kIGNhbm5vdCBiZSB1c2VkCisgICBLMTIxMl9DTURSRVRfQmFkSW5kZXgsICAgICAgICAgICAgICAvLyBhbiBvdXQgb2YgcmFuZ2UgY2FyZCBpbmRleCB3YXMgc3BlY2lmaWVkCisgICBLMTIxMl9DTURSRVRfQmFkSGFuZGxlLCAgICAgICAgICAgICAvLyBhbiBpbnZhbGlkIGNhcmQgaGFuZGxlIHdhcyBzcGVjaWZpZWQKKyAgIEsxMjEyX0NNRFJFVF9Ob0ZpbGxSb3V0aW5lLCAgICAgICAgIC8vIGEgcGxheSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgYmVmb3JlIGEgZmlsbCByb3V0aW5lIHNldAorICAgSzEyMTJfQ01EUkVUX0ZpbGxSb3V0aW5lSW5Vc2UsICAgICAgLy8gY2FuJ3Qgc2V0IGEgbmV3IGZpbGwgcm91dGluZSB3aGlsZSBvbmUgaXMgaW4gdXNlCisgICBLMTIxMl9DTURSRVRfTm9BY2tGcm9tQ2FyZCwgICAgICAgICAvLyB0aGUgY2FyZCBuZXZlciBhY2tub3dsZWRnZWQgYSBjb21tYW5kCisgICBLMTIxMl9DTURSRVRfQmFkUGFyYW1zLCAgICAgICAgICAgICAvLyBiYWQgcGFyYW1ldGVycyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIKKworICAgSzEyMTJfQ01EUkVUX0JhZERldmljZSwgICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmllZCB3YXZlIGRldmljZSB3YXMgb3V0IG9mIHJhbmdlCisgICBLMTIxMl9DTURSRVRfQmFkRm9ybWF0ICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWVkIHdhdmUgZm9ybWF0IGlzIHVuc3VwcG9ydGVkCit9IHNuZF9rb3JnMTIxMnJjOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGNvbnN0YW50cyB1c2VkIHRvIHNlbGVjdCB0aGUgcGxheQorLy8gbW9kZSBmb3IgdGhlIGNhcmQgaW4gdGhlIFNlbGVjdFBsYXlNb2RlIGNvbW1hbmQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIGVudW0geworICAgSzEyMTJfTU9ERV9TZXR1cFBsYXkgID0gMHgwMDAwMDAwMSwgICAgIC8vIHByb3ZpZGVzIGNhcmQgd2l0aCBwcmUtcGxheSBpbmZvcm1hdGlvbgorICAgSzEyMTJfTU9ERV9Nb25pdG9yT24gID0gMHgwMDAwMDAwMiwgICAgIC8vIHRlbGxzIGNhcmQgdG8gdHVybiBvbiBtb25pdG9yIG1vZGUKKyAgIEsxMjEyX01PREVfTW9uaXRvck9mZiA9IDB4MDAwMDAwMDQsICAgICAvLyB0ZWxscyBjYXJkIHRvIHR1cm4gb2ZmIG1vbml0b3IgbW9kZQorICAgSzEyMTJfTU9ERV9TdG9wUGxheSAgID0gMHgwMDAwMDAwOCAgICAgIC8vIHN0b3BzIHBsYXliYWNrIG9uIHRoZSBjYXJkCit9IFBsYXlNb2RlU2VsZWN0b3I7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc2VsZWN0IHRoZSBtb25pdG9yCisvLyBtb2RlIGZvciB0aGUgY2FyZCBpbiB0aGUgU2V0TW9uaXRvck1vZGUgY29tbWFuZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgZW51bSB7CisgICBLMTIxMl9NT05NT0RFX09mZiAgPSAwLCAgICAgLy8gdGVsbHMgY2FyZCB0byB0dXJuIG9mZiBtb25pdG9yIG1vZGUKKyAgIEsxMjEyX01PTk1PREVfT24gICAgICAgICAgICAvLyB0ZWxscyBjYXJkIHRvIHR1cm4gb24gbW9uaXRvciBtb2RlCit9IE1vbml0b3JNb2RlU2VsZWN0b3I7CisKKyNkZWZpbmUgTUFJTEJPWDBfT0ZGU0VUICAgICAgMHg0MAkvLyBsb2NhdGlvbiBvZiBtYWlsYm94IDAgcmVsYXRpdmUgdG8gYmFzZSBhZGRyZXNzCisjZGVmaW5lIE1BSUxCT1gxX09GRlNFVCAgICAgIDB4NDQJLy8gbG9jYXRpb24gb2YgbWFpbGJveCAxIHJlbGF0aXZlIHRvIGJhc2UgYWRkcmVzcworI2RlZmluZSBNQUlMQk9YMl9PRkZTRVQgICAgICAweDQ4CS8vIGxvY2F0aW9uIG9mIG1haWxib3ggMiByZWxhdGl2ZSB0byBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgTUFJTEJPWDNfT0ZGU0VUICAgICAgMHg0YwkvLyBsb2NhdGlvbiBvZiBtYWlsYm94IDMgcmVsYXRpdmUgdG8gYmFzZSBhZGRyZXNzCisjZGVmaW5lIE9VVF9ET09SQkVMTF9PRkZTRVQgIDB4NjAJLy8gbG9jYXRpb24gb2YgUENJIHRvIGxvY2FsIGRvb3JiZWxsCisjZGVmaW5lIElOX0RPT1JCRUxMX09GRlNFVCAgIDB4NjQJLy8gbG9jYXRpb24gb2YgbG9jYWwgdG8gUENJIGRvb3JiZWxsCisjZGVmaW5lIFNUQVRVU19SRUdfT0ZGU0VUICAgIDB4NjgJLy8gbG9jYXRpb24gb2YgaW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIFBDSV9DT05UUk9MX09GRlNFVCAgIDB4NmMJLy8gbG9jYXRpb24gb2YgdGhlIEVFUFJPTSwgUENJLCBVc2VyIEkvTywgaW5pdCBjb250cm9sCisJCQkJCS8vICAgIHJlZ2lzdGVyCisjZGVmaW5lIFNFTlNfQ09OVFJPTF9PRkZTRVQgIDB4NmUJLy8gbG9jYXRpb24gb2YgdGhlIGlucHV0IHNlbnNpdGl2aXR5IHNldHRpbmcgcmVnaXN0ZXIuCisJCQkJCS8vICAgIHRoaXMgaXMgdGhlIHVwcGVyIHdvcmQgb2YgdGhlIFBDSSBjb250cm9sIHJlZy4KKyNkZWZpbmUgREVWX1ZFTkRfSURfT0ZGU0VUICAgMHg3MAkvLyBsb2NhdGlvbiBvZiB0aGUgZGV2aWNlIGFuZCB2ZW5kb3IgSUQgcmVnaXN0ZXIKKworI2RlZmluZSBDT01NQU5EX0FDS19ERUxBWSAgICAxMyAgICAgICAgLy8gbnVtYmVyIG9mIFJUQyB0aWNrcyB0byB3YWl0IGZvciBhbiBhY2tub3dsZWRnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmcm9tIHRoZSBjYXJkIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kLgorI2RlZmluZSBJTlRFUkNPTU1BTkRfREVMQVkgICA0MAorI2RlZmluZSBNQVhfQ09NTUFORF9SRVRSSUVTICA1ICAgICAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGRyaXZlciB3aWxsIGF0dGVtcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIHNlbmQgYSBjb21tYW5kIGJlZm9yZSBnaXZpbmcgdXAuCisjZGVmaW5lIENPTU1BTkRfQUNLX01BU0sgICAgIDB4ODAwMCAgICAvLyB0aGUgTVNCIGlzIHNldCBpbiB0aGUgY29tbWFuZCBhY2tub3dsZWRnbWVudCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGNhcmQuCisjZGVmaW5lIERPT1JCRUxMX1ZBTF9NQVNLICAgIDB4MDBGRiAgICAvLyB0aGUgZG9vcmJlbGwgdmFsdWUgaXMgb25lIGJ5dGUKKworI2RlZmluZSBDQVJEX0JPT1RfREVMQVlfSU5fTVMgIDEwCisjZGVmaW5lIENBUkRfQk9PVF9USU1FT1VUICAgICAgMTAKKyNkZWZpbmUgRFNQX0JPT1RfREVMQVlfSU5fTVMgICAyMDAKKworI2RlZmluZSBrTnVtQnVmZmVycwkJOAorI2RlZmluZSBrMTIxMk1heENhcmRzCQk0CisjZGVmaW5lIGsxMjEyTnVtV2F2ZURldmljZXMJNgorI2RlZmluZSBrMTZCaXRDaGFubmVscwkJMTAKKyNkZWZpbmUgazMyQml0Q2hhbm5lbHMJCTIKKyNkZWZpbmUga0F1ZGlvQ2hhbm5lbHMJCShrMTZCaXRDaGFubmVscyArIGszMkJpdENoYW5uZWxzKQorI2RlZmluZSBrUGxheUJ1ZmZlckZyYW1lcwkxMDI0CisKKyNkZWZpbmUgSzEyMTJfQU5BTE9HX0NIQU5ORUxTCTIKKyNkZWZpbmUgSzEyMTJfU1BESUZfQ0hBTk5FTFMJMgorI2RlZmluZSBLMTIxMl9BREFUX0NIQU5ORUxTCTgKKyNkZWZpbmUgSzEyMTJfQ0hBTk5FTFMJCShLMTIxMl9BREFUX0NIQU5ORUxTICsgSzEyMTJfQU5BTE9HX0NIQU5ORUxTKQorI2RlZmluZSBLMTIxMl9NSU5fQ0hBTk5FTFMJMQorI2RlZmluZSBLMTIxMl9NQVhfQ0hBTk5FTFMJSzEyMTJfQ0hBTk5FTFMKKyNkZWZpbmUgSzEyMTJfRlJBTUVfU0laRSAgICAgICAgKHNpemVvZihLb3JnQXVkaW9GcmFtZSkpCisjZGVmaW5lIEsxMjEyX01BWF9TQU1QTEVTCShrUGxheUJ1ZmZlckZyYW1lcyprTnVtQnVmZmVycykKKyNkZWZpbmUgSzEyMTJfUEVSSU9EUwkJKGtOdW1CdWZmZXJzKQorI2RlZmluZSBLMTIxMl9QRVJJT0RfQllURVMJKEsxMjEyX0ZSQU1FX1NJWkUqa1BsYXlCdWZmZXJGcmFtZXMpCisjZGVmaW5lIEsxMjEyX0JVRl9TSVpFICAgICAgICAgIChLMTIxMl9QRVJJT0RfQllURVMqa051bUJ1ZmZlcnMpCisjZGVmaW5lIEsxMjEyX0FOQUxPR19CVUZfU0laRQkoSzEyMTJfQU5BTE9HX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzICoga051bUJ1ZmZlcnMpCisjZGVmaW5lIEsxMjEyX1NQRElGX0JVRl9TSVpFCShLMTIxMl9TUERJRl9DSEFOTkVMUyAqIDMgKiBrUGxheUJ1ZmZlckZyYW1lcyAqIGtOdW1CdWZmZXJzKQorI2RlZmluZSBLMTIxMl9BREFUX0JVRl9TSVpFCShLMTIxMl9BREFUX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzICoga051bUJ1ZmZlcnMpCisjZGVmaW5lIEsxMjEyX01BWF9CVUZfU0laRQkoSzEyMTJfQU5BTE9HX0JVRl9TSVpFICsgSzEyMTJfQURBVF9CVUZfU0laRSkKKworI2RlZmluZSBrMTIxMk1pbkFEQ1NlbnMgICAgIDB4N2YKKyNkZWZpbmUgazEyMTJNYXhBRENTZW5zICAgICAweDAwCisjZGVmaW5lIGsxMjEyTWF4Vm9sdW1lICAgICAgMHg3ZmZmCisjZGVmaW5lIGsxMjEyTWF4V2F2ZVZvbHVtZSAgMHhmZmZmCisjZGVmaW5lIGsxMjEyTWluVm9sdW1lICAgICAgMHgwMDAwCisjZGVmaW5lIGsxMjEyTWF4Vm9sSW52ZXJ0ZWQgMHg4MDAwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIHVzZWQgZm9yIGNvbnRyb2xsaW5nIGludGVycnVwdHMgaW4gdGhlCisvLyBpbnRlcnJ1cHQgY29udHJvbC9zdGF0dXMgcmVnCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSAgUENJX0lOVF9FTkFCTEVfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSAgUENJX0RPT1JCRUxMX0lOVF9FTkFCTEVfQklUICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSAgTE9DQUxfSU5UX0VOQUJMRV9CSVQgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSAgTE9DQUxfRE9PUkJFTExfSU5UX0VOQUJMRV9CSVQgICAgMHgwMDAyMDAwMAorI2RlZmluZSAgTE9DQUxfRE1BMV9JTlRfRU5BQkxFX0JJVCAgICAgICAgMHgwMDA4MDAwMAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhlIGZvbGxvd2luZyBiaXRzIGFyZSBkZWZpbmVkIGZvciB0aGUgUENJIGNvbW1hbmQgcmVnaXN0ZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lICBQQ0lfQ01EX01FTV9TUEFDRV9FTkFCTEVfQklUICAgICAweDAwMDIKKyNkZWZpbmUgIFBDSV9DTURfSU9fU1BBQ0VfRU5BQkxFX0JJVCAgICAgIDB4MDAwMQorI2RlZmluZSAgUENJX0NNRF9CVVNfTUFTVEVSX0VOQUJMRV9CSVQgICAgMHgwMDA0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIGRlZmluZWQgZm9yIHRoZSBQQ0kgc3RhdHVzIHJlZ2lzdGVyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSAgUENJX1NUQVRfUEFSSVRZX0VSUk9SX0JJVCAgICAgICAgMHg4MDAwCisjZGVmaW5lICBQQ0lfU1RBVF9TWVNURU1fRVJST1JfQklUICAgICAgICAweDQwMDAKKyNkZWZpbmUgIFBDSV9TVEFUX01BU1RFUl9BQk9SVF9SQ1ZEX0JJVCAgIDB4MjAwMAorI2RlZmluZSAgUENJX1NUQVRfVEFSR0VUX0FCT1JUX1JDVkRfQklUICAgMHgxMDAwCisjZGVmaW5lICBQQ0lfU1RBVF9UQVJHRVRfQUJPUlRfU0VOVF9CSVQgICAweDA4MDAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCBpbiBzZXR0aW5nIHRoZSAxMjEyIEkvTyBjYXJkJ3MgaW5wdXQKKy8vIHNlbnNpdGl2aXR5LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lICBTRVRfU0VOU19MT0NBTElOSVRfQklUUE9TICAgICAgICAxNQorI2RlZmluZSAgU0VUX1NFTlNfREFUQV9CSVRQT1MgICAgICAgICAgICAgMTAKKyNkZWZpbmUgIFNFVF9TRU5TX0NMT0NLX0JJVFBPUyAgICAgICAgICAgIDgKKyNkZWZpbmUgIFNFVF9TRU5TX0xPQURTSElGVF9CSVRQT1MgICAgICAgIDAKKworI2RlZmluZSAgU0VUX1NFTlNfTEVGVENIQU5JRCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgU0VUX1NFTlNfUklHSFRDSEFOSUQgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lICBLMTIxMlNFTlNVUERBVEVfREVMQVlfSU5fTVMgICAgICA1MAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2FpdFJUQ1RpY2tzCisvLworLy8gICAgVGhpcyBmdW5jdGlvbiB3YWl0cyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByZWFsIHRpbWUgY2xvY2sgdGlja3MuCisvLyAgICBBY2NvcmRpbmcgdG8gdGhlIERESywgZWFjaCB0aWNrIGlzIH4wLjggbWljcm9zZWNvbmRzLgorLy8gICAgVGhlIGRlZmluZXMgZm9sbG93aW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBjYW4gYmUgdXNlZCBmb3IgdGhlCisvLyAgICBudW1UaWNrc1RvV2FpdCBwYXJhbWV0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBPTkVfUlRDX1RJQ0sgICAgICAgICAxCisjZGVmaW5lIFNFTlNDTEtQVUxTRV9XSURUSCAgIDQKKyNkZWZpbmUgTE9BRFNISUZUX0RFTEFZICAgICAgNAorI2RlZmluZSBJTlRFUkNPTU1BTkRfREVMQVkgIDQwCisjZGVmaW5lIFNUT1BDQVJEX0RFTEFZICAgICAgMzAwICAgICAgICAvLyBtYXggIyBSVEMgdGlja3MgZm9yIHRoZSBjYXJkIHRvIHN0b3Agb25jZSB3ZSB3cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGNvbW1hbmQgcmVnaXN0ZXIuICAoY291bGQgYmUgdXAgdG8gMTgwIHVzKQorI2RlZmluZSBDT01NQU5EX0FDS19ERUxBWSAgIDEzICAgICAgICAgLy8gbnVtYmVyIG9mIFJUQyB0aWNrcyB0byB3YWl0IGZvciBhbiBhY2tub3dsZWRnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZyb20gdGhlIGNhcmQgYWZ0ZXIgc2VuZGluZyBhIGNvbW1hbmQuCisKKyNpbmNsdWRlICJrb3JnMTIxMi1maXJtd2FyZS5oIgorCit0eXBlZGVmIHN0cnVjdCBfc25kX2tvcmcxMjEyIGtvcmcxMjEyX3Q7CisKK3R5cGVkZWYgdTE2IEsxMjEyU2FtcGxlOyAgICAgICAgICAvLyBjaGFubmVscyAwLTkgdXNlIDE2IGJpdCBzYW1wbGVzCit0eXBlZGVmIHUzMiBLMTIxMlNwZGlmU2FtcGxlOyAgICAgLy8gY2hhbm5lbHMgMTAtMTEgdXNlIDMyIGJpdHMgLSBvbmx5IDIwIGFyZSBzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGFjcm9zcyBTL1BESUYuCit0eXBlZGVmIHUzMiBLMTIxMlRpbWVDb2RlU2FtcGxlOyAgLy8gaG9sZHMgdGhlIEFEQVQgdGltZWNvZGUgdmFsdWUKKwordHlwZWRlZiBlbnVtIHsKKyAgIEsxMjEyX0NMS0lEWF9BZGF0QXQ0NF8xSyA9IDAsICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQgYXQgNDQuMSBrSHoKKyAgIEsxMjEyX0NMS0lEWF9BZGF0QXQ0OEssICAgICAgICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQgYXQgNDgga0h6CisgICBLMTIxMl9DTEtJRFhfV29yZEF0NDRfMUssICAgICAgICAvLyBzZWxlY3RzIHNvdXJjZSBhcyBTL1BESUYgYXQgNDQuMSBrSHoKKyAgIEsxMjEyX0NMS0lEWF9Xb3JkQXQ0OEssICAgICAgICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIFMvUERJRiBhdCA0OCBrSHoKKyAgIEsxMjEyX0NMS0lEWF9Mb2NhbEF0NDRfMUssICAgICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIGxvY2FsIGNsb2NrIGF0IDQ0LjEga0h6CisgICBLMTIxMl9DTEtJRFhfTG9jYWxBdDQ4SywgICAgICAgICAvLyBzZWxlY3RzIHNvdXJjZSBhcyBsb2NhbCBjbG9jayBhdCA0OCBrSHoKKyAgIEsxMjEyX0NMS0lEWF9JbnZhbGlkICAgICAgICAgICAgIC8vIHVzZWQgdG8gY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGluZGV4Cit9IENsb2NrU291cmNlSW5kZXg7CisKK3R5cGVkZWYgZW51bSB7CisgICBLMTIxMl9DTEtJRFhfQWRhdCA9IDAsICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQKKyAgIEsxMjEyX0NMS0lEWF9Xb3JkLCAgICAgICAgLy8gc2VsZWN0cyBzb3VyY2UgYXMgUy9QRElGCisgICBLMTIxMl9DTEtJRFhfTG9jYWwgICAgICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIGxvY2FsIGNsb2NrCit9IENsb2NrU291cmNlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgS29yZ0F1ZGlvRnJhbWUgeworICAgSzEyMTJTYW1wbGUgICAgICAgICAgZnJhbWVEYXRhMTZbazE2Qml0Q2hhbm5lbHNdOworICAgSzEyMTJTcGRpZlNhbXBsZSAgICAgZnJhbWVEYXRhMzJbazMyQml0Q2hhbm5lbHNdOworICAgSzEyMTJUaW1lQ29kZVNhbXBsZSAgdGltZUNvZGVWYWw7Cit9IEtvcmdBdWRpb0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBLb3JnQXVkaW9CdWZmZXIgeworICAgS29yZ0F1ZGlvRnJhbWUgIGJ1ZmZlckRhdGFba1BsYXlCdWZmZXJGcmFtZXNdOyAgICAgLyogYnVmZmVyIGRlZmluaXRpb24gKi8KK30gS29yZ0F1ZGlvQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBLb3JnU2hhcmVkQnVmZmVyIHsKKyNpZmRlZiBLMTIxMl9MQVJHRUFMTE9DCisgICBLb3JnQXVkaW9CdWZmZXIgICBwbGF5RGF0YUJ1ZnNba051bUJ1ZmZlcnNdOworICAgS29yZ0F1ZGlvQnVmZmVyICAgcmVjb3JkRGF0YUJ1ZnNba051bUJ1ZmZlcnNdOworI2VuZGlmCisgICBzaG9ydCAgICAgICAgICAgICB2b2x1bWVEYXRhW2tBdWRpb0NoYW5uZWxzXTsKKyAgIHUzMiAgICAgICAgICAgICAgIGNhcmRDb21tYW5kOworICAgdTE2ICAgICAgICAgICAgICAgcm91dGVEYXRhIFtrQXVkaW9DaGFubmVsc107CisgICB1MzIgICAgICAgICAgICAgICBBZGF0VGltZUNvZGU7ICAgICAgICAgICAgICAgICAvLyBBREFUIHRpbWVjb2RlIHZhbHVlCit9IEtvcmdTaGFyZWRCdWZmZXI7CisKK3R5cGVkZWYgc3RydWN0IFNlbnNCaXRzIHsKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgbGVmdENoYW5WYWw6ODsKKyAgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0Q2hhbklkOjg7CisgICAgICB9IHY7CisgICAgICB1MTYgIGxlZnRTZW5zQml0czsKKyAgIH0gbDsKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisgICAgICAgICB1bnNpZ25lZCBpbnQgcmlnaHRDaGFuVmFsOjg7CisgICAgICAgICB1bnNpZ25lZCBpbnQgcmlnaHRDaGFuSWQ6ODsKKyAgICAgIH0gdjsKKyAgICAgIHUxNiAgcmlnaHRTZW5zQml0czsKKyAgIH0gcjsKK30gU2Vuc0JpdHM7CisKK3N0cnVjdCBfc25kX2tvcmcxMjEyIHsKKyAgICAgICAgc25kX2NhcmRfdCAqY2FyZDsKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaTsKKyAgICAgICAgc25kX3BjbV90ICpwY207CisgICAgICAgIGludCBpcnE7CisKKyAgICAgICAgc3BpbmxvY2tfdCAgICBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9tdXRleDsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiB0aW1lciBjYWxsYmFjayBmb3IgY2hlY2tpbmcgYWNrIG9mIHN0b3AgcmVxdWVzdCAqLworCWludCBzdG9wX3BlbmRpbmdfY250OwkJLyogY291bnRlciBmb3Igc3RvcCBwZW5kaW5nIGNoZWNrICovCisKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworICAgICAgICB1bnNpZ25lZCBsb25nIGlvbWVtOworICAgICAgICB1bnNpZ25lZCBsb25nIGlvcG9ydDsKKwl1bnNpZ25lZCBsb25nIGlvbWVtMjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFjb3VudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpbklSUTsKKyAgICAgICAgdm9pZCBfX2lvbWVtICppb2Jhc2U7CisKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX2RzcDsKKyAgICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYV9wbGF5OworICAgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX3JlYzsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX3NoYXJlZDsKKworICAgICAgICB1MzIgZHNwQ29kZVNpemU7CisKKwl1MzIgRGF0YUJ1ZnNTaXplOworCisgICAgICAgIEtvcmdBdWRpb0J1ZmZlciAgKiBwbGF5RGF0YUJ1ZnNQdHI7CisgICAgICAgIEtvcmdBdWRpb0J1ZmZlciAgKiByZWNvcmREYXRhQnVmc1B0cjsKKworCUtvcmdTaGFyZWRCdWZmZXIgKiBzaGFyZWRCdWZmZXJQdHI7CisKKwl1MzIgUmVjRGF0YVBoeTsKKwl1MzIgUGxheURhdGFQaHk7CisJdW5zaWduZWQgbG9uZyBzaGFyZWRCdWZmZXJQaHk7CisJdTMyIFZvbHVtZVRhYmxlUGh5OworCXUzMiBSb3V0aW5nVGFibGVQaHk7CisJdTMyIEFkYXRUaW1lQ29kZVBoeTsKKworICAgICAgICB1MzIgX19pb21lbSAqIHN0YXR1c1JlZ1B0cjsJICAgICAvLyBhZGRyZXNzIG9mIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgdTMyIF9faW9tZW0gKiBvdXREb29yYmVsbFB0cjsJICAgICAvLyBhZGRyZXNzIG9mIHRoZSBob3N0LT5jYXJkIGRvb3JiZWxsIHJlZ2lzdGVyCisgICAgICAgIHUzMiBfX2lvbWVtICogaW5Eb29yYmVsbFB0cjsJICAgICAvLyBhZGRyZXNzIG9mIHRoZSBjYXJkLT5ob3N0IGRvb3JiZWxsIHJlZ2lzdGVyCisgICAgICAgIHUzMiBfX2lvbWVtICogbWFpbGJveDBQdHI7CSAgICAgLy8gYWRkcmVzcyBvZiBtYWlsYm94IDAgb24gdGhlIGNhcmQKKyAgICAgICAgdTMyIF9faW9tZW0gKiBtYWlsYm94MVB0cjsJICAgICAvLyBhZGRyZXNzIG9mIG1haWxib3ggMSBvbiB0aGUgY2FyZAorICAgICAgICB1MzIgX19pb21lbSAqIG1haWxib3gyUHRyOwkgICAgIC8vIGFkZHJlc3Mgb2YgbWFpbGJveCAyIG9uIHRoZSBjYXJkCisgICAgICAgIHUzMiBfX2lvbWVtICogbWFpbGJveDNQdHI7CSAgICAgLy8gYWRkcmVzcyBvZiBtYWlsYm94IDMgb24gdGhlIGNhcmQKKyAgICAgICAgdTMyIF9faW9tZW0gKiBjb250cm9sUmVnUHRyOwkgICAgIC8vIGFkZHJlc3Mgb2YgdGhlIEVFUFJPTSwgUENJLCBJL08sIEluaXQgY3RybCByZWcKKyAgICAgICAgdTE2IF9faW9tZW0gKiBzZW5zUmVnUHRyOwkgICAgIC8vIGFkZHJlc3Mgb2YgdGhlIHNlbnNpdGl2aXR5IHNldHRpbmcgcmVnaXN0ZXIKKyAgICAgICAgdTMyIF9faW9tZW0gKiBpZFJlZ1B0cjsJCSAgICAgLy8gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFuZCB2ZW5kb3IgSUQgcmVnaXN0ZXJzCisKKyAgICAgICAgc2l6ZV90IHBlcmlvZHNpemU7CisJaW50IGNoYW5uZWxzOworICAgICAgICBpbnQgY3VycmVudEJ1ZmZlcjsKKworICAgICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpwbGF5YmFja19zdWJzdHJlYW07CisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKmNhcHR1cmVfc3Vic3RyZWFtOworCisJcGlkX3QgY2FwdHVyZV9waWQ7CisJcGlkX3QgcGxheWJhY2tfcGlkOworCisgCUNhcmRTdGF0ZSBjYXJkU3RhdGU7CisgICAgICAgIGludCBydW5uaW5nOworICAgICAgICBpbnQgaWRsZU1vbml0b3JPbjsgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXJkIGlzIGluIGlkbGUgbW9uaXRvciBtb2RlLgorICAgICAgICB1MzIgY21kUmV0cnlDb3VudDsgICAgICAgICAgIC8vIHRyYWNrcyBob3cgbWFueSB0aW1lcyB3ZSBoYXZlIHJldHJpZWQgc2VuZGluZyB0byB0aGUgY2FyZC4KKworICAgICAgICBDbG9ja1NvdXJjZUluZGV4IGNsa1NyY1JhdGU7IC8vIHNhbXBsZSByYXRlIGFuZCBjbG9jayBzb3VyY2UKKworICAgICAgICBDbG9ja1NvdXJjZVR5cGUgY2xrU291cmNlOyAgIC8vIGNsb2NrIHNvdXJjZQorICAgICAgICBpbnQgY2xrUmF0ZTsgICAgICAgICAgICAgICAgIC8vIGNsb2NrIHJhdGUKKworICAgICAgICBpbnQgdm9sdW1lUGhhc2Vba0F1ZGlvQ2hhbm5lbHNdOworCisgICAgICAgIHUxNiBsZWZ0QURDSW5TZW5zOyAgICAgICAgICAgLy8gQURDIGxlZnQgY2hhbm5lbCBpbnB1dCBzZW5zaXRpdml0eQorICAgICAgICB1MTYgcmlnaHRBRENJblNlbnM7ICAgICAgICAgIC8vIEFEQyByaWdodCBjaGFubmVsIGlucHV0IHNlbnNpdGl2aXR5CisKKwlpbnQgb3BlbmNudDsJCSAgICAgLy8gT3Blbi9DbG9zZSBjb3VudAorCWludCBzZXRjbnQ7CQkgICAgIC8vIFNldHVwRm9yUGxheSBjb3VudAorCWludCBwbGF5Y250OwkJICAgICAvLyBUcmlnZ2VyUGxheSBjb3VudAorCWludCBlcnJvcmNudDsJCSAgICAgLy8gRXJyb3IgQ291bnQKKwl1bnNpZ25lZCBsb25nIHRvdGFsZXJyb3JjbnQ7IC8vIFRvdGFsIEVycm9yIENvdW50CisKKwlpbnQgZHNwX2lzX2xvYWRlZDsKKwlpbnQgZHNwX3N0b3BfaXNfcHJvY2Vzc2VkOworCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oImtvcmcxMjEyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tLT1JHLGtvcmcxMjEyfX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsgICAgIC8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CSAgIC8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFOyAvKiBFbmFibGUgdGhpcyBjYXJkICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgS29yZyAxMjEyIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgS29yZyAxMjEyIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgS29yZyAxMjEyIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9BVVRIT1IoIkhhcm9sZG8gR2FtYWwgPGdhbWFsQGFsdGVybmV4LmNvbS5icj4iKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9rb3JnMTIxMl9pZHNbXSA9IHsKKwl7CisJCS52ZW5kb3IJICAgPSAweDEwYjUsCisJCS5kZXZpY2UJICAgPSAweDkwNmQsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwl9LAorCXsgMCwgfSwKK307CisKK3N0YXRpYyBjaGFyKiBzdGF0ZU5hbWVbXSA9IHsKKwkJICAgICAgICAiTm9uLWV4aXN0ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEU1AgZG93bmxvYWQgaW4gcHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRFNQIGRvd25sb2FkIGNvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiT3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU2V0dXAgZm9yIHBsYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBsYXlpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1vbml0b3IgbW9kZSBvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsaWJyYXRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCIKK307CisKK3N0YXRpYyBjaGFyKiBjbG9ja1NvdXJjZVR5cGVOYW1lW10gPSB7ICJBREFUIiwgIlMvUERJRiIsICJsb2NhbCIgfTsKKworc3RhdGljIGNoYXIqIGNsb2NrU291cmNlTmFtZVtdID0geworICAgICAgICAgICAgICAgICAgICAgICAgIkFEQVQgYXQgNDQuMSBrSHoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFEQVQgYXQgNDgga0h6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTL1BESUYgYXQgNDQuMSBrSHoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlMvUERJRiBhdCA0OCBrSHoiLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsIGNsb2NrIGF0IDQ0LjEga0h6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbCBjbG9jayBhdCA0OCBrSHoiCit9OworCitzdGF0aWMgY2hhciogY2hhbm5lbE5hbWVbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJBREFULTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFEQVQtMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQURBVC0zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBREFULTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFEQVQtNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQURBVC02IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBREFULTciLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFEQVQtOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQW5hbG9nLUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFuYWxvZy1SIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUERJRi1MIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTUERJRi1SIiwKK307CisKK3N0YXRpYyB1MTYgQ2xvY2tTb3VyY2VTZWxlY3RvcltdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MDAwLCAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQgYXQgNDQuMSBrSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQgYXQgNDgga0h6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMSwgICAvLyBzZWxlY3RzIHNvdXJjZSBhcyBTL1BESUYgYXQgNDQuMSBrSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxLCAgIC8vIHNlbGVjdHMgc291cmNlIGFzIFMvUERJRiBhdCA0OCBrSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAyLCAgIC8vIHNlbGVjdHMgc291cmNlIGFzIGxvY2FsIGNsb2NrIGF0IDQ0LjEga0h6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgICAvLyBzZWxlY3RzIHNvdXJjZSBhcyBsb2NhbCBjbG9jayBhdCA0OCBrSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCitzdGF0aWMgc25kX2tvcmcxMjEycmMgcmM7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfa29yZzEyMTJfaWRzKTsKKwordHlwZWRlZiB1bmlvbiBzd2FwX3UzMiB7IHVuc2lnbmVkIGNoYXIgY1s0XTsgdTMyIGk7IH0gc3dhcF91MzI7CisKKyNpZmRlZiBTTkRSVl9CSUdfRU5ESUFOCitzdGF0aWMgdTMyIExvd2VyV29yZFN3YXAodTMyIHN3YXBwZWUpCisjZWxzZQorc3RhdGljIHUzMiBVcHBlcldvcmRTd2FwKHUzMiBzd2FwcGVlKQorI2VuZGlmCit7CisgICBzd2FwX3UzMiByZXRWYWwsIHN3YXBwZXI7CisKKyAgIHN3YXBwZXIuaSA9IHN3YXBwZWU7CisgICByZXRWYWwuY1syXSA9IHN3YXBwZXIuY1szXTsKKyAgIHJldFZhbC5jWzNdID0gc3dhcHBlci5jWzJdOworICAgcmV0VmFsLmNbMV0gPSBzd2FwcGVyLmNbMV07CisgICByZXRWYWwuY1swXSA9IHN3YXBwZXIuY1swXTsKKworICAgcmV0dXJuIHJldFZhbC5pOworfQorCisjaWZkZWYgU05EUlZfQklHX0VORElBTgorc3RhdGljIHUzMiBVcHBlcldvcmRTd2FwKHUzMiBzd2FwcGVlKQorI2Vsc2UKK3N0YXRpYyB1MzIgTG93ZXJXb3JkU3dhcCh1MzIgc3dhcHBlZSkKKyNlbmRpZgoreworICAgc3dhcF91MzIgcmV0VmFsLCBzd2FwcGVyOworCisgICBzd2FwcGVyLmkgPSBzd2FwcGVlOworICAgcmV0VmFsLmNbMl0gPSBzd2FwcGVyLmNbMl07CisgICByZXRWYWwuY1szXSA9IHN3YXBwZXIuY1szXTsKKyAgIHJldFZhbC5jWzFdID0gc3dhcHBlci5jWzBdOworICAgcmV0VmFsLmNbMF0gPSBzd2FwcGVyLmNbMV07CisKKyAgIHJldHVybiByZXRWYWwuaTsKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KKworc3RhdGljIHUzMiBFbmRpYW5Td2FwKHUzMiBzd2FwcGVlKQoreworICAgc3dhcF91MzIgcmV0VmFsLCBzd2FwcGVyOworCisgICBzd2FwcGVyLmkgPSBzd2FwcGVlOworICAgcmV0VmFsLmNbMF0gPSBzd2FwcGVyLmNbM107CisgICByZXRWYWwuY1sxXSA9IHN3YXBwZXIuY1syXTsKKyAgIHJldFZhbC5jWzJdID0gc3dhcHBlci5jWzFdOworICAgcmV0VmFsLmNbM10gPSBzd2FwcGVyLmNbMF07CisKKyAgIHJldHVybiByZXRWYWwuaTsKK30KKworI2VuZGlmIC8qIG5vdCB1c2VkICovCisKKyNkZWZpbmUgU2V0Qml0SW5Xb3JkKHRoZVdvcmQsYml0UG9zaXRpb24pICAgICAgICgqdGhlV29yZCkgfD0gKDB4MDAwMSA8PCBiaXRQb3NpdGlvbikKKyNkZWZpbmUgU2V0Qml0SW5EV29yZCh0aGVXb3JkLGJpdFBvc2l0aW9uKSAgICAgICgqdGhlV29yZCkgfD0gKDB4MDAwMDAwMDEgPDwgYml0UG9zaXRpb24pCisjZGVmaW5lIENsZWFyQml0SW5Xb3JkKHRoZVdvcmQsYml0UG9zaXRpb24pICAgICAoKnRoZVdvcmQpICY9IH4oMHgwMDAxIDw8IGJpdFBvc2l0aW9uKQorI2RlZmluZSBDbGVhckJpdEluRFdvcmQodGhlV29yZCxiaXRQb3NpdGlvbikgICAgKCp0aGVXb3JkKSAmPSB+KDB4MDAwMDAwMDEgPDwgYml0UG9zaXRpb24pCisKK3N0YXRpYyBzbmRfa29yZzEyMTJyYyBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyX3QgKmtvcmcxMjEyLCBrb3JnMTIxMl9kYmNuc3RfdCBkb29yYmVsbFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgbWFpbEJveDBWYWwsIHUzMiBtYWlsQm94MVZhbCwgdTMyIG1haWxCb3gyVmFsLCB1MzIgbWFpbEJveDNWYWwpCit7CisgICAgICAgIHUzMiByZXRyeUNvdW50OworICAgICAgICB1MTYgbWFpbEJveDNMbzsKKwlzbmRfa29yZzEyMTJyYyByYyA9IEsxMjEyX0NNRFJFVF9TdWNjZXNzOworCisgICAgICAgIGlmICgha29yZzEyMTItPm91dERvb3JiZWxsUHRyKSB7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAxCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IENhcmRVbmluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiBLMTIxMl9DTURSRVRfQ2FyZFVuaW5pdGlhbGl6ZWQ7CisJfQorCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogQ2FyZCA8LSAweCUwOHggMHglMDh4IFslc11cbiIsIGRvb3JiZWxsVmFsLCBtYWlsQm94MFZhbCwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorICAgICAgICBmb3IgKHJldHJ5Q291bnQgPSAwOyByZXRyeUNvdW50IDwgTUFYX0NPTU1BTkRfUkVUUklFUzsgcmV0cnlDb3VudCsrKSB7CisJCXdyaXRlbChtYWlsQm94M1ZhbCwga29yZzEyMTItPm1haWxib3gzUHRyKTsKKyAgICAgICAgICAgICAgICB3cml0ZWwobWFpbEJveDJWYWwsIGtvcmcxMjEyLT5tYWlsYm94MlB0cik7CisgICAgICAgICAgICAgICAgd3JpdGVsKG1haWxCb3gxVmFsLCBrb3JnMTIxMi0+bWFpbGJveDFQdHIpOworICAgICAgICAgICAgICAgIHdyaXRlbChtYWlsQm94MFZhbCwga29yZzEyMTItPm1haWxib3gwUHRyKTsKKyAgICAgICAgICAgICAgICB3cml0ZWwoZG9vcmJlbGxWYWwsIGtvcmcxMjEyLT5vdXREb29yYmVsbFB0cik7ICAvLyBpbnRlcnJ1cHQgdGhlIGNhcmQKKworICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgLy8gdGhlIHJlYm9vdCBjb21tYW5kIHdpbGwgbm90IGdpdmUgYW4gYWNrbm93bGVkZ2VtZW50LgorICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgaWYgKCBkb29yYmVsbFZhbCA9PSBLMTIxMl9EQl9SZWJvb3RDYXJkIHx8CisgICAgICAgICAgICAgICAgCWRvb3JiZWxsVmFsID09IEsxMjEyX0RCX0Jvb3RGcm9tRFNQUGFnZTQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvb3JiZWxsVmFsID09IEsxMjEyX0RCX1N0YXJ0RFNQRG93bmxvYWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEsxMjEyX0NNRFJFVF9TdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlIGNhcmQgYWNrbm93bGVkZ2VkIHRoZSBjb21tYW5kLiAgV2FpdCBhIGJpdCwgdGhlbgorICAgICAgICAgICAgICAgIC8vIHJlYWQgaW4gdGhlIGxvdyB3b3JkIG9mIG1haWxib3gzLiAgSWYgdGhlIE1TQiBpcyBzZXQgYW5kIHRoZQorICAgICAgICAgICAgICAgIC8vIGxvdyBieXRlIGlzIGVxdWFsIHRvIHRoZSBkb29yYmVsbCB2YWx1ZSwgdGhlbiBpdCBhY2snZC4KKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIHVkZWxheShDT01NQU5EX0FDS19ERUxBWSk7CisgICAgICAgICAgICAgICAgbWFpbEJveDNMbyA9IHJlYWRsKGtvcmcxMjEyLT5tYWlsYm94M1B0cik7CisgICAgICAgICAgICAgICAgaWYgKG1haWxCb3gzTG8gJiBDT01NQU5EX0FDS19NQVNLKSB7CisgICAgICAgICAgICAgICAgCWlmICgobWFpbEJveDNMbyAmIERPT1JCRUxMX1ZBTF9NQVNLKSA9PSAoZG9vcmJlbGxWYWwgJiBET09SQkVMTF9WQUxfTUFTSykpIHsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDEKKwkJCQlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBDYXJkIDwtIFN1Y2Nlc3NcbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gSzEyMTJfQ01EUkVUX1N1Y2Nlc3M7CisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCX0KKyAgICAgICAga29yZzEyMTItPmNtZFJldHJ5Q291bnQgKz0gcmV0cnlDb3VudDsKKworCWlmIChyZXRyeUNvdW50ID49IE1BWF9DT01NQU5EX1JFVFJJRVMpIHsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDEKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogQ2FyZCA8LSBOb0Fja0Zyb21DYXJkXG4iKTsKKyNlbmRpZgorICAgICAgICAJcmMgPSBLMTIxMl9DTURSRVRfTm9BY2tGcm9tQ2FyZDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHNwaW5sb2NrIGFscmVhZHkgaGVsZCAqLworc3RhdGljIHZvaWQgc25kX2tvcmcxMjEyX1NlbmRTdG9wKGtvcmcxMjEyX3QgKmtvcmcxMjEyKQoreworCWlmICghIGtvcmcxMjEyLT5zdG9wX3BlbmRpbmdfY250KSB7CisJCWtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPmNhcmRDb21tYW5kID0gMHhmZmZmZmZmZjsKKwkJLyogcHJvZ3JhbSB0aGUgdGltZXIgKi8KKwkJa29yZzEyMTItPnN0b3BfcGVuZGluZ19jbnQgPSBIWjsKKwkJa29yZzEyMTItPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwkJYWRkX3RpbWVyKCZrb3JnMTIxMi0+dGltZXIpOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX2tvcmcxMjEyX1NlbmRTdG9wQW5kV2FpdChrb3JnMTIxMl90ICprb3JnMTIxMikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZrb3JnMTIxMi0+bG9jaywgZmxhZ3MpOworCWtvcmcxMjEyLT5kc3Bfc3RvcF9pc19wcm9jZXNzZWQgPSAwOworCXNuZF9rb3JnMTIxMl9TZW5kU3RvcChrb3JnMTIxMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoa29yZzEyMTItPndhaXQsIGtvcmcxMjEyLT5kc3Bfc3RvcF9pc19wcm9jZXNzZWQsIChIWiAqIDMpIC8gMik7Cit9CisKKy8qIHRpbWVyIGNhbGxiYWNrIGZvciBjaGVja2luZyB0aGUgYWNrIG9mIHN0b3AgcmVxdWVzdCAqLworc3RhdGljIHZvaWQgc25kX2tvcmcxMjEyX3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQoreworICAgICAgICBrb3JnMTIxMl90ICprb3JnMTIxMiA9IChrb3JnMTIxMl90ICopIGRhdGE7CisJCisJc3Bpbl9sb2NrKCZrb3JnMTIxMi0+bG9jayk7CisJaWYgKGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPmNhcmRDb21tYW5kID09IDApIHsKKwkJLyogYWNrJ2VkICovCisJCWtvcmcxMjEyLT5zdG9wX3BlbmRpbmdfY250ID0gMDsKKwkJa29yZzEyMTItPmRzcF9zdG9wX2lzX3Byb2Nlc3NlZCA9IDE7CisJCXdha2VfdXAoJmtvcmcxMjEyLT53YWl0KTsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDEKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogU3RvcCBhY2snZWQgWyVzXVxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmICgtLWtvcmcxMjEyLT5zdG9wX3BlbmRpbmdfY250ID4gMCkgeworCQkJLyogcmVwcm9ncmFtIHRpbWVyICovCisJCQlrb3JnMTIxMi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCQkJYWRkX3RpbWVyKCZrb3JnMTIxMi0+dGltZXIpOworCQl9IGVsc2UgeworCQkJc25kX3ByaW50ZCgia29yZzEyMTJfdGltZXJfZnVuYyB0aW1lb3V0XG4iKTsKKwkJCWtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPmNhcmRDb21tYW5kID0gMDsKKwkJCWtvcmcxMjEyLT5kc3Bfc3RvcF9pc19wcm9jZXNzZWQgPSAxOworCQkJd2FrZV91cCgma29yZzEyMTItPndhaXQpOworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCQkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogU3RvcCB0aW1lb3V0IFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKwkJfQorCX0KKwlzcGluX3VubG9jaygma29yZzEyMTItPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzbmRfa29yZzEyMTJfVHVybk9uSWRsZU1vbml0b3Ioa29yZzEyMTJfdCAqa29yZzEyMTIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICB1ZGVsYXkoSU5URVJDT01NQU5EX0RFTEFZKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKyAgICAgICAga29yZzEyMTItPmlkbGVNb25pdG9yT24gPSAxOworICAgICAgICByYyA9IHNuZF9rb3JnMTIxMl9TZW5kMTIxMkNvbW1hbmQoa29yZzEyMTIsIEsxMjEyX0RCX1NlbGVjdFBsYXlNb2RlLAorCQkJCQkgIEsxMjEyX01PREVfTW9uaXRvck9uLCAwLCAwLCAwKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2tvcmcxMjEyX1R1cm5PZmZJZGxlTW9uaXRvcihrb3JnMTIxMl90ICprb3JnMTIxMikKK3sKKyAgICAgICAgaWYgKGtvcmcxMjEyLT5pZGxlTW9uaXRvck9uKSB7CisJCXNuZF9rb3JnMTIxMl9TZW5kU3RvcEFuZFdhaXQoa29yZzEyMTIpOworICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5pZGxlTW9uaXRvck9uID0gMDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMl90ICoga29yZzEyMTIsIENhcmRTdGF0ZSBjc1N0YXRlKQoreworICAgICAgICBrb3JnMTIxMi0+Y2FyZFN0YXRlID0gY3NTdGF0ZTsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfT3BlbkNhcmQoa29yZzEyMTJfdCAqIGtvcmcxMjEyKQoreworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IE9wZW5DYXJkIFslc10gJWRcbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSwga29yZzEyMTItPm9wZW5jbnQpOworI2VuZGlmCisJZG93bigma29yZzEyMTItPm9wZW5fbXV0ZXgpOworICAgICAgICBpZiAoa29yZzEyMTItPm9wZW5jbnQrKyA9PSAwKSB7CisJCXNuZF9rb3JnMTIxMl9UdXJuT2ZmSWRsZU1vbml0b3Ioa29yZzEyMTIpOworCQlzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9PUEVOKTsKKwl9CisKKwl1cCgma29yZzEyMTItPm9wZW5fbXV0ZXgpOworICAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfQ2xvc2VDYXJkKGtvcmcxMjEyX3QgKiBrb3JnMTIxMikKK3sKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBDbG9zZUNhcmQgWyVzXSAlZFxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdLCBrb3JnMTIxMi0+b3BlbmNudCk7CisjZW5kaWYKKworCWRvd24oJmtvcmcxMjEyLT5vcGVuX211dGV4KTsKKwlpZiAoLS0oa29yZzEyMTItPm9wZW5jbnQpKSB7CisJCXVwKCZrb3JnMTIxMi0+b3Blbl9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICBpZiAoa29yZzEyMTItPmNhcmRTdGF0ZSA9PSBLMTIxMl9TVEFURV9TRVRVUCkgeworICAgICAgICAgICAgICAgIHJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfU2VsZWN0UGxheU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX01PREVfU3RvcFBsYXksIDAsIDAsIDApOworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCWlmIChyYykgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogQ2xvc2VDYXJkIC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisJCWlmIChyYyAhPSBLMTIxMl9DTURSRVRfU3VjY2VzcykgeworCQkJdXAoJmtvcmcxMjEyLT5vcGVuX211dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCQl9CisgICAgICAgIH0gZWxzZSBpZiAoa29yZzEyMTItPmNhcmRTdGF0ZSA+IEsxMjEyX1NUQVRFX1NFVFVQKSB7CisJCXNuZF9rb3JnMTIxMl9TZW5kU3RvcEFuZFdhaXQoa29yZzEyMTIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtvcmcxMjEyLT5jYXJkU3RhdGUgPiBLMTIxMl9TVEFURV9SRUFEWSkgeworCQlzbmRfa29yZzEyMTJfVHVybk9uSWRsZU1vbml0b3Ioa29yZzEyMTIpOworICAgICAgICAgICAgICAgIHNuZF9rb3JnMTIxMl9zZXRDYXJkU3RhdGUoa29yZzEyMTIsIEsxMjEyX1NUQVRFX1JFQURZKTsKKwl9CisKKwl1cCgma29yZzEyMTItPm9wZW5fbXV0ZXgpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyogc3BpbmxvY2sgYWxyZWFkeSBoZWxkICovCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9TZXR1cEZvclBsYXkoa29yZzEyMTJfdCAqIGtvcmcxMjEyKQoreworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFNldHVwRm9yUGxheSBbJXNdICVkXG4iLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0sIGtvcmcxMjEyLT5zZXRjbnQpOworI2VuZGlmCisKKyAgICAgICAgaWYgKGtvcmcxMjEyLT5zZXRjbnQrKykKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfU0VUVVApOworICAgICAgICByYyA9IHNuZF9rb3JnMTIxMl9TZW5kMTIxMkNvbW1hbmQoa29yZzEyMTIsIEsxMjEyX0RCX1NlbGVjdFBsYXlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX01PREVfU2V0dXBQbGF5LCAwLCAwLCAwKTsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCWlmIChyYykgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogU2V0dXBGb3JQbGF5IC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorICAgICAgICBpZiAocmMgIT0gSzEyMTJfQ01EUkVUX1N1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KKworLyogc3BpbmxvY2sgYWxyZWFkeSBoZWxkICovCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9UcmlnZ2VyUGxheShrb3JnMTIxMl90ICoga29yZzEyMTIpCit7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogVHJpZ2dlclBsYXkgWyVzXSAlZFxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdLCBrb3JnMTIxMi0+cGxheWNudCk7CisjZW5kaWYKKworICAgICAgICBpZiAoa29yZzEyMTItPnBsYXljbnQrKykKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfUExBWUlORyk7CisgICAgICAgIHJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfVHJpZ2dlclBsYXksIDAsIDAsIDAsIDApOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJaWYgKHJjKSBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBUcmlnZ2VyUGxheSAtIFJDID0gJWQgWyVzXVxuIiwgcmMsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICBpZiAocmMgIT0gSzEyMTJfQ01EUkVUX1N1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KKworLyogc3BpbmxvY2sgYWxyZWFkeSBoZWxkICovCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9TdG9wUGxheShrb3JnMTIxMl90ICoga29yZzEyMTIpCit7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogU3RvcFBsYXkgWyVzXSAlZFxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdLCBrb3JnMTIxMi0+cGxheWNudCk7CisjZW5kaWYKKworICAgICAgICBpZiAoLS0oa29yZzEyMTItPnBsYXljbnQpKSAKKwkJcmV0dXJuIDA7CisKKwlrb3JnMTIxMi0+c2V0Y250ID0gMDsKKworICAgICAgICBpZiAoa29yZzEyMTItPmNhcmRTdGF0ZSAhPSBLMTIxMl9TVEFURV9FUlJPUlNUT1ApCisJCXNuZF9rb3JnMTIxMl9TZW5kU3RvcChrb3JnMTIxMik7CisKKwlzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9PUEVOKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9rb3JnMTIxMl9FbmFibGVDYXJkSW50ZXJydXB0cyhrb3JnMTIxMl90ICoga29yZzEyMTIpCit7CisJd3JpdGVsKFBDSV9JTlRfRU5BQkxFX0JJVCAgICAgICAgICAgIHwKKwkgICAgICAgUENJX0RPT1JCRUxMX0lOVF9FTkFCTEVfQklUICAgfAorCSAgICAgICBMT0NBTF9JTlRfRU5BQkxFX0JJVCAgICAgICAgICB8CisJICAgICAgIExPQ0FMX0RPT1JCRUxMX0lOVF9FTkFCTEVfQklUIHwKKwkgICAgICAgTE9DQUxfRE1BMV9JTlRfRU5BQkxFX0JJVCwKKwkgICAgICAga29yZzEyMTItPnN0YXR1c1JlZ1B0cik7Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX1NldE1vbml0b3JNb2RlKGtvcmcxMjEyX3QgKmtvcmcxMjEyLCBNb25pdG9yTW9kZVNlbGVjdG9yIG1vZGUpCit7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogU2V0TW9uaXRvck1vZGUgWyVzXVxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSzEyMTJfTU9OTU9ERV9PZmY6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa29yZzEyMTItPmNhcmRTdGF0ZSAhPSBLMTIxMl9TVEFURV9NT05JVE9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQlzbmRfa29yZzEyMTJfU2VuZFN0b3BBbmRXYWl0KGtvcmcxMjEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfT1BFTik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSzEyMTJfTU9OTU9ERV9PbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrb3JnMTIxMi0+Y2FyZFN0YXRlICE9IEsxMjEyX1NUQVRFX09QRU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9NT05JVE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyLCBLMTIxMl9EQl9TZWxlY3RQbGF5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzEyMTJfTU9ERV9Nb25pdG9yT24sIDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gSzEyMTJfQ01EUkVUX1N1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIG5vdCB1c2VkICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9rb3JnMTIxMl91c2VfaXNfZXhjbHVzaXZlKGtvcmcxMjEyX3QgKmtvcmcxMjEyKQoreworCWludCByZXQgPSAxOworCisJaWYgKChrb3JnMTIxMi0+cGxheWJhY2tfcGlkICE9IGtvcmcxMjEyLT5jYXB0dXJlX3BpZCkgJiYKKwkgICAgKGtvcmcxMjEyLT5wbGF5YmFja19waWQgPj0gMCkgJiYgKGtvcmcxMjEyLT5jYXB0dXJlX3BpZCA+PSAwKSkgeworCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9TZXRSYXRlKGtvcmcxMjEyX3QgKmtvcmcxMjEyLCBpbnQgcmF0ZSkKK3sKKyAgICAgICAgc3RhdGljIENsb2NrU291cmNlSW5kZXggczQ0W10gPSB7IEsxMjEyX0NMS0lEWF9BZGF0QXQ0NF8xSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0NMS0lEWF9Xb3JkQXQ0NF8xSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0NMS0lEWF9Mb2NhbEF0NDRfMUsgfTsKKyAgICAgICAgc3RhdGljIENsb2NrU291cmNlSW5kZXggczQ4W10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMTIxMl9DTEtJRFhfQWRhdEF0NDhLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzEyMTJfQ0xLSURYX1dvcmRBdDQ4SywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0NMS0lEWF9Mb2NhbEF0NDhLIH07CisgICAgICAgIGludCBwYXJtOworCisgICAgICAgIGlmICghc25kX2tvcmcxMjEyX3VzZV9pc19leGNsdXNpdmUgKGtvcmcxMjEyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocmF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6CisgICAgICAgICAgICAgICAgcGFybSA9IHM0NFtrb3JnMTIxMi0+Y2xrU291cmNlXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6CisgICAgICAgICAgICAgICAgcGFybSA9IHM0OFtrb3JnMTIxMi0+Y2xrU291cmNlXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBrb3JnMTIxMi0+Y2xrU3JjUmF0ZSA9IHBhcm07CisgICAgICAgIGtvcmcxMjEyLT5jbGtSYXRlID0gcmF0ZTsKKworCXVkZWxheShJTlRFUkNPTU1BTkRfREVMQVkpOworCXJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfU2V0Q2xvY2tTb3VyY2VSYXRlLAorCQkJCQkgIENsb2NrU291cmNlU2VsZWN0b3Jba29yZzEyMTItPmNsa1NyY1JhdGVdLAorCQkJCQkgIDAsIDAsIDApOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJaWYgKHJjKSBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBTZXQgQ2xvY2sgU291cmNlIFNlbGVjdG9yIC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9TZXRDbG9ja1NvdXJjZShrb3JnMTIxMl90ICprb3JnMTIxMiwgaW50IHNvdXJjZSkKK3sKKworICAgICAgICBpZiAoc291cmNlPDAgfHwgc291cmNlID4yKQorICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBrb3JnMTIxMi0+Y2xrU291cmNlID0gc291cmNlOworCisgICAgICAgIHNuZF9rb3JnMTIxMl9TZXRSYXRlKGtvcmcxMjEyLCBrb3JnMTIxMi0+Y2xrUmF0ZSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9rb3JnMTIxMl9EaXNhYmxlQ2FyZEludGVycnVwdHMoa29yZzEyMTJfdCAqa29yZzEyMTIpCit7CisJd3JpdGVsKDAsIGtvcmcxMjEyLT5zdGF0dXNSZWdQdHIpOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9Xcml0ZUFEQ1NlbnNpdGl2aXR5KGtvcmcxMjEyX3QgKmtvcmcxMjEyKQoreworICAgICAgICBTZW5zQml0cyAgc2Vuc1ZhbHM7CisgICAgICAgIGludCAgICAgICBiaXRQb3NpdGlvbjsKKyAgICAgICAgaW50ICAgICAgIGNoYW5uZWw7CisgICAgICAgIGludCAgICAgICBjbGtJczQ4SzsKKyAgICAgICAgaW50ICAgICAgIG1vbk1vZGVTZXQ7CisgICAgICAgIHUxNiAgICAgICBjb250cm9sVmFsdWU7ICAgIC8vIHRoaXMga2VlcHMgdGhlIGN1cnJlbnQgdmFsdWUgdG8gYmUgd3JpdHRlbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdGhlIGNhcmQncyBlZXByb20gY29udHJvbCByZWdpc3Rlci4KKyAgICAgICAgdTE2ICAgICAgIGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBXcml0ZUFEQ1NlbnNpdml0eSBbJXNdXG4iLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBpbml0aWFsaXplIHRoaW5ncy4gIFRoZSBsb2NhbCBpbml0IGJpdCBpcyBhbHdheXMgc2V0IHdoZW4gd3JpdGluZyB0byB0aGUKKyAgICAgICAgLy8gY2FyZCdzIGNvbnRyb2wgcmVnaXN0ZXIuCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgY29udHJvbFZhbHVlID0gMDsKKyAgICAgICAgU2V0Qml0SW5Xb3JkKCZjb250cm9sVmFsdWUsIFNFVF9TRU5TX0xPQ0FMSU5JVF9CSVRQT1MpOyAgICAvLyBpbml0IHRoZSBjb250cm9sIHZhbHVlCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgbm90IGluIG1vbml0b3IgbW9kZSB3aGVuIHdlIGRvIHRoaXMgdXBkYXRlLgorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlmIChrb3JnMTIxMi0+Y2FyZFN0YXRlID09IEsxMjEyX1NUQVRFX01PTklUT1IgfHwga29yZzEyMTItPmlkbGVNb25pdG9yT24pIHsKKyAgICAgICAgICAgICAgICBtb25Nb2RlU2V0ID0gMTsKKwkJc25kX2tvcmcxMjEyX1NlbmRTdG9wQW5kV2FpdChrb3JnMTIxMik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG1vbk1vZGVTZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtvcmcxMjEyLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyB3ZSBhcmUgYWJvdXQgdG8gc2VuZCBuZXcgdmFsdWVzIHRvIHRoZSBjYXJkLCBzbyBjbGVhciB0aGUgbmV3IHZhbHVlcyBxdWV1ZWQKKyAgICAgICAgLy8gZmxhZy4gIEFsc28sIGNsZWFyIG91dCBtYWlsYm94IDMsIHNvIHdlIGRvbid0IGxvY2t1cC4KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB3cml0ZWwoMCwga29yZzEyMTItPm1haWxib3gzUHRyKTsKKyAgICAgICAgdWRlbGF5KExPQURTSElGVF9ERUxBWSk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB3ZSBhcmUgcnVubmluZyBhIDQ4SyBvciA0NC4xSyBjbG9jay4gIFRoaXMgaW5mbyBpcyB1c2VkCisgICAgICAgIC8vIGxhdGVyIHdoZW4gc2V0dGluZyB0aGUgU1BESUYgRkYgYWZ0ZXIgdGhlIHZvbHVtZSBoYXMgYmVlbiBzaGlmdGVkIGluLgorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHN3aXRjaCAoa29yZzEyMTItPmNsa1NyY1JhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0NMS0lEWF9BZGF0QXQ0NF8xSzoKKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0NMS0lEWF9Xb3JkQXQ0NF8xSzoKKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0NMS0lEWF9Mb2NhbEF0NDRfMUs6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGtJczQ4SyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSzEyMTJfQ0xLSURYX1dvcmRBdDQ4SzoKKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0NMS0lEWF9BZGF0QXQ0OEs6CisgICAgICAgICAgICAgICAgY2FzZSBLMTIxMl9DTEtJRFhfTG9jYWxBdDQ4SzoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2xrSXM0OEsgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIHN0YXJ0IHRoZSB1cGRhdGUuICBTZXR1cCB0aGUgYml0IHN0cnVjdHVyZSBhbmQgdGhlbiBzaGlmdCB0aGUgYml0cy4KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBzZW5zVmFscy5sLnYubGVmdENoYW5JZCAgID0gU0VUX1NFTlNfTEVGVENIQU5JRDsKKyAgICAgICAgc2Vuc1ZhbHMuci52LnJpZ2h0Q2hhbklkICA9IFNFVF9TRU5TX1JJR0hUQ0hBTklEOworICAgICAgICBzZW5zVmFscy5sLnYubGVmdENoYW5WYWwgID0ga29yZzEyMTItPmxlZnRBRENJblNlbnM7CisgICAgICAgIHNlbnNWYWxzLnIudi5yaWdodENoYW5WYWwgPSBrb3JnMTIxMi0+cmlnaHRBRENJblNlbnM7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBub3cgc3RhcnQgc2hpZnRpbmcgdGhlIGJpdHMgaW4uICBTdGFydCB3aXRoIHRoZSBsZWZ0IGNoYW5uZWwgdGhlbiB0aGUgcmlnaHQuCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDI7IGNoYW5uZWwrKykgeworCisgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIC8vIEJyaW5nIHRoZSBsb2FkL3NoaWZ0IGxpbmUgbG93LCB0aGVuIHdhaXQgLSB0aGUgc3BlYyBzYXlzID4xNTBucyBmcm9tIGxvYWQvCisgICAgICAgICAgICAgICAgLy8gc2hpZnQgbG93IHRvIHRoZSBmaXJzdCByaXNpbmcgZWRnZSBvZiB0aGUgY2xvY2suCisgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIENsZWFyQml0SW5Xb3JkKCZjb250cm9sVmFsdWUsIFNFVF9TRU5TX0xPQURTSElGVF9CSVRQT1MpOworICAgICAgICAgICAgICAgIENsZWFyQml0SW5Xb3JkKCZjb250cm9sVmFsdWUsIFNFVF9TRU5TX0RBVEFfQklUUE9TKTsKKyAgICAgICAgICAgICAgICB3cml0ZXcoY29udHJvbFZhbHVlLCBrb3JnMTIxMi0+c2Vuc1JlZ1B0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkL3NoaWZ0IGdvZXMgbG93CisgICAgICAgICAgICAgICAgdWRlbGF5KExPQURTSElGVF9ERUxBWSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGJpdFBvc2l0aW9uID0gMTU7IGJpdFBvc2l0aW9uID49IDA7IGJpdFBvc2l0aW9uLS0pIHsgICAgICAgLy8gZm9yIGFsbCB0aGUgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vuc1ZhbHMubC5sZWZ0U2Vuc0JpdHMgJiAoMHgwMDAxIDw8IGJpdFBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEJpdEluV29yZCgmY29udHJvbFZhbHVlLCBTRVRfU0VOU19EQVRBX0JJVFBPUyk7ICAgICAvLyBkYXRhIGJpdCBzZXQgaGlnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyQml0SW5Xb3JkKCZjb250cm9sVmFsdWUsIFNFVF9TRU5TX0RBVEFfQklUUE9TKTsgICAvLyBkYXRhIGJpdCBzZXQgbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZW5zVmFscy5yLnJpZ2h0U2Vuc0JpdHMgJiAoMHgwMDAxIDw8IGJpdFBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRCaXRJbldvcmQoJmNvbnRyb2xWYWx1ZSwgU0VUX1NFTlNfREFUQV9CSVRQT1MpOyAgICAgLy8gZGF0YSBiaXQgc2V0IGhpZ2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJCaXRJbldvcmQoJmNvbnRyb2xWYWx1ZSwgU0VUX1NFTlNfREFUQV9CSVRQT1MpOyAgIC8vIGRhdGEgYml0IHNldCBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBDbGVhckJpdEluV29yZCgmY29udHJvbFZhbHVlLCBTRVRfU0VOU19DTE9DS19CSVRQT1MpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGV3KGNvbnRyb2xWYWx1ZSwga29yZzEyMTItPnNlbnNSZWdQdHIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvY2sgZ29lcyBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheShTRU5TQ0xLUFVMU0VfV0lEVEgpOworICAgICAgICAgICAgICAgICAgICAgICAgU2V0Qml0SW5Xb3JkKCZjb250cm9sVmFsdWUsIFNFVF9TRU5TX0NMT0NLX0JJVFBPUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXcoY29udHJvbFZhbHVlLCBrb3JnMTIxMi0+c2Vuc1JlZ1B0cik7ICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9jayBnb2VzIGhpZ2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheShTRU5TQ0xLUFVMU0VfV0lEVEgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAvLyBmaW5pc2ggdXAgU1BESUYgZm9yIGxlZnQuICBCcmluZyB0aGUgbG9hZC9zaGlmdCBsaW5lIGhpZ2gsIHRoZW4gd3JpdGUgYSBvbmUKKyAgICAgICAgICAgICAgICAvLyBiaXQgaWYgdGhlIGNsb2NrIHJhdGUgaXMgNDhLIG90aGVyd2lzZSB3cml0ZSAwLgorICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBDbGVhckJpdEluV29yZCgmY29udHJvbFZhbHVlLCBTRVRfU0VOU19EQVRBX0JJVFBPUyk7CisgICAgICAgICAgICAgICAgQ2xlYXJCaXRJbldvcmQoJmNvbnRyb2xWYWx1ZSwgU0VUX1NFTlNfQ0xPQ0tfQklUUE9TKTsKKyAgICAgICAgICAgICAgICBTZXRCaXRJbldvcmQoJmNvbnRyb2xWYWx1ZSwgU0VUX1NFTlNfTE9BRFNISUZUX0JJVFBPUyk7CisgICAgICAgICAgICAgICAgd3JpdGV3KGNvbnRyb2xWYWx1ZSwga29yZzEyMTItPnNlbnNSZWdQdHIpOyAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHNoaWZ0IGdvZXMgaGlnaCAtIGNsayBsb3cKKyAgICAgICAgICAgICAgICB1ZGVsYXkoU0VOU0NMS1BVTFNFX1dJRFRIKTsKKworICAgICAgICAgICAgICAgIGlmIChjbGtJczQ4SykKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldEJpdEluV29yZCgmY29udHJvbFZhbHVlLCBTRVRfU0VOU19EQVRBX0JJVFBPUyk7CisKKyAgICAgICAgICAgICAgICB3cml0ZXcoY29udHJvbFZhbHVlLCBrb3JnMTIxMi0+c2Vuc1JlZ1B0cik7ICAgICAgICAgICAgICAgICAgIC8vIHNldC9jbGVhciBkYXRhIGJpdAorICAgICAgICAgICAgICAgIHVkZWxheShPTkVfUlRDX1RJQ0spOworICAgICAgICAgICAgICAgIFNldEJpdEluV29yZCgmY29udHJvbFZhbHVlLCBTRVRfU0VOU19DTE9DS19CSVRQT1MpOworICAgICAgICAgICAgICAgIHdyaXRldyhjb250cm9sVmFsdWUsIGtvcmcxMjEyLT5zZW5zUmVnUHRyKTsgICAgICAgICAgICAgICAgICAgLy8gY2xvY2sgZ29lcyBoaWdoCisgICAgICAgICAgICAgICAgdWRlbGF5KFNFTlNDTEtQVUxTRV9XSURUSCk7CisgICAgICAgICAgICAgICAgQ2xlYXJCaXRJbldvcmQoJmNvbnRyb2xWYWx1ZSwgU0VUX1NFTlNfQ0xPQ0tfQklUUE9TKTsKKyAgICAgICAgICAgICAgICB3cml0ZXcoY29udHJvbFZhbHVlLCBrb3JnMTIxMi0+c2Vuc1JlZ1B0cik7ICAgICAgICAgICAgICAgICAgIC8vIGNsb2NrIGdvZXMgbG93CisgICAgICAgICAgICAgICAgdWRlbGF5KFNFTlNDTEtQVUxTRV9XSURUSCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFRoZSB1cGRhdGUgaXMgY29tcGxldGUuICBTZXQgYSB0aW1lb3V0LiAgVGhpcyBpcyB0aGUgaW50ZXItdXBkYXRlIGRlbGF5LgorICAgICAgICAvLyBBbHNvLCBpZiB0aGUgY2FyZCB3YXMgaW4gbW9uaXRvciBtb2RlLCByZXN0b3JlIGl0LgorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwOyBjb3VudCsrKQorICAgICAgICAgICAgICAgIHVkZWxheShTRU5TQ0xLUFVMU0VfV0lEVEgpOworCisgICAgICAgIGlmIChtb25Nb2RlU2V0KSB7CisgICAgICAgICAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyLCBLMTIxMl9EQl9TZWxlY3RQbGF5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzEyMTJfTU9ERV9Nb25pdG9yT24sIDAsIDAsIDApOworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCSAgICAgICAgaWYgKHJjKSBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBXcml0ZUFEQ1NlbnNpdml0eSAtIFJDID0gJWQgWyVzXVxuIiwgcmMsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICB9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrb3JnMTIxMi0+bG9jaywgZmxhZ3MpOworCisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzbmRfa29yZzEyMTJfT25EU1BEb3dubG9hZENvbXBsZXRlKGtvcmcxMjEyX3QgKmtvcmcxMjEyKQoreworICAgICAgICBpbnQgY2hhbm5lbDsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorICAgICAgICBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBEU1AgZG93bmxvYWQgaXMgY29tcGxldGUuIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIHRlbGwgdGhlIGNhcmQgdG8gYm9vdAorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfQm9vdEZyb21EU1BQYWdlNCwgMCwgMCwgMCwgMCk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlpZiAocmMpIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IEJvb3QgZnJvbSBQYWdlIDQgLSBSQyA9ICVkIFslc11cbiIsIHJjLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisJbWRlbGF5KERTUF9CT09UX0RFTEFZX0lOX01TKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBMZXQgdGhlIGNhcmQga25vdyB3aGVyZSBhbGwgdGhlIGJ1ZmZlcnMgYXJlLgorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByYyA9IHNuZF9rb3JnMTIxMl9TZW5kMTIxMkNvbW1hbmQoa29yZzEyMTIsCisgICAgICAgICAgICAgICAgICAgICAgICBLMTIxMl9EQl9Db25maWd1cmVCdWZmZXJNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICBMb3dlcldvcmRTd2FwKGtvcmcxMjEyLT5QbGF5RGF0YVBoeSksCisgICAgICAgICAgICAgICAgICAgICAgICBMb3dlcldvcmRTd2FwKGtvcmcxMjEyLT5SZWNEYXRhUGh5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoa051bUJ1ZmZlcnMgKiBrUGxheUJ1ZmZlckZyYW1lcykgLyAyKSwgICAvLyBzaXplIGdpdmVuIHRvIHRoZSBjYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgYmFzZWQgb24gMiBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlpZiAocmMpIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IENvbmZpZ3VyZSBCdWZmZXIgTWVtb3J5IC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIHVkZWxheShJTlRFUkNPTU1BTkRfREVMQVkpOworCisgICAgICAgIHJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0RCX0NvbmZpZ3VyZU1pc2NNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICBMb3dlcldvcmRTd2FwKGtvcmcxMjEyLT5Wb2x1bWVUYWJsZVBoeSksCisgICAgICAgICAgICAgICAgICAgICAgICBMb3dlcldvcmRTd2FwKGtvcmcxMjEyLT5Sb3V0aW5nVGFibGVQaHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTG93ZXJXb3JkU3dhcChrb3JnMTIxMi0+QWRhdFRpbWVDb2RlUGh5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgKTsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCWlmIChyYykgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogQ29uZmlndXJlIE1pc2MgTWVtb3J5IC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcm91dGluZyBhbmQgdm9sdW1lIHRhYmxlcywgdGhlbiB1cGRhdGUgdGhlIGNhcmQncyBzdGF0ZS4KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdWRlbGF5KElOVEVSQ09NTUFORF9ERUxBWSk7CisKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtBdWRpb0NoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICAgICBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2NoYW5uZWxdID0gazEyMTJNYXhWb2x1bWU7CisgICAgICAgICAgICAgICAgLy9rb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT5yb3V0ZURhdGFbY2hhbm5lbF0gPSBjaGFubmVsOworICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnJvdXRlRGF0YVtjaGFubmVsXSA9IDggKyAoY2hhbm5lbCAmIDEpOworICAgICAgICB9CisKKyAgICAgICAgc25kX2tvcmcxMjEyX1dyaXRlQURDU2Vuc2l0aXZpdHkoa29yZzEyMTIpOworCisJdWRlbGF5KElOVEVSQ09NTUFORF9ERUxBWSk7CisJcmMgPSBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyLCBLMTIxMl9EQl9TZXRDbG9ja1NvdXJjZVJhdGUsCisJCQkJCSAgQ2xvY2tTb3VyY2VTZWxlY3Rvcltrb3JnMTIxMi0+Y2xrU3JjUmF0ZV0sCisJCQkJCSAgMCwgMCwgMCk7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJaWYgKHJjKSBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBTZXQgQ2xvY2sgU291cmNlIFNlbGVjdG9yIC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisJc25kX2tvcmcxMjEyX1R1cm5PbklkbGVNb25pdG9yKGtvcmcxMjEyKTsKKwlzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9SRUFEWSk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlpZiAocmMpIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFNldCBNb25pdG9yIE9uIC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisJc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfRFNQX0NPTVBMRVRFKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNuZF9rb3JnMTIxMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgdTMyIGRvb3JiZWxsVmFsdWU7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gZGV2X2lkOworCisJaWYoaXJxICE9IGtvcmcxMjEyLT5pcnEpCisJCXJldHVybiBJUlFfTk9ORTsKKworICAgICAgICBkb29yYmVsbFZhbHVlID0gcmVhZGwoa29yZzEyMTItPmluRG9vcmJlbGxQdHIpOworCisgICAgICAgIGlmICghZG9vcmJlbGxWYWx1ZSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZrb3JnMTIxMi0+bG9jayk7CisKKwl3cml0ZWwoZG9vcmJlbGxWYWx1ZSwga29yZzEyMTItPmluRG9vcmJlbGxQdHIpOworCisgICAgICAgIGtvcmcxMjEyLT5pcnFjb3VudCsrOworCisJa29yZzEyMTItPmluSVJRKys7CisKKworICAgICAgICBzd2l0Y2ggKGRvb3JiZWxsVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0RCX0RTUERvd25sb2FkRG9uZToKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IElSUSBETkxEIGNvdW50IC0gJWxkLCAleCwgWyVzXS5cbiIsIGtvcmcxMjEyLT5pcnFjb3VudCwgZG9vcmJlbGxWYWx1ZSwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtvcmcxMjEyLT5jYXJkU3RhdGUgPT0gSzEyMTJfU1RBVEVfRFNQX0lOX1BST0NFU1MpIHsKKwkJCQlrb3JnMTIxMi0+ZHNwX2lzX2xvYWRlZCA9IDE7CisJCQkJd2FrZV91cCgma29yZzEyMTItPndhaXQpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAvLyBhbiBlcnJvciBvY2N1cnJlZCAtIHN0b3AgdGhlIGNhcmQKKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBjYXNlIEsxMjEyX0RCX0RNQUVSUk9SOgorI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMQorICAgICAgICAgICAgICAgICAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogSVJRIERNQUUgY291bnQgLSAlbGQsICV4LCBbJXNdLlxuIiwga29yZzEyMTItPmlycWNvdW50LCBkb29yYmVsbFZhbHVlLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogRE1BIEVycm9yXG4iKTsJCisJCQlrb3JnMTIxMi0+ZXJyb3JjbnQrKzsKKwkJCWtvcmcxMjEyLT50b3RhbGVycm9yY250Kys7CisJCQlrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT5jYXJkQ29tbWFuZCA9IDA7CisJCQlzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9FUlJPUlNUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FyZCBoYXMgc3RvcHBlZCBieSBvdXIgcmVxdWVzdC4gIENsZWFyIHRoZSBjb21tYW5kIHdvcmQgYW5kIHNpZ25hbAorICAgICAgICAgICAgICAgIC8vIHRoZSBzZW1hcGhvcmUgaW4gY2FzZSBzb21lb25lIGlzIHdhaXRpbmcgZm9yIHRoaXMuCisgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgY2FzZSBLMTIxMl9EQl9DQVJEU1RPUFBFRDoKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IElSUSBDU1RQIGNvdW50IC0gJWxkLCAleCwgWyVzXS5cbiIsIGtvcmcxMjEyLT5pcnFjb3VudCwgZG9vcmJlbGxWYWx1ZSwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCQkJa29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+Y2FyZENvbW1hbmQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMworICAgICAgICAgICAgICAgICAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogSVJRIERGTFQgY291bnQgLSAlbGQsICV4LCBjcG9zPSVkIFslc10uXG4iLCBrb3JnMTIxMi0+aXJxY291bnQsIGRvb3JiZWxsVmFsdWUsIAorCQkJCWtvcmcxMjEyLT5jdXJyZW50QnVmZmVyLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGtvcmcxMjEyLT5jYXJkU3RhdGUgPiBLMTIxMl9TVEFURV9TRVRVUCkgfHwga29yZzEyMTItPmlkbGVNb25pdG9yT24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga29yZzEyMTItPmN1cnJlbnRCdWZmZXIrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa29yZzEyMTItPmN1cnJlbnRCdWZmZXIgPj0ga051bUJ1ZmZlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga29yZzEyMTItPmN1cnJlbnRCdWZmZXIgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha29yZzEyMTItPnJ1bm5pbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtvcmcxMjEyLT5jYXB0dXJlX3N1YnN0cmVhbSkgeworCQkJCQlzcGluX3VubG9jaygma29yZzEyMTItPmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQoa29yZzEyMTItPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwkJCQkJc3Bpbl9sb2NrKCZrb3JnMTIxMi0+bG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa29yZzEyMTItPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQkJCQlzcGluX3VubG9jaygma29yZzEyMTItPmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQoa29yZzEyMTItPnBsYXliYWNrX3N1YnN0cmVhbSk7CisJCQkJCXNwaW5fbG9jaygma29yZzEyMTItPmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJa29yZzEyMTItPmluSVJRLS07CisKKwlzcGluX3VubG9jaygma29yZzEyMTItPmxvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9kb3dubG9hZERTUENvZGUoa29yZzEyMTJfdCAqa29yZzEyMTIpCit7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogRFNQIGRvd25sb2FkIGlzIHN0YXJ0aW5nLi4uIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBzdGF0ZSBvZiB0aGUgY2FyZCBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlmIChrb3JnMTIxMi0+Y2FyZFN0YXRlID49IEsxMjEyX1NUQVRFX0RTUF9JTl9QUk9DRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9EU1BfSU5fUFJPQ0VTUyk7CisKKyAgICAgICAgbWVtY3B5KGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGRzcENvZGUsIGtvcmcxMjEyLT5kc3BDb2RlU2l6ZSk7CisKKyAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyLCBLMTIxMl9EQl9TdGFydERTUERvd25sb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwcGVyV29yZFN3YXAoa29yZzEyMTItPmRtYV9kc3AuYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlpZiAocmMpIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFN0YXJ0IERTUCBEb3dubG9hZCBSQyA9ICVkIFslc11cbiIsIHJjLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisKKwlrb3JnMTIxMi0+ZHNwX2lzX2xvYWRlZCA9IDA7CisJd2FpdF9ldmVudF90aW1lb3V0KGtvcmcxMjEyLT53YWl0LCBrb3JnMTIxMi0+ZHNwX2lzX2xvYWRlZCwgSFogKiBDQVJEX0JPT1RfVElNRU9VVCk7CisJaWYgKCEga29yZzEyMTItPmRzcF9pc19sb2FkZWQgKQorCQlyZXR1cm4gLUVCVVNZOyAvKiB0aW1lb3V0ICovCisKKwlzbmRfa29yZzEyMTJfT25EU1BEb3dubG9hZENvbXBsZXRlKGtvcmcxMjEyKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfa29yZzEyMTJfcGxheWJhY2tfaW5mbyA9Cit7CisJLmluZm8gPSAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCksCisJLmZvcm1hdHMgPQkgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKyAgICAgICAgLnJhdGVzID0gICAgICAgICAgICAgIChTTkRSVl9QQ01fUkFURV80NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCksCisgICAgICAgIC5yYXRlX21pbiA9ICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgLnJhdGVfbWF4ID0gICAgICAgICAgIDQ4MDAwLAorICAgICAgICAuY2hhbm5lbHNfbWluID0gICAgICAgSzEyMTJfTUlOX0NIQU5ORUxTLAorICAgICAgICAuY2hhbm5lbHNfbWF4ID0gICAgICAgSzEyMTJfTUFYX0NIQU5ORUxTLAorICAgICAgICAuYnVmZmVyX2J5dGVzX21heCA9ICAgSzEyMTJfTUFYX0JVRl9TSVpFLAorICAgICAgICAucGVyaW9kX2J5dGVzX21pbiA9ICAgSzEyMTJfTUlOX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzLAorICAgICAgICAucGVyaW9kX2J5dGVzX21heCA9ICAgSzEyMTJfTUFYX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzLAorICAgICAgICAucGVyaW9kc19taW4gPSAgICAgICAgSzEyMTJfUEVSSU9EUywKKyAgICAgICAgLnBlcmlvZHNfbWF4ID0gICAgICAgIEsxMjEyX1BFUklPRFMsCisgICAgICAgIC5maWZvX3NpemUgPSAgICAgICAgICAwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfa29yZzEyMTJfY2FwdHVyZV9pbmZvID0KK3sKKyAgICAgICAgLmluZm8gPSAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCksCisgICAgICAgIC5mb3JtYXRzID0JICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisgICAgICAgIC5yYXRlcyA9CSAgICAgIChTTkRSVl9QQ01fUkFURV80NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCksCisgICAgICAgIC5yYXRlX21pbiA9ICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgLnJhdGVfbWF4ID0gICAgICAgICAgIDQ4MDAwLAorICAgICAgICAuY2hhbm5lbHNfbWluID0gICAgICAgSzEyMTJfTUlOX0NIQU5ORUxTLAorICAgICAgICAuY2hhbm5lbHNfbWF4ID0gICAgICAgSzEyMTJfTUFYX0NIQU5ORUxTLAorICAgICAgICAuYnVmZmVyX2J5dGVzX21heCA9ICAgSzEyMTJfTUFYX0JVRl9TSVpFLAorICAgICAgICAucGVyaW9kX2J5dGVzX21pbiA9ICAgSzEyMTJfTUlOX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzLAorICAgICAgICAucGVyaW9kX2J5dGVzX21heCA9ICAgSzEyMTJfTUFYX0NIQU5ORUxTICogMiAqIGtQbGF5QnVmZmVyRnJhbWVzLAorICAgICAgICAucGVyaW9kc19taW4gPSAgICAgICAgSzEyMTJfUEVSSU9EUywKKyAgICAgICAgLnBlcmlvZHNfbWF4ID0gICAgICAgIEsxMjEyX1BFUklPRFMsCisgICAgICAgIC5maWZvX3NpemUgPSAgICAgICAgICAwLAorfTsKKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfc2lsZW5jZShrb3JnMTIxMl90ICprb3JnMTIxMiwgaW50IHBvcywgaW50IGNvdW50LCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlLb3JnQXVkaW9GcmFtZSAqIGRzdCA9ICBrb3JnMTIxMi0+cGxheURhdGFCdWZzUHRyWzBdLmJ1ZmZlckRhdGEgKyBwb3M7CisJaW50IGk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDIKKwlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfc2lsZW5jZSBwb3M9JWQgb2Zmc2V0PSVkIHNpemU9JWQgY291bnQ9JWRcbiIsIHBvcywgb2Zmc2V0LCBzaXplLCBjb3VudCk7CisjZW5kaWYKKwlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IEsxMjEyX01BWF9TQU1QTEVTLCByZXR1cm4gLUVJTlZBTCk7CisKKwlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJaWYgKCAodm9pZCAqKSBkc3QgPCAodm9pZCAqKSBrb3JnMTIxMi0+cGxheURhdGFCdWZzUHRyIHx8CisJCSAgICAgKHZvaWQgKikgZHN0ID4gKHZvaWQgKikga29yZzEyMTItPnBsYXlEYXRhQnVmc1B0cls4XS5idWZmZXJEYXRhICkgeworCQkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX3NpbGVuY2UgS0VSTkVMIEVGQVVMVCBkc3Q9JXAgaXRlcj0lZFxuIiwgZHN0LCBpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisjZW5kaWYKKwkJbWVtc2V0KCh2b2lkKikgZHN0ICsgb2Zmc2V0LCAwLCBzaXplKTsKKwkJZHN0Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvcHlfdG8oa29yZzEyMTJfdCAqa29yZzEyMTIsIHZvaWQgX191c2VyICpkc3QsIGludCBwb3MsIGludCBjb3VudCwgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJS29yZ0F1ZGlvRnJhbWUgKiBzcmMgPSAga29yZzEyMTItPnJlY29yZERhdGFCdWZzUHRyWzBdLmJ1ZmZlckRhdGEgKyBwb3M7CisJaW50IGksIHJjOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAyCisJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2NvcHlfdG8gcG9zPSVkIG9mZnNldD0lZCBzaXplPSVkXG4iLCBwb3MsIG9mZnNldCwgc2l6ZSk7CisjZW5kaWYKKwlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IEsxMjEyX01BWF9TQU1QTEVTLCByZXR1cm4gLUVJTlZBTCk7CisKKwlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJaWYgKCAodm9pZCAqKSBzcmMgPCAodm9pZCAqKSBrb3JnMTIxMi0+cmVjb3JkRGF0YUJ1ZnNQdHIgfHwKKwkJICAgICAodm9pZCAqKSBzcmMgPiAodm9pZCAqKSBrb3JnMTIxMi0+cmVjb3JkRGF0YUJ1ZnNQdHJbOF0uYnVmZmVyRGF0YSApIHsKKwkJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9jb3B5X3RvIEtFUk5FTCBFRkFVTFQsIHNyYz0lcCBkc3Q9JXAgaXRlcj0lZFxuIiwgc3JjLCBkc3QsIGkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKyNlbmRpZgorCQlyYyA9IGNvcHlfdG9fdXNlcihkc3QgKyBvZmZzZXQsIHNyYywgc2l6ZSk7CisJCWlmIChyYykgeworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCQkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2NvcHlfdG8gVVNFUiBFRkFVTFQgc3JjPSVwIGRzdD0lcCBpdGVyPSVkXG4iLCBzcmMsIGRzdCwgaSk7CisjZW5kaWYKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXNyYysrOworCQlkc3QgKz0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY29weV9mcm9tKGtvcmcxMjEyX3QgKmtvcmcxMjEyLCB2b2lkIF9fdXNlciAqc3JjLCBpbnQgcG9zLCBpbnQgY291bnQsIGludCBvZmZzZXQsIGludCBzaXplKQoreworCUtvcmdBdWRpb0ZyYW1lICogZHN0ID0gIGtvcmcxMjEyLT5wbGF5RGF0YUJ1ZnNQdHJbMF0uYnVmZmVyRGF0YSArIHBvczsKKwlpbnQgaSwgcmM7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDIKKwlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfY29weV9mcm9tIHBvcz0lZCBvZmZzZXQ9JWQgc2l6ZT0lZCBjb3VudD0lZFxuIiwgcG9zLCBvZmZzZXQsIHNpemUsIGNvdW50KTsKKyNlbmRpZgorCisJc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBLMTIxMl9NQVhfU0FNUExFUywgcmV0dXJuIC1FSU5WQUwpOworCisJZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCWlmICggKHZvaWQgKikgZHN0IDwgKHZvaWQgKikga29yZzEyMTItPnBsYXlEYXRhQnVmc1B0ciB8fAorCQkgICAgICh2b2lkICopIGRzdCA+ICh2b2lkICopIGtvcmcxMjEyLT5wbGF5RGF0YUJ1ZnNQdHJbOF0uYnVmZmVyRGF0YSApIHsKKwkJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9jb3B5X2Zyb20gS0VSTkVMIEVGQVVMVCwgc3JjPSVwIGRzdD0lcCBpdGVyPSVkXG4iLCBzcmMsIGRzdCwgaSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorI2VuZGlmCisJCXJjID0gY29weV9mcm9tX3VzZXIoKHZvaWQqKSBkc3QgKyBvZmZzZXQsIHNyYywgc2l6ZSk7CisJCWlmIChyYykgeworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCQkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2NvcHlfZnJvbSBVU0VSIEVGQVVMVCBzcmM9JXAgZHN0PSVwIGl0ZXI9JWRcbiIsIHNyYywgZHN0LCBpKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZHN0Kys7CisJCXNyYyArPSBzaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfa29yZzEyMTJfZnJlZV9wY20oc25kX3BjbV90ICpwY20pCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gKGtvcmcxMjEyX3QgKikgcGNtLT5wcml2YXRlX2RhdGE7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2ZyZWVfcGNtIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICBrb3JnMTIxMi0+cGNtID0gTlVMTDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworICAgICAgICBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCQlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BlbiBbJXNdXG4iLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisKKyAgICAgICAgc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOyAgICAvLyA/Pz8KKworCXNuZF9rb3JnMTIxMl9PcGVuQ2FyZChrb3JnMTIxMik7CisKKyAgICAgICAgcnVudGltZS0+aHcgPSBzbmRfa29yZzEyMTJfcGxheWJhY2tfaW5mbzsKKwlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZrb3JnMTIxMi0+ZG1hX3BsYXkpOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZrb3JnMTIxMi0+bG9jaywgZmxhZ3MpOworCisgICAgICAgIGtvcmcxMjEyLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJa29yZzEyMTItPnBsYXliYWNrX3BpZCA9IGN1cnJlbnQtPnBpZDsKKyAgICAgICAga29yZzEyMTItPnBlcmlvZHNpemUgPSBLMTIxMl9QRVJJT0RTOworCWtvcmcxMjEyLT5jaGFubmVscyA9IEsxMjEyX0NIQU5ORUxTOworCWtvcmcxMjEyLT5lcnJvcmNudCA9IDA7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworICAgICAgICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwga1BsYXlCdWZmZXJGcmFtZXMsIGtQbGF5QnVmZmVyRnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAga29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisgICAgICAgIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9jYXB0dXJlX29wZW4gWyVzXVxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIHNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKworCXNuZF9rb3JnMTIxMl9PcGVuQ2FyZChrb3JnMTIxMik7CisKKyAgICAgICAgcnVudGltZS0+aHcgPSBzbmRfa29yZzEyMTJfY2FwdHVyZV9pbmZvOworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJmtvcmcxMjEyLT5kbWFfcmVjKTsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworICAgICAgICBrb3JnMTIxMi0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJa29yZzEyMTItPmNhcHR1cmVfcGlkID0gY3VycmVudC0+cGlkOworICAgICAgICBrb3JnMTIxMi0+cGVyaW9kc2l6ZSA9IEsxMjEyX1BFUklPRFM7CisJa29yZzEyMTItPmNoYW5uZWxzID0gSzEyMTJfQ0hBTk5FTFM7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworICAgICAgICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwga1BsYXlCdWZmZXJGcmFtZXMsIGtQbGF5QnVmZmVyRnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX3BsYXliYWNrX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAga29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX3BsYXliYWNrX2Nsb3NlIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworCXNuZF9rb3JnMTIxMl9zaWxlbmNlKGtvcmcxMjEyLCAwLCBLMTIxMl9NQVhfU0FNUExFUywgMCwga29yZzEyMTItPmNoYW5uZWxzICogMik7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmtvcmcxMjEyLT5sb2NrLCBmbGFncyk7CisKKwlrb3JnMTIxMi0+cGxheWJhY2tfcGlkID0gLTE7CisgICAgICAgIGtvcmcxMjEyLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworICAgICAgICBrb3JnMTIxMi0+cGVyaW9kc2l6ZSA9IDA7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworCXNuZF9rb3JnMTIxMl9DbG9zZUNhcmQoa29yZzEyMTIpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9jYXB0dXJlX2Nsb3NlIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworCWtvcmcxMjEyLT5jYXB0dXJlX3BpZCA9IC0xOworICAgICAgICBrb3JnMTIxMi0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBOVUxMOworICAgICAgICBrb3JnMTIxMi0+cGVyaW9kc2l6ZSA9IDA7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworCXNuZF9rb3JnMTIxMl9DbG9zZUNhcmQoa29yZzEyMTIpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfaW9jdGwoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9pb2N0bDogY21kPSVkXG4iLCBjbWQpOworI2VuZGlmCisKKwlpZiAoY21kID09IFNORFJWX1BDTV9JT0NUTDFfQ0hBTk5FTF9JTkZPICkgeworCQlzbmRfcGNtX2NoYW5uZWxfaW5mb190ICppbmZvID0gYXJnOworICAgICAgICAJaW5mby0+b2Zmc2V0ID0gMDsKKyAgICAgICAgCWluZm8tPmZpcnN0ID0gaW5mby0+Y2hhbm5lbCAqIDE2OworICAgICAgICAJaW5mby0+c3RlcCA9IDI1NjsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogY2hhbm5lbF9pbmZvICVkOiwgb2Zmc2V0PSVsZCwgZmlyc3Q9JWQsIHN0ZXA9JWRcbiIsIGluZm8tPmNoYW5uZWwsIGluZm8tPm9mZnNldCwgaW5mby0+Zmlyc3QsIGluZm8tPnN0ZXApOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworICAgICAgICByZXR1cm4gc25kX3BjbV9saWJfaW9jdGwoc3Vic3RyZWFtLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcykKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAga29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisgICAgICAgIGludCBlcnI7CisJcGlkX3QgdGhpc19waWQ7CisJcGlkX3Qgb3RoZXJfcGlkOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9od19wYXJhbXMgWyVzXVxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZrb3JnMTIxMi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJdGhpc19waWQgPSBrb3JnMTIxMi0+cGxheWJhY2tfcGlkOworCQlvdGhlcl9waWQgPSBrb3JnMTIxMi0+Y2FwdHVyZV9waWQ7CisJfSBlbHNlIHsKKwkJdGhpc19waWQgPSBrb3JnMTIxMi0+Y2FwdHVyZV9waWQ7CisJCW90aGVyX3BpZCA9IGtvcmcxMjEyLT5wbGF5YmFja19waWQ7CisJfQorCisJaWYgKChvdGhlcl9waWQgPiAwKSAmJiAodGhpc19waWQgIT0gb3RoZXJfcGlkKSkgeworCisJCS8qIFRoZSBvdGhlciBzdHJlYW0gaXMgb3BlbiwgYW5kIG5vdCBieSB0aGUgc2FtZQorCQkgICB0YXNrIGFzIHRoaXMgb25lLiBNYWtlIHN1cmUgdGhhdCB0aGUgcGFyYW1ldGVycworCQkgICB0aGF0IG1hdHRlciBhcmUgdGhlIHNhbWUuCisJCSAqLworCisJCWlmICgoaW50KXBhcmFtc19yYXRlKHBhcmFtcykgIT0ga29yZzEyMTItPmNsa1JhdGUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtvcmcxMjEyLT5sb2NrLCBmbGFncyk7CisJCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworICAgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKwkgICAgICAgIHJldHVybiAwOworCX0KKworICAgICAgICBpZiAoKGVyciA9IHNuZF9rb3JnMTIxMl9TZXRSYXRlKGtvcmcxMjEyLCBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKwlrb3JnMTIxMi0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKyAgICAgICAga29yZzEyMTItPnBlcmlvZHNpemUgPSBLMTIxMl9QRVJJT0RfQllURVM7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma29yZzEyMTItPmxvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCByYzsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorCQlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfcHJlcGFyZSBbJXNdXG4iLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIGFjayEgKi8KKwlpZiAoa29yZzEyMTItPnN0b3BfcGVuZGluZ19jbnQgPiAwKSB7CisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9wcmVwYXJlIC0gU3RvcCBpcyBwZW5kaW5nLi4uIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKyAgICAgICAgCXNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCQlyZXR1cm4gLUVBR0FJTjsKKwkJLyoKKwkJa29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+Y2FyZENvbW1hbmQgPSAwOworCQlkZWxfdGltZXIoJmtvcmcxMjEyLT50aW1lcik7CisJCWtvcmcxMjEyLT5zdG9wX3BlbmRpbmdfY250ID0gMDsKKwkJKi8KKwl9CisKKyAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfU2V0dXBGb3JQbGF5KGtvcmcxMjEyKTsKKworICAgICAgICBrb3JnMTIxMi0+Y3VycmVudEJ1ZmZlciA9IDA7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisKKwlyZXR1cm4gcmMgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21kKQoreworICAgICAgICBrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgcmM7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwkJSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX3RyaWdnZXIgWyVzXSBjbWQ9JWRcbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSwgY21kKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZrb3JnMTIxMi0+bG9jayk7CisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKy8qCisJCQlpZiAoa29yZzEyMTItPnJ1bm5pbmcpIHsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDEKKwkJCQlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfdHJpZ2dlcjogQWxyZWFkeSBydW5uaW5nP1xuIik7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKyovCisgICAgICAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+cnVubmluZysrOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfVHJpZ2dlclBsYXkoa29yZzEyMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisvKgorCQkJaWYgKCFrb3JnMTIxMi0+cnVubmluZykgeworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMQorCQkJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl90cmlnZ2VyOiBBbHJlYWR5IHN0b3BwZWQ/XG4iKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJfQorKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5ydW5uaW5nLS07CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHNuZF9rb3JnMTIxMl9TdG9wUGxheShrb3JnMTIxMik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisJCQlyYyA9IDE7CisJCQlicmVhazsKKyAgICAgICAgfQorCXNwaW5fdW5sb2NrKCZrb3JnMTIxMi0+bG9jayk7CisgICAgICAgIHJldHVybiByYyA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2tvcmcxMjEyX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworICAgICAgICBrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKyAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zOworCisJcG9zID0ga29yZzEyMTItPmN1cnJlbnRCdWZmZXIgKiBrUGxheUJ1ZmZlckZyYW1lczsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMgorCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9wbGF5YmFja19wb2ludGVyIFslc10gJWxkXG4iLCAKKwkJCXN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSwgcG9zKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfa29yZzEyMTJfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyAgICAgICAga29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisgICAgICAgIHNuZF9wY21fdWZyYW1lc190IHBvczsKKworCXBvcyA9IGtvcmcxMjEyLT5jdXJyZW50QnVmZmVyICoga1BsYXlCdWZmZXJGcmFtZXM7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDIKKwlLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBzbmRfa29yZzEyMTJfY2FwdHVyZV9wb2ludGVyIFslc10gJWxkXG4iLAorCQkJc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdLCBwb3MpOworI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfcGxheWJhY2tfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAyCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9wbGF5YmFja19jb3B5IFslc10gJWxkICVsZFxuIiwgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdLCBwb3MsIGNvdW50KTsKKyNlbmRpZgorIAorCXJldHVybiBzbmRfa29yZzEyMTJfY29weV9mcm9tKGtvcmcxMjEyLCBzcmMsIHBvcywgY291bnQsIDAsIGtvcmcxMjEyLT5jaGFubmVscyAqIDIpOworCit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX3BsYXliYWNrX3NpbGVuY2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsIC8qIG5vdCB1c2VkIChpbnRlcmxlYXZlZCBkYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9wbGF5YmFja19zaWxlbmNlIFslc11cbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworCXJldHVybiBzbmRfa29yZzEyMTJfc2lsZW5jZShrb3JnMTIxMiwgcG9zLCBjb3VudCwgMCwga29yZzEyMTItPmNoYW5uZWxzICogMik7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NhcHR1cmVfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAyCisJCUsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IHNuZF9rb3JnMTIxMl9jYXB0dXJlX2NvcHkgWyVzXSAlbGQgJWxkXG4iLCBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0sIHBvcywgY291bnQpOworI2VuZGlmCisKKwlyZXR1cm4gc25kX2tvcmcxMjEyX2NvcHlfdG8oa29yZzEyMTIsIGRzdCwgcG9zLCBjb3VudCwgMCwga29yZzEyMTItPmNoYW5uZWxzICogMik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9rb3JnMTIxMl9wbGF5YmFja19vcHMgPSB7CisgICAgICAgIC5vcGVuID0JCXNuZF9rb3JnMTIxMl9wbGF5YmFja19vcGVuLAorICAgICAgICAuY2xvc2UgPQlzbmRfa29yZzEyMTJfcGxheWJhY2tfY2xvc2UsCisgICAgICAgIC5pb2N0bCA9CXNuZF9rb3JnMTIxMl9pb2N0bCwKKyAgICAgICAgLmh3X3BhcmFtcyA9CXNuZF9rb3JnMTIxMl9od19wYXJhbXMsCisgICAgICAgIC5wcmVwYXJlID0Jc25kX2tvcmcxMjEyX3ByZXBhcmUsCisgICAgICAgIC50cmlnZ2VyID0Jc25kX2tvcmcxMjEyX3RyaWdnZXIsCisgICAgICAgIC5wb2ludGVyID0Jc25kX2tvcmcxMjEyX3BsYXliYWNrX3BvaW50ZXIsCisgICAgICAgIC5jb3B5ID0JCXNuZF9rb3JnMTIxMl9wbGF5YmFja19jb3B5LAorICAgICAgICAuc2lsZW5jZSA9CXNuZF9rb3JnMTIxMl9wbGF5YmFja19zaWxlbmNlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX2tvcmcxMjEyX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9rb3JnMTIxMl9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2tvcmcxMjEyX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX2tvcmcxMjEyX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfa29yZzEyMTJfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX2tvcmcxMjEyX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfa29yZzEyMTJfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9rb3JnMTIxMl9jYXB0dXJlX3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX2tvcmcxMjEyX2NhcHR1cmVfY29weSwKK307CisKKy8qCisgKiBDb250cm9sIEludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfcGhhc2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj0gOCkgPyAyIDogMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY29udHJvbF9waGFzZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdSkKK3sKKwlrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJc3Bpbl9sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBrb3JnMTIxMi0+dm9sdW1lUGhhc2VbaV07CisKKwlpZiAoaSA+PSA4KQorICAgICAgICAJdS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGtvcmcxMjEyLT52b2x1bWVQaGFzZVtpKzFdOworCisJc3Bpbl91bmxvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfcGhhc2VfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnUpCit7CisJa29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIGludCBjaGFuZ2UgPSAwOworICAgICAgICBpbnQgaSwgdmFsOworCisJc3Bpbl9sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisJaSA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJa29yZzEyMTItPnZvbHVtZVBoYXNlW2ldID0gdS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXZhbCA9IGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnZvbHVtZURhdGFba2NvbnRyb2wtPnByaXZhdGVfdmFsdWVdOworCisJaWYgKCh1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID4gMCkgIT0gKHZhbCA8IDApKSB7CisJCXZhbCA9IGFicyh2YWwpICogKGtvcmcxMjEyLT52b2x1bWVQaGFzZVtpXSA+IDAgPyAtMSA6IDEpOworCQlrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2ldID0gdmFsOworCQljaGFuZ2UgPSAxOworCX0KKworCWlmIChpID49IDgpIHsKKwkJa29yZzEyMTItPnZvbHVtZVBoYXNlW2krMV0gPSB1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCisJCXZhbCA9IGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnZvbHVtZURhdGFba2NvbnRyb2wtPnByaXZhdGVfdmFsdWUrMV07CisKKwkJaWYgKCh1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID4gMCkgIT0gKHZhbCA8IDApKSB7CisJCQl2YWwgPSBhYnModmFsKSAqIChrb3JnMTIxMi0+dm9sdW1lUGhhc2VbaSsxXSA+IDAgPyAtMSA6IDEpOworCQkJa29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+dm9sdW1lRGF0YVtpKzFdID0gdmFsOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisgICAgICAgIHVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PSA4KSA/IDIgOiAxOworICAgICAgICB1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSBrMTIxMk1pblZvbHVtZTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBrMTIxMk1heFZvbHVtZTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCWtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworICAgICAgICBpbnQgaTsKKworCXNwaW5fbG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKworCWkgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKyAgICAgICAgdS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGFicyhrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2ldKTsKKworCWlmIChpID49IDgpIAorICAgICAgICAgICAgICAgIHUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhYnMoa29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+dm9sdW1lRGF0YVtpKzFdKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY29udHJvbF92b2x1bWVfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnUpCit7CisJa29yZzEyMTJfdCAqa29yZzEyMTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIGludCBjaGFuZ2UgPSAwOworICAgICAgICBpbnQgaTsKKwlpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisJaSA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJaWYgKHUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gYWJzKGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnZvbHVtZURhdGFbaV0pKSB7CisJCXZhbCA9IGtvcmcxMjEyLT52b2x1bWVQaGFzZVtpXSA+IDAgPyAtMSA6IDE7CisJCXZhbCAqPSB1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2ldID0gdmFsOworCQljaGFuZ2UgPSAxOworCX0KKworCWlmIChpID49IDgpIHsKKwkJaWYgKHUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gIT0gYWJzKGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnZvbHVtZURhdGFbaSsxXSkpIHsKKwkJCXZhbCA9IGtvcmcxMjEyLT52b2x1bWVQaGFzZVtpKzFdID4gMCA/IC0xIDogMTsKKwkJCXZhbCAqPSB1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQkJa29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+dm9sdW1lRGF0YVtpKzFdID0gdmFsOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfcm91dGVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj0gOCkgPyAyIDogMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGtBdWRpb0NoYW5uZWxzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4ga0F1ZGlvQ2hhbm5lbHMtMSkgeworCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0ga0F1ZGlvQ2hhbm5lbHMtMTsKKwl9CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGNoYW5uZWxOYW1lW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY29udHJvbF9yb3V0ZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdSkKK3sKKwlrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKyAgICAgICAgaW50IGk7CisKKwlzcGluX2xvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisKKwlpID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0ga29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+cm91dGVEYXRhW2ldOworCisJaWYgKGkgPj0gOCkgCisJCXUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnJvdXRlRGF0YVtpKzFdOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9jb250cm9sX3JvdXRlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCWtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworICAgICAgICBpbnQgY2hhbmdlID0gMCwgaTsKKworCXNwaW5fbG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKworCWkgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmICh1LT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gIT0gKHVuc2lnbmVkKSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2ldKSB7CisJCWtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnJvdXRlRGF0YVtpXSA9IHUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwkJY2hhbmdlID0gMTsKKwl9CisKKwlpZiAoaSA+PSA4KSB7CisJCWlmICh1LT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gIT0gKHVuc2lnbmVkKSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT52b2x1bWVEYXRhW2krMV0pIHsKKwkJCWtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPnJvdXRlRGF0YVtpKzFdID0gdS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdOworCQkJY2hhbmdlID0gMTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisgICAgICAgIHVpbmZvLT5jb3VudCA9IDI7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IGsxMjEyTWF4QURDU2VuczsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBrMTIxMk1pbkFEQ1NlbnM7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9jb250cm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCWtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBrb3JnMTIxMi0+bGVmdEFEQ0luU2VuczsKKyAgICAgICAgdS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGtvcmcxMjEyLT5yaWdodEFEQ0luU2VuczsKKworCXNwaW5fdW5sb2NrX2lycSgma29yZzEyMTItPmxvY2spOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9rb3JnMTIxMl9jb250cm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCWtvcmcxMjEyX3QgKmtvcmcxMjEyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworICAgICAgICBpbnQgY2hhbmdlID0gMDsKKworCXNwaW5fbG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKworICAgICAgICBpZiAodS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSBrb3JnMTIxMi0+bGVmdEFEQ0luU2VucykgeworICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5sZWZ0QURDSW5TZW5zID0gdS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKyAgICAgICAgICAgICAgICBjaGFuZ2UgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICh1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICE9IGtvcmcxMjEyLT5yaWdodEFEQ0luU2VucykgeworICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5yaWdodEFEQ0luU2VucyA9IHUtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisgICAgICAgICAgICAgICAgY2hhbmdlID0gMTsKKyAgICAgICAgfQorCisJc3Bpbl91bmxvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisKKyAgICAgICAgaWYgKGNoYW5nZSkKKyAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfV3JpdGVBRENTZW5zaXRpdml0eShrb3JnMTIxMik7CisKKyAgICAgICAgcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfY29udHJvbF9zeW5jX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAyKSB7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOworCX0KKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgY2xvY2tTb3VyY2VUeXBlTmFtZVt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfc3luY19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNwaW5fbG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBrb3JnMTIxMi0+Y2xrU291cmNlOworCisJc3Bpbl91bmxvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2tvcmcxMjEyX2NvbnRyb2xfc3luY19wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlrb3JnMTIxMl90ICprb3JnMTIxMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICUgMzsKKwlzcGluX2xvY2tfaXJxKCZrb3JnMTIxMi0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IGtvcmcxMjEyLT5jbGtTb3VyY2U7CisgICAgICAgIHNuZF9rb3JnMTIxMl9TZXRDbG9ja1NvdXJjZShrb3JnMTIxMiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmtvcmcxMjEyLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIE1PTl9NSVhFUihvcmQsY19uYW1lKQkJCQkJCQkJCVwKKyAgICAgICAgewkJCQkJCQkJCQkJXAorICAgICAgICAgICAgICAgIC5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSwJXAorICAgICAgICAgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJCQkJCVwKKyAgICAgICAgICAgICAgICAubmFtZSA9CQljX25hbWUgIiBNb25pdG9yIFZvbHVtZSIsCQkJCQlcCisgICAgICAgICAgICAgICAgLmluZm8gPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfdm9sdW1lX2luZm8sCQkJCVwKKyAgICAgICAgICAgICAgICAuZ2V0ID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3ZvbHVtZV9nZXQsCQkJCVwKKyAgICAgICAgICAgICAgICAucHV0ID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3ZvbHVtZV9wdXQsCQkJCVwKKwkJLnByaXZhdGVfdmFsdWUgPSBvcmQsCQkJCQkJCQlcCisgICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsJCQkJCQkJCQkJCVwKKyAgICAgICAgICAgICAgICAuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUsCVwKKyAgICAgICAgICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQkJCQlcCisgICAgICAgICAgICAgICAgLm5hbWUgPQkJY19uYW1lICIgTW9uaXRvciBSb3V0ZSIsCQkJCQlcCisgICAgICAgICAgICAgICAgLmluZm8gPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfcm91dGVfaW5mbywJCQkJXAorICAgICAgICAgICAgICAgIC5nZXQgPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfcm91dGVfZ2V0LAkJCQkJXAorICAgICAgICAgICAgICAgIC5wdXQgPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfcm91dGVfcHV0LAkJCQkJXAorCQkucHJpdmF0ZV92YWx1ZSA9IG9yZCwJCQkJCQkJCVwKKyAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgewkJCQkJCQkJCQkJXAorICAgICAgICAgICAgICAgIC5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSwJXAorICAgICAgICAgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCQkJCQlcCisgICAgICAgICAgICAgICAgLm5hbWUgPQkJY19uYW1lICIgTW9uaXRvciBQaGFzZSBJbnZlcnQiLAkJCQkJXAorICAgICAgICAgICAgICAgIC5pbmZvID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3BoYXNlX2luZm8sCQkJCVwKKyAgICAgICAgICAgICAgICAuZ2V0ID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3BoYXNlX2dldCwJCQkJCVwKKyAgICAgICAgICAgICAgICAucHV0ID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3BoYXNlX3B1dCwJCQkJCVwKKwkJLnByaXZhdGVfdmFsdWUgPSBvcmQsCQkJCQkJCQlcCisgICAgICAgIH0KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfa29yZzEyMTJfY29udHJvbHNbXSA9IHsKKyAgICAgICAgTU9OX01JWEVSKDgsICJBbmFsb2ciKSwKKwlNT05fTUlYRVIoMTAsICJTUERJRiIpLCAKKyAgICAgICAgTU9OX01JWEVSKDAsICJBREFULTEiKSwgTU9OX01JWEVSKDEsICJBREFULTIiKSwgTU9OX01JWEVSKDIsICJBREFULTMiKSwgTU9OX01JWEVSKDMsICJBREFULTQiKSwKKyAgICAgICAgTU9OX01JWEVSKDQsICJBREFULTUiKSwgTU9OX01JWEVSKDUsICJBREFULTYiKSwgTU9OX01JWEVSKDYsICJBREFULTciKSwgTU9OX01JWEVSKDcsICJBREFULTgiKSwKKwl7CisgICAgICAgICAgICAgICAgLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1dSSVRFLAorICAgICAgICAgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisgICAgICAgICAgICAgICAgLm5hbWUgPQkJIlN5bmMgU291cmNlIiwKKyAgICAgICAgICAgICAgICAuaW5mbyA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9zeW5jX2luZm8sCisgICAgICAgICAgICAgICAgLmdldCA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9zeW5jX2dldCwKKyAgICAgICAgICAgICAgICAucHV0ID0JCXNuZF9rb3JnMTIxMl9jb250cm9sX3N5bmNfcHV0LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1dSSVRFLAorICAgICAgICAgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKyAgICAgICAgICAgICAgICAubmFtZSA9CQkiQURDIEF0dGVudWF0aW9uIiwKKyAgICAgICAgICAgICAgICAuaW5mbyA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9pbmZvLAorICAgICAgICAgICAgICAgIC5nZXQgPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfZ2V0LAorICAgICAgICAgICAgICAgIC5wdXQgPQkJc25kX2tvcmcxMjEyX2NvbnRyb2xfcHV0LAorICAgICAgICB9Cit9OworCisvKgorICogcHJvYyBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfa29yZzEyMTJfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWludCBuOworCWtvcmcxMjEyX3QgKmtvcmcxMjEyID0gKGtvcmcxMjEyX3QgKillbnRyeS0+cHJpdmF0ZV9kYXRhOworCisJc25kX2lwcmludGYoYnVmZmVyLCBrb3JnMTIxMi0+Y2FyZC0+bG9uZ25hbWUpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAoaW5kZXggIyVkKVxuIiwga29yZzEyMTItPmNhcmQtPm51bWJlciArIDEpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuR2VuZXJhbCBzZXR0aW5nc1xuIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICAgIHBlcmlvZCBzaXplOiAlWmQgYnl0ZXNcbiIsIEsxMjEyX1BFUklPRF9CWVRFUyk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICAgICBjbG9jayBtb2RlOiAlc1xuIiwgY2xvY2tTb3VyY2VOYW1lW2tvcmcxMjEyLT5jbGtTcmNSYXRlXSApOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgbGVmdCBBREMgU2VuczogJWRcbiIsIGtvcmcxMjEyLT5sZWZ0QURDSW5TZW5zICk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiIHJpZ2h0IEFEQyBTZW5zOiAlZFxuIiwga29yZzEyMTItPnJpZ2h0QURDSW5TZW5zICk7CisgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgICBWb2x1bWUgSW5mbzpcbiIpOworICAgICAgICBmb3IgKG49MDsgbjxrQXVkaW9DaGFubmVsczsgbisrKQorICAgICAgICAgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBDaGFubmVsICVkOiAlcyAtPiAlcyBbJWRdXG4iLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE5hbWVbbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTmFtZVtrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT5yb3V0ZURhdGFbbl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+dm9sdW1lRGF0YVtuXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5HZW5lcmFsIHN0YXR1c1xuIik7CisgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBBREFUIFRpbWUgQ29kZTogJWRcbiIsIGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHItPkFkYXRUaW1lQ29kZSk7CisgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgICAgQ2FyZCBTdGF0ZTogJXNcbiIsIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIklkbGUgbW9uLiBTdGF0ZTogJWRcbiIsIGtvcmcxMjEyLT5pZGxlTW9uaXRvck9uKTsKKyAgICAgICAgc25kX2lwcmludGYoYnVmZmVyLCAiQ21kIHJldHJ5IGNvdW50OiAlZFxuIiwga29yZzEyMTItPmNtZFJldHJ5Q291bnQpOworICAgICAgICBzbmRfaXByaW50ZihidWZmZXIsICIgICAgICBJcnEgY291bnQ6ICVsZFxuIiwga29yZzEyMTItPmlycWNvdW50KTsKKyAgICAgICAgc25kX2lwcmludGYoYnVmZmVyLCAiICAgIEVycm9yIGNvdW50OiAlbGRcbiIsIGtvcmcxMjEyLT50b3RhbGVycm9yY250KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9rb3JnMTIxMl9wcm9jX2luaXQoa29yZzEyMTJfdCAqa29yZzEyMTIpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhrb3JnMTIxMi0+Y2FyZCwgImtvcmcxMjEyIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBrb3JnMTIxMiwgMTAyNCwgc25kX2tvcmcxMjEyX3Byb2NfcmVhZCk7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9rb3JnMTIxMl9mcmVlKGtvcmcxMjEyX3QgKmtvcmcxMjEyKQoreworICAgICAgICBzbmRfa29yZzEyMTJfVHVybk9mZklkbGVNb25pdG9yKGtvcmcxMjEyKTsKKworICAgICAgICBpZiAoa29yZzEyMTItPmlycSA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVfaXJxKGtvcmcxMjEyLT5pcnEpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfRGlzYWJsZUNhcmRJbnRlcnJ1cHRzKGtvcmcxMjEyKTsKKyAgICAgICAgICAgICAgICBmcmVlX2lycShrb3JnMTIxMi0+aXJxLCAodm9pZCAqKWtvcmcxMjEyKTsKKyAgICAgICAgICAgICAgICBrb3JnMTIxMi0+aXJxID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChrb3JnMTIxMi0+aW9iYXNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGtvcmcxMjEyLT5pb2Jhc2UpOworICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5pb2Jhc2UgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIAorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoa29yZzEyMTItPnBjaSk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBmcmVlIHVwIG1lbW9yeSByZXNvdXJjZXMgdXNlZCBmb3IgdGhlIERTUCBkb3dubG9hZC4KKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAoa29yZzEyMTItPmRtYV9kc3AuYXJlYSkgeworICAgICAgICAJc25kX2RtYV9mcmVlX3BhZ2VzKCZrb3JnMTIxMi0+ZG1hX2RzcCk7CisgICAgICAgIAlrb3JnMTIxMi0+ZG1hX2RzcC5hcmVhID0gTlVMTDsKKyAgICAgICAgfQorCisjaWZuZGVmIEsxMjEyX0xBUkdFQUxMT0MKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gZnJlZSB1cCBtZW1vcnkgcmVzb3VyY2VzIHVzZWQgZm9yIHRoZSBQbGF5L1JlYyBCdWZmZXJzCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWlmIChrb3JnMTIxMi0+ZG1hX3BsYXkuYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmtvcmcxMjEyLT5kbWFfcGxheSk7CisJCWtvcmcxMjEyLT5kbWFfcGxheS5hcmVhID0gTlVMTDsKKyAgICAgICAgfQorCisJaWYgKGtvcmcxMjEyLT5kbWFfcmVjLmFyZWEpIHsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZrb3JnMTIxMi0+ZG1hX3JlYyk7CisJCWtvcmcxMjEyLT5kbWFfcmVjLmFyZWEgPSBOVUxMOworICAgICAgICB9CisKKyNlbmRpZgorCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gZnJlZSB1cCBtZW1vcnkgcmVzb3VyY2VzIHVzZWQgZm9yIHRoZSBTaGFyZWQgQnVmZmVycworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKGtvcmcxMjEyLT5kbWFfc2hhcmVkLmFyZWEpIHsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZrb3JnMTIxMi0+ZG1hX3NoYXJlZCk7CisJCWtvcmcxMjEyLT5kbWFfc2hhcmVkLmFyZWEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIAorCXBjaV9kaXNhYmxlX2RldmljZShrb3JnMTIxMi0+cGNpKTsKKyAgICAgICAga2ZyZWUoa29yZzEyMTIpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfa29yZzEyMTJfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisgICAgICAgIGtvcmcxMjEyX3QgKmtvcmcxMjEyID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogRnJlZWluZyBkZXZpY2VcbiIpOworI2VuZGlmCisJcmV0dXJuIHNuZF9rb3JnMTIxMl9mcmVlKGtvcmcxMjEyKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2tvcmcxMjEyX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga29yZzEyMTJfdCAqKiByY2hpcCkKKworeworICAgICAgICBpbnQgZXJyOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpb3BvcnRfc2l6ZSwgaW9tZW1fc2l6ZSwgaW9tZW0yX3NpemU7CisgICAgICAgIGtvcmcxMjEyX3QgKiBrb3JnMTIxMjsKKworICAgICAgICBzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisgICAgICAgICAgICAgICAgLmRldl9mcmVlID0gc25kX2tvcmcxMjEyX2Rldl9mcmVlLAorICAgICAgICB9OworCisgICAgICAgICogcmNoaXAgPSBOVUxMOworICAgICAgICBpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgIGtvcmcxMjEyID0ga2NhbGxvYygxLCBzaXplb2YoKmtvcmcxMjEyKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmIChrb3JnMTIxMiA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCX0KKworCWtvcmcxMjEyLT5jYXJkID0gY2FyZDsKKwlrb3JnMTIxMi0+cGNpID0gcGNpOworCisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmtvcmcxMjEyLT53YWl0KTsKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmtvcmcxMjEyLT5sb2NrKTsKKwlpbml0X01VVEVYKCZrb3JnMTIxMi0+b3Blbl9tdXRleCk7CisJaW5pdF90aW1lcigma29yZzEyMTItPnRpbWVyKTsKKwlrb3JnMTIxMi0+dGltZXIuZnVuY3Rpb24gPSBzbmRfa29yZzEyMTJfdGltZXJfZnVuYzsKKwlrb3JnMTIxMi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWtvcmcxMjEyOworCisgICAgICAgIGtvcmcxMjEyLT5pcnEgPSAtMTsKKyAgICAgICAga29yZzEyMTItPmNsa1NvdXJjZSA9IEsxMjEyX0NMS0lEWF9Mb2NhbDsKKyAgICAgICAga29yZzEyMTItPmNsa1JhdGUgPSA0NDEwMDsKKyAgICAgICAga29yZzEyMTItPmluSVJRID0gMDsKKyAgICAgICAga29yZzEyMTItPnJ1bm5pbmcgPSAwOworCWtvcmcxMjEyLT5vcGVuY250ID0gMDsKKwlrb3JnMTIxMi0+cGxheWNudCA9IDA7CisJa29yZzEyMTItPnNldGNudCA9IDA7CisJa29yZzEyMTItPnRvdGFsZXJyb3JjbnQgPSAwOworCWtvcmcxMjEyLT5wbGF5YmFja19waWQgPSAtMTsKKwlrb3JnMTIxMi0+Y2FwdHVyZV9waWQgPSAtMTsKKyAgICAgICAgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIGtvcmcxMjEyLT5pZGxlTW9uaXRvck9uID0gMDsKKyAgICAgICAga29yZzEyMTItPmNsa1NyY1JhdGUgPSBLMTIxMl9DTEtJRFhfTG9jYWxBdDQ0XzFLOworICAgICAgICBrb3JnMTIxMi0+bGVmdEFEQ0luU2VucyA9IGsxMjEyTWF4QURDU2VuczsKKyAgICAgICAga29yZzEyMTItPnJpZ2h0QURDSW5TZW5zID0gazEyMTJNYXhBRENTZW5zOworCisgICAgICAgIGZvciAoaT0wOyBpPGtBdWRpb0NoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAga29yZzEyMTItPnZvbHVtZVBoYXNlW2ldID0gMDsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJrb3JnMTIxMiIpKSA8IDApIHsKKwkJa2ZyZWUoa29yZzEyMTIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKyAgICAgICAga29yZzEyMTItPmlvbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KGtvcmcxMjEyLT5wY2ksIDApOworICAgICAgICBrb3JnMTIxMi0+aW9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGtvcmcxMjEyLT5wY2ksIDEpOworICAgICAgICBrb3JnMTIxMi0+aW9tZW0yID0gcGNpX3Jlc291cmNlX3N0YXJ0KGtvcmcxMjEyLT5wY2ksIDIpOworCisJaW9tZW1fc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oa29yZzEyMTItPnBjaSwgMCk7CisJaW9wb3J0X3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGtvcmcxMjEyLT5wY2ksIDEpOworCWlvbWVtMl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihrb3JnMTIxMi0+cGNpLCAyKTsKKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorICAgICAgICBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiByZXNvdXJjZXM6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBpb21lbSA9IDB4JWx4ICglZClcbiIKKwkJICAgIiAgICBpb3BvcnQgID0gMHglbHggKCVkKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgaW9tZW0gPSAweCVseCAoJWQpXG4iCisJCSAgICIgICAgWyVzXVxuIiwKKwkJICAga29yZzEyMTItPmlvbWVtLCBpb21lbV9zaXplLAorCQkgICBrb3JnMTIxMi0+aW9wb3J0LCBpb3BvcnRfc2l6ZSwKKwkJICAga29yZzEyMTItPmlvbWVtMiwgaW9tZW0yX3NpemUsCisJCSAgIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworICAgICAgICBpZiAoKGtvcmcxMjEyLT5pb2Jhc2UgPSBpb3JlbWFwKGtvcmcxMjEyLT5pb21lbSwgaW9tZW1fc2l6ZSkpID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAia29yZzEyMTI6IHVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBrb3JnMTIxMi0+aW9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+aW9tZW0gKyBpb21lbV9zaXplIC0gMSk7CisgICAgICAgICAgICAgICAgc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSByZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2tvcmcxMjEyX2ludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAia29yZzEyMTIiLCAodm9pZCAqKSBrb3JnMTIxMik7CisKKyAgICAgICAgaWYgKGVycikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogdW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisgICAgICAgICAgICAgICAgc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKworICAgICAgICBrb3JnMTIxMi0+aXJxID0gcGNpLT5pcnE7CisKKwlwY2lfc2V0X21hc3Rlcihrb3JnMTIxMi0+cGNpKTsKKworICAgICAgICBrb3JnMTIxMi0+c3RhdHVzUmVnUHRyID0gKHUzMiBfX2lvbWVtICopIChrb3JnMTIxMi0+aW9iYXNlICsgU1RBVFVTX1JFR19PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+b3V0RG9vcmJlbGxQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBPVVRfRE9PUkJFTExfT0ZGU0VUKTsKKyAgICAgICAga29yZzEyMTItPmluRG9vcmJlbGxQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBJTl9ET09SQkVMTF9PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+bWFpbGJveDBQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBNQUlMQk9YMF9PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+bWFpbGJveDFQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBNQUlMQk9YMV9PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+bWFpbGJveDJQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBNQUlMQk9YMl9PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+bWFpbGJveDNQdHIgPSAodTMyIF9faW9tZW0gKikgKGtvcmcxMjEyLT5pb2Jhc2UgKyBNQUlMQk9YM19PRkZTRVQpOworICAgICAgICBrb3JnMTIxMi0+Y29udHJvbFJlZ1B0ciA9ICh1MzIgX19pb21lbSAqKSAoa29yZzEyMTItPmlvYmFzZSArIFBDSV9DT05UUk9MX09GRlNFVCk7CisgICAgICAgIGtvcmcxMjEyLT5zZW5zUmVnUHRyID0gKHUxNiBfX2lvbWVtICopIChrb3JnMTIxMi0+aW9iYXNlICsgU0VOU19DT05UUk9MX09GRlNFVCk7CisgICAgICAgIGtvcmcxMjEyLT5pZFJlZ1B0ciA9ICh1MzIgX19pb21lbSAqKSAoa29yZzEyMTItPmlvYmFzZSArIERFVl9WRU5EX0lEX09GRlNFVCk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogY2FyZCByZWdpc3RlcnM6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBTdGF0dXMgcmVnaXN0ZXIgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBPdXREb29yYmVsbCAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBJbkRvb3JiZWxsICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBNYWlsYm94MCAgICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBNYWlsYm94MSAgICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBNYWlsYm94MiAgICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBNYWlsYm94MyAgICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBDb250cm9sUmVnICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBTZW5zUmVnICAgICAgICAgPSAweCVwXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBJRFJlZyAgICAgICAgICAgPSAweCVwXG4iCisJCSAgICIgICAgWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+c3RhdHVzUmVnUHRyLAorCQkgICBrb3JnMTIxMi0+b3V0RG9vcmJlbGxQdHIsCisJCSAgIGtvcmcxMjEyLT5pbkRvb3JiZWxsUHRyLAorICAgICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5tYWlsYm94MFB0ciwKKyAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+bWFpbGJveDFQdHIsCisgICAgICAgICAgICAgICAgICAga29yZzEyMTItPm1haWxib3gyUHRyLAorICAgICAgICAgICAgICAgICAgIGtvcmcxMjEyLT5tYWlsYm94M1B0ciwKKyAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+Y29udHJvbFJlZ1B0ciwKKyAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+c2Vuc1JlZ1B0ciwKKyAgICAgICAgICAgICAgICAgICBrb3JnMTIxMi0+aWRSZWdQdHIsCisJCSAgIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAorCQkJCXNpemVvZihLb3JnU2hhcmVkQnVmZmVyKSwgJmtvcmcxMjEyLT5kbWFfc2hhcmVkKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAia29yZzEyMTI6IGNhbiBub3QgYWxsb2NhdGUgc2hhcmVkIGJ1ZmZlciBtZW1vcnkgKCVaZCBieXRlcylcbiIsIHNpemVvZihLb3JnU2hhcmVkQnVmZmVyKSk7CisgICAgICAgICAgICAgICAgc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgICAgIGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQdHIgPSAoS29yZ1NoYXJlZEJ1ZmZlciAqKWtvcmcxMjEyLT5kbWFfc2hhcmVkLmFyZWE7CisgICAgICAgIGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQaHkgPSBrb3JnMTIxMi0+ZG1hX3NoYXJlZC5hZGRyOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisgICAgICAgIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFNoYXJlZCBCdWZmZXIgQXJlYSA9IDB4JXAgKDB4JTA4bHgpLCAlZCBieXRlc1xuIiwga29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ciwga29yZzEyMTItPnNoYXJlZEJ1ZmZlclBoeSwgc2l6ZW9mKEtvcmdTaGFyZWRCdWZmZXIpKTsKKyNlbmRpZgorCisjaWZuZGVmIEsxMjEyX0xBUkdFQUxMT0MKKworICAgICAgICBrb3JnMTIxMi0+RGF0YUJ1ZnNTaXplID0gc2l6ZW9mKEtvcmdBdWRpb0J1ZmZlcikgKiBrTnVtQnVmZmVyczsKKworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAorCQkJCWtvcmcxMjEyLT5EYXRhQnVmc1NpemUsICZrb3JnMTIxMi0+ZG1hX3BsYXkpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogY2FuIG5vdCBhbGxvY2F0ZSBwbGF5IGRhdGEgYnVmZmVyIG1lbW9yeSAoJWQgYnl0ZXMpXG4iLCBrb3JnMTIxMi0+RGF0YUJ1ZnNTaXplKTsKKyAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfZnJlZShrb3JnMTIxMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKwlrb3JnMTIxMi0+cGxheURhdGFCdWZzUHRyID0gKEtvcmdBdWRpb0J1ZmZlciAqKWtvcmcxMjEyLT5kbWFfcGxheS5hcmVhOworCWtvcmcxMjEyLT5QbGF5RGF0YVBoeSA9IGtvcmcxMjEyLT5kbWFfcGxheS5hZGRyOworCisjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCisgICAgICAgIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFBsYXkgRGF0YSBBcmVhID0gMHglcCAoMHglMDh4KSwgJWQgYnl0ZXNcbiIsCisJCWtvcmcxMjEyLT5wbGF5RGF0YUJ1ZnNQdHIsIGtvcmcxMjEyLT5QbGF5RGF0YVBoeSwga29yZzEyMTItPkRhdGFCdWZzU2l6ZSk7CisjZW5kaWYKKworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAorCQkJCWtvcmcxMjEyLT5EYXRhQnVmc1NpemUsICZrb3JnMTIxMi0+ZG1hX3JlYykgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImtvcmcxMjEyOiBjYW4gbm90IGFsbG9jYXRlIHJlY29yZCBkYXRhIGJ1ZmZlciBtZW1vcnkgKCVkIGJ5dGVzKVxuIiwga29yZzEyMTItPkRhdGFCdWZzU2l6ZSk7CisgICAgICAgICAgICAgICAgc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgICAgIGtvcmcxMjEyLT5yZWNvcmREYXRhQnVmc1B0ciA9IChLb3JnQXVkaW9CdWZmZXIgKilrb3JnMTIxMi0+ZG1hX3JlYy5hcmVhOworICAgICAgICBrb3JnMTIxMi0+UmVjRGF0YVBoeSA9IGtvcmcxMjEyLT5kbWFfcmVjLmFkZHI7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogUmVjb3JkIERhdGEgQXJlYSA9IDB4JXAgKDB4JTA4eCksICVkIGJ5dGVzXG4iLAorCQlrb3JnMTIxMi0+cmVjb3JkRGF0YUJ1ZnNQdHIsIGtvcmcxMjEyLT5SZWNEYXRhUGh5LCBrb3JnMTIxMi0+RGF0YUJ1ZnNTaXplKTsKKyNlbmRpZgorCisjZWxzZSAvLyBLMTIxMl9MQVJHRUFMTE9DCisKKyAgICAgICAga29yZzEyMTItPnJlY29yZERhdGFCdWZzUHRyID0ga29yZzEyMTItPnNoYXJlZEJ1ZmZlclB0ci0+cmVjb3JkRGF0YUJ1ZnM7CisgICAgICAgIGtvcmcxMjEyLT5wbGF5RGF0YUJ1ZnNQdHIgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUHRyLT5wbGF5RGF0YUJ1ZnM7CisgICAgICAgIGtvcmcxMjEyLT5QbGF5RGF0YVBoeSA9ICh1MzIpICYoKEtvcmdTaGFyZWRCdWZmZXIgKikga29yZzEyMTItPnNoYXJlZEJ1ZmZlclBoeSktPnBsYXlEYXRhQnVmczsKKyAgICAgICAga29yZzEyMTItPlJlY0RhdGFQaHkgID0gKHUzMikgJigoS29yZ1NoYXJlZEJ1ZmZlciAqKSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5KS0+cmVjb3JkRGF0YUJ1ZnM7CisKKyNlbmRpZiAvLyBLMTIxMl9MQVJHRUFMTE9DCisKKyAgICAgICAga29yZzEyMTItPmRzcENvZGVTaXplID0gc2l6ZW9mIChkc3BDb2RlKTsKKworICAgICAgICBrb3JnMTIxMi0+Vm9sdW1lVGFibGVQaHkgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5ICsKKwkJb2Zmc2V0b2YoS29yZ1NoYXJlZEJ1ZmZlciwgdm9sdW1lRGF0YSk7CisgICAgICAgIGtvcmcxMjEyLT5Sb3V0aW5nVGFibGVQaHkgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5ICsKKwkJb2Zmc2V0b2YoS29yZ1NoYXJlZEJ1ZmZlciwgcm91dGVEYXRhKTsKKyAgICAgICAga29yZzEyMTItPkFkYXRUaW1lQ29kZVBoeSA9IGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQaHkgKworCQlvZmZzZXRvZihLb3JnU2hhcmVkQnVmZmVyLCBBZGF0VGltZUNvZGUpOworCisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJa29yZzEyMTItPmRzcENvZGVTaXplLCAma29yZzEyMTItPmRtYV9kc3ApIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogY2FuIG5vdCBhbGxvY2F0ZSBkc3AgY29kZSBtZW1vcnkgKCVkIGJ5dGVzKVxuIiwga29yZzEyMTItPmRzcENvZGVTaXplKTsKKyAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfZnJlZShrb3JnMTIxMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKworI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMAorICAgICAgICBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBEU1AgQ29kZSBhcmVhID0gMHglcCAoMHglMDh4KSAlZCBieXRlcyBbJXNdXG4iLAorCQkgICBrb3JnMTIxMi0+ZG1hX2RzcC5hcmVhLCBrb3JnMTIxMi0+ZG1hX2RzcC5hZGRyLCBrb3JnMTIxMi0+ZHNwQ29kZVNpemUsCisJCSAgIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CisjZW5kaWYKKworCXJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfUmVib290Q2FyZCwgMCwgMCwgMCwgMCk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKwlpZiAocmMpIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IFJlYm9vdCBDYXJkIC0gUkMgPSAlZCBbJXNdXG4iLCByYywgc3RhdGVOYW1lW2tvcmcxMjEyLT5jYXJkU3RhdGVdKTsKKyNlbmRpZgorCisgICAgICAgIGlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBrb3JnMTIxMiwgJm9wcykpIDwgMCkgeworICAgICAgICAgICAgICAgIHNuZF9rb3JnMTIxMl9mcmVlKGtvcmcxMjEyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIAorCXNuZF9rb3JnMTIxMl9FbmFibGVDYXJkSW50ZXJydXB0cyhrb3JnMTIxMik7CisKKwltZGVsYXkoQ0FSRF9CT09UX0RFTEFZX0lOX01TKTsKKworICAgICAgICBpZiAoc25kX2tvcmcxMjEyX2Rvd25sb2FkRFNQQ29kZShrb3JnMTIxMikpCisgICAgICAgIAlyZXR1cm4gLUVCVVNZOworCisJc25kX3ByaW50ayhLRVJOX0VSUiAKKwkgICAgICAgImtvcmcxMjEyOiBkc3BNZW1QaHkgPSAlMDh4IFVbJTA4eF0sICIKKyAgICAgICAgICAgICAgICJQbGF5RGF0YVBoeSA9ICUwOHggTFslMDh4XVxuIgorCSAgICAgICAia29yZzEyMTI6IFJlY0RhdGFQaHkgPSAlMDh4IExbJTA4eF0sICIKKyAgICAgICAgICAgICAgICJWb2x1bWVUYWJsZVBoeSA9ICUwOHggTFslMDh4XVxuIgorICAgICAgICAgICAgICAgImtvcmcxMjEyOiBSb3V0aW5nVGFibGVQaHkgPSAlMDh4IExbJTA4eF0sICIKKyAgICAgICAgICAgICAgICJBZGF0VGltZUNvZGVQaHkgPSAlMDh4IExbJTA4eF1cbiIsCisJICAgICAgIChpbnQpa29yZzEyMTItPmRtYV9kc3AuYWRkciwgICAgVXBwZXJXb3JkU3dhcChrb3JnMTIxMi0+ZG1hX2RzcC5hZGRyKSwKKyAgICAgICAgICAgICAgIGtvcmcxMjEyLT5QbGF5RGF0YVBoeSwgICAgIExvd2VyV29yZFN3YXAoa29yZzEyMTItPlBsYXlEYXRhUGh5KSwKKyAgICAgICAgICAgICAgIGtvcmcxMjEyLT5SZWNEYXRhUGh5LCAgICAgIExvd2VyV29yZFN3YXAoa29yZzEyMTItPlJlY0RhdGFQaHkpLAorICAgICAgICAgICAgICAga29yZzEyMTItPlZvbHVtZVRhYmxlUGh5LCAgTG93ZXJXb3JkU3dhcChrb3JnMTIxMi0+Vm9sdW1lVGFibGVQaHkpLAorICAgICAgICAgICAgICAga29yZzEyMTItPlJvdXRpbmdUYWJsZVBoeSwgTG93ZXJXb3JkU3dhcChrb3JnMTIxMi0+Um91dGluZ1RhYmxlUGh5KSwKKyAgICAgICAgICAgICAgIGtvcmcxMjEyLT5BZGF0VGltZUNvZGVQaHksIExvd2VyV29yZFN3YXAoa29yZzEyMTItPkFkYXRUaW1lQ29kZVBoeSkpOworCisgICAgICAgIGlmICgoZXJyID0gc25kX3BjbV9uZXcoa29yZzEyMTItPmNhcmQsICJrb3JnMTIxMiIsIDAsIDEsIDEsICZrb3JnMTIxMi0+cGNtKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKwlrb3JnMTIxMi0+cGNtLT5wcml2YXRlX2RhdGEgPSBrb3JnMTIxMjsKKyAgICAgICAga29yZzEyMTItPnBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2tvcmcxMjEyX2ZyZWVfcGNtOworICAgICAgICBzdHJjcHkoa29yZzEyMTItPnBjbS0+bmFtZSwgImtvcmcxMjEyIik7CisKKyAgICAgICAgc25kX3BjbV9zZXRfb3BzKGtvcmcxMjEyLT5wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BzKTsKKyAgICAgICAgCisJc25kX3BjbV9zZXRfb3BzKGtvcmcxMjEyLT5wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9rb3JnMTIxMl9jYXB0dXJlX29wcyk7CisKKwlrb3JnMTIxMi0+cGNtLT5pbmZvX2ZsYWdzID0gU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOworCisJLy9zbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKGtvcmcxMjEyLT5wY20sCisJLy8JCQlLMTIxMl9NQVhfQlVGX1NJWkUsIEsxMjEyX01BWF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2tvcmcxMjEyX2NvbnRyb2xzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc25kX2N0bF9hZGQoa29yZzEyMTItPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2tvcmcxMjEyX2NvbnRyb2xzW2ldLCBrb3JnMTIxMikpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNuZF9rb3JnMTIxMl9wcm9jX2luaXQoa29yZzEyMTIpOworICAgICAgICAKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKyAgICAgICAgKiByY2hpcCA9IGtvcmcxMjEyOworCXJldHVybiAwOworCit9CisKKy8qCisgKiBDYXJkIGluaXRpYWxpc2F0aW9uCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK3NuZF9rb3JnMTIxMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCWtvcmcxMjEyX3QgKmtvcmcxMjEyOworCXNuZF9jYXJkX3QgKmNhcmQ7CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKyAgICAgICAgaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfa29yZzEyMTJfY3JlYXRlKGNhcmQsIHBjaSwgJmtvcmcxMjEyKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgImtvcmcxMjEyIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgImtvcmcxMjEyIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCisJCWtvcmcxMjEyLT5pb21lbSwga29yZzEyMTItPmlycSk7CisKKyNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKKyAgICAgICAgSzEyMTJfREVCVUdfUFJJTlRLKCJLMTIxMl9ERUJVRzogJXNcbiIsIGNhcmQtPmxvbmduYW1lKTsKKyNlbmRpZgorCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX2tvcmcxMjEyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gImtvcmcxMjEyIiwKKwkuaWRfdGFibGUgPSBzbmRfa29yZzEyMTJfaWRzLAorCS5wcm9iZSA9IHNuZF9rb3JnMTIxMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2tvcmcxMjEyX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfa29yZzEyMTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfa29yZzEyMTJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2tvcmcxMjEyX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfa29yZzEyMTJfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jIGIvc291bmQvcGNpL21hZXN0cm8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMzMwOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0wLDAgKzEsMjcxNCBAQAorLyoKKyAqIERyaXZlciBmb3IgRVNTIE1hZXN0cm8zL0FsbGVncm8gKEVTMTk4OCkgc291bmRjYXJkcy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBieSBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICogICAgICAgICAgICAgICAgICAgICAgIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiBNb3N0IG9mIHRoZSBoYXJkd2FyZSBpbml0IHN0dWZmcyBhcmUgYmFzZWQgb24gbWFlc3RybzMgZHJpdmVyIGZvcgorICogT1NTL0ZyZWUgYnkgWmFjaCBCcm93bi4gIE1hbnkgdGhhbmtzIHRvIFphY2ghCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqCisgKiBDaGFuZ2VMb2c6CisgKiBBdWcuIDI3LCAyMDAxCisgKiAgICAgLSBGaXhlZCBkZWFkbG9jayBvbiBjYXB0dXJlCisgKiAgICAgLSBBZGRlZCBDYW55b24zRC0yIHN1cHBvcnQgYnkgUm9iIFJpZ2dzIDxyb2JAcGFuZ2FsYWN0aWMub3JnPgorICoKKyAqLworIAorI2RlZmluZSBDQVJEX05BTUUgIkVTUyBNYWVzdHJvMy9BbGxlZ3JvL0NhbnlvbjNELTIiCisjZGVmaW5lIERSSVZFUl9OQU1FICJNYWVzdHJvMyIKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PiwgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgTWFlc3RybzMgUENJIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tFU1MsTWFlc3RybzMgUENJfSwiCisJCSJ7RVNTLEVTMTk4OH0sIgorCQkie0VTUyxBbGxlZ3JvIFBDSX0sIgorCQkie0VTUyxBbGxlZ3JvLTEgUENJfSwiCisJICAgICAgICAie0VTUyxDYW55b24zRC0yL0xFIFBDSX19Iik7CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsgLyogYWxsIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgZXh0ZXJuYWxfYW1wW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CitzdGF0aWMgaW50IGFtcF9ncGlvW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gLTF9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdGhpcyBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZXh0ZXJuYWxfYW1wLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXh0ZXJuYWxfYW1wLCAiRW5hYmxlIGV4dGVybmFsIGFtcCBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYW1wX2dwaW8sIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFtcF9ncGlvLCAiR1BJTyBwaW4gbnVtYmVyIGZvciBleHRlcm5hbCBhbXAuIChkZWZhdWx0ID0gLTEpIik7CisKKyNkZWZpbmUgTUFYX1BMQVlCQUNLUwkyCisjZGVmaW5lIE1BWF9DQVBUVVJFUwkxCisjZGVmaW5lIE5SX0RTUFMJCShNQVhfUExBWUJBQ0tTICsgTUFYX0NBUFRVUkVTKQorCisKKy8qCisgKiBtYWVzdHJvMyByZWdpc3RlcnMKKyAqLworCisvKiBBbGxlZ3JvIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfTEVHQUNZX0FVRElPX0NUUkwgICAweDQwCisjZGVmaW5lIFNPVU5EX0JMQVNURVJfRU5BQkxFICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRk1fU1lOVEhFU0lTX0VOQUJMRSAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHQU1FX1BPUlRfRU5BQkxFICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1QVTQwMV9JT19FTkFCTEUgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTVBVNDAxX0lSUV9FTkFCTEUgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBTElBU18xMEJJVF9JTyAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNCX0RNQV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgU0JfRE1BXzAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTQl9ETUFfMSAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNCX0RNQV9SICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU0JfRE1BXzMgICAgICAgICAgICAgICAgMHgwMDAwMDBDMAorI2RlZmluZSBTQl9JUlFfTUFTSyAgICAgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIFNCX0lSUV81ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0JfSVJRXzcgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTQl9JUlFfOSAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNCX0lSUV8xMCAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgTUlESV9JUlFfTUFTSyAgICAgICAgICAgMHgwMDAwMzgwMAorI2RlZmluZSBTRVJJQUxfSVJRX0VOQUJMRSAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIERJU0FCTEVfTEVHQUNZICAgICAgICAgIDB4MDAwMDgwMDAKKworI2RlZmluZSBQQ0lfQUxMRUdST19DT05GSUcgICAgICAweDUwCisjZGVmaW5lIFNCX0FERFJfMjQwICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTVBVX0FERFJfTUFTSyAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBNUFVfQUREUl8zMzAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1QVV9BRERSXzMwMCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTVBVX0FERFJfMzIwICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBNUFVfQUREUl8zNDAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIFVTRV9QQ0lfVElNSU5HICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUE9TVEVEX1dSSVRFX0VOQUJMRSAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfUE9MSUNZX01BU0sgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIERNQV9ERE1BICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1RETUEgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBETUFfUENQQ0kgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERNQV9XQkRNQTE2ICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRE1BX1dCRE1BNCAgICAgICAgICAgICAgMHgwMDAwMDUwMAorI2RlZmluZSBETUFfV0JETUEyICAgICAgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIERNQV9XQkRNQTEgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgRE1BX1NBRkVfR1VBUkQgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBISV9QRVJGX0dQX0VOQUJMRSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBJQ19TTk9PUF9NT0RFXzAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUElDX1NOT09QX01PREVfMSAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTT1VOREJMQVNURVJfSVJRX01BU0sgICAweDAwMDA4MDAwCisjZGVmaW5lIFJJTkdfSU5fRU5BQkxFICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU1BESUZfVEVTVF9NT0RFICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFX1NFTEVDVF8yICAweDAwMDQwMDAwCisjZGVmaW5lIEVFUFJPTV9XUklURV9FTkFCTEUgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQ09ERUNfRElSX0lOICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIVl9CVVRUT05fRlJPTV9HRCAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFJFRFVDRURfREVCT1VOQ0UgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSFZfQ1RSTF9FTkFCTEUgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBTUERJRl9FTkFCTEUgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENMS19ESVZfU0VMRUNUICAgICAgICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgQ0xLX0RJVl9CWV80OCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDTEtfRElWX0JZXzQ5ICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENMS19ESVZfQllfNTAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ0xLX0RJVl9SRVNFUlZFRCAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBQTV9DVFJMX0VOQUJMRSAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfU0VMRUNUICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV9TSElGVCAgICAgMjgKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV8wICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFXzEgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfMiAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV8zICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBJTlRfQ0xLX1NFTEVDVCAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElOVF9DTEtfTVVMVF9SRVNFVCAgICAgIDB4ODAwMDAwMDAKKworLyogTTMgKi8KKyNkZWZpbmUgSU5UX0NMS19TUkNfTk9UX1BDSSAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJTlRfQ0xLX01VTFRfRU5BQkxFICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgUENJX0FDUElfQ09OVFJPTCAgICAgICAgMHg1NAorI2RlZmluZSBQQ0lfQUNQSV9EMCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBDSV9BQ1BJX0QxICAgICAgICAgICAgIDB4QjRGNzAwMDAKKyNkZWZpbmUgUENJX0FDUElfRDIgICAgICAgICAgICAgMHhCNEY3QjRGNworCisjZGVmaW5lIFBDSV9VU0VSX0NPTkZJRyAgICAgICAgIDB4NTgKKyNkZWZpbmUgRVhUX1BDSV9NQVNURVJfRU5BQkxFICAgMHgwMDAwMDAwMQorI2RlZmluZSBTUERJRl9PVVRfU0VMRUNUICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRFU1RfUElOX0RJUl9DVFJMICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUM5N19DT0RFQ19URVNUICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBUUklfU1RBVEVfQlVGRkVSICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIElOX0NMS18xMk1IWl9TRUxFQ1QgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTVVMVElfRlVOQ19ESVNBQkxFICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFWFRfTUFTVEVSX1BBSVJfU0VMICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBDSV9NQVNURVJfU1VQUE9SVCAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgU1RPUF9DTE9DS19FTkFCTEUgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBFQVBEX0RSSVZFX0VOQUJMRSAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJFUV9UUklfU1RBVEVfRU5BQkxFICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUkVRX0xPV19FTkFCTEUgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBNSURJXzFfRU5BQkxFICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE1JRElfMl9FTkFCTEUgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgU0JfQVVESU9fU1lOQyAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIVl9DVFJMX1RFU1QgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNPVU5EQkxBU1RFUl9URVNUICAgICAgIDB4MDA0MDAwMDAKKworI2RlZmluZSBQQ0lfVVNFUl9DT05GSUdfQyAgICAgICAweDVDCisKKyNkZWZpbmUgUENJX0RETUFfQ1RSTCAgICAgICAgICAgMHg2MAorI2RlZmluZSBERE1BX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisKKworLyogQWxsZWdybyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVF9JTlRfQ1RSTCAgICAgICAgICAgMHgxOAorI2RlZmluZSBTQl9JTlRfRU5BQkxFICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVBVNDAxX0lOVF9FTkFCTEUgICAgICAgMHgwMDAyCisjZGVmaW5lIEFTU1BfSU5UX0VOQUJMRSAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSSU5HX0lOVF9FTkFCTEUgICAgICAgICAweDAwMjAKKyNkZWZpbmUgSFZfSU5UX0VOQUJMRSAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIENMS1JVTl9HRU5fRU5BQkxFICAgICAgIDB4MDEwMAorI2RlZmluZSBIVl9DVFJMX1RPX1BNRSAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgU09GVFdBUkVfUkVTRVRfRU5BQkxFICAgMHg4MDAwCisKKy8qCisgKiBzaG91bGQgYmUgdXNpbmcgdGhlIGFib3ZlIGRlZmluZXMsIHByb2JhYmx5LgorICovCisjZGVmaW5lIFJFR0JfRU5BQkxFX1JFU0VUICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSRUdCX1NUT1BfQ0xPQ0sgICAgICAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBIT1NUX0lOVF9TVEFUVVMgICAgICAgICAweDFBCisjZGVmaW5lIFNCX0lOVF9QRU5ESU5HICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVBVNDAxX0lOVF9QRU5ESU5HICAgICAgMHgwMgorI2RlZmluZSBBU1NQX0lOVF9QRU5ESU5HICAgICAgICAweDEwCisjZGVmaW5lIFJJTkdfSU5UX1BFTkRJTkcgICAgICAgIDB4MjAKKyNkZWZpbmUgSFZfSU5UX1BFTkRJTkcgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEhBUkRXQVJFX1ZPTF9DVFJMICAgICAgIDB4MUIKKyNkZWZpbmUgU0hBRE9XX01JWF9SRUdfVk9JQ0UgICAgMHgxQworI2RlZmluZSBIV19WT0xfQ09VTlRFUl9WT0lDRSAgICAweDFECisjZGVmaW5lIFNIQURPV19NSVhfUkVHX01BU1RFUiAgIDB4MUUKKyNkZWZpbmUgSFdfVk9MX0NPVU5URVJfTUFTVEVSICAgMHgxRgorCisjZGVmaW5lIENPREVDX0NPTU1BTkQgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQ09ERUNfUkVBRF9CICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIENPREVDX1NUQVRVUyAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQ09ERUNfQlVTWV9CICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIENPREVDX0RBVEEgICAgICAgICAgICAgIDB4MzIKKworI2RlZmluZSBSSU5HX0JVU19DVFJMX0EgICAgICAgICAweDM2CisjZGVmaW5lIFJBQ19QTUVfRU5BQkxFICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBSQUNfU0RGU19FTkFCTEUgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTEFDX1BNRV9FTkFCTEUgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIExBQ19TREZTX0VOQUJMRSAgICAgICAgIDB4MDgwMAorI2RlZmluZSBTRVJJQUxfQUNfTElOS19FTkFCTEUgICAweDEwMDAKKyNkZWZpbmUgSU9fU1JBTV9FTkFCTEUgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElJU19JTlBVVF9FTkFCTEUgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIFJJTkdfQlVTX0NUUkxfQiAgICAgICAgIDB4MzgKKyNkZWZpbmUgU0VDT05EX0NPREVDX0lEX01BU0sgICAgMHgwMDAzCisjZGVmaW5lIFNQRElGX0ZVTkNfRU5BQkxFICAgICAgIDB4MDAxMAorI2RlZmluZSBTRUNPTkRfQUNfRU5BQkxFICAgICAgICAweDAwMjAKKyNkZWZpbmUgU0JfTU9EVUxFX0lOVEZfRU5BQkxFICAgMHgwMDQwCisjZGVmaW5lIFNTUEVfRU5BQkxFICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNM0lfRE9DS19FTkFCTEUgICAgICAgICAweDAwODAKKworI2RlZmluZSBTRE9fT1VUX0RFU1RfQ1RSTCAgICAgICAweDNBCisjZGVmaW5lIENPTU1BTkRfQUREUl9PVVQgICAgICAgIDB4MDAwMworI2RlZmluZSBQQ01fTFJfT1VUX0xPQ0FMICAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX0xSX09VVF9SRU1PVEUgICAgICAgMHgwMDA0CisjZGVmaW5lIFBDTV9MUl9PVVRfTVVURSAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQQ01fTFJfT1VUX0JPVEggICAgICAgICAweDAwMEMKKyNkZWZpbmUgTElORTFfREFDX09VVF9MT0NBTCAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUxX0RBQ19PVVRfUkVNT1RFICAgIDB4MDAxMAorI2RlZmluZSBMSU5FMV9EQUNfT1VUX01VVEUgICAgICAweDAwMjAKKyNkZWZpbmUgTElORTFfREFDX09VVF9CT1RIICAgICAgMHgwMDMwCisjZGVmaW5lIFBDTV9DTFNfT1VUX0xPQ0FMICAgICAgIDB4MDAwMAorI2RlZmluZSBQQ01fQ0xTX09VVF9SRU1PVEUgICAgICAweDAwNDAKKyNkZWZpbmUgUENNX0NMU19PVVRfTVVURSAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBDTV9DTFNfT1VUX0JPVEggICAgICAgIDB4MDBDMAorI2RlZmluZSBQQ01fUkxGX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX1JMRl9PVVRfUkVNT1RFICAgICAgMHgwMTAwCisjZGVmaW5lIFBDTV9STEZfT1VUX01VVEUgICAgICAgIDB4MDIwMAorI2RlZmluZSBQQ01fUkxGX09VVF9CT1RIICAgICAgICAweDAzMDAKKyNkZWZpbmUgTElORTJfREFDX09VVF9MT0NBTCAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUyX0RBQ19PVVRfUkVNT1RFICAgIDB4MDQwMAorI2RlZmluZSBMSU5FMl9EQUNfT1VUX01VVEUgICAgICAweDA4MDAKKyNkZWZpbmUgTElORTJfREFDX09VVF9CT1RIICAgICAgMHgwQzAwCisjZGVmaW5lIEhBTkRTRVRfT1VUX0xPQ0FMICAgICAgIDB4MDAwMAorI2RlZmluZSBIQU5EU0VUX09VVF9SRU1PVEUgICAgICAweDEwMDAKKyNkZWZpbmUgSEFORFNFVF9PVVRfTVVURSAgICAgICAgMHgyMDAwCisjZGVmaW5lIEhBTkRTRVRfT1VUX0JPVEggICAgICAgIDB4MzAwMAorI2RlZmluZSBJT19DVFJMX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgSU9fQ1RSTF9PVVRfUkVNT1RFICAgICAgMHg0MDAwCisjZGVmaW5lIElPX0NUUkxfT1VUX01VVEUgICAgICAgIDB4ODAwMAorI2RlZmluZSBJT19DVFJMX09VVF9CT1RIICAgICAgICAweEMwMDAKKworI2RlZmluZSBTRE9fSU5fREVTVF9DVFJMICAgICAgICAweDNDCisjZGVmaW5lIFNUQVRVU19BRERSX0lOICAgICAgICAgIDB4MDAwMworI2RlZmluZSBQQ01fTFJfSU5fTE9DQUwgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX0xSX0lOX1JFTU9URSAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBDTV9MUl9SRVNFUlZFRCAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQQ01fTFJfSU5fQk9USCAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgTElORTFfQURDX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUxX0FEQ19JTl9SRU1PVEUgICAgIDB4MDAxMAorI2RlZmluZSBMSU5FMV9BRENfSU5fTVVURSAgICAgICAweDAwMjAKKyNkZWZpbmUgTUlDX0FEQ19JTl9MT0NBTCAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1JQ19BRENfSU5fUkVNT1RFICAgICAgIDB4MDA0MAorI2RlZmluZSBNSUNfQURDX0lOX01VVEUgICAgICAgICAweDAwODAKKyNkZWZpbmUgTElORTJfREFDX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUyX0RBQ19JTl9SRU1PVEUgICAgIDB4MDQwMAorI2RlZmluZSBMSU5FMl9EQUNfSU5fTVVURSAgICAgICAweDA4MDAKKyNkZWZpbmUgSEFORFNFVF9JTl9MT0NBTCAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhBTkRTRVRfSU5fUkVNT1RFICAgICAgIDB4MTAwMAorI2RlZmluZSBIQU5EU0VUX0lOX01VVEUgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSU9fU1RBVFVTX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIElPX1NUQVRVU19JTl9SRU1PVEUgICAgIDB4NDAwMAorCisjZGVmaW5lIFNQRElGX0lOX0NUUkwgICAgICAgICAgIDB4M0UKKyNkZWZpbmUgU1BESUZfSU5fRU5BQkxFICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgR1BJT19EQVRBICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBHUElPX0RBVEFfTUFTSyAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgR1BJT19IVl9TVEFUVVMgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEdQSU9fUE1FX1NUQVRVUyAgICAgICAgIDB4NDAwMAorCisjZGVmaW5lIEdQSU9fTUFTSyAgICAgICAgICAgICAgIDB4NjQKKyNkZWZpbmUgR1BJT19ESVJFQ1RJT04gICAgICAgICAgMHg2OAorI2RlZmluZSBHUE9fUFJJTUFSWV9BQzk3ICAgICAgICAweDAwMDEKKyNkZWZpbmUgR1BJX0xJTkVPVVRfU0VOU0UgICAgICAgMHgwMDA0CisjZGVmaW5lIEdQT19TRUNPTkRBUllfQUM5NyAgICAgIDB4MDAwOAorI2RlZmluZSBHUElfVk9MX0RPV04gICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgR1BJX1ZPTF9VUCAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEdQSV9JSVNfQ0xLICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBHUElfSUlTX0xSQ0xLICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgR1BJX0lJU19EQVRBICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEdQSV9ET0NLSU5HX1NUQVRVUyAgICAgIDB4MDEwMAorI2RlZmluZSBHUElfSEVBRFBIT05FX1NFTlNFICAgICAweDAyMDAKKyNkZWZpbmUgR1BPX0VYVF9BTVBfU0hVVERPV04gICAgMHgxMDAwCisKKyNkZWZpbmUgR1BPX0VYVF9BTVBfTTMJCTEJLyogZGVmYXVsdCBtMyBhbXAgKi8KKyNkZWZpbmUgR1BPX0VYVF9BTVBfQUxMRUdSTwk4CS8qIGRlZmF1bHQgYWxsZWdybyBhbXAgKi8KKworLyogTTMgKi8KKyNkZWZpbmUgR1BPX00zX0VYVF9BTVBfU0hVVEROICAgMHgwMDAyCisKKyNkZWZpbmUgQVNTUF9JTkRFWF9QT1JUICAgICAgICAgMHg4MAorI2RlZmluZSBBU1NQX01FTU9SWV9QT1JUICAgICAgICAweDgyCisjZGVmaW5lIEFTU1BfREFUQV9QT1JUICAgICAgICAgIDB4ODQKKworI2RlZmluZSBNUFU0MDFfREFUQV9QT1JUICAgICAgICAweDk4CisjZGVmaW5lIE1QVTQwMV9TVEFUVVNfUE9SVCAgICAgIDB4OTkKKworI2RlZmluZSBDTEtfTVVMVF9EQVRBX1BPUlQgICAgICAweDlDCisKKyNkZWZpbmUgQVNTUF9DT05UUk9MX0EgICAgICAgICAgMHhBMgorI2RlZmluZSBBU1NQXzBfV1NfRU5BQkxFICAgICAgICAweDAxCisjZGVmaW5lIEFTU1BfQ1RSTF9BX1JFU0VSVkVEMSAgIDB4MDIKKyNkZWZpbmUgQVNTUF9DVFJMX0FfUkVTRVJWRUQyICAgMHgwNAorI2RlZmluZSBBU1NQX0NMS180OU1IWl9TRUxFQ1QgICAweDA4CisjZGVmaW5lIEZBU1RfUExVX0VOQUJMRSAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVNTUF9DVFJMX0FfUkVTRVJWRUQzICAgMHgyMAorI2RlZmluZSBEU1BfQ0xLXzM2TUhaX1NFTEVDVCAgICAweDQwCisKKyNkZWZpbmUgQVNTUF9DT05UUk9MX0IgICAgICAgICAgMHhBNAorI2RlZmluZSBSRVNFVF9BU1NQICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJVTl9BU1NQICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRU5BQkxFX0FTU1BfQ0xPQ0sgICAgICAgMHgwMAorI2RlZmluZSBTVE9QX0FTU1BfQ0xPQ0sgICAgICAgICAweDEwCisjZGVmaW5lIFJFU0VUX1RPR0dMRSAgICAgICAgICAgIDB4NDAKKworI2RlZmluZSBBU1NQX0NPTlRST0xfQyAgICAgICAgICAweEE2CisjZGVmaW5lIEFTU1BfSE9TVF9JTlRfRU5BQkxFICAgIDB4MDEKKyNkZWZpbmUgRk1fQUREUl9SRU1BUF9ESVNBQkxFICAgMHgwMgorI2RlZmluZSBIT1NUX1dSSVRFX1BPUlRfRU5BQkxFICAweDA4CisKKyNkZWZpbmUgQVNTUF9IT1NUX0lOVF9TVEFUVVMgICAgMHhBQworI2RlZmluZSBEU1AySE9TVF9SRVFfUElPUkVDT1JEICAweDAxCisjZGVmaW5lIERTUDJIT1NUX1JFUV9JMlNSQVRFICAgIDB4MDIKKyNkZWZpbmUgRFNQMkhPU1RfUkVRX1RJTUVSICAgICAgMHgwNAorCisvKiBBQzk3IHJlZ2lzdGVycyAqLworLyogWFhYIGZpeCB0aGlzIGNyYXAgdXAgKi8KKy8qI2RlZmluZSBBQzk3X1JFU0VUICAgICAgICAgICAgICAweDAwKi8KKworI2RlZmluZSBBQzk3X1ZPTF9NVVRFX0IgICAgICAgICAweDgwMDAKKyNkZWZpbmUgQUM5N19WT0xfTSAgICAgICAgICAgICAgMHgxRgorI2RlZmluZSBBQzk3X0xFRlRfVk9MX1MgICAgICAgICA4CisKKyNkZWZpbmUgQUM5N19NQVNURVJfVk9MICAgICAgICAgMHgwMgorI2RlZmluZSBBQzk3X0xJTkVfTEVWRUxfVk9MICAgICAweDA0CisjZGVmaW5lIEFDOTdfTUFTVEVSX01PTk9fVk9MICAgIDB4MDYKKyNkZWZpbmUgQUM5N19QQ19CRUVQX1ZPTCAgICAgICAgMHgwQQorI2RlZmluZSBBQzk3X1BDX0JFRVBfVk9MX00gICAgICAweDBGCisjZGVmaW5lIEFDOTdfU1JPVU5EX01BU1RFUl9WT0wgIDB4MzgKKyNkZWZpbmUgQUM5N19QQ19CRUVQX1ZPTF9TICAgICAgMQorCisvKiNkZWZpbmUgQUM5N19QSE9ORV9WT0wgICAgICAgICAgMHgwQworI2RlZmluZSBBQzk3X01JQ19WT0wgICAgICAgICAgICAweDBFKi8KKyNkZWZpbmUgQUM5N19NSUNfMjBEQl9FTkFCTEUgICAgMHg0MAorCisvKiNkZWZpbmUgQUM5N19MSU5FSU5fVk9MICAgICAgICAgMHgxMAorI2RlZmluZSBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAweDEyCisjZGVmaW5lIEFDOTdfVklERU9fVk9MICAgICAgICAgIDB4MTQKKyNkZWZpbmUgQUM5N19BVVhfVk9MICAgICAgICAgICAgMHgxNiovCisjZGVmaW5lIEFDOTdfUENNX09VVF9WT0wgICAgICAgIDB4MTgKKy8qI2RlZmluZSBBQzk3X1JFQ09SRF9TRUxFQ1QgICAgICAweDFBKi8KKyNkZWZpbmUgQUM5N19SRUNPUkRfTUlDICAgICAgICAgMHgwMAorI2RlZmluZSBBQzk3X1JFQ09SRF9DRCAgICAgICAgICAweDAxCisjZGVmaW5lIEFDOTdfUkVDT1JEX1ZJREVPICAgICAgIDB4MDIKKyNkZWZpbmUgQUM5N19SRUNPUkRfQVVYICAgICAgICAgMHgwMworI2RlZmluZSBBQzk3X1JFQ09SRF9NT05PX01VWCAgICAweDAyCisjZGVmaW5lIEFDOTdfUkVDT1JEX0RJR0lUQUwgICAgIDB4MDMKKyNkZWZpbmUgQUM5N19SRUNPUkRfTElORSAgICAgICAgMHgwNAorI2RlZmluZSBBQzk3X1JFQ09SRF9TVEVSRU8gICAgICAweDA1CisjZGVmaW5lIEFDOTdfUkVDT1JEX01PTk8gICAgICAgIDB4MDYKKyNkZWZpbmUgQUM5N19SRUNPUkRfUEhPTkUgICAgICAgMHgwNworCisvKiNkZWZpbmUgQUM5N19SRUNPUkRfR0FJTiAgICAgICAgMHgxQyovCisjZGVmaW5lIEFDOTdfUkVDT1JEX1ZPTF9NICAgICAgIDB4MEYKKworLyojZGVmaW5lIEFDOTdfR0VORVJBTF9QVVJQT1NFICAgIDB4MjAqLworI2RlZmluZSBBQzk3X1BPV0VSX0RPV05fQ1RSTCAgICAweDI2CisjZGVmaW5lIEFDOTdfQURDX1JFQURZICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQzk3X0RBQ19SRUFEWSAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgQUM5N19BTkFMT0dfUkVBRFkgICAgICAgMHgwMDA0CisjZGVmaW5lIEFDOTdfVlJFRl9PTiAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBQzk3X1BSMCAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQUM5N19QUjEgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFDOTdfUFIyICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBQzk3X1BSMyAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQUM5N19QUjQgICAgICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgQUM5N19SRVNFUlZFRDEgICAgICAgICAgMHgyOAorCisjZGVmaW5lIEFDOTdfVkVORE9SX1RFU1QgICAgICAgIDB4NUEKKworI2RlZmluZSBBQzk3X0NMT0NLX0RFTEFZICAgICAgICAweDVDCisjZGVmaW5lIEFDOTdfTElORU9VVF9NVVhfU0VMICAgIDB4MDAwMQorI2RlZmluZSBBQzk3X01PTk9fTVVYX1NFTCAgICAgICAweDAwMDIKKyNkZWZpbmUgQUM5N19DTE9DS19ERUxBWV9TRUwgICAgMHgxRgorI2RlZmluZSBBQzk3X0RBQ19DRFNfU0hJRlQgICAgICA2CisjZGVmaW5lIEFDOTdfQURDX0NEU19TSElGVCAgICAgIDExCisKKyNkZWZpbmUgQUM5N19NVUxUSV9DSEFOTkVMX1NFTCAgMHg3NAorCisvKiNkZWZpbmUgQUM5N19WRU5ET1JfSUQxICAgICAgICAgMHg3QworI2RlZmluZSBBQzk3X1ZFTkRPUl9JRDIgICAgICAgICAweDdFKi8KKworLyoKKyAqIEFTU1AgY29udHJvbCByZWdzCisgKi8KKyNkZWZpbmUgRFNQX1BPUlRfVElNRVJfQ09VTlQgICAgMHgwNgorCisjZGVmaW5lIERTUF9QT1JUX01FTU9SWV9JTkRFWCAgIDB4ODAKKworI2RlZmluZSBEU1BfUE9SVF9NRU1PUllfVFlQRSAgICAweDgyCisjZGVmaW5lIE1FTVRZUEVfSU5URVJOQUxfQ09ERSAgIDB4MDAwMgorI2RlZmluZSBNRU1UWVBFX0lOVEVSTkFMX0RBVEEgICAweDAwMDMKKyNkZWZpbmUgTUVNVFlQRV9NQVNLICAgICAgICAgICAgMHgwMDAzCisKKyNkZWZpbmUgRFNQX1BPUlRfTUVNT1JZX0RBVEEgICAgMHg4NAorCisjZGVmaW5lIERTUF9QT1JUX0NPTlRST0xfUkVHX0EgIDB4QTIKKyNkZWZpbmUgRFNQX1BPUlRfQ09OVFJPTF9SRUdfQiAgMHhBNAorI2RlZmluZSBEU1BfUE9SVF9DT05UUk9MX1JFR19DICAweEE2CisKKyNkZWZpbmUgUkVWX0FfQ09ERV9NRU1PUllfQkVHSU4gICAgICAgICAweDAwMDAKKyNkZWZpbmUgUkVWX0FfQ09ERV9NRU1PUllfRU5EICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUkVWX0FfQ09ERV9NRU1PUllfVU5JVF9MRU5HVEggICAweDAwNDAKKyNkZWZpbmUgUkVWX0FfQ09ERV9NRU1PUllfTEVOR1RIICAgICAgICAoUkVWX0FfQ09ERV9NRU1PUllfRU5EIC0gUkVWX0FfQ09ERV9NRU1PUllfQkVHSU4gKyAxKQorCisjZGVmaW5lIFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFJFVl9CX0NPREVfTUVNT1JZX0VORCAgICAgICAgICAgMHgwQkZGCisjZGVmaW5lIFJFVl9CX0NPREVfTUVNT1JZX1VOSVRfTEVOR1RIICAgMHgwMDQwCisjZGVmaW5lIFJFVl9CX0NPREVfTUVNT1JZX0xFTkdUSCAgICAgICAgKFJFVl9CX0NPREVfTUVNT1JZX0VORCAtIFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOICsgMSkKKworI2RlZmluZSBSRVZfQV9EQVRBX01FTU9SWV9CRUdJTiAgICAgICAgIDB4MTAwMAorI2RlZmluZSBSRVZfQV9EQVRBX01FTU9SWV9FTkQgICAgICAgICAgIDB4MkZGRgorI2RlZmluZSBSRVZfQV9EQVRBX01FTU9SWV9VTklUX0xFTkdUSCAgIDB4MDA4MAorI2RlZmluZSBSRVZfQV9EQVRBX01FTU9SWV9MRU5HVEggICAgICAgIChSRVZfQV9EQVRBX01FTU9SWV9FTkQgLSBSRVZfQV9EQVRBX01FTU9SWV9CRUdJTiArIDEpCisKKyNkZWZpbmUgUkVWX0JfREFUQV9NRU1PUllfQkVHSU4gICAgICAgICAweDEwMDAKKyNkZWZpbmUgUkVWX0JfREFUQV9NRU1PUllfRU5EICAgICAgICAgICAweDJCRkYKKyNkZWZpbmUgUkVWX0JfREFUQV9NRU1PUllfVU5JVF9MRU5HVEggICAweDAwODAKKyNkZWZpbmUgUkVWX0JfREFUQV9NRU1PUllfTEVOR1RIICAgICAgICAoUkVWX0JfREFUQV9NRU1PUllfRU5EIC0gUkVWX0JfREFUQV9NRU1PUllfQkVHSU4gKyAxKQorCisKKyNkZWZpbmUgTlVNX1VOSVRTX0tFUk5FTF9DT0RFICAgICAgICAgIDE2CisjZGVmaW5lIE5VTV9VTklUU19LRVJORUxfREFUQSAgICAgICAgICAgMgorCisjZGVmaW5lIE5VTV9VTklUU19LRVJORUxfQ09ERV9XSVRIX0hTUCAxNgorI2RlZmluZSBOVU1fVU5JVFNfS0VSTkVMX0RBVEFfV0lUSF9IU1AgIDUKKworLyoKKyAqIEtlcm5lbCBkYXRhIGxheW91dAorICovCisKKyNkZWZpbmUgRFBfU0hJRlRfQ09VTlQgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgS0RBVEFfQkFTRV9BRERSICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgS0RBVEFfQkFTRV9BRERSMiAgICAgICAgICAgICAgICAweDEwODAKKworI2RlZmluZSBLREFUQV9UQVNLMCAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDApCisjZGVmaW5lIEtEQVRBX1RBU0sxICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwMSkKKyNkZWZpbmUgS0RBVEFfVEFTSzIgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDAyKQorI2RlZmluZSBLREFUQV9UQVNLMyAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDMpCisjZGVmaW5lIEtEQVRBX1RBU0s0ICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwNCkKKyNkZWZpbmUgS0RBVEFfVEFTSzUgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA1KQorI2RlZmluZSBLREFUQV9UQVNLNiAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDYpCisjZGVmaW5lIEtEQVRBX1RBU0s3ICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwNykKKyNkZWZpbmUgS0RBVEFfVEFTS19FTkRNQVJLICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA4KQorCisjZGVmaW5lIEtEQVRBX0NVUlJFTlRfVEFTSyAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwOSkKKyNkZWZpbmUgS0RBVEFfVEFTS19TV0lUQ0ggICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBBKQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwQikKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UxX1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBDKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTJfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEQpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFM19QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwRSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0U0X1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBGKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTVfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTApCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFNl9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxMSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0U3X1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDEyKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRThfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTMpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX1BPUzNEX0VORE1BUksgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxNCkKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfU1BLVklSVCAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTUpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX1NQS1ZJUlRfRU5ETUFSSyAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxNikKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfU1BESUYgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTcpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX1NQRElGX0VORE1BUksgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxOCkKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfTU9ERU0gICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTkpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX01PREVNX0VORE1BUksgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxQSkKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfU1JDICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUIpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMV9TUkMgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxQykKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfU1JDX0VORE1BUksgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFEKQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9NSU5JU1JDICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxRSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UxX01JTklTUkMgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFGKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTJfTUlOSVNSQyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjApCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFM19NSU5JU1JDICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyMSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfTUlOSVNSQ19FTkRNQVJLICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDIyKQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9DUFlUSFJVICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyMykKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UxX0NQWVRIUlUgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI0KQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9DUFlUSFJVX0VORE1BUksgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjUpCisKKyNkZWZpbmUgS0RBVEFfQ1VSUkVOVF9ETUEgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI2KQorI2RlZmluZSBLREFUQV9ETUFfU1dJVENIICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjcpCisjZGVmaW5lIEtEQVRBX0RNQV9BQ1RJVkUgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyOCkKKworI2RlZmluZSBLREFUQV9ETUFfWEZFUjAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjkpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSMSAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyQSkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVIyICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJCKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjMgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkMpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSNCAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyRCkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVI1ICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJFKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjYgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkYpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSNyAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzMCkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVI4ICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDMxKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUl9FTkRNQVJLICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzIpCisKKyNkZWZpbmUgS0RBVEFfSTJTX1NBTVBMRV9DT1VOVCAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDMzKQorI2RlZmluZSBLREFUQV9JMlNfSU5UX01FVEVSICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzQpCisjZGVmaW5lIEtEQVRBX0kyU19BQ1RJVkUgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzNSkKKworI2RlZmluZSBLREFUQV9USU1FUl9DT1VOVF9SRUxPQUQgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzYpCisjZGVmaW5lIEtEQVRBX1RJTUVSX0NPVU5UX0NVUlJFTlQgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzNykKKworI2RlZmluZSBLREFUQV9IQUxUX1NZTkNIX0NMSUVOVCAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzgpCisjZGVmaW5lIEtEQVRBX0hBTFRfU1lOQ0hfRE1BICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzOSkKKyNkZWZpbmUgS0RBVEFfSEFMVF9BQ0tOT1dMRURHRSAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNBKQorCisjZGVmaW5lIEtEQVRBX0FEQzFfWEZFUjAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzQikKKyNkZWZpbmUgS0RBVEFfQURDMV9YRkVSX0VORE1BUksgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNDKQorI2RlZmluZSBLREFUQV9BREMxX0xFRlRfVk9MVU1FCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzRCkKKyNkZWZpbmUgS0RBVEFfQURDMV9SSUdIVF9WT0xVTUUgIAkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzRSkKKyNkZWZpbmUgS0RBVEFfQURDMV9MRUZUX1NVUl9WT0wJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNGKQorI2RlZmluZSBLREFUQV9BREMxX1JJR0hUX1NVUl9WT0wJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDApCisKKyNkZWZpbmUgS0RBVEFfQURDMl9YRkVSMCAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQxKQorI2RlZmluZSBLREFUQV9BREMyX1hGRVJfRU5ETUFSSyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNDIpCisjZGVmaW5lIEtEQVRBX0FEQzJfTEVGVF9WT0xVTUUJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQzKQorI2RlZmluZSBLREFUQV9BREMyX1JJR0hUX1ZPTFVNRQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDQpCisjZGVmaW5lIEtEQVRBX0FEQzJfTEVGVF9TVVJfVk9MCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0NSkKKyNkZWZpbmUgS0RBVEFfQURDMl9SSUdIVF9TVVJfVk9MCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ2KQorCisjZGVmaW5lIEtEQVRBX0NEX1hGRVIwCQkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ3KQkJCQkJCisjZGVmaW5lIEtEQVRBX0NEX1hGRVJfRU5ETUFSSwkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDgpCisjZGVmaW5lIEtEQVRBX0NEX0xFRlRfVk9MVU1FCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0OSkKKyNkZWZpbmUgS0RBVEFfQ0RfUklHSFRfVk9MVU1FCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0QSkKKyNkZWZpbmUgS0RBVEFfQ0RfTEVGVF9TVVJfVk9MCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0QikKKyNkZWZpbmUgS0RBVEFfQ0RfUklHSFRfU1VSX1ZPTAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEMpCisKKyNkZWZpbmUgS0RBVEFfTUlDX1hGRVIwCQkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDREKQorI2RlZmluZSBLREFUQV9NSUNfWEZFUl9FTkRNQVJLCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0RSkKKyNkZWZpbmUgS0RBVEFfTUlDX1ZPTFVNRQkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDRGKQorI2RlZmluZSBLREFUQV9NSUNfU1VSX1ZPTAkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDUwKQorCisjZGVmaW5lIEtEQVRBX0kyU19YRkVSMCAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1MSkKKyNkZWZpbmUgS0RBVEFfSTJTX1hGRVJfRU5ETUFSSyAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDUyKQorCisjZGVmaW5lIEtEQVRBX0NISV9YRkVSMCAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1MykKKyNkZWZpbmUgS0RBVEFfQ0hJX1hGRVJfRU5ETUFSSyAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU0KQorCisjZGVmaW5lIEtEQVRBX1NQRElGX1hGRVIgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1NSkKKyNkZWZpbmUgS0RBVEFfU1BESUZfQ1VSUkVOVF9GUkFNRSAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU2KQorI2RlZmluZSBLREFUQV9TUERJRl9GUkFNRTAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTcpCisjZGVmaW5lIEtEQVRBX1NQRElGX0ZSQU1FMSAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1OCkKKyNkZWZpbmUgS0RBVEFfU1BESUZfRlJBTUUyICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU5KQorCisjZGVmaW5lIEtEQVRBX1NQRElGX1JFUVVFU1QgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1QSkKKyNkZWZpbmUgS0RBVEFfU1BESUZfVEVNUCAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVCKQorCisjZGVmaW5lIEtEQVRBX1NQRElGSU5fWEZFUjAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1QykKKyNkZWZpbmUgS0RBVEFfU1BESUZJTl9YRkVSX0VORE1BUksgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVEKQorI2RlZmluZSBLREFUQV9TUERJRklOX0lOVF9NRVRFUiAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUUpCisKKyNkZWZpbmUgS0RBVEFfRFNQX1JFU0VUX0NPVU5UICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVGKQorI2RlZmluZSBLREFUQV9ERUJVR19PVVRQVVQgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjApCisKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9MSVNUICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDYxKQorCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQ0JTUjEgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2MikKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9DQkVSMSAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDYzKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0NCQ1IgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjQpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVIwICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2NSkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjEgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY2KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSMiAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjcpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVIzICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2OCkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjQgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY5KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSNSAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkEpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQlJDUiAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2QikKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9QQVNSICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZDKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX1BBRVIgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkQpCisKKyNkZWZpbmUgS0RBVEFfQ0xJRU5UX1NDUkFUQ0gwICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZFKQorI2RlZmluZSBLREFUQV9DTElFTlRfU0NSQVRDSDEgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkYpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9TQ1JBVENIICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3MCkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9TQ1JBVENIICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDcxKQorCisjZGVmaW5lIEtEQVRBX09VRVVFX0xFRlQgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3MikKKyNkZWZpbmUgS0RBVEFfUVVFVUVfUklHSFQgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDczKQorCisjZGVmaW5lIEtEQVRBX0FEQzFfUkVRVUVTVCAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3NCkKKyNkZWZpbmUgS0RBVEFfQURDMl9SRVFVRVNUICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc1KQorI2RlZmluZSBLREFUQV9DRF9SRVFVRVNUCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNzYpCisjZGVmaW5lIEtEQVRBX01JQ19SRVFVRVNUCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNzcpCisKKyNkZWZpbmUgS0RBVEFfQURDMV9NSVhFUl9SRVFVRVNUICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc4KQorI2RlZmluZSBLREFUQV9BREMyX01JWEVSX1JFUVVFU1QgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzkpCisjZGVmaW5lIEtEQVRBX0NEX01JWEVSX1JFUVVFU1QJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDdBKQorI2RlZmluZSBLREFUQV9NSUNfTUlYRVJfUkVRVUVTVAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwN0IpCisjZGVmaW5lIEtEQVRBX01JQ19TWU5DX0NPVU5URVIJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDdDKQorCisvKgorICogc2Vjb25kICdzZWdtZW50JyAoPykgcmVzZXJ2ZWQgZm9yIG1peGVyCisgKiBidWZmZXJzLi4KKyAqLworCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQwICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDApCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQxICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDEpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQyICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDIpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQzICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDMpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ0ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDQpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ1ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDUpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ2ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDYpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ3ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDcpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ4ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDgpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkQ5ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMDkpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkRBICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEEpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkRCICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEIpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkRDICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEMpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkREICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEQpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkRFICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEUpCisjZGVmaW5lIEtEQVRBX01JWEVSX1dPUkRGICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMEYpCisKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxMCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjEgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxMSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjIgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxMikKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjMgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxMykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjQgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxNCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjUgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxNSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjYgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxNikKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjcgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxNykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjggICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxOCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUjkgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxOSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfWEZFUl9FTkRNQVJLICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxQSkKKworI2RlZmluZSBLREFUQV9NSVhFUl9UQVNLX05VTUJFUiAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFCKQorI2RlZmluZSBLREFUQV9DVVJSRU5UX01JWEVSICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFDKQorI2RlZmluZSBLREFUQV9NSVhFUl9BQ1RJVkUgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFEKQorI2RlZmluZSBLREFUQV9NSVhFUl9CQU5LX1NUQVRVUyAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFFKQorI2RlZmluZSBLREFUQV9EQUNfTEVGVF9WT0xVTUUJICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxRikKKyNkZWZpbmUgS0RBVEFfREFDX1JJR0hUX1ZPTFVNRSAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAyMCkKKworI2RlZmluZSBNQVhfSU5TVEFOQ0VfTUlOSVNSQyAgICAgICAgICAgIChLREFUQV9JTlNUQU5DRV9NSU5JU1JDX0VORE1BUksgLSBLREFUQV9JTlNUQU5DRTBfTUlOSVNSQykKKyNkZWZpbmUgTUFYX1ZJUlRVQUxfRE1BX0NIQU5ORUxTICAgICAgICAoS0RBVEFfRE1BX1hGRVJfRU5ETUFSSyAtIEtEQVRBX0RNQV9YRkVSMCkKKyNkZWZpbmUgTUFYX1ZJUlRVQUxfTUlYRVJfQ0hBTk5FTFMgICAgICAoS0RBVEFfTUlYRVJfWEZFUl9FTkRNQVJLIC0gS0RBVEFfTUlYRVJfWEZFUjApCisjZGVmaW5lIE1BWF9WSVJUVUFMX0FEQzFfQ0hBTk5FTFMgICAgICAgKEtEQVRBX0FEQzFfWEZFUl9FTkRNQVJLIC0gS0RBVEFfQURDMV9YRkVSMCkKKworLyoKKyAqIGNsaWVudCBkYXRhIGFyZWEgb2Zmc2V0cworICovCisjZGVmaW5lIENEQVRBX0lOU1RBTkNFX1JFQURZICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0FERFJMICAgICAgICAgICAgMHgwMQorI2RlZmluZSBDREFUQV9IT1NUX1NSQ19BRERSSCAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfRU5EX1BMVVNfMUwgICAgICAweDAzCisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFIICAgICAgMHgwNAorI2RlZmluZSBDREFUQV9IT1NUX1NSQ19DVVJSRU5UTCAgICAgICAgIDB4MDUKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfQ1VSUkVOVEggICAgICAgICAweDA2CisKKyNkZWZpbmUgQ0RBVEFfSU5fQlVGX0NPTk5FQ1QgICAgICAgICAgICAweDA3CisjZGVmaW5lIENEQVRBX09VVF9CVUZfQ09OTkVDVCAgICAgICAgICAgMHgwOAorCisjZGVmaW5lIENEQVRBX0lOX0JVRl9CRUdJTiAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBDREFUQV9JTl9CVUZfRU5EX1BMVVNfMSAgICAgICAgIDB4MEEKKyNkZWZpbmUgQ0RBVEFfSU5fQlVGX0hFQUQgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIENEQVRBX0lOX0JVRl9UQUlMICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBDREFUQV9PVVRfQlVGX0JFR0lOICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgQ0RBVEFfT1VUX0JVRl9FTkRfUExVU18xICAgICAgICAweDBFCisjZGVmaW5lIENEQVRBX09VVF9CVUZfSEVBRCAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBDREFUQV9PVVRfQlVGX1RBSUwgICAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBDREFUQV9ETUFfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgQ0RBVEFfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAweDEyCisKKyNkZWZpbmUgQ0RBVEFfRlJFUVVFTkNZICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIENEQVRBX0xFRlRfVk9MVU1FICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBDREFUQV9SSUdIVF9WT0xVTUUgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgQ0RBVEFfTEVGVF9TVVJfVk9MICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIENEQVRBX1JJR0hUX1NVUl9WT0wgICAgICAgICAgICAgMHgxNworCisjZGVmaW5lIENEQVRBX0hFQURFUl9MRU4gICAgICAgICAgICAgICAgMHgxOAorCisjZGVmaW5lIFNSQzNfRElSRUNUSU9OX09GRlNFVCAgICAgICAgICAgQ0RBVEFfSEVBREVSX0xFTgorI2RlZmluZSBTUkMzX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgIChDREFUQV9IRUFERVJfTEVOICsgMSkKKyNkZWZpbmUgU1JDM19XT1JEX0xFTkdUSF9PRkZTRVQgICAgICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDIpCisjZGVmaW5lIFNSQzNfUEFSQU1FVEVSX09GRlNFVCAgICAgICAgICAgKENEQVRBX0hFQURFUl9MRU4gKyAzKQorI2RlZmluZSBTUkMzX0NPRUZGX0FERFJfT0ZGU0VUICAgICAgICAgIChDREFUQV9IRUFERVJfTEVOICsgOCkKKyNkZWZpbmUgU1JDM19GSUxUQVBfQUREUl9PRkZTRVQgICAgICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDEwKQorI2RlZmluZSBTUkMzX1RFTVBfSU5CVUZfQUREUl9PRkZTRVQgICAgIChDREFUQV9IRUFERVJfTEVOICsgMTYpCisjZGVmaW5lIFNSQzNfVEVNUF9PVVRCVUZfQUREUl9PRkZTRVQgICAgKENEQVRBX0hFQURFUl9MRU4gKyAxNykKKworI2RlZmluZSBNSU5JU1JDX0lOX0JVRkZFUl9TSVpFICAgKCAweDUwICogMiApCisjZGVmaW5lIE1JTklTUkNfT1VUX0JVRkZFUl9TSVpFICAoIDB4NTAgKiAyICogMikKKyNkZWZpbmUgTUlOSVNSQ19PVVRfQlVGRkVSX1NJWkUgICggMHg1MCAqIDIgKiAyKQorI2RlZmluZSBNSU5JU1JDX1RNUF9CVUZGRVJfU0laRSAgKCAxMTIgKyAoIE1JTklTUkNfQklRVUFEX1NUQUdFICogMyArIDQgKSAqIDIgKiAyICkKKyNkZWZpbmUgTUlOSVNSQ19CSVFVQURfU1RBR0UgICAgMgorI2RlZmluZSBNSU5JU1JDX0NPRUZfTE9DICAgICAgICAgIDB4MTc1CisKKyNkZWZpbmUgRE1BQ09OVFJPTF9CTE9DS19NQVNLICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgIERNQUNfQkxPQ0swX1NFTEVDVE9SICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgIERNQUNfQkxPQ0sxX1NFTEVDVE9SICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgIERNQUNfQkxPQ0syX1NFTEVDVE9SICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgIERNQUNfQkxPQ0szX1NFTEVDVE9SICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgIERNQUNfQkxPQ0s0X1NFTEVDVE9SICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgIERNQUNfQkxPQ0s1X1NFTEVDVE9SICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgIERNQUNfQkxPQ0s2X1NFTEVDVE9SICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgIERNQUNfQkxPQ0s3X1NFTEVDVE9SICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgIERNQUNfQkxPQ0s4X1NFTEVDVE9SICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgIERNQUNfQkxPQ0s5X1NFTEVDVE9SICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgIERNQUNfQkxPQ0tBX1NFTEVDVE9SICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgIERNQUNfQkxPQ0tCX1NFTEVDVE9SICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgIERNQUNfQkxPQ0tDX1NFTEVDVE9SICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgIERNQUNfQkxPQ0tEX1NFTEVDVE9SICAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgIERNQUNfQkxPQ0tFX1NFTEVDVE9SICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgIERNQUNfQkxPQ0tGX1NFTEVDVE9SICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgRE1BQ09OVFJPTF9QQUdFX01BU0sgICAgICAgICAgICAweDAwRjAKKyNkZWZpbmUgIERNQUNfUEFHRTBfU0VMRUNUT1IgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgIERNQUNfUEFHRTFfU0VMRUNUT1IgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgIERNQUNfUEFHRTJfU0VMRUNUT1IgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgIERNQUNfUEFHRTNfU0VMRUNUT1IgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgRE1BQ09OVFJPTF9BVVRPUkVQRUFUICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRE1BQ09OVFJPTF9TVE9QUEVEICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRE1BQ09OVFJPTF9ESVJFQ1RJT04gICAgICAgICAgICAweDAxMDAKKworLyoKKyAqIGFuIGFyYml0cmFyeSB2b2x1bWUgd2Ugc2V0IHRoZSBpbnRlcm5hbAorICogdm9sdW1lIHNldHRpbmdzIHRvIHNvIHRoYXQgdGhlIGFjOTcgdm9sdW1lCisgKiByYW5nZSBpcyBhIGxpdHRsZSBsZXNzIGluc2FuZS4gIDB4N2ZmZiBpcyAKKyAqIG1heC4KKyAqLworI2RlZmluZSBBUkJfVk9MVU1FICggMHg2ODAwICkKKworLyoKKyAqLworCit0eXBlZGVmIHN0cnVjdCBzbmRfbTNfZG1hIG0zX2RtYV90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX20zIG0zX3Q7CisKKy8qIHF1aXJrIGxpc3RzICovCitzdHJ1Y3QgbTNfcXVpcmsgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGRldmljZSBuYW1lICovCisJdTE2IHZlbmRvciwgZGV2aWNlOwkvKiBzdWJzeXN0ZW0gaWRzICovCisJaW50IGFtcF9ncGlvOwkJLyogZ3BpbyBwaW4gIyAgZm9yIGV4dGVybmFsIGFtcCwgLTEgPSBkZWZhdWx0ICovCisJaW50IGlyZGFfd29ya2Fyb3VuZDsJLyogbm9uLXplcm8gaWYgYXZvaWQgdG8gdG91Y2ggMHgxMCBvbiBHUElPX0RJUkVDVElPTgorCQkJCSAgIChlLmcuIGZvciBJckRBIG9uIERlbGwgSW5zcGlyb25zKSAqLworfTsKKworc3RydWN0IG0zX2xpc3QgeworCWludCBjdXJsZW47CisJaW50IG1lbV9hZGRyOworCWludCBtYXg7Cit9OworCitzdHJ1Y3Qgc25kX20zX2RtYSB7CisKKwlpbnQgbnVtYmVyOworCW0zX3QgKmNoaXA7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCisJc3RydWN0IGFzc3BfaW5zdGFuY2UgeworCQl1bnNpZ25lZCBzaG9ydCBjb2RlLCBkYXRhOworCX0gaW5zdDsKKworCWludCBydW5uaW5nOworCWludCBvcGVuZWQ7CisKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9hZGRyOworCWludCBkbWFfc2l6ZTsKKwlpbnQgcGVyaW9kX3NpemU7CisJdW5zaWduZWQgaW50IGh3cHRyOworCWludCBjb3VudDsKKworCWludCBpbmRleFszXTsKKwlzdHJ1Y3QgbTNfbGlzdCAqaW5kZXhfbGlzdFszXTsKKworICAgICAgICBpbnQgaW5fbGlzdHM7CisJCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCit9OworICAgIAorc3RydWN0IHNuZF9tMyB7CisJCisJc25kX2NhcmRfdCAqY2FyZDsKKworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCisJaW50IGlycTsKKwl1bnNpZ25lZCBpbnQgYWxsZWdyb19mbGFnIDogMTsKKworCWFjOTdfdCAqYWM5NzsKKworCXNuZF9wY21fdCAqcGNtOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzdHJ1Y3QgbTNfcXVpcmsgKnF1aXJrOworCisJaW50IGRhY3NfYWN0aXZlOworCWludCB0aW1lcl91c2VyczsKKworCXN0cnVjdCBtM19saXN0ICBtc3JjX2xpc3Q7CisJc3RydWN0IG0zX2xpc3QgIG1peGVyX2xpc3Q7CisJc3RydWN0IG0zX2xpc3QgIGFkYzFfbGlzdDsKKwlzdHJ1Y3QgbTNfbGlzdCAgZG1hX2xpc3Q7CisKKwkvKiBmb3Igc3RvcmluZyByZXNldCBzdGF0ZS4uKi8KKwl1OCByZXNldF9zdGF0ZTsKKworCWludCBleHRlcm5hbF9hbXA7CisJaW50IGFtcF9ncGlvOworCisJLyogbWlkaSAqLworCXNuZF9yYXdtaWRpX3QgKnJtaWRpOworCisJLyogcGNtIHN0cmVhbXMgKi8KKwlpbnQgbnVtX3N1YnN0cmVhbXM7CisJbTNfZG1hX3QgKnN1YnN0cmVhbXM7CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCisjaWZkZWYgQ09ORklHX1BNCisJdTE2ICpzdXNwZW5kX21lbTsKKyNlbmRpZgorfTsKKworLyoKKyAqIHBjaSBpZHMKKyAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRVNTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTICAgICAgICAgMHgxMjVECisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfQUxMRUdST18xCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0FMTEVHUk9fMQkweDE5ODgKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VTU19BTExFR1JPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0FMTEVHUk8JMHgxOTg5CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfQ0FOWU9OM0RfMkxFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0NBTllPTjNEXzJMRQkweDE5OTAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VTU19DQU5ZT04zRF8yCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0NBTllPTjNEXzIJMHgxOTkyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfTUFFU1RSTzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfTUFFU1RSTzMJMHgxOTk4CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfTUFFU1RSTzNfMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19NQUVTVFJPM18xCTB4MTk5OQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRVNTX01BRVNUUk8zX0hXCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX01BRVNUUk8zX0hXCTB4MTk5YQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRVNTX01BRVNUUk8zXzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfTUFFU1RSTzNfMgkweDE5OWIKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX20zX2lkc1tdID0geworCXtQQ0lfVkVORE9SX0lEX0VTUywgUENJX0RFVklDRV9JRF9FU1NfQUxMRUdST18xLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19BTExFR1JPLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19DQU5ZT04zRF8yTEUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsIDB4ZmZmZjAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9FU1MsIFBDSV9ERVZJQ0VfSURfRVNTX0NBTllPTjNEXzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsIDB4ZmZmZjAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9FU1MsIFBDSV9ERVZJQ0VfSURfRVNTX01BRVNUUk8zLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19NQUVTVFJPM18xLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19NQUVTVFJPM19IVywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0VTUywgUENJX0RFVklDRV9JRF9FU1NfTUFFU1RSTzNfMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIDB9LAorCXswLH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX20zX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgbTNfcXVpcmsgbTNfcXVpcmtfbGlzdFtdID0geworCS8qIHBhbmFzb25pYyBDRi0yOCAidG91Z2hib29rIiAqLworCXsKKwkJLm5hbWUgPSAiUGFuYXNvbmljIENGLTI4IiwKKwkJLnZlbmRvciA9IDB4MTBmNywKKwkJLmRldmljZSA9IDB4ODMzZSwKKwkJLmFtcF9ncGlvID0gMHgwZCwKKwl9LAorCS8qIHBhbmFzb25pYyBDRi03MiAidG91Z2hib29rIiAqLworCXsKKwkJLm5hbWUgPSAiUGFuYXNvbmljIENGLTcyIiwKKwkJLnZlbmRvciA9IDB4MTBmNywKKwkJLmRldmljZSA9IDB4ODMzZCwKKwkJLmFtcF9ncGlvID0gMHgwZCwKKwl9LAorCS8qIERlbGwgSW5zcGlyb24gNDAwMCAqLworCXsKKwkJLm5hbWUgPSAiRGVsbCBJbnNwaXJvbiA0MDAwIiwKKwkJLnZlbmRvciA9IDB4MTAyOCwKKwkJLmRldmljZSA9IDB4MDBiMCwKKwkJLmFtcF9ncGlvID0gLTEsCisJCS5pcmRhX3dvcmthcm91bmQgPSAxLAorCX0sCisJLyogRGVsbCBJbnNwaXJvbiA4MDAwICovCisJeworCQkubmFtZSA9ICJEZWxsIEluc3Bpcm9uIDgwMDAiLAorCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMGE0LAorCQkuYW1wX2dwaW8gPSAtMSwKKwkJLmlyZGFfd29ya2Fyb3VuZCA9IDEsCisJfSwKKwkvKiBEZWxsIEluc3Bpcm9uIDgxMDAgKi8KKwl7CisJCS5uYW1lID0gIkRlbGwgSW5zcGlyb24gODEwMCIsCisJCS52ZW5kb3IgPSAweDEwMjgsCisJCS5kZXZpY2UgPSAweDAwZTYsCisJCS5hbXBfZ3BpbyA9IC0xLAorCQkuaXJkYV93b3JrYXJvdW5kID0gMSwKKwl9LAorCS8qIE5FQyBMTTgwMEovNyAqLworCXsKKwkJLm5hbWUgPSAiTkVDIExNODAwSi83IiwKKwkJLnZlbmRvciA9IDB4MTAzMywKKwkJLmRldmljZSA9IDB4ODBmMSwKKwkJLmFtcF9ncGlvID0gMHgwMywKKwl9LAorCS8qIExFR0VORCBaaGFvWWFuZyAzMTAwQ0YgKi8KKwl7CisJCS5uYW1lID0gIkxFR0VORCBaaGFvWWFuZyAzMTAwQ0YiLAorCQkudmVuZG9yID0gMHgxNTA5LAorCQkuZGV2aWNlID0gMHgxNzQwLAorCQkuYW1wX2dwaW8gPSAweDAzLAorCX0sCisJLyogRU5EICovCisJeyBOVUxMIH0KK307CisKKworLyoKKyAqIGxvd2xldmVsIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgYmlnX21kZWxheShtc2VjKSBkbyB7XAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTtcCisJc2NoZWR1bGVfdGltZW91dCgoKG1zZWMpICogSFopIC8gMTAwMCk7XAorfSB3aGlsZSAoMCkKKwkKK2lubGluZSBzdGF0aWMgdm9pZCBzbmRfbTNfb3V0dyhtM190ICpjaGlwLCB1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCW91dHcodmFsdWUsIGNoaXAtPmlvYmFzZSArIHJlZyk7Cit9CisKK2lubGluZSBzdGF0aWMgdTE2IHNuZF9tM19pbncobTNfdCAqY2hpcCwgdW5zaWduZWQgbG9uZyByZWcpCit7CisJcmV0dXJuIGludyhjaGlwLT5pb2Jhc2UgKyByZWcpOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgc25kX20zX291dGIobTNfdCAqY2hpcCwgdTggdmFsdWUsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCW91dGIodmFsdWUsIGNoaXAtPmlvYmFzZSArIHJlZyk7Cit9CisKK2lubGluZSBzdGF0aWMgdTggc25kX20zX2luYihtM190ICpjaGlwLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gaW5iKGNoaXAtPmlvYmFzZSArIHJlZyk7Cit9CisKKy8qCisgKiBhY2Nlc3MgMTZiaXQgd29yZHMgdG8gdGhlIGNvZGUgb3IgZGF0YSByZWdpb25zIG9mIHRoZSBkc3AncyBtZW1vcnkuCisgKiBpbmRleCBhZGRyZXNzZXMgMTZiaXQgd29yZHMuCisgKi8KK3N0YXRpYyB1MTYgc25kX20zX2Fzc3BfcmVhZChtM190ICpjaGlwLCB1MTYgcmVnaW9uLCB1MTYgaW5kZXgpCit7CisJc25kX20zX291dHcoY2hpcCwgcmVnaW9uICYgTUVNVFlQRV9NQVNLLCBEU1BfUE9SVF9NRU1PUllfVFlQRSk7CisJc25kX20zX291dHcoY2hpcCwgaW5kZXgsIERTUF9QT1JUX01FTU9SWV9JTkRFWCk7CisJcmV0dXJuIHNuZF9tM19pbncoY2hpcCwgRFNQX1BPUlRfTUVNT1JZX0RBVEEpOworfQorCitzdGF0aWMgdm9pZCBzbmRfbTNfYXNzcF93cml0ZShtM190ICpjaGlwLCB1MTYgcmVnaW9uLCB1MTYgaW5kZXgsIHUxNiBkYXRhKQoreworCXNuZF9tM19vdXR3KGNoaXAsIHJlZ2lvbiAmIE1FTVRZUEVfTUFTSywgRFNQX1BPUlRfTUVNT1JZX1RZUEUpOworCXNuZF9tM19vdXR3KGNoaXAsIGluZGV4LCBEU1BfUE9SVF9NRU1PUllfSU5ERVgpOworCXNuZF9tM19vdXR3KGNoaXAsIGRhdGEsIERTUF9QT1JUX01FTU9SWV9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgc25kX20zX2Fzc3BfaGFsdChtM190ICpjaGlwKQoreworCWNoaXAtPnJlc2V0X3N0YXRlID0gc25kX20zX2luYihjaGlwLCBEU1BfUE9SVF9DT05UUk9MX1JFR19CKSAmIH5SRUdCX1NUT1BfQ0xPQ0s7CisJYmlnX21kZWxheSgxMCk7CisJc25kX20zX291dGIoY2hpcCwgY2hpcC0+cmVzZXRfc3RhdGUgJiB+UkVHQl9FTkFCTEVfUkVTRVQsIERTUF9QT1JUX0NPTlRST0xfUkVHX0IpOworfQorCitzdGF0aWMgdm9pZCBzbmRfbTNfYXNzcF9jb250aW51ZShtM190ICpjaGlwKQoreworCXNuZF9tM19vdXRiKGNoaXAsIGNoaXAtPnJlc2V0X3N0YXRlIHwgUkVHQl9FTkFCTEVfUkVTRVQsIERTUF9QT1JUX0NPTlRST0xfUkVHX0IpOworfQorCisKKy8qCisgKiBUaGlzIG1ha2VzIG1lIHNhZC4gdGhlIG1hZXN0cm8zIGhhcyBsaXN0cworICogaW50ZXJuYWxseSB0aGF0IG11c3QgYmUgcGFja2VkLi4gMCB0ZXJtaW5hdGVzLAorICogYXBwYXJlbnRseSwgb3IgbWF5YmUgYWxsIHVudXNlZCBlbnRyaWVzIGhhdmUKKyAqIHRvIGJlIDAsIHRoZSBsaXN0cyBoYXZlIHN0YXRpYyBsZW5ndGhzIHNldAorICogYnkgdGhlIGJpbmFyeSBjb2RlIGltYWdlcy4KKyAqLworCitzdGF0aWMgaW50IHNuZF9tM19hZGRfbGlzdChtM190ICpjaGlwLCBzdHJ1Y3QgbTNfbGlzdCAqbGlzdCwgdTE2IHZhbCkKK3sKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIGxpc3QtPm1lbV9hZGRyICsgbGlzdC0+Y3VybGVuLAorCQkJICB2YWwpOworCXJldHVybiBsaXN0LT5jdXJsZW4rKzsKK30KKworc3RhdGljIHZvaWQgc25kX20zX3JlbW92ZV9saXN0KG0zX3QgKmNoaXAsIHN0cnVjdCBtM19saXN0ICpsaXN0LCBpbnQgaW5kZXgpCit7CisJdTE2ICB2YWw7CisJaW50IGxhc3RpbmRleCA9IGxpc3QtPmN1cmxlbiAtIDE7CisKKwlpZiAoaW5kZXggIT0gbGFzdGluZGV4KSB7CisJCXZhbCA9IHNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgICAgICBsaXN0LT5tZW1fYWRkciArIGxhc3RpbmRleCk7CisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCQkgIGxpc3QtPm1lbV9hZGRyICsgaW5kZXgsCisJCQkJICB2YWwpOworCX0KKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgbGlzdC0+bWVtX2FkZHIgKyBsYXN0aW5kZXgsCisJCQkgIDApOworCisJbGlzdC0+Y3VybGVuLS07Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9tM19pbmNfdGltZXJfdXNlcnMobTNfdCAqY2hpcCkKK3sKKwljaGlwLT50aW1lcl91c2VycysrOworCWlmIChjaGlwLT50aW1lcl91c2VycyAhPSAxKSAKKwkJcmV0dXJuOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBLREFUQV9USU1FUl9DT1VOVF9SRUxPQUQsCisJCQkgIDI0MCk7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIEtEQVRBX1RJTUVSX0NPVU5UX0NVUlJFTlQsCisJCQkgIDI0MCk7CisKKwlzbmRfbTNfb3V0dyhjaGlwLAorCQkgICAgc25kX20zX2ludyhjaGlwLCBIT1NUX0lOVF9DVFJMKSB8IENMS1JVTl9HRU5fRU5BQkxFLAorCQkgICAgSE9TVF9JTlRfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9tM19kZWNfdGltZXJfdXNlcnMobTNfdCAqY2hpcCkKK3sKKwljaGlwLT50aW1lcl91c2Vycy0tOworCWlmIChjaGlwLT50aW1lcl91c2VycyA+IDApICAKKwkJcmV0dXJuOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBLREFUQV9USU1FUl9DT1VOVF9SRUxPQUQsCisJCQkgIDApOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBLREFUQV9USU1FUl9DT1VOVF9DVVJSRU5ULAorCQkJICAwKTsKKworCXNuZF9tM19vdXR3KGNoaXAsCisJCSAgICBzbmRfbTNfaW53KGNoaXAsIEhPU1RfSU5UX0NUUkwpICYgfkNMS1JVTl9HRU5fRU5BQkxFLAorCQkgICAgSE9TVF9JTlRfQ1RSTCk7Cit9CisKKy8qCisgKiBzdGFydC9zdG9wCisgKi8KKworLyogc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyBpbnQgc25kX20zX3BjbV9zdGFydChtM190ICpjaGlwLCBtM19kbWFfdCAqcywgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwlpZiAoISBzIHx8ICEgc3VicykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbmRfbTNfaW5jX3RpbWVyX3VzZXJzKGNoaXApOworCXN3aXRjaCAoc3Vicy0+c3RyZWFtKSB7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOgorCQljaGlwLT5kYWNzX2FjdGl2ZSsrOworCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9JTlNUQU5DRV9SRUFEWSwgMSk7CisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCQkgIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSLAorCQkJCSAgY2hpcC0+ZGFjc19hY3RpdmUpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRToKKwkJc25kX20zX2Fzc3Bfd3JpdGUocy0+Y2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgS0RBVEFfQURDMV9SRVFVRVNULCAxKTsKKwkJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfSU5TVEFOQ0VfUkVBRFksIDEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgaW50IHNuZF9tM19wY21fc3RvcChtM190ICpjaGlwLCBtM19kbWFfdCAqcywgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwlpZiAoISBzIHx8ICEgc3VicykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX0lOU1RBTkNFX1JFQURZLCAwKTsKKwlzbmRfbTNfZGVjX3RpbWVyX3VzZXJzKGNoaXApOworCXN3aXRjaCAoc3Vicy0+c3RyZWFtKSB7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOgorCQljaGlwLT5kYWNzX2FjdGl2ZS0tOworCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkJICBLREFUQV9NSVhFUl9UQVNLX05VTUJFUiwgCisJCQkJICBjaGlwLT5kYWNzX2FjdGl2ZSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgorCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkJICBLREFUQV9BREMxX1JFUVVFU1QsIDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9tM19wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzLCBpbnQgY21kKQoreworCW0zX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnMpOworCW0zX2RtYV90ICpzID0gKG0zX2RtYV90KilzdWJzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlzbmRfYXNzZXJ0KHMgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWlmIChzLT5ydW5uaW5nKQorCQkJZXJyID0gLUVCVVNZOworCQllbHNlIHsKKwkJCXMtPnJ1bm5pbmcgPSAxOworCQkJZXJyID0gc25kX20zX3BjbV9zdGFydChjaGlwLCBzLCBzdWJzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlpZiAoISBzLT5ydW5uaW5nKQorCQkJZXJyID0gMDsgLyogc2hvdWxkIHJldHVybiBlcnJvcj8gKi8KKwkJZWxzZSB7CisJCQlzLT5ydW5uaW5nID0gMDsKKwkJCWVyciA9IHNuZF9tM19wY21fc3RvcChjaGlwLCBzLCBzdWJzKTsKKwkJfQorCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogc2V0dXAKKyAqLworc3RhdGljIHZvaWQgCitzbmRfbTNfcGNtX3NldHVwMShtM190ICpjaGlwLCBtM19kbWFfdCAqcywgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwlpbnQgZHNwX2luX3NpemUsIGRzcF9vdXRfc2l6ZSwgZHNwX2luX2J1ZmZlciwgZHNwX291dF9idWZmZXI7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzLT5ydW50aW1lOworCisJaWYgKHN1YnMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWRzcF9pbl9zaXplID0gTUlOSVNSQ19JTl9CVUZGRVJfU0laRSAtICgweDIwICogMik7CisJCWRzcF9vdXRfc2l6ZSA9IE1JTklTUkNfT1VUX0JVRkZFUl9TSVpFIC0gKDB4MjAgKiAyKTsKKwl9IGVsc2UgeworCQlkc3BfaW5fc2l6ZSA9IE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgLSAoMHgxMCAqIDIpOworCQlkc3Bfb3V0X3NpemUgPSBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAtICgweDEwICogMik7CisJfQorCWRzcF9pbl9idWZmZXIgPSBzLT5pbnN0LmRhdGEgKyAoTUlOSVNSQ19UTVBfQlVGRkVSX1NJWkUgLyAyKTsKKwlkc3Bfb3V0X2J1ZmZlciA9IGRzcF9pbl9idWZmZXIgKyAoZHNwX2luX3NpemUgLyAyKSArIDE7CisKKwlzLT5kbWFfc2l6ZSA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5idWZmZXJfc2l6ZSk7CisJcy0+cGVyaW9kX3NpemUgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCXMtPmh3cHRyID0gMDsKKwlzLT5jb3VudCA9IDA7CisKKyNkZWZpbmUgTE8oeCkgKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgSEkoeCkgTE8oKHgpID4+IDE2KQorCisJLyogaG9zdCBkbWEgYnVmZmVyIHBvaW50ZXJzICovCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19BRERSTCwKKwkJCSAgTE8ocy0+YnVmZmVyX2FkZHIpKTsKKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfQUREUkgsCisJCQkgIEhJKHMtPmJ1ZmZlcl9hZGRyKSk7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFMLAorCQkJICBMTyhzLT5idWZmZXJfYWRkciArIHMtPmRtYV9zaXplKSk7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFILAorCQkJICBISShzLT5idWZmZXJfYWRkciArIHMtPmRtYV9zaXplKSk7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRMLAorCQkJICBMTyhzLT5idWZmZXJfYWRkcikpOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCwKKwkJCSAgSEkocy0+YnVmZmVyX2FkZHIpKTsKKyN1bmRlZiBMTworI3VuZGVmIEhJCisKKwkvKiBkc3AgYnVmZmVycyAqLworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfQkVHSU4sCisJCQkgIGRzcF9pbl9idWZmZXIpOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfRU5EX1BMVVNfMSwKKwkJCSAgZHNwX2luX2J1ZmZlciArIChkc3BfaW5fc2l6ZSAvIDIpKTsKKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0hFQUQsCisJCQkgIGRzcF9pbl9idWZmZXIpOworICAgIAorCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX1RBSUwsCisJCQkgIGRzcF9pbl9idWZmZXIpOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0JFR0lOLAorCQkJICBkc3Bfb3V0X2J1ZmZlcik7CisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX09VVF9CVUZfRU5EX1BMVVNfMSwKKwkJCSAgZHNwX291dF9idWZmZXIgKyAoZHNwX291dF9zaXplIC8gMikpOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0hFQUQsCisJCQkgIGRzcF9vdXRfYnVmZmVyKTsKKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9UQUlMLAorCQkJICBkc3Bfb3V0X2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9tM19wY21fc2V0dXAyKG0zX3QgKmNoaXAsIG0zX2RtYV90ICpzLCBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwl1MzIgZnJlcTsKKworCS8qIAorCSAqIHB1dCB1cyBpbiB0aGUgbGlzdHMgaWYgd2UncmUgbm90IGFscmVhZHkgdGhlcmUKKwkgKi8KKwlpZiAoISBzLT5pbl9saXN0cykgeworCQlzLT5pbmRleFswXSA9IHNuZF9tM19hZGRfbGlzdChjaGlwLCBzLT5pbmRleF9saXN0WzBdLAorCQkJCQkgICAgICBzLT5pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCQlzLT5pbmRleFsxXSA9IHNuZF9tM19hZGRfbGlzdChjaGlwLCBzLT5pbmRleF9saXN0WzFdLAorCQkJCQkgICAgICBzLT5pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCQlzLT5pbmRleFsyXSA9IHNuZF9tM19hZGRfbGlzdChjaGlwLCBzLT5pbmRleF9saXN0WzJdLAorCQkJCQkgICAgICBzLT5pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCQlzLT5pbl9saXN0cyA9IDE7CisJfQorCisJLyogd3JpdGUgdG8gJ21vbm8nIHdvcmQgKi8KKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDEsIAorCQkJICBydW50aW1lLT5jaGFubmVscyA9PSAyID8gMCA6IDEpOworCS8qIHdyaXRlIHRvICc4Yml0JyB3b3JkICovCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyLCAKKwkJCSAgc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNiA/IDAgOiAxKTsKKworCS8qIHNldCB1cCBkYWMvYWRjIHJhdGUgKi8KKwlmcmVxID0gKChydW50aW1lLT5yYXRlIDw8IDE1KSArIDI0MDAwICkgLyA0ODAwMDsKKwlpZiAoZnJlcSkgCisJCWZyZXEtLTsKKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgQ0RBVEFfRlJFUVVFTkNZLAorCQkJICBmcmVxKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBsYXlfdmFscyB7CisJdTE2IGFkZHIsIHZhbDsKK30gcHZbXSA9IHsKKwl7Q0RBVEFfTEVGVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorCXtDREFUQV9SSUdIVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQsIDB9ICwKKwkvKiArMSwgKzIgYXJlIHN0ZXJlby8xNiBiaXQgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMywgMHgwMDAwfSwgLyogZnJhY3Rpb24/ICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDQsIDB9LCAvKiBmaXJzdCBsICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDUsIDB9LCAvKiBmaXJzdCByICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDYsIDB9LCAvKiBzZWNvbmQgbCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA3LCAwfSwgLyogc2Vjb25kIHIgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOCwgMH0sIC8qIGRlbHRhIGwgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOSwgMH0sIC8qIGRlbHRhIHIgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTAsIDB4ODAwMH0sIC8qIHJvdW5kICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDExLCAweEZGMDB9LCAvKiBoaWdoZXIgYnV0ZSBtYXJrICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDEzLCAwfSwgLyogdGVtcDAgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTQsIDB9LCAvKiBjIGZyYWN0aW9uICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE1LCAwfSwgLyogY291bnRlciAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNiwgOH0sIC8qIG51bWluICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE3LCA1MCoyfSwgLyogbnVtb3V0ICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE4LCBNSU5JU1JDX0JJUVVBRF9TVEFHRSAtIDF9LCAvKiBudW1zdGFnZSAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMCwgMH0sIC8qIGZpbHRlcnRhcCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMSwgMH0gLyogYm9vc3RlciAqLworfTsKKworCisvKiB0aGUgbW9kZSBwYXNzZWQgc2hvdWxkIGJlIGFscmVhZHkgc2hpZnRlZCBhbmQgbWFza2VkICovCitzdGF0aWMgdm9pZAorc25kX20zX3BsYXliYWNrX3NldHVwKG0zX3QgKmNoaXAsIG0zX2RtYV90ICpzLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyoKKwkgKiBzb21lIHBlciBjbGllbnQgaW5pdGlhbGl6ZXJzCisJICovCisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDEyLAorCQkJICBzLT5pbnN0LmRhdGEgKyA0MCArIDgpOworCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxOSwKKwkJCSAgcy0+aW5zdC5jb2RlICsgTUlOSVNSQ19DT0VGX0xPQyk7CisKKwkvKiBlbmFibGUgb3IgZGlzYWJsZSBsb3cgcGFzcyBmaWx0ZXI/ICovCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMiwKKwkJCSAgc3Vicy0+cnVudGltZS0+cmF0ZSA+IDQ1MDAwID8gMHhmZiA6IDApOworICAgIAorCS8qIHRlbGwgaXQgd2hpY2ggd2F5IGRtYSBpcyBnb2luZz8gKi8KKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIHMtPmluc3QuZGF0YSArIENEQVRBX0RNQV9DT05UUk9MLAorCQkJICBETUFDT05UUk9MX0FVVE9SRVBFQVQgKyBETUFDX1BBR0UzX1NFTEVDVE9SICsgRE1BQ19CTE9DS0ZfU0VMRUNUT1IpOworCisJLyoKKwkgKiBzZXQgYW4gYXJtbG9hZCBvZiBzdGF0aWMgaW5pdGlhbGl6ZXJzCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHYpOyBpKyspIAorCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkJICBzLT5pbnN0LmRhdGEgKyBwdltpXS5hZGRyLCBwdltpXS52YWwpOworfQorCisvKgorICogICAgTmF0aXZlIHJlY29yZCBkcml2ZXIgCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVjX3ZhbHMgeworCXUxNiBhZGRyLCB2YWw7Cit9IHJ2W10gPSB7CisJe0NEQVRBX0xFRlRfVk9MVU1FLCBBUkJfVk9MVU1FfSwKKwl7Q0RBVEFfUklHSFRfVk9MVU1FLCBBUkJfVk9MVU1FfSwKKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VULCAxfSAsCisJLyogKzEsICsyIGFyZSBzdGVyZW8vMTYgYml0ICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDMsIDB4MDAwMH0sIC8qIGZyYWN0aW9uPyAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA0LCAwfSwgLyogZmlyc3QgbCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA1LCAwfSwgLyogZmlyc3QgciAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA2LCAwfSwgLyogc2Vjb25kIGwgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNywgMH0sIC8qIHNlY29uZCByICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDgsIDB9LCAvKiBkZWx0YSBsICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDksIDB9LCAvKiBkZWx0YSByICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDEwLCAweDgwMDB9LCAvKiByb3VuZCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxMSwgMHhGRjAwfSwgLyogaGlnaGVyIGJ1dGUgbWFyayAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxMywgMH0sIC8qIHRlbXAwICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE0LCAwfSwgLyogYyBmcmFjdGlvbiAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNSwgMH0sIC8qIGNvdW50ZXIgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTYsIDUwfSwvKiBudW1pbiAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNywgOH0sIC8qIG51bW91dCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxOCwgMH0sIC8qIG51bXN0YWdlICovCisJe1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE5LCAwfSwgLyogY29lZiAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMCwgMH0sIC8qIGZpbHRlcnRhcCAqLworCXtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMSwgMH0sIC8qIGJvb3N0ZXIgKi8KKwl7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMjIsIDB4ZmZ9IC8qIHNraXAgbHBmICovCit9OworCitzdGF0aWMgdm9pZAorc25kX20zX2NhcHR1cmVfc2V0dXAobTNfdCAqY2hpcCwgbTNfZG1hX3QgKnMsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIHNvbWUgcGVyIGNsaWVudCBpbml0aWFsaXplcnMKKwkgKi8KKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgcy0+aW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTIsCisJCQkgIHMtPmluc3QuZGF0YSArIDQwICsgOCk7CisKKwkvKiB0ZWxsIGl0IHdoaWNoIHdheSBkbWEgaXMgZ29pbmc/ICovCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBzLT5pbnN0LmRhdGEgKyBDREFUQV9ETUFfQ09OVFJPTCwKKwkJCSAgRE1BQ09OVFJPTF9ESVJFQ1RJT04gKyBETUFDT05UUk9MX0FVVE9SRVBFQVQgKyAKKwkJCSAgRE1BQ19QQUdFM19TRUxFQ1RPUiArIERNQUNfQkxPQ0tGX1NFTEVDVE9SKTsKKworCS8qCisJICogc2V0IGFuIGFybWxvYWQgb2Ygc3RhdGljIGluaXRpYWxpemVycworCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJ2KTsgaSsrKSAKKwkJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgcy0+aW5zdC5kYXRhICsgcnZbaV0uYWRkciwgcnZbaV0udmFsKTsKK30KKworc3RhdGljIGludCBzbmRfbTNfcGNtX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCXNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJbTNfZG1hX3QgKnMgPSAobTNfZG1hX3QqKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSA8IDApCisJCXJldHVybiBlcnI7CisJLyogc2V0IGJ1ZmZlciBhZGRyZXNzICovCisJcy0+YnVmZmVyX2FkZHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOworCWlmIChzLT5idWZmZXJfYWRkciAmIDB4MykgeworCQlzbmRfcHJpbnRrKCJvaCBteSwgbm90IGFsaWduZWRcbiIpOworCQlzLT5idWZmZXJfYWRkciA9IHMtPmJ1ZmZlcl9hZGRyICYgfjB4MzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX20zX3BjbV9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJbTNfZG1hX3QgKnM7CisJCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCXMgPSAobTNfZG1hX3QqKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcy0+YnVmZmVyX2FkZHIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfbTNfcGNtX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwltM190ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnMtPnJ1bnRpbWU7CisJbTNfZG1hX3QgKnMgPSAobTNfZG1hX3QqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXNuZF9hc3NlcnQocyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKworCWlmIChydW50aW1lLT5mb3JtYXQgIT0gU05EUlZfUENNX0ZPUk1BVF9VOCAmJgorCSAgICBydW50aW1lLT5mb3JtYXQgIT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChydW50aW1lLT5yYXRlID4gNDgwMDAgfHwKKwkgICAgcnVudGltZS0+cmF0ZSA8IDgwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJc25kX20zX3BjbV9zZXR1cDEoY2hpcCwgcywgc3Vicyk7CisKKwlpZiAoc3Vicy0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXNuZF9tM19wbGF5YmFja19zZXR1cChjaGlwLCBzLCBzdWJzKTsKKwllbHNlCisJCXNuZF9tM19jYXB0dXJlX3NldHVwKGNoaXAsIHMsIHN1YnMpOworCisJc25kX20zX3BjbV9zZXR1cDIoY2hpcCwgcywgcnVudGltZSk7CisKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZ2V0IGN1cnJlbnQgcG9pbnRlcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzbmRfbTNfZ2V0X3BvaW50ZXIobTNfdCAqY2hpcCwgbTNfZG1hX3QgKnMsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJdTE2IGhpID0gMCwgbG8gPSAwOworCWludCByZXRyeSA9IDEwOworCXUzMiBhZGRyOworCisJLyoKKwkgKiB0cnkgYW5kIGdldCBhIHZhbGlkIGFuc3dlcgorCSAqLworCXdoaWxlIChyZXRyeS0tKSB7CisJCWhpID0gIHNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgICAgICBzLT5pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCk7CisKKwkJbG8gPSBzbmRfbTNfYXNzcF9yZWFkKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCQkgICAgICBzLT5pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5UTCk7CisKKwkJaWYgKGhpID09IHNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCQkgICBzLT5pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCkpCisJCQlicmVhazsKKwl9CisJYWRkciA9IGxvIHwgKCh1MzIpaGk8PDE2KTsKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkoYWRkciAtIHMtPmJ1ZmZlcl9hZGRyKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfbTNfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnMpCit7CisJbTNfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJdW5zaWduZWQgaW50IHB0cjsKKwltM19kbWFfdCAqcyA9IChtM19kbWFfdCopc3Vicy0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9hc3NlcnQocyAhPSBOVUxMLCByZXR1cm4gMCk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlwdHIgPSBzbmRfbTNfZ2V0X3BvaW50ZXIoY2hpcCwgcywgc3Vicyk7CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnMtPnJ1bnRpbWUsIHB0cik7Cit9CisKKworLyogdXBkYXRlIHBvaW50ZXIgKi8KKy8qIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBzbmRfbTNfdXBkYXRlX3B0cihtM190ICpjaGlwLCBtM19kbWFfdCAqcykKK3sKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzID0gcy0+c3Vic3RyZWFtOworCXVuc2lnbmVkIGludCBod3B0cjsKKwlpbnQgZGlmZjsKKworCWlmICghIHMtPnJ1bm5pbmcpCisJCXJldHVybjsKKworCWh3cHRyID0gc25kX20zX2dldF9wb2ludGVyKGNoaXAsIHMsIHN1YnMpICUgcy0+ZG1hX3NpemU7CisJZGlmZiA9IChzLT5kbWFfc2l6ZSArIGh3cHRyIC0gcy0+aHdwdHIpICUgcy0+ZG1hX3NpemU7CisJcy0+aHdwdHIgPSBod3B0cjsKKwlzLT5jb3VudCArPSBkaWZmOworCWlmIChzLT5jb3VudCA+PSAoc2lnbmVkKXMtPnBlcmlvZF9zaXplKSB7CisJCXMtPmNvdW50ICU9IHMtPnBlcmlvZF9zaXplOworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnMpOworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorc25kX20zX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCW0zX3QgKmNoaXAgPSBkZXZfaWQ7CisJdTggc3RhdHVzOworCWludCBpOworCisJc3RhdHVzID0gaW5iKGNoaXAtPmlvYmFzZSArIEhPU1RfSU5UX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzID09IDB4ZmYpCisJCXJldHVybiBJUlFfTk9ORTsKKyAgIAorCS8qCisJICogYWNrIGFuIGFzc3AgaW50IGlmIGl0cyBydW5uaW5nCisJICogYW5kIGhhcyBhbiBpbnQgcGVuZGluZworCSAqLworCWlmIChzdGF0dXMgJiBBU1NQX0lOVF9QRU5ESU5HKSB7CisJCXU4IGN0bCA9IGluYihjaGlwLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQik7CisJCWlmICghKGN0bCAmIFNUT1BfQVNTUF9DTE9DSykpIHsKKwkJCWN0bCA9IGluYihjaGlwLT5pb2Jhc2UgKyBBU1NQX0hPU1RfSU5UX1NUQVRVUyk7CisJCQlpZiAoY3RsICYgRFNQMkhPU1RfUkVRX1RJTUVSKSB7CisJCQkJb3V0YihEU1AySE9TVF9SRVFfVElNRVIsIGNoaXAtPmlvYmFzZSArIEFTU1BfSE9TVF9JTlRfU1RBVFVTKTsKKwkJCQkvKiB1cGRhdGUgYWRjL2RhYyBpbmZvIGlmIGl0IHdhcyBhIHRpbWVyIGludCAqLworCQkJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3Vic3RyZWFtczsgaSsrKSB7CisJCQkJCW0zX2RtYV90ICpzID0gJmNoaXAtPnN1YnN0cmVhbXNbaV07CisJCQkJCWlmIChzLT5ydW5uaW5nKQorCQkJCQkJc25kX20zX3VwZGF0ZV9wdHIoY2hpcCwgcyk7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQl9CisJCX0KKwl9CisKKyNpZiAwIC8qIFRPRE86IG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJaWYgKChzdGF0dXMgJiBNUFU0MDFfSU5UX1BFTkRJTkcpICYmIGNoaXAtPnJtaWRpKQorCQlzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KGlycSwgY2hpcC0+cm1pZGktPnByaXZhdGVfZGF0YSwgcmVncyk7CisjZW5kaWYKKworCS8qIGFjayBpbnRzICovCisJc25kX20zX291dHcoY2hpcCwgSE9TVF9JTlRfU1RBVFVTLCBzdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qCisgKi8KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfbTNfcGxheWJhY2sgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgLypTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ki8KKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDUxMioxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDUxMioxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX20zX2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgLypTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ki8KKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDUxMioxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDUxMioxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKK307CisKKworLyoKKyAqLworCitzdGF0aWMgaW50CitzbmRfbTNfc3Vic3RyZWFtX29wZW4obTNfdCAqY2hpcCwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwlpbnQgaTsKKwltM19kbWFfdCAqczsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N1YnN0cmVhbXM7IGkrKykgeworCQlzID0gJmNoaXAtPnN1YnN0cmVhbXNbaV07CisJCWlmICghIHMtPm9wZW5lZCkKKwkJCWdvdG8gX19mb3VuZDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIC1FTk9NRU07CitfX2ZvdW5kOgorCXMtPm9wZW5lZCA9IDE7CisJcy0+cnVubmluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwlzdWJzLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzOworCXMtPnN1YnN0cmVhbSA9IHN1YnM7CisKKwkvKiBzZXQgbGlzdCBvd25lcnMgKi8KKwlpZiAoc3Vicy0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcy0+aW5kZXhfbGlzdFswXSA9ICZjaGlwLT5taXhlcl9saXN0OworCX0gZWxzZQorCQlzLT5pbmRleF9saXN0WzBdID0gJmNoaXAtPmFkYzFfbGlzdDsKKwlzLT5pbmRleF9saXN0WzFdID0gJmNoaXAtPm1zcmNfbGlzdDsKKwlzLT5pbmRleF9saXN0WzJdID0gJmNoaXAtPmRtYV9saXN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfbTNfc3Vic3RyZWFtX2Nsb3NlKG0zX3QgKmNoaXAsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJbTNfZG1hX3QgKnMgPSAobTNfZG1hX3QqKSBzdWJzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm47IC8qIG5vdCBvcGVuZWQgcHJvcGVybHkgKi8KKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAocy0+c3Vic3RyZWFtICYmIHMtPnJ1bm5pbmcpCisJCXNuZF9tM19wY21fc3RvcChjaGlwLCBzLCBzLT5zdWJzdHJlYW0pOyAvKiBkb2VzIHRoaXMgaGFwcGVuPyAqLworCWlmIChzLT5pbl9saXN0cykgeworCQlzbmRfbTNfcmVtb3ZlX2xpc3QoY2hpcCwgcy0+aW5kZXhfbGlzdFswXSwgcy0+aW5kZXhbMF0pOworCQlzbmRfbTNfcmVtb3ZlX2xpc3QoY2hpcCwgcy0+aW5kZXhfbGlzdFsxXSwgcy0+aW5kZXhbMV0pOworCQlzbmRfbTNfcmVtb3ZlX2xpc3QoY2hpcCwgcy0+aW5kZXhfbGlzdFsyXSwgcy0+aW5kZXhbMl0pOworCQlzLT5pbl9saXN0cyA9IDA7CisJfQorCXMtPnJ1bm5pbmcgPSAwOworCXMtPm9wZW5lZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9tM19wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJbTNfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzLT5ydW50aW1lOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9tM19zdWJzdHJlYW1fb3BlbihjaGlwLCBzdWJzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcnVudGltZS0+aHcgPSBzbmRfbTNfcGxheWJhY2s7CisJc25kX3BjbV9zZXRfc3luYyhzdWJzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfbTNfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwltM190ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKworCXNuZF9tM19zdWJzdHJlYW1fY2xvc2UoY2hpcCwgc3Vicyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9tM19jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwltM190ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnMtPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX20zX3N1YnN0cmVhbV9vcGVuKGNoaXAsIHN1YnMpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlydW50aW1lLT5odyA9IHNuZF9tM19jYXB0dXJlOworCXNuZF9wY21fc2V0X3N5bmMoc3Vicyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX20zX2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwltM190ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKworCXNuZF9tM19zdWJzdHJlYW1fY2xvc2UoY2hpcCwgc3Vicyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjcmVhdGUgcGNtIGluc3RhbmNlCisgKi8KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX20zX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfbTNfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfbTNfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9tM19wY21faHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX20zX3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX20zX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX20zX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX20zX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX20zX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9tM19jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX20zX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9tM19wY21faHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX20zX3BjbV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX20zX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX20zX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX20zX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3NuZF9tM19wY20obTNfdCAqIGNoaXAsIGludCBkZXZpY2UpCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIGNoaXAtPmNhcmQtPmRyaXZlciwgZGV2aWNlLAorCQkJICBNQVhfUExBWUJBQ0tTLCBNQVhfQ0FQVFVSRVMsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9tM19wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9tM19jYXB0dXJlX29wcyk7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCBjaGlwLT5jYXJkLT5kcml2ZXIpOworCWNoaXAtPnBjbSA9IHBjbTsKKwkKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDY0KjEwMjQpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGFjOTcgaW50ZXJmYWNlCisgKi8KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBhYzk3IHNlcmlhbCBidXMgdG8gYmUgZnJlZS4KKyAqIHJldHVybiBub256ZXJvIGlmIHRoZSBidXMgaXMgc3RpbGwgYnVzeS4KKyAqLworc3RhdGljIGludCBzbmRfbTNfYWM5N193YWl0KG0zX3QgKmNoaXApCit7CisJaW50IGkgPSAxMDAwMDsKKworCWRvIHsKKwkJaWYgKCEgKHNuZF9tM19pbmIoY2hpcCwgMHgzMCkgJiAxKSkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKGktLSA+IDApOworCisJc25kX3ByaW50aygiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK3NuZF9tM19hYzk3X3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJbTNfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKworCWlmIChzbmRfbTNfYWM5N193YWl0KGNoaXApKQorCQlyZXR1cm4gMHhmZmZmOworCXNuZF9tM19vdXRiKGNoaXAsIDB4ODAgfCAocmVnICYgMHg3ZiksIENPREVDX0NPTU1BTkQpOworCWlmIChzbmRfbTNfYWM5N193YWl0KGNoaXApKQorCQlyZXR1cm4gMHhmZmZmOworCXJldHVybiBzbmRfbTNfaW53KGNoaXAsIENPREVDX0RBVEEpOworfQorCitzdGF0aWMgdm9pZAorc25kX20zX2FjOTdfd3JpdGUoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwltM190ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHNuZF9tM19hYzk3X3dhaXQoY2hpcCkpCisJCXJldHVybjsKKwlzbmRfbTNfb3V0dyhjaGlwLCB2YWwsIENPREVDX0RBVEEpOworCXNuZF9tM19vdXRiKGNoaXAsIHJlZyAmIDB4N2YsIENPREVDX0NPTU1BTkQpOworfQorCisKK3N0YXRpYyB2b2lkIHNuZF9tM19yZW1vdGVfY29kZWNfY29uZmlnKGludCBpbywgaW50IGlzcmVtb3RlKQoreworCWlzcmVtb3RlID0gaXNyZW1vdGUgPyAxIDogMDsKKworCW91dHcoKGludyhpbyArIFJJTkdfQlVTX0NUUkxfQikgJiB+U0VDT05EX0NPREVDX0lEX01BU0spIHwgaXNyZW1vdGUsCisJICAgICBpbyArIFJJTkdfQlVTX0NUUkxfQik7CisJb3V0dygoaW53KGlvICsgU0RPX09VVF9ERVNUX0NUUkwpICYgfkNPTU1BTkRfQUREUl9PVVQpIHwgaXNyZW1vdGUsCisJICAgICBpbyArIFNET19PVVRfREVTVF9DVFJMKTsKKwlvdXR3KChpbncoaW8gKyBTRE9fSU5fREVTVF9DVFJMKSAmIH5TVEFUVVNfQUREUl9JTikgfCBpc3JlbW90ZSwKKwkgICAgIGlvICsgU0RPX0lOX0RFU1RfQ1RSTCk7Cit9CisKKy8qIAorICogaGFjaywgcmV0dXJucyBub24gemVybyBvbiBlcnIgCisgKi8KK3N0YXRpYyBpbnQgc25kX20zX3RyeV9yZWFkX3ZlbmRvcihtM190ICpjaGlwKQoreworCXUxNiByZXQ7CisKKwlpZiAoc25kX20zX2FjOTdfd2FpdChjaGlwKSkKKwkJcmV0dXJuIDE7CisKKwlzbmRfbTNfb3V0YihjaGlwLCAweDgwIHwgKEFDOTdfVkVORE9SX0lEMSAmIDB4N2YpLCAweDMwKTsKKworCWlmIChzbmRfbTNfYWM5N193YWl0KGNoaXApKQorCQlyZXR1cm4gMTsKKworCXJldCA9IHNuZF9tM19pbncoY2hpcCwgMHgzMik7CisKKwlyZXR1cm4gKHJldCA9PSAwKSB8fCAocmV0ID09IDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9tM19hYzk3X3Jlc2V0KG0zX3QgKmNoaXApCit7CisJdTE2IGRpcjsKKwlpbnQgZGVsYXkxID0gMCwgZGVsYXkyID0gMCwgaTsKKwlpbnQgaW8gPSBjaGlwLT5pb2Jhc2U7CisKKwlpZiAoY2hpcC0+YWxsZWdyb19mbGFnKSB7CisJCS8qCisJCSAqIHRoZSBvbmJvYXJkIGNvZGVjIG9uIHRoZSBhbGxlZ3JvIHNlZW1zIAorCQkgKiB0byB3YW50IHRvIHdhaXQgYSB2ZXJ5IGxvbmcgdGltZSBiZWZvcmUKKwkJICogY29taW5nIGJhY2sgdG8gbGlmZSAKKwkJICovCisJCWRlbGF5MSA9IDUwOworCQlkZWxheTIgPSA4MDA7CisJfSBlbHNlIHsKKwkJLyogbWFlc3RybzMgKi8KKwkJZGVsYXkxID0gMjA7CisJCWRlbGF5MiA9IDUwMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWRpciA9IGludyhpbyArIEdQSU9fRElSRUNUSU9OKTsKKwkJaWYgKCEgY2hpcC0+cXVpcmsgfHwgISBjaGlwLT5xdWlyay0+aXJkYV93b3JrYXJvdW5kKQorCQkJZGlyIHw9IDB4MTA7IC8qIGFzc3VtaW5nIHBjaSBidXMgbWFzdGVyPyAqLworCisJCXNuZF9tM19yZW1vdGVfY29kZWNfY29uZmlnKGlvLCAwKTsKKworCQlvdXR3KElPX1NSQU1fRU5BQkxFLCBpbyArIFJJTkdfQlVTX0NUUkxfQSk7CisJCXVkZWxheSgyMCk7CisKKwkJb3V0dyhkaXIgJiB+R1BPX1BSSU1BUllfQUM5NyAsIGlvICsgR1BJT19ESVJFQ1RJT04pOworCQlvdXR3KH5HUE9fUFJJTUFSWV9BQzk3ICwgaW8gKyBHUElPX01BU0spOworCQlvdXR3KDAsIGlvICsgR1BJT19EQVRBKTsKKwkJb3V0dyhkaXIgfCBHUE9fUFJJTUFSWV9BQzk3LCBpbyArIEdQSU9fRElSRUNUSU9OKTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoKGRlbGF5MSAqIEhaKSAvIDEwMDApOworCisJCW91dHcoR1BPX1BSSU1BUllfQUM5NywgaW8gKyBHUElPX0RBVEEpOworCQl1ZGVsYXkoNSk7CisJCS8qIG9rLCBicmluZyBiYWNrIHRoZSBhYy1saW5rICovCisJCW91dHcoSU9fU1JBTV9FTkFCTEUgfCBTRVJJQUxfQUNfTElOS19FTkFCTEUsIGlvICsgUklOR19CVVNfQ1RSTF9BKTsKKwkJb3V0dyh+MCwgaW8gKyBHUElPX01BU0spOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgoZGVsYXkyICogSFopIC8gMTAwMCk7CisKKwkJaWYgKCEgc25kX20zX3RyeV9yZWFkX3ZlbmRvcihjaGlwKSkKKwkJCWJyZWFrOworCisJCWRlbGF5MSArPSAxMDsKKwkJZGVsYXkyICs9IDEwMDsKKworCQlzbmRfcHJpbnRkKCJtYWVzdHJvMzogcmV0cnlpbmcgY29kZWMgcmVzZXQgd2l0aCBkZWxheXMgb2YgJWQgYW5kICVkIG1zXG4iLAorCQkJICAgZGVsYXkxLCBkZWxheTIpOworCX0KKworI2lmIDAKKwkvKiBtb3JlIGd1bmctaG8gcmVzZXQgdGhhdCBkb2Vzbid0CisJICogc2VlbSB0byB3b3JrIGFueXdoZXJlIDopCisJICovCisJdG1wID0gaW53KGlvICsgUklOR19CVVNfQ1RSTF9BKTsKKwlvdXR3KFJBQ19TREZTX0VOQUJMRXxMQUNfU0RGU19FTkFCTEUsIGlvICsgUklOR19CVVNfQ1RSTF9BKTsKKwliaWdfbWRlbGF5KDIwKTsKKwlvdXR3KHRtcCwgaW8gKyBSSU5HX0JVU19DVFJMX0EpOworCWJpZ19tZGVsYXkoNTApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9tM19taXhlcihtM190ICpjaGlwKQoreworCWFjOTdfYnVzX3QgKnBidXM7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGVycjsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSBzbmRfbTNfYWM5N193cml0ZSwKKwkJLnJlYWQgPSBzbmRfbTNfYWM5N19yZWFkLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjaGlwLT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkKKwltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOworCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogc2VlbXMgYWM5NyBQQ00gbmVlZHMgaW5pdGlhbGl6YXRpb24uLiBoYWNrIGhhY2suLiAqLworCXNuZF9hYzk3X3dyaXRlKGNoaXAtPmFjOTcsIEFDOTdfUENNLCAweDgwMDAgfCAoMTUgPDwgOCkgfCAxNSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJc25kX2FjOTdfd3JpdGUoY2hpcC0+YWM5NywgQUM5N19QQ00sIDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIERTUCBDb2RlIGltYWdlcworICovCisKK3N0YXRpYyB1MTYgYXNzcF9rZXJuZWxfaW1hZ2VbXSBfX2RldmluaXRkYXRhID0geworICAgIDB4Nzk4MCwgMHgwMDMwLCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwMEZCLCAweDc5ODAsIDB4MDBERCwgMHg3OTgwLCAweDAzQjQsIAorICAgIDB4Nzk4MCwgMHgwMzMyLCAweDc5ODAsIDB4MDI4NywgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIAorICAgIDB4Nzk4MCwgMHgwMzFBLCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAyMkYsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIAorICAgIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAwNjMsIDB4Nzk4MCwgMHgwMDZCLCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIAorICAgIDB4QkY4MCwgMHgyQzdDLCAweDg4MDYsIDB4ODgwNCwgMHhCRTQwLCAweEJDMjAsIDB4QUUwOSwgMHgxMDAwLCAweEFFMEEsIDB4MDAwMSwgMHg2OTM4LCAweEVCMDgsIAorICAgIDB4MDA1MywgMHg2OTVBLCAweEVCMDgsIDB4MDBENiwgMHgwMDA5LCAweDhCODgsIDB4Njk4MCwgMHhFMzg4LCAweDAwMzYsIDB4QkUzMCwgMHhCQzIwLCAweDY5MDksIAorICAgIDB4QjgwMSwgMHg5MDA5LCAweEJFNDEsIDB4QkU0MSwgMHg2OTI4LCAweEVCODgsIDB4MDA3OCwgMHhCRTQxLCAweEJFNDAsIDB4Nzk4MCwgMHgwMDM4LCAweEJFNDEsIAorICAgIDB4QkU0MSwgMHg5MDNBLCAweDY5MzgsIDB4RTMwOCwgMHgwMDU2LCAweDkwM0EsIDB4QkU0MSwgMHhCRTQwLCAweEVGMDAsIDB4OTAzQSwgMHg2OTM5LCAweEUzMDgsIAorICAgIDB4MDA1RSwgMHg5MDNBLCAweEVGMDAsIDB4NjkwQiwgMHg2NjBDLCAweEVGOEMsIDB4NjkwQSwgMHg2NjBDLCAweDYyMEIsIDB4NjYwOSwgMHhFRjAwLCAweDY5MTAsIAorICAgIDB4NjYwRiwgMHhFRjA0LCAweEUzODgsIDB4MDA3NSwgMHg2OTBFLCAweDY2MEYsIDB4NjIxMCwgMHg2NjBELCAweEVGMDAsIDB4NjkwRSwgMHg2NjBELCAweEVGMDAsIAorICAgIDB4QUU3MCwgMHgwMDAxLCAweEJDMjAsIDB4QUUyNywgMHgwMDAxLCAweDY5MzksIDB4RUIwOCwgMHgwMDVELCAweDY5MjYsIDB4QjgwMSwgMHg5MDI2LCAweDAwMjYsIAorICAgIDB4OEI4OCwgMHg2OTgwLCAweEUzODgsIDB4MDBDQiwgMHg5MDI4LCAweDBEMjgsIDB4NDIxMSwgMHhFMTAwLCAweDAwN0EsIDB4NDcxMSwgMHhFMTAwLCAweDAwQTAsIAorICAgIDB4N0E4MCwgMHgwMDYzLCAweEI4MTEsIDB4NjYwQSwgMHg2MjA5LCAweEUzMDQsIDB4MDA3QSwgMHgwQzBCLCAweDQwMDUsIDB4MTAwQSwgMHhCQTAxLCAweDkwMTIsIAorICAgIDB4MEMxMiwgMHg0MDAyLCAweDc5ODAsIDB4MDBBRiwgMHg3QTgwLCAweDAwNkIsIDB4QkUwMiwgMHg2MjBFLCAweDY2MEQsIDB4QkExMCwgMHhFMzQ0LCAweDAwN0EsIAorICAgIDB4MEMxMCwgMHg0MDA1LCAweDEwMEUsIDB4QkEwMSwgMHg5MDEyLCAweDBDMTIsIDB4NDAwMiwgMHgxMDAzLCAweEJBMDIsIDB4OTAxMiwgMHgwQzEyLCAweDQwMDAsIAorICAgIDB4MTAwMywgMHhFMzg4LCAweDAwQkEsIDB4MTAwNCwgMHg3OTgwLCAweDAwQkMsIDB4MTAwNCwgMHhCQTAxLCAweDkwMTIsIDB4MEMxMiwgMHg0MDAxLCAweDBDMDUsIAorICAgIDB4NDAwMywgMHgwQzA2LCAweDQwMDQsIDB4MTAxMSwgMHhCRkIwLCAweDAxRkYsIDB4OTAxMiwgMHgwQzEyLCAweDQwMDYsIDB4QkMyMCwgMHhFRjAwLCAweEFFMjYsIAorICAgIDB4MTAyOCwgMHg2OTcwLCAweEJGRDAsIDB4MDAwMSwgMHg5MDcwLCAweEUzODgsIDB4MDA3QSwgMHhBRTI4LCAweDAwMDAsIDB4RUYwMCwgMHhBRTcwLCAweDAzMDAsIAorICAgIDB4MEM3MCwgMHhCMDBDLCAweEFFNUEsIDB4MDAwMCwgMHhFRjAwLCAweDdBODAsIDB4MDM4QSwgMHg2OTdGLCAweEI4MDEsIDB4OTA3RiwgMHgwMDU2LCAweDhCODgsIAorICAgIDB4MENBMCwgMHhCMDA4LCAweEFGNzEsIDB4QjAwMCwgMHg0RTcxLCAweEUyMDAsIDB4MDBGMywgMHhBRTU2LCAweDEwNTcsIDB4MDA1NiwgMHgwQ0EwLCAweEIwMDgsIAorICAgIDB4ODA1NiwgMHg3OTgwLCAweDAzQTEsIDB4MDgxMCwgMHhCRkEwLCAweDEwNTksIDB4RTMwNCwgMHgwM0ExLCAweDgwNTYsIDB4Nzk4MCwgMHgwM0ExLCAweDdBODAsIAorICAgIDB4MDM4QSwgMHhCRjAxLCAweEJFNDMsIDB4QkU1OSwgMHg5MDdDLCAweDY5MzcsIDB4RTM4OCwgMHgwMTBELCAweEJBMDEsIDB4RTMwOCwgMHgwMTBDLCAweEFFNzEsIAorICAgIDB4MDAwNCwgMHgwQzcxLCAweDUwMDAsIDB4NjkzNiwgMHg5MDM3LCAweEJGMEEsIDB4MTA5RSwgMHg4QjhBLCAweEFGODAsIDB4ODAxNCwgMHg0QzgwLCAweEJGMEEsIAorICAgIDB4MDU2MCwgMHhGNTAwLCAweEJGMEEsIDB4MDUyMCwgMHhCOTAwLCAweEJCMTcsIDB4OTBBMCwgMHg2OTE3LCAweEUzODgsIDB4MDE0OCwgMHgwRDE3LCAweEUxMDAsIAorICAgIDB4MDEyNywgMHhCRjBDLCAweDA1NzgsIDB4QkYwRCwgMHgwNTdDLCAweDc5ODAsIDB4MDEyQiwgMHhCRjBDLCAweDA1MzgsIDB4QkYwRCwgMHgwNTNDLCAweDY5MDAsIAorICAgIDB4RTMwOCwgMHgwMTM1LCAweDhCOEMsIDB4QkU1OSwgMHhCQjA3LCAweDkwQTAsIDB4QkMyMCwgMHg3OTgwLCAweDAxNTcsIDB4MDMwQywgMHg4QjhCLCAweEI5MDMsIAorICAgIDB4ODgwOSwgMHhCRUM2LCAweDAxM0UsIDB4NjlBQywgMHg5MEFCLCAweDY5QUQsIDB4OTBBQiwgMHgwODEzLCAweDY2MEEsIDB4RTM0NCwgMHgwMTQ0LCAweDAzMDksIAorICAgIDB4ODMwQywgMHhCQzIwLCAweDc5ODAsIDB4MDE1NywgMHg2OTU1LCAweEUzODgsIDB4MDE1NywgMHg3QzM4LCAweEJGMEIsIDB4MDU3OCwgMHhGNTAwLCAweEJGMEIsIAorICAgIDB4MDUzOCwgMHhCOTA3LCAweDg4MDksIDB4QkVDNiwgMHgwMTU2LCAweDEwQUIsIDB4OTBBQSwgMHg2OTc0LCAweEUzODgsIDB4MDE2MywgMHhBRTcyLCAweDA1NDAsIAorICAgIDB4RjUwMCwgMHhBRTcyLCAweDA1MDAsIDB4QUU2MSwgMHgxMDNCLCAweDdBODAsIDB4MDJGNiwgMHg2OTc4LCAweEUzODgsIDB4MDE4MiwgMHg4QjhDLCAweEJGMEMsIAorICAgIDB4MDU2MCwgMHhFNTAwLCAweDdDNDAsIDB4MDgxNCwgMHhCQTIwLCAweDg4MTIsIDB4NzMzRCwgMHg3QTgwLCAweDAzODAsIDB4NzMzRSwgMHg3QTgwLCAweDAzODAsIAorICAgIDB4OEI4QywgMHhCRjBDLCAweDA1NkMsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTQsIDB4QkEyQywgMHg4ODEyLCAweDczM0YsIDB4N0E4MCwgMHgwMzgwLCAweDczNDAsIAorICAgIDB4N0E4MCwgMHgwMzgwLCAweDY5NzUsIDB4RTM4OCwgMHgwMThFLCAweEFFNzIsIDB4MDU0OCwgMHhGNTAwLCAweEFFNzIsIDB4MDUwOCwgMHhBRTYxLCAweDEwNDEsIAorICAgIDB4N0E4MCwgMHgwMkY2LCAweDY5NzksIDB4RTM4OCwgMHgwMUFELCAweDhCOEMsIDB4QkYwQywgMHgwNTYwLCAweEU1MDAsIDB4N0M0MCwgMHgwODE0LCAweEJBMTgsIAorICAgIDB4ODgxMiwgMHg3MzQzLCAweDdBODAsIDB4MDM4MCwgMHg3MzQ0LCAweDdBODAsIDB4MDM4MCwgMHg4QjhDLCAweEJGMEMsIDB4MDU2QywgMHhFNTAwLCAweDdDNDAsIAorICAgIDB4MDgxNCwgMHhCQTI0LCAweDg4MTIsIDB4NzM0NSwgMHg3QTgwLCAweDAzODAsIDB4NzM0NiwgMHg3QTgwLCAweDAzODAsIDB4Njk3NiwgMHhFMzg4LCAweDAxQjksIAorICAgIDB4QUU3MiwgMHgwNTU4LCAweEY1MDAsIDB4QUU3MiwgMHgwNTE4LCAweEFFNjEsIDB4MTA0NywgMHg3QTgwLCAweDAyRjYsIDB4Njk3QSwgMHhFMzg4LCAweDAxRDgsIAorICAgIDB4OEI4QywgMHhCRjBDLCAweDA1NjAsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTQsIDB4QkEwOCwgMHg4ODEyLCAweDczNDksIDB4N0E4MCwgMHgwMzgwLCAweDczNEEsIAorICAgIDB4N0E4MCwgMHgwMzgwLCAweDhCOEMsIDB4QkYwQywgMHgwNTZDLCAweEU1MDAsIDB4N0M0MCwgMHgwODE0LCAweEJBMTQsIDB4ODgxMiwgMHg3MzRCLCAweDdBODAsIAorICAgIDB4MDM4MCwgMHg3MzRDLCAweDdBODAsIDB4MDM4MCwgMHhCQzIxLCAweEFFMUMsIDB4MTA5MCwgMHg4QjhBLCAweEJGMEEsIDB4MDU2MCwgMHhFNTAwLCAweDdDNDAsIAorICAgIDB4MDgxMiwgMHhCODA0LCAweDg4MTMsIDB4OEI4RCwgMHhCRjBELCAweDA1NkMsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTUsIDB4QjgwNCwgMHg4ODExLCAweDdBODAsIAorICAgIDB4MDM0QSwgMHg4QjhBLCAweEJGMEEsIDB4MDU2MCwgMHhFNTAwLCAweDdDNDAsIDB4NzMxRiwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwMUY5LCAweDU0OEEsIAorICAgIDB4QkUwMywgMHg5OEEwLCAweDczMjAsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIDB4MDIwMSwgMHg1NDhBLCAweEJFMDMsIDB4OThBMCwgMHgxRjIwLCAweDJGMUYsIAorICAgIDB4OTgyNiwgMHhCQzIwLCAweDY5MzUsIDB4RTM4OCwgMHgwM0ExLCAweDY5MzMsIDB4QjgwMSwgMHg5MDMzLCAweEJGQTAsIDB4MDJFRSwgMHhFMzA4LCAweDAzQTEsIAorICAgIDB4OTAzMywgMHhCRjAwLCAweDY5NTEsIDB4RTM4OCwgMHgwMjFGLCAweDczMzQsIDB4QkU4MCwgMHg1NzYwLCAweEJFMDMsIDB4OUY3RSwgMHhCRTU5LCAweDkwMzQsIAorICAgIDB4Njk3RSwgMHgwRDUxLCAweDkwMTMsIDB4QkMyMCwgMHg2OTVDLCAweEUzODgsIDB4MDNBMSwgMHg3MzVFLCAweEJFODAsIDB4NTc2MCwgMHhCRTAzLCAweDlGN0UsIAorICAgIDB4QkU1OSwgMHg5MDVFLCAweDY5N0UsIDB4MEQ1QywgMHg5MDEzLCAweDc5ODAsIDB4MDNBMSwgMHg3QTgwLCAweDAzOEEsIDB4QkYwMSwgMHhCRTQzLCAweDY5NzcsIAorICAgIDB4RTM4OCwgMHgwMjRFLCAweEFFNjEsIDB4MTA0RCwgMHgwMDYxLCAweDhCODgsIDB4Njk4MCwgMHhFMzg4LCAweDAyNEUsIDB4OTA3MSwgMHgwRDcxLCAweDAwMEIsIAorICAgIDB4QUZBMCwgMHg4MDEwLCAweEFGQTAsIDB4ODAxMCwgMHgwODEwLCAweDY2MEEsIDB4RTMwOCwgMHgwMjQ5LCAweDAwMDksIDB4MDgxMCwgMHg2NjBDLCAweEUzODgsIAorICAgIDB4MDI0RSwgMHg4MDBCLCAweEJDMjAsIDB4Njk3QiwgMHhFMzg4LCAweDAzQTEsIDB4QkYwQSwgMHgxMDlFLCAweDhCOEEsIDB4QUY4MCwgMHg4MDE0LCAweDRDODAsIAorICAgIDB4RTEwMCwgMHgwMjY2LCAweDY5N0MsIDB4QkY5MCwgMHgwNTYwLCAweDkwNzIsIDB4MDM3MiwgMHg2OTdDLCAweEJGOTAsIDB4MDU2NCwgMHg5MDczLCAweDA0NzMsIAorICAgIDB4Nzk4MCwgMHgwMjcwLCAweDY5N0MsIDB4QkY5MCwgMHgwNTIwLCAweDkwNzIsIDB4MDM3MiwgMHg2OTdDLCAweEJGOTAsIDB4MDUyNCwgMHg5MDczLCAweDA0NzMsIAorICAgIDB4Njk3QywgMHhCODAxLCAweDkwN0MsIDB4QkYwQSwgMHgxMEZELCAweDhCOEEsIDB4QUY4MCwgMHg4MDEwLCAweDczNEYsIDB4NTQ4QSwgMHhCRTAzLCAweDk4ODAsIAorICAgIDB4QkMyMSwgMHg3MzI2LCAweDU0OEIsIDB4QkUwMywgMHg2MThCLCAweDk4OEMsIDB4QkUwMywgMHg2MTgwLCAweDk4ODAsIDB4Nzk4MCwgMHgwM0ExLCAweDdBODAsIAorICAgIDB4MDM4QSwgMHgwRDI4LCAweDQ3MTEsIDB4RTEwMCwgMHgwMkJFLCAweEFGMTIsIDB4NDAwNiwgMHg2OTEyLCAweEJGQjAsIDB4MEMwMCwgMHhFMzg4LCAweDAyQjYsIAorICAgIDB4QkZBMCwgMHgwODAwLCAweEUzODgsIDB4MDJCMiwgMHg2OTEyLCAweEJGQjAsIDB4MEMwMCwgMHhCRkEwLCAweDA0MDAsIDB4RTM4OCwgMHgwMkEzLCAweDY5MDksIAorICAgIDB4OTAwQiwgMHg3OTgwLCAweDAyQTUsIDB4QUYwQiwgMHg0MDA1LCAweDY5MDEsIDB4OTAwNSwgMHg2OTAyLCAweDkwMDYsIDB4NDMxMSwgMHhFMTAwLCAweDAyRUQsIAorICAgIDB4NjkxMSwgMHhCRkMwLCAweDIwMDAsIDB4OTAxMSwgMHg3OTgwLCAweDAyRUQsIDB4NjkwOSwgMHg5MDBCLCAweDc5ODAsIDB4MDJCOCwgMHhBRjBCLCAweDQwMDUsIAorICAgIDB4QUYwNSwgMHg0MDAzLCAweEFGMDYsIDB4NDAwNCwgMHg3OTgwLCAweDAyRUQsIDB4QUYxMiwgMHg0MDA2LCAweDY5MTIsIDB4QkZCMCwgMHgwQzAwLCAweEUzODgsIAorICAgIDB4MDJFNywgMHhCRkEwLCAweDA4MDAsIDB4RTM4OCwgMHgwMkUzLCAweDY5MTIsIDB4QkZCMCwgMHgwQzAwLCAweEJGQTAsIDB4MDQwMCwgMHhFMzg4LCAweDAyRDQsIAorICAgIDB4NjkwRCwgMHg5MDEwLCAweDc5ODAsIDB4MDJENiwgMHhBRjEwLCAweDQwMDUsIDB4NjkwMSwgMHg5MDA1LCAweDY5MDIsIDB4OTAwNiwgMHg0MzExLCAweEUxMDAsIAorICAgIDB4MDJFRCwgMHg2OTExLCAweEJGQzAsIDB4MjAwMCwgMHg5MDExLCAweDc5ODAsIDB4MDJFRCwgMHg2OTBELCAweDkwMTAsIDB4Nzk4MCwgMHgwMkU5LCAweEFGMTAsIAorICAgIDB4NDAwNSwgMHhBRjA1LCAweDQwMDMsIDB4QUYwNiwgMHg0MDA0LCAweEJDMjAsIDB4Njk3MCwgMHg5MDcxLCAweDdBODAsIDB4MDA3OCwgMHg2OTcxLCAweDkwNzAsIAorICAgIDB4Nzk4MCwgMHgwM0ExLCAweEJDMjAsIDB4MDM2MSwgMHg4QjhCLCAweDY5ODAsIDB4RUY4OCwgMHgwMjcyLCAweDAzNzIsIDB4NzgwNCwgMHg5MDcxLCAweDBENzEsIAorICAgIDB4OEI4QSwgMHgwMDBCLCAweEI5MDMsIDB4ODgwOSwgMHhCRUM2LCAweDAzMDksIDB4NjlBOCwgMHg5MEFCLCAweDY5QTgsIDB4OTBBQSwgMHgwODEwLCAweDY2MEEsIAorICAgIDB4RTM0NCwgMHgwMzBGLCAweDAwMDksIDB4MDgxMCwgMHg2NjBDLCAweEUzODgsIDB4MDMxNCwgMHg4MDBCLCAweEJDMjAsIDB4Njk2MSwgMHhCODAxLCAweDkwNjEsIAorICAgIDB4Nzk4MCwgMHgwMkY3LCAweDdBODAsIDB4MDM4QSwgMHg1RDM1LCAweDAwMDEsIDB4NjkzNCwgMHhCODAxLCAweDkwMzQsIDB4QkYwQSwgMHgxMDlFLCAweDhCOEEsIAorICAgIDB4QUY4MCwgMHg4MDE0LCAweDQ4ODAsIDB4QUU3MiwgMHgwNTUwLCAweEY1MDAsIDB4QUU3MiwgMHgwNTEwLCAweEFFNjEsIDB4MTA1MSwgMHg3QTgwLCAweDAyRjYsIAorICAgIDB4Nzk4MCwgMHgwM0ExLCAweDdBODAsIDB4MDM4QSwgMHg1RDM1LCAweDAwMDIsIDB4Njk1RSwgMHhCODAxLCAweDkwNUUsIDB4QkYwQSwgMHgxMDlFLCAweDhCOEEsIAorICAgIDB4QUY4MCwgMHg4MDE0LCAweDQ3ODAsIDB4QUU3MiwgMHgwNTU4LCAweEY1MDAsIDB4QUU3MiwgMHgwNTE4LCAweEFFNjEsIDB4MTA1QywgMHg3QTgwLCAweDAyRjYsIAorICAgIDB4Nzk4MCwgMHgwM0ExLCAweDAwMUMsIDB4OEI4OCwgMHg2OTgwLCAweEVGODgsIDB4OTAxRCwgMHgwRDFELCAweDEwMEYsIDB4NjYxMCwgMHhFMzhDLCAweDAzNTgsIAorICAgIDB4NjkwRSwgMHg2NjEwLCAweDYyMEYsIDB4NjYwRCwgMHhCQTBGLCAweEUzMDEsIDB4MDM3QSwgMHgwNDEwLCAweDhCOEEsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIAorICAgIDB4MDM2QywgMHg2QThDLCAweDYxQUEsIDB4OThBQiwgMHg2QThDLCAweDYxQUIsIDB4OThBRCwgMHg2QThDLCAweDYxQUQsIDB4OThBOSwgMHg2QThDLCAweDYxQTksIAorICAgIDB4OThBQSwgMHg3QzA0LCAweDhCOEIsIDB4N0MwNCwgMHg4QjhELCAweDdDMDQsIDB4OEI4OSwgMHg3QzA0LCAweDA4MTQsIDB4NjYwRSwgMHhFMzA4LCAweDAzNzksIAorICAgIDB4MDQwRCwgMHg4NDEwLCAweEJDMjEsIDB4NjkxQywgMHhCODAxLCAweDkwMUMsIDB4Nzk4MCwgMHgwMzRBLCAweEI5MDMsIDB4ODgwOSwgMHg4QjhBLCAweEJFQzYsIAorICAgIDB4MDM4OCwgMHg1NEFDLCAweEJFMDMsIDB4NjE4QywgMHg5OEFBLCAweEVGMDAsIDB4QkMyMCwgMHhCRTQ2LCAweDA4MDksIDB4OTA2QiwgMHgwODBBLCAweDkwNkMsIAorICAgIDB4MDgwQiwgMHg5MDZELCAweDA4MUEsIDB4OTA2MiwgMHgwODFCLCAweDkwNjMsIDB4MDgxRSwgMHg5MDY0LCAweEJFNTksIDB4ODgxRSwgMHg4MDY1LCAweDgxNjYsIAorICAgIDB4ODI2NywgMHg4MzY4LCAweDg0NjksIDB4ODU2QSwgMHhFRjAwLCAweEJDMjAsIDB4Njk2QiwgMHg4ODA5LCAweDY5NkMsIDB4ODgwQSwgMHg2OTZELCAweDg4MEIsIAorICAgIDB4Njk2MiwgMHg4ODFBLCAweDY5NjMsIDB4ODgxQiwgMHg2OTY0LCAweDg4MUUsIDB4MDA2NSwgMHgwMTY2LCAweDAyNjcsIDB4MDM2OCwgMHgwNDY5LCAweDA1NkEsIAorICAgIDB4QkUzQSwgCit9OworCisvKgorICogTWluaSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgY29kZSBpbWFnZQorICogdGhhdCBpcyB0byBiZSBsb2FkZWQgYXQgMHg0MDAgb24gdGhlIERTUC4KKyAqLworc3RhdGljIHUxNiBhc3NwX21pbmlzcmNfaW1hZ2VbXSBfX2RldmluaXRkYXRhID0geworCisgICAgMHhCRjgwLCAweDEwMUUsIDB4OTA2RSwgMHgwMDZFLCAweDhCODgsIDB4Njk4MCwgMHhFRjg4LCAweDkwNkYsIDB4MEQ2RiwgMHg2OTAwLCAweEVCMDgsIDB4MDQxMiwgCisgICAgMHhCQzIwLCAweDY5NkUsIDB4QjgwMSwgMHg5MDZFLCAweDc5ODAsIDB4MDQwMywgMHhCOTBFLCAweDg4MDcsIDB4QkU0MywgMHhCRjAxLCAweEJFNDcsIDB4QkU0MSwgCisgICAgMHg3QTgwLCAweDAwMkEsIDB4QkU0MCwgMHgzMDI5LCAweEVGQ0MsIDB4QkU0MSwgMHg3QTgwLCAweDAwMjgsIDB4QkU0MCwgMHgzMDI4LCAweEVGQ0MsIDB4NjkwNywgCisgICAgMHhFMzA4LCAweDA0MkEsIDB4NjkwOSwgMHg5MDJDLCAweDc5ODAsIDB4MDQyQywgMHg2OTBELCAweDkwMkMsIDB4MTAwOSwgMHg4ODFBLCAweDEwMEEsIDB4QkEwMSwgCisgICAgMHg4ODFCLCAweDEwMEQsIDB4ODgxQywgMHgxMDBFLCAweEJBMDEsIDB4ODgxRCwgMHhCRjgwLCAweDAwRUQsIDB4ODgxRSwgMHgwNTBDLCAweDAxMjQsIDB4QjkwNCwgCisgICAgMHg5MDI3LCAweDY5MTgsIDB4RTMwOCwgMHgwNEIzLCAweDkwMkQsIDB4NjkxMywgMHhCRkEwLCAweDc1OTgsIDB4RjcwNCwgMHhBRTJELCAweDAwRkYsIDB4OEI4RCwgCisgICAgMHg2OTE5LCAweEUzMDgsIDB4MDQ2MywgMHg2OTFBLCAweEUzMDgsIDB4MDQ1NiwgMHhCOTA3LCAweDg4MDksIDB4QkVDNiwgMHgwNDUzLCAweDEwQTksIDB4OTBBRCwgCisgICAgMHg3OTgwLCAweDA0N0MsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIDB4MDQ2MCwgMHgxODg5LCAweDZDMjIsIDB4OTBBRCwgMHgxMEE5LCAweDZFMjMsIDB4NkMyMiwgCisgICAgMHg5MEFELCAweDc5ODAsIDB4MDQ3QywgMHgxMDFBLCAweEUzMDgsIDB4MDQ2RiwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwNDZDLCAweDEwQTksIDB4OTBBMCwgCisgICAgMHg5MEFELCAweDc5ODAsIDB4MDQ3QywgMHhCOTAxLCAweDg4MDksIDB4QkVDNiwgMHgwNDdCLCAweDE4ODksIDB4NkMyMiwgMHg5MEEwLCAweDkwQUQsIDB4MTBBOSwgCisgICAgMHg2RTIzLCAweDZDMjIsIDB4OTBBMCwgMHg5MEFELCAweDY5MkQsIDB4RTMwOCwgMHgwNDlDLCAweDAxMjQsIDB4QjcwMywgMHhCOTAyLCAweDg4MTgsIDB4OEI4OSwgCisgICAgMHgwMjJDLCAweDEwOEEsIDB4N0MwNCwgMHg5MEEwLCAweDY5MkIsIDB4ODgxRiwgMHg3RTgwLCAweDA1NUIsIDB4NjkyQSwgMHg4ODA5LCAweDhCODksIDB4OTlBMCwgCisgICAgMHgxMDhBLCAweDkwQTAsIDB4NjkyQiwgMHg4ODFGLCAweDdFODAsIDB4MDU1QiwgMHg2OTJBLCAweDg4MDksIDB4OEI4OSwgMHg5OUFGLCAweDdCOTksIDB4MDQ4NCwgCisgICAgMHgwMTI0LCAweDA2MEYsIDB4MTAxQiwgMHgyMDEzLCAweDkwMUIsIDB4QkZBMCwgMHg3RkZGLCAweEUzNDQsIDB4MDRBQywgMHg5MDFCLCAweDhCODksIDB4N0E4MCwgCisgICAgMHgwNTFBLCAweDY5MjcsIDB4QkEwMSwgMHg5MDI3LCAweDdBODAsIDB4MDUyMywgMHg2OTI3LCAweEUzMDgsIDB4MDQ5RSwgMHg3OTgwLCAweDA1MEYsIDB4MDYyNCwgCisgICAgMHgxMDI2LCAweDIwMTMsIDB4OTAyNiwgMHhCRkEwLCAweDdGRkYsIDB4RTMwNCwgMHgwNEMwLCAweDhCOEQsIDB4N0E4MCwgMHgwNTFBLCAweDc5ODAsIDB4MDRCNCwgCisgICAgMHg5MDI2LCAweDEwMTMsIDB4MzAyNiwgMHg5MDFCLCAweDhCOEQsIDB4N0E4MCwgMHgwNTFBLCAweDdBODAsIDB4MDUyMywgMHgxMDI3LCAweEJBMDEsIDB4OTAyNywgCisgICAgMHhFMzA4LCAweDA0QjQsIDB4MDEyNCwgMHgwNjBGLCAweDhCODksIDB4NjkxQSwgMHhFMzA4LCAweDA0RUEsIDB4NjkxOSwgMHhFMzg4LCAweDA0RTAsIDB4QjkwMywgCisgICAgMHg4ODA5LCAweEJFQzYsIDB4MDRERCwgMHgxRkEwLCAweDJGQUUsIDB4OThBOSwgMHg3OTgwLCAweDA1MEYsIDB4QjkwMSwgMHg4ODE4LCAweEI5MDcsIDB4ODgwOSwgCisgICAgMHhCRUM2LCAweDA0RTcsIDB4MTBFRSwgMHg5MEE5LCAweDc5ODAsIDB4MDUwRiwgMHg2OTE5LCAweEUzMDgsIDB4MDRGRSwgMHhCOTAzLCAweDg4MDksIDB4QkU0NiwgCisgICAgMHhCRUM2LCAweDA0RkEsIDB4MTdBMCwgMHhCRTFFLCAweDFGQUUsIDB4QkZCRiwgMHhGRjAwLCAweEJFMTMsIDB4QkZERiwgMHg4MDgwLCAweDk5QTksIDB4QkU0NywgCisgICAgMHg3OTgwLCAweDA1MEYsIDB4QjkwMSwgMHg4ODA5LCAweEJFQzYsIDB4MDUwRSwgMHgxNkEwLCAweDI2QTAsIDB4QkZCNywgMHhGRjAwLCAweEJFMUUsIDB4MUVBMCwgCisgICAgMHgyRUFFLCAweEJGQkYsIDB4RkYwMCwgMHhCRTEzLCAweEJGREYsIDB4ODA4MCwgMHg5OUE5LCAweDg1MEMsIDB4ODYwRiwgMHg2OTA3LCAweEUzODgsIDB4MDUxNiwgCisgICAgMHgwRDA3LCAweDg1MTAsIDB4QkU1OSwgMHg4ODFFLCAweEJFNEEsIDB4RUYwMCwgMHgxMDFFLCAweDkwMUMsIDB4MTAxRiwgMHg5MDFELCAweDEwQTAsIDB4OTAxRSwgCisgICAgMHgxMEEwLCAweDkwMUYsIDB4RUYwMCwgMHgxMDFFLCAweDMwMUMsIDB4OTAyMCwgMHg3MzFCLCAweDU0MjAsIDB4QkUwMywgMHg5ODI1LCAweDEwMjUsIDB4MjAxQywgCisgICAgMHg5MDI1LCAweDczMjUsIDB4NTQxNCwgMHhCRTAzLCAweDhCOEUsIDB4OTg4MCwgMHg2OTJGLCAweEUzODgsIDB4MDUzOSwgMHhCRTU5LCAweEJCMDcsIDB4NjE4MCwgCisgICAgMHg5ODgwLCAweDhCQTAsIDB4MTAxRiwgMHgzMDFELCAweDkwMjEsIDB4NzMxQiwgMHg1NDIxLCAweEJFMDMsIDB4OTgyRSwgMHgxMDJFLCAweDIwMUQsIDB4OTAyRSwgCisgICAgMHg3MzJFLCAweDU0MTUsIDB4QkUwMywgMHg5ODgwLCAweDY5MkYsIDB4RTM4OCwgMHgwNTRGLCAweEJFNTksIDB4QkIwNywgMHg2MTgwLCAweDk4ODAsIDB4OEJBMCwgCisgICAgMHg2OTE4LCAweEVGMDgsIDB4NzMyNSwgMHg1NDE2LCAweEJFMDMsIDB4OThBMCwgMHg3MzJFLCAweDU0MTcsIDB4QkUwMywgMHg5OEEwLCAweEVGMDAsIDB4OEJBMCwgCisgICAgMHhCRUM2LCAweDA1NkIsIDB4QkU1OSwgMHhCQjA0LCAweEFBOTAsIDB4QkUwNCwgMHhCRTFFLCAweDk5RTAsIDB4OEJFMCwgMHg2OUEwLCAweDkwRDAsIDB4NjlBMCwgCisgICAgMHg5MEQwLCAweDA4MUYsIDB4QjgwNSwgMHg4ODFGLCAweDhCOTAsIDB4NjlBMCwgMHg5MEQwLCAweDY5QTAsIDB4OTA5MCwgMHg4QkQwLCAweDhCRDgsIDB4QkUxRiwgCisgICAgMHhFRjAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCit9OworCisKKy8qCisgKiBpbml0aWFsaXplIEFTU1AKKyAqLworCisjZGVmaW5lIE1JTklTUkNfTFBGX0xFTiAxMAorc3RhdGljIHUxNiBtaW5pc3JjX2xwZltNSU5JU1JDX0xQRl9MRU5dIF9fZGV2aW5pdGRhdGEgPSB7CisJMFgwNzQzLCAwWDExMDQsIDBYMEE0QywgMFhGODhELCAwWDI0MkMsCisJMFgxMDIzLCAwWDFBQTksIDBYMEI2MCwgMFhFRkRELCAwWDE4NkYKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfbTNfYXNzcF9pbml0KG0zX3QgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiB6ZXJvIGtlcm5lbCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IChSRVZfQl9EQVRBX01FTU9SWV9VTklUX0xFTkdUSCAqIE5VTV9VTklUU19LRVJORUxfREFUQSkgLyAyOyBpKyspCisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisJCQkJICBLREFUQV9CQVNFX0FERFIgKyBpLCAwKTsKKworCS8qIHplcm8gbWl4ZXIgZGF0YT8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFJFVl9CX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICogTlVNX1VOSVRTX0tFUk5FTF9EQVRBKSAvIDI7IGkrKykKKwkJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJCSAgS0RBVEFfQkFTRV9BRERSMiArIGksIDApOworCisJLyogaW5pdCBkbWEgcG9pbnRlciAqLworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgS0RBVEFfQ1VSUkVOVF9ETUEsCisJCQkgIEtEQVRBX0RNQV9YRkVSMCk7CisKKwkvKiB3cml0ZSBrZXJuZWwgaW50byBjb2RlIG1lbW9yeS4uICovCisJZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKGFzc3Bfa2VybmVsX2ltYWdlKTsgaSsrKSB7CisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwgCisJCQkJICBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiArIGksIAorCQkJCSAgYXNzcF9rZXJuZWxfaW1hZ2VbaV0pOworCX0KKworCS8qCisJICogV2Ugb25seSBoYXZlIHRoaXMgb25lIGNsaWVudCBhbmQgd2Uga25vdyB0aGF0IDB4NDAwCisJICogaXMgZnJlZSBpbiBvdXIga2VybmVsJ3MgbWVtIG1hcCwgc28gbGV0cyBqdXN0CisJICogZHJvcCBpdCB0aGVyZS4gIEl0IHNlZW1zIHRoYXQgdGhlIG1pbmlzcmMgZG9lc24ndAorCSAqIG5lZWQgdmVjdG9ycywgc28gd2Ugd29uJ3QgYm90aGVyIHdpdGggdGhlbS4uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXNzcF9taW5pc3JjX2ltYWdlKTsgaSsrKSB7CisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwgCisJCQkJICAweDQwMCArIGksIAorCQkJCSAgYXNzcF9taW5pc3JjX2ltYWdlW2ldKTsKKwl9CisKKwkvKgorCSAqIHdyaXRlIHRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSBsb3cgcGFzcyBmaWx0ZXI/CisJICovCisJZm9yIChpID0gMDsgaSA8IE1JTklTUkNfTFBGX0xFTiA7IGkrKykgeworCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsCisJCQkJICAweDQwMCArIE1JTklTUkNfQ09FRl9MT0MgKyBpLAorCQkJCSAgbWluaXNyY19scGZbaV0pOworCX0KKworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwKKwkJCSAgMHg0MDAgKyBNSU5JU1JDX0NPRUZfTE9DICsgTUlOSVNSQ19MUEZfTEVOLAorCQkJICAweDgwMDApOworCisJLyoKKwkgKiB0aGUgbWluaXNyYyBpcyB0aGUgb25seSB0aGluZyBvbgorCSAqIG91ciB0YXNrIGxpc3QuLgorCSAqLworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisJCQkgIEtEQVRBX1RBU0swLAorCQkJICAweDQwMCk7CisKKwkvKgorCSAqIGluaXQgdGhlIG1peGVyIG51bWJlci4uCisJICovCisKKwlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisJCQkgIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSLDApOworCisJLyoKKwkgKiBFWFRSRU1FIEtFUk5FTCBNQVNURVIgVk9MVU1FCisJICovCisJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorCQkJICBLREFUQV9EQUNfTEVGVF9WT0xVTUUsIEFSQl9WT0xVTUUpOworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCSAgS0RBVEFfREFDX1JJR0hUX1ZPTFVNRSwgQVJCX1ZPTFVNRSk7CisKKwljaGlwLT5taXhlcl9saXN0LmN1cmxlbiA9IDA7CisJY2hpcC0+bWl4ZXJfbGlzdC5tZW1fYWRkciA9IEtEQVRBX01JWEVSX1hGRVIwOworCWNoaXAtPm1peGVyX2xpc3QubWF4ID0gTUFYX1ZJUlRVQUxfTUlYRVJfQ0hBTk5FTFM7CisJY2hpcC0+YWRjMV9saXN0LmN1cmxlbiA9IDA7CisJY2hpcC0+YWRjMV9saXN0Lm1lbV9hZGRyID0gS0RBVEFfQURDMV9YRkVSMDsKKwljaGlwLT5hZGMxX2xpc3QubWF4ID0gTUFYX1ZJUlRVQUxfQURDMV9DSEFOTkVMUzsKKwljaGlwLT5kbWFfbGlzdC5jdXJsZW4gPSAwOworCWNoaXAtPmRtYV9saXN0Lm1lbV9hZGRyID0gS0RBVEFfRE1BX1hGRVIwOworCWNoaXAtPmRtYV9saXN0Lm1heCA9IE1BWF9WSVJUVUFMX0RNQV9DSEFOTkVMUzsKKwljaGlwLT5tc3JjX2xpc3QuY3VybGVuID0gMDsKKwljaGlwLT5tc3JjX2xpc3QubWVtX2FkZHIgPSBLREFUQV9JTlNUQU5DRTBfTUlOSVNSQzsKKwljaGlwLT5tc3JjX2xpc3QubWF4ID0gTUFYX0lOU1RBTkNFX01JTklTUkM7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX20zX2Fzc3BfY2xpZW50X2luaXQobTNfdCAqY2hpcCwgbTNfZG1hX3QgKnMsIGludCBpbmRleCkKK3sKKwlpbnQgZGF0YV9ieXRlcyA9IDIgKiAoIE1JTklTUkNfVE1QX0JVRkZFUl9TSVpFIC8gMiArIAorCQkJICAgICAgIE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgLyAyICsKKwkJCSAgICAgICAxICsgTUlOSVNSQ19PVVRfQlVGRkVSX1NJWkUgLyAyICsgMSApOworCWludCBhZGRyZXNzLCBpOworCisJLyoKKwkgKiB0aGUgcmV2YiBtZW1vcnkgbWFwIGhhcyAweDExMDAgdGhyb3VnaCAweDFjMDAKKwkgKiBmcmVlLiAgCisJICovCisKKwkvKgorCSAqIGFsaWduIGluc3RhbmNlIGFkZHJlc3MgdG8gMjU2IGJ5dGVzIHNvIHRoYXQgaXQncworCSAqIHNoaWZ0ZWQgbGlzdCBhZGRyZXNzIGlzIGFsaWduZWQuCisJICogbGlzdCBhZGRyZXNzID0gKG1lbSBhZGRyZXNzID4+IDEpID4+IDc7CisJICovCisJZGF0YV9ieXRlcyA9IChkYXRhX2J5dGVzICsgMjU1KSAmIH4yNTU7CisJYWRkcmVzcyA9IDB4MTEwMCArICgoZGF0YV9ieXRlcy8yKSAqIGluZGV4KTsKKworCWlmICgoYWRkcmVzcyArIChkYXRhX2J5dGVzLzIpKSA+PSAweDFjMDApIHsKKwkJc25kX3ByaW50aygibm8gbWVtb3J5IGZvciAlZCBieXRlcyBhdCBpbmQgJWQgKGFkZHIgMHgleClcbiIsCisJCQkgICBkYXRhX2J5dGVzLCBpbmRleCwgYWRkcmVzcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXMtPm51bWJlciA9IGluZGV4OworCXMtPmluc3QuY29kZSA9IDB4NDAwOworCXMtPmluc3QuZGF0YSA9IGFkZHJlc3M7CisKKwlmb3IgKGkgPSBkYXRhX2J5dGVzIC8gMjsgaSA+IDA7IGFkZHJlc3MrKywgaS0tKSB7CisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKwkJCQkgIGFkZHJlc3MsIDApOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIAorICogdGhpcyB3b3JrcyBmb3IgdGhlIHJlZmVyZW5jZSBib2FyZCwgaGF2ZSB0byBmaW5kCisgKiBvdXQgYWJvdXQgb3RoZXJzCisgKgorICogdGhpcyBuZWVkcyBtb3JlIG1hZ2ljIGZvciA0IHNwZWFrZXIsIGJ1dC4uCisgKi8KK3N0YXRpYyB2b2lkCitzbmRfbTNfYW1wX2VuYWJsZShtM190ICpjaGlwLCBpbnQgZW5hYmxlKQoreworCWludCBpbyA9IGNoaXAtPmlvYmFzZTsKKwl1MTYgZ3BvLCBwb2xhcml0eTsKKworCWlmICghIGNoaXAtPmV4dGVybmFsX2FtcCkKKwkJcmV0dXJuOworCisJcG9sYXJpdHkgPSBlbmFibGUgPyAwIDogMTsKKwlwb2xhcml0eSA9IHBvbGFyaXR5IDw8IGNoaXAtPmFtcF9ncGlvOworCWdwbyA9IDEgPDwgY2hpcC0+YW1wX2dwaW87CisKKwlvdXR3KH5ncG8sIGlvICsgR1BJT19NQVNLKTsKKworCW91dHcoaW53KGlvICsgR1BJT19ESVJFQ1RJT04pIHwgZ3BvLAorCSAgICAgaW8gKyBHUElPX0RJUkVDVElPTik7CisKKwlvdXR3KChHUE9fU0VDT05EQVJZX0FDOTcgfCBHUE9fUFJJTUFSWV9BQzk3IHwgcG9sYXJpdHkpLAorCSAgICAgaW8gKyBHUElPX0RBVEEpOworCisJb3V0dygweGZmZmYsIGlvICsgR1BJT19NQVNLKTsKK30KKworc3RhdGljIGludAorc25kX20zX2NoaXBfaW5pdChtM190ICpjaGlwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjaGlwLT5wY2k7CisJdTMyIG47CisJdTE2IHc7CisJdTggdDsgLyogbWFrZXMgYXMgbXVjaCBzZW5zZSBhcyAnbicsIG5vPyAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCBQQ0lfTEVHQUNZX0FVRElPX0NUUkwsICZ3KTsKKwl3ICY9IH4oU09VTkRfQkxBU1RFUl9FTkFCTEV8Rk1fU1lOVEhFU0lTX0VOQUJMRXwKKwkgICAgICAgTVBVNDAxX0lPX0VOQUJMRXxNUFU0MDFfSVJRX0VOQUJMRXxBTElBU18xMEJJVF9JT3wKKwkgICAgICAgRElTQUJMRV9MRUdBQ1kpOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIFBDSV9MRUdBQ1lfQVVESU9fQ1RSTCwgdyk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQUxMRUdST19DT05GSUcsICZuKTsKKwluICY9IFJFRFVDRURfREVCT1VOQ0U7CisJbiB8PSBQTV9DVFJMX0VOQUJMRSB8IENMS19ESVZfQllfNDkgfCBVU0VfUENJX1RJTUlORzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0FMTEVHUk9fQ09ORklHLCBuKTsKKworCW91dGIoUkVTRVRfQVNTUCwgY2hpcC0+aW9iYXNlICsgQVNTUF9DT05UUk9MX0IpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9BTExFR1JPX0NPTkZJRywgJm4pOworCW4gJj0gfklOVF9DTEtfU0VMRUNUOworCWlmICghY2hpcC0+YWxsZWdyb19mbGFnKSB7CisJCW4gJj0gfklOVF9DTEtfTVVMVF9FTkFCTEU7IAorCQluIHw9IElOVF9DTEtfU1JDX05PVF9QQ0k7CisJfQorCW4gJj0gIH4oIENMS19NVUxUX01PREVfU0VMRUNUIHwgQ0xLX01VTFRfTU9ERV9TRUxFQ1RfMiApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQUxMRUdST19DT05GSUcsIG4pOworCisJaWYgKGNoaXAtPmFsbGVncm9fZmxhZykgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfVVNFUl9DT05GSUcsICZuKTsKKwkJbiB8PSBJTl9DTEtfMTJNSFpfU0VMRUNUOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX1VTRVJfQ09ORklHLCBuKTsKKwl9CisKKwl0ID0gaW5iKGNoaXAtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9BKTsKKwl0ICY9IH4oIERTUF9DTEtfMzZNSFpfU0VMRUNUICB8IEFTU1BfQ0xLXzQ5TUhaX1NFTEVDVCk7CisJdCB8PSBBU1NQX0NMS180OU1IWl9TRUxFQ1Q7CisJdCB8PSBBU1NQXzBfV1NfRU5BQkxFOyAKKwlvdXRiKHQsIGNoaXAtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9BKTsKKworCW91dGIoUlVOX0FTU1AsIGNoaXAtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9CKTsgCisKKwlyZXR1cm4gMDsKK30gCisKK3N0YXRpYyB2b2lkCitzbmRfbTNfZW5hYmxlX2ludHMobTNfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvID0gY2hpcC0+aW9iYXNlOworCisJLyogVE9ETzogTVBVNDAxIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJb3V0dyhBU1NQX0lOVF9FTkFCTEUgLyp8IE1QVTQwMV9JTlRfRU5BQkxFKi8sIGlvICsgSE9TVF9JTlRfQ1RSTCk7CisJb3V0YihpbmIoaW8gKyBBU1NQX0NPTlRST0xfQykgfCBBU1NQX0hPU1RfSU5UX0VOQUJMRSwKKwkgICAgIGlvICsgQVNTUF9DT05UUk9MX0MpOworfQorCisKKy8qCisgKi8KKworc3RhdGljIGludCBzbmRfbTNfZnJlZShtM190ICpjaGlwKQoreworCW0zX2RtYV90ICpzOworCWludCBpOworCisJaWYgKGNoaXAtPnN1YnN0cmVhbXMpIHsKKwkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N1YnN0cmVhbXM7IGkrKykgeworCQkJcyA9ICZjaGlwLT5zdWJzdHJlYW1zW2ldOworCQkJLyogY2hlY2sgc3Vydml2aW5nIHBjbXM7IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdGhvdWdoLi4gKi8KKwkJCWlmIChzLT5zdWJzdHJlYW0gJiYgcy0+cnVubmluZykKKwkJCQlzbmRfbTNfcGNtX3N0b3AoY2hpcCwgcywgcy0+c3Vic3RyZWFtKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJa2ZyZWUoY2hpcC0+c3Vic3RyZWFtcyk7CisJfQorCWlmIChjaGlwLT5pb2Jhc2UpIHsKKwkJc25kX20zX291dHcoY2hpcCwgSE9TVF9JTlRfQ1RSTCwgMCk7IC8qIGRpc2FibGUgaW50cyAqLworCX0KKworI2lmZGVmIENPTkZJR19QTQorCXZmcmVlKGNoaXAtPnN1c3BlbmRfbWVtKTsKKyNlbmRpZgorCisJaWYgKGNoaXAtPmlycSA+PSAwKSB7CisJCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJfQorCisJaWYgKGNoaXAtPmlvYmFzZSkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEFQTSBzdXBwb3J0CisgKi8KKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbTNfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJbTNfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaSwgaW5kZXg7CisKKwlpZiAoY2hpcC0+c3VzcGVuZF9tZW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKworCWJpZ19tZGVsYXkoMTApOyAvKiBnaXZlIHRoZSBhc3NwIGEgY2hhbmNlIHRvIGlkbGUuLiAqLworCisJc25kX20zX2Fzc3BfaGFsdChjaGlwKTsKKworCS8qIHNhdmUgZHNwIGltYWdlICovCisJaW5kZXggPSAwOworCWZvciAoaSA9IFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOOyBpIDw9IFJFVl9CX0NPREVfTUVNT1JZX0VORDsgaSsrKQorCQljaGlwLT5zdXNwZW5kX21lbVtpbmRleCsrXSA9IAorCQkJc25kX20zX2Fzc3BfcmVhZChjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsIGkpOworCWZvciAoaSA9IFJFVl9CX0RBVEFfTUVNT1JZX0JFR0lOIDsgaSA8PSBSRVZfQl9EQVRBX01FTU9SWV9FTkQ7IGkrKykKKwkJY2hpcC0+c3VzcGVuZF9tZW1baW5kZXgrK10gPSAKKwkJCXNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCBpKTsKKworCS8qIHBvd2VyIGRvd24gYXBjaSByZWdpc3RlcnMgKi8KKwlzbmRfbTNfb3V0dyhjaGlwLCAweGZmZmYsIDB4NTQpOworCXNuZF9tM19vdXR3KGNoaXAsIDB4ZmZmZiwgMHg1Nik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtM19yZXN1bWUoc25kX2NhcmRfdCAqY2FyZCkKK3sKKwltM190ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBpLCBpbmRleDsKKworCWlmIChjaGlwLT5zdXNwZW5kX21lbSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXBjaV9lbmFibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcGNpX3NldF9tYXN0ZXIoY2hpcC0+cGNpKTsKKworCS8qIGZpcnN0IGxldHMganVzdCBicmluZyBldmVyeXRoaW5nIGJhY2suIC4qLworCXNuZF9tM19vdXR3KGNoaXAsIDAsIDB4NTQpOworCXNuZF9tM19vdXR3KGNoaXAsIDAsIDB4NTYpOworCisJc25kX20zX2NoaXBfaW5pdChjaGlwKTsKKwlzbmRfbTNfYXNzcF9oYWx0KGNoaXApOworCXNuZF9tM19hYzk3X3Jlc2V0KGNoaXApOworCisJLyogcmVzdG9yZSBkc3AgaW1hZ2UgKi8KKwlpbmRleCA9IDA7CisJZm9yIChpID0gUkVWX0JfQ09ERV9NRU1PUllfQkVHSU47IGkgPD0gUkVWX0JfQ09ERV9NRU1PUllfRU5EOyBpKyspCisJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwgaSwgCisJCQkJICBjaGlwLT5zdXNwZW5kX21lbVtpbmRleCsrXSk7CisJZm9yIChpID0gUkVWX0JfREFUQV9NRU1PUllfQkVHSU4gOyBpIDw9IFJFVl9CX0RBVEFfTUVNT1JZX0VORDsgaSsrKQorCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIGksIAorCQkJCSAgY2hpcC0+c3VzcGVuZF9tZW1baW5kZXgrK10pOworCisJLyogdGVsbCB0aGUgZG1hIGVuZ2luZSB0byByZXN0YXJ0IGl0c2VsZiAqLworCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisJCQkgIEtEQVRBX0RNQV9BQ1RJVkUsIDApOworCisgICAgICAgIC8qIHJlc3RvcmUgYWM5NyByZWdpc3RlcnMgKi8KKwlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CisKKwlzbmRfbTNfYXNzcF9jb250aW51ZShjaGlwKTsKKwlzbmRfbTNfZW5hYmxlX2ludHMoY2hpcCk7CisJc25kX20zX2FtcF9lbmFibGUoY2hpcCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCisvKgorICovCisKK3N0YXRpYyBpbnQgc25kX20zX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCW0zX3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfbTNfZnJlZShjaGlwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3NuZF9tM19jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkgICAgICBpbnQgZW5hYmxlX2FtcCwKKwkgICAgICBpbnQgYW1wX2dwaW8sCisJICAgICAgbTNfdCAqKmNoaXBfcmV0KQoreworCW0zX3QgKmNoaXA7CisJaW50IGksIGVycjsKKwlzdHJ1Y3QgbTNfcXVpcmsgKnF1aXJrOworCXUxNiBzdWJzeXN0ZW1fdmVuZG9yLCBzdWJzeXN0ZW1fZGV2aWNlOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX20zX2Rldl9mcmVlLAorCX07CisKKwkqY2hpcF9yZXQgPSBOVUxMOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpCisJCXJldHVybiAtRUlPOworCisJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyOCBiaXRzICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCAweDBmZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgMHgwZmZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKHBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0VTU19BTExFR1JPOgorCWNhc2UgUENJX0RFVklDRV9JRF9FU1NfQUxMRUdST18xOgorCWNhc2UgUENJX0RFVklDRV9JRF9FU1NfQ0FOWU9OM0RfMkxFOgorCWNhc2UgUENJX0RFVklDRV9JRF9FU1NfQ0FOWU9OM0RfMjoKKwkJY2hpcC0+YWxsZWdyb19mbGFnID0gMTsKKwkJYnJlYWs7CisJfQorCisJY2hpcC0+Y2FyZCA9IGNhcmQ7CisJY2hpcC0+cGNpID0gcGNpOworCWNoaXAtPmlycSA9IC0xOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOworCisJZm9yIChxdWlyayA9IG0zX3F1aXJrX2xpc3Q7IHF1aXJrLT52ZW5kb3I7IHF1aXJrKyspIHsKKwkJaWYgKHN1YnN5c3RlbV92ZW5kb3IgPT0gcXVpcmstPnZlbmRvciAmJgorCQkgICAgc3Vic3lzdGVtX2RldmljZSA9PSBxdWlyay0+ZGV2aWNlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvMzogZW5hYmxlZCBoYWNrIGZvciAnJXMnXG4iLCBxdWlyay0+bmFtZSk7CisJCQljaGlwLT5xdWlyayA9IHF1aXJrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljaGlwLT5leHRlcm5hbF9hbXAgPSBlbmFibGVfYW1wOworCWlmIChhbXBfZ3BpbyA+PSAwICYmIGFtcF9ncGlvIDw9IDB4MGYpCisJCWNoaXAtPmFtcF9ncGlvID0gYW1wX2dwaW87CisJZWxzZSBpZiAoY2hpcC0+cXVpcmsgJiYgY2hpcC0+cXVpcmstPmFtcF9ncGlvID49IDApCisJCWNoaXAtPmFtcF9ncGlvID0gY2hpcC0+cXVpcmstPmFtcF9ncGlvOworCWVsc2UgaWYgKGNoaXAtPmFsbGVncm9fZmxhZykKKwkJY2hpcC0+YW1wX2dwaW8gPSBHUE9fRVhUX0FNUF9BTExFR1JPOworCWVsc2UgLyogcHJlc3VtYWJseSB0aGlzIGlzIGZvciBhbGwgJ21hZXN0cm8zJ3MuLiAqLworCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX00zOworCisJY2hpcC0+bnVtX3N1YnN0cmVhbXMgPSBOUl9EU1BTOworCWNoaXAtPnN1YnN0cmVhbXMgPSBrbWFsbG9jKHNpemVvZihtM19kbWFfdCkgKiBjaGlwLT5udW1fc3Vic3RyZWFtcywgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAtPnN1YnN0cmVhbXMgPT0gTlVMTCkgeworCQlrZnJlZShjaGlwKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2hpcC0+c3Vic3RyZWFtcywgMCwgc2l6ZW9mKG0zX2RtYV90KSAqIGNoaXAtPm51bV9zdWJzdHJlYW1zKTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIGNhcmQtPmRyaXZlcikpIDwgMCkgeworCQlzbmRfbTNfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJCisJLyoganVzdCB0byBiZSBzdXJlICovCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCXNuZF9tM19jaGlwX2luaXQoY2hpcCk7CisJc25kX20zX2Fzc3BfaGFsdChjaGlwKTsKKworCXNuZF9tM19hYzk3X3Jlc2V0KGNoaXApOworCisJc25kX20zX2Fzc3BfaW5pdChjaGlwKTsKKwlzbmRfbTNfYW1wX2VuYWJsZShjaGlwLCAxKTsKKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX20zX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJY2FyZC0+ZHJpdmVyLCAodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfbTNfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworCisjaWZkZWYgQ09ORklHX1BNCisJY2hpcC0+c3VzcGVuZF9tZW0gPSB2bWFsbG9jKHNpemVvZih1MTYpICogKFJFVl9CX0NPREVfTUVNT1JZX0xFTkdUSCArIFJFVl9CX0RBVEFfTUVNT1JZX0xFTkdUSCkpOworCWlmIChjaGlwLT5zdXNwZW5kX21lbSA9PSBOVUxMKQorCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CisJZWxzZQorCQlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2FyZCwgbTNfc3VzcGVuZCwgbTNfcmVzdW1lLCBjaGlwKTsKKyNlbmRpZgorCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX20zX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfbTNfbWl4ZXIoY2hpcCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3Vic3RyZWFtczsgaSsrKSB7CisJCW0zX2RtYV90ICpzID0gJmNoaXAtPnN1YnN0cmVhbXNbaV07CisJCXMtPmNoaXAgPSBjaGlwOworCQlpZiAoKGVyciA9IHNuZF9tM19hc3NwX2NsaWVudF9pbml0KGNoaXAsIHMsIGkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX20zX3BjbShjaGlwLCAwKSkgPCAwKQorCQlyZXR1cm4gZXJyOworICAgIAorCXNuZF9tM19lbmFibGVfaW50cyhjaGlwKTsKKwlzbmRfbTNfYXNzcF9jb250aW51ZShjaGlwKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpjaGlwX3JldCA9IGNoaXA7CisKKwlyZXR1cm4gMDsgCit9CisKKy8qCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitzbmRfbTNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCW0zX3QgKmNoaXA7CisJaW50IGVycjsKKworCS8qIGRvbid0IHBpY2sgdXAgbW9kZW1zICovCisJaWYgKCgocGNpLT5jbGFzcyA+PiA4KSAmIDB4ZmZmZikgIT0gUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0VTU19BTExFR1JPOgorCWNhc2UgUENJX0RFVklDRV9JRF9FU1NfQUxMRUdST18xOgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQWxsZWdybyIpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRVNTX0NBTllPTjNEXzJMRToKKwljYXNlIFBDSV9ERVZJQ0VfSURfRVNTX0NBTllPTjNEXzI6CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJDYW55b24zRC0yIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJNYWVzdHJvMyIpOworCQlicmVhazsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9tM19jcmVhdGUoY2FyZCwgcGNpLAorCQkJCSBleHRlcm5hbF9hbXBbZGV2XSwKKwkJCQkgYW1wX2dwaW9bZGV2XSwKKwkJCQkgJmNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIkVTUyAlcyBQQ0kiLCBjYXJkLT5kcml2ZXIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkIiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5pb2Jhc2UsIGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKyNpZiAwIC8qIFRPRE86IG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJLyogVE9ETyBlbmFibGUgbWlkaSBpcnEgYW5kIGkvbyAqLworCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKKwkJCQkgIGNoaXAtPmlvYmFzZSArIE1QVTQwMV9EQVRBX1BPUlQsIDEsCisJCQkJICBjaGlwLT5pcnEsIDAsICZjaGlwLT5ybWlkaSk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBtaWRpIHN1cHBvcnQuXG4iKTsKKyNlbmRpZgorCisJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CisJZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfbTNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiTWFlc3RybzMiLAorCS5pZF90YWJsZSA9IHNuZF9tM19pZHMsCisJLnByb2JlID0gc25kX20zX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfbTNfcmVtb3ZlKSwKKwlTTkRfUENJX1BNX0NBTExCQUNLUworfTsKKwkKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9tM19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9tM19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfbTNfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9tM19leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9NYWtlZmlsZSBiL3NvdW5kL3BjaS9taXhhcnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2YmEwYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciBBTFNBCisjIENvcHlyaWdodCAoYykgMjAwMSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisjCisKK3NuZC1taXhhcnQtb2JqcyA6PSBtaXhhcnQubyBtaXhhcnRfY29yZS5vIG1peGFydF9od2RlcC5vIG1peGFydF9taXhlci5vCisKK29iai0kKENPTkZJR19TTkRfTUlYQVJUKSArPSBzbmQtbWl4YXJ0Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmIwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC0wLDAgKzEsMTQ0MyBAQAorLyoKKyAqIERyaXZlciBmb3IgRGlnaWdyYW0gbWlYYXJ0IHNvdW5kY2FyZHMKKyAqCisgKiBtYWluIGZpbGUgd2l0aCBhbHNhIGNhbGxiYWNrcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBieSBEaWdpZ3JhbSA8YWxzYUBkaWdpZ3JhbS5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSAibWl4YXJ0LmgiCisjaW5jbHVkZSAibWl4YXJ0X2h3ZGVwLmgiCisjaW5jbHVkZSAibWl4YXJ0X2NvcmUuaCIKKyNpbmNsdWRlICJtaXhhcnRfbWl4ZXIuaCIKKworI2RlZmluZSBDQVJEX05BTUUgIm1pWGFydCIKKworTU9EVUxFX0FVVEhPUigiRGlnaWdyYW0gPGFsc2FAZGlnaWdyYW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEaWdpZ3JhbSAiIENBUkRfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tEaWdpZ3JhbSwiIENBUkRfTkFNRSAifX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsgICAgICAgICAgICAgLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsgICAgICAgICAgICAgIC8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsgICAgIC8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBEaWdpZ3JhbSAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgRGlnaWdyYW0gIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIERpZ2lncmFtICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworCisvKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfbWl4YXJ0X2lkc1tdID0geworCXsgMHgxMDU3LCAweDAwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sIC8qIE1DODI0MCAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9taXhhcnRfaWRzKTsKKworCitzdGF0aWMgaW50IG1peGFydF9zZXRfcGlwZV9zdGF0ZShtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X3BpcGVfdCogcGlwZSwgaW50IHN0YXJ0KQoreworCW1peGFydF9ncm91cF9zdGF0ZV9yZXFfdCBncm91cF9zdGF0ZTsKKwltaXhhcnRfZ3JvdXBfc3RhdGVfcmVzcF90IGdyb3VwX3N0YXRlX3Jlc3A7CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisJaW50IGVycjsKKwl1MzIgc3lzdGVtX21zZ191aWQ7CisKKwlzd2l0Y2gocGlwZS0+c3RhdHVzKSB7CisJY2FzZSBQSVBFX1JVTk5JTkc6CisJY2FzZSBQSVBFX0NMT0NLX1NFVDoKKwkJaWYoc3RhcnQpIHJldHVybiAwOyAvKiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJYnJlYWs7CisJY2FzZSBQSVBFX1NUT1BQRUQ6CisJCWlmKCFzdGFydCkgcmV0dXJuIDA7IC8qIGFscmVhZHkgc3RvcHBlZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X3BpcGVfc3RhdGUgY2FsbGVkIHdpdGggd3JvbmcgcGlwZS0+c3RhdHVzIVxuIik7CisJCXJldHVybiAtRUlOVkFMOyAgICAgIC8qIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHdyb25nIHBpcGUgc3RhdHVzICovCisJfQorCisJc3lzdGVtX21zZ191aWQgPSAweDEyMzQ1Njc4OyAvKiB0aGUgZXZlbnQgISAodGFrZSBjYXJlOiB0aGUgTVNCIGFuZCB0d28gTFNCJ3MgaGF2ZSB0byBiZSAwKSAqLworCisJLyogd2FpdCBvbiB0aGUgbGFzdCBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgY29tbWFuZCB0byBiZSByZWFsbHkgZmluaXNoZWQgKi8KKworCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TWVNURU1fV0FJVF9TWU5DSFJPX0NNRDsKKwlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJcmVxdWVzdC5kYXRhID0gJnN5c3RlbV9tc2dfdWlkOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihzeXN0ZW1fbXNnX3VpZCk7CisKKwllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnX3dhaXRfbm90aWYobWdyLCAmcmVxdWVzdCwgc3lzdGVtX21zZ191aWQpOworCWlmKGVycikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciA6IE1TR19TWVNURU1fV0FJVF9TWU5DSFJPX0NNRCB3YXMgbm90IG5vdGlmaWVkICFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIHN0YXJ0IG9yIHN0b3AgdGhlIHBpcGUgKDEgcGlwZSkgKi8KKworCW1lbXNldCgmZ3JvdXBfc3RhdGUsIDAsIHNpemVvZihncm91cF9zdGF0ZSkpOworCWdyb3VwX3N0YXRlLnBpcGVfY291bnQgPSAxOworCWdyb3VwX3N0YXRlLnBpcGVfdWlkWzBdID0gcGlwZS0+Z3JvdXBfdWlkOworCisJaWYoc3RhcnQpCisJCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TVFJFQU1fU1RBUlRfU1RSRUFNX0dSUF9QQUNLRVQ7CisJZWxzZQorCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX1NUT1BfU1RSRUFNX0dSUF9QQUNLRVQ7CisKKwlyZXF1ZXN0LnVpZCA9IHBpcGUtPmdyb3VwX3VpZDsgLyoobWl4YXJ0X3VpZF90KXswLDB9OyovCisJcmVxdWVzdC5kYXRhID0gJmdyb3VwX3N0YXRlOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihncm91cF9zdGF0ZSk7CisKKwllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihncm91cF9zdGF0ZV9yZXNwKSwgJmdyb3VwX3N0YXRlX3Jlc3ApOworCWlmIChlcnIgPCAwIHx8IGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyAhPSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fU1QqKipfU1RSRUFNX0dSUF9QQUNLRVQgZXJyPSV4IHN0YXQ9JXggIVxuIiwgZXJyLCBncm91cF9zdGF0ZV9yZXNwLnR4eF9zdGF0dXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihzdGFydCkgeworCQl1MzIgc3RhdDsKKworCQlncm91cF9zdGF0ZS5waXBlX2NvdW50ID0gMDsgLyogaW4gY2FzZSBvZiBzdGFydCBzYW1lIGNvbW1hbmQgb25jZSBhZ2FpbiB3aXRoIHBpcGVfY291bnQ9MCAqLworCisJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CisJCWlmIChlcnIgPCAwIHx8IGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyAhPSAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1RSRUFNX1NUQVJUX1NUUkVBTV9HUlBfUEFDS0VUIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzKTsKKyAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIGluIGNhc2Ugb2Ygc3RhcnQgc2VuZCBhIHN5bmNocm8gdG9wICovCisKKwkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX1NZU1RFTV9TRU5EX1NZTkNIUk9fQ01EOworCQlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJCXJlcXVlc3QuZGF0YSA9IE5VTEw7CisJCXJlcXVlc3Quc2l6ZSA9IDA7CisKKwkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdCksICZzdGF0KTsKKwkJaWYgKGVyciA8IDAgfHwgc3RhdCAhPSAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgZXJyPSV4IHN0YXQ9JXggIVxuIiwgZXJyLCBzdGF0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcGlwZS0+c3RhdHVzID0gUElQRV9SVU5OSU5HOworCX0KKwllbHNlIC8qICFzdGFydCAqLworCQlwaXBlLT5zdGF0dXMgPSBQSVBFX1NUT1BQRUQ7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1peGFydF9zZXRfY2xvY2sobWl4YXJ0X21ncl90ICptZ3IsIG1peGFydF9waXBlX3QgKnBpcGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCW1peGFydF9tc2dfdCByZXF1ZXN0OworCW1peGFydF9jbG9ja19wcm9wZXJ0aWVzX3QgY2xvY2tfcHJvcGVydGllczsKKwltaXhhcnRfY2xvY2tfcHJvcGVydGllc19yZXNwX3QgY2xvY2tfcHJvcF9yZXNwOworCWludCBlcnI7CisKKwlzd2l0Y2gocGlwZS0+c3RhdHVzKSB7CisJY2FzZSBQSVBFX0NMT0NLX1NFVDoKKwkJYnJlYWs7CisJY2FzZSBQSVBFX1JVTk5JTkc6CisJCWlmKHJhdGUgIT0gMCkKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmKHJhdGUgPT0gMCkKKwkJCXJldHVybiAwOyAvKiBub3RoaW5nIHRvIGRvICovCisJCWVsc2UgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgbWl4YXJ0X3NldF9jbG9jayglZCkgY2FsbGVkIHdpdGggd3JvbmcgcGlwZS0+c3RhdHVzICFcbiIsIHJhdGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwltZW1zZXQoJmNsb2NrX3Byb3BlcnRpZXMsIDAsIHNpemVvZihjbG9ja19wcm9wZXJ0aWVzKSk7CisJY2xvY2tfcHJvcGVydGllcy5jbG9ja19nZW5lcmljX3R5cGUgPSAocmF0ZSAhPSAwKSA/IENHVF9JTlRFUk5BTF9DTE9DSyA6IENHVF9OT19DTE9DSzsKKwljbG9ja19wcm9wZXJ0aWVzLmNsb2NrX21vZGUgPSBDTV9TVEFOREFMT05FOworCWNsb2NrX3Byb3BlcnRpZXMuZnJlcXVlbmN5ID0gcmF0ZTsKKwljbG9ja19wcm9wZXJ0aWVzLm5iX2NhbGxlcnMgPSAxOyAvKiBvbmx5IG9uZSBlbnRyeSBpbiB1aWRfY2FsbGVyICEgKi8KKwljbG9ja19wcm9wZXJ0aWVzLnVpZF9jYWxsZXJbMF0gPSBwaXBlLT5ncm91cF91aWQ7CisKKwlzbmRfcHJpbnRkZCgibWl4YXJ0X3NldF9jbG9jayB0byAlZCBrSHpcbiIsIHJhdGUpOworCisJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NMT0NLX1NFVF9QUk9QRVJUSUVTOworCXJlcXVlc3QudWlkID0gbWdyLT51aWRfY29uc29sZV9tYW5hZ2VyOworCXJlcXVlc3QuZGF0YSA9ICZjbG9ja19wcm9wZXJ0aWVzOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihjbG9ja19wcm9wZXJ0aWVzKTsKKworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGNsb2NrX3Byb3BfcmVzcCksICZjbG9ja19wcm9wX3Jlc3ApOworCWlmIChlcnIgPCAwIHx8IGNsb2NrX3Byb3BfcmVzcC5zdGF0dXMgIT0gMCB8fCBjbG9ja19wcm9wX3Jlc3AuY2xvY2tfbW9kZSAhPSBDTV9TVEFOREFMT05FKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19DTE9DS19TRVRfUFJPUEVSVElFUyBlcnI9JXggc3RhdD0leCBtb2Q9JXggIVxuIiwgZXJyLCBjbG9ja19wcm9wX3Jlc3Auc3RhdHVzLCBjbG9ja19wcm9wX3Jlc3AuY2xvY2tfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKHJhdGUpICBwaXBlLT5zdGF0dXMgPSBQSVBFX0NMT0NLX1NFVDsKKwllbHNlICAgICAgcGlwZS0+c3RhdHVzID0gUElQRV9SVU5OSU5HOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBBbGxvY2F0ZSBvciByZWZlcmVuY2Ugb3V0cHV0IHBpcGUgZm9yIGFuYWxvZyBJT3MgKHBjbXAwLzEpCisgKi8KK21peGFydF9waXBlX3QqIHNuZF9taXhhcnRfYWRkX3JlZl9waXBlKCBtaXhhcnRfdCAqY2hpcCwgaW50IHBjbV9udW1iZXIsIGludCBjYXB0dXJlLCBpbnQgbW9uaXRvcmluZykKK3sKKwlpbnQgc3RyZWFtX2NvdW50OworCW1peGFydF9waXBlX3QgKnBpcGU7CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisKKwlpZihjYXB0dXJlKSB7CisJCWlmIChwY21fbnVtYmVyID09IE1JWEFSVF9QQ01fQU5BTE9HKSB7CisJCQlwaXBlID0gJihjaGlwLT5waXBlX2luX2FuYSk7ICAvKiBhbmFsb2cgaW5wdXRzICovCisJCX0gZWxzZSB7CisJCQlwaXBlID0gJihjaGlwLT5waXBlX2luX2RpZyk7IC8qIGRpZ2l0YWwgaW5wdXRzICovCisJCX0KKwkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX1NUUkVBTV9BRERfT1VUUFVUX0dST1VQOworCQlzdHJlYW1fY291bnQgPSBNSVhBUlRfQ0FQVFVSRV9TVFJFQU1TOworCX0gZWxzZSB7CisJCWlmIChwY21fbnVtYmVyID09IE1JWEFSVF9QQ01fQU5BTE9HKSB7CisJCQlwaXBlID0gJihjaGlwLT5waXBlX291dF9hbmEpOyAgLyogYW5hbG9nIG91dHB1dHMgKi8KKwkJfSBlbHNlIHsKKwkJCXBpcGUgPSAmKGNoaXAtPnBpcGVfb3V0X2RpZyk7ICAvKiBkaWdpdGFsIG91dHB1dHMgKi8KKwkJfQorCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX0FERF9JTlBVVF9HUk9VUDsKKwkJc3RyZWFtX2NvdW50ID0gTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVM7CisJfQorCisJLyogYSBuZXcgc3RyZWFtIGlzIG9wZW5lZCBhbmQgdGhlcmUgYXJlIGFscmVhZHkgYWxsIHN0cmVhbXMgaW4gdXNlICovCisJaWYoIChtb25pdG9yaW5nID09IDApICYmIChwaXBlLT5yZWZlcmVuY2VzID49IHN0cmVhbV9jb3VudCkgKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHBpcGUgaXMgbm90IHlldCBkZWZpbmVkICovCisJaWYoIHBpcGUtPnN0YXR1cyA9PSBQSVBFX1VOREVGSU5FRCApIHsKKwkJaW50IGVyciwgaTsKKwkJc3RydWN0IHsKKwkJCW1peGFydF9zdHJlYW1pbmdfZ3JvdXBfcmVxX3Qgc2dyb3VwX3JlcTsKKwkJCW1peGFydF9zdHJlYW1pbmdfZ3JvdXBfdCBzZ3JvdXBfcmVzcDsKKwkJfSAqYnVmOworCisJCXNuZF9wcmludGRkKCJhZGRfcmVmX3BpcGUgYXVkaW8gY2hpcCglZCkgcGNtKCVkKVxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIpOworCisJCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpidWYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gTlVMTDsKKworCQlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07ICAgICAgLyogc2hvdWxkIGJlIFN0cmVhbU1hbmFnZXJVSUQsIGJ1dCB6ZXJvIGlzIE9LIGlmIHRoZXJlIGlzIG9ubHkgb25lICEgKi8KKwkJcmVxdWVzdC5kYXRhID0gJmJ1Zi0+c2dyb3VwX3JlcTsKKwkJcmVxdWVzdC5zaXplID0gc2l6ZW9mKGJ1Zi0+c2dyb3VwX3JlcSk7CisKKwkJbWVtc2V0KCZidWYtPnNncm91cF9yZXEsIDAsIHNpemVvZihidWYtPnNncm91cF9yZXEpKTsKKworCQlidWYtPnNncm91cF9yZXEuc3RyZWFtX2NvdW50ID0gc3RyZWFtX2NvdW50OworCQlidWYtPnNncm91cF9yZXEuY2hhbm5lbF9jb3VudCA9IDI7CisJCWJ1Zi0+c2dyb3VwX3JlcS5sYXRlbmN5ID0gMjU2OworCQlidWYtPnNncm91cF9yZXEuY29ubmVjdG9yID0gcGlwZS0+dWlkX2xlZnRfY29ubmVjdG9yOyAgLyogdGhlIGxlZnQgY29ubmVjdG9yICovCisKKwkJZm9yIChpPTA7IGk8c3RyZWFtX2NvdW50OyBpKyspIHsKKwkJCWludCBqOworCQkJc3RydWN0IG1peGFydF9mbG93aW5mbyAqZmxvd2luZm87CisJCQlzdHJ1Y3QgbWl4YXJ0X2J1ZmZlcmluZm8gKmJ1ZmZlcmluZm87CisJCQkKKwkJCS8qIHdlIGRvbid0IHlldCBrbm93IHRoZSBmb3JtYXQsIHNvIGNvbmZpZyAxNiBiaXQgcGNtIGF1ZGlvIGZvciBpbnN0YW5jZSAqLworCQkJYnVmLT5zZ3JvdXBfcmVxLnN0cmVhbV9pbmZvW2ldLnNpemVfbWF4X2J5dGVfZnJhbWUgPSAxMDI0OworCQkJYnVmLT5zZ3JvdXBfcmVxLnN0cmVhbV9pbmZvW2ldLnNpemVfbWF4X3NhbXBsZV9mcmFtZSA9IDI1NjsKKwkJCWJ1Zi0+c2dyb3VwX3JlcS5zdHJlYW1faW5mb1tpXS5uYl9ieXRlc19tYXhfcGVyX3NhbXBsZSA9IE1JWEFSVF9GTE9BVF9QX180XzBfVE9fSEVYOyAvKiBpcyA0LjBmICovCisKKwkJCS8qIGZpbmQgdGhlIHJpZ2h0IGJ1ZmZlcmluZm9fYXJyYXkgKi8KKwkJCWogPSAoY2hpcC0+Y2hpcF9pZHggKiBNSVhBUlRfTUFYX1NUUkVBTV9QRVJfQ0FSRCkgKyAocGNtX251bWJlciAqIChNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUyArIE1JWEFSVF9DQVBUVVJFX1NUUkVBTVMpKSArIGk7CisJCQlpZihjYXB0dXJlKSBqICs9IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TOyAvKiBpbiB0aGUgYXJyYXkgY2FwdHVyZSBpcyBiZWhpbmQgcGxheWJhY2sgKi8KKworCQkJYnVmLT5zZ3JvdXBfcmVxLmZsb3dfZW50cnlbaV0gPSBqOworCisJCQlmbG93aW5mbyA9IChzdHJ1Y3QgbWl4YXJ0X2Zsb3dpbmZvICopY2hpcC0+bWdyLT5mbG93aW5mby5hcmVhOworCQkJZmxvd2luZm9bal0uYnVmZmVyaW5mb19hcnJheV9waHlfYWRkcmVzcyA9ICh1MzIpY2hpcC0+bWdyLT5idWZmZXJpbmZvLmFkZHIgKyAoaiAqIHNpemVvZihtaXhhcnRfYnVmZmVyaW5mb190KSk7CisJCQlmbG93aW5mb1tqXS5idWZmZXJpbmZvX2NvdW50ID0gMTsgICAgICAgICAgICAgICAvKiAxIHdpbGwgc2V0IHRoZSBtaVhhcnQgdG8gcmluZy1idWZmZXIgbW9kZSAhICovCisKKwkJCWJ1ZmZlcmluZm8gPSAoc3RydWN0IG1peGFydF9idWZmZXJpbmZvICopY2hpcC0+bWdyLT5idWZmZXJpbmZvLmFyZWE7CisJCQlidWZmZXJpbmZvW2pdLmJ1ZmZlcl9hZGRyZXNzID0gMDsgICAgICAgICAgICAgICAvKiBidWZmZXIgaXMgbm90IHlldCBhbGxvY2F0ZWQgKi8KKwkJCWJ1ZmZlcmluZm9bal0uYXZhaWxhYmxlX2xlbmd0aCA9IDA7ICAgICAgICAgICAgIC8qIGJ1ZmZlciBpcyBub3QgeWV0IGFsbG9jYXRlZCAqLworCisJCQkvKiBjb25zdHJ1Y3QgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0cmVhbSBidWZmZXIgcmVjZWl2ZWQgaW4gdGhlIGludGVycnVwdHMgISAqLworCQkJYnVmZmVyaW5mb1tqXS5idWZmZXJfaWQgPSAoY2hpcC0+Y2hpcF9pZHggPDwgTUlYQVJUX05PVElGWV9DQVJEX09GRlNFVCkgKyAocGNtX251bWJlciA8PCBNSVhBUlRfTk9USUZZX1BDTV9PRkZTRVQgKSArIGk7CisJCQlpZihjYXB0dXJlKSB7CisJCQkJYnVmZmVyaW5mb1tqXS5idWZmZXJfaWQgfD0gTUlYQVJUX05PVElGWV9DQVBUX01BU0s7CisJCQl9CisJCX0KKworCQllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihidWYtPnNncm91cF9yZXNwKSwgJmJ1Zi0+c2dyb3VwX3Jlc3ApOworCQlpZigoZXJyIDwgMCkgfHwgKGJ1Zi0+c2dyb3VwX3Jlc3Auc3RhdHVzICE9IDApKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1RSRUFNX0FERF8qKlBVVF9HUk9VUCBlcnI9JXggc3RhdD0leCAhXG4iLCBlcnIsIGJ1Zi0+c2dyb3VwX3Jlc3Auc3RhdHVzKTsKKwkJCWtmcmVlKGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXBpcGUtPmdyb3VwX3VpZCA9IGJ1Zi0+c2dyb3VwX3Jlc3AuZ3JvdXA7ICAgICAvKiBpZCBvZiB0aGUgcGlwZSwgYXMgcmV0dXJuZWQgYnkgZW1iZWRkZWQgKi8KKwkJcGlwZS0+c3RyZWFtX2NvdW50ID0gYnVmLT5zZ3JvdXBfcmVzcC5zdHJlYW1fY291bnQ7CisJCS8qIHBpcGUtPnN0cmVhbV91aWRbaV0gPSBidWYtPnNncm91cF9yZXNwLnN0cmVhbVtpXS5zdHJlYW1fdWlkOyAqLworCisJCXBpcGUtPnN0YXR1cyA9IFBJUEVfU1RPUFBFRDsKKwkJa2ZyZWUoYnVmKTsKKwl9CisKKwlpZihtb25pdG9yaW5nKQlwaXBlLT5tb25pdG9yaW5nID0gMTsKKwllbHNlCQlwaXBlLT5yZWZlcmVuY2VzKys7CisKKwlyZXR1cm4gcGlwZTsKK30KKworCitpbnQgc25kX21peGFydF9raWxsX3JlZl9waXBlKCBtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X3BpcGVfdCAqcGlwZSwgaW50IG1vbml0b3JpbmcpCit7CisJaW50IGVyciA9IDA7CisKKwlpZihwaXBlLT5zdGF0dXMgPT0gUElQRV9VTkRFRklORUQpCisJCXJldHVybiAwOworCisJaWYobW9uaXRvcmluZykKKwkJcGlwZS0+bW9uaXRvcmluZyA9IDA7CisJZWxzZQorCQlwaXBlLT5yZWZlcmVuY2VzLS07CisKKwlpZigocGlwZS0+cmVmZXJlbmNlcyA8PSAwKSAmJiAocGlwZS0+bW9uaXRvcmluZyA9PSAwKSkgeworCisJCW1peGFydF9tc2dfdCByZXF1ZXN0OworCQltaXhhcnRfZGVsZXRlX2dyb3VwX3Jlc3BfdCBkZWxldGVfcmVzcDsKKworCQkvKiByZWxlYXNlIHRoZSBjbG9jayAqLworCQllcnIgPSBtaXhhcnRfc2V0X2Nsb2NrKCBtZ3IsIHBpcGUsIDApOworCQlpZiggZXJyIDwgMCApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGFydF9zZXRfY2xvY2soMCkgcmV0dXJuIGVycm9yIVxuIik7CisJCX0KKworCQkvKiBzdG9wIHRoZSBwaXBlICovCisJCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBpcGUsIDApOworCQlpZiggZXJyIDwgMCApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0b3BwaW5nIHBpcGUhXG4iKTsKKwkJfQorCisJCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TVFJFQU1fREVMRVRFX0dST1VQOworCQlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJCXJlcXVlc3QuZGF0YSA9ICZwaXBlLT5ncm91cF91aWQ7ICAgICAgICAgICAgLyogdGhlIHN0cmVhbWluZyBncm91cCAhICovCisJCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihwaXBlLT5ncm91cF91aWQpOworCisJCS8qIGRlbGV0ZSB0aGUgcGlwZSAqLworCQllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihkZWxldGVfcmVzcCksICZkZWxldGVfcmVzcCk7CisJCWlmICgoZXJyIDwgMCkgfHwgKGRlbGV0ZV9yZXNwLnN0YXR1cyAhPSAwKSkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NUUkVBTV9ERUxFVEVfR1JPVVAgZXJyKCV4KSwgc3RhdHVzKCV4KVxuIiwgZXJyLCBkZWxldGVfcmVzcC5zdGF0dXMpOworCQl9CisKKwkJcGlwZS0+Z3JvdXBfdWlkID0gKG1peGFydF91aWRfdCl7MCwwfTsKKwkJcGlwZS0+c3RyZWFtX2NvdW50ID0gMDsKKwkJcGlwZS0+c3RhdHVzID0gUElQRV9VTkRFRklORUQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtaXhhcnRfc2V0X3N0cmVhbV9zdGF0ZShtaXhhcnRfc3RyZWFtX3QgKnN0cmVhbSwgaW50IHN0YXJ0KQoreworCW1peGFydF90ICpjaGlwOworCW1peGFydF9zdHJlYW1fc3RhdGVfcmVxX3Qgc3RyZWFtX3N0YXRlX3JlcTsKKwltaXhhcnRfbXNnX3QgcmVxdWVzdDsKKworCWlmKCFzdHJlYW0tPnN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJnN0cmVhbV9zdGF0ZV9yZXEsIDAsIHNpemVvZihzdHJlYW1fc3RhdGVfcmVxKSk7CisJc3RyZWFtX3N0YXRlX3JlcS5zdHJlYW1fY291bnQgPSAxOworCXN0cmVhbV9zdGF0ZV9yZXEuc3RyZWFtX2luZm8uc3RyZWFtX2Rlc2MudWlkX3BpcGUgPSBzdHJlYW0tPnBpcGUtPmdyb3VwX3VpZDsKKwlzdHJlYW1fc3RhdGVfcmVxLnN0cmVhbV9pbmZvLnN0cmVhbV9kZXNjLnN0cmVhbV9pZHggPSBzdHJlYW0tPnN1YnN0cmVhbS0+bnVtYmVyOworCisJaWYgKHN0cmVhbS0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmVxdWVzdC5tZXNzYWdlX2lkID0gc3RhcnQgPyBNU0dfU1RSRUFNX1NUQVJUX0lOUFVUX1NUQUdFX1BBQ0tFVCA6IE1TR19TVFJFQU1fU1RPUF9JTlBVVF9TVEFHRV9QQUNLRVQ7CisJZWxzZQorCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBzdGFydCA/IE1TR19TVFJFQU1fU1RBUlRfT1VUUFVUX1NUQUdFX1BBQ0tFVCA6IE1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUOworCisJcmVxdWVzdC51aWQgPSAobWl4YXJ0X3VpZF90KXswLDB9OworCXJlcXVlc3QuZGF0YSA9ICZzdHJlYW1fc3RhdGVfcmVxOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihzdHJlYW1fc3RhdGVfcmVxKTsKKworCXN0cmVhbS0+YWJzX3BlcmlvZF9lbGFwc2VkID0gMDsgICAgICAgICAgICAvKiByZXNldCBzdHJlYW0gcG9zICAgICAgKi8KKwlzdHJlYW0tPmJ1Zl9wZXJpb2RzID0gMDsKKwlzdHJlYW0tPmJ1Zl9wZXJpb2RfZnJhZyA9IDA7CisKKwljaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdHJlYW0tPnN1YnN0cmVhbSk7CisKKwlyZXR1cm4gc25kX21peGFydF9zZW5kX21zZ19ub25ibG9jayhjaGlwLT5tZ3IsICZyZXF1ZXN0KTsKK30KKworLyoKKyAqICBUcmlnZ2VyIGNhbGxiYWNrCisgKi8KKworc3RhdGljIGludCBzbmRfbWl4YXJ0X3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicywgaW50IGNtZCkKK3sKKwltaXhhcnRfc3RyZWFtX3QgKnN0cmVhbSA9IChtaXhhcnRfc3RyZWFtX3QqKXN1YnMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKworCQlzbmRfcHJpbnRkZCgiU05EUlZfUENNX1RSSUdHRVJfU1RBUlRcbiIpOworCisJCS8qIFNUQVJUX1NUUkVBTSAqLworCQlpZiggbWl4YXJ0X3NldF9zdHJlYW1fc3RhdGUoc3RyZWFtLCAxKSApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzdHJlYW0tPnN0YXR1cyA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7CisKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCisJCS8qIFNUT1BfU1RSRUFNICovCisJCWlmKCBtaXhhcnRfc2V0X3N0cmVhbV9zdGF0ZShzdHJlYW0sIDApICkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0cmVhbS0+c3RhdHVzID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfT1BFTjsKKworCQlzbmRfcHJpbnRkZCgiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCS8qIFRPRE8gKi8KKwkJc3RyZWFtLT5zdGF0dXMgPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19QQVVTRTsKKwkJc25kX3ByaW50ZGQoIlNORFJWX1BDTV9QQVVTRV9QVVNIXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQkvKiBUT0RPICovCisJCXN0cmVhbS0+c3RhdHVzID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfUlVOTklORzsKKwkJc25kX3ByaW50ZGQoIlNORFJWX1BDTV9QQVVTRV9SRUxFQVNFXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGFydF9zeW5jX25vbmJsb2NrX2V2ZW50cyhtaXhhcnRfbWdyX3QgKm1ncikKK3sKKwlpbnQgdGltZW91dCA9IEhaOworCXdoaWxlIChhdG9taWNfcmVhZCgmbWdyLT5tc2dfcHJvY2Vzc2VkKSA+IDApIHsKKwkJaWYgKCEgdGltZW91dC0tKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaXhhcnQ6IGNhbm5vdCBwcm9jZXNzIG5vbmJsb2NrIGV2ZW50cyFcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIHByZXBhcmUgY2FsbGJhY2sgZm9yIGFsbCBwY21zCisgKi8KK3N0YXRpYyBpbnQgc25kX21peGFydF9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnMpOworCW1peGFydF9zdHJlYW1fdCAqc3RyZWFtID0gKG1peGFydF9zdHJlYW1fdCopc3Vicy0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJLyogVE9ETyBkZSBmYedvbiBub24gYmxvcXVhbnRlLCBy6WFwcGxpcXVlciBsZXMgaHdfcGFyYW1zIChyYXRlLCBiaXRzLCBjb2RlYykgKi8KKworCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X3ByZXBhcmVcbiIpOworCisJbWl4YXJ0X3N5bmNfbm9uYmxvY2tfZXZlbnRzKGNoaXAtPm1ncik7CisKKwkvKiBvbmx5IHRoZSBmaXJzdCBzdHJlYW0gY2FuIGNob29zZSB0aGUgc2FtcGxlIHJhdGUgKi8KKwkvKiB0aGUgZnVydGhlciBvcGVuZWQgc3RyZWFtcyB3aWxsIGJlIGxpbWl0ZWQgdG8gaXRzIGZyZXF1ZW5jeSAoc2VlIG9wZW4pICovCisJaWYoY2hpcC0+bWdyLT5yZWZfY291bnRfcmF0ZSA9PSAxKQorCQljaGlwLT5tZ3ItPnNhbXBsZV9yYXRlID0gc3Vicy0+cnVudGltZS0+cmF0ZTsKKworCS8qIHNldCB0aGUgY2xvY2sgb25seSBvbmNlIChmaXJzdCBzdHJlYW0pIG9uIHRoZSBzYW1lIHBpcGUgKi8KKwlpZihzdHJlYW0tPnBpcGUtPnJlZmVyZW5jZXMgPT0gMSkgeworCQlpZiggbWl4YXJ0X3NldF9jbG9jayhjaGlwLT5tZ3IsIHN0cmVhbS0+cGlwZSwgc3Vicy0+cnVudGltZS0+cmF0ZSkgKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtaXhhcnRfc2V0X2Zvcm1hdChtaXhhcnRfc3RyZWFtX3QgKnN0cmVhbSwgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpCit7CisJaW50IGVycjsKKwltaXhhcnRfdCAqY2hpcDsKKwltaXhhcnRfbXNnX3QgcmVxdWVzdDsKKwltaXhhcnRfc3RyZWFtX3BhcmFtX2Rlc2NfdCBzdHJlYW1fcGFyYW07CisJbWl4YXJ0X3JldHVybl91aWRfdCByZXNwOworCisJY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3RyZWFtLT5zdWJzdHJlYW0pOworCisJbWVtc2V0KCZzdHJlYW1fcGFyYW0sIDAsIHNpemVvZihzdHJlYW1fcGFyYW0pKTsKKworCXN0cmVhbV9wYXJhbS5jb2RpbmdfdHlwZSA9IENUX0xJTkVBUjsKKwlzdHJlYW1fcGFyYW0ubnVtYmVyX29mX2NoYW5uZWwgPSBzdHJlYW0tPmNoYW5uZWxzOworCisJc3RyZWFtX3BhcmFtLnNhbXBsaW5nX2ZyZXEgPSBjaGlwLT5tZ3ItPnNhbXBsZV9yYXRlOworCWlmKHN0cmVhbV9wYXJhbS5zYW1wbGluZ19mcmVxID09IDApCisJCXN0cmVhbV9wYXJhbS5zYW1wbGluZ19mcmVxID0gNDQxMDA7IC8qIGlmIGZyZXF1ZW5jeSBub3QgeWV0IGRlZmluZWQsIHVzZSBzb21lIGRlZmF1bHQgKi8KKworCXN3aXRjaChmb3JtYXQpeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKKwkJc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlID0gU1RfSU5URUdFUl84OworCQlzdHJlYW1fcGFyYW0uc2FtcGxlX3NpemUgPSA4OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlzdHJlYW1fcGFyYW0uc2FtcGxlX3R5cGUgPSBTVF9JTlRFR0VSXzE2TEU7CisJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0JFOgorCQlzdHJlYW1fcGFyYW0uc2FtcGxlX3R5cGUgPSBTVF9JTlRFR0VSXzE2QkU7CisJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlID0gU1RfSU5URUdFUl8yNExFOworCQlzdHJlYW1fcGFyYW0uc2FtcGxlX3NpemUgPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zQkU6CisJCXN0cmVhbV9wYXJhbS5zYW1wbGVfdHlwZSA9IFNUX0lOVEVHRVJfMjRCRTsKKwkJc3RyZWFtX3BhcmFtLnNhbXBsZV9zaXplID0gMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9GTE9BVF9MRToKKwkJc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlID0gU1RfRkxPQVRJTkdfUE9JTlRfMzJMRTsKKwkJc3RyZWFtX3BhcmFtLnNhbXBsZV9zaXplID0gMzI7CisJCWJyZWFrOworCWNhc2UgIFNORFJWX1BDTV9GT1JNQVRfRkxPQVRfQkU6CisJCXN0cmVhbV9wYXJhbS5zYW1wbGVfdHlwZSA9IFNUX0ZMT0FUSU5HX1BPSU5UXzMyQkU7CisJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfcHJpbnRkZCgic2V0IFNORFJWX1BDTV9GT1JNQVQgc2FtcGxlX3R5cGUoJWQpIHNhbXBsZV9zaXplKCVkKSBmcmVxKCVkKSBjaGFubmVscyglZClcbiIsCisJCSAgIHN0cmVhbV9wYXJhbS5zYW1wbGVfdHlwZSwgc3RyZWFtX3BhcmFtLnNhbXBsZV9zaXplLCBzdHJlYW1fcGFyYW0uc2FtcGxpbmdfZnJlcSwgc3RyZWFtLT5jaGFubmVscyk7CisKKwkvKiBUT0RPOiB3aGF0IGVsc2UgdG8gY29uZmlndXJlID8gKi8KKwkvKiBzdHJlYW1fcGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgPSAyOyAqLworCS8qIHN0cmVhbV9wYXJhbS5ieXRlc19wZXJfZnJhbWUgPSA0OyAqLworCS8qIHN0cmVhbV9wYXJhbS5ieXRlc19wZXJfc2FtcGxlID0gMjsgKi8KKworCXN0cmVhbV9wYXJhbS5waXBlX2NvdW50ID0gMTsgICAgICAvKiBzZXQgdG8gMSAqLworCXN0cmVhbV9wYXJhbS5zdHJlYW1fY291bnQgPSAxOyAgICAvKiBzZXQgdG8gMSAqLworCXN0cmVhbV9wYXJhbS5zdHJlYW1fZGVzY1swXS51aWRfcGlwZSA9IHN0cmVhbS0+cGlwZS0+Z3JvdXBfdWlkOworCXN0cmVhbV9wYXJhbS5zdHJlYW1fZGVzY1swXS5zdHJlYW1faWR4ID0gc3RyZWFtLT5zdWJzdHJlYW0tPm51bWJlcjsKKworCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNOworCXJlcXVlc3QudWlkID0gKG1peGFydF91aWRfdCl7MCwwfTsKKwlyZXF1ZXN0LmRhdGEgPSAmc3RyZWFtX3BhcmFtOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihzdHJlYW1fcGFyYW0pOworCisJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKKwlpZigoZXJyIDwgMCkgfHwgcmVzcC5lcnJvcl9jb2RlKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIk1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNIGVycj0leDsgcmVzcD0leFxuIiwgZXJyLCByZXNwLmVycm9yX2NvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBIV19QQVJBTVMgY2FsbGJhY2sgZm9yIGFsbCBwY21zCisgKi8KK3N0YXRpYyBpbnQgc25kX21peGFydF9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9od19wYXJhbXNfdCAqaHcpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnMpOworCW1peGFydF9tZ3JfdCAqbWdyID0gY2hpcC0+bWdyOworCW1peGFydF9zdHJlYW1fdCAqc3RyZWFtID0gKG1peGFydF9zdHJlYW1fdCopc3Vicy0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCWludCBlcnI7CisJaW50IGNoYW5uZWxzOworCisJLyogc2V0IHVwIGNoYW5uZWxzICovCisJY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMoaHcpOworCisJLyogIHNldCB1cCBmb3JtYXQgZm9yIHRoZSBzdHJlYW0gKi8KKwlmb3JtYXQgPSBwYXJhbXNfZm9ybWF0KGh3KTsKKworCWRvd24oJm1nci0+c2V0dXBfbXV0ZXgpOworCisJLyogdXBkYXRlIHRoZSBzdHJlYW0gbGV2ZWxzICovCisJaWYoIHN0cmVhbS0+cGNtX251bWJlciA8PSBNSVhBUlRfUENNX0RJR0lUQUwgKSB7CisJCWludCBpc19hZXMgPSBzdHJlYW0tPnBjbV9udW1iZXIgPiBNSVhBUlRfUENNX0FOQUxPRzsKKwkJaWYoIHN1YnMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICkKKwkJCW1peGFydF91cGRhdGVfcGxheWJhY2tfc3RyZWFtX2xldmVsKGNoaXAsIGlzX2Flcywgc3Vicy0+bnVtYmVyKTsKKwkJZWxzZQorCQkJbWl4YXJ0X3VwZGF0ZV9jYXB0dXJlX3N0cmVhbV9sZXZlbCggY2hpcCwgaXNfYWVzKTsKKwl9CisKKwlzdHJlYW0tPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKwkvKiBzZXQgdGhlIGZvcm1hdCB0byB0aGUgYm9hcmQgKi8KKwllcnIgPSBtaXhhcnRfc2V0X2Zvcm1hdChzdHJlYW0sIGZvcm1hdCk7CisJaWYoZXJyIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGFsbG9jYXRlIGJ1ZmZlciAqLworCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3KSk7CisKKwlpZiAoZXJyID4gMCkgeworCQlzdHJ1Y3QgbWl4YXJ0X2J1ZmZlcmluZm8gKmJ1ZmZlcmluZm87CisJCWludCBpID0gKGNoaXAtPmNoaXBfaWR4ICogTUlYQVJUX01BWF9TVFJFQU1fUEVSX0NBUkQpICsgKHN0cmVhbS0+cGNtX251bWJlciAqIChNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUytNSVhBUlRfQ0FQVFVSRV9TVFJFQU1TKSkgKyBzdWJzLT5udW1iZXI7CisJCWlmKCBzdWJzLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFICkgeworCQkJaSArPSBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUzsgLyogaW4gYXJyYXkgY2FwdHVyZSBpcyBiZWhpbmQgcGxheWJhY2sgKi8KKwkJfQorCQkKKwkJYnVmZmVyaW5mbyA9IChzdHJ1Y3QgbWl4YXJ0X2J1ZmZlcmluZm8gKiljaGlwLT5tZ3ItPmJ1ZmZlcmluZm8uYXJlYTsKKwkJYnVmZmVyaW5mb1tpXS5idWZmZXJfYWRkcmVzcyA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9hZGRyOworCQlidWZmZXJpbmZvW2ldLmF2YWlsYWJsZV9sZW5ndGggPSBzdWJzLT5ydW50aW1lLT5kbWFfYnl0ZXM7CisJCS8qIGJ1ZmZlcmluZm9baV0uYnVmZmVyX2lkICBpcyBhbHJlYWR5IGRlZmluZWQgKi8KKworCQlzbmRfcHJpbnRkZCgic25kX21peGFydF9od19wYXJhbXMocGNtICVkKSA6IGRtYV9hZGRyKCV4KSBkbWFfYnl0ZXMoJXgpIHN1YnMtbnVtYmVyKCVkKVxuIiwgaSwKKwkJCQlidWZmZXJpbmZvW2ldLmJ1ZmZlcl9hZGRyZXNzLAorCQkJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCwKKwkJCQlzdWJzLT5udW1iZXIpOworCX0KKwl1cCgmbWdyLT5zZXR1cF9tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9taXhhcnRfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzKQoreworCW1peGFydF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzKTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnMpOworCW1peGFydF9zeW5jX25vbmJsb2NrX2V2ZW50cyhjaGlwLT5tZ3IpOworCXJldHVybiAwOworfQorCisKKworLyoKKyAqICBUT0RPIENPTkZJR1VSQVRJT04gU1BBQ0UgZm9yIGFsbCBwY21zLCBtb25vIHBjbSBtdXN0IHVwZGF0ZSBjaGFubmVsc19tYXgKKyAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfbWl4YXJ0X2FuYWxvZ19jYXBzID0KK3sKKwkuaW5mbyAgICAgICAgICAgICA9ICggU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX1BBVVNFKSwKKwkuZm9ybWF0cwkgID0gKCBTTkRSVl9QQ01fRk1UQklUX1U4IHwKKwkJCSAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0JFIHwKKwkJCSAgICAgIFNORFJWX1BDTV9GTVRCSVRfRkxPQVRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX0ZMT0FUX0JFICksCisJLnJhdGVzICAgICAgICAgICAgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gICAgICAgICA9IDgwMDAsCisJLnJhdGVfbWF4ICAgICAgICAgPSA0ODAwMCwKKwkuY2hhbm5lbHNfbWluICAgICA9IDEsCisJLmNoYW5uZWxzX21heCAgICAgPSAyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gKDMyKjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gMjU2LCAgICAgICAgICAgICAgICAgIC8qIDI1NiBmcmFtZXMgVTggbW9ubyovCisJLnBlcmlvZF9ieXRlc19tYXggPSAoMTYqMTAyNCksCisJLnBlcmlvZHNfbWluICAgICAgPSAyLAorCS5wZXJpb2RzX21heCAgICAgID0gKDMyKjEwMjQvMjU2KSwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX21peGFydF9kaWdpdGFsX2NhcHMgPQoreworCS5pbmZvICAgICAgICAgICAgID0gKCBTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzCSAgPSAoIFNORFJWX1BDTV9GTVRCSVRfVTggfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8CisJCQkgICAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zQkUgfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9GTE9BVF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfRkxPQVRfQkUgKSwKKwkucmF0ZXMgICAgICAgICAgICA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gICAgICAgICA9IDMyMDAwLAorCS5yYXRlX21heCAgICAgICAgID0gNDgwMDAsCisJLmNoYW5uZWxzX21pbiAgICAgPSAxLAorCS5jaGFubmVsc19tYXggICAgID0gMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICgzMioxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDI1NiwgICAgICAgICAgICAgICAgICAvKiAyNTYgZnJhbWVzIFU4IG1vbm8qLworCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDE2KjEwMjQpLAorCS5wZXJpb2RzX21pbiAgICAgID0gMiwKKwkucGVyaW9kc19tYXggICAgICA9ICgzMioxMDI0LzI1NiksCit9OworCisKK3N0YXRpYyBpbnQgc25kX21peGFydF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJbWl4YXJ0X3QgICAgICAgICAgICAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJbWl4YXJ0X21ncl90ICAgICAgICAqbWdyID0gY2hpcC0+bWdyOworCXNuZF9wY21fcnVudGltZV90ICAgKnJ1bnRpbWUgPSBzdWJzLT5ydW50aW1lOworCXNuZF9wY21fdCAgICAgICAgICAgKnBjbSA9IHN1YnMtPnBjbTsKKwltaXhhcnRfc3RyZWFtX3QgICAgICpzdHJlYW07CisJbWl4YXJ0X3BpcGVfdCAgICAgICAqcGlwZTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcGNtX251bWJlcjsKKworCWRvd24oJm1nci0+c2V0dXBfbXV0ZXgpOworCisJaWYgKCBwY20gPT0gY2hpcC0+cGNtICkgeworCQlwY21fbnVtYmVyID0gTUlYQVJUX1BDTV9BTkFMT0c7CisJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9hbmFsb2dfY2FwczsKKwl9IGVsc2UgeworCQlzbmRfYXNzZXJ0ICggcGNtID09IGNoaXAtPnBjbV9kaWcgKTsgCisJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CisJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CisJfQorCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisKKwkvKiBnZXQgc3RyZWFtIGluZm8gKi8KKwlzdHJlYW0gPSAmKGNoaXAtPnBsYXliYWNrX3N0cmVhbVtwY21fbnVtYmVyXVtzdWJzLT5udW1iZXJdKTsKKworCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKKwkJLyogc3RyZWFtcyBpbiB1c2UgKi8KKwkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLCBjaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlciwgc3Vicy0+bnVtYmVyKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIF9leGl0X29wZW47CisJfQorCisJLyogZ2V0IHBpcGUgcG9pbnRlciAob3V0IHBpcGUpICovCisJcGlwZSA9IHNuZF9taXhhcnRfYWRkX3JlZl9waXBlKGNoaXAsIHBjbV9udW1iZXIsIDAsIDApOworCisJaWYgKHBpcGUgPT0gTlVMTCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIF9leGl0X29wZW47CisJfQorCisJLyogc3RhcnQgdGhlIHBpcGUgaWYgbmVjZXNzYXJ5ICovCisJZXJyID0gbWl4YXJ0X3NldF9waXBlX3N0YXRlKGNoaXAtPm1nciwgcGlwZSwgMSk7CisJaWYoIGVyciA8IDAgKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0YXJ0aW5nIHBpcGUhXG4iKTsKKwkJc25kX21peGFydF9raWxsX3JlZl9waXBlKGNoaXAtPm1nciwgcGlwZSwgMCk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gX2V4aXRfb3BlbjsKKwl9CisKKwlzdHJlYW0tPnBpcGUgICAgICAgID0gcGlwZTsKKwlzdHJlYW0tPnBjbV9udW1iZXIgID0gcGNtX251bWJlcjsKKwlzdHJlYW0tPnN0YXR1cyAgICAgID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfT1BFTjsKKwlzdHJlYW0tPnN1YnN0cmVhbSAgID0gc3ViczsKKwlzdHJlYW0tPmNoYW5uZWxzICAgID0gMDsgLyogbm90IGNvbmZpZ3VyZWQgeWV0ICovCisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzdHJlYW07CisKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAzMik7CisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCA2NCk7CisKKwkvKiBpZiBhIHNhbXBsZSByYXRlIGlzIGFscmVhZHkgdXNlZCwgYW5vdGhlciBzdHJlYW0gY2Fubm90IGNoYW5nZSAqLworCWlmKG1nci0+cmVmX2NvdW50X3JhdGUrKykgeworCQlpZihtZ3ItPnNhbXBsZV9yYXRlKSB7CisJCQlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gbWdyLT5zYW1wbGVfcmF0ZTsKKwkJfQorCX0KKworIF9leGl0X29wZW46CisJdXAoJm1nci0+c2V0dXBfbXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHNuZF9taXhhcnRfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMpCit7CisJbWl4YXJ0X3QgICAgICAgICAgICAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJbWl4YXJ0X21ncl90ICAgICAgICAqbWdyID0gY2hpcC0+bWdyOworCXNuZF9wY21fcnVudGltZV90ICAgKnJ1bnRpbWUgPSBzdWJzLT5ydW50aW1lOworCXNuZF9wY21fdCAgICAgICAgICAgKnBjbSA9IHN1YnMtPnBjbTsKKwltaXhhcnRfc3RyZWFtX3QgICAgICpzdHJlYW07CisJbWl4YXJ0X3BpcGVfdCAgICAgICAqcGlwZTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcGNtX251bWJlcjsKKworCWRvd24oJm1nci0+c2V0dXBfbXV0ZXgpOworCisJaWYgKCBwY20gPT0gY2hpcC0+cGNtICkgeworCQlwY21fbnVtYmVyID0gTUlYQVJUX1BDTV9BTkFMT0c7CisJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9hbmFsb2dfY2FwczsKKwl9IGVsc2UgeworCQlzbmRfYXNzZXJ0ICggcGNtID09IGNoaXAtPnBjbV9kaWcgKTsgCisJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CisJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CisJfQorCisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gMjsgLyogZm9yIGluc3RhbmNlLCBubyBtb25vICovCisKKwlzbmRfcHJpbnRkZCgic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisKKwkvKiBnZXQgc3RyZWFtIGluZm8gKi8KKwlzdHJlYW0gPSAmKGNoaXAtPmNhcHR1cmVfc3RyZWFtW3BjbV9udW1iZXJdKTsKKworCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKKwkJLyogc3RyZWFtcyBpbiB1c2UgKi8KKwkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZCBpbiB1c2VcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gX2V4aXRfb3BlbjsKKwl9CisKKwkvKiBnZXQgcGlwZSBwb2ludGVyIChpbiBwaXBlKSAqLworCXBpcGUgPSBzbmRfbWl4YXJ0X2FkZF9yZWZfcGlwZShjaGlwLCBwY21fbnVtYmVyLCAxLCAwKTsKKworCWlmIChwaXBlID09IE5VTEwpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBfZXhpdF9vcGVuOworCX0KKworCS8qIHN0YXJ0IHRoZSBwaXBlIGlmIG5lY2Vzc2FyeSAqLworCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShjaGlwLT5tZ3IsIHBpcGUsIDEpOworCWlmKCBlcnIgPCAwICkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdGFydGluZyBwaXBlIVxuIik7CisJCXNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZShjaGlwLT5tZ3IsIHBpcGUsIDApOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIF9leGl0X29wZW47CisJfQorCisJc3RyZWFtLT5waXBlICAgICAgICA9IHBpcGU7CisJc3RyZWFtLT5wY21fbnVtYmVyICA9IHBjbV9udW1iZXI7CisJc3RyZWFtLT5zdGF0dXMgICAgICA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX09QRU47CisJc3RyZWFtLT5zdWJzdHJlYW0gICA9IHN1YnM7CisJc3RyZWFtLT5jaGFubmVscyAgICA9IDA7IC8qIG5vdCBjb25maWd1cmVkIHlldCAqLworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOworCisJc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgNjQpOworCisJLyogaWYgYSBzYW1wbGUgcmF0ZSBpcyBhbHJlYWR5IHVzZWQsIGFub3RoZXIgc3RyZWFtIGNhbm5vdCBjaGFuZ2UgKi8KKwlpZihtZ3ItPnJlZl9jb3VudF9yYXRlKyspIHsKKwkJaWYobWdyLT5zYW1wbGVfcmF0ZSkgeworCQkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IG1nci0+c2FtcGxlX3JhdGU7CisJCX0KKwl9CisKKyBfZXhpdF9vcGVuOgorCXVwKCZtZ3ItPnNldHVwX211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CisKKworCitzdGF0aWMgaW50IHNuZF9taXhhcnRfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3VicykKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJbWl4YXJ0X21ncl90ICptZ3IgPSBjaGlwLT5tZ3I7CisJbWl4YXJ0X3N0cmVhbV90ICpzdHJlYW0gPSAobWl4YXJ0X3N0cmVhbV90KilzdWJzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCZtZ3ItPnNldHVwX211dGV4KTsKKworCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X2Nsb3NlIEMlZC9QJWQvU3ViJWRcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdHJlYW0tPnBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisKKwkvKiBzYW1wbGUgcmF0ZSByZWxlYXNlZCAqLworCWlmKC0tbWdyLT5yZWZfY291bnRfcmF0ZSA9PSAwKSB7CisJCW1nci0+c2FtcGxlX3JhdGUgPSAwOworCX0KKworCS8qIGRlbGV0ZSBwaXBlICovCisJaWYgKHNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZShtZ3IsIHN0cmVhbS0+cGlwZSwgMCApIDwgMCkgeworCisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZSBDJWRQJWRcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdHJlYW0tPnBjbV9udW1iZXIpOworCX0KKworCXN0cmVhbS0+cGlwZSAgICAgID0gTlVMTDsKKwlzdHJlYW0tPnN0YXR1cyAgICA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX0ZSRUU7CisJc3RyZWFtLT5zdWJzdHJlYW0gPSBOVUxMOworCisJdXAoJm1nci0+c2V0dXBfbXV0ZXgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfbWl4YXJ0X3N0cmVhbV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vicy0+cnVudGltZTsKKwltaXhhcnRfc3RyZWFtX3QgICAqc3RyZWFtICA9IChtaXhhcnRfc3RyZWFtX3QqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiAoc25kX3BjbV91ZnJhbWVzX3QpKChzdHJlYW0tPmJ1Zl9wZXJpb2RzICogcnVudGltZS0+cGVyaW9kX3NpemUpICsgc3RyZWFtLT5idWZfcGVyaW9kX2ZyYWcpOworfQorCisKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX21peGFydF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gICAgICA9IHNuZF9taXhhcnRfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgICAgID0gc25kX21peGFydF9jbG9zZSwKKwkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCisJLnByZXBhcmUgICA9IHNuZF9taXhhcnRfcHJlcGFyZSwKKwkuaHdfcGFyYW1zID0gc25kX21peGFydF9od19wYXJhbXMsCisJLmh3X2ZyZWUgICA9IHNuZF9taXhhcnRfaHdfZnJlZSwKKwkudHJpZ2dlciAgID0gc25kX21peGFydF90cmlnZ2VyLAorCS5wb2ludGVyICAgPSBzbmRfbWl4YXJ0X3N0cmVhbV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX21peGFydF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiAgICAgID0gc25kX21peGFydF9jYXB0dXJlX29wZW4sCisJLmNsb3NlICAgICA9IHNuZF9taXhhcnRfY2xvc2UsCisJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5wcmVwYXJlICAgPSBzbmRfbWl4YXJ0X3ByZXBhcmUsCisJLmh3X3BhcmFtcyA9IHNuZF9taXhhcnRfaHdfcGFyYW1zLAorCS5od19mcmVlICAgPSBzbmRfbWl4YXJ0X2h3X2ZyZWUsCisJLnRyaWdnZXIgICA9IHNuZF9taXhhcnRfdHJpZ2dlciwKKwkucG9pbnRlciAgID0gc25kX21peGFydF9zdHJlYW1fcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHByZWFsbG9jYXRlX2J1ZmZlcnMobWl4YXJ0X3QgKmNoaXAsIHNuZF9wY21fdCAqcGNtKQoreworI2lmIDAKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzOworCWludCBzdHJlYW07CisKKwlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7CisJCWludCBpZHggPSAwOworCQlmb3IgKHN1YnMgPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07IHN1YnM7IHN1YnMgPSBzdWJzLT5uZXh0LCBpZHgrKykKKwkJCS8qIHNldCB1cCB0aGUgdW5pcXVlIGRldmljZSBpZCB3aXRoIHRoZSBjaGlwIGluZGV4ICovCisJCQlzdWJzLT5kbWFfZGV2aWNlLmlkID0gc3Vicy0+cGNtLT5kZXZpY2UgPDwgMTYgfAorCQkJCXN1YnMtPnN0cmVhbSA8PCA4IHwgKHN1YnMtPm51bWJlciArIDEpIHwKKwkJCQkoY2hpcC0+Y2hpcF9pZHggKyAxKSA8PCAyNDsKKwl9CisjZW5kaWYKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPm1nci0+cGNpKSwgMzIqMTAyNCwgMzIqMTAyNCk7Cit9CisKKy8qCisgKi8KK3N0YXRpYyBpbnQgc25kX21peGFydF9wY21fYW5hbG9nKG1peGFydF90ICpjaGlwKQoreworCWludCBlcnI7CisJc25kX3BjbV90ICpwY207CisJY2hhciBuYW1lWzMyXTsKKworCXNwcmludGYobmFtZSwgIm1pWGFydCBhbmFsb2cgJWQiLCBjaGlwLT5jaGlwX2lkeCk7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBNSVhBUlRfUENNX0FOQUxPRywKKwkJCSAgICAgICBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUywKKwkJCSAgICAgICBNSVhBUlRfQ0FQVFVSRV9TVFJFQU1TLCAmcGNtKSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgdGhlIGFuYWxvZyBwY20gJWRcbiIsIGNoaXAtPmNoaXBfaWR4KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX21peGFydF9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9taXhhcnRfY2FwdHVyZV9vcHMpOworCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCBuYW1lKTsKKworCXByZWFsbG9jYXRlX2J1ZmZlcnMoY2hpcCwgcGNtKTsKKworCWNoaXAtPnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICovCitzdGF0aWMgaW50IHNuZF9taXhhcnRfcGNtX2RpZ2l0YWwobWl4YXJ0X3QgKmNoaXApCit7CisJaW50IGVycjsKKwlzbmRfcGNtX3QgKnBjbTsKKwljaGFyIG5hbWVbMzJdOworCisJc3ByaW50ZihuYW1lLCAibWlYYXJ0IEFFUy9FQlUgJWQiLCBjaGlwLT5jaGlwX2lkeCk7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBNSVhBUlRfUENNX0RJR0lUQUwsCisJCQkgICAgICAgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMsCisJCQkgICAgICAgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUywgJnBjbSkpIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfbWl4YXJ0X3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX21peGFydF9jYXB0dXJlX29wcyk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsIG5hbWUpOworCisJcHJlYWxsb2NhdGVfYnVmZmVycyhjaGlwLCBwY20pOworCisJY2hpcC0+cGNtX2RpZyA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbWl4YXJ0X2NoaXBfZnJlZShtaXhhcnRfdCAqY2hpcCkKK3sKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbWl4YXJ0X2NoaXBfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfbWl4YXJ0X2NoaXBfZnJlZShjaGlwKTsKK30KKworCisvKgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfbWl4YXJ0X2NyZWF0ZShtaXhhcnRfbWdyX3QgKm1nciwgc25kX2NhcmRfdCAqY2FyZCwgaW50IGlkeCkKK3sKKwlpbnQgZXJyOworCW1peGFydF90ICpjaGlwOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0gc25kX21peGFydF9jaGlwX2Rldl9mcmVlLAorCX07CisKKwltZ3ItPmNoaXBbaWR4XSA9IGNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghIGNoaXApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5jaGlwX2lkeCA9IGlkeDsKKwljaGlwLT5tZ3IgPSBtZ3I7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgeworCQlzbmRfbWl4YXJ0X2NoaXBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQgc25kX21peGFydF9jcmVhdGVfcGNtKG1peGFydF90KiBjaGlwKQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfbWl4YXJ0X3BjbV9hbmFsb2coY2hpcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZihjaGlwLT5tZ3ItPmJvYXJkX3R5cGUgPT0gTUlYQVJUX0RBVUdIVEVSX1RZUEVfQUVTKSB7CisKKwkJZXJyID0gc25kX21peGFydF9wY21fZGlnaXRhbChjaGlwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiByZWxlYXNlIGFsbCB0aGUgY2FyZHMgYXNzaWduZWQgdG8gYSBtYW5hZ2VyIGluc3RhbmNlCisgKi8KK3N0YXRpYyBpbnQgc25kX21peGFydF9mcmVlKG1peGFydF9tZ3JfdCAqbWdyKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1nci0+bnVtX2NhcmRzOyBpKyspIHsKKwkJaWYgKG1nci0+Y2hpcFtpXSkKKwkJCXNuZF9jYXJkX2ZyZWUobWdyLT5jaGlwW2ldLT5jYXJkKTsKKwl9CisKKwkvKiBzdG9wIG1haWxib3ggKi8KKwlzbmRfbWl4YXJ0X2V4aXRfbWFpbGJveChtZ3IpOworCisJLyogcmVsZWFzZSBpcnEgICovCisJaWYgKG1nci0+aXJxID49IDApCisJCWZyZWVfaXJxKG1nci0+aXJxLCAodm9pZCAqKW1ncik7CisKKwkvKiByZXNldCBib2FyZCBpZiBzb21lIGZpcm13YXJlIHdhcyBsb2FkZWQgKi8KKwlpZihtZ3ItPmRzcF9sb2FkZWQpIHsKKwkJc25kX21peGFydF9yZXNldF9ib2FyZChtZ3IpOworCQlzbmRfcHJpbnRkZCgicmVzZXQgbWlYYXJ0ICFcbiIpOworCX0KKworCS8qIHJlbGVhc2UgdGhlIGkvbyBwb3J0cyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKG1nci0+bWVtW2ldLnZpcnQpCisJCQlpb3VubWFwKG1nci0+bWVtW2ldLnZpcnQpOworCX0KKwlwY2lfcmVsZWFzZV9yZWdpb25zKG1nci0+cGNpKTsKKworCS8qIGZyZWUgZmxvd2FycmF5ICovCisJaWYobWdyLT5mbG93aW5mby5hcmVhKSB7CisJCXNuZF9kbWFfZnJlZV9wYWdlcygmbWdyLT5mbG93aW5mbyk7CisJCW1nci0+Zmxvd2luZm8uYXJlYSA9IE5VTEw7CisJfQorCS8qIGZyZWUgYnVmZmVyYXJyYXkgKi8KKwlpZihtZ3ItPmJ1ZmZlcmluZm8uYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJm1nci0+YnVmZmVyaW5mbyk7CisJCW1nci0+YnVmZmVyaW5mby5hcmVhID0gTlVMTDsKKwl9CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UobWdyLT5wY2kpOworCWtmcmVlKG1ncik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jIGludGVyZmFjZQorICovCitzdGF0aWMgbG9uZyBsb25nIHNuZF9taXhhcnRfQkEwX2xsc2VlayhzbmRfaW5mb19lbnRyeV90ICplbnRyeSwKKwkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9maWxlX2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBsb25nIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgICBpbnQgb3JpZykKK3sKKwlvZmZzZXQgPSBvZmZzZXQgJiB+MzsgLyogNCBieXRlcyBhbGlnbmVkICovCisKKwlzd2l0Y2gob3JpZykgeworCWNhc2UgMDogIC8qIFNFRUtfU0VUICovCisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDE6ICAvKiBTRUVLX0NVUiAqLworCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgMjogIC8qIFNFRUtfRU5ELCBvZmZzZXQgaXMgbmVnYXRpdmUgKi8KKwkJZmlsZS0+Zl9wb3MgPSBNSVhBUlRfQkEwX1NJWkUgKyBvZmZzZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZihmaWxlLT5mX3BvcyA+IE1JWEFSVF9CQTBfU0laRSkKKwkJZmlsZS0+Zl9wb3MgPSBNSVhBUlRfQkEwX1NJWkU7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCitzdGF0aWMgbG9uZyBsb25nIHNuZF9taXhhcnRfQkExX2xsc2VlayhzbmRfaW5mb19lbnRyeV90ICplbnRyeSwKKwkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9maWxlX2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBsb25nIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgICBpbnQgb3JpZykKK3sKKwlvZmZzZXQgPSBvZmZzZXQgJiB+MzsgLyogNCBieXRlcyBhbGlnbmVkICovCisKKwlzd2l0Y2gob3JpZykgeworCWNhc2UgMDogIC8qIFNFRUtfU0VUICovCisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDE6ICAvKiBTRUVLX0NVUiAqLworCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgMjogLyogU0VFS19FTkQsIG9mZnNldCBpcyBuZWdhdGl2ZSAqLworCQlmaWxlLT5mX3BvcyA9IE1JWEFSVF9CQTFfU0laRSArIG9mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmKGZpbGUtPmZfcG9zID4gTUlYQVJUX0JBMV9TSVpFKQorCQlmaWxlLT5mX3BvcyA9IE1JWEFSVF9CQTFfU0laRTsKKwlyZXR1cm4gZmlsZS0+Zl9wb3M7Cit9CisKKy8qCisgIG1peGFydF9CQTAgcHJvYyBpbnRlcmZhY2UgZm9yIEJBUiAwIC0gcmVhZCBjYWxsYmFjaworICovCitzdGF0aWMgbG9uZyBzbmRfbWl4YXJ0X0JBMF9yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCB2b2lkICpmaWxlX3ByaXZhdGVfZGF0YSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHBvcykKK3sKKwltaXhhcnRfbWdyX3QgKm1nciA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisKKwljb3VudCA9IGNvdW50ICYgfjM7IC8qIG1ha2Ugc3VyZSB0aGUgcmVhZCBzaXplIGlzIGEgbXVsdGlwbGUgb2YgNCBieXRlcyAqLworCWlmKGNvdW50IDw9IDApCisJCXJldHVybiAwOworCWlmKHBvcyArIGNvdW50ID4gTUlYQVJUX0JBMF9TSVpFKQorCQljb3VudCA9IChsb25nKShNSVhBUlRfQkEwX1NJWkUgLSBwb3MpOworCWlmKGNvcHlfdG9fdXNlcl9mcm9taW8oYnVmLCBNSVhBUlRfTUVNKCBtZ3IsIHBvcyApLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAgbWl4YXJ0X0JBMSBwcm9jIGludGVyZmFjZSBmb3IgQkFSIDEgLSByZWFkIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBsb25nIHNuZF9taXhhcnRfQkExX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHZvaWQgKmZpbGVfcHJpdmF0ZV9kYXRhLAorCQkJCXN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgcG9zKQoreworCW1peGFydF9tZ3JfdCAqbWdyID0gZW50cnktPnByaXZhdGVfZGF0YTsKKworCWNvdW50ID0gY291bnQgJiB+MzsgLyogbWFrZSBzdXJlIHRoZSByZWFkIHNpemUgaXMgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzICovCisJaWYoY291bnQgPD0gMCkKKwkJcmV0dXJuIDA7CisJaWYocG9zICsgY291bnQgPiBNSVhBUlRfQkExX1NJWkUpCisJCWNvdW50ID0gKGxvbmcpKE1JWEFSVF9CQTFfU0laRSAtIHBvcyk7CisJaWYoY29weV90b191c2VyX2Zyb21pbyhidWYsIE1JWEFSVF9SRUcoIG1nciwgcG9zICksIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyBzbmRfbWl4YXJ0X3Byb2Nfb3BzX0JBMCA9IHsKKwkucmVhZCAgID0gc25kX21peGFydF9CQTBfcmVhZCwKKwkubGxzZWVrID0gc25kX21peGFydF9CQTBfbGxzZWVrCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyBzbmRfbWl4YXJ0X3Byb2Nfb3BzX0JBMSA9IHsKKwkucmVhZCAgID0gc25kX21peGFydF9CQTFfcmVhZCwKKwkubGxzZWVrID0gc25kX21peGFydF9CQTFfbGxzZWVrCit9OworCisKK3N0YXRpYyB2b2lkIHNuZF9taXhhcnRfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCW1peGFydF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsgICAgICAgIAorCXUzMiByZWY7IAorCisJc25kX2lwcmludGYoYnVmZmVyLCAiRGlnaWdyYW0gbWlYYXJ0IChhbHNhIGNhcmQgJWQpXG5cbiIsIGNoaXAtPmNoaXBfaWR4KTsKKworCS8qIHN0YXRzIGF2YWlsYWJsZSB3aGVuIGVtYmVkZGVkIE9TIGlzIHJ1bm5pbmcgKi8KKwlpZiAoY2hpcC0+bWdyLT5kc3BfbG9hZGVkICYgKCAxIDw8IE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVgpKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0gaGFyZHdhcmUgLVxuIik7CisJCXN3aXRjaCAoY2hpcC0+bWdyLT5ib2FyZF90eXBlICkgeworCQljYXNlIE1JWEFSVF9EQVVHSFRFUl9UWVBFX05PTkUgICAgIDogc25kX2lwcmludGYoYnVmZmVyLCAiXHRtaVhhcnQ4IChubyBkYXVnaHRlciBib2FyZClcblxuIik7IGJyZWFrOworCQljYXNlIE1JWEFSVF9EQVVHSFRFUl9UWVBFX0FFUyAgICAgIDogc25kX2lwcmludGYoYnVmZmVyLCAiXHRtaVhhcnQ4IEFFUy9FQlVcblxuIik7IGJyZWFrOworCQljYXNlIE1JWEFSVF9EQVVHSFRFUl9UWVBFX0NPQlJBTkVUIDogc25kX2lwcmludGYoYnVmZmVyLCAiXHRtaVhhcnQ4IENvYnJhbmV0XG5cbiIpOyBicmVhazsKKwkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIlx0VU5LTk9XTiFcblxuIik7IGJyZWFrOworCQl9CisKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiLSBzeXN0ZW0gbG9hZCAtXG4iKTsJIAorCisJCS8qIGdldCBwZXJmIHJlZmVyZW5jZSAqLworCisJCXJlZiA9IHJlYWRsX2JlKCBNSVhBUlRfTUVNKCBjaGlwLT5tZ3IsIE1JWEFSVF9QU0VVRE9SRUdfUEVSRl9TWVNURU1fTE9BRF9PRkZTRVQpKTsKKworCQlpZiAocmVmKSB7CisJCQl1MzIgbWFpbGJveCAgID0gMTAwICogcmVhZGxfYmUoIE1JWEFSVF9NRU0oIGNoaXAtPm1nciwgTUlYQVJUX1BTRVVET1JFR19QRVJGX01BSUxCWF9MT0FEX09GRlNFVCkpIC8gcmVmOworCQkJdTMyIHN0cmVhbWluZyA9IDEwMCAqIHJlYWRsX2JlKCBNSVhBUlRfTUVNKCBjaGlwLT5tZ3IsIE1JWEFSVF9QU0VVRE9SRUdfUEVSRl9TVFJFQU1fTE9BRF9PRkZTRVQpKSAvIHJlZjsKKwkJCXUzMiBpbnRlcnIgICAgPSAxMDAgKiByZWFkbF9iZSggTUlYQVJUX01FTSggY2hpcC0+bWdyLCBNSVhBUlRfUFNFVURPUkVHX1BFUkZfSU5URVJSX0xPQURfT0ZGU0VUKSkgLyByZWY7CisKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlx0c3RyZWFtaW5nICAgICAgICAgIDogJWRcbiIsIHN0cmVhbWluZyk7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJcdG1haWxib3ggICAgICAgICAgICA6ICVkXG4iLCBtYWlsYm94KTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlx0aW50ZXJydXBzIGhhbmRsaW5nIDogJWRcblxuIiwgaW50ZXJyKTsKKwkJfQorCX0gLyogZW5kaWYgZWxmIGxvYWRlZCAqLworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX21peGFydF9wcm9jX2luaXQobWl4YXJ0X3QgKmNoaXApCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwkvKiB0ZXh0IGludGVyZmFjZSB0byByZWFkIHBlcmYgYW5kIHRlbXAgbWV0ZXJzICovCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImJvYXJkX2luZm8iLCAmZW50cnkpKSB7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOworCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDEwMjQ7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9taXhhcnRfcHJvY19yZWFkOworCX0KKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJtaXhhcnRfQkEwIiwgJmVudHJ5KSkgeworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY2hpcC0+bWdyOwkKKwkJZW50cnktPmMub3BzID0gJnNuZF9taXhhcnRfcHJvY19vcHNfQkEwOworCQllbnRyeS0+c2l6ZSA9IE1JWEFSVF9CQTBfU0laRTsKKwl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgIm1peGFydF9CQTEiLCAmZW50cnkpKSB7CisJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwLT5tZ3I7CisJCWVudHJ5LT5jLm9wcyA9ICZzbmRfbWl4YXJ0X3Byb2Nfb3BzX0JBMTsKKwkJZW50cnktPnNpemUgPSBNSVhBUlRfQkExX1NJWkU7CisJfQorfQorLyogZW5kIG9mIHByb2MgaW50ZXJmYWNlICovCisKKworLyoKKyAqICAgIHByb2JlIGZ1bmN0aW9uIC0gY3JlYXRlcyB0aGUgY2FyZCBtYW5hZ2VyCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9taXhhcnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCW1peGFydF9tZ3JfdCAqbWdyOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJc2l6ZV90IHNpemU7CisKKwkvKgorCSAqLworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghIGVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBlbmFibGUgUENJIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisKKwkvKiBjaGVjayBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMzIgYml0cyAqLworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgMHhmZmZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkgKi8KKwltZ3IgPSBrY2FsbG9jKDEsIHNpemVvZigqbWdyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgbWdyKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZ3ItPnBjaSA9IHBjaTsKKwltZ3ItPmlycSA9IC0xOworCisJLyogcmVzb3VyY2UgYXNzaWdubWVudCAqLworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIENBUkRfTkFNRSkpIDwgMCkgeworCQlrZnJlZShtZ3IpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQltZ3ItPm1lbVtpXS5waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgaSk7CisJCW1nci0+bWVtW2ldLnZpcnQgPSBpb3JlbWFwX25vY2FjaGUobWdyLT5tZW1baV0ucGh5cywKKwkJCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCBpKSk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbWl4YXJ0X2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCBDQVJEX05BTUUsICh2b2lkICopbWdyKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX21peGFydF9mcmVlKG1ncik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1nci0+aXJxID0gcGNpLT5pcnE7CisKKwlzcHJpbnRmKG1nci0+c2hvcnRuYW1lLCAiRGlnaWdyYW0gbWlYYXJ0Iik7CisJc3ByaW50ZihtZ3ItPmxvbmduYW1lLCAiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpIiwgbWdyLT5zaG9ydG5hbWUsIG1nci0+bWVtWzBdLnBoeXMsIG1nci0+bWVtWzFdLnBoeXMsIG1nci0+aXJxKTsKKworCS8qIElTUiBzcGlubG9jayAgKi8KKwlzcGluX2xvY2tfaW5pdCgmbWdyLT5sb2NrKTsKKworCS8qIGluaXQgbWFpbGJveCAgKi8KKwltZ3ItPm1zZ19maWZvX3JlYWRwdHIgPSAwOworCW1nci0+bXNnX2ZpZm9fd3JpdGVwdHIgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJm1nci0+bXNnX2xvY2spOworCWluaXRfTVVURVgoJm1nci0+bXNnX211dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZ3ItPm1zZ19zbGVlcCk7CisJYXRvbWljX3NldCgmbWdyLT5tc2dfcHJvY2Vzc2VkLCAwKTsKKworCS8qIGluaXQgc2V0dXAgbXV0ZXgqLworCWluaXRfTVVURVgoJm1nci0+c2V0dXBfbXV0ZXgpOworCisJLyogaW5pdCBtZXNzYWdlIHRhc2xrZXQgKi8KKwl0YXNrbGV0X2luaXQoICZtZ3ItPm1zZ190YXNrcSwgc25kX21peGFydF9tc2dfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIG1ncik7CisKKwkvKiBjYXJkIGFzc2lnbm1lbnQgKi8KKwltZ3ItPm51bV9jYXJkcyA9IE1JWEFSVF9NQVhfQ0FSRFM7IC8qIDQgIEZJWE1FOiBjb25maWd1cmFibGU/ICovCisJZm9yIChpID0gMDsgaSA8IG1nci0+bnVtX2NhcmRzOyBpKyspIHsKKwkJc25kX2NhcmRfdCAqY2FyZDsKKwkJY2hhciB0bXBpZFsxNl07CisJCWludCBpZHg7CisKKwkJaWYgKGluZGV4W2Rldl0gPCAwKQorCQkJaWR4ID0gaW5kZXhbZGV2XTsKKwkJZWxzZQorCQkJaWR4ID0gaW5kZXhbZGV2XSArIGk7CisJCXNucHJpbnRmKHRtcGlkLCBzaXplb2YodG1waWQpLCAiJXMtJWQiLCBpZFtkZXZdID8gaWRbZGV2XSA6ICJNSVhBUlQiLCBpKTsKKwkJY2FyZCA9IHNuZF9jYXJkX25ldyhpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwgMCk7CisKKwkJaWYgKCEgY2FyZCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHRoZSBjYXJkICVkXG4iLCBpKTsKKwkJCXNuZF9taXhhcnRfZnJlZShtZ3IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBDQVJEX05BTUUpOworCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIiVzIFtQQ00gIyVkXSIsIG1nci0+c2hvcnRuYW1lLCBpKTsKKwkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIFtQQ00gIyVkXSIsIG1nci0+bG9uZ25hbWUsIGkpOworCisJCWlmICgoZXJyID0gc25kX21peGFydF9jcmVhdGUobWdyLCBjYXJkLCBpKSkgPCAwKSB7CisJCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZihpPT0wKSB7CisJCQkvKiBpbml0IHByb2MgaW50ZXJmYWNlIG9ubHkgZm9yIGNoaXAwICovCisJCQlzbmRfbWl4YXJ0X3Byb2NfaW5pdChtZ3ItPmNoaXBbaV0pOworCQl9CisKKwkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBpbml0IGZpcm13YXJlIHN0YXR1cyAobWdyLT5kc3BfbG9hZGVkIHJlc2V0IGluIGh3ZGVwX25ldykgKi8KKwltZ3ItPmJvYXJkX3R5cGUgPSBNSVhBUlRfREFVR0hURVJfVFlQRV9OT05FOworCisJLyogY3JlYXRlIGFycmF5IG9mIHN0cmVhbWluZm8gKi8KKwlzaXplID0gUEFHRV9BTElHTiggKE1JWEFSVF9NQVhfU1RSRUFNX1BFUl9DQVJEICogTUlYQVJUX01BWF9DQVJEUyAqIHNpemVvZihtaXhhcnRfZmxvd2luZm9fdCkpICk7CisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJc2l6ZSwgJm1nci0+Zmxvd2luZm8pIDwgMCkgeworCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGluaXQgc3RyZWFtaW5mb19hcnJheSAqLworCW1lbXNldChtZ3ItPmZsb3dpbmZvLmFyZWEsIDAsIHNpemUpOworCisJLyogY3JlYXRlIGFycmF5IG9mIGJ1ZmZlcmluZm8gKi8KKwlzaXplID0gUEFHRV9BTElHTiggKE1JWEFSVF9NQVhfU1RSRUFNX1BFUl9DQVJEICogTUlYQVJUX01BWF9DQVJEUyAqIHNpemVvZihtaXhhcnRfYnVmZmVyaW5mb190KSkgKTsKKwlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwKKwkJCQlzaXplLCAmbWdyLT5idWZmZXJpbmZvKSA8IDApIHsKKwkJc25kX21peGFydF9mcmVlKG1ncik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBpbml0IGJ1ZmZlcmluZm9fYXJyYXkgKi8KKwltZW1zZXQobWdyLT5idWZmZXJpbmZvLmFyZWEsIDAsIHNpemUpOworCisJLyogc2V0IHVwIGZpcm13YXJlICovCisJZXJyID0gc25kX21peGFydF9zZXR1cF9maXJtd2FyZShtZ3IpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9taXhhcnRfZnJlZShtZ3IpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIG1ncik7CisJZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfbWl4YXJ0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9taXhhcnRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiRGlnaWdyYW0gbWlYYXJ0IiwKKwkuaWRfdGFibGUgPSBzbmRfbWl4YXJ0X2lkcywKKwkucHJvYmUgPSBzbmRfbWl4YXJ0X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfbWl4YXJ0X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfbWl4YXJ0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX21peGFydF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfbWl4YXJ0X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfbWl4YXJ0X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5oIGIvc291bmQvcGNpL21peGFydC9taXhhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODcxNTJmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnQuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIERyaXZlciBmb3IgRGlnaWdyYW0gbWlYYXJ0IHNvdW5kY2FyZHMKKyAqCisgKiBtYWluIGhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IERpZ2lncmFtIDxhbHNhQGRpZ2lncmFtLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX01JWEFSVF9ICisjZGVmaW5lIF9fU09VTkRfTUlYQVJUX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorCisjZGVmaW5lIE1JWEFSVF9EUklWRVJfVkVSU0lPTgkweDAwMDEwMAkvKiAwLjEuMCAqLworCisKKy8qCisgKi8KKworI2RlZmluZSBtaXhhcnRfdF9tYWdpYwkJMHhhMTdhM2UwMQorI2RlZmluZSBtaXhhcnRfbWdyX3RfbWFnaWMJMHhhMTdhM2UwMgorCit0eXBlZGVmIHN0cnVjdCBzbmRfbWl4YXJ0IG1peGFydF90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX21peGFydF9tZ3IgbWl4YXJ0X21ncl90OworCit0eXBlZGVmIHN0cnVjdCBzbmRfbWl4YXJ0X3N0cmVhbSBtaXhhcnRfc3RyZWFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfbWl4YXJ0X3BpcGUgbWl4YXJ0X3BpcGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2J1ZmZlcmluZm8gbWl4YXJ0X2J1ZmZlcmluZm9fdDsKK3R5cGVkZWYgc3RydWN0IG1peGFydF9mbG93aW5mbyBtaXhhcnRfZmxvd2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IG1peGFydF91aWQgbWl4YXJ0X3VpZF90OworCitzdHJ1Y3QgbWl4YXJ0X3VpZAoreworCXUzMiBvYmplY3RfaWQ7CisJdTMyIGRlc2M7Cit9OworCitzdHJ1Y3QgbWVtX2FyZWEgeworCXVuc2lnbmVkIGxvbmcgcGh5czsKKwl2b2lkIF9faW9tZW0gKnZpcnQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9yb3V0ZSBtaXhhcnRfcm91dGVfdDsKK3N0cnVjdCBtaXhhcnRfcm91dGUgeworCXVuc2lnbmVkIGNoYXIgY29ubmVjdGVkOworCXVuc2lnbmVkIGNoYXIgcGhhc2VfaW52OworCWludCB2b2x1bWU7Cit9OworCisKKy8qIGZpcm13YXJlIHN0YXR1cyBjb2RlcyAgKi8KKyNkZWZpbmUgTUlYQVJUX01PVEhFUkJPQVJEX1hMWF9JTkRFWCAgMAorI2RlZmluZSBNSVhBUlRfTU9USEVSQk9BUkRfRUxGX0lOREVYICAxCisjZGVmaW5lIE1JWEFSVF9BRVNFQlVCT0FSRF9YTFhfSU5ERVggIDIKKyNkZWZpbmUgTUlYQVJUX0hBUkRXX0ZJTEVTX01BWF9JTkRFWCAgMyAgLyogeGlsaW54LCBlbGYsIEFFU0VCVSB4aWxpbnggKi8KKworI2RlZmluZSBNSVhBUlRfTUFYX0NBUkRTCTQKKyNkZWZpbmUgTVNHX0ZJRk9fU0laRSAgICAgICAgICAgMTYKKworI2RlZmluZSBNSVhBUlRfTUFYX1BIWVNfQ09OTkVDVE9SUyAgKE1JWEFSVF9NQVhfQ0FSRFMgKiAyICogMikgLyogNCAqIHN0ZXJlbyAqIChhbmFsb2crZGlnaXRhbCkgKi8KKworc3RydWN0IHNuZF9taXhhcnRfbWdyIHsKKwl1bnNpZ25lZCBpbnQgbnVtX2NhcmRzOworCW1peGFydF90ICpjaGlwW01JWEFSVF9NQVhfQ0FSRFNdOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKworCWludCBpcnE7CisKKwkvKiBtZW1vcnktbWFwcyAqLworCXN0cnVjdCBtZW1fYXJlYSBtZW1bMl07CisKKwkvKiBzaGFyZSB0aGUgbmFtZSAqLworCWNoYXIgc2hvcnRuYW1lWzMyXTsgICAgICAgICAvKiBzaG9ydCBuYW1lIG9mIHRoaXMgc291bmRjYXJkICovCisJY2hhciBsb25nbmFtZVs4MF07ICAgICAgICAgIC8qIG5hbWUgb2YgdGhpcyBzb3VuZGNhcmQgKi8KKworCS8qIG1lc3NhZ2UgdGFza2xldCAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtc2dfdGFza3E7CisKKwkvKiBvbmUgYW5kIG9ubHkgYmxvY2tpbmcgbWVzc2FnZSBvciBub3RpZmljYXRpb24gbWF5IGJlIHBlbmRpbmcgICovCisJdTMyIHBlbmRpbmdfZXZlbnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbXNnX3NsZWVwOworCisJLyogbWVzc2FnZXMgc3RvcmVkIGZvciB0YXNrbGV0ICovCisJdTMyIG1zZ19maWZvW01TR19GSUZPX1NJWkVdOworCWludCBtc2dfZmlmb19yZWFkcHRyOworCWludCBtc2dfZmlmb193cml0ZXB0cjsKKwlhdG9taWNfdCBtc2dfcHJvY2Vzc2VkOyAgICAgICAvKiBudW1iZXIgb2YgbWVzc2FnZXMgdG8gYmUgcHJvY2Vzc2VkIGluIHRha3NsZXQgKi8KKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgICAgIC8qIGludGVycnVwdCBzcGlubG9jayAqLworCXNwaW5sb2NrX3QgbXNnX2xvY2s7ICAgICAgICAgIC8qIG1haWxib3ggc3BpbmxvY2sgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG1zZ19tdXRleDsgICAvKiBtdXRleCBmb3IgYmxvY2tpbmdfcmVxdWVzdHMgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUgc2V0dXBfbXV0ZXg7IC8qIG11dGV4IHVzZWQgaW4gaHdfcGFyYW1zLCBvcGVuIGFuZCBjbG9zZSAqLworCisJLyogaGFyZHdhcmUgaW50ZXJmYWNlICovCisJdW5zaWduZWQgaW50IGRzcF9sb2FkZWQ7ICAgICAgLyogYml0IGZsYWdzIG9mIGxvYWRlZCBkc3AgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCBib2FyZF90eXBlOyAgICAgIC8qIHJlYWQgZnJvbSBlbWJlZGRlZCBvbmNlIGVsZiBmaWxlIGlzIGxvYWRlZCwgMjUwID0gbWlYYXJ0OCwgMjUxID0gd2l0aCBBRVMsIDI1MiA9IHdpdGggQ29icmFuZXQgKi8KKworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBmbG93aW5mbzsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgYnVmZmVyaW5mbzsKKworCW1peGFydF91aWRfdCAgICAgICAgIHVpZF9jb25zb2xlX21hbmFnZXI7CisJaW50IHNhbXBsZV9yYXRlOworCWludCByZWZfY291bnRfcmF0ZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgbWl4ZXJfbXV0ZXg7IC8qIG11dGV4IGZvciBtaXhlciAqLworCit9OworCisKKyNkZWZpbmUgTUlYQVJUX1NUUkVBTV9TVEFUVVNfRlJFRQkwCisjZGVmaW5lIE1JWEFSVF9TVFJFQU1fU1RBVFVTX09QRU4JMQorI2RlZmluZSBNSVhBUlRfU1RSRUFNX1NUQVRVU19SVU5OSU5HCTIKKyNkZWZpbmUgTUlYQVJUX1NUUkVBTV9TVEFUVVNfRFJBSU5JTkcJMworI2RlZmluZSBNSVhBUlRfU1RSRUFNX1NUQVRVU19QQVVTRQk0CisKKyNkZWZpbmUgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMJCTQKKyNkZWZpbmUgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUwkJMQorCisjZGVmaW5lIE1JWEFSVF9QQ01fQU5BTE9HCQkwCisjZGVmaW5lIE1JWEFSVF9QQ01fRElHSVRBTAkJMQorI2RlZmluZSBNSVhBUlRfUENNX1RPVEFMCQkyCisKKyNkZWZpbmUgTUlYQVJUX01BWF9TVFJFQU1fUEVSX0NBUkQgIChNSVhBUlRfUENNX1RPVEFMICogKE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TICsgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUykgKQorCisKKyNkZWZpbmUgTUlYQVJUX05PVElGWV9DQVJEX01BU0sJCTB4RjAwMAorI2RlZmluZSBNSVhBUlRfTk9USUZZX0NBUkRfT0ZGU0VUCTEyCisjZGVmaW5lIE1JWEFSVF9OT1RJRllfUENNX01BU0sJCTB4MEYwMAorI2RlZmluZSBNSVhBUlRfTk9USUZZX1BDTV9PRkZTRVQJOAorI2RlZmluZSBNSVhBUlRfTk9USUZZX0NBUFRfTUFTSwkJMHgwMDgwCisjZGVmaW5lIE1JWEFSVF9OT1RJRllfU1VCU19NQVNLCQkweDAwN0YKKworCitzdHJ1Y3Qgc25kX21peGFydF9zdHJlYW0geworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwltaXhhcnRfcGlwZV90ICpwaXBlOworCWludCBwY21fbnVtYmVyOworCisJaW50IHN0YXR1czsgICAgICAvKiBub3RoaW5nLCBydW5uaW5nLCBkcmFpbmluZyAqLworCisJdTY0ICBhYnNfcGVyaW9kX2VsYXBzZWQ7ICAvKiBsYXN0IGFic29sdXRlIHN0cmVhbSBwb3NpdGlvbiB3aGVyZSBwZXJpb2RfZWxhcHNlZCB3YXMgY2FsbGVkIChtdWx0aXBsZSBvZiBydW50aW1lLT5wZXJpb2Rfc2l6ZSkgKi8KKwl1MzIgIGJ1Zl9wZXJpb2RzOyAgICAgICAgIC8qIHBlcmlvZHMgY291bnRlciBpbiB0aGUgYnVmZmVyICg8IHJ1bnRpbWUtPnBlcmlvZHMpICovCisJdTMyICBidWZfcGVyaW9kX2ZyYWc7ICAgICAvKiBkZWZpbmVzIHdpdGggYnVmX3BlcmlvZF9wb3MgdGhlIGV4YWN0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKDwgcnVudGltZS0+cGVyaW9kX3NpemUpICovCisKKwlpbnQgY2hhbm5lbHM7Cit9OworCisKK2VudW0gbWl4YXJ0X3BpcGVfc3RhdHVzIHsKKwlQSVBFX1VOREVGSU5FRCwKKwlQSVBFX1NUT1BQRUQsCisJUElQRV9SVU5OSU5HLAorCVBJUEVfQ0xPQ0tfU0VUCit9OworCitzdHJ1Y3Qgc25kX21peGFydF9waXBlIHsKKwltaXhhcnRfdWlkX3QgZ3JvdXBfdWlkOwkJCS8qIGlkIG9mIHRoZSBwaXBlLCBhcyByZXR1cm5lZCBieSBlbWJlZGRlZCAqLworCWludCAgICAgICAgICBzdHJlYW1fY291bnQ7CisJbWl4YXJ0X3VpZF90IHVpZF9sZWZ0X2Nvbm5lY3RvcjsJLyogVUlEJ3MgZm9yIHRoZSBhdWRpbyBjb25uZWN0b3JzICovCisJbWl4YXJ0X3VpZF90IHVpZF9yaWdodF9jb25uZWN0b3I7CisJZW51bSBtaXhhcnRfcGlwZV9zdGF0dXMgc3RhdHVzOworCWludCByZWZlcmVuY2VzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3VicyBvcGVubmVkICovCisJaW50IG1vbml0b3Jpbmc7ICAgICAgICAgICAgIC8qIHBpcGUgdXNlZCBmb3IgbW9uaXRvcmluZyBpc3N1ZSAqLworfTsKKworCitzdHJ1Y3Qgc25kX21peGFydCB7CisJc25kX2NhcmRfdCAqY2FyZDsKKwltaXhhcnRfbWdyX3QgKm1ncjsKKwlpbnQgY2hpcF9pZHg7ICAgICAgICAgICAgICAgLyogemVybyBiYXNlZCAqLworCXNuZF9od2RlcF90ICpod2RlcDsJICAgIC8qIERTUCBsb2FkZXIsIG9ubHkgZm9yIHRoZSBmaXJzdCBjYXJkICovCisKKwlzbmRfcGNtX3QgKnBjbTsgICAgICAgICAgICAgLyogUENNIGFuYWxvZyBpL28gKi8KKwlzbmRfcGNtX3QgKnBjbV9kaWc7ICAgICAgICAgLyogUENNIGRpZ2l0YWwgaS9vICovCisKKwkvKiBhbGxvY2F0ZSBzdGVyZW8gcGlwZSBmb3IgaW5zdGFuY2UgKi8KKwltaXhhcnRfcGlwZV90IHBpcGVfaW5fYW5hOworCW1peGFydF9waXBlX3QgcGlwZV9vdXRfYW5hOworCisJLyogaWYgQUVTL0VCVSBkYXVnaHRlciBib2FyZCBpcyBhdmFpbGFibGUsIGFkZGl0aW9uYWwgcGlwZXMgcG9zc2libGUgb24gcGNtX2RpZyAqLworCW1peGFydF9waXBlX3QgcGlwZV9pbl9kaWc7CisJbWl4YXJ0X3BpcGVfdCBwaXBlX291dF9kaWc7CisKKwltaXhhcnRfc3RyZWFtX3QgcGxheWJhY2tfc3RyZWFtW01JWEFSVF9QQ01fVE9UQUxdW01JWEFSVF9QTEFZQkFDS19TVFJFQU1TXTsgLyogMCA9IHBjbSwgMSA9IHBjbV9kaWcgKi8KKwltaXhhcnRfc3RyZWFtX3QgY2FwdHVyZV9zdHJlYW1bTUlYQVJUX1BDTV9UT1RBTF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IHBjbSwgMSA9IHBjbV9kaWcgKi8KKworCS8qIFVJRCdzIGZvciB0aGUgcGh5c2ljYWwgaW8ncyAqLworCW1peGFydF91aWRfdCB1aWRfb3V0X2FuYWxvZ19waHlzaW87CisJbWl4YXJ0X3VpZF90IHVpZF9pbl9hbmFsb2dfcGh5c2lvOworCisJaW50IGFuYWxvZ19wbGF5YmFja19hY3RpdmVbMl07CQkvKiBNaXhlciA6IE1hc3RlciBQbGF5YmFjayBhY3RpdmUgKCFtdXRlKSAqLworCWludCBhbmFsb2dfcGxheWJhY2tfdm9sdW1lWzJdOwkJLyogTWl4ZXIgOiBNYXN0ZXIgUGxheWJhY2sgVm9sdW1lICovCisJaW50IGFuYWxvZ19jYXB0dXJlX3ZvbHVtZVsyXTsJCS8qIE1peGVyIDogTWFzdGVyIENhcHR1cmUgVm9sdW1lICovCisJaW50IGRpZ2l0YWxfcGxheWJhY2tfYWN0aXZlWzIqTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVNdWzJdOwkvKiBNaXhlciA6IERpZ2l0YWwgUGxheWJhY2sgQWN0aXZlIFsoYW5hbG9nK0FFUyBvdXRwdXQpKnN0cmVhbXNdW3N0ZXJlb10qLworCWludCBkaWdpdGFsX3BsYXliYWNrX3ZvbHVtZVsyKk1JWEFSVF9QTEFZQkFDS19TVFJFQU1TXVsyXTsJLyogTWl4ZXIgOiBEaWdpdGFsIFBsYXliYWNrIFZvbHVtZSBbKGFuYWxvZytBRVMgb3V0cHV0KSpzdHJlYW1zXVtzdGVyZW9dKi8KKwlpbnQgZGlnaXRhbF9jYXB0dXJlX3ZvbHVtZVsyXVsyXTsJLyogTWl4ZXIgOiBEaWdpdGFsIENhcHR1cmUgVm9sdW1lIFthbmFsb2crQUVTIG91dHB1dF1bc3RlcmVvXSAqLworCWludCBtb25pdG9yaW5nX2FjdGl2ZVsyXTsJCS8qIE1peGVyIDogTW9uaXRvcmluZyBBY3RpdmUgKi8KKwlpbnQgbW9uaXRvcmluZ192b2x1bWVbMl07CQkvKiBNaXhlciA6IE1vbml0b3JpbmcgVm9sdW1lICovCit9OworCitzdHJ1Y3QgbWl4YXJ0X2J1ZmZlcmluZm8KK3sKKwl1MzIgYnVmZmVyX2FkZHJlc3M7CisJdTMyIHJlc2VydmVkWzVdOworCXUzMiBhdmFpbGFibGVfbGVuZ3RoOworCXUzMiBidWZmZXJfaWQ7Cit9OworCitzdHJ1Y3QgbWl4YXJ0X2Zsb3dpbmZvCit7CisJdTMyIGJ1ZmZlcmluZm9fYXJyYXlfcGh5X2FkZHJlc3M7CisJdTMyIHJlc2VydmVkWzExXTsKKwl1MzIgYnVmZmVyaW5mb19jb3VudDsKKwl1MzIgY2FwdHVyZTsKK307CisKKy8qIGV4cG9ydGVkICovCitpbnQgc25kX21peGFydF9jcmVhdGVfcGNtKG1peGFydF90KiBjaGlwKTsKK21peGFydF9waXBlX3QqIHNuZF9taXhhcnRfYWRkX3JlZl9waXBlKCBtaXhhcnRfdCAqY2hpcCwgaW50IHBjbV9udW1iZXIsIGludCBjYXB0dXJlLCBpbnQgbW9uaXRvcmluZyk7CitpbnQgc25kX21peGFydF9raWxsX3JlZl9waXBlKCBtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X3BpcGVfdCAqcGlwZSwgaW50IG1vbml0b3JpbmcpOworCisjZW5kaWYgLyogX19TT1VORF9NSVhBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDAyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiBEcml2ZXIgZm9yIERpZ2lncmFtIG1pWGFydCBzb3VuZGNhcmRzCisgKgorICogbG93IGxldmVsIGludGVyZmFjZSB3aXRoIGludGVycnVwdCBoYW5kbGluZyBhbmQgbWFpbCBib3ggaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgRGlnaWdyYW0gPGFsc2FAZGlnaWdyYW0uY29tPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgIm1peGFydC5oIgorI2luY2x1ZGUgIm1peGFydF9od2RlcC5oIgorI2luY2x1ZGUgIm1peGFydF9jb3JlLmgiCisKKworI2RlZmluZSBNU0dfVElNRU9VVF9KSUZGSUVTICAgICAgICAgKDQwMCAqIEhaKSAvIDEwMDAgLyogNDAwIG1zICovCisKKyNkZWZpbmUgTVNHX0RFU0NSSVBUT1JfU0laRSAgICAgICAgIDB4MjQKKyNkZWZpbmUgTVNHX0hFQURFUl9TSVpFICAgICAgICAgICAgIChNU0dfREVTQ1JJUFRPUl9TSVpFICsgNCkKKworI2RlZmluZSBNU0dfREVGQVVMVF9TSVpFICAgICAgICAgICAgNTEyCisKKyNkZWZpbmUgTVNHX1RZUEVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDMgICAgLyogbWFzayBmb3IgZm9sbG93aW5nIHR5cGVzICovCisjZGVmaW5lIE1TR19UWVBFX05PVElGWSAgICAgICAgICAgICAwICAgICAgICAgICAgIC8qIGVtYmVkZGVkIC0+IGRyaXZlciAob25seSBub3RpZmljYXRpb24sIGRvIG5vdCBnZXRfbXNnKCkgISkgKi8KKyNkZWZpbmUgTVNHX1RZUEVfQ09NTUFORCAgICAgICAgICAgIDEgICAgICAgICAgICAgLyogZHJpdmVyIDwtPiBlbWJlZGRlZCAoYSBjb21tYW5kIGhhcyBubyBhbnN3ZXIpICovCisjZGVmaW5lIE1TR19UWVBFX1JFUVVFU1QgICAgICAgICAgICAyICAgICAgICAgICAgIC8qIGRyaXZlciAtPiBlbWJlZGRlZCAocmVxdWVzdCB3aWxsIGdldCBhbiBhbnN3ZXIgYmFjaykgKi8KKyNkZWZpbmUgTVNHX1RZUEVfQU5TV0VSICAgICAgICAgICAgIDMgICAgICAgICAgICAgLyogZW1iZWRkZWQgLT4gZHJpdmVyICovCisjZGVmaW5lIE1TR19DQU5DRUxfTk9USUZZX01BU0sgICAgICAweDgwMDAwMDAwICAgIC8qIHRoaXMgYml0IGlzIHNldCBmb3IgYSBub3RpZmljYXRpb24gdGhhdCBoYXMgYmVlbiBjYW5jZWxlZCAqLworCisKK3N0YXRpYyBpbnQgcmV0cmlldmVfbXNnX2ZyYW1lKG1peGFydF9tZ3JfdCAqbWdyLCB1MzIgKm1zZ19mcmFtZSkKK3sKKwkvKiByZWFkIHRoZSBtZXNzYWdlIGZyYW1lIGZpZm8gKi8KKwl1MzIgaGVhZHB0ciwgdGFpbHB0cjsKKworCXRhaWxwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX09VVEJPVU5EX1BPU1RfVEFJTCkpOworCWhlYWRwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX09VVEJPVU5EX1BPU1RfSEVBRCkpOworCisJaWYgKHRhaWxwdHIgPT0gaGVhZHB0cikKKwkJcmV0dXJuIDA7IC8qIG5vIG1lc3NhZ2UgcG9zdGVkICovCisKKwlzbmRfYXNzZXJ0KCB0YWlscHRyID49IE1TR19PVVRCT1VORF9QT1NUX1NUQUNLLCByZXR1cm4gMCk7IC8qIGVycm9yICovCisJc25kX2Fzc2VydCggdGFpbHB0ciA8IChNU0dfT1VUQk9VTkRfUE9TVF9TVEFDSytNU0dfQk9VTkRfU1RBQ0tfU0laRSksIHJldHVybiAwKTsgLyogZXJyb3IgKi8KKworCSptc2dfZnJhbWUgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgdGFpbHB0cikpOworCisJLyogaW5jcmVtZW50IHRoZSB0YWlsIGluZGV4ICovCisJdGFpbHB0ciArPSA0OworCWlmKCB0YWlscHRyID49IChNU0dfT1VUQk9VTkRfUE9TVF9TVEFDSytNU0dfQk9VTkRfU1RBQ0tfU0laRSkgKQorCQl0YWlscHRyID0gTVNHX09VVEJPVU5EX1BPU1RfU1RBQ0s7CisJd3JpdGVsX2JlKHRhaWxwdHIsIE1JWEFSVF9NRU0obWdyLCBNU0dfT1VUQk9VTkRfUE9TVF9UQUlMKSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfbXNnKG1peGFydF9tZ3JfdCAqbWdyLCBtaXhhcnRfbXNnX3QgKnJlc3AsIHUzMiBtc2dfZnJhbWVfYWRkcmVzcyApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgIGhlYWRwdHI7CisJdTMyICBzaXplOworCWludCAgZXJyOworI2lmbmRlZiBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgaTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bXNnX2xvY2ssIGZsYWdzKTsKKwllcnIgPSAwOworCisJLyogY29weSBtZXNzYWdlIGRlc2NyaXB0b3IgZnJvbSBtaVhhcnQgdG8gZHJpdmVyICovCisJc2l6ZSAgICAgICAgICAgICAgICA9ICByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgbXNnX2ZyYW1lX2FkZHJlc3MpKTsgICAgICAgLyogc2l6ZSBvZiBkZXNjcmlwdG9yICsgcmVzcG9uc2UgKi8KKwlyZXNwLT5tZXNzYWdlX2lkICAgID0gIHJlYWRsX2JlKE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcyArIDQpKTsgICAvKiBkd01lc3NhZ2VJRCAqLworCXJlc3AtPnVpZC5vYmplY3RfaWQgPSAgcmVhZGxfYmUoTUlYQVJUX01FTShtZ3IsIG1zZ19mcmFtZV9hZGRyZXNzICsgOCkpOyAgIC8qIHVpZERlc3QgKi8KKwlyZXNwLT51aWQuZGVzYyAgICAgID0gIHJlYWRsX2JlKE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcyArIDEyKSk7ICAvKiAqLworCisJaWYoIChzaXplIDwgTVNHX0RFU0NSSVBUT1JfU0laRSkgfHwgKHJlc3AtPnNpemUgPCAoc2l6ZSAtIE1TR19ERVNDUklQVE9SX1NJWkUpKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwcm9ibGVtIHdpdGggcmVzcG9uc2Ugc2l6ZSA9ICVkXG4iLCBzaXplKTsKKwkJZ290byBfY2xlYW5fZXhpdDsKKwl9CisJc2l6ZSAtPSBNU0dfREVTQ1JJUFRPUl9TSVpFOworCisJbWVtY3B5X2Zyb21pbyhyZXNwLT5kYXRhLCBNSVhBUlRfTUVNKG1nciwgbXNnX2ZyYW1lX2FkZHJlc3MgKyBNU0dfSEVBREVSX1NJWkUgKSwgc2l6ZSk7CisJcmVzcC0+c2l6ZSA9IHNpemU7CisKKwkvKiBzd2FwIGlmIG5lY2Vzc2FyeSAqLworI2lmbmRlZiBfX0JJR19FTkRJQU4KKwlzaXplIC89IDQ7IC8qIHUzMiBzaXplICovCisJZm9yKGk9MDsgaSA8IHNpemU7IGkrKykgeworCQkoKHUzMiopcmVzcC0+ZGF0YSlbaV0gPSBiZTMyX3RvX2NwdSgoKHUzMiopcmVzcC0+ZGF0YSlbaV0pOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBmcmVlIG1lc3NhZ2UgZnJhbWUgYWRkcmVzcworCSAqLworCWhlYWRwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX09VVEJPVU5EX0ZSRUVfSEVBRCkpOworCisJaWYoIChoZWFkcHRyIDwgTVNHX09VVEJPVU5EX0ZSRUVfU1RBQ0spIHx8ICggaGVhZHB0ciA+PSAoTVNHX09VVEJPVU5EX0ZSRUVfU1RBQ0srTVNHX0JPVU5EX1NUQUNLX1NJWkUpKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIF9jbGVhbl9leGl0OworCX0KKworCS8qIGdpdmUgYWRkcmVzcyBiYWNrIHRvIG91dGJvdW5kIGZpZm8gKi8KKwl3cml0ZWxfYmUobXNnX2ZyYW1lX2FkZHJlc3MsIE1JWEFSVF9NRU0obWdyLCBoZWFkcHRyKSk7CisKKwkvKiBpbmNyZW1lbnQgdGhlIG91dGJvdW5kIGZyZWUgaGVhZCAqLworCWhlYWRwdHIgKz0gNDsKKwlpZiggaGVhZHB0ciA+PSAoTVNHX09VVEJPVU5EX0ZSRUVfU1RBQ0srTVNHX0JPVU5EX1NUQUNLX1NJWkUpICkKKwkJaGVhZHB0ciA9IE1TR19PVVRCT1VORF9GUkVFX1NUQUNLOworCisJd3JpdGVsX2JlKGhlYWRwdHIsIE1JWEFSVF9NRU0obWdyLCBNU0dfT1VUQk9VTkRfRlJFRV9IRUFEKSk7CisKKyBfY2xlYW5fZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZ3ItPm1zZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBzZW5kIGEgbWVzc2FnZSB0byBtaVhhcnQuIHJldHVybjogdGhlIG1zZ19mcmFtZSB1c2VkIGZvciB0aGlzIG1lc3NhZ2UKKyAqLworLyogY2FsbCB3aXRoIG1nci0+bXNnX2xvY2sgaGVsZCEgKi8KK3N0YXRpYyBpbnQgc2VuZF9tc2coIG1peGFydF9tZ3JfdCAqbWdyLAorCQkgICAgIG1peGFydF9tc2dfdCAqbXNnLAorCQkgICAgIGludCBtYXhfYW5zd2Vyc2l6ZSwKKwkJICAgICBpbnQgbWFya19wZW5kaW5nLAorCQkgICAgIHUzMiAqbXNnX2V2ZW50KQoreworCXUzMiBoZWFkcHRyLCB0YWlscHRyOworCXUzMiBtc2dfZnJhbWVfYWRkcmVzczsKKwlpbnQgZXJyLCBpOworCisJc25kX2Fzc2VydChtc2ctPnNpemUgJSA0ID09IDAsIHJldHVybiAtRUlOVkFMKTsKKworCWVyciA9IDA7CisKKwkvKiBnZXQgbWVzc2FnZSBmcmFtZSBhZGRyZXNzICovCisJdGFpbHB0ciA9IHJlYWRsX2JlKE1JWEFSVF9NRU0obWdyLCBNU0dfSU5CT1VORF9GUkVFX1RBSUwpKTsKKwloZWFkcHRyID0gcmVhZGxfYmUoTUlYQVJUX01FTShtZ3IsIE1TR19JTkJPVU5EX0ZSRUVfSEVBRCkpOworCisJaWYgKHRhaWxwdHIgPT0gaGVhZHB0cikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvcjogbm8gbWVzc2FnZSBmcmFtZSBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmKCAodGFpbHB0ciA8IE1TR19JTkJPVU5EX0ZSRUVfU1RBQ0spIHx8ICh0YWlscHRyID49IChNU0dfSU5CT1VORF9GUkVFX1NUQUNLK01TR19CT1VORF9TVEFDS19TSVpFKSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnX2ZyYW1lX2FkZHJlc3MgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgdGFpbHB0cikpOworCXdyaXRlbCgwLCBNSVhBUlRfTUVNKG1nciwgdGFpbHB0cikpOyAvKiBzZXQgYWRkcmVzcyB0byB6ZXJvIG9uIHRoaXMgZmlmbyBwb3NpdGlvbiAqLworCisJLyogaW5jcmVtZW50IHRoZSBpbmJvdW5kIGZyZWUgdGFpbCAqLworCXRhaWxwdHIgKz0gNDsKKwlpZiggdGFpbHB0ciA+PSAoTVNHX0lOQk9VTkRfRlJFRV9TVEFDSytNU0dfQk9VTkRfU1RBQ0tfU0laRSkgKQorCQl0YWlscHRyID0gTVNHX0lOQk9VTkRfRlJFRV9TVEFDSzsKKworCXdyaXRlbF9iZSh0YWlscHRyLCBNSVhBUlRfTUVNKG1nciwgTVNHX0lOQk9VTkRfRlJFRV9UQUlMKSk7CisKKwkvKiBUT0RPIDogdXNlIG1lbWNweV90b2lvKCkgd2l0aCBpbnRlcm1lZGlhdGUgYnVmZmVyIHRvIGNvcHkgdGhlIG1lc3NhZ2UgKi8KKworCS8qIGNvcHkgbWVzc2FnZSBkZXNjcmlwdG9yIHRvIGNhcmQgbWVtb3J5ICovCisJd3JpdGVsX2JlKCBtc2ctPnNpemUgKyBNU0dfREVTQ1JJUFRPUl9TSVpFLCAgICAgIE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcykgKTsgICAgICAvKiBzaXplIG9mIGRlc2NyaXB0b3IgKyByZXF1ZXN0ICovCisJd3JpdGVsX2JlKCBtc2ctPm1lc3NhZ2VfaWQgLCAgICAgICAgICAgICAgICAgICAgIE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcyArIDQpICk7ICAvKiBkd01lc3NhZ2VJRCAqLworCXdyaXRlbF9iZSggbXNnLT51aWQub2JqZWN0X2lkLCAgICAgICAgICAgICAgICAgICBNSVhBUlRfTUVNKG1nciwgbXNnX2ZyYW1lX2FkZHJlc3MgKyA4KSApOyAgLyogdWlkRGVzdCAqLworCXdyaXRlbF9iZSggbXNnLT51aWQuZGVzYywgICAgICAgICAgICAgICAgICAgICAgICBNSVhBUlRfTUVNKG1nciwgbXNnX2ZyYW1lX2FkZHJlc3MgKyAxMikgKTsgLyogKi8KKwl3cml0ZWxfYmUoIE1TR19ERVNDUklQVE9SX1NJWkUsICAgICAgICAgICAgICAgICAgTUlYQVJUX01FTShtZ3IsIG1zZ19mcmFtZV9hZGRyZXNzICsgMTYpICk7IC8qIFNpemVIZWFkZXIgKi8KKwl3cml0ZWxfYmUoIE1TR19ERVNDUklQVE9SX1NJWkUsICAgICAgICAgICAgICAgICAgTUlYQVJUX01FTShtZ3IsIG1zZ19mcmFtZV9hZGRyZXNzICsgMjApICk7IC8qIE9mZnNldERMTF9UMTYgKi8KKwl3cml0ZWxfYmUoIG1zZy0+c2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYQVJUX01FTShtZ3IsIG1zZ19mcmFtZV9hZGRyZXNzICsgMjQpICk7IC8qIFNpemVETExfVDE2ICovCisJd3JpdGVsX2JlKCBNU0dfREVTQ1JJUFRPUl9TSVpFLCAgICAgICAgICAgICAgICAgIE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcyArIDI4KSApOyAvKiBPZmZzZXRETExfRFJWICovCisJd3JpdGVsX2JlKCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWEFSVF9NRU0obWdyLCBtc2dfZnJhbWVfYWRkcmVzcyArIDMyKSApOyAvKiBTaXplRExMX0RSViAqLworCXdyaXRlbF9iZSggTVNHX0RFU0NSSVBUT1JfU0laRSArIG1heF9hbnN3ZXJzaXplLCBNSVhBUlRfTUVNKG1nciwgbXNnX2ZyYW1lX2FkZHJlc3MgKyAzNikgKTsgLyogZHdFeHBlY3RlZEFuc3dlclNpemUgKi8KKworCS8qIGNvcHkgbWVzc2FnZSBkYXRhIHRvIGNhcmQgbWVtb3J5ICovCisJZm9yKCBpPTA7IGkgPCBtc2ctPnNpemU7IGkrPTQgKSB7CisJCXdyaXRlbF9iZSggKih1MzIqKShtc2ctPmRhdGEgKyBpKSwgTUlYQVJUX01FTShtZ3IsIE1TR19IRUFERVJfU0laRSArIG1zZ19mcmFtZV9hZGRyZXNzICsgaSkgICk7CisJfQorCisJaWYoIG1hcmtfcGVuZGluZyApIHsKKwkJaWYoICptc2dfZXZlbnQgKSB7CisJCQkvKiB0aGUgcGVuZGluZyBldmVudCBpcyB0aGUgbm90aWZpY2F0aW9uIHdlIHdhaXQgZm9yICEgKi8KKwkJCW1nci0+cGVuZGluZ19ldmVudCA9ICptc2dfZXZlbnQ7CisJCX0KKwkJZWxzZSB7CisJCQkvKiB0aGUgcGVuZGluZyBldmVudCBpcyB0aGUgYW5zd2VyIHdlIHdhaXQgZm9yIChzYW1lIGFkZHJlc3MgdGhhbiB0aGUgcmVxdWVzdCkhICovCisJCQltZ3ItPnBlbmRpbmdfZXZlbnQgPSBtc2dfZnJhbWVfYWRkcmVzczsKKworCQkJLyogY29weSBhZGRyZXNzIGJhY2sgdG8gY2FsbGVyICovCisJCQkqbXNnX2V2ZW50ID0gbXNnX2ZyYW1lX2FkZHJlc3M7CisJCX0KKwl9CisKKwkvKiBtYXJrIHRoZSBmcmFtZSBhcyBhIHJlcXVlc3QgKHdpbGwgaGF2ZSBhbiBhbnN3ZXIpICovCisJbXNnX2ZyYW1lX2FkZHJlc3MgfD0gTVNHX1RZUEVfUkVRVUVTVDsKKworCS8qIHBvc3QgdGhlIGZyYW1lICovCisJaGVhZHB0ciA9IHJlYWRsX2JlKE1JWEFSVF9NRU0obWdyLCBNU0dfSU5CT1VORF9QT1NUX0hFQUQpKTsKKworCWlmKCAoaGVhZHB0ciA8IE1TR19JTkJPVU5EX1BPU1RfU1RBQ0spIHx8IChoZWFkcHRyID49IChNU0dfSU5CT1VORF9QT1NUX1NUQUNLK01TR19CT1VORF9TVEFDS19TSVpFKSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JpdGVsX2JlKG1zZ19mcmFtZV9hZGRyZXNzLCBNSVhBUlRfTUVNKG1nciwgaGVhZHB0cikpOworCisJLyogaW5jcmVtZW50IHRoZSBpbmJvdW5kIHBvc3QgaGVhZCAqLworCWhlYWRwdHIgKz0gNDsKKwlpZiggaGVhZHB0ciA+PSAoTVNHX0lOQk9VTkRfUE9TVF9TVEFDSytNU0dfQk9VTkRfU1RBQ0tfU0laRSkgKQorCQloZWFkcHRyID0gTVNHX0lOQk9VTkRfUE9TVF9TVEFDSzsKKworCXdyaXRlbF9iZShoZWFkcHRyLCBNSVhBUlRfTUVNKG1nciwgTVNHX0lOQk9VTkRfUE9TVF9IRUFEKSk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgc25kX21peGFydF9zZW5kX21zZyhtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X21zZ190ICpyZXF1ZXN0LCBpbnQgbWF4X3Jlc3Bfc2l6ZSwgdm9pZCAqcmVzcF9kYXRhKQoreworCW1peGFydF9tc2dfdCByZXNwOworCXUzMiBtc2dfZnJhbWUgPSAwOyAvKiBzZXQgdG8gMCwgc28gaXQncyBubyBub3RpZmljYXRpb24gdG8gd2FpdCBmb3IsIGJ1dCB0aGUgYW5zd2VyICovCisJaW50IGVycjsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwlsb25nIHRpbWVvdXQ7CisKKwlkb3duKCZtZ3ItPm1zZ19tdXRleCk7CisKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisKKwlzcGluX2xvY2tfaXJxKCZtZ3ItPm1zZ19sb2NrKTsKKwkvKiBzZW5kIHRoZSBtZXNzYWdlICovCisJZXJyID0gc2VuZF9tc2cobWdyLCByZXF1ZXN0LCBtYXhfcmVzcF9zaXplLCAxLCAmbXNnX2ZyYW1lKTsgIC8qIHNlbmQgYW5kIG1hcmsgdGhlIGFuc3dlciBwZW5kaW5nICovCisJaWYgKGVycikgeworCQlzcGluX3VubG9ja19pcnEoJm1nci0+bXNnX2xvY2spOworCQl1cCgmbWdyLT5tc2dfbXV0ZXgpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmbWdyLT5tc2dfc2xlZXAsICZ3YWl0KTsKKwlzcGluX3VubG9ja19pcnEoJm1nci0+bXNnX2xvY2spOworCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KE1TR19USU1FT1VUX0pJRkZJRVMpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZtZ3ItPm1zZ19zbGVlcCwgJndhaXQpOworCisJaWYgKCEgdGltZW91dCkgeworCQkvKiBlcnJvciAtIG5vIGFjayAqLworCQl1cCgmbWdyLT5tc2dfbXV0ZXgpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvcjogbm8gcmVwb25zZSBvbiBtc2cgJXhcbiIsIG1zZ19mcmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJldHJpZXZlIHRoZSBhbnN3ZXIgaW50byB0aGUgc2FtZSBtaXhhcnRfbXNnX3QgKi8KKwlyZXNwLm1lc3NhZ2VfaWQgPSAwOworCXJlc3AudWlkID0gKG1peGFydF91aWRfdCl7MCwwfTsKKwlyZXNwLmRhdGEgPSByZXNwX2RhdGE7CisJcmVzcC5zaXplID0gbWF4X3Jlc3Bfc2l6ZTsKKworCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnX2ZyYW1lKTsKKworCWlmKCByZXF1ZXN0LT5tZXNzYWdlX2lkICE9IHJlc3AubWVzc2FnZV9pZCApCisJCXNuZF9wcmludGsoS0VSTl9FUlIgIlJFUE9OU0UgRVJST1IhXG4iKTsKKworCXVwKCZtZ3ItPm1zZ19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworCitpbnQgc25kX21peGFydF9zZW5kX21zZ193YWl0X25vdGlmKG1peGFydF9tZ3JfdCAqbWdyLCBtaXhhcnRfbXNnX3QgKnJlcXVlc3QsIHUzMiBub3RpZl9ldmVudCkKK3sKKwlpbnQgZXJyOworCXdhaXRfcXVldWVfdCB3YWl0OworCWxvbmcgdGltZW91dDsKKworCXNuZF9hc3NlcnQobm90aWZfZXZlbnQgIT0gMCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF9hc3NlcnQoKG5vdGlmX2V2ZW50ICYgTVNHX1RZUEVfTUFTSykgPT0gTVNHX1RZUEVfTk9USUZZLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydCgobm90aWZfZXZlbnQgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisKKwlkb3duKCZtZ3ItPm1zZ19tdXRleCk7CisKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisKKwlzcGluX2xvY2tfaXJxKCZtZ3ItPm1zZ19sb2NrKTsKKwkvKiBzZW5kIHRoZSBtZXNzYWdlICovCisJZXJyID0gc2VuZF9tc2cobWdyLCByZXF1ZXN0LCBNU0dfREVGQVVMVF9TSVpFLCAxLCAmbm90aWZfZXZlbnQpOyAgLyogc2VuZCBhbmQgbWFyayB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHBlbmRpbmcgKi8KKwlpZihlcnIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtZ3ItPm1zZ19sb2NrKTsKKwkJdXAoJm1nci0+bXNnX211dGV4KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJm1nci0+bXNnX3NsZWVwLCAmd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZtZ3ItPm1zZ19sb2NrKTsKKwl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dChNU0dfVElNRU9VVF9KSUZGSUVTKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmbWdyLT5tc2dfc2xlZXAsICZ3YWl0KTsKKworCWlmICghIHRpbWVvdXQpIHsKKwkJLyogZXJyb3IgLSBubyBhY2sgKi8KKwkJdXAoJm1nci0+bXNnX211dGV4KTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3I6IG5vdGlmaWNhdGlvbiAleCBub3QgcmVjZWl2ZWRcbiIsIG5vdGlmX2V2ZW50KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdXAoJm1nci0+bXNnX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgc25kX21peGFydF9zZW5kX21zZ19ub25ibG9jayhtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X21zZ190ICpyZXF1ZXN0KQoreworCXUzMiBtZXNzYWdlX2ZyYW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCS8qIGp1c3Qgc2VuZCB0aGUgbWVzc2FnZSAoZG8gbm90IG1hcmsgaXQgYXMgYSBwZW5kaW5nIG9uZSkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWdyLT5tc2dfbG9jaywgZmxhZ3MpOworCWVyciA9IHNlbmRfbXNnKG1nciwgcmVxdWVzdCwgTVNHX0RFRkFVTFRfU0laRSwgMCwgJm1lc3NhZ2VfZnJhbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1nci0+bXNnX2xvY2ssIGZsYWdzKTsKKworCS8qIHRoZSBhbnN3ZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHNuZF9taXhhcnRfbXNnX3Rhc2tsZXQoKSAgKi8KKwlhdG9taWNfaW5jKCZtZ3ItPm1zZ19wcm9jZXNzZWQpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKiBjb21tb24gYnVmZmVyIG9mIHRhc2tsZXQgYW5kIGludGVycnVwdCB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMgKi8KK3N0YXRpYyB1MzIgbWl4YXJ0X21zZ19kYXRhW01TR19ERUZBVUxUX1NJWkUgLyA0XTsKKworCit2b2lkIHNuZF9taXhhcnRfbXNnX3Rhc2tsZXQoIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1peGFydF9tZ3JfdCAqbWdyID0gKCBtaXhhcnRfbWdyX3QqKShhcmcpOworCW1peGFydF9tc2dfdCByZXNwOworCXUzMiBtc2csIGFkZHIsIHR5cGU7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmbWdyLT5sb2NrKTsKKworCXdoaWxlIChtZ3ItPm1zZ19maWZvX3JlYWRwdHIgIT0gbWdyLT5tc2dfZmlmb193cml0ZXB0cikgeworCQltc2cgPSBtZ3ItPm1zZ19maWZvW21nci0+bXNnX2ZpZm9fcmVhZHB0cl07CisJCW1nci0+bXNnX2ZpZm9fcmVhZHB0cisrOworCQltZ3ItPm1zZ19maWZvX3JlYWRwdHIgJT0gTVNHX0ZJRk9fU0laRTsKKworCQkvKiBwcm9jZXNzIHRoZSBtZXNzYWdlIC4uLiAqLworCQlhZGRyID0gbXNnICYgfk1TR19UWVBFX01BU0s7CisJCXR5cGUgPSBtc2cgJiBNU0dfVFlQRV9NQVNLOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE1TR19UWVBFX0FOU1dFUjoKKwkJCS8qIGFuc3dlciB0byBhIG1lc3NhZ2Ugb24gdGhhdCB3ZSBkaWQgbm90IHdhaXQgZm9yIChzZW5kX21zZ19ub25ibG9jaykgKi8KKwkJCXJlc3AubWVzc2FnZV9pZCA9IDA7CisJCQlyZXNwLmRhdGEgPSBtaXhhcnRfbXNnX2RhdGE7CisJCQlyZXNwLnNpemUgPSBzaXplb2YobWl4YXJ0X21zZ19kYXRhKTsKKwkJCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgYWRkcik7CisJCQlpZiggZXJyIDwgMCApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0YXNrbGV0OiBlcnJvciglZCkgcmVhZGluZyBtZiAleFxuIiwgZXJyLCBtc2cpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzd2l0Y2gocmVzcC5tZXNzYWdlX2lkKSB7CisJCQljYXNlIE1TR19TVFJFQU1fU1RBUlRfSU5QVVRfU1RBR0VfUEFDS0VUOgorCQkJY2FzZSBNU0dfU1RSRUFNX1NUQVJUX09VVFBVVF9TVEFHRV9QQUNLRVQ6CisJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9JTlBVVF9TVEFHRV9QQUNLRVQ6CisJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUOgorCQkJCWlmKG1peGFydF9tc2dfZGF0YVswXSkKKwkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsIG1peGFydF9tc2dfZGF0YVswXSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNuZF9wcmludGRkKCJ0YXNrbGV0IHJlY2VpdmVkIG1mKCV4KSA6IG1zZ19pZCgleCkgdWlkKCV4LCAleCkgc2l6ZSglemQpXG4iLAorCQkJCQkgICBtc2csIHJlc3AubWVzc2FnZV9pZCwgcmVzcC51aWQub2JqZWN0X2lkLCByZXNwLnVpZC5kZXNjLCByZXNwLnNpemUpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisgCQljYXNlIE1TR19UWVBFX05PVElGWToKKwkJCS8qIG1zZyBjb250YWlucyBubyBhZGRyZXNzICEgZG8gbm90IGdldF9tc2coKSAhICovCisJCWNhc2UgTVNHX1RZUEVfQ09NTUFORDoKKwkJCS8qIGdldF9tc2coKSBuZWNlc3NhcnkgKi8KKwkJZGVmYXVsdDoKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgInRhc2tsZXQgZG9lc24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBtZXNzYWdlICV4XG4iLCBtc2cpOworCQl9IC8qIHN3aXRjaCB0eXBlICovCisKKwkJLyogZGVjcmVtZW50IGNvdW50ZXIgKi8KKwkJYXRvbWljX2RlYygmbWdyLT5tc2dfcHJvY2Vzc2VkKTsKKworCX0gLyogd2hpbGUgdGhlcmUgaXMgYSBtc2cgaW4gZmlmbyAqLworCisJc3Bpbl91bmxvY2soJm1nci0+bG9jayk7Cit9CisKKworaXJxcmV0dXJuX3Qgc25kX21peGFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwltaXhhcnRfbWdyX3QgKm1nciA9IGRldl9pZDsKKwlpbnQgZXJyOworCW1peGFydF9tc2dfdCByZXNwOworCisJdTMyIG1zZzsKKwl1MzIgaXRfcmVnOworCisJc3Bpbl9sb2NrKCZtZ3ItPmxvY2spOworCisJaXRfcmVnID0gcmVhZGxfbGUoTUlYQVJUX1JFRyhtZ3IsIE1JWEFSVF9QQ0lfT01JU1JfT0ZGU0VUKSk7CisJaWYoICEoaXRfcmVnICYgTUlYQVJUX09JREkpICkgeworCQkvKiB0aGlzIGRldmljZSBkaWQgbm90IGNhdXNlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJc3Bpbl91bmxvY2soJm1nci0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsX2xlKE1JWEFSVF9IT1NUX0FMTF9JTlRFUlJVUFRfTUFTS0VELCBNSVhBUlRfUkVHKG1nciwgTUlYQVJUX1BDSV9PTUlNUl9PRkZTRVQpKTsKKworCS8qIG91dGRvb3JiZWxsIHJlZ2lzdGVyIGNsZWFyICovCisJaXRfcmVnID0gcmVhZGwoTUlYQVJUX1JFRyhtZ3IsIE1JWEFSVF9QQ0lfT0RCUl9PRkZTRVQpKTsKKwl3cml0ZWwoaXRfcmVnLCBNSVhBUlRfUkVHKG1nciwgTUlYQVJUX1BDSV9PREJSX09GRlNFVCkpOworCisJLyogY2xlYXIgaW50ZXJydXB0ICovCisJd3JpdGVsX2xlKCBNSVhBUlRfT0lESSwgTUlYQVJUX1JFRyhtZ3IsIE1JWEFSVF9QQ0lfT01JU1JfT0ZGU0VUKSApOworCisJLyogcHJvY2VzcyBpbnRlcnJ1cHQgKi8KKwl3aGlsZSAocmV0cmlldmVfbXNnX2ZyYW1lKG1nciwgJm1zZykpIHsKKworCQlzd2l0Y2ggKG1zZyAmIE1TR19UWVBFX01BU0spIHsKKwkJY2FzZSBNU0dfVFlQRV9DT01NQU5EOgorCQkJcmVzcC5tZXNzYWdlX2lkID0gMDsKKwkJCXJlc3AuZGF0YSA9IG1peGFydF9tc2dfZGF0YTsKKwkJCXJlc3Auc2l6ZSA9IHNpemVvZihtaXhhcnRfbXNnX2RhdGEpOworCQkJZXJyID0gZ2V0X21zZyhtZ3IsICZyZXNwLCBtc2cgJiB+TVNHX1RZUEVfTUFTSyk7CisJCQlpZiggZXJyIDwgMCApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLCBlcnIsIG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmKHJlc3AubWVzc2FnZV9pZCA9PSBNU0dfU0VSVklDRVNfVElNRVJfTk9USUZZKSB7CisJCQkJaW50IGk7CisJCQkJbWl4YXJ0X3RpbWVyX25vdGlmeV90ICpub3RpZnkgPSAobWl4YXJ0X3RpbWVyX25vdGlmeV90KiltaXhhcnRfbXNnX2RhdGE7CisKKwkJCQlmb3IoaT0wOyBpPG5vdGlmeS0+c3RyZWFtX2NvdW50OyBpKyspIHsKKworCQkJCQl1MzIgYnVmZmVyX2lkID0gbm90aWZ5LT5zdHJlYW1zW2ldLmJ1ZmZlcl9pZDsKKwkJCQkJdW5zaWduZWQgaW50IGNoaXBfbnVtYmVyID0gIChidWZmZXJfaWQgJiBNSVhBUlRfTk9USUZZX0NBUkRfTUFTSykgPj4gTUlYQVJUX05PVElGWV9DQVJEX09GRlNFVDsgLyogY2FyZDAgdG8gMyAqLworCQkJCQl1bnNpZ25lZCBpbnQgcGNtX251bWJlciAgPSAgKGJ1ZmZlcl9pZCAmIE1JWEFSVF9OT1RJRllfUENNX01BU0sgKSA+PiBNSVhBUlRfTk9USUZZX1BDTV9PRkZTRVQ7ICAvKiBwY20wIHRvIDMgICovCisJCQkJCXVuc2lnbmVkIGludCBzdWJfbnVtYmVyICA9ICAgYnVmZmVyX2lkICYgTUlYQVJUX05PVElGWV9TVUJTX01BU0s7ICAgICAgICAgICAgIC8qIDAgdG8gTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKi8KKwkJCQkJdW5zaWduZWQgaW50IGlzX2NhcHR1cmUgID0gKChidWZmZXJfaWQgJiBNSVhBUlRfTk9USUZZX0NBUFRfTUFTSykgIT0gMCk7ICAgICAgLyogcGxheWJhY2sgPT0gMCAvIGNhcHR1cmUgPT0gMSAqLworCisJCQkJCW1peGFydF90ICpjaGlwICA9IG1nci0+Y2hpcFtjaGlwX251bWJlcl07CisJCQkJCW1peGFydF9zdHJlYW1fdCAqc3RyZWFtOworCisJCQkJCWlmICgoY2hpcF9udW1iZXIgPj0gbWdyLT5udW1fY2FyZHMpIHx8IChwY21fbnVtYmVyID49IE1JWEFSVF9QQ01fVE9UQUwpIHx8IChzdWJfbnVtYmVyID49IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TKSkgeworCQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAorCQkJCQkJCSAgIGJ1ZmZlcl9pZCwgbm90aWZ5LT5zdHJlYW1zW2ldLnNhbXBsZV9wb3NfbG93X3BhcnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAoaXNfY2FwdHVyZSkKKwkJCQkJCXN0cmVhbSA9ICZjaGlwLT5jYXB0dXJlX3N0cmVhbVtwY21fbnVtYmVyXTsKKwkJCQkJZWxzZQorCQkJCQkJc3RyZWFtID0gJmNoaXAtPnBsYXliYWNrX3N0cmVhbVtwY21fbnVtYmVyXVtzdWJfbnVtYmVyXTsKKworCQkJCQlpZiAoc3RyZWFtLT5zdWJzdHJlYW0gJiYgKHN0cmVhbS0+c3RhdHVzID09IE1JWEFSVF9TVFJFQU1fU1RBVFVTX1JVTk5JTkcpKSB7CisJCQkJCQlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN0cmVhbS0+c3Vic3RyZWFtLT5ydW50aW1lOworCQkJCQkJaW50IGVsYXBzZWQgPSAwOworCQkJCQkJdTY0IHNhbXBsZV9jb3VudCA9ICgodTY0KW5vdGlmeS0+c3RyZWFtc1tpXS5zYW1wbGVfcG9zX2hpZ2hfcGFydCkgPDwgMzI7CisJCQkJCQlzYW1wbGVfY291bnQgfD0gbm90aWZ5LT5zdHJlYW1zW2ldLnNhbXBsZV9wb3NfbG93X3BhcnQ7CisKKwkJCQkJCXdoaWxlICgxKSB7CisJCQkJCQkJdTY0IG5ld19lbGFwc2VfcG9zID0gc3RyZWFtLT5hYnNfcGVyaW9kX2VsYXBzZWQgKyAgcnVudGltZS0+cGVyaW9kX3NpemU7CisKKwkJCQkJCQlpZiAobmV3X2VsYXBzZV9wb3MgPiBzYW1wbGVfY291bnQpIHsKKwkJCQkJCQkJYnJlYWs7IC8qIHdoaWxlICovCisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQllbGFwc2VkID0gMTsKKwkJCQkJCQkJc3RyZWFtLT5idWZfcGVyaW9kcysrOworCQkJCQkJCQlpZiAoc3RyZWFtLT5idWZfcGVyaW9kcyA+PSBydW50aW1lLT5wZXJpb2RzKQorCQkJCQkJCQkJc3RyZWFtLT5idWZfcGVyaW9kcyA9IDA7CisKKwkJCQkJCQkJc3RyZWFtLT5hYnNfcGVyaW9kX2VsYXBzZWQgPSBuZXdfZWxhcHNlX3BvczsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlzdHJlYW0tPmJ1Zl9wZXJpb2RfZnJhZyA9ICh1MzIpKCBzYW1wbGVfY291bnQgLSBzdHJlYW0tPmFic19wZXJpb2RfZWxhcHNlZCApOworCisJCQkJCQlpZihlbGFwc2VkKSB7CisJCQkJCQkJc3Bpbl91bmxvY2soJm1nci0+bG9jayk7CisJCQkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdHJlYW0tPnN1YnN0cmVhbSk7CisJCQkJCQkJc3Bpbl9sb2NrKCZtZ3ItPmxvY2spOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYocmVzcC5tZXNzYWdlX2lkID09IE1TR19TRVJWSUNFU19SRVBPUlRfVFJBQ0VTKSB7CisJCQkJaWYocmVzcC5zaXplID4gMSkgeworI2lmbmRlZiBfX0JJR19FTkRJQU4KKwkJCQkJLyogVHJhY2VzIGFyZSB0ZXh0OiB0aGUgc3dhcHBlZCBtc2dfZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBiYWNrICEgKi8KKwkJCQkJaW50IGk7CisJCQkJCWZvcihpPTA7IGk8KHJlc3Auc2l6ZS80KTsgaSsrKSB7CisJCQkJCQkobWl4YXJ0X21zZ19kYXRhKVtpXSA9IGNwdV90b19iZTMyKChtaXhhcnRfbXNnX2RhdGEpW2ldKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCSgoY2hhciopbWl4YXJ0X21zZ19kYXRhKVtyZXNwLnNpemUgLSAxXSA9IDA7CisJCQkJCXNuZF9wcmludGRkKCJNSVhBUlQgVFJBQ0UgOiAlc1xuIiwgKGNoYXIqKW1peGFydF9tc2dfZGF0YSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlzbmRfcHJpbnRkZCgiY29tbWFuZCAleCBub3QgaGFuZGxlZFxuIiwgcmVzcC5tZXNzYWdlX2lkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX1RZUEVfTk9USUZZOgorCQkJaWYobXNnICYgTVNHX0NBTkNFTF9OT1RJRllfTUFTSykgeworCQkJCW1zZyAmPSB+TVNHX0NBTkNFTF9OT1RJRllfTUFTSzsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5jZWxlZCBub3RpZmljYXRpb24gJXggIVxuIiwgbXNnKTsKKwkJCX0KKwkJCS8qIG5vIGJyZWFrLCBjb250aW51ZSAhICovCisJCWNhc2UgTVNHX1RZUEVfQU5TV0VSOgorCQkJLyogYW5zd2VyIG9yIG5vdGlmaWNhdGlvbiB0byBhIG1lc3NhZ2Ugd2UgYXJlIHdhaXRpbmcgZm9yKi8KKwkJCXNwaW5fbG9jaygmbWdyLT5tc2dfbG9jayk7CisJCQlpZiggKG1zZyAmIH5NU0dfVFlQRV9NQVNLKSA9PSBtZ3ItPnBlbmRpbmdfZXZlbnQgKSB7CisJCQkJd2FrZV91cCgmbWdyLT5tc2dfc2xlZXApOworCQkJCW1nci0+cGVuZGluZ19ldmVudCA9IDA7CisJCQl9CisJCQkvKiBhbnN3ZXIgdG8gYSBtZXNzYWdlIHdlIGRpZCd0IHdhbnQgdG8gd2FpdCBmb3IgKi8KKwkJCWVsc2UgeworCQkJCW1nci0+bXNnX2ZpZm9bbWdyLT5tc2dfZmlmb193cml0ZXB0cl0gPSBtc2c7CisJCQkJbWdyLT5tc2dfZmlmb193cml0ZXB0cisrOworCQkJCW1nci0+bXNnX2ZpZm9fd3JpdGVwdHIgJT0gTVNHX0ZJRk9fU0laRTsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZtZ3ItPm1zZ190YXNrcSk7CisJCQl9CisJCQlzcGluX3VubG9jaygmbWdyLT5tc2dfbG9jayk7CisJCQlicmVhazsKKwkJY2FzZSBNU0dfVFlQRV9SRVFVRVNUOgorCQlkZWZhdWx0OgorCQkJc25kX3ByaW50ZGQoImludGVycnVwdCByZWNlaXZlZCByZXF1ZXN0ICV4XG4iLCBtc2cpOworCQkJLyogVE9ETyA6IGFyZSB0aGVyZSB0aGluZ3MgdG8gZG8gaGVyZSA/ICovCisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggb24gbXNnIHR5cGUgKi8KKwl9IC8qIHdoaWxlIHRoZXJlIGFyZSBtc2dzICovCisKKwkvKiBhbGxvdyBpbnRlcnJ1cHQgYWdhaW4gKi8KKwl3cml0ZWxfbGUoIE1JWEFSVF9BTExPV19PVVRCT1VORF9ET09SQkVMTCwgTUlYQVJUX1JFRyggbWdyLCBNSVhBUlRfUENJX09NSU1SX09GRlNFVCkpOworCisJc3Bpbl91bmxvY2soJm1nci0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKwordm9pZCBzbmRfbWl4YXJ0X2luaXRfbWFpbGJveChtaXhhcnRfbWdyX3QgKm1ncikKK3sKKwl3cml0ZWwoIDAsIE1JWEFSVF9NRU0oIG1nciwgTVNHX0hPU1RfUlNDX1BST1RFQ1RJT04gKSApOworCXdyaXRlbCggMCwgTUlYQVJUX01FTSggbWdyLCBNU0dfQUdFTlRfUlNDX1BST1RFQ1RJT04gKSApOworCisJLyogYWxsb3cgb3V0Ym91bmQgbWVzc2FnZWJveCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzICovCisJaWYobWdyLT5pcnEgPj0gMCkgeworCQl3cml0ZWxfbGUoIE1JWEFSVF9BTExPV19PVVRCT1VORF9ET09SQkVMTCwgTUlYQVJUX1JFRyggbWdyLCBNSVhBUlRfUENJX09NSU1SX09GRlNFVCkpOworCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgc25kX21peGFydF9leGl0X21haWxib3gobWl4YXJ0X21ncl90ICptZ3IpCit7CisJLyogbm8gbW9yZSBpbnRlcnJ1cHRzIG9uIG91dGJvdW5kIG1lc3NhZ2Vib3ggKi8KKwl3cml0ZWxfbGUoIE1JWEFSVF9IT1NUX0FMTF9JTlRFUlJVUFRfTUFTS0VELCBNSVhBUlRfUkVHKCBtZ3IsIE1JWEFSVF9QQ0lfT01JTVJfT0ZGU0VUKSk7CisJcmV0dXJuOworfQorCit2b2lkIHNuZF9taXhhcnRfcmVzZXRfYm9hcmQobWl4YXJ0X21ncl90ICptZ3IpCit7CisJLyogcmVzZXQgbWlYYXJ0ICovCisJd3JpdGVsX2JlKCAxLCBNSVhBUlRfUkVHKG1nciwgTUlYQVJUX0JBMV9CUlVUQUxfUkVTRVRfT0ZGU0VUKSApOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuaCBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ1MGViCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5oCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogRHJpdmVyIGZvciBEaWdpZ3JhbSBtaVhhcnQgc291bmRjYXJkcworICoKKyAqIGxvdyBsZXZlbCBpbnRlcmZhY2Ugd2l0aCBpbnRlcnJ1cHQgaGFuZGxpbmcgYW5kIG1haWwgYm94IGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IERpZ2lncmFtIDxhbHNhQGRpZ2lncmFtLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX01JWEFSVF9DT1JFX0gKKyNkZWZpbmUgX19TT1VORF9NSVhBUlRfQ09SRV9ICisKKworZW51bSBtaXhhcnRfbWVzc2FnZV9pZCB7CisJTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTyAgICAgICAgID0gMHgwNTAwMDgsCisJTVNHX0NPTk5FQ1RPUl9HRVRfT1VUX0FVRElPX0xFVkVMICAgID0gMHgwNTAwMDksCisJTVNHX0NPTk5FQ1RPUl9TRVRfT1VUX0FVRElPX0xFVkVMICAgID0gMHgwNTAwMEEsCisKKwlNU0dfQ09OU09MRV9NQU5BR0VSICAgICAgICAgICAgICAgICAgPSAweDA3MDAwMCwKKwlNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEICAgICAgICAgICAgPSAweDA3MDAwMywKKworCU1TR19QSFlTSUNBTElPX1NFVF9MRVZFTCAgICAgICAgICAgICA9IDB4MEYwMDA4LAorCisJTVNHX1NUUkVBTV9BRERfSU5QVVRfR1JPVVAgICAgICAgICAgID0gMHgxMzAwMDAsCisJTVNHX1NUUkVBTV9BRERfT1VUUFVUX0dST1VQICAgICAgICAgID0gMHgxMzAwMDEsCisJTVNHX1NUUkVBTV9ERUxFVEVfR1JPVVAgICAgICAgICAgICAgID0gMHgxMzAwMDQsCisJTVNHX1NUUkVBTV9TVEFSVF9TVFJFQU1fR1JQX1BBQ0tFVCAgID0gMHgxMzAwMDYsCisJTVNHX1NUUkVBTV9TVEFSVF9JTlBVVF9TVEFHRV9QQUNLRVQgID0gMHgxMzAwMDcsCisJTVNHX1NUUkVBTV9TVEFSVF9PVVRQVVRfU1RBR0VfUEFDS0VUID0gMHgxMzAwMDgsCisJTVNHX1NUUkVBTV9TVE9QX1NUUkVBTV9HUlBfUEFDS0VUICAgID0gMHgxMzAwMDksCisJTVNHX1NUUkVBTV9TVE9QX0lOUFVUX1NUQUdFX1BBQ0tFVCAgID0gMHgxMzAwMEEsCisJTVNHX1NUUkVBTV9TVE9QX09VVFBVVF9TVEFHRV9QQUNLRVQgID0gMHgxMzAwMEIsCisJTVNHX1NUUkVBTV9TRVRfSU5QVVRfU1RBR0VfUEFSQU0gICAgID0gMHgxMzAwMEYsCisJTVNHX1NUUkVBTV9TRVRfT1VUUFVUX1NUQUdFX1BBUkFNICAgID0gMHgxMzAwMTAsCisJTVNHX1NUUkVBTV9TRVRfSU5fQVVESU9fTEVWRUwgICAgICAgID0gMHgxMzAwMTUsCisJTVNHX1NUUkVBTV9TRVRfT1VUX1NUUkVBTV9MRVZFTCAgICAgID0gMHgxMzAwMTcsCisKKwlNU0dfU1lTVEVNX0ZJUlNUX0lEICAgICAgICAgICAgICAgICAgPSAweDE2MDAwMCwKKwlNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gICAgICAgICAgPSAweDE2MDAwRSwKKwlNU0dfU1lTVEVNX0VOVU1fUExBWV9DT05ORUNUT1IgICAgICAgPSAweDE2MDAxNywKKwlNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUiAgICAgPSAweDE2MDAxOCwKKwlNU0dfU1lTVEVNX1dBSVRfU1lOQ0hST19DTUQgICAgICAgICAgPSAweDE2MDAyQywKKwlNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgICAgICAgICAgPSAweDE2MDAyRCwKKworCU1TR19TRVJWSUNFU19USU1FUl9OT1RJRlkgICAgICAgICAgICA9IDB4MUQwNDA0LAorCU1TR19TRVJWSUNFU19SRVBPUlRfVFJBQ0VTICAgICAgICAgICA9IDB4MUQwNzAwLAorCisJTVNHX0NMT0NLX0NIRUNLX1BST1BFUlRJRVMgICAgICAgICAgID0gMHgyMDAwMDEsCisJTVNHX0NMT0NLX1NFVF9QUk9QRVJUSUVTICAgICAgICAgICAgID0gMHgyMDAwMDIsCit9OworCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9tc2cgbWl4YXJ0X21zZ190Oworc3RydWN0IG1peGFydF9tc2cKK3sKKwl1MzIgICAgICAgICAgbWVzc2FnZV9pZDsKKwltaXhhcnRfdWlkX3QgdWlkOworCXZvaWQqICAgICAgICBkYXRhOworCXNpemVfdCAgICAgICBzaXplOworfTsKKworLyogc3RydWN0cyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggbWlYYXJ0ICovCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9lbnVtX2Nvbm5lY3Rvcl9yZXNwIG1peGFydF9lbnVtX2Nvbm5lY3Rvcl9yZXNwX3Q7CitzdHJ1Y3QgbWl4YXJ0X2VudW1fY29ubmVjdG9yX3Jlc3AKK3sKKwl1MzIgIGVycm9yX2NvZGU7CisJdTMyICBmaXJzdF91aWRfb2Zmc2V0OworCXUzMiAgdWlkX2NvdW50OworCXUzMiAgY3VycmVudF91aWRfaW5kZXg7CisJbWl4YXJ0X3VpZF90IHVpZFtNSVhBUlRfTUFYX1BIWVNfQ09OTkVDVE9SU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIHVzZWQgZm9yIGZvbGxvd2luZyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTUlYQVJUX0ZMT0FUX1BfMjJfMF9UT19IRVggICAgICAweDQxYjAwMDAwICAvKiAyMi4wZiAqLworI2RlZmluZSBNSVhBUlRfRkxPQVRfTV8yMF8wX1RPX0hFWCAgICAgIDB4YzFhMDAwMDAgIC8qIC0yMC4wZiAqLworI2RlZmluZSBNSVhBUlRfRkxPQVRfX19fMF8wX1RPX0hFWCAgICAgIDB4MDAwMDAwMDAgIC8qIDAuMGYgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2F1ZGlvX2luZm9fcmVxIG1peGFydF9hdWRpb19pbmZvX3JlcV90Oworc3RydWN0IG1peGFydF9hdWRpb19pbmZvX3JlcQoreworCXUzMiBsaW5lX21heF9sZXZlbDsgICAgLyogZmxvYXQgKi8KKwl1MzIgbWljcm9fbWF4X2xldmVsOyAgIC8qIGZsb2F0ICovCisJdTMyIGNkX21heF9sZXZlbDsgICAgICAvKiBmbG9hdCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2FuYWxvZ19od19pbmZvIG1peGFydF9hbmFsb2dfaHdfaW5mb190Oworc3RydWN0IG1peGFydF9hbmFsb2dfaHdfaW5mbworeworCXUzMiBpc19wcmVzZW50OworCXUzMiBod19jb25uZWN0aW9uX3R5cGU7CisJdTMyIG1heF9sZXZlbDsgICAgICAgICAvKiBmbG9hdCAqLworCXUzMiBtaW5fdmFyX2xldmVsOyAgICAgLyogZmxvYXQgKi8KKwl1MzIgbWF4X3Zhcl9sZXZlbDsgICAgIC8qIGZsb2F0ICovCisJdTMyIHN0ZXBfdmFyX2xldmVsOyAgICAvKiBmbG9hdCAqLworCXUzMiBmaXhfZ2FpbjsgICAgICAgICAgLyogZmxvYXQgKi8KKwl1MzIgemVyb192YXI7ICAgICAgICAgIC8qIGZsb2F0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfZGlnaXRhbF9od19pbmZvIG1peGFydF9kaWdpdGFsX2h3X2luZm9fdDsKK3N0cnVjdCBtaXhhcnRfZGlnaXRhbF9od19pbmZvCit7CisJdTMyICAgaHdfY29ubmVjdGlvbl90eXBlOworCXUzMiAgIHByZXNlbmNlOworCXUzMiAgIGNsb2NrOworCXUzMiAgIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2FuYWxvZ19pbmZvIG1peGFydF9hbmFsb2dfaW5mb190Oworc3RydWN0IG1peGFydF9hbmFsb2dfaW5mbworeworCXUzMiAgICAgICAgICAgICAgICAgICAgIHR5cGVfbWFzazsKKwltaXhhcnRfYW5hbG9nX2h3X2luZm9fdCBtaWNyb19pbmZvOworCW1peGFydF9hbmFsb2dfaHdfaW5mb190IGxpbmVfaW5mbzsKKwltaXhhcnRfYW5hbG9nX2h3X2luZm9fdCBjZF9pbmZvOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGFuYWxvZ19sZXZlbF9wcmVzZW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2RpZ2l0YWxfaW5mbyBtaXhhcnRfZGlnaXRhbF9pbmZvX3Q7CitzdHJ1Y3QgbWl4YXJ0X2RpZ2l0YWxfaW5mbworeworCXUzMiB0eXBlX21hc2s7CisJbWl4YXJ0X2RpZ2l0YWxfaHdfaW5mb190IGFlc19pbmZvOworCW1peGFydF9kaWdpdGFsX2h3X2luZm9fdCBhZGF0X2luZm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfYXVkaW9faW5mbyBtaXhhcnRfYXVkaW9faW5mb190Oworc3RydWN0IG1peGFydF9hdWRpb19pbmZvCit7CisJdTMyICAgICAgICAgICAgICAgICAgIGNsb2NrX3R5cGVfbWFzazsKKwltaXhhcnRfYW5hbG9nX2luZm9fdCAgYW5hbG9nX2luZm87CisJbWl4YXJ0X2RpZ2l0YWxfaW5mb190IGRpZ2l0YWxfaW5mbzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9hdWRpb19pbmZvX3Jlc3AgbWl4YXJ0X2F1ZGlvX2luZm9fcmVzcF90Oworc3RydWN0IG1peGFydF9hdWRpb19pbmZvX3Jlc3AKK3sKKwl1MzIgICAgICAgICAgICAgICAgIHR4eF9zdGF0dXM7CisJbWl4YXJ0X2F1ZGlvX2luZm9fdCBpbmZvOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiB1c2VkIGZvciBuYl9ieXRlc19tYXhfcGVyX3NhbXBsZSAqLworI2RlZmluZSBNSVhBUlRfRkxPQVRfUF9fNF8wX1RPX0hFWCAgICAgIDB4NDA4MDAwMDAgIC8qICs0LjBmICovCisjZGVmaW5lIE1JWEFSVF9GTE9BVF9QX184XzBfVE9fSEVYICAgICAgMHg0MTAwMDAwMCAgLyogKzguMGYgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X3N0cmVhbV9pbmZvIG1peGFydF9zdHJlYW1faW5mb190Oworc3RydWN0IG1peGFydF9zdHJlYW1faW5mbworeworCXUzMiBzaXplX21heF9ieXRlX2ZyYW1lOworCXUzMiBzaXplX21heF9zYW1wbGVfZnJhbWU7CisJdTMyIG5iX2J5dGVzX21heF9wZXJfc2FtcGxlOyAgLyogZmxvYXQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qICBNU0dfU1RSRUFNX0FERF9JTlBVVF9HUk9VUCAqLworLyogIE1TR19TVFJFQU1fQUREX09VVFBVVF9HUk9VUCAqLworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfc3RyZWFtaW5nX2dyb3VwX3JlcSBtaXhhcnRfc3RyZWFtaW5nX2dyb3VwX3JlcV90Oworc3RydWN0IG1peGFydF9zdHJlYW1pbmdfZ3JvdXBfcmVxCit7CisJdTMyIHN0cmVhbV9jb3VudDsKKwl1MzIgY2hhbm5lbF9jb3VudDsKKwl1MzIgdXNlcl9ncnBfbnVtYmVyOworCXUzMiBmaXJzdF9waHlzX2F1ZGlvOworCXUzMiBsYXRlbmN5OworCW1peGFydF9zdHJlYW1faW5mb190IHN0cmVhbV9pbmZvWzMyXTsKKwltaXhhcnRfdWlkX3QgY29ubmVjdG9yOworCXUzMiBmbG93X2VudHJ5WzMyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9zdHJlYW1fZGVzYyBtaXhhcnRfc3RyZWFtX2Rlc2NfdDsKK3N0cnVjdCBtaXhhcnRfc3RyZWFtX2Rlc2MKK3sKKwltaXhhcnRfdWlkX3Qgc3RyZWFtX3VpZDsKKwl1MzIgICAgICAgICAgc3RyZWFtX2Rlc2M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfc3RyZWFtaW5nX2dyb3VwIG1peGFydF9zdHJlYW1pbmdfZ3JvdXBfdDsKK3N0cnVjdCBtaXhhcnRfc3RyZWFtaW5nX2dyb3VwCit7CisJdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOworCW1peGFydF91aWRfdCAgICAgICAgIGdyb3VwOworCXUzMiAgICAgICAgICAgICAgICAgIHBpcGVfZGVzYzsKKwl1MzIgICAgICAgICAgICAgICAgICBzdHJlYW1fY291bnQ7CisJbWl4YXJ0X3N0cmVhbV9kZXNjX3Qgc3RyZWFtWzMyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE1TR19TVFJFQU1fREVMRVRFX0dST1VQICovCisKKy8qIHJlcXVlc3QgOiBtaXhhcnRfdWlkX3QgZ3JvdXAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2RlbGV0ZV9ncm91cF9yZXNwIG1peGFydF9kZWxldGVfZ3JvdXBfcmVzcF90Oworc3RydWN0IG1peGFydF9kZWxldGVfZ3JvdXBfcmVzcAoreworCXUzMiAgc3RhdHVzOworCXUzMiAgdW51c2VkWzJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiAJTVNHX1NUUkVBTV9TVEFSVF9JTlBVVF9TVEFHRV9QQUNLRVQgID0gMHgxMzAwMDAgKyA3LAorCU1TR19TVFJFQU1fU1RBUlRfT1VUUFVUX1NUQUdFX1BBQ0tFVCA9IDB4MTMwMDAwICsgOCwKKwlNU0dfU1RSRUFNX1NUT1BfSU5QVVRfU1RBR0VfUEFDS0VUICAgPSAweDEzMDAwMCArIDEwLAorCU1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUICA9IDB4MTMwMDAwICsgMTEsCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2Z4X2NvdXBsZV91aWQgbWl4YXJ0X2Z4X2NvdXBsZV91aWRfdDsKK3N0cnVjdCBtaXhhcnRfZnhfY291cGxlX3VpZAoreworCW1peGFydF91aWRfdCB1aWRfZnhfY29kZTsKKwltaXhhcnRfdWlkX3QgdWlkX2Z4X2RhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfdHh4X3N0cmVhbV9kZXNjIG1peGFydF90eHhfc3RyZWFtX2Rlc2NfdDsKK3N0cnVjdCBtaXhhcnRfdHh4X3N0cmVhbV9kZXNjCit7CisJbWl4YXJ0X3VpZF90ICAgICAgICAgICAgdWlkX3BpcGU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2lkeDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBmeF9udW1iZXI7CisJbWl4YXJ0X2Z4X2NvdXBsZV91aWRfdCAgdWlkX2Z4WzRdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2Zsb3dfaW5mbyBtaXhhcnRfZmxvd19pbmZvX3Q7CitzdHJ1Y3QgbWl4YXJ0X2Zsb3dfaW5mbworeworCW1peGFydF90eHhfc3RyZWFtX2Rlc2NfdCAgc3RyZWFtX2Rlc2M7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICBmbG93X2VudHJ5OworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgZmxvd19waHlfYWRkcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9zdHJlYW1fc3RhdGVfcmVxIG1peGFydF9zdHJlYW1fc3RhdGVfcmVxX3Q7CitzdHJ1Y3QgbWl4YXJ0X3N0cmVhbV9zdGF0ZV9yZXEKK3sKKwl1MzIgICAgICAgICAgICAgICAgIGRlbGF5ZWQ7CisJdTY0ICAgICAgICAgICAgICAgICBzY2hlZHVsZXI7CisJdTMyICAgICAgICAgICAgICAgICByZXNlcnZlZDRucFszXTsKKwl1MzIgICAgICAgICAgICAgICAgIHN0cmVhbV9jb3VudDsgIC8qIHNldCB0byAxIGZvciBpbnN0YW5jZSAqLworCW1peGFydF9mbG93X2luZm9fdCAgc3RyZWFtX2luZm87ICAgLyogY291bGQgYmUgYW4gYXJyYXlbc3RyZWFtX2NvdW50XSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogCU1TR19TVFJFQU1fU1RBUlRfU1RSRUFNX0dSUF9QQUNLRVQgICA9IDB4MTMwMDAwICsgNgorCU1TR19TVFJFQU1fU1RPUF9TVFJFQU1fR1JQX1BBQ0tFVCAgICA9IDB4MTMwMDAwICsgOQorICovCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9ncm91cF9zdGF0ZV9yZXEgbWl4YXJ0X2dyb3VwX3N0YXRlX3JlcV90Oworc3RydWN0IG1peGFydF9ncm91cF9zdGF0ZV9yZXEKK3sKKwl1MzIgICAgICAgICAgIGRlbGF5ZWQ7CisJdTY0ICAgICAgICAgICBzY2hlZHVsZXI7CisJdTMyICAgICAgICAgICByZXNlcnZlZDRucFsyXTsKKwl1MzIgICAgICAgICAgIHBpcGVfY291bnQ7ICAgIC8qIHNldCB0byAxIGZvciBpbnN0YW5jZSAqLworCW1peGFydF91aWRfdCAgcGlwZV91aWRbMV07ICAgLyogY291bGQgYmUgYW4gYXJyYXlbcGlwZV9jb3VudF0gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9ncm91cF9zdGF0ZV9yZXNwIG1peGFydF9ncm91cF9zdGF0ZV9yZXNwX3Q7CitzdHJ1Y3QgbWl4YXJ0X2dyb3VwX3N0YXRlX3Jlc3AKK3sKKwl1MzIgICAgICAgICAgIHR4eF9zdGF0dXM7CisJdTY0ICAgICAgICAgICBzY2hlZHVsZXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKworLyogU3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBNU0dfU0VSVklDRVNfVElNRVJfTk9USUZZIGNvbW1hbmQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X3NhbXBsZV9wb3MgbWl4YXJ0X3NhbXBsZV9wb3NfdDsKK3N0cnVjdCBtaXhhcnRfc2FtcGxlX3BvcworeworCXUzMiAgIGJ1ZmZlcl9pZDsKKwl1MzIgICB2YWxpZGl0eTsKKwl1MzIgICBzYW1wbGVfcG9zX2hpZ2hfcGFydDsKKwl1MzIgICBzYW1wbGVfcG9zX2xvd19wYXJ0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X3RpbWVyX25vdGlmeSBtaXhhcnRfdGltZXJfbm90aWZ5X3Q7CitzdHJ1Y3QgbWl4YXJ0X3RpbWVyX25vdGlmeQoreworCXUzMiAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb3VudDsKKwltaXhhcnRfc2FtcGxlX3Bvc190ICBzdHJlYW1zW01JWEFSVF9NQVhfU1RSRUFNX1BFUl9DQVJEICogTUlYQVJUX01BWF9DQVJEU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCU1TR19DT05TT0xFX0dFVF9DTE9DS19VSUQgICAgICAgICAgICA9IDB4MDcwMDAzLAorICovCisKKy8qIHJlcXVlc3QgaXMgYSB1aWQgd2l0aCBkZXNjID0gTVNHX0NPTlNPTEVfTUFOQUdFUiB8IGNhcmRpbmRleCAqLworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfcmV0dXJuX3VpZCBtaXhhcnRfcmV0dXJuX3VpZF90Oworc3RydWN0IG1peGFydF9yZXR1cm5fdWlkCit7CisJdTMyIGVycm9yX2NvZGU7CisJbWl4YXJ0X3VpZF90IHVpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCU1TR19DTE9DS19DSEVDS19QUk9QRVJUSUVTICAgICAgICAgICA9IDB4MjAwMDAxLAorCU1TR19DTE9DS19TRVRfUFJPUEVSVElFUyAgICAgICAgICAgICA9IDB4MjAwMDAyLAorKi8KKworZW51bSBtaXhhcnRfY2xvY2tfZ2VuZXJpY190eXBlIHsKKwlDR1RfTk9fQ0xPQ0ssCisJQ0dUX0lOVEVSTkFMX0NMT0NLLAorCUNHVF9QUk9HUkFNTUFCTEVfQ0xPQ0ssCisJQ0dUX0lOVEVSTkFMX0VOU0xBVkVEX0NMT0NLLAorCUNHVF9FWFRFUk5BTF9DTE9DSywKKwlDR1RfQ1VSUkVOVF9DTE9DSworfTsKKworZW51bSBtaXhhcnRfY2xvY2tfbW9kZSB7CisJQ01fVU5ERUZJTkVELAorCUNNX01BU1RFUiwKKwlDTV9TTEFWRSwKKwlDTV9TVEFOREFMT05FLAorCUNNX05PVF9DT05DRVJORUQKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2Nsb2NrX3Byb3BlcnRpZXMgbWl4YXJ0X2Nsb2NrX3Byb3BlcnRpZXNfdDsKK3N0cnVjdCBtaXhhcnRfY2xvY2tfcHJvcGVydGllcworeworCXUzMiBlcnJvcl9jb2RlOworCXUzMiB2YWxpZGF0aW9uX21hc2s7CisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgcmVmZXJlbmNlX2ZyZXF1ZW5jeTsKKwl1MzIgY2xvY2tfZ2VuZXJpY190eXBlOworCXUzMiBjbG9ja19tb2RlOworCW1peGFydF91aWRfdCB1aWRfY2xvY2tfc291cmNlOworCW1peGFydF91aWRfdCB1aWRfZXZlbnRfc291cmNlOworCXUzMiBldmVudF9tb2RlOworCXUzMiBzeW5jaHJvX3NpZ25hbF9wcmVzZW5jZTsKKwl1MzIgZm9ybWF0OworCXUzMiBib2FyZF9tYXNrOworCXUzMiBuYl9jYWxsZXJzOyAvKiBzZXQgdG8gMSAoc2VlIGJlbG93KSAqLworCW1peGFydF91aWRfdCB1aWRfY2FsbGVyWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2Nsb2NrX3Byb3BlcnRpZXNfcmVzcCBtaXhhcnRfY2xvY2tfcHJvcGVydGllc19yZXNwX3Q7CitzdHJ1Y3QgbWl4YXJ0X2Nsb2NrX3Byb3BlcnRpZXNfcmVzcAoreworCXUzMiBzdGF0dXM7CisJdTMyIGNsb2NrX21vZGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCU1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNICAgICA9IDB4MTMwMDBGICovCisvKglNU0dfU1RSRUFNX1NFVF9PVVRQVVRfU1RBR0VfUEFSQU0gICAgPSAweDEzMDAxMCAqLworCitlbnVtIG1peGFydF9jb2RpbmdfdHlwZSB7CisJQ1RfTk9UX0RFRklORUQsCisJQ1RfTElORUFSLAorCUNUX01QRUdfTDEsCisJQ1RfTVBFR19MMiwKKwlDVF9NUEVHX0wzLAorCUNUX01QRUdfTDNfTFNGLAorCUNUX0dTTQorfTsKK2VudW0gbWl4YXJ0X3NhbXBsZV90eXBlIHsKKwlTVF9OT1RfREVGSU5FRCwKKwlTVF9GTE9BVElOR19QT0lOVF8zMkJFLAorCVNUX0ZMT0FUSU5HX1BPSU5UXzMyTEUsCisJU1RfRkxPQVRJTkdfUE9JTlRfNjRCRSwKKwlTVF9GTE9BVElOR19QT0lOVF82NExFLAorCVNUX0ZJWEVEX1BPSU5UXzgsCisJU1RfRklYRURfUE9JTlRfMTZCRSwKKwlTVF9GSVhFRF9QT0lOVF8xNkxFLAorCVNUX0ZJWEVEX1BPSU5UXzI0QkUsCisJU1RfRklYRURfUE9JTlRfMjRMRSwKKwlTVF9GSVhFRF9QT0lOVF8zMkJFLAorCVNUX0ZJWEVEX1BPSU5UXzMyTEUsCisJU1RfSU5URUdFUl84LAorCVNUX0lOVEVHRVJfMTZCRSwKKwlTVF9JTlRFR0VSXzE2TEUsCisJU1RfSU5URUdFUl8yNEJFLAorCVNUX0lOVEVHRVJfMjRMRSwKKwlTVF9JTlRFR0VSXzMyQkUsCisJU1RfSU5URUdFUl8zMkxFCit9OworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfc3RyZWFtX3BhcmFtX2Rlc2MgbWl4YXJ0X3N0cmVhbV9wYXJhbV9kZXNjX3Q7CitzdHJ1Y3QgbWl4YXJ0X3N0cmVhbV9wYXJhbV9kZXNjCit7CisJdTMyIGNvZGluZ190eXBlOyAgLyogdXNlIGVudW0gbWl4YXJ0X2NvZGluZ190eXBlICovCisJdTMyIHNhbXBsZV90eXBlOyAgLyogdXNlIGVudW0gbWl4YXJ0X3NhbXBsZV90eXBlICovCisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgbGluZWFyX2VuZGlhbl9uZXNzOworCQkJdTMyIGxpbmVhcl9iaXRzOworCQkJdTMyIGlzX3NpZ25lZDsKKwkJCXUzMiBpc19mbG9hdDsKKwkJfSBsaW5lYXJfZm9ybWF0X2luZm87CisKKwkJc3RydWN0IHsKKwkJCXUzMiBtcGVnX2xheWVyOworCQkJdTMyIG1wZWdfbW9kZTsKKwkJCXUzMiBtcGVnX21vZGVfZXh0ZW5zaW9uOworCQkJdTMyIG1wZWdfcHJlX2VtcGhhc2lzOworCQkJdTMyIG1wZWdfaGFzX3BhZGRpbmdfYml0OworCQkJdTMyIG1wZWdfaGFzX2NyYzsKKwkJCXUzMiBtcGVnX2hhc19leHRlbnNpb247CisJCQl1MzIgbXBlZ19pc19vcmlnaW5hbDsKKwkJCXUzMiBtcGVnX2hhc19jb3B5cmlnaHQ7CisJCX0gbXBlZ19mb3JtYXRfaW5mbzsKKwl9IGZvcm1hdF9pbmZvOworCisJdTMyIGRlbGF5ZWQ7CisJdTY0IHNjaGVkdWxlcjsKKwl1MzIgc2FtcGxlX3NpemU7CisJdTMyIGhhc19oZWFkZXI7CisJdTMyIGhhc19zdWZmaXg7CisJdTMyIGhhc19iaXRyYXRlOworCXUzMiBzYW1wbGVzX3Blcl9mcmFtZTsKKwl1MzIgYnl0ZXNfcGVyX2ZyYW1lOworCXUzMiBieXRlc19wZXJfc2FtcGxlOworCXUzMiBzYW1wbGluZ19mcmVxOworCXUzMiBudW1iZXJfb2ZfY2hhbm5lbDsKKwl1MzIgc3RyZWFtX251bWJlcjsKKwl1MzIgYnVmZmVyX3NpemU7CisJdTMyIGRpZmZlcmVkX3RpbWU7CisJdTMyIHJlc2VydmVkNG5wWzNdOworCXUzMiBwaXBlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIChhcnJheSBzaXplICEpICovCisJdTMyIHN0cmVhbV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgKGFycmF5IHNpemUgISkgKi8KKwltaXhhcnRfdHh4X3N0cmVhbV9kZXNjX3Qgc3RyZWFtX2Rlc2NbMV07ICAvKiBvbmx5IG9uZSBzdHJlYW0gcGVyIGNvbW1hbmQsIGJ1dCB0aGlzIGNvdWxkIGJlIGFuIGFycmF5ICovCisKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoJTVNHX0NPTk5FQ1RPUl9HRVRfT1VUX0FVRElPX0xFVkVMICAgID0gMHgwNTAwMDksCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfZ2V0X291dF9hdWRpb19sZXZlbCBtaXhhcnRfZ2V0X291dF9hdWRpb19sZXZlbF90Oworc3RydWN0IG1peGFydF9nZXRfb3V0X2F1ZGlvX2xldmVsCit7CisJdTMyIHR4eF9zdGF0dXM7CisJdTMyIGRpZ2l0YWxfbGV2ZWw7ICAgLyogZmxvYXQgKi8KKwl1MzIgYW5hbG9nX2xldmVsOyAgICAvKiBmbG9hdCAqLworCXUzMiBtb25pdG9yX2xldmVsOyAgIC8qIGZsb2F0ICovCisJdTMyIG11dGU7CisJdTMyIG1vbml0b3JfbXV0ZTE7CisJdTMyIG1vbml0b3JfbXV0ZTI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCU1TR19DT05ORUNUT1JfU0VUX09VVF9BVURJT19MRVZFTCAgICA9IDB4MDUwMDBBLAorICovCisKKy8qIHVzZWQgZm9yIHZhbGlkX21hc2sgYmVsb3cgKi8KKyNkZWZpbmUgTUlYQVJUX0FVRElPX0xFVkVMX0FOQUxPR19NQVNLCTB4MDEKKyNkZWZpbmUgTUlYQVJUX0FVRElPX0xFVkVMX0RJR0lUQUxfTUFTSwkweDAyCisjZGVmaW5lIE1JWEFSVF9BVURJT19MRVZFTF9NT05JVE9SX01BU0sJMHgwNAorI2RlZmluZSBNSVhBUlRfQVVESU9fTEVWRUxfTVVURV9NQVNLCTB4MDgKKyNkZWZpbmUgTUlYQVJUX0FVRElPX0xFVkVMX01VVEVfTTFfTUFTSwkweDEwCisjZGVmaW5lIE1JWEFSVF9BVURJT19MRVZFTF9NVVRFX00yX01BU0sJMHgyMAorCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfc2V0X291dF9hdWRpb19sZXZlbCBtaXhhcnRfc2V0X291dF9hdWRpb19sZXZlbF90Oworc3RydWN0IG1peGFydF9zZXRfb3V0X2F1ZGlvX2xldmVsCit7CisJdTMyIGRlbGF5ZWQ7CisJdTY0IHNjaGVkdWxlcjsKKwl1MzIgdmFsaWRfbWFzazE7CisJdTMyIHZhbGlkX21hc2syOworCXUzMiBkaWdpdGFsX2xldmVsOyAgIC8qIGZsb2F0ICovCisJdTMyIGFuYWxvZ19sZXZlbDsgICAgLyogZmxvYXQgKi8KKwl1MzIgbW9uaXRvcl9sZXZlbDsgICAvKiBmbG9hdCAqLworCXUzMiBtdXRlOworCXUzMiBtb25pdG9yX211dGUxOworCXUzMiBtb25pdG9yX211dGUyOworCXUzMiByZXNlcnZlZDRucDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoJTVNHX1NZU1RFTV9FTlVNX1BIWVNJQ0FMX0lPICAgICAgICAgID0gMHgxNjAwMEUsCisgKi8KKworI2RlZmluZSBNSVhBUlRfTUFYX1BIWVNfSU8gIChNSVhBUlRfTUFYX0NBUkRTICogMiAqIDIpIC8qIDQgKiAoYW5hbG9nK2RpZ2l0YWwpICogKHBsYXliYWNrK2NhcHR1cmUpICovCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF91aWRfZW51bWVyYXRpb24gbWl4YXJ0X3VpZF9lbnVtZXJhdGlvbl90Oworc3RydWN0IG1peGFydF91aWRfZW51bWVyYXRpb24KK3sKKwl1MzIgZXJyb3JfY29kZTsKKwl1MzIgZmlyc3RfdWlkX29mZnNldDsKKwl1MzIgbmJfdWlkOworCXUzMiBjdXJyZW50X3VpZF9pbmRleDsKKwltaXhhcnRfdWlkX3QgdWlkW01JWEFSVF9NQVhfUEhZU19JT107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCU1TR19QSFlTSUNBTElPX1NFVF9MRVZFTCAgICAgICAgICAgICA9IDB4MEYwMDA4LAorCU1TR19QSFlTSUNBTElPX0dFVF9MRVZFTCAgICAgICAgICAgICA9IDB4MEYwMDBDLAorKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2lvX2NoYW5uZWxfbGV2ZWwgbWl4YXJ0X2lvX2NoYW5uZWxfbGV2ZWxfdDsKK3N0cnVjdCBtaXhhcnRfaW9fY2hhbm5lbF9sZXZlbAoreworCXUzMiBhbmFsb2dfbGV2ZWw7ICAgLyogZmxvYXQgKi8KKwl1MzIgdW51c2VkWzJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X2lvX2xldmVsIG1peGFydF9pb19sZXZlbF90Oworc3RydWN0IG1peGFydF9pb19sZXZlbAoreworCXMzMiBjaGFubmVsOyAvKiAwPWxlZnQsIDE9cmlnaHQsIC0xPWJvdGgsIC0yPWJvdGggc2FtZSAqLworCW1peGFydF9pb19jaGFubmVsX2xldmVsX3QgbGV2ZWxbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCU1TR19TVFJFQU1fU0VUX0lOX0FVRElPX0xFVkVMICAgICAgICA9IDB4MTMwMDE1LAorICovCisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9pbl9hdWRpb19sZXZlbF9pbmZvIG1peGFydF9pbl9hdWRpb19sZXZlbF9pbmZvX3Q7CitzdHJ1Y3QgbWl4YXJ0X2luX2F1ZGlvX2xldmVsX2luZm8KK3sKKwltaXhhcnRfdWlkX3QgY29ubmVjdG9yOworCXUzMiB2YWxpZF9tYXNrMTsKKwl1MzIgdmFsaWRfbWFzazI7CisJdTMyIGRpZ2l0YWxfbGV2ZWw7CisJdTMyIGFuYWxvZ19sZXZlbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IG1peGFydF9zZXRfaW5fYXVkaW9fbGV2ZWxfcmVxIG1peGFydF9zZXRfaW5fYXVkaW9fbGV2ZWxfcmVxX3Q7CitzdHJ1Y3QgbWl4YXJ0X3NldF9pbl9hdWRpb19sZXZlbF9yZXEKK3sKKwl1MzIgZGVsYXllZDsKKwl1NjQgc2NoZWR1bGVyOworCXUzMiBhdWRpb19jb3VudDsgIC8qIHNldCB0byA8PSAyICovCisJdTMyIHJlc2VydmVkNG5wOworCW1peGFydF9pbl9hdWRpb19sZXZlbF9pbmZvX3QgbGV2ZWxbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiByZXNwb25zZSBpcyBhIDMyIGJpdCBzdGF0dXMgKi8KKworCisvKglNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMICAgICAgPSAweDEzMDAxNywKKyAqLworCisvKiBkZWZpbmVzIHVzZWQgZm9yIHZhbGlkX21hc2sxICovCisjZGVmaW5lIE1JWEFSVF9PVVRfU1RSRUFNX1NFVF9MRVZFTF9MRUZUX0FVRElPMQkJMHgwMQorI2RlZmluZSBNSVhBUlRfT1VUX1NUUkVBTV9TRVRfTEVWRUxfTEVGVF9BVURJTzIJCTB4MDIKKyNkZWZpbmUgTUlYQVJUX09VVF9TVFJFQU1fU0VUX0xFVkVMX1JJR0hUX0FVRElPMQkweDA0CisjZGVmaW5lIE1JWEFSVF9PVVRfU1RSRUFNX1NFVF9MRVZFTF9SSUdIVF9BVURJTzIJMHgwOAorI2RlZmluZSBNSVhBUlRfT1VUX1NUUkVBTV9TRVRfTEVWRUxfU1RSRUFNXzEJCTB4MTAKKyNkZWZpbmUgTUlYQVJUX09VVF9TVFJFQU1fU0VUX0xFVkVMX1NUUkVBTV8yCQkweDIwCisjZGVmaW5lIE1JWEFSVF9PVVRfU1RSRUFNX1NFVF9MRVZFTF9NVVRFXzEJCTB4NDAKKyNkZWZpbmUgTUlYQVJUX09VVF9TVFJFQU1fU0VUX0xFVkVMX01VVEVfMgkJMHg4MAorCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfb3V0X3N0cmVhbV9sZXZlbF9pbmZvIG1peGFydF9vdXRfc3RyZWFtX2xldmVsX2luZm9fdDsKK3N0cnVjdCBtaXhhcnRfb3V0X3N0cmVhbV9sZXZlbF9pbmZvCit7CisJdTMyIHZhbGlkX21hc2sxOworCXUzMiB2YWxpZF9tYXNrMjsKKwl1MzIgbGVmdF90b19vdXQxX2xldmVsOworCXUzMiBsZWZ0X3RvX291dDJfbGV2ZWw7CisJdTMyIHJpZ2h0X3RvX291dDFfbGV2ZWw7CisJdTMyIHJpZ2h0X3RvX291dDJfbGV2ZWw7CisJdTMyIGRpZ2l0YWxfbGV2ZWwxOworCXUzMiBkaWdpdGFsX2xldmVsMjsKKwl1MzIgbXV0ZTE7CisJdTMyIG11dGUyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4YXJ0X3NldF9vdXRfc3RyZWFtX2xldmVsIG1peGFydF9zZXRfb3V0X3N0cmVhbV9sZXZlbF90Oworc3RydWN0IG1peGFydF9zZXRfb3V0X3N0cmVhbV9sZXZlbAoreworCW1peGFydF90eHhfc3RyZWFtX2Rlc2NfdCBkZXNjOworCW1peGFydF9vdXRfc3RyZWFtX2xldmVsX2luZm9fdCBvdXRfbGV2ZWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCBtaXhhcnRfc2V0X291dF9zdHJlYW1fbGV2ZWxfcmVxIG1peGFydF9zZXRfb3V0X3N0cmVhbV9sZXZlbF9yZXFfdDsKK3N0cnVjdCBtaXhhcnRfc2V0X291dF9zdHJlYW1fbGV2ZWxfcmVxCit7CisJdTMyIGRlbGF5ZWQ7CisJdTY0IHNjaGVkdWxlcjsKKwl1MzIgcmVzZXJ2ZWQ0bnBbMl07CisJdTMyIG5iX29mX3N0cmVhbTsgIC8qIHNldCB0byAxICovCisJbWl4YXJ0X3NldF9vdXRfc3RyZWFtX2xldmVsX3Qgc3RyZWFtX2xldmVsOyAvKiBjb3VsZCBiZSBhbiBhcnJheSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogcmVzcG9uc2UgdG8gdGhpcyByZXF1ZXN0IGlzIGEgdTMyIHN0YXR1cyB2YWx1ZSAqLworCisKKy8qIGV4cG9ydGVkICovCit2b2lkIHNuZF9taXhhcnRfaW5pdF9tYWlsYm94KG1peGFydF9tZ3JfdCAqbWdyKTsKK3ZvaWQgc25kX21peGFydF9leGl0X21haWxib3gobWl4YXJ0X21ncl90ICptZ3IpOworCitpbnQgIHNuZF9taXhhcnRfc2VuZF9tc2cobWl4YXJ0X21ncl90ICptZ3IsIG1peGFydF9tc2dfdCAqcmVxdWVzdCwgaW50IG1heF9yZXNwX3NpemUsIHZvaWQgKnJlc3BfZGF0YSk7CitpbnQgIHNuZF9taXhhcnRfc2VuZF9tc2dfd2FpdF9ub3RpZihtaXhhcnRfbWdyX3QgKm1nciwgbWl4YXJ0X21zZ190ICpyZXF1ZXN0LCB1MzIgbm90aWZfZXZlbnQpOworaW50ICBzbmRfbWl4YXJ0X3NlbmRfbXNnX25vbmJsb2NrKG1peGFydF9tZ3JfdCAqbWdyLCBtaXhhcnRfbXNnX3QgKnJlcXVlc3QpOworCitpcnFyZXR1cm5fdCBzbmRfbWl4YXJ0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgc25kX21peGFydF9tc2dfdGFza2xldCggdW5zaWduZWQgbG9uZyBhcmcpOworCit2b2lkIHNuZF9taXhhcnRfcmVzZXRfYm9hcmQobWl4YXJ0X21ncl90ICptZ3IpOworCisjZW5kaWYgLyogX19TT1VORF9NSVhBUlRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQxNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwpAQCAtMCwwICsxLDY0NyBAQAorLyoKKyAqIERyaXZlciBmb3IgRGlnaWdyYW0gbWlYYXJ0IHNvdW5kY2FyZHMKKyAqCisgKiBEU1AgZmlybXdhcmUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBieSBEaWdpZ3JhbSA8YWxzYUBkaWdpZ3JhbS5jb20+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJtaXhhcnQuaCIKKyNpbmNsdWRlICJtaXhhcnRfbWl4ZXIuaCIKKyNpbmNsdWRlICJtaXhhcnRfY29yZS5oIgorI2luY2x1ZGUgIm1peGFydF9od2RlcC5oIgorCisKKy8qKgorICogd2FpdCBmb3IgYSB2YWx1ZSBvbiBhIHBldWRvIHJlZ2lzdGVyLCBleGl0IHdpdGggYSB0aW1lb3V0CisgKgorICogQHBhcmFtIG1nciBwb2ludGVyIHRvIG1pWGFydCBtYW5hZ2VyIHN0cnVjdHVyZQorICogQHBhcmFtIG9mZnNldCB1bnNpZ25lZCBwc2V1ZG9fcmVnaXN0ZXIgYmFzZSArIG9mZnNldCBvZiB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHZhbHVlCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIGNlbnRpc2VuY29uZHMKKyAqLworc3RhdGljIGludCBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZShtaXhhcnRfbWdyX3QgKm1nciwgdTMyIG9mZnNldCwgaW50IGlzX2VnYWwsIHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWUgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWiAvIDEwMCk7CisJdTMyIHJlYWQ7CisKKwlkbyB7CS8qIHdlIG1heSB0YWtlIHRvbyBsb25nIHRpbWUgaW4gdGhpcyBsb29wLgorCQkgKiBzbyBnaXZlIGNvbnRyb2xzIGJhY2sgdG8ga2VybmVsIGlmIG5lZWRlZC4KKwkJICovCisJCWNvbmRfcmVzY2hlZCgpOworCisJCXJlYWQgPSByZWFkbF9iZSggTUlYQVJUX01FTSggbWdyLCBvZmZzZXQgKSk7CisJCWlmKGlzX2VnYWwpIHsKKwkJCWlmKHJlYWQgPT0gdmFsdWUpIHJldHVybiAwOworCQl9CisJCWVsc2UgeyAvKiB3YWl0IGZvciBkaWZmZXJlbnQgdmFsdWUgKi8KKwkJCWlmKHJlYWQgIT0gdmFsdWUpIHJldHVybiAwOworCQl9CisJfSB3aGlsZSAoIHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpICk7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCisKKy8qCisgIHN0cnVjdHVyZXMgbmVlZGVkIHRvIHVwbG9hZCBlbGYgY29kZSBwYWNrZXRzIAorICovCit0eXBlZGVmIHN0cnVjdCBzbmRfbWl4YXJ0X2VsZjMyX2VoZHIgc25kX21peGFydF9lbGYzMl9laGRyX3Q7CisKK3N0cnVjdCBzbmRfbWl4YXJ0X2VsZjMyX2VoZHIgeworCXU4ICAgICAgZV9pZGVudFsxNl07CisJdTE2ICAgICBlX3R5cGU7CisJdTE2ICAgICBlX21hY2hpbmU7CisJdTMyICAgICBlX3ZlcnNpb247CisJdTMyICAgICBlX2VudHJ5OworCXUzMiAgICAgZV9waG9mZjsKKwl1MzIgICAgIGVfc2hvZmY7CisJdTMyICAgICBlX2ZsYWdzOworCXUxNiAgICAgZV9laHNpemU7CisJdTE2ICAgICBlX3BoZW50c2l6ZTsKKwl1MTYgICAgIGVfcGhudW07CisJdTE2ICAgICBlX3NoZW50c2l6ZTsKKwl1MTYgICAgIGVfc2hudW07CisJdTE2ICAgICBlX3Noc3RybmR4OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc25kX21peGFydF9lbGYzMl9waGRyIHNuZF9taXhhcnRfZWxmMzJfcGhkcl90OworCitzdHJ1Y3Qgc25kX21peGFydF9lbGYzMl9waGRyIHsKKwl1MzIgICAgIHBfdHlwZTsKKwl1MzIgICAgIHBfb2Zmc2V0OworCXUzMiAgICAgcF92YWRkcjsKKwl1MzIgICAgIHBfcGFkZHI7CisJdTMyICAgICBwX2ZpbGVzejsKKwl1MzIgICAgIHBfbWVtc3o7CisJdTMyICAgICBwX2ZsYWdzOworCXUzMiAgICAgcF9hbGlnbjsKK307CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2xvYWRfZWxmKG1peGFydF9tZ3JfdCAqbWdyLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcCApCit7CisJY2hhciAgICAgICAgICAgICAgICAgICAgZWxmMzJfbWFnaWNfbnVtYmVyWzRdID0gezB4N2YsJ0UnLCdMJywnRid9OworCXNuZF9taXhhcnRfZWxmMzJfZWhkcl90ICplbGZfaGVhZGVyOworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisKKwllbGZfaGVhZGVyID0gKHNuZF9taXhhcnRfZWxmMzJfZWhkcl90ICopZHNwLT5kYXRhOworCWZvciggaT0wOyBpPDQ7IGkrKyApCisJCWlmICggZWxmMzJfbWFnaWNfbnVtYmVyW2ldICE9IGVsZl9oZWFkZXItPmVfaWRlbnRbaV0gKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiggZWxmX2hlYWRlci0+ZV9waG9mZiAhPSAwICkgeworCQlzbmRfbWl4YXJ0X2VsZjMyX3BoZHJfdCAgICAgZWxmX3Byb2dyYW1oZWFkZXI7CisKKwkJZm9yKCBpPTA7IGkgPCBiZTE2X3RvX2NwdShlbGZfaGVhZGVyLT5lX3BobnVtKTsgaSsrICkgeworCQkJdTMyIHBvcyA9IGJlMzJfdG9fY3B1KGVsZl9oZWFkZXItPmVfcGhvZmYpICsgKHUzMikoaSAqIGJlMTZfdG9fY3B1KGVsZl9oZWFkZXItPmVfcGhlbnRzaXplKSk7CisKKwkJCW1lbWNweSggJmVsZl9wcm9ncmFtaGVhZGVyLCBkc3AtPmRhdGEgKyBwb3MsIHNpemVvZihlbGZfcHJvZ3JhbWhlYWRlcikgKTsKKworCQkJaWYoZWxmX3Byb2dyYW1oZWFkZXIucF90eXBlICE9IDApIHsKKwkJCQlpZiggZWxmX3Byb2dyYW1oZWFkZXIucF9maWxlc3ogIT0gMCApIHsKKwkJCQkJbWVtY3B5X3RvaW8oIE1JWEFSVF9NRU0oIG1nciwgYmUzMl90b19jcHUoZWxmX3Byb2dyYW1oZWFkZXIucF92YWRkcikpLAorCQkJCQkJICAgICBkc3AtPmRhdGEgKyBiZTMyX3RvX2NwdSggZWxmX3Byb2dyYW1oZWFkZXIucF9vZmZzZXQgKSwKKwkJCQkJCSAgICAgYmUzMl90b19jcHUoIGVsZl9wcm9ncmFtaGVhZGVyLnBfZmlsZXN6ICkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdldCBiYXNpYyBpbmZvcm1hdGlvbiBhbmQgaW5pdCBtaVhhcnQKKyAqLworCisvKiBhdWRpbyBJRHMgZm9yIHJlcXVlc3QgdG8gdGhlIGJvYXJkICovCisjZGVmaW5lIE1JWEFSVF9GSVJTVF9BTkFfQVVESU9fSUQgICAgICAgMAorI2RlZmluZSBNSVhBUlRfRklSU1RfRElHX0FVRElPX0lEICAgICAgIDgKKworc3RhdGljIGludCBtaXhhcnRfZW51bV9jb25uZWN0b3JzKG1peGFydF9tZ3JfdCAqbWdyKQoreworCXUzMiBrOworCWludCBlcnI7CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisJbWl4YXJ0X2VudW1fY29ubmVjdG9yX3Jlc3BfdCAqY29ubmVjdG9yOworCW1peGFydF9hdWRpb19pbmZvX3JlcV90ICAqYXVkaW9faW5mb19yZXE7CisJbWl4YXJ0X2F1ZGlvX2luZm9fcmVzcF90ICphdWRpb19pbmZvOworCisJY29ubmVjdG9yID0ga21hbGxvYyhzaXplb2YoKmNvbm5lY3RvciksIEdGUF9LRVJORUwpOworCWF1ZGlvX2luZm9fcmVxID0ga21hbGxvYyhzaXplb2YoKmF1ZGlvX2luZm9fcmVxKSwgR0ZQX0tFUk5FTCk7CisJYXVkaW9faW5mbyA9IGttYWxsb2Moc2l6ZW9mKCphdWRpb19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgY29ubmVjdG9yIHx8ICEgYXVkaW9faW5mb19yZXEgfHwgISBhdWRpb19pbmZvKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gX19lcnJvcjsKKwl9CisKKwlhdWRpb19pbmZvX3JlcS0+bGluZV9tYXhfbGV2ZWwgPSBNSVhBUlRfRkxPQVRfUF8yMl8wX1RPX0hFWDsKKwlhdWRpb19pbmZvX3JlcS0+bWljcm9fbWF4X2xldmVsID0gTUlYQVJUX0ZMT0FUX01fMjBfMF9UT19IRVg7CisJYXVkaW9faW5mb19yZXEtPmNkX21heF9sZXZlbCA9IE1JWEFSVF9GTE9BVF9fX18wXzBfVE9fSEVYOworCisJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX1NZU1RFTV9FTlVNX1BMQVlfQ09OTkVDVE9SOworCXJlcXVlc3QudWlkID0gKG1peGFydF91aWRfdCl7MCwwfTsgIC8qIGJvYXJkIG51bSA9IDAgKi8KKwlyZXF1ZXN0LmRhdGEgPSBOVUxMOworCXJlcXVlc3Quc2l6ZSA9IDA7CisKKwllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZigqY29ubmVjdG9yKSwgY29ubmVjdG9yKTsKKwlpZigoZXJyIDwgMCkgfHwgKGNvbm5lY3Rvci0+ZXJyb3JfY29kZSkgfHwgKGNvbm5lY3Rvci0+dWlkX2NvdW50ID4gTUlYQVJUX01BWF9QSFlTX0NPTk5FQ1RPUlMpKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TWVNURU1fRU5VTV9QTEFZX0NPTk5FQ1RPUlxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gX19lcnJvcjsKKwl9CisKKwlmb3Ioaz0wOyBrIDwgY29ubmVjdG9yLT51aWRfY291bnQ7IGsrKykgeworCQltaXhhcnRfcGlwZV90KiBwaXBlOworCisJCWlmKGsgPCBNSVhBUlRfRklSU1RfRElHX0FVRElPX0lEKSB7CisJCQlwaXBlID0gJm1nci0+Y2hpcFtrLzJdLT5waXBlX291dF9hbmE7CisJCX0gZWxzZSB7CisJCQlwaXBlID0gJm1nci0+Y2hpcFsoay1NSVhBUlRfRklSU1RfRElHX0FVRElPX0lEKS8yXS0+cGlwZV9vdXRfZGlnOworCQl9CisJCWlmKGsgJiAxKSB7CisJCQlwaXBlLT51aWRfcmlnaHRfY29ubmVjdG9yID0gY29ubmVjdG9yLT51aWRba107ICAgLyogb2RkICovCisJCX0gZWxzZSB7CisJCQlwaXBlLT51aWRfbGVmdF9jb25uZWN0b3IgPSBjb25uZWN0b3ItPnVpZFtrXTsgICAgLyogZXZlbiAqLworCQl9CisKKwkJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5YmFjayBjb25uZWN0b3JbJWRdLm9iamVjdF9pZCA9ICV4XG4iLCBrLCBjb25uZWN0b3ItPnVpZFtrXS5vYmplY3RfaWQpOyAqLworCisJCS8qIFRPRE86IHJlYWxseSBuZWVkIHNlbmRfbXNnIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk8gZm9yIGVhY2ggY29ubmVjdG9yID8gcGVyaGFwcyBmb3IgYW5hbG9nIGxldmVsIGNhcHMgPyAqLworCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPOworCQlyZXF1ZXN0LnVpZCA9IGNvbm5lY3Rvci0+dWlkW2tdOworCQlyZXF1ZXN0LmRhdGEgPSBhdWRpb19pbmZvX3JlcTsKKwkJcmVxdWVzdC5zaXplID0gc2l6ZW9mKCphdWRpb19pbmZvX3JlcSk7CisKKwkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKKwkJaWYoIGVyciA8IDAgKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCQkvKnNuZF9wcmludGsoS0VSTl9ERUJVRyAicGxheSAgYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQgPSAleFxuIiwgYXVkaW9faW5mby0+aW5mby5hbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCk7Ki8KKwl9CisKKwlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUjsKKwlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07ICAvKiBib2FyZCBudW0gPSAwICovCisJcmVxdWVzdC5kYXRhID0gTlVMTDsKKwlyZXF1ZXN0LnNpemUgPSAwOworCisJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmNvbm5lY3RvciksIGNvbm5lY3Rvcik7CisJaWYoKGVyciA8IDApIHx8IChjb25uZWN0b3ItPmVycm9yX2NvZGUpIHx8IChjb25uZWN0b3ItPnVpZF9jb3VudCA+IE1JWEFSVF9NQVhfUEhZU19DT05ORUNUT1JTKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUlxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gX19lcnJvcjsKKwl9CisKKwlmb3Ioaz0wOyBrIDwgY29ubmVjdG9yLT51aWRfY291bnQ7IGsrKykgeworCQltaXhhcnRfcGlwZV90KiBwaXBlOworCisJCWlmKGsgPCBNSVhBUlRfRklSU1RfRElHX0FVRElPX0lEKSB7CisJCQlwaXBlID0gJm1nci0+Y2hpcFtrLzJdLT5waXBlX2luX2FuYTsKKwkJfSBlbHNlIHsKKwkJCXBpcGUgPSAmbWdyLT5jaGlwWyhrLU1JWEFSVF9GSVJTVF9ESUdfQVVESU9fSUQpLzJdLT5waXBlX2luX2RpZzsKKwkJfQorCQlpZihrICYgMSkgeworCQkJcGlwZS0+dWlkX3JpZ2h0X2Nvbm5lY3RvciA9IGNvbm5lY3Rvci0+dWlkW2tdOyAgIC8qIG9kZCAqLworCQl9IGVsc2UgeworCQkJcGlwZS0+dWlkX2xlZnRfY29ubmVjdG9yID0gY29ubmVjdG9yLT51aWRba107ICAgIC8qIGV2ZW4gKi8KKwkJfQorCisJCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiY2FwdHVyZSBjb25uZWN0b3JbJWRdLm9iamVjdF9pZCA9ICV4XG4iLCBrLCBjb25uZWN0b3ItPnVpZFtrXS5vYmplY3RfaWQpOyAqLworCisJCS8qIFRPRE86IHJlYWxseSBuZWVkIHNlbmRfbXNnIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk8gZm9yIGVhY2ggY29ubmVjdG9yID8gcGVyaGFwcyBmb3IgYW5hbG9nIGxldmVsIGNhcHMgPyAqLworCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPOworCQlyZXF1ZXN0LnVpZCA9IGNvbm5lY3Rvci0+dWlkW2tdOworCQlyZXF1ZXN0LmRhdGEgPSBhdWRpb19pbmZvX3JlcTsKKwkJcmVxdWVzdC5zaXplID0gc2l6ZW9mKCphdWRpb19pbmZvX3JlcSk7CisKKwkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKKwkJaWYoIGVyciA8IDAgKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCQkvKnNuZF9wcmludGsoS0VSTl9ERUJVRyAicmVjICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLworCX0KKwllcnIgPSAwOworCisgX19lcnJvcjoKKwlrZnJlZShjb25uZWN0b3IpOworCWtmcmVlKGF1ZGlvX2luZm9fcmVxKTsKKwlrZnJlZShhdWRpb19pbmZvKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2VudW1fcGh5c2lvKG1peGFydF9tZ3JfdCAqbWdyKQoreworCXUzMiBrOworCWludCBlcnI7CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisJbWl4YXJ0X3VpZF90IGdldF9jb25zb2xlX21ncjsKKwltaXhhcnRfcmV0dXJuX3VpZF90IGNvbnNvbGVfbWdyOworCW1peGFydF91aWRfZW51bWVyYXRpb25fdCBwaHlzX2lvOworCisJLyogZ2V0IHRoZSB1aWQgZm9yIHRoZSBjb25zb2xlIG1hbmFnZXIgKi8KKwlnZXRfY29uc29sZV9tZ3Iub2JqZWN0X2lkID0gMDsKKwlnZXRfY29uc29sZV9tZ3IuZGVzYyA9IE1TR19DT05TT0xFX01BTkFHRVIgfCAwOyAvKiBjYXJkaW5kZXggPSAwICovCisKKwlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEOworCXJlcXVlc3QudWlkID0gZ2V0X2NvbnNvbGVfbWdyOworCXJlcXVlc3QuZGF0YSA9ICZnZXRfY29uc29sZV9tZ3I7CisJcmVxdWVzdC5zaXplID0gc2l6ZW9mKGdldF9jb25zb2xlX21ncik7CisKKwllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihjb25zb2xlX21nciksICZjb25zb2xlX21ncik7CisKKwlpZiggKGVyciA8IDApIHx8IChjb25zb2xlX21nci5lcnJvcl9jb2RlICE9IDApICkgeworCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIE1TR19DT05TT0xFX0dFVF9DTE9DS19VSUQgOiBlcnI9JXhcbiIsIGNvbnNvbGVfbWdyLmVycm9yX2NvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB1c2VkIGxhdGVyIGZvciBjbG9jayBpc3N1ZXMgISAqLworCW1nci0+dWlkX2NvbnNvbGVfbWFuYWdlciA9IGNvbnNvbGVfbWdyLnVpZDsKKworCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TWVNURU1fRU5VTV9QSFlTSUNBTF9JTzsKKwlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJcmVxdWVzdC5kYXRhID0gJmNvbnNvbGVfbWdyLnVpZDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplb2YoY29uc29sZV9tZ3IudWlkKTsKKworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKHBoeXNfaW8pLCAmcGh5c19pbyk7CisJaWYoIChlcnIgPCAwKSB8fCAoIHBoeXNfaW8uZXJyb3JfY29kZSAhPSAwICkgKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TWVNURU1fRU5VTV9QSFlTSUNBTF9JTyBlcnIoJXgpIGVycm9yX2NvZGUoJXgpXG4iLCBlcnIsIHBoeXNfaW8uZXJyb3JfY29kZSApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfYXNzZXJ0KHBoeXNfaW8ubmJfdWlkID49IChNSVhBUlRfTUFYX0NBUkRTICogMiksICByZXR1cm4gLUVJTlZBTCk7IC8qIG1pbiAyIHBoeXMgaW8gcGVyIGNhcmQgKGFuYWxvZyBpbiArIGFuYWxvZyBvdXQpICovCisKKwlmb3Ioaz0wOyBrPG1nci0+bnVtX2NhcmRzOyBrKyspIHsKKwkJbWdyLT5jaGlwW2tdLT51aWRfaW5fYW5hbG9nX3BoeXNpbyA9IHBoeXNfaW8udWlkW2tdOworCQltZ3ItPmNoaXBba10tPnVpZF9vdXRfYW5hbG9nX3BoeXNpbyA9IHBoeXNfaW8udWlkW3BoeXNfaW8ubmJfdWlkLzIgKyBrXTsgCisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtaXhhcnRfZmlyc3RfaW5pdChtaXhhcnRfbWdyX3QgKm1ncikKK3sKKwl1MzIgazsKKwlpbnQgZXJyOworCW1peGFydF9tc2dfdCByZXF1ZXN0OworCisJaWYoKGVyciA9IG1peGFydF9lbnVtX2Nvbm5lY3RvcnMobWdyKSkgPCAwKSByZXR1cm4gZXJyOworCisJaWYoKGVyciA9IG1peGFydF9lbnVtX3BoeXNpbyhtZ3IpKSA8IDApIHJldHVybiBlcnI7CisKKwkvKiBzZW5kIGEgc3luY2hybyBjb21tYW5kIHRvIGNhcmQgKG5lY2Vzc2FyeSB0byBkbyB0aGlzIGJlZm9yZSBmaXJzdCBNU0dfU1RSRUFNX1NUQVJUX1NUUkVBTV9HUlBfUEFDS0VUKSAqLworCS8qIHRob3VnaCB3aHkgbm90IGhlcmUgKi8KKwlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQ7CisJcmVxdWVzdC51aWQgPSAobWl4YXJ0X3VpZF90KXswLDB9OworCXJlcXVlc3QuZGF0YSA9IE5VTEw7CisJcmVxdWVzdC5zaXplID0gMDsKKwkvKiB0aGlzIGNvbW1hbmQgaGFzIG5vIGRhdGEuIHJlc3BvbnNlIGlzIGEgMzIgYml0IHN0YXR1cyAqLworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGspLCAmayk7CisJaWYoIChlcnIgPCAwKSB8fCAoayAhPSAwKSApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9TRU5EX1NZTkNIUk9fQ01EXG4iKTsKKwkJcmV0dXJuIGVyciA9PSAwID8gLUVJTlZBTCA6IGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBmaXJtd2FyZSBiYXNlIGFkZHJlc3NlcyAod2hlbiBoYXJkIGNvZGVkKSAqLworI2RlZmluZSBNSVhBUlRfTU9USEVSQk9BUkRfWExYX0JBU0VfQUREUkVTUyAgIDB4MDA2MDAwMDAKKworc3RhdGljIGludCBtaXhhcnRfZHNwX2xvYWQobWl4YXJ0X21ncl90KiBtZ3IsIGludCBpbmRleCwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpkc3ApCit7CisJaW50ICAgICAgICAgICBlcnIsIGNhcmRfaW5kZXg7CisJdTMyICAgICAgICAgICBzdGF0dXNfeGlsaW54LCBzdGF0dXNfZWxmLCBzdGF0dXNfZGF1Z2h0OworCXUzMiAgICAgICAgICAgdmFsOworCisJLyogcmVhZCBtb3RoZXJib2FyZCB4aWxpbnggc3RhdHVzICovCisJc3RhdHVzX3hpbGlueCA9IHJlYWRsX2JlKCBNSVhBUlRfTUVNKCBtZ3IsTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQgKSk7CisJLyogcmVhZCBlbGYgc3RhdHVzICovCisJc3RhdHVzX2VsZiA9IHJlYWRsX2JlKCBNSVhBUlRfTUVNKCBtZ3IsTUlYQVJUX1BTRVVET1JFR19FTEZfU1RBVFVTX09GRlNFVCApKTsKKwkvKiByZWFkIGRhdWdodGVyYm9hcmQgeGlsaW54IHN0YXR1cyAqLworCXN0YXR1c19kYXVnaHQgPSByZWFkbF9iZSggTUlYQVJUX01FTSggbWdyLE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9TVEFUVVNfT0ZGU0VUICkpOworCisJLyogbW90aGVyYm9hcmQgeGlsaW54IHN0YXR1cyA1IHdpbGwgc2F5IHRoYXQgdGhlIGJvYXJkIGlzIHBlcmZvcm1pbmcgYSByZXNldCAqLworCWlmKCBzdGF0dXNfeGlsaW54ID09IDUgKSB7CisJCXNuZF9wcmludGsoIEtFUk5fRVJSICJtaVhhcnQgaXMgcmVzZXR0aW5nICFcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluIGxhdGVyICovCisJfQorCisJc3dpdGNoIChpbmRleCkgICB7CisJY2FzZSBNSVhBUlRfTU9USEVSQk9BUkRfWExYX0lOREVYOgorCisJCS8qIHhpbGlueCBhbHJlYWR5IGxvYWRlZCA/ICovIAorCQlpZiggc3RhdHVzX3hpbGlueCA9PSA0ICkgeworCQkJc25kX3ByaW50ayggS0VSTl9ERUJVRyAieGlsaW54IGlzIGFscmVhZHkgbG9hZGVkICFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogdGhlIHN0YXR1cyBzaG91bGQgYmUgMCA9PSAiaWRsZSIgKi8KKwkJaWYoIHN0YXR1c194aWxpbnggIT0gMCApIHsKKwkJCXNuZF9wcmludGsoIEtFUk5fRVJSICJ4aWxpbnggbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXNfeGlsaW54KTsKKwkJCXJldHVybiAtRUlPOyAvKiBtb2Rwcm9iIC1yIG1heSBoZWxwID8gKi8KKwkJfQorCisJCS8qIGNoZWNrIHhpbGlueCB2YWxpZGl0eSAqLworCQlzbmRfYXNzZXJ0KCgodTMyKikoZHNwLT5kYXRhKSlbMF09PTB4RkZGRkZGRkYsIHJldHVybiAtRUlOVkFMKTsKKwkJc25kX2Fzc2VydChkc3AtPnNpemUgJSA0ID09IDAsIHJldHVybiAtRUlOVkFMKTsKKworCQkvKiBzZXQgeGlsaW54IHN0YXR1cyB0byBjb3B5aW5nICovCisJCXdyaXRlbF9iZSggMSwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX01YTFhfU1RBVFVTX09GRlNFVCApKTsKKworCQkvKiBzZXR1cCB4aWxpbnggYmFzZSBhZGRyZXNzICovCisJCXdyaXRlbF9iZSggTUlYQVJUX01PVEhFUkJPQVJEX1hMWF9CQVNFX0FERFJFU1MsIE1JWEFSVF9NRU0oIG1ncixNSVhBUlRfUFNFVURPUkVHX01YTFhfQkFTRV9BRERSX09GRlNFVCApKTsKKwkJLyogc2V0dXAgY29kZSBzaXplIGZvciB4aWxpbnggZmlsZSAqLworCQl3cml0ZWxfYmUoIGRzcC0+c2l6ZSwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX01YTFhfU0laRV9PRkZTRVQgKSk7CisKKwkJLyogY29weSB4aWxpbnggY29kZSAqLworCQltZW1jcHlfdG9pbyggIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX01PVEhFUkJPQVJEX1hMWF9CQVNFX0FERFJFU1MpLCAgZHNwLT5kYXRhLCAgZHNwLT5zaXplKTsKKyAgICAKKwkJLyogc2V0IHhpbGlueCBzdGF0dXMgdG8gY29weSBmaW5pc2hlZCAqLworCQl3cml0ZWxfYmUoIDIsIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQgKSk7CisKKwkJLyogcmV0dXJuLCBiZWNhdXNlIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBuZWVkZWQgKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVg6CisKKwkJaWYoIHN0YXR1c19lbGYgPT0gNCApIHsKKwkJCXNuZF9wcmludGsoIEtFUk5fREVCVUcgImVsZiBmaWxlIGFscmVhZHkgbG9hZGVkICFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiB0aGUgc3RhdHVzIHNob3VsZCBiZSAwID09ICJpZGxlIiAqLworCQlpZiggc3RhdHVzX2VsZiAhPSAwICkgeworCQkJc25kX3ByaW50ayggS0VSTl9FUlIgImVsZiBsb2FkIGVycm9yICEgc3RhdHVzID0gJWRcbiIsIHN0YXR1c19lbGYpOworCQkJcmV0dXJuIC1FSU87IC8qIG1vZHByb2IgLXIgbWF5IGhlbHAgPyAqLworCQl9CisKKwkJLyogd2FpdCBmb3IgeGlsaW54IHN0YXR1cyA9PSA0ICovCisJCWVyciA9IG1peGFydF93YWl0X25pY2VfZm9yX3JlZ2lzdGVyX3ZhbHVlKCBtZ3IsIE1JWEFSVF9QU0VVRE9SRUdfTVhMWF9TVEFUVVNfT0ZGU0VULCAxLCA0LCA1MDApOyAvKiA1c2VjICovCisJCWlmIChlcnIgPCAwKSB7CisJCQlzbmRfcHJpbnRrKCBLRVJOX0VSUiAieGlsaW54IHdhcyBub3QgbG9hZGVkIG9yIGNvdWxkIG5vdCBiZSBzdGFydGVkXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKiBpbml0IHNvbWUgZGF0YSBvbiB0aGUgY2FyZCAqLworCQl3cml0ZWxfYmUoIDAsIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX1BTRVVET1JFR19CT0FSRE5VTUJFUiApICk7IC8qIHNldCBtaVhhcnQgYm9hcmRudW1iZXIgdG8gMCAqLworCQl3cml0ZWxfYmUoIDAsIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX0ZMT1dUQUJMRV9QVFIgKSApOyAgICAgICAgIC8qIHJlc2V0IHBvaW50ZXIgdG8gZmxvdyB0YWJsZSBvbiBtaVhhcnQgKi8KKworCQkvKiBzZXQgZWxmIHN0YXR1cyB0byBjb3B5aW5nICovCisJCXdyaXRlbF9iZSggMSwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0VMRl9TVEFUVVNfT0ZGU0VUICkpOworCisJCS8qIHByb2Nlc3MgdGhlIGNvcHlpbmcgb2YgdGhlIGVsZiBwYWNrZXRzICovCisJCWVyciA9IG1peGFydF9sb2FkX2VsZiggbWdyLCBkc3AgKTsKKwkJaWYgKGVyciA8IDApIHJldHVybiBlcnI7CisKKwkJLyogc2V0IGVsZiBzdGF0dXMgdG8gY29weSBmaW5pc2hlZCAqLworCQl3cml0ZWxfYmUoIDIsIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX1BTRVVET1JFR19FTEZfU1RBVFVTX09GRlNFVCApKTsKKworCQkvKiB3YWl0IGZvciBlbGYgc3RhdHVzID09IDQgKi8KKwkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19FTEZfU1RBVFVTX09GRlNFVCwgMSwgNCwgMzAwKTsgLyogM3NlYyAqLworCQlpZiAoZXJyIDwgMCkgeworCQkJc25kX3ByaW50ayggS0VSTl9FUlIgImVsZiBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJLyogbWlYYXJ0IHdhaXRzIGF0IHRoaXMgcG9pbnQgb24gdGhlIHBvaW50ZXIgdG8gdGhlIGZsb3cgdGFibGUgKi8KKwkJd3JpdGVsX2JlKCAodTMyKW1nci0+Zmxvd2luZm8uYWRkciwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfRkxPV1RBQkxFX1BUUiApICk7IC8qIGdpdmUgcG9pbnRlciBvZiBmbG93IHRhYmxlIHRvIG1pWGFydCAqLworCisJCXJldHVybiAwOyAgLyogcmV0dXJuLCBhbm90aGVyIHhpbGlueCBmaWxlIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlICovCisKKwljYXNlIE1JWEFSVF9BRVNFQlVCT0FSRF9YTFhfSU5ERVg6CisJZGVmYXVsdDoKKworCQkvKiBlbGYgYW5kIHhpbGlueCBzaG91bGQgYmUgbG9hZGVkICovCisJCWlmKCAoc3RhdHVzX2VsZiAhPSA0KSB8fCAoc3RhdHVzX3hpbGlueCAhPSA0KSApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgInhpbGlueCBvciBlbGYgbm90IHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIpOworCQkJcmV0dXJuIC1FSU87IC8qIG1vZHByb2IgLXIgbWF5IGhlbHAgPyAqLworCQl9CisKKwkJLyogd2FpdCBmb3IgZGF1Z2h0ZXIgZGV0ZWN0aW9uICE9IDAgKi8KKwkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19EQlJEX1BSRVNFTkNFX09GRlNFVCwgMCwgMCwgMzApOyAvKiAzMDBtc2VjICovCisJCWlmIChlcnIgPCAwKSB7CisJCQlzbmRfcHJpbnRrKCBLRVJOX0VSUiAiZXJyb3Igc3RhcnRpbmcgZWxmIGZpbGVcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIHRoZSBib2FyZCB0eXBlIGNhbiBub3cgYmUgcmV0cmlldmVkICovCisJCW1nci0+Ym9hcmRfdHlwZSA9IChEQVVHSFRFUl9UWVBFX01BU0sgJiByZWFkbF9iZSggTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RCUkRfVFlQRV9PRkZTRVQpKSk7CisKKwkJaWYgKG1nci0+Ym9hcmRfdHlwZSA9PSBNSVhBUlRfREFVR0hURVJfVFlQRV9OT05FKQorCQkJYnJlYWs7ICAvKiBubyBkYXVnaHRlciBib2FyZDsgdGhlIGZpbGUgZG9lcyBub3QgaGF2ZSB0byBiZSBsb2FkZWQsIGNvbnRpbnVlIGFmdGVyIHRoZSBzd2l0Y2ggKi8KKworCQkvKiBvbmx5IGlmIGFlc2VidSBkYXVnaHRlciBib2FyZCBwcmVzZW5jZSAoZWxmIGNvZGUgbXVzdCBydW4pICAqLyAKKwkJaWYgKG1nci0+Ym9hcmRfdHlwZSAhPSBNSVhBUlRfREFVR0hURVJfVFlQRV9BRVMgKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogZGF1Z2h0ZXIgc2hvdWxkIGJlIGlkbGUgKi8KKwkJaWYoIHN0YXR1c19kYXVnaHQgIT0gMCApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgImRhdWdodGVyIGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzX2RhdWdodCk7CisJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCisJCX0KKyAKKwkJLyogY2hlY2sgZGF1Z2h0ZXJib2FyZCB4aWxpbnggdmFsaWRpdHkgKi8KKwkJc25kX2Fzc2VydCgoKHUzMiopKGRzcC0+ZGF0YSkpWzBdPT0weEZGRkZGRkZGLCByZXR1cm4gLUVJTlZBTCk7CisJCXNuZF9hc3NlcnQoZHNwLT5zaXplICUgNCA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisKKwkJLyogaW5mb3JtIG1peGFydCBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSAqLworCQl3cml0ZWxfYmUoIGRzcC0+c2l6ZSwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RYTFhfU0laRV9PRkZTRVQgKSk7CisKKwkJLyogc2V0IGRhdWdodGVyYm9hcmQgc3RhdHVzIHRvIDEgKi8KKwkJd3JpdGVsX2JlKCAxLCBNSVhBUlRfTUVNKCBtZ3IsIE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9TVEFUVVNfT0ZGU0VUICkpOworCisJCS8qIHdhaXQgZm9yIHN0YXR1cyA9PSAyICovCisJCWVyciA9IG1peGFydF93YWl0X25pY2VfZm9yX3JlZ2lzdGVyX3ZhbHVlKCBtZ3IsIE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9TVEFUVVNfT0ZGU0VULCAxLCAyLCAzMCk7IC8qIDMwMG1zZWMgKi8KKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9wcmludGsoIEtFUk5fRVJSICJkYXVnaHRlciBib2FyZCBsb2FkIGVycm9yXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKiBnZXQgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gd3JpdGUgdGhlIGZpbGUgKi8KKwkJdmFsID0gcmVhZGxfYmUoIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX1BTRVVET1JFR19EWExYX0JBU0VfQUREUl9PRkZTRVQgKSk7CisJCXNuZF9hc3NlcnQodmFsICE9IDAsIHJldHVybiAtRUlOVkFMKTsKKworCQkvKiBjb3B5IGRhdWdodGVyYm9hcmQgeGlsaW54IGNvZGUgKi8KKwkJbWVtY3B5X3RvaW8oICBNSVhBUlRfTUVNKCBtZ3IsIHZhbCksICBkc3AtPmRhdGEsICBkc3AtPnNpemUpOworCisJCS8qIHNldCBkYXVnaHRlcmJvYXJkIHN0YXR1cyB0byA0ICovCisJCXdyaXRlbF9iZSggNCwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RYTFhfU1RBVFVTX09GRlNFVCApKTsKKworCQkvKiBjb250aW51ZSB3aXRoIGluaXQgKi8KKwkJYnJlYWs7CisJfSAvKiBlbmQgb2Ygc3dpdGNoIGZpbGUgaW5kZXgqLworCisgICAgICAgIC8qIHdhaXQgZm9yIGRhdWdodGVyIHN0YXR1cyA9PSAzICovCisgICAgICAgIGVyciA9IG1peGFydF93YWl0X25pY2VfZm9yX3JlZ2lzdGVyX3ZhbHVlKCBtZ3IsIE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9TVEFUVVNfT0ZGU0VULCAxLCAzLCAzMDApOyAvKiAzc2VjICovCisgICAgICAgIGlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGsoIEtFUk5fRVJSICJkYXVnaHRlciBib2FyZCBjb3VsZCBub3QgYmUgaW5pdGlhbGlzZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGluaXQgbWFpbGJveCAoY29tbXVuaWNhdGlvbiB3aXRoIGVtYmVkZGVkKSAqLworCXNuZF9taXhhcnRfaW5pdF9tYWlsYm94KG1ncik7CisKKwkvKiBmaXJzdCBjb21tdW5pY2F0aW9uIHdpdGggZW1iZWRkZWQgKi8KKwllcnIgPSBtaXhhcnRfZmlyc3RfaW5pdChtZ3IpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRrKCBLRVJOX0VSUiAibWlYYXJ0IGNvdWxkIG5vdCBiZSBzZXQgdXBcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworICAgICAgIAkvKiBjcmVhdGUgZGV2aWNlcyBhbmQgbWl4ZXIgaW4gYWNjb3JkYW5jZSB3aXRoIEhXIG9wdGlvbnMqLworICAgICAgICBmb3IgKGNhcmRfaW5kZXggPSAwOyBjYXJkX2luZGV4IDwgbWdyLT5udW1fY2FyZHM7IGNhcmRfaW5kZXgrKykgeworCQltaXhhcnRfdCAqY2hpcCA9IG1nci0+Y2hpcFtjYXJkX2luZGV4XTsKKworCQlpZiAoKGVyciA9IHNuZF9taXhhcnRfY3JlYXRlX3BjbShjaGlwKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoY2FyZF9pbmRleCA9PSAwKSB7CisJCQlpZiAoKGVyciA9IHNuZF9taXhhcnRfY3JlYXRlX21peGVyKGNoaXAtPm1ncikpIDwgMCkKKwkgICAgICAgIAkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2hpcC0+Y2FyZCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfTsKKworCXNuZF9wcmludGRkKCJtaVhhcnQgZmlybXdhcmUgZG93bmxvYWRlZCBhbmQgc3VjY2Vzc2Z1bGx5IHNldCB1cFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfRldfTE9BREVSKSB8fCBkZWZpbmVkKENPTkZJR19GV19MT0FERVJfTU9EVUxFKQorI2lmICFkZWZpbmVkKENPTkZJR19VU0VfTUlYQVJUTE9BREVSKSAmJiAhZGVmaW5lZChDT05GSUdfU05EX01JWEFSVCkgLyogYnVpbHQtaW4ga2VybmVsICovCisjZGVmaW5lIFNORF9NSVhBUlRfRldfTE9BREVSCS8qIHVzZSB0aGUgc3RhbmRhcmQgZmlybXdhcmUgbG9hZGVyICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU05EX01JWEFSVF9GV19MT0FERVIKKworaW50IHNuZF9taXhhcnRfc2V0dXBfZmlybXdhcmUobWl4YXJ0X21ncl90ICptZ3IpCit7CisJc3RhdGljIGNoYXIgKmZ3X2ZpbGVzWzNdID0geworCQkibWlYYXJ0OC54bHgiLCAibWlYYXJ0OC5lbGYiLCAibWlYYXJ0OEFFUy54bHgiCisJfTsKKwljaGFyIHBhdGhbMzJdOworCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlzcHJpbnRmKHBhdGgsICJtaXhhcnQvJXMiLCBmd19maWxlc1tpXSk7CisJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcGF0aCwgJm1nci0+cGNpLT5kZXYpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaVhhcnQ6IGNhbid0IGxvYWQgZmlybXdhcmUgJXNcbiIsIHBhdGgpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJLyogZmFrZSBod2RlcCBkc3AgcmVjb3JkICovCisJCWVyciA9IG1peGFydF9kc3BfbG9hZChtZ3IsIGksIGZ3X2VudHJ5KTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbWdyLT5kc3BfbG9hZGVkIHw9IDEgPDwgaTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2Vsc2UgLyogb2xkIHN0eWxlIGZpcm13YXJlIGxvYWRpbmcgKi8KKworLyogbWlYYXJ0IGh3ZGVwIGludGVyZmFjZSBpZCBzdHJpbmcgKi8KKyNkZWZpbmUgU05EX01JWEFSVF9IV0RFUF9JRCAgICAgICAibWlYYXJ0IExvYWRlciIKKworc3RhdGljIGludCBtaXhhcnRfaHdkZXBfb3BlbihzbmRfaHdkZXBfdCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGFydF9od2RlcF9yZWxlYXNlKHNuZF9od2RlcF90ICpodywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2h3ZGVwX2RzcF9zdGF0dXMoc25kX2h3ZGVwX3QgKmh3LCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICppbmZvKQoreworCW1peGFydF9tZ3JfdCAqbWdyID0gaHctPnByaXZhdGVfZGF0YTsKKworCXN0cmNweShpbmZvLT5pZCwgIm1pWGFydCIpOworICAgICAgICBpbmZvLT5udW1fZHNwcyA9IE1JWEFSVF9IQVJEV19GSUxFU19NQVhfSU5ERVg7CisKKwlpZiAobWdyLT5kc3BfbG9hZGVkICYgKDEgPDwgIE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVgpKQorCQlpbmZvLT5jaGlwX3JlYWR5ID0gMTsKKworCWluZm8tPnZlcnNpb24gPSBNSVhBUlRfRFJJVkVSX1ZFUlNJT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2h3ZGVwX2RzcF9sb2FkKHNuZF9od2RlcF90ICpodywgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpkc3ApCit7CisJbWl4YXJ0X21ncl90KiBtZ3IgPSBody0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaXJtd2FyZSBmdzsKKwlpbnQgZXJyOworCisJZncuc2l6ZSA9IGRzcC0+bGVuZ3RoOworCWZ3LmRhdGEgPSB2bWFsbG9jKGRzcC0+bGVuZ3RoKTsKKwlpZiAoISBmdy5kYXRhKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydDogY2Fubm90IGFsbG9jYXRlIGltYWdlIHNpemUgJWRcbiIsCisJCQkgICAoaW50KWRzcC0+bGVuZ3RoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihmdy5kYXRhLCBkc3AtPmltYWdlLCBkc3AtPmxlbmd0aCkpIHsKKwkJdmZyZWUoZncuZGF0YSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgPSBtaXhhcnRfZHNwX2xvYWQobWdyLCBkc3AtPmluZGV4LCAmZncpOworCXZmcmVlKGZ3LmRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCW1nci0+ZHNwX2xvYWRlZCB8PSAxIDw8IGRzcC0+aW5kZXg7CisJcmV0dXJuIGVycjsKK30KKworaW50IHNuZF9taXhhcnRfc2V0dXBfZmlybXdhcmUobWl4YXJ0X21ncl90ICptZ3IpCit7CisJaW50IGVycjsKKwlzbmRfaHdkZXBfdCAqaHc7CisKKwkvKiBvbmx5IGNyZWF0ZSBod2RlcCBpbnRlcmZhY2UgZm9yIGZpcnN0IGNhcmRYIChzZWUgImluZGV4IiBtb2R1bGUgcGFyYW1ldGVyKSovCisJaWYgKChlcnIgPSBzbmRfaHdkZXBfbmV3KG1nci0+Y2hpcFswXS0+Y2FyZCwgU05EX01JWEFSVF9IV0RFUF9JRCwgMCwgJmh3KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaHctPmlmYWNlID0gU05EUlZfSFdERVBfSUZBQ0VfTUlYQVJUOworCWh3LT5wcml2YXRlX2RhdGEgPSBtZ3I7CisJaHctPm9wcy5vcGVuID0gbWl4YXJ0X2h3ZGVwX29wZW47CisJaHctPm9wcy5yZWxlYXNlID0gbWl4YXJ0X2h3ZGVwX3JlbGVhc2U7CisJaHctPm9wcy5kc3Bfc3RhdHVzID0gbWl4YXJ0X2h3ZGVwX2RzcF9zdGF0dXM7CisJaHctPm9wcy5kc3BfbG9hZCA9IG1peGFydF9od2RlcF9kc3BfbG9hZDsKKwlody0+ZXhjbHVzaXZlID0gMTsKKwlzcHJpbnRmKGh3LT5uYW1lLCAgU05EX01JWEFSVF9IV0RFUF9JRCk7CisJbWdyLT5kc3BfbG9hZGVkID0gMDsKKworCXJldHVybiBzbmRfY2FyZF9yZWdpc3RlcihtZ3ItPmNoaXBbMF0tPmNhcmQpOworfQorCisjZW5kaWYgLyogU05EX01JWEFSVF9GV19MT0FERVIgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmggYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTkwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogRHJpdmVyIGZvciBEaWdpZ3JhbSBtaVhhcnQgc291bmRjYXJkcworICoKKyAqIGRlZmluaXRpb25zIGFuZCBtYWtyb3MgZm9yIGJhc2ljIGNhcmQgYWNjZXNzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IERpZ2lncmFtIDxhbHNhQGRpZ2lncmFtLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX01JWEFSVF9IV0RFUF9ICisjZGVmaW5lIF9fU09VTkRfTUlYQVJUX0hXREVQX0gKKworI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+CisKKyNkZWZpbmUgcmVhZGxfYmUoeCkgYmUzMl90b19jcHUoX19yYXdfcmVhZGwoeCkpCisjZGVmaW5lIHdyaXRlbF9iZShkYXRhLGFkZHIpIF9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMihkYXRhKSxhZGRyKQorCisjZGVmaW5lIHJlYWRsX2xlKHgpIGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKHgpKQorI2RlZmluZSB3cml0ZWxfbGUoZGF0YSxhZGRyKSBfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIoZGF0YSksYWRkcikKKworI2RlZmluZSBNSVhBUlRfTUVNKG1ncix4KQkoKG1nciktPm1lbVswXS52aXJ0ICsgKHgpKQorI2RlZmluZSBNSVhBUlRfUkVHKG1ncix4KQkoKG1nciktPm1lbVsxXS52aXJ0ICsgKHgpKQorCisKKy8qIERhdWdodGVyIGJvYXJkIFR5cGUgKi8KKyNkZWZpbmUgREFVR0hURVJfVFlQRV9NQVNLICAgICAweDBGIAorI2RlZmluZSBEQVVHSFRFUl9WRVJfTUFTSyAgICAgIDB4RjAgCisjZGVmaW5lIERBVUdIVEVSX1RZUEVWRVJfTUFTSyAgKERBVUdIVEVSX1RZUEVfTUFTS3xEQVVHSFRFUl9WRVJfTUFTSykKKyAKKyNkZWZpbmUgTUlYQVJUX0RBVUdIVEVSX1RZUEVfTk9ORSAgICAgMHgwMCAKKyNkZWZpbmUgTUlYQVJUX0RBVUdIVEVSX1RZUEVfQ09CUkFORVQgMHgwOCAKKyNkZWZpbmUgTUlYQVJUX0RBVUdIVEVSX1RZUEVfQUVTICAgICAgMHgwRQorCisKKworI2RlZmluZSBNSVhBUlRfQkEwX1NJWkUgCSgxNiAqIDEwMjQgKiAxMDI0KSAvKiAxNk0gKi8KKyNkZWZpbmUgTUlYQVJUX0JBMV9TSVpFIAkoNCAgKiAxMDI0KSAgICAgICAgLyogNGsgKi8KKworLyoKKyAqIC0tLS0tLS0tLS0tQkFSIDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIGFkZHJlc3MgZm9yIHBzZXVkb3JlZ2lzdGVyICovCisKKyNkZWZpbmUgIE1JWEFSVF9QU0VVRE9SRUdfQk9BUkROVU1CRVIgICAgICAgICAgICAgIE1JWEFSVF9QU0VVRE9SRUcrMCAgICAgICAgLyogYm9hcmQgbnVtYmVyICovCisKKy8qIHBlcmZtZXRlciAoYXZhaWxhYmxlIHdoZW4gZWxmIGxvYWRlZCkqLworI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19QRVJGX1NUUkVBTV9MT0FEX09GRlNFVCAgTUlYQVJUX1BTRVVET1JFRysweDcwICAgICAvKiBzdHJlYW1pbmcgbG9hZCAqLworI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19QRVJGX1NZU1RFTV9MT0FEX09GRlNFVCAgTUlYQVJUX1BTRVVET1JFRysweDc4ICAgICAvKiBzeXN0ZW0gbG9hZCAocmVmZXJlbmNlKSovCisjZGVmaW5lICBNSVhBUlRfUFNFVURPUkVHX1BFUkZfTUFJTEJYX0xPQURfT0ZGU0VUICBNSVhBUlRfUFNFVURPUkVHKzB4N0MgICAgIC8qIG1haWxib3ggbG9hZCAqLworI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19QRVJGX0lOVEVSUl9MT0FEX09GRlNFVCAgTUlYQVJUX1BTRVVET1JFRysweDc0ICAgICAvKiBpbnRlcnJ1cHQgaGFuZGxpbmcgIGxvYWQgKi8KKworLyogbW90aGVyYm9hcmQgeGlsaW54IGxvYWRlciBpbmZvICovCisjZGVmaW5lICBNSVhBUlRfUFNFVURPUkVHX01YTFhfQkFTRV9BRERSX09GRlNFVCAgICBNSVhBUlRfUFNFVURPUkVHKzB4OUMgICAgIC8qIDB4MDA2MDAwMDAgKi8gCisjZGVmaW5lICBNSVhBUlRfUFNFVURPUkVHX01YTFhfU0laRV9PRkZTRVQgICAgICAgICBNSVhBUlRfUFNFVURPUkVHKzB4QTAgICAgIC8qIHhpbGlueCBzaXplIGluIGJ5dGVzICovIAorI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQgICAgICAgTUlYQVJUX1BTRVVET1JFRysweEE0ICAgICAvKiBzdGF0dXMgPSBFTUJFQkJFRF9TVEFUX1hYWCAqLyAKKworLyogZWxmIGxvYWRlciBpbmZvICovCisjZGVmaW5lICBNSVhBUlRfUFNFVURPUkVHX0VMRl9TVEFUVVNfT0ZGU0VUICAgICAgICBNSVhBUlRfUFNFVURPUkVHKzB4QjAgICAgIC8qIHN0YXR1cyA9IEVNQkVCQkVEX1NUQVRfWFhYICovIAorCisvKiAKKyogIGFmdGVyIHRoZSBlbGYgY29kZSBpcyBsb2FkZWQsIGFuZCB0aGUgZmxvd3RhYmxlIGluZm8gd2FzIHBhc3NlZCB0byBpdCwKKyogIHRoZSBkcml2ZXIgcG9sbHMgb24gdGhpcyBhZGRyZXNzLCB1bnRpbCBpdCBzaG93cyAxIChwcmVzZW5jZSkgb3IgMiAoYWJzZW5jZSkKKyogIG9uY2UgaXQgaXMgbm9uLXplcm8sIHRoZSBkYXVnaHRlciBib2FyZCB0eXBlIG1heSBiZSByZWFkCisqLworI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19EQlJEX1BSRVNFTkNFX09GRlNFVCAgICAgTUlYQVJUX1BTRVVET1JFRysweDk5MCAgIAorCisvKiBHbG9iYWwgaW5mbyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgIE1JWEFSVF9QU0VVRE9SRUdfREJSRF9UWVBFX09GRlNFVCAgICAgICAgIE1JWEFSVF9QU0VVRE9SRUcrMHg5OTQgICAgLyogVHlwZSBhbmQgdmVyc2lvbiBvZiBkYXVnaHRlcmJvYXJkICAqLworCisKKy8qIGRhdWdodGVyYm9hcmQgeGlsaW54IGxvYWRlciBpbmZvICovCisjZGVmaW5lICBNSVhBUlRfUFNFVURPUkVHX0RYTFhfQkFTRV9BRERSX09GRlNFVCAgICBNSVhBUlRfUFNFVURPUkVHKzB4OTk4ICAgIC8qIGdldCB0aGUgYWRkcmVzcyBoZXJlIHdoZXJlIHRvIHdyaXRlIHRoZSBmaWxlICovIAorI2RlZmluZSAgTUlYQVJUX1BTRVVET1JFR19EWExYX1NJWkVfT0ZGU0VUICAgICAgICAgTUlYQVJUX1BTRVVET1JFRysweDk5QyAgICAvKiB4aWxpbnggc2l6ZSBpbiBieXRlcyAqLyAKKyNkZWZpbmUgIE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9TVEFUVVNfT0ZGU0VUICAgICAgIE1JWEFSVF9QU0VVRE9SRUcrMHg5QTAgICAgLyogc3RhdHVzID0gRU1CRUJCRURfU1RBVF9YWFggKi8gCisKKy8qICAqLworI2RlZmluZSAgTUlYQVJUX0ZMT1dUQUJMRV9QVFIgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGZsb3cgdGFibGUgKi8KKworLyogbWFpbGJveCBhZGRyZXNzZXMgICovCisKKy8qIG1lc3NhZ2UgRFJWIC0+IEVNQiAqLworI2RlZmluZSBNU0dfSU5CT1VORF9QT1NUX0hFQUQgICAgICAgMHgwMTAwMDgJLyogRFJWIHBvc3RzIE1GICsgaW5jcmVtZW50NCAqLworI2RlZmluZQlNU0dfSU5CT1VORF9QT1NUX1RBSUwgICAgICAgMHgwMTAwMEMJLyogRU1CIGdldHMgTUYgKyBpbmNyZW1lbnQ0ICovCisvKiBtZXNzYWdlIEVNQiAtPiBEUlYgKi8KKyNkZWZpbmUJTVNHX09VVEJPVU5EX1BPU1RfVEFJTCAgICAgIDB4MDEwMDFDCS8qIERSViBnZXRzIE1GICsgaW5jcmVtZW50NCAqLworI2RlZmluZQlNU0dfT1VUQk9VTkRfUE9TVF9IRUFEICAgICAgMHgwMTAwMTgJLyogRU1CIHBvc3RzIE1GICsgaW5jcmVtZW50NCAqLworLyogR2V0IEZyZWUgRnJhbWVzICovCisjZGVmaW5lIE1TR19JTkJPVU5EX0ZSRUVfVEFJTCAgICAgICAweDAxMDAwNAkvKiBEUlYgZ2V0cyBNRkEgKyBpbmNyZW1lbnQ0ICovCisjZGVmaW5lIE1TR19PVVRCT1VORF9GUkVFX1RBSUwgICAgICAweDAxMDAxNAkvKiBFTUIgZ2V0cyBNRkEgKyBpbmNyZW1lbnQ0ICovCisvKiBQdXQgRnJlZSBGcmFtZXMgKi8KKyNkZWZpbmUgTVNHX09VVEJPVU5EX0ZSRUVfSEVBRCAgICAgIDB4MDEwMDEwCS8qIERSViBwdXRzIE1GQSArIGluY3JlbWVudDQgKi8KKyNkZWZpbmUgTVNHX0lOQk9VTkRfRlJFRV9IRUFEICAgICAgIDB4MDEwMDAwICAgIC8qIEVNQiBwdXRzIE1GQSArIGluY3JlbWVudDQgKi8KKworLyogZmlybXdhcmUgYWRkcmVzc2VzIG9mIHRoZSBtZXNzYWdlIGZpZm9zICovCisjZGVmaW5lIE1TR19CT1VORF9TVEFDS19TSVpFICAgICAgICAweDAwNDAwMCAgICAvKiBzaXplIG9mIGVhY2ggZm9sbG93aW5nIHN0YWNrICovCisvKiBwb3N0ZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTVNHX09VVEJPVU5EX1BPU1RfU1RBQ0sgICAgIDB4MTA4MDAwICAgIC8qIHN0YWNrIG9mIG1lc3NhZ2VzIHRvIHRoZSBEUlYgKi8KKyNkZWZpbmUgTVNHX0lOQk9VTkRfUE9TVF9TVEFDSyAgICAgIDB4MTA0MDAwICAgIC8qIHN0YWNrIG9mIG1lc3NhZ2VzIHRvIHRoZSBFTUIgKi8KKy8qIGF2YWlsYWJsZSBlbXB0eSBtZXNzYWdlcyAqLworI2RlZmluZSBNU0dfT1VUQk9VTkRfRlJFRV9TVEFDSyAgICAgMHgxMEMwMDAgICAgLyogc3RhY2sgb2YgZnJlZSBlbnZlbG9wZWQgZm9yIEVNQiAqLworI2RlZmluZSBNU0dfSU5CT1VORF9GUkVFX1NUQUNLICAgICAgMHgxMDAwMDAgICAgLyogc3RhY2sgb2YgZnJlZSBlbnZlbG9wZWQgZm9yIERSViAqLworCisKKy8qIGRlZmluZXMgZm9yIG1haWxib3ggbWVzc2FnZSBmcmFtZXMgKi8KKyNkZWZpbmUgTVNHX0ZSQU1FX09GRlNFVCAgICAgICAgICAgIDB4NjQKKyNkZWZpbmUgTVNHX0ZSQU1FX1NJWkUgICAgICAgICAgICAgIDB4NjQwMAorI2RlZmluZSBNU0dfRlJBTUVfTlVNQkVSICAgICAgICAgICAgMzIKKyNkZWZpbmUgTVNHX0ZST01fQUdFTlRfSVRNRl9PRkZTRVQgIChNU0dfRlJBTUVfT0ZGU0VUICsgKE1TR19GUkFNRV9TSVpFICogTVNHX0ZSQU1FX05VTUJFUikpCisjZGVmaW5lIE1TR19UT19BR0VOVF9JVE1GX09GRlNFVCAgICAoTVNHX0ZST01fQUdFTlRfSVRNRl9PRkZTRVQgKyBNU0dfRlJBTUVfU0laRSkKKyNkZWZpbmUgTVNHX0hPU1RfUlNDX1BST1RFQ1RJT04gICAgIChNU0dfVE9fQUdFTlRfSVRNRl9PRkZTRVQgKyBNU0dfRlJBTUVfU0laRSkKKyNkZWZpbmUgTVNHX0FHRU5UX1JTQ19QUk9URUNUSU9OICAgIChNU0dfSE9TVF9SU0NfUFJPVEVDVElPTiArIDQpCisKKworLyoKKyAqIC0tLS0tLS0tLS0tQkFSIDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBpbnRlcnJ1cHQgYWRkcmVzc2VzIGFuZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUlYQVJUX1BDSV9PTUlNUl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MzQgICAgLyogb3V0Ym91bmQgbWVzc2FnZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBNSVhBUlRfUENJX09NSVNSX09GRlNFVCAgICAgICAgICAgICAgICAgMHgzMCAgICAvKiBvdXRib3VuZCBtZXNzYWdlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlYQVJUX1BDSV9PREJSX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4NjAgICAgLyogb3V0Ym91bmQgZG9vcmJlbGwgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBNSVhBUlRfQkExX0JSVVRBTF9SRVNFVF9PRkZTRVQgICAgICAgICAgMHg2OCAgICAvKiB3cml0ZSAxIGluIExTQml0IHRvIHJlc2V0IGJvYXJkICovCisKKyNkZWZpbmUgTUlYQVJUX0hPU1RfQUxMX0lOVEVSUlVQVF9NQVNLRUQgICAgICAgIDB4MDJCICAgLyogMDAwMCAwMDEwIDEwMTEgKi8KKyNkZWZpbmUgTUlYQVJUX0FMTE9XX09VVEJPVU5EX0RPT1JCRUxMICAgICAgICAgIDB4MDIzICAgLyogMDAwMCAwMDEwIDAwMTEgKi8KKyNkZWZpbmUgTUlYQVJUX09JREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4ICAgLyogMDAwMCAwMDAwIDEwMDAgKi8KKworCitpbnQgc25kX21peGFydF9zZXR1cF9maXJtd2FyZShtaXhhcnRfbWdyX3QgKm1ncik7CisKKyNlbmRpZiAvKiBfX1NPVU5EX01JWEFSVF9IV0RFUF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMxNTQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwpAQCAtMCwwICsxLDExMzYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIERpZ2lncmFtIG1pWGFydCBzb3VuZGNhcmRzCisgKgorICogbWl4ZXIgY2FsbGJhY2tzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIGJ5IERpZ2lncmFtIDxhbHNhQGRpZ2lncmFtLmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgIm1peGFydC5oIgorI2luY2x1ZGUgIm1peGFydF9jb3JlLmgiCisjaW5jbHVkZSAibWl4YXJ0X2h3ZGVwLmgiCisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgIm1peGFydF9taXhlci5oIgorCitzdGF0aWMgdTMyIG1peGFydF9hbmFsb2dfbGV2ZWxbMjU2XSA9IHsKKwkweGMyYzAwMDAwLAkJLyogWzAwMF0gLTk2LjAgZEIgKi8KKwkweGMyYmYwMDAwLAkJLyogWzAwMV0gLTk1LjUgZEIgKi8KKwkweGMyYmUwMDAwLAkJLyogWzAwMl0gLTk1LjAgZEIgKi8KKwkweGMyYmQwMDAwLAkJLyogWzAwM10gLTk0LjUgZEIgKi8KKwkweGMyYmMwMDAwLAkJLyogWzAwNF0gLTk0LjAgZEIgKi8KKwkweGMyYmIwMDAwLAkJLyogWzAwNV0gLTkzLjUgZEIgKi8KKwkweGMyYmEwMDAwLAkJLyogWzAwNl0gLTkzLjAgZEIgKi8KKwkweGMyYjkwMDAwLAkJLyogWzAwN10gLTkyLjUgZEIgKi8KKwkweGMyYjgwMDAwLAkJLyogWzAwOF0gLTkyLjAgZEIgKi8KKwkweGMyYjcwMDAwLAkJLyogWzAwOV0gLTkxLjUgZEIgKi8KKwkweGMyYjYwMDAwLAkJLyogWzAxMF0gLTkxLjAgZEIgKi8KKwkweGMyYjUwMDAwLAkJLyogWzAxMV0gLTkwLjUgZEIgKi8KKwkweGMyYjQwMDAwLAkJLyogWzAxMl0gLTkwLjAgZEIgKi8KKwkweGMyYjMwMDAwLAkJLyogWzAxM10gLTg5LjUgZEIgKi8KKwkweGMyYjIwMDAwLAkJLyogWzAxNF0gLTg5LjAgZEIgKi8KKwkweGMyYjEwMDAwLAkJLyogWzAxNV0gLTg4LjUgZEIgKi8KKwkweGMyYjAwMDAwLAkJLyogWzAxNl0gLTg4LjAgZEIgKi8KKwkweGMyYWYwMDAwLAkJLyogWzAxN10gLTg3LjUgZEIgKi8KKwkweGMyYWUwMDAwLAkJLyogWzAxOF0gLTg3LjAgZEIgKi8KKwkweGMyYWQwMDAwLAkJLyogWzAxOV0gLTg2LjUgZEIgKi8KKwkweGMyYWMwMDAwLAkJLyogWzAyMF0gLTg2LjAgZEIgKi8KKwkweGMyYWIwMDAwLAkJLyogWzAyMV0gLTg1LjUgZEIgKi8KKwkweGMyYWEwMDAwLAkJLyogWzAyMl0gLTg1LjAgZEIgKi8KKwkweGMyYTkwMDAwLAkJLyogWzAyM10gLTg0LjUgZEIgKi8KKwkweGMyYTgwMDAwLAkJLyogWzAyNF0gLTg0LjAgZEIgKi8KKwkweGMyYTcwMDAwLAkJLyogWzAyNV0gLTgzLjUgZEIgKi8KKwkweGMyYTYwMDAwLAkJLyogWzAyNl0gLTgzLjAgZEIgKi8KKwkweGMyYTUwMDAwLAkJLyogWzAyN10gLTgyLjUgZEIgKi8KKwkweGMyYTQwMDAwLAkJLyogWzAyOF0gLTgyLjAgZEIgKi8KKwkweGMyYTMwMDAwLAkJLyogWzAyOV0gLTgxLjUgZEIgKi8KKwkweGMyYTIwMDAwLAkJLyogWzAzMF0gLTgxLjAgZEIgKi8KKwkweGMyYTEwMDAwLAkJLyogWzAzMV0gLTgwLjUgZEIgKi8KKwkweGMyYTAwMDAwLAkJLyogWzAzMl0gLTgwLjAgZEIgKi8KKwkweGMyOWYwMDAwLAkJLyogWzAzM10gLTc5LjUgZEIgKi8KKwkweGMyOWUwMDAwLAkJLyogWzAzNF0gLTc5LjAgZEIgKi8KKwkweGMyOWQwMDAwLAkJLyogWzAzNV0gLTc4LjUgZEIgKi8KKwkweGMyOWMwMDAwLAkJLyogWzAzNl0gLTc4LjAgZEIgKi8KKwkweGMyOWIwMDAwLAkJLyogWzAzN10gLTc3LjUgZEIgKi8KKwkweGMyOWEwMDAwLAkJLyogWzAzOF0gLTc3LjAgZEIgKi8KKwkweGMyOTkwMDAwLAkJLyogWzAzOV0gLTc2LjUgZEIgKi8KKwkweGMyOTgwMDAwLAkJLyogWzA0MF0gLTc2LjAgZEIgKi8KKwkweGMyOTcwMDAwLAkJLyogWzA0MV0gLTc1LjUgZEIgKi8KKwkweGMyOTYwMDAwLAkJLyogWzA0Ml0gLTc1LjAgZEIgKi8KKwkweGMyOTUwMDAwLAkJLyogWzA0M10gLTc0LjUgZEIgKi8KKwkweGMyOTQwMDAwLAkJLyogWzA0NF0gLTc0LjAgZEIgKi8KKwkweGMyOTMwMDAwLAkJLyogWzA0NV0gLTczLjUgZEIgKi8KKwkweGMyOTIwMDAwLAkJLyogWzA0Nl0gLTczLjAgZEIgKi8KKwkweGMyOTEwMDAwLAkJLyogWzA0N10gLTcyLjUgZEIgKi8KKwkweGMyOTAwMDAwLAkJLyogWzA0OF0gLTcyLjAgZEIgKi8KKwkweGMyOGYwMDAwLAkJLyogWzA0OV0gLTcxLjUgZEIgKi8KKwkweGMyOGUwMDAwLAkJLyogWzA1MF0gLTcxLjAgZEIgKi8KKwkweGMyOGQwMDAwLAkJLyogWzA1MV0gLTcwLjUgZEIgKi8KKwkweGMyOGMwMDAwLAkJLyogWzA1Ml0gLTcwLjAgZEIgKi8KKwkweGMyOGIwMDAwLAkJLyogWzA1M10gLTY5LjUgZEIgKi8KKwkweGMyOGEwMDAwLAkJLyogWzA1NF0gLTY5LjAgZEIgKi8KKwkweGMyODkwMDAwLAkJLyogWzA1NV0gLTY4LjUgZEIgKi8KKwkweGMyODgwMDAwLAkJLyogWzA1Nl0gLTY4LjAgZEIgKi8KKwkweGMyODcwMDAwLAkJLyogWzA1N10gLTY3LjUgZEIgKi8KKwkweGMyODYwMDAwLAkJLyogWzA1OF0gLTY3LjAgZEIgKi8KKwkweGMyODUwMDAwLAkJLyogWzA1OV0gLTY2LjUgZEIgKi8KKwkweGMyODQwMDAwLAkJLyogWzA2MF0gLTY2LjAgZEIgKi8KKwkweGMyODMwMDAwLAkJLyogWzA2MV0gLTY1LjUgZEIgKi8KKwkweGMyODIwMDAwLAkJLyogWzA2Ml0gLTY1LjAgZEIgKi8KKwkweGMyODEwMDAwLAkJLyogWzA2M10gLTY0LjUgZEIgKi8KKwkweGMyODAwMDAwLAkJLyogWzA2NF0gLTY0LjAgZEIgKi8KKwkweGMyN2UwMDAwLAkJLyogWzA2NV0gLTYzLjUgZEIgKi8KKwkweGMyN2MwMDAwLAkJLyogWzA2Nl0gLTYzLjAgZEIgKi8KKwkweGMyN2EwMDAwLAkJLyogWzA2N10gLTYyLjUgZEIgKi8KKwkweGMyNzgwMDAwLAkJLyogWzA2OF0gLTYyLjAgZEIgKi8KKwkweGMyNzYwMDAwLAkJLyogWzA2OV0gLTYxLjUgZEIgKi8KKwkweGMyNzQwMDAwLAkJLyogWzA3MF0gLTYxLjAgZEIgKi8KKwkweGMyNzIwMDAwLAkJLyogWzA3MV0gLTYwLjUgZEIgKi8KKwkweGMyNzAwMDAwLAkJLyogWzA3Ml0gLTYwLjAgZEIgKi8KKwkweGMyNmUwMDAwLAkJLyogWzA3M10gLTU5LjUgZEIgKi8KKwkweGMyNmMwMDAwLAkJLyogWzA3NF0gLTU5LjAgZEIgKi8KKwkweGMyNmEwMDAwLAkJLyogWzA3NV0gLTU4LjUgZEIgKi8KKwkweGMyNjgwMDAwLAkJLyogWzA3Nl0gLTU4LjAgZEIgKi8KKwkweGMyNjYwMDAwLAkJLyogWzA3N10gLTU3LjUgZEIgKi8KKwkweGMyNjQwMDAwLAkJLyogWzA3OF0gLTU3LjAgZEIgKi8KKwkweGMyNjIwMDAwLAkJLyogWzA3OV0gLTU2LjUgZEIgKi8KKwkweGMyNjAwMDAwLAkJLyogWzA4MF0gLTU2LjAgZEIgKi8KKwkweGMyNWUwMDAwLAkJLyogWzA4MV0gLTU1LjUgZEIgKi8KKwkweGMyNWMwMDAwLAkJLyogWzA4Ml0gLTU1LjAgZEIgKi8KKwkweGMyNWEwMDAwLAkJLyogWzA4M10gLTU0LjUgZEIgKi8KKwkweGMyNTgwMDAwLAkJLyogWzA4NF0gLTU0LjAgZEIgKi8KKwkweGMyNTYwMDAwLAkJLyogWzA4NV0gLTUzLjUgZEIgKi8KKwkweGMyNTQwMDAwLAkJLyogWzA4Nl0gLTUzLjAgZEIgKi8KKwkweGMyNTIwMDAwLAkJLyogWzA4N10gLTUyLjUgZEIgKi8KKwkweGMyNTAwMDAwLAkJLyogWzA4OF0gLTUyLjAgZEIgKi8KKwkweGMyNGUwMDAwLAkJLyogWzA4OV0gLTUxLjUgZEIgKi8KKwkweGMyNGMwMDAwLAkJLyogWzA5MF0gLTUxLjAgZEIgKi8KKwkweGMyNGEwMDAwLAkJLyogWzA5MV0gLTUwLjUgZEIgKi8KKwkweGMyNDgwMDAwLAkJLyogWzA5Ml0gLTUwLjAgZEIgKi8KKwkweGMyNDYwMDAwLAkJLyogWzA5M10gLTQ5LjUgZEIgKi8KKwkweGMyNDQwMDAwLAkJLyogWzA5NF0gLTQ5LjAgZEIgKi8KKwkweGMyNDIwMDAwLAkJLyogWzA5NV0gLTQ4LjUgZEIgKi8KKwkweGMyNDAwMDAwLAkJLyogWzA5Nl0gLTQ4LjAgZEIgKi8KKwkweGMyM2UwMDAwLAkJLyogWzA5N10gLTQ3LjUgZEIgKi8KKwkweGMyM2MwMDAwLAkJLyogWzA5OF0gLTQ3LjAgZEIgKi8KKwkweGMyM2EwMDAwLAkJLyogWzA5OV0gLTQ2LjUgZEIgKi8KKwkweGMyMzgwMDAwLAkJLyogWzEwMF0gLTQ2LjAgZEIgKi8KKwkweGMyMzYwMDAwLAkJLyogWzEwMV0gLTQ1LjUgZEIgKi8KKwkweGMyMzQwMDAwLAkJLyogWzEwMl0gLTQ1LjAgZEIgKi8KKwkweGMyMzIwMDAwLAkJLyogWzEwM10gLTQ0LjUgZEIgKi8KKwkweGMyMzAwMDAwLAkJLyogWzEwNF0gLTQ0LjAgZEIgKi8KKwkweGMyMmUwMDAwLAkJLyogWzEwNV0gLTQzLjUgZEIgKi8KKwkweGMyMmMwMDAwLAkJLyogWzEwNl0gLTQzLjAgZEIgKi8KKwkweGMyMmEwMDAwLAkJLyogWzEwN10gLTQyLjUgZEIgKi8KKwkweGMyMjgwMDAwLAkJLyogWzEwOF0gLTQyLjAgZEIgKi8KKwkweGMyMjYwMDAwLAkJLyogWzEwOV0gLTQxLjUgZEIgKi8KKwkweGMyMjQwMDAwLAkJLyogWzExMF0gLTQxLjAgZEIgKi8KKwkweGMyMjIwMDAwLAkJLyogWzExMV0gLTQwLjUgZEIgKi8KKwkweGMyMjAwMDAwLAkJLyogWzExMl0gLTQwLjAgZEIgKi8KKwkweGMyMWUwMDAwLAkJLyogWzExM10gLTM5LjUgZEIgKi8KKwkweGMyMWMwMDAwLAkJLyogWzExNF0gLTM5LjAgZEIgKi8KKwkweGMyMWEwMDAwLAkJLyogWzExNV0gLTM4LjUgZEIgKi8KKwkweGMyMTgwMDAwLAkJLyogWzExNl0gLTM4LjAgZEIgKi8KKwkweGMyMTYwMDAwLAkJLyogWzExN10gLTM3LjUgZEIgKi8KKwkweGMyMTQwMDAwLAkJLyogWzExOF0gLTM3LjAgZEIgKi8KKwkweGMyMTIwMDAwLAkJLyogWzExOV0gLTM2LjUgZEIgKi8KKwkweGMyMTAwMDAwLAkJLyogWzEyMF0gLTM2LjAgZEIgKi8KKwkweGMyMGUwMDAwLAkJLyogWzEyMV0gLTM1LjUgZEIgKi8KKwkweGMyMGMwMDAwLAkJLyogWzEyMl0gLTM1LjAgZEIgKi8KKwkweGMyMGEwMDAwLAkJLyogWzEyM10gLTM0LjUgZEIgKi8KKwkweGMyMDgwMDAwLAkJLyogWzEyNF0gLTM0LjAgZEIgKi8KKwkweGMyMDYwMDAwLAkJLyogWzEyNV0gLTMzLjUgZEIgKi8KKwkweGMyMDQwMDAwLAkJLyogWzEyNl0gLTMzLjAgZEIgKi8KKwkweGMyMDIwMDAwLAkJLyogWzEyN10gLTMyLjUgZEIgKi8KKwkweGMyMDAwMDAwLAkJLyogWzEyOF0gLTMyLjAgZEIgKi8KKwkweGMxZmMwMDAwLAkJLyogWzEyOV0gLTMxLjUgZEIgKi8KKwkweGMxZjgwMDAwLAkJLyogWzEzMF0gLTMxLjAgZEIgKi8KKwkweGMxZjQwMDAwLAkJLyogWzEzMV0gLTMwLjUgZEIgKi8KKwkweGMxZjAwMDAwLAkJLyogWzEzMl0gLTMwLjAgZEIgKi8KKwkweGMxZWMwMDAwLAkJLyogWzEzM10gLTI5LjUgZEIgKi8KKwkweGMxZTgwMDAwLAkJLyogWzEzNF0gLTI5LjAgZEIgKi8KKwkweGMxZTQwMDAwLAkJLyogWzEzNV0gLTI4LjUgZEIgKi8KKwkweGMxZTAwMDAwLAkJLyogWzEzNl0gLTI4LjAgZEIgKi8KKwkweGMxZGMwMDAwLAkJLyogWzEzN10gLTI3LjUgZEIgKi8KKwkweGMxZDgwMDAwLAkJLyogWzEzOF0gLTI3LjAgZEIgKi8KKwkweGMxZDQwMDAwLAkJLyogWzEzOV0gLTI2LjUgZEIgKi8KKwkweGMxZDAwMDAwLAkJLyogWzE0MF0gLTI2LjAgZEIgKi8KKwkweGMxY2MwMDAwLAkJLyogWzE0MV0gLTI1LjUgZEIgKi8KKwkweGMxYzgwMDAwLAkJLyogWzE0Ml0gLTI1LjAgZEIgKi8KKwkweGMxYzQwMDAwLAkJLyogWzE0M10gLTI0LjUgZEIgKi8KKwkweGMxYzAwMDAwLAkJLyogWzE0NF0gLTI0LjAgZEIgKi8KKwkweGMxYmMwMDAwLAkJLyogWzE0NV0gLTIzLjUgZEIgKi8KKwkweGMxYjgwMDAwLAkJLyogWzE0Nl0gLTIzLjAgZEIgKi8KKwkweGMxYjQwMDAwLAkJLyogWzE0N10gLTIyLjUgZEIgKi8KKwkweGMxYjAwMDAwLAkJLyogWzE0OF0gLTIyLjAgZEIgKi8KKwkweGMxYWMwMDAwLAkJLyogWzE0OV0gLTIxLjUgZEIgKi8KKwkweGMxYTgwMDAwLAkJLyogWzE1MF0gLTIxLjAgZEIgKi8KKwkweGMxYTQwMDAwLAkJLyogWzE1MV0gLTIwLjUgZEIgKi8KKwkweGMxYTAwMDAwLAkJLyogWzE1Ml0gLTIwLjAgZEIgKi8KKwkweGMxOWMwMDAwLAkJLyogWzE1M10gLTE5LjUgZEIgKi8KKwkweGMxOTgwMDAwLAkJLyogWzE1NF0gLTE5LjAgZEIgKi8KKwkweGMxOTQwMDAwLAkJLyogWzE1NV0gLTE4LjUgZEIgKi8KKwkweGMxOTAwMDAwLAkJLyogWzE1Nl0gLTE4LjAgZEIgKi8KKwkweGMxOGMwMDAwLAkJLyogWzE1N10gLTE3LjUgZEIgKi8KKwkweGMxODgwMDAwLAkJLyogWzE1OF0gLTE3LjAgZEIgKi8KKwkweGMxODQwMDAwLAkJLyogWzE1OV0gLTE2LjUgZEIgKi8KKwkweGMxODAwMDAwLAkJLyogWzE2MF0gLTE2LjAgZEIgKi8KKwkweGMxNzgwMDAwLAkJLyogWzE2MV0gLTE1LjUgZEIgKi8KKwkweGMxNzAwMDAwLAkJLyogWzE2Ml0gLTE1LjAgZEIgKi8KKwkweGMxNjgwMDAwLAkJLyogWzE2M10gLTE0LjUgZEIgKi8KKwkweGMxNjAwMDAwLAkJLyogWzE2NF0gLTE0LjAgZEIgKi8KKwkweGMxNTgwMDAwLAkJLyogWzE2NV0gLTEzLjUgZEIgKi8KKwkweGMxNTAwMDAwLAkJLyogWzE2Nl0gLTEzLjAgZEIgKi8KKwkweGMxNDgwMDAwLAkJLyogWzE2N10gLTEyLjUgZEIgKi8KKwkweGMxNDAwMDAwLAkJLyogWzE2OF0gLTEyLjAgZEIgKi8KKwkweGMxMzgwMDAwLAkJLyogWzE2OV0gLTExLjUgZEIgKi8KKwkweGMxMzAwMDAwLAkJLyogWzE3MF0gLTExLjAgZEIgKi8KKwkweGMxMjgwMDAwLAkJLyogWzE3MV0gLTEwLjUgZEIgKi8KKwkweGMxMjAwMDAwLAkJLyogWzE3Ml0gLTEwLjAgZEIgKi8KKwkweGMxMTgwMDAwLAkJLyogWzE3M10gLTkuNSBkQiAqLworCTB4YzExMDAwMDAsCQkvKiBbMTc0XSAtOS4wIGRCICovCisJMHhjMTA4MDAwMCwJCS8qIFsxNzVdIC04LjUgZEIgKi8KKwkweGMxMDAwMDAwLAkJLyogWzE3Nl0gLTguMCBkQiAqLworCTB4YzBmMDAwMDAsCQkvKiBbMTc3XSAtNy41IGRCICovCisJMHhjMGUwMDAwMCwJCS8qIFsxNzhdIC03LjAgZEIgKi8KKwkweGMwZDAwMDAwLAkJLyogWzE3OV0gLTYuNSBkQiAqLworCTB4YzBjMDAwMDAsCQkvKiBbMTgwXSAtNi4wIGRCICovCisJMHhjMGIwMDAwMCwJCS8qIFsxODFdIC01LjUgZEIgKi8KKwkweGMwYTAwMDAwLAkJLyogWzE4Ml0gLTUuMCBkQiAqLworCTB4YzA5MDAwMDAsCQkvKiBbMTgzXSAtNC41IGRCICovCisJMHhjMDgwMDAwMCwJCS8qIFsxODRdIC00LjAgZEIgKi8KKwkweGMwNjAwMDAwLAkJLyogWzE4NV0gLTMuNSBkQiAqLworCTB4YzA0MDAwMDAsCQkvKiBbMTg2XSAtMy4wIGRCICovCisJMHhjMDIwMDAwMCwJCS8qIFsxODddIC0yLjUgZEIgKi8KKwkweGMwMDAwMDAwLAkJLyogWzE4OF0gLTIuMCBkQiAqLworCTB4YmZjMDAwMDAsCQkvKiBbMTg5XSAtMS41IGRCICovCisJMHhiZjgwMDAwMCwJCS8qIFsxOTBdIC0xLjAgZEIgKi8KKwkweGJmMDAwMDAwLAkJLyogWzE5MV0gLTAuNSBkQiAqLworCTB4MDAwMDAwMDAsCQkvKiBbMTkyXSAwLjAgZEIgKi8KKwkweDNmMDAwMDAwLAkJLyogWzE5M10gMC41IGRCICovCisJMHgzZjgwMDAwMCwJCS8qIFsxOTRdIDEuMCBkQiAqLworCTB4M2ZjMDAwMDAsCQkvKiBbMTk1XSAxLjUgZEIgKi8KKwkweDQwMDAwMDAwLAkJLyogWzE5Nl0gMi4wIGRCICovCisJMHg0MDIwMDAwMCwJCS8qIFsxOTddIDIuNSBkQiAqLworCTB4NDA0MDAwMDAsCQkvKiBbMTk4XSAzLjAgZEIgKi8KKwkweDQwNjAwMDAwLAkJLyogWzE5OV0gMy41IGRCICovCisJMHg0MDgwMDAwMCwJCS8qIFsyMDBdIDQuMCBkQiAqLworCTB4NDA5MDAwMDAsCQkvKiBbMjAxXSA0LjUgZEIgKi8KKwkweDQwYTAwMDAwLAkJLyogWzIwMl0gNS4wIGRCICovCisJMHg0MGIwMDAwMCwJCS8qIFsyMDNdIDUuNSBkQiAqLworCTB4NDBjMDAwMDAsCQkvKiBbMjA0XSA2LjAgZEIgKi8KKwkweDQwZDAwMDAwLAkJLyogWzIwNV0gNi41IGRCICovCisJMHg0MGUwMDAwMCwJCS8qIFsyMDZdIDcuMCBkQiAqLworCTB4NDBmMDAwMDAsCQkvKiBbMjA3XSA3LjUgZEIgKi8KKwkweDQxMDAwMDAwLAkJLyogWzIwOF0gOC4wIGRCICovCisJMHg0MTA4MDAwMCwJCS8qIFsyMDldIDguNSBkQiAqLworCTB4NDExMDAwMDAsCQkvKiBbMjEwXSA5LjAgZEIgKi8KKwkweDQxMTgwMDAwLAkJLyogWzIxMV0gOS41IGRCICovCisJMHg0MTIwMDAwMCwJCS8qIFsyMTJdIDEwLjAgZEIgKi8KKwkweDQxMjgwMDAwLAkJLyogWzIxM10gMTAuNSBkQiAqLworCTB4NDEzMDAwMDAsCQkvKiBbMjE0XSAxMS4wIGRCICovCisJMHg0MTM4MDAwMCwJCS8qIFsyMTVdIDExLjUgZEIgKi8KKwkweDQxNDAwMDAwLAkJLyogWzIxNl0gMTIuMCBkQiAqLworCTB4NDE0ODAwMDAsCQkvKiBbMjE3XSAxMi41IGRCICovCisJMHg0MTUwMDAwMCwJCS8qIFsyMThdIDEzLjAgZEIgKi8KKwkweDQxNTgwMDAwLAkJLyogWzIxOV0gMTMuNSBkQiAqLworCTB4NDE2MDAwMDAsCQkvKiBbMjIwXSAxNC4wIGRCICovCisJMHg0MTY4MDAwMCwJCS8qIFsyMjFdIDE0LjUgZEIgKi8KKwkweDQxNzAwMDAwLAkJLyogWzIyMl0gMTUuMCBkQiAqLworCTB4NDE3ODAwMDAsCQkvKiBbMjIzXSAxNS41IGRCICovCisJMHg0MTgwMDAwMCwJCS8qIFsyMjRdIDE2LjAgZEIgKi8KKwkweDQxODQwMDAwLAkJLyogWzIyNV0gMTYuNSBkQiAqLworCTB4NDE4ODAwMDAsCQkvKiBbMjI2XSAxNy4wIGRCICovCisJMHg0MThjMDAwMCwJCS8qIFsyMjddIDE3LjUgZEIgKi8KKwkweDQxOTAwMDAwLAkJLyogWzIyOF0gMTguMCBkQiAqLworCTB4NDE5NDAwMDAsCQkvKiBbMjI5XSAxOC41IGRCICovCisJMHg0MTk4MDAwMCwJCS8qIFsyMzBdIDE5LjAgZEIgKi8KKwkweDQxOWMwMDAwLAkJLyogWzIzMV0gMTkuNSBkQiAqLworCTB4NDFhMDAwMDAsCQkvKiBbMjMyXSAyMC4wIGRCICovCisJMHg0MWE0MDAwMCwJCS8qIFsyMzNdIDIwLjUgZEIgKi8KKwkweDQxYTgwMDAwLAkJLyogWzIzNF0gMjEuMCBkQiAqLworCTB4NDFhYzAwMDAsCQkvKiBbMjM1XSAyMS41IGRCICovCisJMHg0MWIwMDAwMCwJCS8qIFsyMzZdIDIyLjAgZEIgKi8KKwkweDQxYjQwMDAwLAkJLyogWzIzN10gMjIuNSBkQiAqLworCTB4NDFiODAwMDAsCQkvKiBbMjM4XSAyMy4wIGRCICovCisJMHg0MWJjMDAwMCwJCS8qIFsyMzldIDIzLjUgZEIgKi8KKwkweDQxYzAwMDAwLAkJLyogWzI0MF0gMjQuMCBkQiAqLworCTB4NDFjNDAwMDAsCQkvKiBbMjQxXSAyNC41IGRCICovCisJMHg0MWM4MDAwMCwJCS8qIFsyNDJdIDI1LjAgZEIgKi8KKwkweDQxY2MwMDAwLAkJLyogWzI0M10gMjUuNSBkQiAqLworCTB4NDFkMDAwMDAsCQkvKiBbMjQ0XSAyNi4wIGRCICovCisJMHg0MWQ0MDAwMCwJCS8qIFsyNDVdIDI2LjUgZEIgKi8KKwkweDQxZDgwMDAwLAkJLyogWzI0Nl0gMjcuMCBkQiAqLworCTB4NDFkYzAwMDAsCQkvKiBbMjQ3XSAyNy41IGRCICovCisJMHg0MWUwMDAwMCwJCS8qIFsyNDhdIDI4LjAgZEIgKi8KKwkweDQxZTQwMDAwLAkJLyogWzI0OV0gMjguNSBkQiAqLworCTB4NDFlODAwMDAsCQkvKiBbMjUwXSAyOS4wIGRCICovCisJMHg0MWVjMDAwMCwJCS8qIFsyNTFdIDI5LjUgZEIgKi8KKwkweDQxZjAwMDAwLAkJLyogWzI1Ml0gMzAuMCBkQiAqLworCTB4NDFmNDAwMDAsCQkvKiBbMjUzXSAzMC41IGRCICovCisJMHg0MWY4MDAwMCwJCS8qIFsyNTRdIDMxLjAgZEIgKi8KKwkweDQxZmMwMDAwLAkJLyogWzI1NV0gMzEuNSBkQiAqLworfTsKKworI2RlZmluZSBNSVhBUlRfQU5BTE9HX0NBUFRVUkVfTEVWRUxfTUlOICAgMCAgICAgIC8qIC05Ni4wIGRCICsgOC4wIGRCID0gLTg4LjAgZEIgKi8KKyNkZWZpbmUgTUlYQVJUX0FOQUxPR19DQVBUVVJFX0xFVkVMX01BWCAgIDI1NSAgICAvKiAgMzEuNSBkQiArIDguMCBkQiA9ICAzOS41IGRCICovCisjZGVmaW5lIE1JWEFSVF9BTkFMT0dfQ0FQVFVSRV9aRVJPX0xFVkVMICAxNzYgICAgLyogIC04LjAgZEIgKyA4LjAgZEIgPSAgMC4wIGRCICovCisKKyNkZWZpbmUgTUlYQVJUX0FOQUxPR19QTEFZQkFDS19MRVZFTF9NSU4gIDAgICAgICAvKiAtOTYuMCBkQiArIDEuNSBkQiA9IC05NC41IGRCIChwb3NzaWJsZSBpcyBkb3duIHRvICgtMTE0LjArMS41KWRCKSAqLworI2RlZmluZSBNSVhBUlRfQU5BTE9HX1BMQVlCQUNLX0xFVkVMX01BWCAgMTkyICAgIC8qICAgMC4wIGRCICsgMS41IGRCID0gIDEuNSBkQiAqLworI2RlZmluZSBNSVhBUlRfQU5BTE9HX1BMQVlCQUNLX1pFUk9fTEVWRUwgMTg5ICAgIC8qICAtMS41IGRCICsgMS41IGRCID0gIDAuMCBkQiAqLworCitzdGF0aWMgaW50IG1peGFydF91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKG1peGFydF90KiBjaGlwLCBpbnQgaXNfY2FwdHVyZSkKK3sKKwlpbnQgaSwgZXJyOworCW1peGFydF9tc2dfdCByZXF1ZXN0OworCW1peGFydF9pb19sZXZlbF90IGlvX2xldmVsOworCW1peGFydF9yZXR1cm5fdWlkX3QgcmVzcDsKKworCW1lbXNldCgmaW9fbGV2ZWwsIDAsIHNpemVvZihpb19sZXZlbCkpOworCWlvX2xldmVsLmNoYW5uZWwgPSAtMTsgLyogbGVmdCBhbmQgcmlnaHQgKi8KKworCWZvcihpPTA7IGk8MjsgaSsrKSB7CisJCWlmKGlzX2NhcHR1cmUpIHsKKwkJCWlvX2xldmVsLmxldmVsW2ldLmFuYWxvZ19sZXZlbCA9IG1peGFydF9hbmFsb2dfbGV2ZWxbY2hpcC0+YW5hbG9nX2NhcHR1cmVfdm9sdW1lW2ldXTsKKwkJfSBlbHNlIHsKKwkJCWlmKGNoaXAtPmFuYWxvZ19wbGF5YmFja19hY3RpdmVbaV0pCisJCQkJaW9fbGV2ZWwubGV2ZWxbaV0uYW5hbG9nX2xldmVsID0gbWl4YXJ0X2FuYWxvZ19sZXZlbFtjaGlwLT5hbmFsb2dfcGxheWJhY2tfdm9sdW1lW2ldXTsKKwkJCWVsc2UKKwkJCQlpb19sZXZlbC5sZXZlbFtpXS5hbmFsb2dfbGV2ZWwgPSBtaXhhcnRfYW5hbG9nX2xldmVsW01JWEFSVF9BTkFMT0dfUExBWUJBQ0tfTEVWRUxfTUlOXTsKKwkJfQorCX0KKworCWlmKGlzX2NhcHR1cmUpCXJlcXVlc3QudWlkID0gY2hpcC0+dWlkX2luX2FuYWxvZ19waHlzaW87CisJZWxzZQkJcmVxdWVzdC51aWQgPSBjaGlwLT51aWRfb3V0X2FuYWxvZ19waHlzaW87CisJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMOworCXJlcXVlc3QuZGF0YSA9ICZpb19sZXZlbDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplb2YoaW9fbGV2ZWwpOworCisJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKKwlpZigoZXJyPDApIHx8IChyZXNwLmVycm9yX2NvZGUpKSB7CisJCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgaXNfY2FwdHVyZSwgcmVzcC5lcnJvcl9jb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogYW5hbG9nIGxldmVsIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBtaXhhcnRfYW5hbG9nX3ZvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjsKKwlpZihrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9PSAwKSB7CS8qIHBsYXliYWNrICovCisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IE1JWEFSVF9BTkFMT0dfUExBWUJBQ0tfTEVWRUxfTUlOOyAgLyogLTk2IGRCICovCisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IE1JWEFSVF9BTkFMT0dfUExBWUJBQ0tfTEVWRUxfTUFYOyAgLyogMCBkQiAqLworCX0gZWxzZSB7CQkJCS8qIGNhcHR1cmUgKi8KKwkJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gTUlYQVJUX0FOQUxPR19DQVBUVVJFX0xFVkVMX01JTjsgICAvKiAtOTYgZEIgKi8KKwkJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gTUlYQVJUX0FOQUxPR19DQVBUVVJFX0xFVkVMX01BWDsgICAvKiAzMS41IGRCICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGFydF9hbmFsb2dfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlkb3duKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwlpZihrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9PSAwKSB7CS8qIHBsYXliYWNrICovCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hpcC0+YW5hbG9nX3BsYXliYWNrX3ZvbHVtZVswXTsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjaGlwLT5hbmFsb2dfcGxheWJhY2tfdm9sdW1lWzFdOworCX0gZWxzZSB7CQkJCS8qIGNhcHR1cmUgKi8KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5hbmFsb2dfY2FwdHVyZV92b2x1bWVbMF07CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2hpcC0+YW5hbG9nX2NhcHR1cmVfdm9sdW1lWzFdOworCX0KKwl1cCgmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2FuYWxvZ192b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCW1peGFydF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2VkID0gMDsKKwlpbnQgaXNfY2FwdHVyZSwgaTsKKworCWRvd24oJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCWlzX2NhcHR1cmUgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgIT0gMCk7CisJZm9yKGk9MDsgaTwyOyBpKyspIHsKKwkJaW50ICBuZXdfdm9sdW1lID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCWludCogc3RvcmVkX3ZvbHVtZSA9IGlzX2NhcHR1cmUgPyAmY2hpcC0+YW5hbG9nX2NhcHR1cmVfdm9sdW1lW2ldIDogJmNoaXAtPmFuYWxvZ19wbGF5YmFja192b2x1bWVbaV07CisJCWlmKCpzdG9yZWRfdm9sdW1lICE9IG5ld192b2x1bWUpIHsKKwkJCSpzdG9yZWRfdm9sdW1lID0gbmV3X3ZvbHVtZTsKKwkJCWNoYW5nZWQgPSAxOworCQl9CisJfQorCWlmKGNoYW5nZWQpCW1peGFydF91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKGNoaXAsIGlzX2NhcHR1cmUpOworCXVwKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBtaXhhcnRfY29udHJvbF9hbmFsb2dfbGV2ZWwgPSB7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLyogbmFtZSB3aWxsIGJlIGZpbGxlZCBsYXRlciAqLworCS5pbmZvID0JCW1peGFydF9hbmFsb2dfdm9sX2luZm8sCisJLmdldCA9CQltaXhhcnRfYW5hbG9nX3ZvbF9nZXQsCisJLnB1dCA9CQltaXhhcnRfYW5hbG9nX3ZvbF9wdXQsCit9OworCisvKiBzaGFyZWQgKi8KK3N0YXRpYyBpbnQgbWl4YXJ0X3N3X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXhhcnRfYXVkaW9fc3dfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCW1peGFydF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJZG93bigmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5hbmFsb2dfcGxheWJhY2tfYWN0aXZlWzBdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2hpcC0+YW5hbG9nX3BsYXliYWNrX2FjdGl2ZVsxXTsKKwl1cCgmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X2F1ZGlvX3N3X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSwgY2hhbmdlZCA9IDA7CisJZG93bigmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJZm9yKGk9MDsgaTwyOyBpKyspIHsKKwkJaWYoY2hpcC0+YW5hbG9nX3BsYXliYWNrX2FjdGl2ZVtpXSAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSkgeworCQkJY2hpcC0+YW5hbG9nX3BsYXliYWNrX2FjdGl2ZVtpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJY2hhbmdlZCA9IDE7CisJCX0KKwl9CisJaWYoY2hhbmdlZCkJbWl4YXJ0X3VwZGF0ZV9hbmFsb2dfYXVkaW9fbGV2ZWwoY2hpcCwgMCk7IC8qIHVwZGF0ZSBwbGF5YmFjayBsZXZlbHMgKi8KKwl1cCgmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgbWl4YXJ0X2NvbnRyb2xfb3V0cHV0X3N3aXRjaCA9IHsKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCS5pbmZvID0gICAgICAgICBtaXhhcnRfc3dfaW5mbywJCS8qIHNoYXJlZCAqLworCS5nZXQgPSAgICAgICAgICBtaXhhcnRfYXVkaW9fc3dfZ2V0LAorCS5wdXQgPSAgICAgICAgICBtaXhhcnRfYXVkaW9fc3dfcHV0Cit9OworCitzdGF0aWMgdTMyIG1peGFydF9kaWdpdGFsX2xldmVsWzI1Nl0gPSB7CisJMHgwMDAwMDAwMCwJCS8qIFswMDBdID0gMC4wMGUrMDAwID0gbXV0ZSBpZiA8PSAtMTA5LjVkQiAqLworCTB4MzY2ZTFjN2EsCQkvKiBbMDAxXSA9IDMuNTVlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwOS4wZEIpICovCisJMHgzNjdjMzg2MCwJCS8qIFswMDJdID0gMy43NmUtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTA4LjVkQikgKi8KKwkweDM2ODU5NTI1LAkJLyogWzAwM10gPSAzLjk4ZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDguMGRCKSAqLworCTB4MzY4ZDdmNzQsCQkvKiBbMDA0XSA9IDQuMjJlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwNy41ZEIpICovCisJMHgzNjk1ZTFkNCwJCS8qIFswMDVdID0gNC40N2UtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTA3LjBkQikgKi8KKwkweDM2OWVjMzYyLAkJLyogWzAwNl0gPSA0LjczZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDYuNWRCKSAqLworCTB4MzZhODJiYTgsCQkvKiBbMDA3XSA9IDUuMDFlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwNi4wZEIpICovCisJMHgzNmIyMjJhMCwJCS8qIFswMDhdID0gNS4zMWUtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTA1LjVkQikgKi8KKwkweDM2YmNiMGMxLAkJLyogWzAwOV0gPSA1LjYyZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDUuMGRCKSAqLworCTB4MzZjN2RlZmQsCQkvKiBbMDEwXSA9IDUuOTZlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwNC41ZEIpICovCisJMHgzNmQzYjZkMywJCS8qIFswMTFdID0gNi4zMWUtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTA0LjBkQikgKi8KKwkweDM2ZTA0MjRlLAkJLyogWzAxMl0gPSA2LjY4ZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDMuNWRCKSAqLworCTB4MzZlZDhjMTQsCQkvKiBbMDEzXSA9IDcuMDhlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwMy4wZEIpICovCisJMHgzNmZiOWY2YywJCS8qIFswMTRdID0gNy41MGUtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTAyLjVkQikgKi8KKwkweDM3MDU0NDIzLAkJLyogWzAxNV0gPSA3Ljk0ZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDIuMGRCKSAqLworCTB4MzcwZDI5YTUsCQkvKiBbMDE2XSA9IDguNDFlLTAwNiA9IHBvdygxMC4wLCAwLjA1ICogLTEwMS41ZEIpICovCisJMHgzNzE1ODZmMCwJCS8qIFswMTddID0gOC45MWUtMDA2ID0gcG93KDEwLjAsIDAuMDUgKiAtMTAxLjBkQikgKi8KKwkweDM3MWU2MzFiLAkJLyogWzAxOF0gPSA5LjQ0ZS0wMDYgPSBwb3coMTAuMCwgMC4wNSAqIC0xMDAuNWRCKSAqLworCTB4MzcyN2M1YWMsCQkvKiBbMDE5XSA9IDEuMDBlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTEwMC4wZEIpICovCisJMHgzNzMxYjY5YSwJCS8qIFswMjBdID0gMS4wNmUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTkuNWRCKSAqLworCTB4MzczYzNlNTMsCQkvKiBbMDIxXSA9IDEuMTJlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTk5LjBkQikgKi8KKwkweDM3NDc2NWM4LAkJLyogWzAyMl0gPSAxLjE5ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05OC41ZEIpICovCisJMHgzNzUzMzY2ZiwJCS8qIFswMjNdID0gMS4yNmUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTguMGRCKSAqLworCTB4Mzc1ZmJhNGYsCQkvKiBbMDI0XSA9IDEuMzNlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTk3LjVkQikgKi8KKwkweDM3NmNmYzA3LAkJLyogWzAyNV0gPSAxLjQxZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05Ny4wZEIpICovCisJMHgzNzdiMDZkNSwJCS8qIFswMjZdID0gMS41MGUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTYuNWRCKSAqLworCTB4Mzc4NGYzNTIsCQkvKiBbMDI3XSA9IDEuNThlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTk2LjBkQikgKi8KKwkweDM3OGNkNDBiLAkJLyogWzAyOF0gPSAxLjY4ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05NS41ZEIpICovCisJMHgzNzk1MmM0MiwJCS8qIFswMjldID0gMS43OGUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTUuMGRCKSAqLworCTB4Mzc5ZTAzMGUsCQkvKiBbMDMwXSA9IDEuODhlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTk0LjVkQikgKi8KKwkweDM3YTc1ZmVmLAkJLyogWzAzMV0gPSAyLjAwZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05NC4wZEIpICovCisJMHgzN2IxNGFkNSwJCS8qIFswMzJdID0gMi4xMWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTMuNWRCKSAqLworCTB4MzdiYmNjMmMsCQkvKiBbMDMzXSA9IDIuMjRlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTkzLjBkQikgKi8KKwkweDM3YzZlY2RkLAkJLyogWzAzNF0gPSAyLjM3ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05Mi41ZEIpICovCisJMHgzN2QyYjY1YSwJCS8qIFswMzVdID0gMi41MWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTIuMGRCKSAqLworCTB4MzdkZjMyYTMsCQkvKiBbMDM2XSA9IDIuNjZlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTkxLjVkQikgKi8KKwkweDM3ZWM2YzUwLAkJLyogWzAzN10gPSAyLjgyZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC05MS4wZEIpICovCisJMHgzN2ZhNmU5YiwJCS8qIFswMzhdID0gMi45OWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtOTAuNWRCKSAqLworCTB4MzgwNGEyYjMsCQkvKiBbMDM5XSA9IDMuMTZlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTkwLjBkQikgKi8KKwkweDM4MGM3ZWE0LAkJLyogWzA0MF0gPSAzLjM1ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04OS41ZEIpICovCisJMHgzODE0ZDFjYywJCS8qIFswNDFdID0gMy41NWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODkuMGRCKSAqLworCTB4MzgxZGEzM2MsCQkvKiBbMDQyXSA9IDMuNzZlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTg4LjVkQikgKi8KKwkweDM4MjZmYTZmLAkJLyogWzA0M10gPSAzLjk4ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04OC4wZEIpICovCisJMHgzODMwZGY1MSwJCS8qIFswNDRdID0gNC4yMmUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODcuNWRCKSAqLworCTB4MzgzYjVhNDksCQkvKiBbMDQ1XSA9IDQuNDdlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTg3LjBkQikgKi8KKwkweDM4NDY3NDNiLAkJLyogWzA0Nl0gPSA0LjczZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04Ni41ZEIpICovCisJMHgzODUyMzY5MiwJCS8qIFswNDddID0gNS4wMWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODYuMGRCKSAqLworCTB4Mzg1ZWFiNDgsCQkvKiBbMDQ4XSA9IDUuMzFlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTg1LjVkQikgKi8KKwkweDM4NmJkY2YxLAkJLyogWzA0OV0gPSA1LjYyZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04NS4wZEIpICovCisJMHgzODc5ZDZiYywJCS8qIFswNTBdID0gNS45NmUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODQuNWRCKSAqLworCTB4Mzg4NDUyNDQsCQkvKiBbMDUxXSA9IDYuMzFlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTg0LjBkQikgKi8KKwkweDM4OGMyOTcxLAkJLyogWzA1Ml0gPSA2LjY4ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04My41ZEIpICovCisJMHgzODk0Nzc4ZCwJCS8qIFswNTNdID0gNy4wOGUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODMuMGRCKSAqLworCTB4Mzg5ZDQzYTQsCQkvKiBbMDU0XSA9IDcuNTBlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTgyLjVkQikgKi8KKwkweDM4YTY5NTJjLAkJLyogWzA1NV0gPSA3Ljk0ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04Mi4wZEIpICovCisJMHgzOGIwNzQwZiwJCS8qIFswNTZdID0gOC40MWUtMDA1ID0gcG93KDEwLjAsIDAuMDUgKiAtODEuNWRCKSAqLworCTB4MzhiYWU4YWMsCQkvKiBbMDU3XSA9IDguOTFlLTAwNSA9IHBvdygxMC4wLCAwLjA1ICogLTgxLjBkQikgKi8KKwkweDM4YzVmYmUyLAkJLyogWzA1OF0gPSA5LjQ0ZS0wMDUgPSBwb3coMTAuMCwgMC4wNSAqIC04MC41ZEIpICovCisJMHgzOGQxYjcxNywJCS8qIFswNTldID0gMS4wMGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtODAuMGRCKSAqLworCTB4MzhkZTI0NDAsCQkvKiBbMDYwXSA9IDEuMDZlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTc5LjVkQikgKi8KKwkweDM4ZWI0ZGU4LAkJLyogWzA2MV0gPSAxLjEyZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03OS4wZEIpICovCisJMHgzOGY5M2YzYSwJCS8qIFswNjJdID0gMS4xOWUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzguNWRCKSAqLworCTB4MzkwNDAyMDYsCQkvKiBbMDYzXSA9IDEuMjZlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTc4LjBkQikgKi8KKwkweDM5MGJkNDcyLAkJLyogWzA2NF0gPSAxLjMzZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03Ny41ZEIpICovCisJMHgzOTE0MWQ4NCwJCS8qIFswNjVdID0gMS40MWUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzcuMGRCKSAqLworCTB4MzkxY2U0NDUsCQkvKiBbMDY2XSA9IDEuNTBlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTc2LjVkQikgKi8KKwkweDM5MjYzMDI3LAkJLyogWzA2N10gPSAxLjU4ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03Ni4wZEIpICovCisJMHgzOTMwMDkwZCwJCS8qIFswNjhdID0gMS42OGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzUuNWRCKSAqLworCTB4MzkzYTc3NTMsCQkvKiBbMDY5XSA9IDEuNzhlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTc1LjBkQikgKi8KKwkweDM5NDU4M2QyLAkJLyogWzA3MF0gPSAxLjg4ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03NC41ZEIpICovCisJMHgzOTUxMzdlYSwJCS8qIFswNzFdID0gMi4wMGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzQuMGRCKSAqLworCTB4Mzk1ZDlkOGEsCQkvKiBbMDcyXSA9IDIuMTFlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTczLjVkQikgKi8KKwkweDM5NmFiZjM3LAkJLyogWzA3M10gPSAyLjI0ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03My4wZEIpICovCisJMHgzOTc4YTgxNCwJCS8qIFswNzRdID0gMi4zN2UtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzIuNWRCKSAqLworCTB4Mzk4M2IxZjgsCQkvKiBbMDc1XSA9IDIuNTFlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTcyLjBkQikgKi8KKwkweDM5OGI3ZmE2LAkJLyogWzA3Nl0gPSAyLjY2ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03MS41ZEIpICovCisJMHgzOTkzYzNiMiwJCS8qIFswNzddID0gMi44MmUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNzEuMGRCKSAqLworCTB4Mzk5Yzg1MjEsCQkvKiBbMDc4XSA9IDIuOTllLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTcwLjVkQikgKi8KKwkweDM5YTVjYjVmLAkJLyogWzA3OV0gPSAzLjE2ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC03MC4wZEIpICovCisJMHgzOWFmOWU0ZCwJCS8qIFswODBdID0gMy4zNWUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjkuNWRCKSAqLworCTB4MzliYTA2M2YsCQkvKiBbMDgxXSA9IDMuNTVlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTY5LjBkQikgKi8KKwkweDM5YzUwYzBiLAkJLyogWzA4Ml0gPSAzLjc2ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02OC41ZEIpICovCisJMHgzOWQwYjkwYSwJCS8qIFswODNdID0gMy45OGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjguMGRCKSAqLworCTB4MzlkZDE3MjYsCQkvKiBbMDg0XSA9IDQuMjJlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTY3LjVkQikgKi8KKwkweDM5ZWEzMGRiLAkJLyogWzA4NV0gPSA0LjQ3ZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02Ny4wZEIpICovCisJMHgzOWY4MTE0OSwJCS8qIFswODZdID0gNC43M2UtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjYuNWRCKSAqLworCTB4M2EwMzYyMWIsCQkvKiBbMDg3XSA9IDUuMDFlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTY2LjBkQikgKi8KKwkweDNhMGIyYjBkLAkJLyogWzA4OF0gPSA1LjMxZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02NS41ZEIpICovCisJMHgzYTEzNmExNiwJCS8qIFswODldID0gNS42MmUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjUuMGRCKSAqLworCTB4M2ExYzI2MzYsCQkvKiBbMDkwXSA9IDUuOTZlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTY0LjVkQikgKi8KKwkweDNhMjU2NmQ1LAkJLyogWzA5MV0gPSA2LjMxZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02NC4wZEIpICovCisJMHgzYTJmMzNjZCwJCS8qIFswOTJdID0gNi42OGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjMuNWRCKSAqLworCTB4M2EzOTk1NzAsCQkvKiBbMDkzXSA9IDcuMDhlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTYzLjBkQikgKi8KKwkweDNhNDQ5NDhjLAkJLyogWzA5NF0gPSA3LjUwZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02Mi41ZEIpICovCisJMHgzYTUwM2E3NywJCS8qIFswOTVdID0gNy45NGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjIuMGRCKSAqLworCTB4M2E1YzkxMTIsCQkvKiBbMDk2XSA9IDguNDFlLTAwNCA9IHBvdygxMC4wLCAwLjA1ICogLTYxLjVkQikgKi8KKwkweDNhNjlhMmQ3LAkJLyogWzA5N10gPSA4LjkxZS0wMDQgPSBwb3coMTAuMCwgMC4wNSAqIC02MS4wZEIpICovCisJMHgzYTc3N2FkYSwJCS8qIFswOThdID0gOS40NGUtMDA0ID0gcG93KDEwLjAsIDAuMDUgKiAtNjAuNWRCKSAqLworCTB4M2E4MzEyNmYsCQkvKiBbMDk5XSA9IDEuMDBlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTYwLjBkQikgKi8KKwkweDNhOGFkNmE4LAkJLyogWzEwMF0gPSAxLjA2ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01OS41ZEIpICovCisJMHgzYTkzMTBiMSwJCS8qIFsxMDFdID0gMS4xMmUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTkuMGRCKSAqLworCTB4M2E5YmM3ODQsCQkvKiBbMTAyXSA9IDEuMTllLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTU4LjVkQikgKi8KKwkweDNhYTUwMjg3LAkJLyogWzEwM10gPSAxLjI2ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01OC4wZEIpICovCisJMHgzYWFlYzk4ZSwJCS8qIFsxMDRdID0gMS4zM2UtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTcuNWRCKSAqLworCTB4M2FiOTI0ZTUsCQkvKiBbMTA1XSA9IDEuNDFlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTU3LjBkQikgKi8KKwkweDNhYzQxZDU2LAkJLyogWzEwNl0gPSAxLjUwZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01Ni41ZEIpICovCisJMHgzYWNmYmMzMSwJCS8qIFsxMDddID0gMS41OGUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTYuMGRCKSAqLworCTB4M2FkYzBiNTEsCQkvKiBbMTA4XSA9IDEuNjhlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTU1LjVkQikgKi8KKwkweDNhZTkxNTI4LAkJLyogWzEwOV0gPSAxLjc4ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01NS4wZEIpICovCisJMHgzYWY2ZTRjNiwJCS8qIFsxMTBdID0gMS44OGUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTQuNWRCKSAqLworCTB4M2IwMmMyZjIsCQkvKiBbMTExXSA9IDIuMDBlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTU0LjBkQikgKi8KKwkweDNiMGE4Mjc2LAkJLyogWzExMl0gPSAyLjExZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01My41ZEIpICovCisJMHgzYjEyYjc4MiwJCS8qIFsxMTNdID0gMi4yNGUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTMuMGRCKSAqLworCTB4M2IxYjY5MGQsCQkvKiBbMTE0XSA9IDIuMzdlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTUyLjVkQikgKi8KKwkweDNiMjQ5ZTc2LAkJLyogWzExNV0gPSAyLjUxZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01Mi4wZEIpICovCisJMHgzYjJlNWY4ZiwJCS8qIFsxMTZdID0gMi42NmUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTEuNWRCKSAqLworCTB4M2IzOGI0OWYsCQkvKiBbMTE3XSA9IDIuODJlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTUxLjBkQikgKi8KKwkweDNiNDNhNjY5LAkJLyogWzExOF0gPSAyLjk5ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC01MC41ZEIpICovCisJMHgzYjRmM2UzNywJCS8qIFsxMTldID0gMy4xNmUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNTAuMGRCKSAqLworCTB4M2I1Yjg1ZTAsCQkvKiBbMTIwXSA9IDMuMzVlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQ5LjVkQikgKi8KKwkweDNiNjg4N2NmLAkJLyogWzEyMV0gPSAzLjU1ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00OS4wZEIpICovCisJMHgzYjc2NGYwZSwJCS8qIFsxMjJdID0gMy43NmUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDguNWRCKSAqLworCTB4M2I4MjczYTYsCQkvKiBbMTIzXSA9IDMuOThlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQ4LjBkQikgKi8KKwkweDNiOGEyZTc3LAkJLyogWzEyNF0gPSA0LjIyZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00Ny41ZEIpICovCisJMHgzYjkyNWU4OSwJCS8qIFsxMjVdID0gNC40N2UtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDcuMGRCKSAqLworCTB4M2I5YjBhY2UsCQkvKiBbMTI2XSA9IDQuNzNlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQ2LjVkQikgKi8KKwkweDNiYTQzYWEyLAkJLyogWzEyN10gPSA1LjAxZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00Ni4wZEIpICovCisJMHgzYmFkZjVkMSwJCS8qIFsxMjhdID0gNS4zMWUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDUuNWRCKSAqLworCTB4M2JiODQ0OWMsCQkvKiBbMTI5XSA9IDUuNjJlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQ1LjBkQikgKi8KKwkweDNiYzMyZmMzLAkJLyogWzEzMF0gPSA1Ljk2ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00NC41ZEIpICovCisJMHgzYmNlYzA4YSwJCS8qIFsxMzFdID0gNi4zMWUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDQuMGRCKSAqLworCTB4M2JkYjAwYzAsCQkvKiBbMTMyXSA9IDYuNjhlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQzLjVkQikgKi8KKwkweDNiZTdmYWNjLAkJLyogWzEzM10gPSA3LjA4ZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00My4wZEIpICovCisJMHgzYmY1YjliMCwJCS8qIFsxMzRdID0gNy41MGUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDIuNWRCKSAqLworCTB4M2MwMjI0OGEsCQkvKiBbMTM1XSA9IDcuOTRlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQyLjBkQikgKi8KKwkweDNjMDlkYWFjLAkJLyogWzEzNl0gPSA4LjQxZS0wMDMgPSBwb3coMTAuMCwgMC4wNSAqIC00MS41ZEIpICovCisJMHgzYzEyMDVjNiwJCS8qIFsxMzddID0gOC45MWUtMDAzID0gcG93KDEwLjAsIDAuMDUgKiAtNDEuMGRCKSAqLworCTB4M2MxYWFjYzgsCQkvKiBbMTM4XSA9IDkuNDRlLTAwMyA9IHBvdygxMC4wLCAwLjA1ICogLTQwLjVkQikgKi8KKwkweDNjMjNkNzBhLAkJLyogWzEzOV0gPSAxLjAwZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC00MC4wZEIpICovCisJMHgzYzJkOGM1MiwJCS8qIFsxNDBdID0gMS4wNmUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzkuNWRCKSAqLworCTB4M2MzN2Q0ZGQsCQkvKiBbMTQxXSA9IDEuMTJlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTM5LjBkQikgKi8KKwkweDNjNDJiOTY1LAkJLyogWzE0Ml0gPSAxLjE5ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zOC41ZEIpICovCisJMHgzYzRlNDMyOSwJCS8qIFsxNDNdID0gMS4yNmUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzguMGRCKSAqLworCTB4M2M1YTdiZjEsCQkvKiBbMTQ0XSA9IDEuMzNlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTM3LjVkQikgKi8KKwkweDNjNjc2ZTFlLAkJLyogWzE0NV0gPSAxLjQxZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zNy4wZEIpICovCisJMHgzYzc1MjRhYywJCS8qIFsxNDZdID0gMS41MGUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzYuNWRCKSAqLworCTB4M2M4MWQ1OWYsCQkvKiBbMTQ3XSA9IDEuNThlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTM2LjBkQikgKi8KKwkweDNjODk4NzEyLAkJLyogWzE0OF0gPSAxLjY4ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zNS41ZEIpICovCisJMHgzYzkxYWQzOSwJCS8qIFsxNDldID0gMS43OGUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzUuMGRCKSAqLworCTB4M2M5YTRlZmMsCQkvKiBbMTUwXSA9IDEuODhlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTM0LjVkQikgKi8KKwkweDNjYTM3M2FmLAkJLyogWzE1MV0gPSAyLjAwZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zNC4wZEIpICovCisJMHgzY2FkMjMxNCwJCS8qIFsxNTJdID0gMi4xMWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzMuNWRCKSAqLworCTB4M2NiNzY1NjMsCQkvKiBbMTUzXSA9IDIuMjRlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTMzLjBkQikgKi8KKwkweDNjYzI0MzUwLAkJLyogWzE1NF0gPSAyLjM3ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zMi41ZEIpICovCisJMHgzY2NkYzYxNCwJCS8qIFsxNTVdID0gMi41MWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzIuMGRCKSAqLworCTB4M2NkOWY3NzMsCQkvKiBbMTU2XSA9IDIuNjZlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTMxLjVkQikgKi8KKwkweDNjZTZlMWM2LAkJLyogWzE1N10gPSAyLjgyZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0zMS4wZEIpICovCisJMHgzY2Y0OTAwMywJCS8qIFsxNThdID0gMi45OWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMzAuNWRCKSAqLworCTB4M2QwMTg2ZTIsCQkvKiBbMTU5XSA9IDMuMTZlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTMwLjBkQikgKi8KKwkweDNkMDkzM2FjLAkJLyogWzE2MF0gPSAzLjM1ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yOS41ZEIpICovCisJMHgzZDExNTRlMSwJCS8qIFsxNjFdID0gMy41NWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjkuMGRCKSAqLworCTB4M2QxOWYxNjksCQkvKiBbMTYyXSA9IDMuNzZlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTI4LjVkQikgKi8KKwkweDNkMjMxMDkwLAkJLyogWzE2M10gPSAzLjk4ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yOC4wZEIpICovCisJMHgzZDJjYmExNSwJCS8qIFsxNjRdID0gNC4yMmUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjcuNWRCKSAqLworCTB4M2QzNmY2MmIsCQkvKiBbMTY1XSA9IDQuNDdlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTI3LjBkQikgKi8KKwkweDNkNDFjZDgxLAkJLyogWzE2Nl0gPSA0LjczZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yNi41ZEIpICovCisJMHgzZDRkNDk0YSwJCS8qIFsxNjddID0gNS4wMWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjYuMGRCKSAqLworCTB4M2Q1OTczNDUsCQkvKiBbMTY4XSA9IDUuMzFlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTI1LjVkQikgKi8KKwkweDNkNjY1NWMzLAkJLyogWzE2OV0gPSA1LjYyZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yNS4wZEIpICovCisJMHgzZDczZmJiNCwJCS8qIFsxNzBdID0gNS45NmUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjQuNWRCKSAqLworCTB4M2Q4MTM4NTYsCQkvKiBbMTcxXSA9IDYuMzFlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTI0LjBkQikgKi8KKwkweDNkODhlMDc4LAkJLyogWzE3Ml0gPSA2LjY4ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yMy41ZEIpICovCisJMHgzZDkwZmNiZiwJCS8qIFsxNzNdID0gNy4wOGUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjMuMGRCKSAqLworCTB4M2Q5OTk0MGUsCQkvKiBbMTc0XSA9IDcuNTBlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTIyLjVkQikgKi8KKwkweDNkYTJhZGFkLAkJLyogWzE3NV0gPSA3Ljk0ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yMi4wZEIpICovCisJMHgzZGFjNTE1NiwJCS8qIFsxNzZdID0gOC40MWUtMDAyID0gcG93KDEwLjAsIDAuMDUgKiAtMjEuNWRCKSAqLworCTB4M2RiNjg3MzgsCQkvKiBbMTc3XSA9IDguOTFlLTAwMiA9IHBvdygxMC4wLCAwLjA1ICogLTIxLjBkQikgKi8KKwkweDNkYzE1N2ZiLAkJLyogWzE3OF0gPSA5LjQ0ZS0wMDIgPSBwb3coMTAuMCwgMC4wNSAqIC0yMC41ZEIpICovCisJMHgzZGNjY2NjZCwJCS8qIFsxNzldID0gMS4wMGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMjAuMGRCKSAqLworCTB4M2RkOGVmNjcsCQkvKiBbMTgwXSA9IDEuMDZlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTE5LjVkQikgKi8KKwkweDNkZTVjYTE1LAkJLyogWzE4MV0gPSAxLjEyZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xOS4wZEIpICovCisJMHgzZGYzNjdiZiwJCS8qIFsxODJdID0gMS4xOWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTguNWRCKSAqLworCTB4M2UwMGU5ZjksCQkvKiBbMTgzXSA9IDEuMjZlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTE4LjBkQikgKi8KKwkweDNlMDg4ZDc3LAkJLyogWzE4NF0gPSAxLjMzZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xNy41ZEIpICovCisJMHgzZTEwYTRkMywJCS8qIFsxODVdID0gMS40MWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTcuMGRCKSAqLworCTB4M2UxOTM2ZWMsCQkvKiBbMTg2XSA9IDEuNTBlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTE2LjVkQikgKi8KKwkweDNlMjI0YjA2LAkJLyogWzE4N10gPSAxLjU4ZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xNi4wZEIpICovCisJMHgzZTJiZThkNywJCS8qIFsxODhdID0gMS42OGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTUuNWRCKSAqLworCTB4M2UzNjE4ODcsCQkvKiBbMTg5XSA9IDEuNzhlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTE1LjBkQikgKi8KKwkweDNlNDBlMmJiLAkJLyogWzE5MF0gPSAxLjg4ZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xNC41ZEIpICovCisJMHgzZTRjNTA5YiwJCS8qIFsxOTFdID0gMi4wMGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTQuMGRCKSAqLworCTB4M2U1ODZiZDksCQkvKiBbMTkyXSA9IDIuMTFlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTEzLjVkQikgKi8KKwkweDNlNjUzZWJiLAkJLyogWzE5M10gPSAyLjI0ZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xMy4wZEIpICovCisJMHgzZTcyZDQyNCwJCS8qIFsxOTRdID0gMi4zN2UtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTIuNWRCKSAqLworCTB4M2U4MDliY2MsCQkvKiBbMTk1XSA9IDIuNTFlLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTEyLjBkQikgKi8KKwkweDNlODgzYWE4LAkJLyogWzE5Nl0gPSAyLjY2ZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xMS41ZEIpICovCisJMHgzZTkwNGQxYywJCS8qIFsxOTddID0gMi44MmUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMTEuMGRCKSAqLworCTB4M2U5OGRhMDIsCQkvKiBbMTk4XSA9IDIuOTllLTAwMSA9IHBvdygxMC4wLCAwLjA1ICogLTEwLjVkQikgKi8KKwkweDNlYTFlODliLAkJLyogWzE5OV0gPSAzLjE2ZS0wMDEgPSBwb3coMTAuMCwgMC4wNSAqIC0xMC4wZEIpICovCisJMHgzZWFiODA5NywJCS8qIFsyMDBdID0gMy4zNWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtOS41ZEIpICovCisJMHgzZWI1YWExYSwJCS8qIFsyMDFdID0gMy41NWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtOS4wZEIpICovCisJMHgzZWMwNmRjMywJCS8qIFsyMDJdID0gMy43NmUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtOC41ZEIpICovCisJMHgzZWNiZDRiNCwJCS8qIFsyMDNdID0gMy45OGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtOC4wZEIpICovCisJMHgzZWQ3ZTg5YiwJCS8qIFsyMDRdID0gNC4yMmUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNy41ZEIpICovCisJMHgzZWU0YjNiNiwJCS8qIFsyMDVdID0gNC40N2UtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNy4wZEIpICovCisJMHgzZWYyNDBlMiwJCS8qIFsyMDZdID0gNC43M2UtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNi41ZEIpICovCisJMHgzZjAwNGRjZSwJCS8qIFsyMDddID0gNS4wMWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNi4wZEIpICovCisJMHgzZjA3ZTgwYiwJCS8qIFsyMDhdID0gNS4zMWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNS41ZEIpICovCisJMHgzZjBmZjU5YSwJCS8qIFsyMDldID0gNS42MmUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNS4wZEIpICovCisJMHgzZjE4N2Q1MCwJCS8qIFsyMTBdID0gNS45NmUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNC41ZEIpICovCisJMHgzZjIxODY2YywJCS8qIFsyMTFdID0gNi4zMWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtNC4wZEIpICovCisJMHgzZjJiMTg5NiwJCS8qIFsyMTJdID0gNi42OGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMy41ZEIpICovCisJMHgzZjM1M2JlZiwJCS8qIFsyMTNdID0gNy4wOGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMy4wZEIpICovCisJMHgzZjNmZjkxMSwJCS8qIFsyMTRdID0gNy41MGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMi41ZEIpICovCisJMHgzZjRiNTkxOCwJCS8qIFsyMTVdID0gNy45NGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMi4wZEIpICovCisJMHgzZjU3NjVhYywJCS8qIFsyMTZdID0gOC40MWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMS41ZEIpICovCisJMHgzZjY0MjkwNSwJCS8qIFsyMTddID0gOC45MWUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMS4wZEIpICovCisJMHgzZjcxYWRmOSwJCS8qIFsyMThdID0gOS40NGUtMDAxID0gcG93KDEwLjAsIDAuMDUgKiAtMC41ZEIpICovCisJMHgzZjgwMDAwMCwJCS8qIFsyMTldID0gMS4wMGUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiAwLjBkQikgKi8KKwkweDNmODc5NWEwLAkJLyogWzIyMF0gPSAxLjA2ZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDAuNWRCKSAqLworCTB4M2Y4ZjllNGQsCQkvKiBbMjIxXSA9IDEuMTJlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMS4wZEIpICovCisJMHgzZjk4MjBkNywJCS8qIFsyMjJdID0gMS4xOWUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiAxLjVkQikgKi8KKwkweDNmYTEyNDc4LAkJLyogWzIyM10gPSAxLjI2ZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDIuMGRCKSAqLworCTB4M2ZhYWIwZDUsCQkvKiBbMjI0XSA9IDEuMzNlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMi41ZEIpICovCisJMHgzZmI0Y2UwOCwJCS8qIFsyMjVdID0gMS40MWUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiAzLjBkQikgKi8KKwkweDNmYmY4NGE2LAkJLyogWzIyNl0gPSAxLjUwZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDMuNWRCKSAqLworCTB4M2ZjYWRkYzgsCQkvKiBbMjI3XSA9IDEuNThlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogNC4wZEIpICovCisJMHgzZmQ2ZTMwZCwJCS8qIFsyMjhdID0gMS42OGUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiA0LjVkQikgKi8KKwkweDNmZTM5ZWE5LAkJLyogWzIyOV0gPSAxLjc4ZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDUuMGRCKSAqLworCTB4M2ZmMTFiNmEsCQkvKiBbMjMwXSA9IDEuODhlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogNS41ZEIpICovCisJMHgzZmZmNjRjMSwJCS8qIFsyMzFdID0gMi4wMGUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiA2LjBkQikgKi8KKwkweDQwMDc0MzY4LAkJLyogWzIzMl0gPSAyLjExZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDYuNWRCKSAqLworCTB4NDAwZjQ3MzUsCQkvKiBbMjMzXSA9IDIuMjRlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogNy4wZEIpICovCisJMHg0MDE3YzQ5NiwJCS8qIFsyMzRdID0gMi4zN2UrMDAwID0gcG93KDEwLjAsIDAuMDUgKiA3LjVkQikgKi8KKwkweDQwMjBjMmJmLAkJLyogWzIzNV0gPSAyLjUxZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDguMGRCKSAqLworCTB4NDAyYTQ5NTIsCQkvKiBbMjM2XSA9IDIuNjZlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogOC41ZEIpICovCisJMHg0MDM0NjA2MywJCS8qIFsyMzddID0gMi44MmUrMDAwID0gcG93KDEwLjAsIDAuMDUgKiA5LjBkQikgKi8KKwkweDQwM2YxMDgyLAkJLyogWzIzOF0gPSAyLjk5ZSswMDAgPSBwb3coMTAuMCwgMC4wNSAqIDkuNWRCKSAqLworCTB4NDA0YTYyYzIsCQkvKiBbMjM5XSA9IDMuMTZlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTAuMGRCKSAqLworCTB4NDA1NjYwYmQsCQkvKiBbMjQwXSA9IDMuMzVlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTAuNWRCKSAqLworCTB4NDA2MzE0YTAsCQkvKiBbMjQxXSA9IDMuNTVlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTEuMGRCKSAqLworCTB4NDA3MDg5MzMsCQkvKiBbMjQyXSA9IDMuNzZlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTEuNWRCKSAqLworCTB4NDA3ZWM5ZTEsCQkvKiBbMjQzXSA9IDMuOThlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTIuMGRCKSAqLworCTB4NDA4NmYxNjEsCQkvKiBbMjQ0XSA9IDQuMjJlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTIuNWRCKSAqLworCTB4NDA4ZWYwNTIsCQkvKiBbMjQ1XSA9IDQuNDdlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTMuMGRCKSAqLworCTB4NDA5NzY4OGQsCQkvKiBbMjQ2XSA9IDQuNzNlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTMuNWRCKSAqLworCTB4NDBhMDYxNDIsCQkvKiBbMjQ3XSA9IDUuMDFlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTQuMGRCKSAqLworCTB4NDBhOWUyMGUsCQkvKiBbMjQ4XSA9IDUuMzFlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTQuNWRCKSAqLworCTB4NDBiM2YzMDAsCQkvKiBbMjQ5XSA9IDUuNjJlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTUuMGRCKSAqLworCTB4NDBiZTljYTUsCQkvKiBbMjUwXSA9IDUuOTZlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTUuNWRCKSAqLworCTB4NDBjOWU4MDcsCQkvKiBbMjUxXSA9IDYuMzFlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTYuMGRCKSAqLworCTB4NDBkNWRlYmMsCQkvKiBbMjUyXSA9IDYuNjhlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTYuNWRCKSAqLworCTB4NDBlMjhhZWIsCQkvKiBbMjUzXSA9IDcuMDhlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTcuMGRCKSAqLworCTB4NDBlZmY3NTUsCQkvKiBbMjU0XSA9IDcuNTBlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTcuNWRCKSAqLworCTB4NDBmZTJmNWUsCQkvKiBbMjU1XSA9IDcuOTRlKzAwMCA9IHBvdygxMC4wLCAwLjA1ICogMTguMGRCKSAqLworfTsKKworI2RlZmluZSBNSVhBUlRfRElHSVRBTF9MRVZFTF9NSU4gICAwICAgICAgLyogLTEwOS41IGRCICovCisjZGVmaW5lIE1JWEFSVF9ESUdJVEFMX0xFVkVMX01BWCAgIDI1NSAgICAvKiAgMTguMCBkQiAqLworI2RlZmluZSBNSVhBUlRfRElHSVRBTF9aRVJPX0xFVkVMICAyMTkgICAgLyogIDAuMCBkQiAqLworCisKK2ludCBtaXhhcnRfdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbChtaXhhcnRfdCogY2hpcCwgaW50IGlzX2FlcywgaW50IGlkeCkKK3sKKwlpbnQgZXJyLCBpOworCWludCB2b2x1bWVbMl07CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisJbWl4YXJ0X3NldF9vdXRfc3RyZWFtX2xldmVsX3JlcV90IHNldF9sZXZlbDsKKwl1MzIgc3RhdHVzOworCW1peGFydF9waXBlX3QgKnBpcGU7CisKKwltZW1zZXQoJnNldF9sZXZlbCwgMCwgc2l6ZW9mKHNldF9sZXZlbCkpOworCXNldF9sZXZlbC5uYl9vZl9zdHJlYW0gPSAxOworCXNldF9sZXZlbC5zdHJlYW1fbGV2ZWwuZGVzYy5zdHJlYW1faWR4ID0gaWR4OworCisJaWYoaXNfYWVzKSB7CisJCXBpcGUgPSAmY2hpcC0+cGlwZV9vdXRfZGlnOwkvKiBBRVMgcGxheWJhY2sgKi8KKwkJaWR4ICs9IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TOworCX0gZWxzZSB7CisJCXBpcGUgPSAmY2hpcC0+cGlwZV9vdXRfYW5hOwkvKiBhbmFsb2cgcGxheWJhY2sgKi8KKwl9CisKKwkvKiBvbmx5IHdoZW4gcGlwZSBleGlzdHMgISAqLworCWlmKHBpcGUtPnN0YXR1cyA9PSBQSVBFX1VOREVGSU5FRCkKKwkJcmV0dXJuIDA7CisKKwlzZXRfbGV2ZWwuc3RyZWFtX2xldmVsLmRlc2MudWlkX3BpcGUgPSBwaXBlLT5ncm91cF91aWQ7CisKKwlmb3IoaT0wOyBpPDI7IGkrKykgeworCQlpZihjaGlwLT5kaWdpdGFsX3BsYXliYWNrX2FjdGl2ZVtpZHhdW2ldKQorCQkJdm9sdW1lW2ldID0gY2hpcC0+ZGlnaXRhbF9wbGF5YmFja192b2x1bWVbaWR4XVtpXTsKKwkJZWxzZQorCQkJdm9sdW1lW2ldID0gTUlYQVJUX0RJR0lUQUxfTEVWRUxfTUlOOworCX0KKworCXNldF9sZXZlbC5zdHJlYW1fbGV2ZWwub3V0X2xldmVsLnZhbGlkX21hc2sxID0gTUlYQVJUX09VVF9TVFJFQU1fU0VUX0xFVkVMX0xFRlRfQVVESU8xIHwgTUlYQVJUX09VVF9TVFJFQU1fU0VUX0xFVkVMX1JJR0hUX0FVRElPMjsKKwlzZXRfbGV2ZWwuc3RyZWFtX2xldmVsLm91dF9sZXZlbC5sZWZ0X3RvX291dDFfbGV2ZWwgPSBtaXhhcnRfZGlnaXRhbF9sZXZlbFt2b2x1bWVbMF1dOworCXNldF9sZXZlbC5zdHJlYW1fbGV2ZWwub3V0X2xldmVsLnJpZ2h0X3RvX291dDJfbGV2ZWwgPSBtaXhhcnRfZGlnaXRhbF9sZXZlbFt2b2x1bWVbMV1dOworCisJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX1NUUkVBTV9TRVRfT1VUX1NUUkVBTV9MRVZFTDsKKwlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJcmVxdWVzdC5kYXRhID0gJnNldF9sZXZlbDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplb2Yoc2V0X2xldmVsKTsKKworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKHN0YXR1cyksICZzdGF0dXMpOworCWlmKChlcnI8MCkgfHwgc3RhdHVzKSB7CisJCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1NUUkVBTV9TRVRfT1VUX1NUUkVBTV9MRVZFTCBjYXJkKCVkKSBzdGF0dXMoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgc3RhdHVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWl4YXJ0X3VwZGF0ZV9jYXB0dXJlX3N0cmVhbV9sZXZlbChtaXhhcnRfdCogY2hpcCwgaW50IGlzX2FlcykKK3sKKwlpbnQgZXJyLCBpLCBpZHg7CisJbWl4YXJ0X3BpcGVfdCogcGlwZTsKKwltaXhhcnRfbXNnX3QgcmVxdWVzdDsKKwltaXhhcnRfc2V0X2luX2F1ZGlvX2xldmVsX3JlcV90IHNldF9sZXZlbDsKKwl1MzIgc3RhdHVzOworCisJaWYoaXNfYWVzKSB7CisJCWlkeCA9IDE7CisJCXBpcGUgPSAmY2hpcC0+cGlwZV9pbl9kaWc7CisJfSBlbHNlIHsKKwkJaWR4ID0gMDsKKwkJcGlwZSA9ICZjaGlwLT5waXBlX2luX2FuYTsKKwl9CisKKwkvKiBvbmx5IHdoZW4gcGlwZSBleGlzdHMgISAqLworCWlmKHBpcGUtPnN0YXR1cyA9PSBQSVBFX1VOREVGSU5FRCkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJnNldF9sZXZlbCwgMCwgc2l6ZW9mKHNldF9sZXZlbCkpOworCXNldF9sZXZlbC5hdWRpb19jb3VudCA9IDI7CisJc2V0X2xldmVsLmxldmVsWzBdLmNvbm5lY3RvciA9IHBpcGUtPnVpZF9sZWZ0X2Nvbm5lY3RvcjsKKwlzZXRfbGV2ZWwubGV2ZWxbMV0uY29ubmVjdG9yID0gcGlwZS0+dWlkX3JpZ2h0X2Nvbm5lY3RvcjsKKworCWZvcihpPTA7IGk8MjsgaSsrKSB7CisJCXNldF9sZXZlbC5sZXZlbFtpXS52YWxpZF9tYXNrMSA9IE1JWEFSVF9BVURJT19MRVZFTF9ESUdJVEFMX01BU0s7CisJCXNldF9sZXZlbC5sZXZlbFtpXS5kaWdpdGFsX2xldmVsID0gbWl4YXJ0X2RpZ2l0YWxfbGV2ZWxbY2hpcC0+ZGlnaXRhbF9jYXB0dXJlX3ZvbHVtZVtpZHhdW2ldXTsKKwl9CisKKwlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX1NFVF9JTl9BVURJT19MRVZFTDsKKwlyZXF1ZXN0LnVpZCA9IChtaXhhcnRfdWlkX3QpezAsMH07CisJcmVxdWVzdC5kYXRhID0gJnNldF9sZXZlbDsKKwlyZXF1ZXN0LnNpemUgPSBzaXplb2Yoc2V0X2xldmVsKTsKKworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKHN0YXR1cyksICZzdGF0dXMpOworCWlmKChlcnI8MCkgfHwgc3RhdHVzKSB7CisJCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1NUUkVBTV9TRVRfSU5fQVVESU9fTEVWRUwgY2FyZCglZCkgc3RhdHVzKCV4KVxuIiwgY2hpcC0+Y2hpcF9pZHgsIHN0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBzaGFyZWQgKi8KK3N0YXRpYyBpbnQgbWl4YXJ0X2RpZ2l0YWxfdm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IE1JWEFSVF9ESUdJVEFMX0xFVkVMX01JTjsgICAvKiAtMTA5LjUgZEIgKi8KKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBNSVhBUlRfRElHSVRBTF9MRVZFTF9NQVg7ICAgLyogICAxOC4wIGRCICovCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUlYQVJUX1ZPTF9SRUNfTUFTSwkxCisjZGVmaW5lIE1JWEFSVF9WT0xfQUVTX01BU0sJMgorCitzdGF0aWMgaW50IG1peGFydF9wY21fdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7IC8qIGluZGV4ICovCisJaW50ICpzdG9yZWRfdm9sdW1lOworCWludCBpc19jYXB0dXJlID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiBNSVhBUlRfVk9MX1JFQ19NQVNLOworCWludCBpc19hZXMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIE1JWEFSVF9WT0xfQUVTX01BU0s7CisJZG93bigmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJaWYoaXNfY2FwdHVyZSkgeworCQlpZihpc19hZXMpCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX2NhcHR1cmVfdm9sdW1lWzFdOwkvKiBBRVMgY2FwdHVyZSAqLworCQllbHNlCQlzdG9yZWRfdm9sdW1lID0gY2hpcC0+ZGlnaXRhbF9jYXB0dXJlX3ZvbHVtZVswXTsJLyogYW5hbG9nIGNhcHR1cmUgKi8KKwl9IGVsc2UgeworCQlzbmRfYXNzZXJ0ICggaWR4IDwgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKTsgCisJCWlmKGlzX2FlcykJc3RvcmVkX3ZvbHVtZSA9IGNoaXAtPmRpZ2l0YWxfcGxheWJhY2tfdm9sdW1lW01JWEFSVF9QTEFZQkFDS19TVFJFQU1TICsgaWR4XTsgLyogQUVTIHBsYXliYWNrICovCisJCWVsc2UJCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX3BsYXliYWNrX3ZvbHVtZVtpZHhdOwkvKiBhbmFsb2cgcGxheWJhY2sgKi8KKwl9CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzdG9yZWRfdm9sdW1lWzBdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gc3RvcmVkX3ZvbHVtZVsxXTsKKwl1cCgmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4YXJ0X3BjbV92b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCW1peGFydF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsgLyogaW5kZXggKi8KKwlpbnQgY2hhbmdlZCA9IDA7CisJaW50IGlzX2NhcHR1cmUgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIE1JWEFSVF9WT0xfUkVDX01BU0s7CisJaW50IGlzX2FlcyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgTUlYQVJUX1ZPTF9BRVNfTUFTSzsKKwlpbnQqIHN0b3JlZF92b2x1bWU7CisJaW50IGk7CisJZG93bigmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJaWYoaXNfY2FwdHVyZSkgeworCQlpZihpc19hZXMpCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX2NhcHR1cmVfdm9sdW1lWzFdOwkvKiBBRVMgY2FwdHVyZSAqLworCQllbHNlCQlzdG9yZWRfdm9sdW1lID0gY2hpcC0+ZGlnaXRhbF9jYXB0dXJlX3ZvbHVtZVswXTsJLyogYW5hbG9nIGNhcHR1cmUgKi8KKwl9IGVsc2UgeworCQlzbmRfYXNzZXJ0ICggaWR4IDwgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKTsgCisJCWlmKGlzX2FlcykJc3RvcmVkX3ZvbHVtZSA9IGNoaXAtPmRpZ2l0YWxfcGxheWJhY2tfdm9sdW1lW01JWEFSVF9QTEFZQkFDS19TVFJFQU1TICsgaWR4XTsgLyogQUVTIHBsYXliYWNrICovCisJCWVsc2UJCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX3BsYXliYWNrX3ZvbHVtZVtpZHhdOwkvKiBhbmFsb2cgcGxheWJhY2sgKi8KKwl9CisJZm9yKGk9MDsgaTwyOyBpKyspIHsKKwkJaWYoc3RvcmVkX3ZvbHVtZVtpXSAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSkgeworCQkJc3RvcmVkX3ZvbHVtZVtpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJY2hhbmdlZCA9IDE7CisJCX0KKwl9CisJaWYoY2hhbmdlZCkgeworCQlpZihpc19jYXB0dXJlKQltaXhhcnRfdXBkYXRlX2NhcHR1cmVfc3RyZWFtX2xldmVsKGNoaXAsIGlzX2Flcyk7CisJCWVsc2UJCW1peGFydF91cGRhdGVfcGxheWJhY2tfc3RyZWFtX2xldmVsKGNoaXAsIGlzX2FlcywgaWR4KTsKKwl9CisJdXAoJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9taXhhcnRfcGNtX3ZvbCA9Cit7CisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qIG5hbWUgd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KKwkvKiBjb3VudCB3aWxsIGJlIGZpbGxlZCBsYXRlciAqLworCS5pbmZvID0gICAgICAgICBtaXhhcnRfZGlnaXRhbF92b2xfaW5mbywJCS8qIHNoYXJlZCAqLworCS5nZXQgPSAgICAgICAgICBtaXhhcnRfcGNtX3ZvbF9nZXQsCisJLnB1dCA9ICAgICAgICAgIG1peGFydF9wY21fdm9sX3B1dCwKK307CisKKworc3RhdGljIGludCBtaXhhcnRfcGNtX3N3X2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7IC8qIGluZGV4ICovCisJc25kX2Fzc2VydCAoIGlkeCA8IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TICk7IAorCWRvd24oJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCWlmKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgTUlYQVJUX1ZPTF9BRVNfTUFTSykJLyogQUVTIHBsYXliYWNrICovCisJCWlkeCArPSBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUzsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNoaXAtPmRpZ2l0YWxfcGxheWJhY2tfYWN0aXZlW2lkeF1bMF07CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjaGlwLT5kaWdpdGFsX3BsYXliYWNrX2FjdGl2ZVtpZHhdWzFdOworCXVwKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXhhcnRfcGNtX3N3X3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlZCA9IDA7CisJaW50IGlzX2FlcyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgTUlYQVJUX1ZPTF9BRVNfTUFTSzsKKwlpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7IC8qIGluZGV4ICovCisJaW50IGksIGo7CisJc25kX2Fzc2VydCAoIGlkeCA8IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TICk7IAorCWRvd24oJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCWogPSBpZHg7CisJaWYoaXNfYWVzKQlqICs9IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TOworCWZvcihpPTA7IGk8MjsgaSsrKSB7CisJCWlmKGNoaXAtPmRpZ2l0YWxfcGxheWJhY2tfYWN0aXZlW2pdW2ldICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldKSB7CisJCQljaGlwLT5kaWdpdGFsX3BsYXliYWNrX2FjdGl2ZVtqXVtpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJY2hhbmdlZCA9IDE7CisJCX0KKwl9CisJaWYoY2hhbmdlZCkJbWl4YXJ0X3VwZGF0ZV9wbGF5YmFja19zdHJlYW1fbGV2ZWwoY2hpcCwgaXNfYWVzLCBpZHgpOworCXVwKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBtaXhhcnRfY29udHJvbF9wY21fc3dpdGNoID0geworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qIG5hbWUgd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KKwkuY291bnQgPSAgICAgICAgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMsCisJLmluZm8gPSAgICAgICAgIG1peGFydF9zd19pbmZvLAkJLyogc2hhcmVkICovCisJLmdldCA9ICAgICAgICAgIG1peGFydF9wY21fc3dfZ2V0LAorCS5wdXQgPSAgICAgICAgICBtaXhhcnRfcGNtX3N3X3B1dAorfTsKKworc3RhdGljIGludCBtaXhhcnRfdXBkYXRlX21vbml0b3JpbmcobWl4YXJ0X3QqIGNoaXAsIGludCBjaGFubmVsKQoreworCWludCBlcnI7CisJbWl4YXJ0X21zZ190IHJlcXVlc3Q7CisJbWl4YXJ0X3NldF9vdXRfYXVkaW9fbGV2ZWxfdCBhdWRpb19sZXZlbDsKKwl1MzIgcmVzcDsKKworCWlmKGNoaXAtPnBpcGVfb3V0X2FuYS5zdGF0dXMgPT0gUElQRV9VTkRFRklORUQpCisJCXJldHVybiAtRUlOVkFMOyAvKiBubyBwaXBlIGRlZmluZWQgKi8KKworCWlmKCFjaGFubmVsKQlyZXF1ZXN0LnVpZCA9IGNoaXAtPnBpcGVfb3V0X2FuYS51aWRfbGVmdF9jb25uZWN0b3I7CisJZWxzZQkJcmVxdWVzdC51aWQgPSBjaGlwLT5waXBlX291dF9hbmEudWlkX3JpZ2h0X2Nvbm5lY3RvcjsKKwlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfQ09OTkVDVE9SX1NFVF9PVVRfQVVESU9fTEVWRUw7CisJcmVxdWVzdC5kYXRhID0gJmF1ZGlvX2xldmVsOworCXJlcXVlc3Quc2l6ZSA9IHNpemVvZihhdWRpb19sZXZlbCk7CisKKwltZW1zZXQoJmF1ZGlvX2xldmVsLCAwLCBzaXplb2YoYXVkaW9fbGV2ZWwpKTsKKwlhdWRpb19sZXZlbC52YWxpZF9tYXNrMSA9IE1JWEFSVF9BVURJT19MRVZFTF9NT05JVE9SX01BU0sgfCBNSVhBUlRfQVVESU9fTEVWRUxfTVVURV9NMV9NQVNLOworCWF1ZGlvX2xldmVsLm1vbml0b3JfbGV2ZWwgPSBtaXhhcnRfZGlnaXRhbF9sZXZlbFtjaGlwLT5tb25pdG9yaW5nX3ZvbHVtZVtjaGFubmVsIT0wXV07CisJYXVkaW9fbGV2ZWwubW9uaXRvcl9tdXRlMSA9ICFjaGlwLT5tb25pdG9yaW5nX2FjdGl2ZVtjaGFubmVsIT0wXTsKKworCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKHJlc3ApLCAmcmVzcCk7CisJaWYoKGVycjwwKSB8fCByZXNwKSB7CisJCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX0NPTk5FQ1RPUl9TRVRfT1VUX0FVRElPX0xFVkVMIGNhcmQoJWQpIHJlc3AoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgcmVzcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1vbml0b3JpbmcgbGV2ZWwgY29udHJvbAorICovCisKK3N0YXRpYyBpbnQgbWl4YXJ0X21vbml0b3Jfdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwltaXhhcnRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlkb3duKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNoaXAtPm1vbml0b3Jpbmdfdm9sdW1lWzBdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2hpcC0+bW9uaXRvcmluZ192b2x1bWVbMV07CisJdXAoJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGFydF9tb25pdG9yX3ZvbF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZWQgPSAwOworCWludCBpOworCWRvd24oJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCWZvcihpPTA7IGk8MjsgaSsrKSB7CisJCWlmKGNoaXAtPm1vbml0b3Jpbmdfdm9sdW1lW2ldICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldKSB7CisJCQljaGlwLT5tb25pdG9yaW5nX3ZvbHVtZVtpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJbWl4YXJ0X3VwZGF0ZV9tb25pdG9yaW5nKGNoaXAsIGkpOworCQkJY2hhbmdlZCA9IDE7CisJCX0KKwl9CisJdXAoJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IG1peGFydF9jb250cm9sX21vbml0b3Jfdm9sID0geworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiTW9uaXRvcmluZyBWb2x1bWUiLAorCS5pbmZvID0JCW1peGFydF9kaWdpdGFsX3ZvbF9pbmZvLAkJLyogc2hhcmVkICovCisJLmdldCA9CQltaXhhcnRfbW9uaXRvcl92b2xfZ2V0LAorCS5wdXQgPQkJbWl4YXJ0X21vbml0b3Jfdm9sX3B1dCwKK307CisKKy8qCisgKiBtb25pdG9yaW5nIHN3aXRjaCBjb250cm9sCisgKi8KKworc3RhdGljIGludCBtaXhhcnRfbW9uaXRvcl9zd19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJZG93bigmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5tb25pdG9yaW5nX2FjdGl2ZVswXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNoaXAtPm1vbml0b3JpbmdfYWN0aXZlWzFdOworCXVwKCZjaGlwLT5tZ3ItPm1peGVyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXhhcnRfbW9uaXRvcl9zd19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJbWl4YXJ0X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZWQgPSAwOworCWludCBpOworCWRvd24oJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOworCWZvcihpPTA7IGk8MjsgaSsrKSB7CisJCWlmKGNoaXAtPm1vbml0b3JpbmdfYWN0aXZlW2ldICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldKSB7CisJCQljaGlwLT5tb25pdG9yaW5nX2FjdGl2ZVtpXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJY2hhbmdlZCB8PSAoMTw8aSk7IC8qIG1hc2sgMHgwMSBhbnMgMHgwMiAqLworCQl9CisJfQorCWlmKGNoYW5nZWQpIHsKKwkJLyogYWxsb2NhdGUgb3IgcmVsZWFzZSByZXNvdXJjZXMgZm9yIG1vbml0b3JpbmcgKi8KKwkJaW50IGFsbG9jYXRlID0gY2hpcC0+bW9uaXRvcmluZ19hY3RpdmVbMF0gfHwgY2hpcC0+bW9uaXRvcmluZ19hY3RpdmVbMV07CisJCWlmKGFsbG9jYXRlKSB7CisJCQlzbmRfbWl4YXJ0X2FkZF9yZWZfcGlwZSggY2hpcCwgTUlYQVJUX1BDTV9BTkFMT0csIDAsIDEpOwkvKiBhbGxvY2F0ZSB0aGUgcGxheWJhY2sgcGlwZSBmb3IgbW9uaXRvcmluZyAqLworCQkJc25kX21peGFydF9hZGRfcmVmX3BpcGUoIGNoaXAsIE1JWEFSVF9QQ01fQU5BTE9HLCAxLCAxKTsJLyogYWxsb2NhdGUgdGhlIGNhcHR1cmUgcGlwZSBmb3IgbW9uaXRvcmluZyAqLworCQl9CisJCWlmKGNoYW5nZWQgJiAweDAxKQltaXhhcnRfdXBkYXRlX21vbml0b3JpbmcoY2hpcCwgMCk7CisJCWlmKGNoYW5nZWQgJiAweDAyKQltaXhhcnRfdXBkYXRlX21vbml0b3JpbmcoY2hpcCwgMSk7CisJCWlmKCFhbGxvY2F0ZSkgeworCQkJc25kX21peGFydF9raWxsX3JlZl9waXBlKCBjaGlwLT5tZ3IsICZjaGlwLT5waXBlX2luX2FuYSwgMSk7CS8qIHJlbGVhc2UgdGhlIGNhcHR1cmUgcGlwZSBmb3IgbW9uaXRvcmluZyAqLworCQkJc25kX21peGFydF9raWxsX3JlZl9waXBlKCBjaGlwLT5tZ3IsICZjaGlwLT5waXBlX291dF9hbmEsIDEpOwkvKiByZWxlYXNlIHRoZSBwbGF5YmFjayBwaXBlIGZvciBtb25pdG9yaW5nICovCisJCX0KKwl9CisKKwl1cCgmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CisJcmV0dXJuIChjaGFuZ2VkICE9IDApOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IG1peGFydF9jb250cm9sX21vbml0b3Jfc3cgPSB7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgICJNb25pdG9yaW5nIFN3aXRjaCIsCisJLmluZm8gPSAgICAgICAgIG1peGFydF9zd19pbmZvLAkJLyogc2hhcmVkICovCisJLmdldCA9ICAgICAgICAgIG1peGFydF9tb25pdG9yX3N3X2dldCwKKwkucHV0ID0gICAgICAgICAgbWl4YXJ0X21vbml0b3Jfc3dfcHV0Cit9OworCisKK3N0YXRpYyB2b2lkIG1peGFydF9yZXNldF9hdWRpb19sZXZlbHMobWl4YXJ0X3QgKmNoaXApCit7CisJLyogYW5hbG9nIHZvbHVtZXMgY2FuIGJlIHNldCBldmVuIGlmIHRoZXJlIGlzIG5vIHBpcGUgKi8KKwltaXhhcnRfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChjaGlwLCAwKTsKKwkvKiBhbmFsb2cgbGV2ZWxzIGZvciBjYXB0dXJlIG9ubHkgb24gdGhlIGZpcnN0IHR3byBjaGlwcyAqLworCWlmKGNoaXAtPmNoaXBfaWR4IDwgMikgeworCQltaXhhcnRfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChjaGlwLCAxKTsKKwl9CisJcmV0dXJuOworfQorCisKK2ludCBzbmRfbWl4YXJ0X2NyZWF0ZV9taXhlcihtaXhhcnRfbWdyX3QgKm1ncikKK3sKKwltaXhhcnRfdCAqY2hpcDsKKwlpbnQgZXJyLCBpOworCisJaW5pdF9NVVRFWCgmbWdyLT5taXhlcl9tdXRleCk7IC8qIGNhbiBiZSBpbiBhbm90aGVyIHBsYWNlICovCisKKwlmb3IoaT0wOyBpPG1nci0+bnVtX2NhcmRzOyBpKyspIHsKKwkJc25kX2tjb250cm9sX25ld190IHRlbXA7CisJCWNoaXAgPSBtZ3ItPmNoaXBbaV07CisKKwkJLyogYW5hbG9nIG91dHB1dCBsZXZlbCBjb250cm9sICovCisJCXRlbXAgPSBtaXhhcnRfY29udHJvbF9hbmFsb2dfbGV2ZWw7CisJCXRlbXAubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIjsKKwkJdGVtcC5wcml2YXRlX3ZhbHVlID0gMDsgLyogcGxheWJhY2sgKi8KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnRlbXAsIGNoaXApKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJLyogb3V0cHV0IG11dGUgY29udHJvbHMgKi8KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJm1peGFydF9jb250cm9sX291dHB1dF9zd2l0Y2gsIGNoaXApKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQkvKiBhbmFsb2cgaW5wdXQgbGV2ZWwgY29udHJvbCBvbmx5IG9uIGZpcnN0IHR3byBjaGlwcyAhKi8KKwkJaWYoaTwyKSB7CisJCQl0ZW1wID0gbWl4YXJ0X2NvbnRyb2xfYW5hbG9nX2xldmVsOworCQkJdGVtcC5uYW1lID0gIk1hc3RlciBDYXB0dXJlIFZvbHVtZSI7CisJCQl0ZW1wLnByaXZhdGVfdmFsdWUgPSAxOyAvKiBjYXB0dXJlICovCisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmdGVtcCwgY2hpcCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXRlbXAgPSBzbmRfbWl4YXJ0X3BjbV92b2w7CisJCXRlbXAubmFtZSA9ICJQQ00gUGxheWJhY2sgVm9sdW1lIjsKKwkJdGVtcC5jb3VudCA9IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TOworCQl0ZW1wLnByaXZhdGVfdmFsdWUgPSAwOyAvKiBwbGF5YmFjayBhbmFsb2cgKi8KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnRlbXAsIGNoaXApKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQl0ZW1wLm5hbWUgPSAiUENNIENhcHR1cmUgVm9sdW1lIjsKKwkJdGVtcC5jb3VudCA9IDE7CisJCXRlbXAucHJpdmF0ZV92YWx1ZSA9IE1JWEFSVF9WT0xfUkVDX01BU0s7IC8qIGNhcHR1cmUgYW5hbG9nICovCisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ0ZW1wLCBjaGlwKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJaWYobWdyLT5ib2FyZF90eXBlID09IE1JWEFSVF9EQVVHSFRFUl9UWVBFX0FFUykgeworCQkJdGVtcC5uYW1lID0gIkFFUyBQbGF5YmFjayBWb2x1bWUiOworCQkJdGVtcC5jb3VudCA9IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TOworCQkJdGVtcC5wcml2YXRlX3ZhbHVlID0gTUlYQVJUX1ZPTF9BRVNfTUFTSzsgLyogcGxheWJhY2sgQUVTL0VCVSAqLworCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnRlbXAsIGNoaXApKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXRlbXAubmFtZSA9ICJBRVMgQ2FwdHVyZSBWb2x1bWUiOworCQkJdGVtcC5jb3VudCA9IDA7CisJCQl0ZW1wLnByaXZhdGVfdmFsdWUgPSBNSVhBUlRfVk9MX1JFQ19NQVNLIHwgTUlYQVJUX1ZPTF9BRVNfTUFTSzsgLyogY2FwdHVyZSBBRVMvRUJVICovCisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmdGVtcCwgY2hpcCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQl0ZW1wID0gbWl4YXJ0X2NvbnRyb2xfcGNtX3N3aXRjaDsKKwkJdGVtcC5uYW1lID0gIlBDTSBQbGF5YmFjayBTd2l0Y2giOworCQl0ZW1wLnByaXZhdGVfdmFsdWUgPSAwOyAvKiBwbGF5YmFjayBhbmFsb2cgKi8KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnRlbXAsIGNoaXApKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlpZihtZ3ItPmJvYXJkX3R5cGUgPT0gTUlYQVJUX0RBVUdIVEVSX1RZUEVfQUVTKSB7CisJCQl0ZW1wLm5hbWUgPSAiQUVTIFBsYXliYWNrIFN3aXRjaCI7CisJCQl0ZW1wLnByaXZhdGVfdmFsdWUgPSBNSVhBUlRfVk9MX0FFU19NQVNLOyAvKiBwbGF5YmFjayBBRVMvRUJVICovCisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmdGVtcCwgY2hpcCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIG1vbml0b3JpbmcgKi8KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJm1peGFydF9jb250cm9sX21vbml0b3Jfdm9sLCBjaGlwKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZtaXhhcnRfY29udHJvbF9tb25pdG9yX3N3LCBjaGlwKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJLyogaW5pdCBhbGwgbWl4ZXIgZGF0YSBhbmQgcHJvZ3JhbSB0aGUgbWFzdGVyIHZvbHVtZXMvc3dpdGNoZXMgKi8KKwkJbWl4YXJ0X3Jlc2V0X2F1ZGlvX2xldmVscyhjaGlwKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5oIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQ5NTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogRHJpdmVyIGZvciBEaWdpZ3JhbSBtaVhhcnQgc291bmRjYXJkcworICoKKyAqIGluY2x1ZGUgZmlsZSBmb3IgbWl4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgRGlnaWdyYW0gPGFsc2FAZGlnaWdyYW0uY29tPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fU09VTkRfTUlYQVJUX01JWEVSX0gKKyNkZWZpbmUgX19TT1VORF9NSVhBUlRfTUlYRVJfSAorCisvKiBleHBvcnRlZCAqLworaW50IG1peGFydF91cGRhdGVfcGxheWJhY2tfc3RyZWFtX2xldmVsKG1peGFydF90KiBjaGlwLCBpbnQgaXNfYWVzLCBpbnQgaWR4KTsKK2ludCBtaXhhcnRfdXBkYXRlX2NhcHR1cmVfc3RyZWFtX2xldmVsKG1peGFydF90KiBjaGlwLCBpbnQgaXNfYWVzKTsKK2ludCBzbmRfbWl4YXJ0X2NyZWF0ZV9taXhlcihtaXhhcnRfbWdyX3QqIG1ncik7CisKKyNlbmRpZiAvKiBfX1NPVU5EX01JWEFSVF9NSVhFUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvTWFrZWZpbGUgYi9zb3VuZC9wY2kvbm0yNTYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxZDhjNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyMKKworc25kLW5tMjU2LW9ianMgOj0gbm0yNTYubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX05NMjU2KSArPSBzbmQtbm0yNTYubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTZmYmVhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTAsMCArMSwxNjU3IEBACisvKiAKKyAqIERyaXZlciBmb3IgTmVvTWFnaWMgMjU2QVYgYW5kIDI1NlpYIGNoaXBzZXRzLgorICogQ29weXJpZ2h0IChjKSAyMDAwIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiBCYXNlZCBvbiBubTI1Nl9hdWRpby5jIE9TUyBkcml2ZXIgaW4gbGludXgga2VybmVsLgorICogVGhlIG9yaWdpbmFsIGF1dGhvciBvZiBPU1Mgbm0yNTYgZHJpdmVyIHdpc2hlcyB0byByZW1haW4gYW5vbnltb3VzLAorICogc28gSSBqdXN0IHB1dCBteSBhY2tub2xlZGdtZW50IHRvIGhpbS9oZXIgaGVyZS4KKyAqIFRoZSBvcmlnaW5hbCBhdXRob3IncyB3ZWIgcGFnZSBpcyBmb3VuZCBhdAorICoJaHR0cDovL3d3dy51Z2x4Lm9yZy9zb255Lmh0bWwKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisgIAorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNkZWZpbmUgQ0FSRF9OQU1FICJOZW9NYWdpYyAyNTZBVi9aWCIKKyNkZWZpbmUgRFJJVkVSX05BTUUgIk5NMjU2IgorCitNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5lb01hZ2ljIE5NMjU2QVYvWlgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e05lb01hZ2ljLE5NMjU2QVZ9LCIKKwkJIntOZW9NYWdpYyxOTTI1NlpYfX0iKTsKKworLyoKKyAqIHNvbWUgY29tcGlsZSBjb25kaXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKK3N0YXRpYyBpbnQgcGxheWJhY2tfYnVmc2l6ZVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDE2fTsKK3N0YXRpYyBpbnQgY2FwdHVyZV9idWZzaXplW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMTZ9Oworc3RhdGljIGludCBmb3JjZV9hYzk3W1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07IC8qIGRpc2FibGVkIGFzIGRlZmF1bHQgKi8KK3N0YXRpYyBpbnQgYnVmZmVyX3RvcFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OyAvKiBub3Qgc3BlY2lmaWVkICovCitzdGF0aWMgaW50IHVzZV9jYWNoZVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OyAvKiBkaXNhYmxlZCAqLworc3RhdGljIGludCB2YWlvX2hhY2tbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsgLyogZGlzYWJsZWQgKi8KK3N0YXRpYyBpbnQgcmVzZXRfd29ya2Fyb3VuZFtTTkRSVl9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSB0aGlzIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwbGF5YmFja19idWZzaXplLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwbGF5YmFja19idWZzaXplLCAiREFDIGZyYW1lIHNpemUgaW4ga0IgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGNhcHR1cmVfYnVmc2l6ZSwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FwdHVyZV9idWZzaXplLCAiQURDIGZyYW1lIHNpemUgaW4ga0IgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX2FjOTcsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hYzk3LCAiRm9yY2UgdG8gdXNlIEFDOTcgY29kZWMgZm9yICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGJ1ZmZlcl90b3AsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl90b3AsICJTZXQgdGhlIHRvcCBhZGRyZXNzIG9mIGF1ZGlvIGJ1ZmZlciBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkodXNlX2NhY2hlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2NhY2hlLCAiRW5hYmxlIHRoZSBjYWNoZSBmb3IgY29lZmZpY2llbnQgdGFibGUgYWNjZXNzLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHZhaW9faGFjaywgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZhaW9faGFjaywgIkVuYWJsZSB3b3JrYXJvdW5kIGZvciBTb255IFZBSU8gbm90ZWJvb2tzLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHJlc2V0X3dvcmthcm91bmQsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZXNldF93b3JrYXJvdW5kLCAiRW5hYmxlIEFDOTcgUkVTRVQgd29ya2Fyb3VuZCBmb3Igc29tZSBsYXB0b3BzLiIpOworCisvKgorICogaHcgZGVmaW5pdGlvbnMKKyAqLworCisvKiBUaGUgQklPUyBzaWduYXR1cmUuICovCisjZGVmaW5lIE5NX1NJR05BVFVSRSAweDRlNGQwMDAwCisvKiBTaWduYXR1cmUgbWFzay4gKi8KKyNkZWZpbmUgTk1fU0lHX01BU0sgMHhmZmZmMDAwMAorCisvKiBTaXplIG9mIHRoZSBzZWNvbmQgbWVtb3J5IGFyZWEuICovCisjZGVmaW5lIE5NX1BPUlQyX1NJWkUgNDA5NgorCisvKiBUaGUgYmFzZSBvZmZzZXQgb2YgdGhlIG1peGVyIGluIHRoZSBzZWNvbmQgbWVtb3J5IGFyZWEuICovCisjZGVmaW5lIE5NX01JWEVSX09GRlNFVCAweDYwMAorCisvKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgY29lZmZpY2llbnQgZW50cnkuICovCisjZGVmaW5lIE5NX01BWF9QTEFZQkFDS19DT0VGX1NJWkUJMHg1MDAwCisjZGVmaW5lIE5NX01BWF9SRUNPUkRfQ09FRl9TSVpFCQkweDEyNjAKKworLyogVGhlIGludGVycnVwdCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTk1fSU5UX1JFRyAweGEwNAorLyogQW5kIGl0cyBiaXRzLiAqLworI2RlZmluZSBOTV9QTEFZQkFDS19JTlQgMHg0MAorI2RlZmluZSBOTV9SRUNPUkRfSU5UIDB4MTAwCisjZGVmaW5lIE5NX01JU0NfSU5UXzEgMHg0MDAwCisjZGVmaW5lIE5NX01JU0NfSU5UXzIgMHgxCisjZGVmaW5lIE5NX0FDS19JTlQoY2hpcCwgWCkgc25kX25tMjU2X3dyaXRldyhjaGlwLCBOTV9JTlRfUkVHLCAoWCkgPDwgMSkKKworLyogVGhlIEFWJ3MgIm1peGVyIHJlYWR5IiBzdGF0dXMgYml0IGFuZCBsb2NhdGlvbi4gKi8KKyNkZWZpbmUgTk1fTUlYRVJfU1RBVFVTX09GRlNFVCAweGEwNAorI2RlZmluZSBOTV9NSVhFUl9SRUFEWV9NQVNLIDB4MDgwMAorI2RlZmluZSBOTV9NSVhFUl9QUkVTRU5DRSAweGEwNgorI2RlZmluZSBOTV9QUkVTRU5DRV9NQVNLIDB4MDA1MAorI2RlZmluZSBOTV9QUkVTRU5DRV9WQUxVRSAweDAwNDAKKworLyoKKyAqIEZvciB0aGUgWlguICBJdCB1c2VzIHRoZSBzYW1lIGludGVycnVwdCByZWdpc3RlciwgYnV0IGl0IGhvbGRzIDMyCisgKiBiaXRzIGluc3RlYWQgb2YgMTYuCisgKi8KKyNkZWZpbmUgTk0yX1BMQVlCQUNLX0lOVCAweDEwMDAwCisjZGVmaW5lIE5NMl9SRUNPUkRfSU5UIDB4ODAwMDAKKyNkZWZpbmUgTk0yX01JU0NfSU5UXzEgMHg4CisjZGVmaW5lIE5NMl9NSVNDX0lOVF8yIDB4MgorI2RlZmluZSBOTTJfQUNLX0lOVChjaGlwLCBYKSBzbmRfbm0yNTZfd3JpdGVsKGNoaXAsIE5NX0lOVF9SRUcsIChYKSkKKworLyogVGhlIFpYJ3MgIm1peGVyIHJlYWR5IiBzdGF0dXMgYml0IGFuZCBsb2NhdGlvbi4gKi8KKyNkZWZpbmUgTk0yX01JWEVSX1NUQVRVU19PRkZTRVQgMHhhMDYKKyNkZWZpbmUgTk0yX01JWEVSX1JFQURZX01BU0sgMHgwODAwCisKKy8qIFRoZSBwbGF5YmFjayByZWdpc3RlcnMgc3RhcnQgZnJvbSBoZXJlLiAqLworI2RlZmluZSBOTV9QTEFZQkFDS19SRUdfT0ZGU0VUIDB4MAorLyogVGhlIHJlY29yZCByZWdpc3RlcnMgc3RhcnQgZnJvbSBoZXJlLiAqLworI2RlZmluZSBOTV9SRUNPUkRfUkVHX09GRlNFVCAweDIwMAorCisvKiBUaGUgcmF0ZSByZWdpc3RlciBpcyBsb2NhdGVkIDIgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIGFyZWEuICovCisjZGVmaW5lIE5NX1JBVEVfUkVHX09GRlNFVCAyCisKKy8qIE1vbm8vc3RlcmVvIGZsYWcsIG51bWJlciBvZiBiaXRzIG9uIHBsYXliYWNrLCBhbmQgcmF0ZSBtYXNrLiAqLworI2RlZmluZSBOTV9SQVRFX1NURVJFTyAxCisjZGVmaW5lIE5NX1JBVEVfQklUU18xNiAyCisjZGVmaW5lIE5NX1JBVEVfTUFTSyAweGYwCisKKy8qIFBsYXliYWNrIGVuYWJsZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MSkKKyNkZWZpbmUgTk1fUExBWUJBQ0tfRU5BQkxFX0ZMQUcgMQorI2RlZmluZSBOTV9QTEFZQkFDS19PTkVTSE9UIDIKKyNkZWZpbmUgTk1fUExBWUJBQ0tfRlJFRVJVTiA0CisKKy8qIE11dGVzIHRoZSBhdWRpbyBvdXRwdXQuICovCisjZGVmaW5lIE5NX0FVRElPX01VVEVfUkVHIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxOCkKKyNkZWZpbmUgTk1fQVVESU9fTVVURV9MRUZUIDB4ODAwMAorI2RlZmluZSBOTV9BVURJT19NVVRFX1JJR0hUIDB4MDA4MAorCisvKiBSZWNvcmRpbmcgZW5hYmxlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBOTV9SRUNPUkRfRU5BQkxFX1JFRyAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAwKQorI2RlZmluZSBOTV9SRUNPUkRfRU5BQkxFX0ZMQUcgMQorI2RlZmluZSBOTV9SRUNPUkRfRlJFRVJVTiAyCisKKy8qIGNvZWZmaWNpZW50IGJ1ZmZlciBwb2ludGVyICovCisjZGVmaW5lIE5NX0NPRUZGX1NUQVJUX09GRlNFVAkweDFjCisjZGVmaW5lIE5NX0NPRUZGX0VORF9PRkZTRVQJMHgyMAorCisvKiBETUEgYnVmZmVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTk1fUkJVRkZFUl9TVEFSVCAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDQpCisjZGVmaW5lIE5NX1JCVUZGRVJfRU5EICAgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHgxMCkKKyNkZWZpbmUgTk1fUkJVRkZFUl9XTUFSSyAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweGMpCisjZGVmaW5lIE5NX1JCVUZGRVJfQ1VSUlAgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHg4KQorCisjZGVmaW5lIE5NX1BCVUZGRVJfU1RBUlQgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDQpCisjZGVmaW5lIE5NX1BCVUZGRVJfRU5EICAgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDE0KQorI2RlZmluZSBOTV9QQlVGRkVSX1dNQVJLIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHhjKQorI2RlZmluZSBOTV9QQlVGRkVSX0NVUlJQIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHg4KQorCisvKgorICogdHlwZSBkZWZpbml0aW9ucworICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9ubTI1NiBubTI1Nl90OwordHlwZWRlZiBzdHJ1Y3Qgc25kX25tMjU2X3N0cmVhbSBubTI1Nl9zdHJlYW1fdDsKKworc3RydWN0IHNuZF9ubTI1Nl9zdHJlYW0geworCisJbm0yNTZfdCAqY2hpcDsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJaW50IHJ1bm5pbmc7CisJCisJdTMyIGJ1ZjsJLyogb2Zmc2V0IGZyb20gY2hpcC0+YnVmZmVyICovCisJaW50IGJ1ZnNpemU7CS8qIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisJdm9pZCBfX2lvbWVtICpidWZwdHI7CQkvKiBtYXBwZWQgcG9pbnRlciAqLworCXVuc2lnbmVkIGxvbmcgYnVmcHRyX2FkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb2ludGVyICovCisKKwlpbnQgZG1hX3NpemU7CQkvKiBidWZmZXIgc2l6ZSBvZiB0aGUgc3Vic3RyZWFtIGluIGJ5dGVzICovCisJaW50IHBlcmlvZF9zaXplOwkvKiBwZXJpb2Qgc2l6ZSBpbiBieXRlcyAqLworCWludCBwZXJpb2RzOwkJLyogIyBvZiBwZXJpb2RzICovCisJaW50IHNoaWZ0OwkJLyogYml0IHNoaWZ0cyAqLworCWludCBjdXJfcGVyaW9kOwkJLyogY3VycmVudCBwZXJpb2QgIyAqLworCit9OworCitzdHJ1Y3Qgc25kX25tMjU2IHsKKwkKKwlzbmRfY2FyZF90ICpjYXJkOworCisJdm9pZCBfX2lvbWVtICpjcG9ydDsJCS8qIGNvbnRyb2wgcG9ydCAqLworCXN0cnVjdCByZXNvdXJjZSAqcmVzX2Nwb3J0OwkvKiBpdHMgcmVzb3VyY2UgKi8KKwl1bnNpZ25lZCBsb25nIGNwb3J0X2FkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCXZvaWQgX19pb21lbSAqYnVmZmVyOwkJLyogYnVmZmVyICovCisJc3RydWN0IHJlc291cmNlICpyZXNfYnVmZmVyOwkvKiBpdHMgcmVzb3VyY2UgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9hZGRyOwkvKiBidWZmZXIgcGh5aXNjYWwgYWRkcmVzcyAqLworCisJdTMyIGJ1ZmZlcl9zdGFydDsJCS8qIHN0YXJ0IG9mZnNldCBmcm9tIHBjaSByZXNvdXJjZSAwICovCisJdTMyIGJ1ZmZlcl9lbmQ7CQkJLyogZW5kIG9mZnNldCAqLworCXUzMiBidWZmZXJfc2l6ZTsJCS8qIHRvdGFsIGJ1ZmZlciBzaXplICovCisKKwl1MzIgYWxsX2NvZWZmX2J1ZjsJCS8qIGNvZWZmaWNpZW50IGJ1ZmZlciAqLworCXUzMiBjb2VmZl9idWZbMl07CQkvKiBjb2VmZmljaWVudCBidWZmZXIgZm9yIGVhY2ggc3RyZWFtICovCisKKwl1bnNpZ25lZCBpbnQgY29lZmZzX2N1cnJlbnQ6IDE7CS8qIGNvZWZmLiB0YWJsZSBpcyBsb2FkZWQ/ICovCisJdW5zaWduZWQgaW50IHVzZV9jYWNoZTogMTsJLyogdXNlIG9uZSBiaWcgY29lZi4gdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXRfd29ya2Fyb3VuZDogMTsgLyogV29ya2Fyb3VuZCBmb3Igc29tZSBsYXB0b3BzIHRvIGF2b2lkIGZyZWV6ZSAqLworCisJaW50IG1peGVyX2Jhc2U7CQkJLyogcmVnaXN0ZXIgb2Zmc2V0IG9mIGFjOTcgbWl4ZXIgKi8KKwlpbnQgbWl4ZXJfc3RhdHVzX29mZnNldDsJLyogb2Zmc2V0IG9mIG1peGVyIHN0YXR1cyByZWcuICovCisJaW50IG1peGVyX3N0YXR1c19tYXNrOwkJLyogYml0IG1hc2sgdG8gdGVzdCB0aGUgbWl4ZXIgc3RhdHVzICovCisKKwlpbnQgaXJxOworCWlycXJldHVybl90ICgqaW50ZXJydXB0KShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisJaW50IGJhZGludHJjb3VudDsJCS8qIGNvdW50ZXIgdG8gY2hlY2sgYm9ndXMgaW50ZXJydXB0cyAqLworCisJbm0yNTZfc3RyZWFtX3Qgc3RyZWFtc1syXTsKKworCWFjOTdfdCAqYWM5NzsKKworCXNuZF9wY21fdCAqcGNtOworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisKK307CisKKworLyoKKyAqIGluY2x1ZGUgY29lZmZpY2llbnQgdGFibGUKKyAqLworI2luY2x1ZGUgIm5tMjU2X2NvZWYuYyIKKworCisvKgorICogUENJIGlkcworICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9ORU9NQUdJQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05FT01FR0lDIDB4MTBjOAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8gMHg4MDA1CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTyAweDgwMDYKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTyAweDgwMTYKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfbm0yNTZfaWRzW10gPSB7CisJe1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9ubTI1Nl9pZHMpOworCisKKy8qCisgKiBsb3dsdmVsIHN0dWZmcworICovCisKK2lubGluZSBzdGF0aWMgdTgKK3NuZF9ubTI1Nl9yZWFkYihubTI1Nl90ICpjaGlwLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiByZWFkYihjaGlwLT5jcG9ydCArIG9mZnNldCk7Cit9CisKK2lubGluZSBzdGF0aWMgdTE2CitzbmRfbm0yNTZfcmVhZHcobm0yNTZfdCAqY2hpcCwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZHcoY2hpcC0+Y3BvcnQgKyBvZmZzZXQpOworfQorCitpbmxpbmUgc3RhdGljIHUzMgorc25kX25tMjU2X3JlYWRsKG5tMjU2X3QgKmNoaXAsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGNoaXAtPmNwb3J0ICsgb2Zmc2V0KTsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkCitzbmRfbm0yNTZfd3JpdGViKG5tMjU2X3QgKmNoaXAsIGludCBvZmZzZXQsIHU4IHZhbCkKK3sKKwl3cml0ZWIodmFsLCBjaGlwLT5jcG9ydCArIG9mZnNldCk7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZAorc25kX25tMjU2X3dyaXRldyhubTI1Nl90ICpjaGlwLCBpbnQgb2Zmc2V0LCB1MTYgdmFsKQoreworCXdyaXRldyh2YWwsIGNoaXAtPmNwb3J0ICsgb2Zmc2V0KTsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkCitzbmRfbm0yNTZfd3JpdGVsKG5tMjU2X3QgKmNoaXAsIGludCBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgY2hpcC0+Y3BvcnQgKyBvZmZzZXQpOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQKK3NuZF9ubTI1Nl93cml0ZV9idWZmZXIobm0yNTZfdCAqY2hpcCwgdm9pZCAqc3JjLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlvZmZzZXQgLT0gY2hpcC0+YnVmZmVyX3N0YXJ0OworI2lmZGVmIFNORFJWX0NPTkZJR19ERUJVRworCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBjaGlwLT5idWZmZXJfc2l6ZSkgeworCQlzbmRfcHJpbnRrKCJ3cml0ZV9idWZmZXIgaW52YWxpZCBvZmZzZXQgPSAlZCBzaXplID0gJWRcbiIsIG9mZnNldCwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwltZW1jcHlfdG9pbyhjaGlwLT5idWZmZXIgKyBvZmZzZXQsIHNyYywgc2l6ZSk7Cit9CisKKy8qCisgKiBjb2VmZmljaWVudCBoYW5kbGVycyAtLSB3aGF0IGEgbWFnaWMhCisgKi8KKworc3RhdGljIHUxNgorc25kX25tMjU2X2dldF9zdGFydF9vZmZzZXQoaW50IHdoaWNoKQoreworCXUxNiBvZmZzZXQgPSAwOworCXdoaWxlICh3aGljaC0tID4gMCkKKwkJb2Zmc2V0ICs9IGNvZWZmaWNpZW50X3NpemVzW3doaWNoXTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZAorc25kX25tMjU2X2xvYWRfb25lX2NvZWZmaWNpZW50KG5tMjU2X3QgKmNoaXAsIGludCBzdHJlYW0sIHUzMiBwb3J0LCBpbnQgd2hpY2gpCit7CisJdTMyIGNvZWZmX2J1ZiA9IGNoaXAtPmNvZWZmX2J1ZltzdHJlYW1dOworCXUxNiBvZmZzZXQgPSBzbmRfbm0yNTZfZ2V0X3N0YXJ0X29mZnNldCh3aGljaCk7CisJdTE2IHNpemUgPSBjb2VmZmljaWVudF9zaXplc1t3aGljaF07CisKKwlzbmRfbm0yNTZfd3JpdGVfYnVmZmVyKGNoaXAsIGNvZWZmaWNpZW50cyArIG9mZnNldCwgY29lZmZfYnVmLCBzaXplKTsKKwlzbmRfbm0yNTZfd3JpdGVsKGNoaXAsIHBvcnQsIGNvZWZmX2J1Zik7CisJLyogPz8/ICBSZWNvcmQgc2VlbXMgdG8gYmVoYXZlIGRpZmZlcmVudGx5IHRoYW4gcGxheWJhY2suICAqLworCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJc2l6ZS0tOworCXNuZF9ubTI1Nl93cml0ZWwoY2hpcCwgcG9ydCArIDQsIGNvZWZmX2J1ZiArIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorc25kX25tMjU2X2xvYWRfY29lZmZpY2llbnQobm0yNTZfdCAqY2hpcCwgaW50IHN0cmVhbSwgaW50IG51bWJlcikKK3sKKwkvKiBUaGUgZW5hYmxlIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkIGVuZ2luZS4gICovCisJdTMyIHBvZmZzZXQgPSAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA/IE5NX1JFQ09SRF9FTkFCTEVfUkVHIDogTk1fUExBWUJBQ0tfRU5BQkxFX1JFRyk7CisJdTMyIGFkZHIgPSBOTV9DT0VGRl9TVEFSVF9PRkZTRVQ7CisKKwlhZGRyICs9IChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFID8gTk1fUkVDT1JEX1JFR19PRkZTRVQgOiBOTV9QTEFZQkFDS19SRUdfT0ZGU0VUKTsKKworCWlmIChzbmRfbm0yNTZfcmVhZGIoY2hpcCwgcG9mZnNldCkgJiAxKSB7CisJCXNuZF9wcmludGQoIk5NMjU2OiBFbmdpbmUgd2FzIGVuYWJsZWQgd2hpbGUgbG9hZGluZyBjb2VmZmljaWVudHMhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSByZWNvcmRpbmcgZW5naW5lIHVzZXMgY29lZmZpY2llbnQgdmFsdWVzIDgtMTUuICAqLworCW51bWJlciAmPSA3OworCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQludW1iZXIgKz0gODsKKworCWlmICghIGNoaXAtPnVzZV9jYWNoZSkgeworCQlzbmRfbm0yNTZfbG9hZF9vbmVfY29lZmZpY2llbnQoY2hpcCwgc3RyZWFtLCBhZGRyLCBudW1iZXIpOworCQlyZXR1cm47CisJfQorCWlmICghIGNoaXAtPmNvZWZmc19jdXJyZW50KSB7CisJCXNuZF9ubTI1Nl93cml0ZV9idWZmZXIoY2hpcCwgY29lZmZpY2llbnRzLCBjaGlwLT5hbGxfY29lZmZfYnVmLAorCQkJCSAgICAgICBOTV9UT1RBTF9DT0VGRl9DT1VOVCAqIDQpOworCQljaGlwLT5jb2VmZnNfY3VycmVudCA9IDE7CisJfSBlbHNlIHsKKwkJdTMyIGJhc2UgPSBjaGlwLT5hbGxfY29lZmZfYnVmOworCQl1MzIgb2Zmc2V0ID0gc25kX25tMjU2X2dldF9zdGFydF9vZmZzZXQobnVtYmVyKTsKKwkJdTMyIGVuZF9vZmZzZXQgPSBvZmZzZXQgKyBjb2VmZmljaWVudF9zaXplc1tudW1iZXJdOworCQlzbmRfbm0yNTZfd3JpdGVsKGNoaXAsIGFkZHIsIGJhc2UgKyBvZmZzZXQpOworCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQllbmRfb2Zmc2V0LS07CisJCXNuZF9ubTI1Nl93cml0ZWwoY2hpcCwgYWRkciArIDQsIGJhc2UgKyBlbmRfb2Zmc2V0KTsKKwl9Cit9CisKKworLyogVGhlIGFjdHVhbCByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNhbXBsZXJhdGVzWzhdID0geworCTgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLAorfTsKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGNvbnN0cmFpbnRzX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoc2FtcGxlcmF0ZXMpLCAKKwkubGlzdCA9IHNhbXBsZXJhdGVzLAorCS5tYXNrID0gMCwKK307CisKKy8qCisgKiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSB0YXJnZXQgcmF0ZQorICovCitzdGF0aWMgaW50CitzbmRfbm0yNTZfZml4ZWRfcmF0ZSh1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYW1wbGVyYXRlcyk7IGkrKykgeworCQlpZiAocmF0ZSA9PSBzYW1wbGVyYXRlc1tpXSkKKwkJCXJldHVybiBpOworCX0KKwlzbmRfQlVHKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZXQgc2FtcGxlIHJhdGUgYW5kIGZvcm1hdAorICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X3NldF9mb3JtYXQobm0yNTZfdCAqY2hpcCwgbm0yNTZfc3RyZWFtX3QgKnMsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgcmF0ZV9pbmRleCA9IHNuZF9ubTI1Nl9maXhlZF9yYXRlKHJ1bnRpbWUtPnJhdGUpOworCXVuc2lnbmVkIGNoYXIgcmF0ZWJpdHMgPSAocmF0ZV9pbmRleCA8PCA0KSAmIE5NX1JBVEVfTUFTSzsKKworCXMtPnNoaWZ0ID0gMDsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNikgeworCQlyYXRlYml0cyB8PSBOTV9SQVRFX0JJVFNfMTY7CisJCXMtPnNoaWZ0Kys7CisJfQorCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpIHsKKwkJcmF0ZWJpdHMgfD0gTk1fUkFURV9TVEVSRU87CisJCXMtPnNoaWZ0Kys7CisJfQorCisJcnVudGltZS0+cmF0ZSA9IHNhbXBsZXJhdGVzW3JhdGVfaW5kZXhdOworCisJc3dpdGNoIChzdWJzdHJlYW0tPnN0cmVhbSkgeworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKKwkJc25kX25tMjU2X2xvYWRfY29lZmZpY2llbnQoY2hpcCwgMCwgcmF0ZV9pbmRleCk7IC8qIDAgPSBwbGF5YmFjayAqLworCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsCisJCQkJIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCisJCQkJIHJhdGViaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6CisJCXNuZF9ubTI1Nl9sb2FkX2NvZWZmaWNpZW50KGNoaXAsIDEsIHJhdGVfaW5kZXgpOyAvKiAxID0gcmVjb3JkICovCisJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwKKwkJCQkgTk1fUkVDT1JEX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCisJCQkJIHJhdGViaXRzKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogc3RhcnQgLyBzdG9wCisgKi8KKworLyogdXBkYXRlIHRoZSB3YXRlcm1hcmsgKGN1cnJlbnQgcGVyaW9kKSAqLworc3RhdGljIHZvaWQgc25kX25tMjU2X3BjbV9tYXJrKG5tMjU2X3QgKmNoaXAsIG5tMjU2X3N0cmVhbV90ICpzLCBpbnQgcmVnKQoreworCXMtPmN1cl9wZXJpb2QrKzsKKwlzLT5jdXJfcGVyaW9kICU9IHMtPnBlcmlvZHM7CisJc25kX25tMjU2X3dyaXRlbChjaGlwLCByZWcsIHMtPmJ1ZiArIHMtPmN1cl9wZXJpb2QgKiBzLT5wZXJpb2Rfc2l6ZSk7Cit9CisKKyNkZWZpbmUgc25kX25tMjU2X3BsYXliYWNrX21hcmsoY2hpcCwgcykgc25kX25tMjU2X3BjbV9tYXJrKGNoaXAsIHMsIE5NX1BCVUZGRVJfV01BUkspCisjZGVmaW5lIHNuZF9ubTI1Nl9jYXB0dXJlX21hcmsoY2hpcCwgcykgIHNuZF9ubTI1Nl9wY21fbWFyayhjaGlwLCBzLCBOTV9SQlVGRkVSX1dNQVJLKQorCitzdGF0aWMgdm9pZAorc25kX25tMjU2X3BsYXliYWNrX3N0YXJ0KG5tMjU2X3QgKmNoaXAsIG5tMjU2X3N0cmVhbV90ICpzLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJLyogcHJvZ3JhbSBidWZmZXIgcG9pbnRlcnMgKi8KKwlzbmRfbm0yNTZfd3JpdGVsKGNoaXAsIE5NX1BCVUZGRVJfU1RBUlQsIHMtPmJ1Zik7CisJc25kX25tMjU2X3dyaXRlbChjaGlwLCBOTV9QQlVGRkVSX0VORCwgcy0+YnVmICsgcy0+ZG1hX3NpemUgLSAoMSA8PCBzLT5zaGlmdCkpOworCXNuZF9ubTI1Nl93cml0ZWwoY2hpcCwgTk1fUEJVRkZFUl9DVVJSUCwgcy0+YnVmKTsKKwlzbmRfbm0yNTZfcGxheWJhY2tfbWFyayhjaGlwLCBzKTsKKworCS8qIEVuYWJsZSBwbGF5YmFjayBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCisJc25kX25tMjU2X3dyaXRlYihjaGlwLCBOTV9QTEFZQkFDS19FTkFCTEVfUkVHLAorCQkJIE5NX1BMQVlCQUNLX0VOQUJMRV9GTEFHIHwgTk1fUExBWUJBQ0tfRlJFRVJVTik7CisJLyogRW5hYmxlIGJvdGggY2hhbm5lbHMuICovCisJc25kX25tMjU2X3dyaXRldyhjaGlwLCBOTV9BVURJT19NVVRFX1JFRywgMHgwKTsKK30KKworc3RhdGljIHZvaWQKK3NuZF9ubTI1Nl9jYXB0dXJlX3N0YXJ0KG5tMjU2X3QgKmNoaXAsIG5tMjU2X3N0cmVhbV90ICpzLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJLyogcHJvZ3JhbSBidWZmZXIgcG9pbnRlcnMgKi8KKwlzbmRfbm0yNTZfd3JpdGVsKGNoaXAsIE5NX1JCVUZGRVJfU1RBUlQsIHMtPmJ1Zik7CisJc25kX25tMjU2X3dyaXRlbChjaGlwLCBOTV9SQlVGRkVSX0VORCwgcy0+YnVmICsgcy0+ZG1hX3NpemUpOworCXNuZF9ubTI1Nl93cml0ZWwoY2hpcCwgTk1fUkJVRkZFUl9DVVJSUCwgcy0+YnVmKTsKKwlzbmRfbm0yNTZfY2FwdHVyZV9tYXJrKGNoaXAsIHMpOworCisJLyogRW5hYmxlIHBsYXliYWNrIGVuZ2luZSBhbmQgaW50ZXJydXB0cy4gKi8KKwlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLAorCQkJIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyB8IE5NX1JFQ09SRF9GUkVFUlVOKTsKK30KKworLyogU3RvcCB0aGUgcGxheSBlbmdpbmUuICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X3BsYXliYWNrX3N0b3Aobm0yNTZfdCAqY2hpcCkKK3sKKwkvKiBTaHV0IG9mZiBzb3VuZCBmcm9tIGJvdGggY2hhbm5lbHMuICovCisJc25kX25tMjU2X3dyaXRldyhjaGlwLCBOTV9BVURJT19NVVRFX1JFRywKKwkJCSBOTV9BVURJT19NVVRFX0xFRlQgfCBOTV9BVURJT19NVVRFX1JJR0hUKTsKKwkvKiBEaXNhYmxlIHBsYXkgZW5naW5lLiAqLworCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfbm0yNTZfY2FwdHVyZV9zdG9wKG5tMjU2X3QgKmNoaXApCit7CisJLyogRGlzYWJsZSByZWNvcmRpbmcgZW5naW5lLiAqLworCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgTk1fUkVDT1JEX0VOQUJMRV9SRUcsIDApOworfQorCitzdGF0aWMgaW50CitzbmRfbm0yNTZfcGxheWJhY2tfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJbm0yNTZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlubTI1Nl9zdHJlYW1fdCAqcyA9IChubTI1Nl9zdHJlYW1fdCopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVyciA9IDA7CisKKwlzbmRfYXNzZXJ0KHMgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWlmICghIHMtPnJ1bm5pbmcpIHsKKwkJCXNuZF9ubTI1Nl9wbGF5YmFja19zdGFydChjaGlwLCBzLCBzdWJzdHJlYW0pOworCQkJcy0+cnVubmluZyA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJaWYgKHMtPnJ1bm5pbmcpIHsKKwkJCXNuZF9ubTI1Nl9wbGF5YmFja19zdG9wKGNoaXApOworCQkJcy0+cnVubmluZyA9IDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorc25kX25tMjU2X2NhcHR1cmVfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJbm0yNTZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlubTI1Nl9zdHJlYW1fdCAqcyA9IChubTI1Nl9zdHJlYW1fdCopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVyciA9IDA7CisKKwlzbmRfYXNzZXJ0KHMgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWlmICghIHMtPnJ1bm5pbmcpIHsKKwkJCXNuZF9ubTI1Nl9jYXB0dXJlX3N0YXJ0KGNoaXAsIHMsIHN1YnN0cmVhbSk7CisJCQlzLT5ydW5uaW5nID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlpZiAocy0+cnVubmluZykgeworCQkJc25kX25tMjU2X2NhcHR1cmVfc3RvcChjaGlwKTsKKwkJCXMtPnJ1bm5pbmcgPSAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIHByZXBhcmUgcGxheWJhY2svY2FwdHVyZSBjaGFubmVsCisgKi8KK3N0YXRpYyBpbnQgc25kX25tMjU2X3BjbV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlubTI1Nl90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCW5tMjU2X3N0cmVhbV90ICpzID0gKG5tMjU2X3N0cmVhbV90KilydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlzbmRfYXNzZXJ0KHMsIHJldHVybiAtRU5YSU8pOworCXMtPmRtYV9zaXplID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpOworCXMtPnBlcmlvZF9zaXplID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemUpOworCXMtPnBlcmlvZHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7CisJcy0+Y3VyX3BlcmlvZCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcy0+cnVubmluZyA9IDA7CisJc25kX25tMjU2X3NldF9mb3JtYXQoY2hpcCwgcywgc3Vic3RyZWFtKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBnZXQgdGhlIGN1cnJlbnQgcG9pbnRlcgorICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9ubTI1Nl9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJbm0yNTZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlubTI1Nl9zdHJlYW1fdCAqcyA9IChubTI1Nl9zdHJlYW1fdCopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBjdXJwOworCisJc25kX2Fzc2VydChzLCByZXR1cm4gMCk7CisJY3VycCA9IHNuZF9ubTI1Nl9yZWFkbChjaGlwLCBOTV9QQlVGRkVSX0NVUlJQKSAtICh1bnNpZ25lZCBsb25nKXMtPmJ1ZjsKKwljdXJwICU9IHMtPmRtYV9zaXplOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJwKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfbm0yNTZfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJbm0yNTZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlubTI1Nl9zdHJlYW1fdCAqcyA9IChubTI1Nl9zdHJlYW1fdCopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBjdXJwOworCisJc25kX2Fzc2VydChzICE9IE5VTEwsIHJldHVybiAwKTsKKwljdXJwID0gc25kX25tMjU2X3JlYWRsKGNoaXAsIE5NX1JCVUZGRVJfQ1VSUlApIC0gKHVuc2lnbmVkIGxvbmcpcy0+YnVmOworCWN1cnAgJT0gcy0+ZG1hX3NpemU7CQorCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJwKTsKK30KKworLyogUmVtYXBwZWQgSS9PIHNwYWNlIGNhbiBiZSBhY2Nlc3NpYmxlIGFzIHBvaW50ZXIgb24gaTM4NiAqLworLyogVGhpcyBtaWdodCBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUgKi8KKyNpZm5kZWYgX19pMzg2X18KKy8qCisgKiBzaWxlbmNlIC8gY29weSBmb3IgcGxheWJhY2sKKyAqLworc3RhdGljIGludAorc25kX25tMjU2X3BsYXliYWNrX3NpbGVuY2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgaW50IGNoYW5uZWwsIC8qIG5vdCB1c2VkIChpbnRlcmxlYXZlZCBkYXRhKSAqLworCQkJICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zLAorCQkJICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJbm0yNTZfc3RyZWFtX3QgKnMgPSAobm0yNTZfc3RyZWFtX3QqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBjb3VudCk7CisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvcyk7CisJbWVtc2V0X2lvKHMtPmJ1ZnB0ciArIHBvcywgMCwgY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfbm0yNTZfcGxheWJhY2tfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQlpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCQl2b2lkIF9fdXNlciAqc3JjLAorCQkJc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJbm0yNTZfc3RyZWFtX3QgKnMgPSAobm0yNTZfc3RyZWFtX3QqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBjb3VudCk7CisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvcyk7CisJaWYgKGNvcHlfZnJvbV91c2VyX3RvaW8ocy0+YnVmcHRyICsgcG9zLCBzcmMsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb3B5IHRvIHVzZXIKKyAqLworc3RhdGljIGludAorc25kX25tMjU2X2NhcHR1cmVfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCSAgICAgICBpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCSAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCSAgICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJbm0yNTZfc3RyZWFtX3QgKnMgPSAobm0yNTZfc3RyZWFtX3QqKXJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBjb3VudCk7CisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvcyk7CisJaWYgKGNvcHlfdG9fdXNlcl9mcm9taW8oZHN0LCBzLT5idWZwdHIgKyBwb3MsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworCisvKgorICogdXBkYXRlIHBsYXliYWNrL2NhcHR1cmUgd2F0ZXJtYXJrcworICovCisKKy8qIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X3BsYXliYWNrX3VwZGF0ZShubTI1Nl90ICpjaGlwKQoreworCW5tMjU2X3N0cmVhbV90ICpzOworCisJcyA9ICZjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWlmIChzLT5ydW5uaW5nICYmIHMtPnN1YnN0cmVhbSkgeworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHMtPnN1YnN0cmVhbSk7CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzbmRfbm0yNTZfcGxheWJhY2tfbWFyayhjaGlwLCBzKTsKKwl9Cit9CisKKy8qIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X2NhcHR1cmVfdXBkYXRlKG5tMjU2X3QgKmNoaXApCit7CisJbm0yNTZfc3RyZWFtX3QgKnM7CisKKwlzID0gJmNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKKwlpZiAocy0+cnVubmluZyAmJiBzLT5zdWJzdHJlYW0pIHsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzLT5zdWJzdHJlYW0pOworCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJc25kX25tMjU2X2NhcHR1cmVfbWFyayhjaGlwLCBzKTsKKwl9Cit9CisKKy8qCisgKiBoYXJkd2FyZSBpbmZvCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX25tMjU2X3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJU05EUlZfUENNX0lORk9fTU1BUF9JT01FTSB8U05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCS8qU05EUlZfUENNX0lORk9fUEFVU0UgfCovCisJCQkJU05EUlZfUENNX0lORk9fUkVTVU1FLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVC8qMjRrKi8gfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTI1NiwKKwkucGVyaW9kX2J5dGVzX21heCA9CTEyOCAqIDEwMjQsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9ubTI1Nl9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJU05EUlZfUENNX0lORk9fTU1BUF9JT01FTSB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkvKlNORFJWX1BDTV9JTkZPX1BBVVNFIHwqLworCQkJCVNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QvKjI0ayovIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJODAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuYnVmZmVyX2J5dGVzX21heCA9CTEyOCAqIDEwMjQsCisJLnBlcmlvZF9ieXRlc19taW4gPQkyNTYsCisJLnBlcmlvZF9ieXRlc19tYXggPQkxMjggKiAxMDI0LAorfTsKKworCisvKiBzZXQgZG1hIHRyYW5zZmVyIHNpemUgKi8KK3N0YXRpYyBpbnQgc25kX25tMjU2X3BjbV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpod19wYXJhbXMpCit7CisJLyogYXJlYSBhbmQgYWRkciBhcmUgYWxyZWFkeSBzZXQgYW5kIHVuY2hhbmdlZCAqLworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpOworCXJldHVybiAwOworfQorCisvKgorICogb3BlbgorICovCitzdGF0aWMgdm9pZCBzbmRfbm0yNTZfc2V0dXBfc3RyZWFtKG5tMjU2X3QgKmNoaXAsIG5tMjU2X3N0cmVhbV90ICpzLAorCQkJCSAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgICBzbmRfcGNtX2hhcmR3YXJlX3QgKmh3X3B0cikKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXMtPnJ1bm5pbmcgPSAwOworCXJ1bnRpbWUtPmh3ID0gKmh3X3B0cjsKKwlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gcy0+YnVmc2l6ZTsKKwlydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4ID0gcy0+YnVmc2l6ZSAvIDI7CisJcnVudGltZS0+ZG1hX2FyZWEgPSAodm9pZCopIHMtPmJ1ZnB0cjsKKwlydW50aW1lLT5kbWFfYWRkciA9IHMtPmJ1ZnB0cl9hZGRyOworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IHMtPmJ1ZnNpemU7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlzLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgJmNvbnN0cmFpbnRzX3JhdGVzKTsKK30KKworc3RhdGljIGludAorc25kX25tMjU2X3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCW5tMjU2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfbm0yNTZfc2V0dXBfc3RyZWFtKGNoaXAsICZjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLAorCQkJICAgICAgIHN1YnN0cmVhbSwgJnNuZF9ubTI1Nl9wbGF5YmFjayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ubTI1Nl9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCW5tMjU2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfbm0yNTZfc2V0dXBfc3RyZWFtKGNoaXAsICZjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0sCisJCQkgICAgICAgc3Vic3RyZWFtLCAmc25kX25tMjU2X2NhcHR1cmUpOworCXJldHVybiAwOworfQorCisvKgorICogY2xvc2UgLSB3ZSBkb24ndCBoYXZlIHRvIGRvIHNwZWNpYWwuLgorICovCitzdGF0aWMgaW50CitzbmRfbm0yNTZfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3NuZF9ubTI1Nl9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZSBhIHBjbSBpbnN0YW5jZQorICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfbm0yNTZfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9ubTI1Nl9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9ubTI1Nl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX25tMjU2X3BjbV9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfbm0yNTZfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfbm0yNTZfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ubTI1Nl9wbGF5YmFja19wb2ludGVyLAorI2lmbmRlZiBfX2kzODZfXworCS5jb3B5ID0JCXNuZF9ubTI1Nl9wbGF5YmFja19jb3B5LAorCS5zaWxlbmNlID0Jc25kX25tMjU2X3BsYXliYWNrX3NpbGVuY2UsCisjZW5kaWYKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX25tMjU2X2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF9ubTI1Nl9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX25tMjU2X2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9ubTI1Nl9wY21faHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX25tMjU2X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX25tMjU2X2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ubTI1Nl9jYXB0dXJlX3BvaW50ZXIsCisjaWZuZGVmIF9faTM4Nl9fCisJLmNvcHkgPQkJc25kX25tMjU2X2NhcHR1cmVfY29weSwKKyNlbmRpZgorCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX25tMjU2X3BjbShubTI1Nl90ICpjaGlwLCBpbnQgZGV2aWNlKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW5tMjU2X3N0cmVhbV90ICpzID0gJmNoaXAtPnN0cmVhbXNbaV07CisJCXMtPmJ1ZnB0ciA9IGNoaXAtPmJ1ZmZlciArIChzLT5idWYgLSBjaGlwLT5idWZmZXJfc3RhcnQpOworCQlzLT5idWZwdHJfYWRkciA9IGNoaXAtPmJ1ZmZlcl9hZGRyICsgKHMtPmJ1ZiAtIGNoaXAtPmJ1ZmZlcl9zdGFydCk7CisJfQorCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgY2hpcC0+Y2FyZC0+ZHJpdmVyLCBkZXZpY2UsCisJCQkgIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9ubTI1Nl9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9ubTI1Nl9jYXB0dXJlX29wcyk7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwljaGlwLT5wY20gPSBwY207CisKKwlyZXR1cm4gMDsKK30KKworCisvKiAKKyAqIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAKKyAqLworc3RhdGljIHZvaWQKK3NuZF9ubTI1Nl9pbml0X2NoaXAobm0yNTZfdCAqY2hpcCkKK3sKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogUmVzZXQgZXZlcnl0aGluZy4gKi8KKwlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4MCwgMHgxMSk7CisJc25kX25tMjU2X3dyaXRldyhjaGlwLCAweDIxNCwgMCk7CisJLyogc3RvcCBzb3VuZHMuLiAqLworCS8vc25kX25tMjU2X3BsYXliYWNrX3N0b3AoY2hpcCk7CisJLy9zbmRfbm0yNTZfY2FwdHVyZV9zdG9wKGNoaXApOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworfQorCisKK2lubGluZSBzdGF0aWMgdm9pZAorc25kX25tMjU2X2ludHJfY2hlY2sobm0yNTZfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+YmFkaW50cmNvdW50KysgPiAxMDAwKSB7CisJCS8qCisJCSAqIEknbSBub3Qgc3VyZSBpZiB0aGUgYmVzdCB0aGluZyBpcyB0byBzdG9wIHRoZSBjYXJkIGZyb20KKwkJICogcGxheWluZyBvciBqdXN0IHJlbGVhc2UgdGhlIGludGVycnVwdCAoYWZ0ZXIgYWxsLCB3ZSdyZSBpbgorCQkgKiBhIGJhZCBzaXR1YXRpb24sIHNvIGRvaW5nIGZhbmN5IHN0dWZmIG1heSBub3QgYmUgc3VjaCBhIGdvb2QKKwkJICogaWRlYSkuCisJCSAqCisJCSAqIEkgd29ycnkgYWJvdXQgdGhlIGNhcmQgZW5naW5lIGNvbnRpbnVpbmcgdG8gcGxheSBub2lzZQorCQkgKiBvdmVyIGFuZCBvdmVyLCBob3dldmVyLS10aGF0IGNvdWxkIGJlY29tZSBhIHZlcnkKKwkJICogb2Jub3hpb3VzIHByb2JsZW0uICBBbmQgd2Uga25vdyB0aGF0IHdoZW4gdGhpcyB1c3VhbGx5CisJCSAqIGhhcHBlbnMgdGhpbmdzIGFyZSBmYWlybHkgc2FmZSwgaXQganVzdCBtZWFucyB0aGUgdXNlcidzCisJCSAqIGluc2VydGVkIGEgUENNQ0lBIGNhcmQgYW5kIHNvbWVvbmUncyBzcGFtbWluZyB1cyB3aXRoIElSUSA5cy4KKwkJICovCisJCWlmIChjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnJ1bm5pbmcpCisJCQlzbmRfbm0yNTZfcGxheWJhY2tfc3RvcChjaGlwKTsKKwkJaWYgKGNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5ydW5uaW5nKQorCQkJc25kX25tMjU2X2NhcHR1cmVfc3RvcChjaGlwKTsKKwkJY2hpcC0+YmFkaW50cmNvdW50ID0gMDsKKwl9Cit9CisKKy8qIAorICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuIAorICoKKyAqIEkgZG9uJ3QgbGlrZSB0aGUgY3V0LW4tcGFzdGUgam9iIGhlcmUgZWl0aGVyIGJldHdlZW4gdGhlIHR3byByb3V0aW5lcywKKyAqIGJ1dCB0aGVyZSBhcmUgc3VmZmljaWVudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW50ZXJydXB0IGhhbmRsZXJzCisgKiB0aGF0IHBhcmFtZXRlcml6aW5nIGl0IGlzbid0IGFsbCB0aGF0IGdyZWF0IGVpdGhlci4gIChDb3VsZCB1c2UgYSBtYWNybywKKyAqIEkgc3VwcG9zZS4uLnl1Y2t5IGJsZWFoLikKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NuZF9ubTI1Nl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJbm0yNTZfdCAqY2hpcCA9IGRldl9pZDsKKwl1MTYgc3RhdHVzOworCXU4IGNieXRlOworCisJc3RhdHVzID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX0lOVF9SRUcpOworCisJLyogTm90IG91cnMuICovCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCXNuZF9ubTI1Nl9pbnRyX2NoZWNrKGNoaXApOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJY2hpcC0+YmFkaW50cmNvdW50ID0gMDsKKworCS8qIFJhdGhlciBib3Jpbmc7IGNoZWNrIGZvciBpbmRpdmlkdWFsIGludGVycnVwdHMgYW5kIHByb2Nlc3MgdGhlbS4gKi8KKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmIChzdGF0dXMgJiBOTV9QTEFZQkFDS19JTlQpIHsKKwkJc3RhdHVzICY9IH5OTV9QTEFZQkFDS19JTlQ7CisJCU5NX0FDS19JTlQoY2hpcCwgTk1fUExBWUJBQ0tfSU5UKTsKKwkJc25kX25tMjU2X3BsYXliYWNrX3VwZGF0ZShjaGlwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgTk1fUkVDT1JEX0lOVCkgeworCQlzdGF0dXMgJj0gfk5NX1JFQ09SRF9JTlQ7CisJCU5NX0FDS19JTlQoY2hpcCwgTk1fUkVDT1JEX0lOVCk7CisJCXNuZF9ubTI1Nl9jYXB0dXJlX3VwZGF0ZShjaGlwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMSkgeworCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7CisJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMSk7CisJCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOworCQlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIE5NX0lOVF9SRUcsIDB4ODAwMCk7CisJCWNieXRlID0gc25kX25tMjU2X3JlYWRiKGNoaXAsIDB4NDAwKTsKKwkJc25kX25tMjU2X3dyaXRlYihjaGlwLCAweDQwMCwgY2J5dGUgfCAyKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgeworCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7CisJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMik7CisJCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCQljYnl0ZSA9IHNuZF9ubTI1Nl9yZWFkYihjaGlwLCAweDQwMCk7CisJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg0MDAsIGNieXRlICYgfjIpOworCX0KKworCS8qIFVua25vd24gaW50ZXJydXB0LiAqLworCWlmIChzdGF0dXMpIHsKKwkJc25kX3ByaW50ZCgiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCisJCQkgICBzdGF0dXMpOworCQkvKiBQcmF5LiAqLworCQlOTV9BQ0tfSU5UKGNoaXAsIHN0YXR1cyk7CisJfQorCisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4KKyAqIFRoaXMgaGFuZGxlciBpcyBmb3IgdGhlIDI1NlpYLCBhbmQgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBub24tWlgKKyAqIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGlycXJldHVybl90CitzbmRfbm0yNTZfaW50ZXJydXB0X3p4KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCW5tMjU2X3QgKmNoaXAgPSBkZXZfaWQ7CisJdTMyIHN0YXR1czsKKwl1OCBjYnl0ZTsKKworCXN0YXR1cyA9IHNuZF9ubTI1Nl9yZWFkbChjaGlwLCBOTV9JTlRfUkVHKTsKKworCS8qIE5vdCBvdXJzLiAqLworCWlmIChzdGF0dXMgPT0gMCkgeworCQlzbmRfbm0yNTZfaW50cl9jaGVjayhjaGlwKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWNoaXAtPmJhZGludHJjb3VudCA9IDA7CisKKwkvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoc3RhdHVzICYgTk0yX1BMQVlCQUNLX0lOVCkgeworCQlzdGF0dXMgJj0gfk5NMl9QTEFZQkFDS19JTlQ7CisJCU5NMl9BQ0tfSU5UKGNoaXAsIE5NMl9QTEFZQkFDS19JTlQpOworCQlzbmRfbm0yNTZfcGxheWJhY2tfdXBkYXRlKGNoaXApOworCX0KKworCWlmIChzdGF0dXMgJiBOTTJfUkVDT1JEX0lOVCkgeworCQlzdGF0dXMgJj0gfk5NMl9SRUNPUkRfSU5UOworCQlOTTJfQUNLX0lOVChjaGlwLCBOTTJfUkVDT1JEX0lOVCk7CisJCXNuZF9ubTI1Nl9jYXB0dXJlX3VwZGF0ZShjaGlwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKKwkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKKwkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzEpOworCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOworCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSB8IDIpOworCX0KKworCWlmIChzdGF0dXMgJiBOTTJfTUlTQ19JTlRfMikgeworCQlzdGF0dXMgJj0gfk5NMl9NSVNDX0lOVF8yOworCQlOTTJfQUNLX0lOVChjaGlwLCBOTTJfTUlTQ19JTlRfMik7CisJCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCQljYnl0ZSA9IHNuZF9ubTI1Nl9yZWFkYihjaGlwLCAweDQwMCk7CisJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg0MDAsIGNieXRlICYgfjIpOworCX0KKworCS8qIFVua25vd24gaW50ZXJydXB0LiAqLworCWlmIChzdGF0dXMpIHsKKwkJc25kX3ByaW50ZCgiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCisJCQkgICBzdGF0dXMpOworCQkvKiBQcmF5LiAqLworCQlOTTJfQUNLX0lOVChjaGlwLCBzdGF0dXMpOworCX0KKworCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogQUM5NyBpbnRlcmZhY2UKKyAqLworCisvKgorICogV2FpdHMgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkgdG8gYmUgd3JpdHRlbjsgcmV0dXJucyBhIHplcm8gdmFsdWUKKyAqIGlmIGl0IHRpbWVkIG91dC4KKyAqLworc3RhdGljIGludAorc25kX25tMjU2X2FjOTdfcmVhZHkobm0yNTZfdCAqY2hpcCkKK3sKKwlpbnQgdGltZW91dCA9IDEwOworCXUzMiB0ZXN0YWRkcjsKKwl1MTYgdGVzdGI7CisKKwl0ZXN0YWRkciA9IGNoaXAtPm1peGVyX3N0YXR1c19vZmZzZXQ7CisJdGVzdGIgPSBjaGlwLT5taXhlcl9zdGF0dXNfbWFzazsKKworCS8qIAorCSAqIExvb3AgYXJvdW5kIHdhaXRpbmcgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkuIAorCSAqLworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCWlmICgoc25kX25tMjU2X3JlYWR3KGNoaXAsIHRlc3RhZGRyKSAmIHRlc3RiKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJCXVkZWxheSgxMDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CitzbmRfbm0yNTZfYWM5N19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW5tMjU2X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IHJlczsKKworCWlmIChyZWcgPj0gMTI4KQorCQlyZXR1cm4gMDsKKworCWlmICghIHNuZF9ubTI1Nl9hYzk3X3JlYWR5KGNoaXApKQorCQlyZXR1cm4gMDsKKwlyZXMgPSBzbmRfbm0yNTZfcmVhZHcoY2hpcCwgY2hpcC0+bWl4ZXJfYmFzZSArIHJlZyk7CisJLyogTWFnaWMgZGVsYXkuICBCbGVhaCB5dWNreS4gICovCisJbXNsZWVwKDEpOworCXJldHVybiByZXM7Cit9CisKKy8qIAorICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X2FjOTdfd3JpdGUoYWM5N190ICphYzk3LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCW5tMjU2X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IHRyaWVzID0gMjsKKwl1MzIgYmFzZTsKKworCWJhc2UgPSBjaGlwLT5taXhlcl9iYXNlOworCisJc25kX25tMjU2X2FjOTdfcmVhZHkoY2hpcCk7CisKKwkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gdGFrZSwgdG9vLiAqLworCXdoaWxlICh0cmllcy0tID4gMCkgeworCQlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIGJhc2UgKyByZWcsIHZhbCk7CisJCW1zbGVlcCgxKTsgIC8qIGEgbGl0dGxlIGRlbGF5IGhlcmUgc2VlbXMgYmV0dGVyLi4gKi8KKwkJaWYgKHNuZF9ubTI1Nl9hYzk3X3JlYWR5KGNoaXApKQorCQkJcmV0dXJuOworCX0KKwlzbmRfcHJpbnRkKCJubTI1NjogYWM5NyBjb2RlYyBub3QgcmVhZHkuLlxuIik7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGFjOTcgaW50byBhIGtub3duIHN0YXRlICovCitzdGF0aWMgdm9pZAorc25kX25tMjU2X2FjOTdfcmVzZXQoYWM5N190ICphYzk3KQoreworCW5tMjU2X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisKKwkvKiBSZXNldCB0aGUgbWl4ZXIuICAnVGlzIG1hZ2ljISAgKi8KKwlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NmMwLCAxKTsKKwlpZiAoISBjaGlwLT5yZXNldF93b3JrYXJvdW5kKSB7CisJCS8qIERlbGwgbGF0aXR1ZGUgTFMgd2lsbCBsb2NrIHVwIGJ5IHRoaXMgKi8KKwkJc25kX25tMjU2X3dyaXRlYihjaGlwLCAweDZjYywgMHg4Nyk7CisJfQorCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg2Y2MsIDB4ODApOworCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg2Y2MsIDB4MCk7Cit9CisKKy8qIGNyZWF0ZSBhbiBhYzk3IG1peGVyIGludGVyZmFjZSAqLworc3RhdGljIGludCBfX2RldmluaXQKK3NuZF9ubTI1Nl9taXhlcihubTI1Nl90ICpjaGlwKQoreworCWFjOTdfYnVzX3QgKnBidXM7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGksIGVycjsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkucmVzZXQgPSBzbmRfbm0yNTZfYWM5N19yZXNldCwKKwkJLndyaXRlID0gc25kX25tMjU2X2FjOTdfd3JpdGUsCisJCS5yZWFkID0gc25kX25tMjU2X2FjOTdfcmVhZCwKKwl9OworCS8qIGxvb2tzIGxpa2Ugbm0yNTYgaGFuZ3MgdXAgd2hlbiB1bmV4cGVjdGVkIHJlZ2lzdGVycyBhcmUgdG91Y2hlZC4uLiAqLworCXN0YXRpYyBpbnQgbWl4ZXJfcmVnc1tdID0geworCQlBQzk3X01BU1RFUiwgQUM5N19IRUFEUEhPTkUsIEFDOTdfTUFTVEVSX01PTk8sCisJCUFDOTdfUENfQkVFUCwgQUM5N19QSE9ORSwgQUM5N19NSUMsIEFDOTdfTElORSwgQUM5N19DRCwKKwkJQUM5N19WSURFTywgQUM5N19BVVgsIEFDOTdfUENNLCBBQzk3X1JFQ19TRUwsCisJCUFDOTdfUkVDX0dBSU4sIEFDOTdfR0VORVJBTF9QVVJQT1NFLCBBQzk3XzNEX0NPTlRST0wsCisJCUFDOTdfRVhURU5ERURfSUQsCisJCUFDOTdfVkVORE9SX0lEMSwgQUM5N19WRU5ET1JfSUQyLAorCQktMQorCX07CisKKwlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjaGlwLT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKKwlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX0FVRElPOyAvKiB3ZSBzdXBwb3J0IGF1ZGlvISAqLworCWFjOTcubGltaXRlZF9yZWdzID0gMTsKKwlmb3IgKGkgPSAwOyBtaXhlcl9yZWdzW2ldID49IDA7IGkrKykKKwkJc2V0X2JpdChtaXhlcl9yZWdzW2ldLCBhYzk3LnJlZ19hY2Nlc3NlZCk7CisJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOworCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5Nyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKCEgKGNoaXAtPmFjOTctPmlkICYgKDB4ZjAwMDAwMDApKSkgeworCQkvKiBsb29rcyBsaWtlIGFuIGludmFsaWQgaWQgKi8KKwkJc3ByaW50ZihjaGlwLT5jYXJkLT5taXhlcm5hbWUsICIlcyBBQzk3IiwgY2hpcC0+Y2FyZC0+ZHJpdmVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogU2VlIGlmIHRoZSBzaWduYXR1cmUgbGVmdCBieSB0aGUgTk0yNTYgQklPUyBpcyBpbnRhY3Q7IGlmIHNvLCB3ZSB1c2UKKyAqIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgYXMgdGhlIGVuZCBvZiBvdXIgYXVkaW8gYnVmZmVyIGluIHRoZSB2aWRlbworICogUkFNLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzbmRfbm0yNTZfcGVla19mb3Jfc2lnKG5tMjU2X3QgKmNoaXApCit7CisJLyogVGhlIHNpZ25hdHVyZSBpcyBsb2NhdGVkIDFLIGJlbG93IHRoZSBlbmQgb2YgdmlkZW8gUkFNLiAgKi8KKwl2b2lkIF9faW9tZW0gKnRlbXA7CisJLyogRGVmYXVsdCBidWZmZXIgZW5kIGlzIDUxMjAgYnl0ZXMgYmVsb3cgdGhlIHRvcCBvZiBSQU0uICAqLworCXVuc2lnbmVkIGxvbmcgcG9pbnRlcl9mb3VuZCA9IGNoaXAtPmJ1ZmZlcl9lbmQgLSAweDE0MDA7CisJdTMyIHNpZzsKKworCXRlbXAgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YnVmZmVyX2FkZHIgKyBjaGlwLT5idWZmZXJfZW5kIC0gMHg0MDAsIDE2KTsKKwlpZiAodGVtcCA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoIlVuYWJsZSB0byBzY2FuIGZvciBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU1cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNpZyA9IHJlYWRsKHRlbXApOworCWlmICgoc2lnICYgTk1fU0lHX01BU0spID09IE5NX1NJR05BVFVSRSkgeworCQl1MzIgcG9pbnRlciA9IHJlYWRsKHRlbXAgKyA0KTsKKworCQkvKgorCQkgKiBJZiBpdCdzIG9idmlvdXNseSBpbnZhbGlkLCBkb24ndCB1c2UgaXQKKwkJICovCisJCWlmIChwb2ludGVyID09IDB4ZmZmZmZmZmYgfHwKKwkJICAgIHBvaW50ZXIgPCBjaGlwLT5idWZmZXJfc2l6ZSB8fAorCQkgICAgcG9pbnRlciA+IGNoaXAtPmJ1ZmZlcl9lbmQpIHsKKwkJCXNuZF9wcmludGsoImludmFsaWQgc2lnbmF0dXJlIGZvdW5kOiAweCV4XG4iLCBwb2ludGVyKTsKKwkJCWlvdW5tYXAodGVtcCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfSBlbHNlIHsKKwkJCXBvaW50ZXJfZm91bmQgPSBwb2ludGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibm0yNTY6IGZvdW5kIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTTogMHgleFxuIiwgcG9pbnRlcik7CisJCX0KKwl9CisKKwlpb3VubWFwKHRlbXApOworCWNoaXAtPmJ1ZmZlcl9lbmQgPSBwb2ludGVyX2ZvdW5kOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBBUE0gZXZlbnQgaGFuZGxlciwgc28gdGhlIGNhcmQgaXMgcHJvcGVybHkgcmVpbml0aWFsaXplZCBhZnRlciBhIHBvd2VyCisgKiBldmVudC4KKyAqLworc3RhdGljIGludCBubTI1Nl9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlubTI1Nl90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCisJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOworCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7CisJY2hpcC0+Y29lZmZzX2N1cnJlbnQgPSAwOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5tMjU2X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCW5tMjU2X3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisKKwkvKiBQZXJmb3JtIGEgZnVsbCByZXNldCBvbiB0aGUgaGFyZHdhcmUgKi8KKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXNuZF9ubTI1Nl9pbml0X2NoaXAoY2hpcCk7CisKKwkvKiByZXN0b3JlIGFjOTcgKi8KKwlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBzbmRfbm0yNTZfZnJlZShubTI1Nl90ICpjaGlwKQoreworCWlmIChjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnJ1bm5pbmcpCisJCXNuZF9ubTI1Nl9wbGF5YmFja19zdG9wKGNoaXApOworCWlmIChjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ucnVubmluZykKKwkJc25kX25tMjU2X2NhcHR1cmVfc3RvcChjaGlwKTsKKworCWlmIChjaGlwLT5pcnEgPj0gMCkKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisKKwlpZiAoY2hpcC0+Y3BvcnQpCisJCWlvdW5tYXAoY2hpcC0+Y3BvcnQpOworCWlmIChjaGlwLT5idWZmZXIpCisJCWlvdW5tYXAoY2hpcC0+YnVmZmVyKTsKKwlpZiAoY2hpcC0+cmVzX2Nwb3J0KSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoY2hpcC0+cmVzX2Nwb3J0KTsKKwkJa2ZyZWVfbm9jaGVjayhjaGlwLT5yZXNfY3BvcnQpOworCX0KKwlpZiAoY2hpcC0+cmVzX2J1ZmZlcikgeworCQlyZWxlYXNlX3Jlc291cmNlKGNoaXAtPnJlc19idWZmZXIpOworCQlrZnJlZV9ub2NoZWNrKGNoaXAtPnJlc19idWZmZXIpOworCX0KKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQqKWNoaXApOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX25tMjU2X2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCW5tMjU2X3QgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfbm0yNTZfZnJlZShjaGlwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3NuZF9ubTI1Nl9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJIGludCBwbGF5X2J1ZnNpemUsIGludCBjYXB0X2J1ZnNpemUsCisJCSBpbnQgZm9yY2VfbG9hZCwKKwkJIHUzMiBidWZmZXJ0b3AsCisJCSBpbnQgdXNlY2FjaGUsCisJCSBubTI1Nl90ICoqY2hpcF9yZXQpCit7CisJbm0yNTZfdCAqY2hpcDsKKwlpbnQgZXJyLCBwdmFsOworCXN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX25tMjU2X2Rldl9mcmVlLAorCX07CisJdTMyIGFkZHI7CisKKwkqY2hpcF9yZXQgPSBOVUxMOworCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwljaGlwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5wY2kgPSBwY2k7CisJY2hpcC0+dXNlX2NhY2hlID0gdXNlY2FjaGU7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwljaGlwLT5pcnEgPSAtMTsKKworCWNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYnVmc2l6ZSA9IHBsYXlfYnVmc2l6ZTsKKwljaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uYnVmc2l6ZSA9IGNhcHRfYnVmc2l6ZTsKKworCS8qIAorCSAqIFRoZSBOTTI1NiBoYXMgdHdvIG1lbW9yeSBwb3J0cy4gIFRoZSBmaXJzdCBwb3J0IGlzIG5vdGhpbmcKKwkgKiBtb3JlIHRoYW4gYSBjaHVuayBvZiB2aWRlbyBSQU0sIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEkvTyByaW5nCisJICogYnVmZmVyLiAgVGhlIHNlY29uZCBwb3J0IGhhcyB0aGUgYWN0dWFsIGp1aWN5IHN0dWZmIChsaWtlIHRoZQorCSAqIG1peGVyIGFuZCB0aGUgcGxheWJhY2sgZW5naW5lIGNvbnRyb2wgcmVnaXN0ZXJzKS4KKwkgKi8KKworCWNoaXAtPmJ1ZmZlcl9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJY2hpcC0+Y3BvcnRfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCisJLyogSW5pdCB0aGUgbWVtb3J5IHBvcnQgaW5mby4gICovCisJLyogcmVtYXAgY29udHJvbCBwb3J0ICgjMikgKi8KKwljaGlwLT5yZXNfY3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSwKKwkJCQkJICAgICBjYXJkLT5kcml2ZXIpOworCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRrKCJtZW1vcnkgcmVnaW9uIDB4JWx4IChzaXplIDB4JXgpIGJ1c3lcbiIsCisJCQkgICBjaGlwLT5jcG9ydF9hZGRyLCBOTV9QT1JUMl9TSVpFKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIF9fZXJyb3I7CisJfQorCWNoaXAtPmNwb3J0ID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmNwb3J0X2FkZHIsIE5NX1BPUlQyX1NJWkUpOworCWlmIChjaGlwLT5jcG9ydCA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBtYXAgY29udHJvbCBwb3J0ICVseFxuIiwgY2hpcC0+Y3BvcnRfYWRkcik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gX19lcnJvcjsKKwl9CisKKwlpZiAoIXN0cmNtcChjYXJkLT5kcml2ZXIsICJOTTI1NkFWIikpIHsKKwkJLyogT2ssIHRyeSB0byBzZWUgaWYgdGhpcyBpcyBhIG5vbi1BQzk3IHZlcnNpb24gb2YgdGhlIGhhcmR3YXJlLiAqLworCQlwdmFsID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX01JWEVSX1BSRVNFTkNFKTsKKwkJaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKKwkJCWlmICghIGZvcmNlX2xvYWQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm5tMjU2OiBubyBhYzk3IGlzIGZvdW5kIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSBwYXNzaW5nIGluIHRoZSBtb2R1bGUgcGFyYW1ldGVyXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICBmb3JjZV9hYzk3PTFcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICBvciB0cnkgc2IxNiBvciBjczQyM3ggZHJpdmVycyBpbnN0ZWFkLlxuIik7CisJCQkJZXJyID0gLUVOWElPOworCQkJCWdvdG8gX19lcnJvcjsKKwkJCX0KKwkJfQorCQljaGlwLT5idWZmZXJfZW5kID0gMjU2MCAqIDEwMjQ7CisJCWNoaXAtPmludGVycnVwdCA9IHNuZF9ubTI1Nl9pbnRlcnJ1cHQ7CisJCWNoaXAtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUOworCQljaGlwLT5taXhlcl9zdGF0dXNfbWFzayA9IE5NX01JWEVSX1JFQURZX01BU0s7CisJfSBlbHNlIHsKKwkJLyogTm90IHN1cmUgaWYgdGhlcmUgaXMgYW55IHJlbGV2YW50IGRldGVjdCBmb3IgdGhlIFpYIG9yIG5vdC4gICovCisJCWlmIChzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHhhMGIpICE9IDApCisJCQljaGlwLT5idWZmZXJfZW5kID0gNjE0NCAqIDEwMjQ7CisJCWVsc2UKKwkJCWNoaXAtPmJ1ZmZlcl9lbmQgPSA0MDk2ICogMTAyNDsKKworCQljaGlwLT5pbnRlcnJ1cHQgPSBzbmRfbm0yNTZfaW50ZXJydXB0X3p4OworCQljaGlwLT5taXhlcl9zdGF0dXNfb2Zmc2V0ID0gTk0yX01JWEVSX1NUQVRVU19PRkZTRVQ7CisJCWNoaXAtPm1peGVyX3N0YXR1c19tYXNrID0gTk0yX01JWEVSX1JFQURZX01BU0s7CisJfQorCQorCWNoaXAtPmJ1ZmZlcl9zaXplID0gY2hpcC0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5idWZzaXplICsgY2hpcC0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmJ1ZnNpemU7CisJaWYgKGNoaXAtPnVzZV9jYWNoZSkKKwkJY2hpcC0+YnVmZmVyX3NpemUgKz0gTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0OworCWVsc2UKKwkJY2hpcC0+YnVmZmVyX3NpemUgKz0gTk1fTUFYX1BMQVlCQUNLX0NPRUZfU0laRSArIE5NX01BWF9SRUNPUkRfQ09FRl9TSVpFOworCisJaWYgKGJ1ZmZlcnRvcCA+PSBjaGlwLT5idWZmZXJfc2l6ZSAmJiBidWZmZXJ0b3AgPCBjaGlwLT5idWZmZXJfZW5kKQorCQljaGlwLT5idWZmZXJfZW5kID0gYnVmZmVydG9wOworCWVsc2UgeworCQkvKiBnZXQgYnVmZmVyIGVuZCBwb2ludGVyIGZyb20gc2lnbmF0dXJlICovCisJCWlmICgoZXJyID0gc25kX25tMjU2X3BlZWtfZm9yX3NpZyhjaGlwKSkgPCAwKQorCQkJZ290byBfX2Vycm9yOworCX0KKworCWNoaXAtPmJ1ZmZlcl9zdGFydCA9IGNoaXAtPmJ1ZmZlcl9lbmQgLSBjaGlwLT5idWZmZXJfc2l6ZTsKKwljaGlwLT5idWZmZXJfYWRkciArPSBjaGlwLT5idWZmZXJfc3RhcnQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJubTI1NjogTWFwcGluZyBwb3J0IDEgZnJvbSAweCV4IC0gMHgleFxuIiwKKwkgICAgICAgY2hpcC0+YnVmZmVyX3N0YXJ0LCBjaGlwLT5idWZmZXJfZW5kKTsKKworCWNoaXAtPnJlc19idWZmZXIgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+YnVmZmVyX2FkZHIsCisJCQkJCSAgICAgIGNoaXAtPmJ1ZmZlcl9zaXplLAorCQkJCQkgICAgICBjYXJkLT5kcml2ZXIpOworCWlmIChjaGlwLT5yZXNfYnVmZmVyID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygibm0yNTY6IGJ1ZmZlciAweCVseCAoc2l6ZSAweCV4KSBidXN5XG4iLAorCQkJICAgY2hpcC0+YnVmZmVyX2FkZHIsIGNoaXAtPmJ1ZmZlcl9zaXplKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIF9fZXJyb3I7CisJfQorCWNoaXAtPmJ1ZmZlciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5idWZmZXJfYWRkciwgY2hpcC0+YnVmZmVyX3NpemUpOworCWlmIChjaGlwLT5idWZmZXIgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gbWFwIHJpbmcgYnVmZmVyIGF0ICVseFxuIiwgY2hpcC0+YnVmZmVyX2FkZHIpOworCQlnb3RvIF9fZXJyb3I7CisJfQorCisJLyogc2V0IG9mZnNldHMgKi8KKwlhZGRyID0gY2hpcC0+YnVmZmVyX3N0YXJ0OworCWNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYnVmID0gYWRkcjsKKwlhZGRyICs9IGNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYnVmc2l6ZTsKKwljaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uYnVmID0gYWRkcjsKKwlhZGRyICs9IGNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5idWZzaXplOworCWlmIChjaGlwLT51c2VfY2FjaGUpIHsKKwkJY2hpcC0+YWxsX2NvZWZmX2J1ZiA9IGFkZHI7CisJfSBlbHNlIHsKKwkJY2hpcC0+Y29lZmZfYnVmW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gYWRkcjsKKwkJYWRkciArPSBOTV9NQVhfUExBWUJBQ0tfQ09FRl9TSVpFOworCQljaGlwLT5jb2VmZl9idWZbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGFkZHI7CisJfQorCisJLyogYWNxdWlyZSBpbnRlcnJ1cHQgKi8KKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGNoaXAtPmludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJY2FyZC0+ZHJpdmVyLCAodm9pZCopY2hpcCkpIHsKKwkJZXJyID0gLUVCVVNZOworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZ290byBfX2Vycm9yOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKworCS8qIEZpeGVkIHNldHRpbmcuICovCisJY2hpcC0+bWl4ZXJfYmFzZSA9IE5NX01JWEVSX09GRlNFVDsKKworCWNoaXAtPmNvZWZmc19jdXJyZW50ID0gMDsKKworCXNuZF9ubTI1Nl9pbml0X2NoaXAoY2hpcCk7CisKKwkvLyBwY2lfc2V0X21hc3RlcihwY2kpOyAvKiBuZWVkZWQ/ICovCisJCisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIG5tMjU2X3N1c3BlbmQsIG5tMjU2X3Jlc3VtZSwgY2hpcCk7CisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJKmNoaXBfcmV0ID0gY2hpcDsKKwlyZXR1cm4gMDsKKworX19lcnJvcjoKKwlzbmRfbm0yNTZfZnJlZShjaGlwKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0cnVjdCBubTI1Nl9xdWlyayB7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yOworCXVuc2lnbmVkIHNob3J0IGRldmljZTsKKwlpbnQgdHlwZTsKK307CisKK2VudW0geyBOTV9CTEFDS0xJU1RFRCwgTk1fUkVTRVRfV09SS0FST1VORCB9OworCitzdGF0aWMgc3RydWN0IG5tMjU2X3F1aXJrIG5tMjU2X3F1aXJrc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogSFAgb21uaWJvb2sgNDE1MCBoYXMgY3M0MjMyIGNvZGVjIGludGVybmFsbHkgKi8KKwl7IC52ZW5kb3IgPSAweDEwM2MsIC5kZXZpY2UgPSAweDAwMDcsIC50eXBlID0gTk1fQkxBQ0tMSVNURUQgfSwKKwkvKiBTb255IFBDRy1GMzA1ICovCisJeyAudmVuZG9yID0gMHgxMDRkLCAuZGV2aWNlID0gMHg4MDQxLCAudHlwZSA9IE5NX1JFU0VUX1dPUktBUk9VTkQgfSwKKwkvKiBEZWxsIExhdGl0dWRlIExTICovCisJeyAudmVuZG9yID0gMHgxMDI4LCAuZGV2aWNlID0gMHgwMDgwLCAudHlwZSA9IE5NX1JFU0VUX1dPUktBUk9VTkQgfSwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfbm0yNTZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlubTI1Nl90ICpjaGlwOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IHhidWZmZXJfdG9wOworCXN0cnVjdCBubTI1Nl9xdWlyayAqcTsKKwl1MTYgc3Vic3lzdGVtX3ZlbmRvciwgc3Vic3lzdGVtX2RldmljZTsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN0ZW1fdmVuZG9yKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXN0ZW1fZGV2aWNlKTsKKworCWZvciAocSA9IG5tMjU2X3F1aXJrczsgcS0+dmVuZG9yOyBxKyspIHsKKwkJaWYgKHEtPnZlbmRvciA9PSBzdWJzeXN0ZW1fdmVuZG9yICYmIHEtPmRldmljZSA9PSBzdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQlzd2l0Y2ggKHEtPnR5cGUpIHsKKwkJCWNhc2UgTk1fQkxBQ0tMSVNURUQ6CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAibm0yNTY6IFRoZSBkZXZpY2UgaXMgYmxhY2tsaXN0ZWQuICBMb2FkaW5nIHN0b3BwZWRcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJY2FzZSBOTV9SRVNFVF9XT1JLQVJPVU5EOgorCQkJCXJlc2V0X3dvcmthcm91bmRbZGV2XSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAocGNpLT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTzoKKwkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk5NMjU2QVYiKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU86CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJOTTI1NlpYIik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU86CisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJOTTI1NlhMKyIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRrKCJpbnZhbGlkIGRldmljZSBpZCAweCV4XG4iLCBwY2ktPmRldmljZSk7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YWlvX2hhY2tbZGV2XSkKKwkJeGJ1ZmZlcl90b3AgPSAweDI1YTgwMDsJLyogdGhpcyBhdm9pZHMgY29uZmxpY3RzIHdpdGggWEZyZWU4NiBzZXJ2ZXIgKi8KKwllbHNlCisJCXhidWZmZXJfdG9wID0gYnVmZmVyX3RvcFtkZXZdOworCisJaWYgKHBsYXliYWNrX2J1ZnNpemVbZGV2XSA8IDQpCisJCXBsYXliYWNrX2J1ZnNpemVbZGV2XSA9IDQ7CisJaWYgKHBsYXliYWNrX2J1ZnNpemVbZGV2XSA+IDEyOCkKKwkJcGxheWJhY2tfYnVmc2l6ZVtkZXZdID0gMTI4OworCWlmIChjYXB0dXJlX2J1ZnNpemVbZGV2XSA8IDQpCisJCWNhcHR1cmVfYnVmc2l6ZVtkZXZdID0gNDsKKwlpZiAoY2FwdHVyZV9idWZzaXplW2Rldl0gPiAxMjgpCisJCWNhcHR1cmVfYnVmc2l6ZVtkZXZdID0gMTI4OworCWlmICgoZXJyID0gc25kX25tMjU2X2NyZWF0ZShjYXJkLCBwY2ksCisJCQkJICAgIHBsYXliYWNrX2J1ZnNpemVbZGV2XSAqIDEwMjQsIC8qIGluIGJ5dGVzICovCisJCQkJICAgIGNhcHR1cmVfYnVmc2l6ZVtkZXZdICogMTAyNCwgIC8qIGluIGJ5dGVzICovCisJCQkJICAgIGZvcmNlX2FjOTdbZGV2XSwKKwkJCQkgICAgeGJ1ZmZlcl90b3AsCisJCQkJICAgIHVzZV9jYWNoZVtkZXZdLAorCQkJCSAgICAmY2hpcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChyZXNldF93b3JrYXJvdW5kW2Rldl0pIHsKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJubTI1NjogcmVzZXRfd29ya2Fyb3VuZCBhY3RpdmF0ZWRcbiIpOworCQljaGlwLT5yZXNldF93b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9ubTI1Nl9wY20oY2hpcCwgMCkpIDwgMCB8fAorCSAgICAoZXJyID0gc25kX25tMjU2X21peGVyKGNoaXApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIk5lb01hZ2ljICVzIiwgY2FyZC0+ZHJpdmVyKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVkIiwKKwkJY2FyZC0+c2hvcnRuYW1lLAorCQljaGlwLT5idWZmZXJfYWRkciwgY2hpcC0+Y3BvcnRfYWRkciwgY2hpcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX25tMjU2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiTmVvTWFnaWMgMjU2IiwKKwkuaWRfdGFibGUgPSBzbmRfbm0yNTZfaWRzLAorCS5wcm9iZSA9IHNuZF9ubTI1Nl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX25tMjU2X3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX25tMjU2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX25tMjU2X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9ubTI1Nl9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX25tMjU2X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTZfY29lZi5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2X2NvZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdkNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2X2NvZWYuYwpAQCAtMCwwICsxLDQ2MDcgQEAKKyNkZWZpbmUgTk1fVE9UQUxfQ09FRkZfQ09VTlQgMHgzMTU4CisKK3N0YXRpYyBjaGFyIGNvZWZmaWNpZW50c1tOTV9UT1RBTF9DT0VGRl9DT1VOVCAqIDRdID0geyAKKwkweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE1LCAweDAxLCAweEVGLCAweEZDLCAweDIxLAorCTB4MDUsIDB4ODcsIDB4RjcsIDB4NjIsIDB4MTEsIDB4RTksIDB4NDUsIDB4NUUsIDB4RjksIDB4QjUsIDB4MDEsCisJMHhERSwgMHhGRiwgMHhBNCwgMHhGRiwgMHg2MCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ2LCAweDA2LAorCTB4NEMsIDB4RjMsIDB4RUQsIDB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsIDB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsCisJMHhGRCwgMHhFMSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLAorCTB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsCisJMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwKKwkweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLCAweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLAorCTB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsIDB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQSwgMHhGRiwKKwkweDYwLCAweDAwLCAweEE0LCAweEZGLCAweERFLCAweEZGLCAweEI1LCAweDAxLCAweDVFLCAweEY5LCAweEU5LAorCTB4NDUsIDB4NjIsIDB4MTEsIDB4ODcsIDB4RjcsIDB4MjEsIDB4MDUsIDB4RUYsIDB4RkMsIDB4QTUsIDB4MDEsCisJMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwKKwkweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLAorCTB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsCisJMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKKwkweENBLCAweDAxLCAweDk1LCAweEZDLCAweEVBLCAweDA1LCAweEJCLCAweEY1LCAweDI1LCAweDE3LCAweDNDLAorCTB4NDMsIDB4OEQsIDB4RjYsIDB4NDMsIDB4MDMsIDB4RjUsIDB4RkUsIDB4MjYsIDB4MDAsIDB4MjAsIDB4MDAsCisJMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0RCwgMHhGRiwgMHhDNSwKKwkweDAxLCAweDRDLCAweEZDLCAweDI2LCAweDA3LCAweEEzLCAweEYxLCAweEFCLCAweDJDLCAweEJCLCAweDMzLAorCTB4OEYsIDB4RjEsIDB4Q0EsIDB4MDYsIDB4QTYsIDB4RkMsIDB4ODUsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENSwgMHhGRiwgMHhCQywgMHgwMCwKKwkweEYwLCAweEZELCAweEVDLCAweDA0LCAweEQ5LCAweEYzLCAweEIxLCAweDNFLCAweENELCAweDFFLCAweEMxLAorCTB4RjMsIDB4QUYsIDB4MDYsIDB4NDksIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwgMHhFOSwgMHhGRSwgMHgzOCwKKwkweDAxLCAweDRCLCAweEZGLCAweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LCAweDBBLCAweDJFLCAweEZBLAorCTB4REYsIDB4MDMsIDB4OEEsIDB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHg5OCwgMHgwMSwgMHgwRCwgMHhGRCwKKwkweEUwLCAweDA0LCAweDE0LCAweEY4LCAweEMzLCAweDBGLCAweDg5LCAweDQ2LCAweDRDLCAweEZBLCAweDM4LAorCTB4MDEsIDB4MjUsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NzMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgwRiwKKwkweDA3LCAweDg0LCAweEYyLCAweDI5LCAweDI1LCAweDFBLCAweDNBLCAweDY3LCAweEYyLCAweEY2LCAweDA1LAorCTB4NDEsIDB4RkQsIDB4MjQsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgxNSwgMHgwMCwgMHg5NywgMHhGRiwgMHgzNywgMHgwMSwgMHgyMiwgMHhGRCwgMHgyMywgMHgwNiwKKwkweDJGLCAweEYyLCAweDExLCAweDM5LCAweDdCLCAweDI2LCAweDUwLCAweEYyLCAweDFCLCAweDA3LCAweDMyLAorCTB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhDOCwgMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywKKwkweEY5LCAweDEwLCAweDQ2LCAweDAzLCAweDExLCAweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLAorCTB4QTIsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsCisJMHgwMCwgMHg2QSwgMHhGRiwgMHg1MywgMHgwMSwgMHhBNiwgMHhGRCwgMHhBNiwgMHgwMywgMHhBMSwgMHhGQSwKKwkweERFLCAweDA4LCAweDc2LCAweDQ4LCAweDBDLCAweEZGLCAweERFLCAweEZFLCAweDczLCAweDAxLCAweEM5LAorCTB4RkUsIDB4Q0EsIDB4MDAsIDB4QTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MiwgMHhGQywgMHg5MywgMHgwNiwgMHgxMCwgMHhGNCwgMHg3OCwKKwkweDFELCAweDkwLCAweDNGLCAweDNFLCAweEY0LCAweEFBLCAweDA0LCAweDE5LCAweEZFLCAweEE0LCAweDAwLAorCTB4RTIsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjgsCisJMHhGRiwgMHg5MywgMHgwMSwgMHg5MiwgMHhGQywgMHhFMiwgMHgwNiwgMHg4MywgMHhGMSwgMHg4QywgMHgzMiwKKwkweEVELCAweDJELCAweDkwLCAweEYxLCAweDFFLCAweDA3LCAweDU3LCAweEZDLCAweEJELCAweDAxLCAweDUxLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsIDB4MDAsCisJMHg0MiwgMHgwMCwgMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwgMHg3NiwKKwkweDE4LCAweDVDLCAweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4NTMsCisJMHhGRSwgMHg1MywgMHgwMiwgMHgzOSwgMHhGRCwgMHhBOSwgMHgwMiwgMHhGMiwgMHg0OCwgMHhCOSwgMHgwNCwKKwkweDU0LCAweEZDLCAweENBLCAweDAyLCAweDE2LCAweEZFLCAweDIwLCAweDAxLCAweDdGLCAweEZGLCAweDIwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzMsIDB4MDEsCisJMHhBNywgMHhGQywgMHhDMCwgMHgwNSwgMHgxRSwgMHhGNiwgMHhEOCwgMHgxNSwgMHhFNywgMHg0MywgMHgyMCwKKwkweEY3LCAweEVGLCAweDAyLCAweDI3LCAweEZGLCAweDBBLCAweDAwLCAweDJFLCAweDAwLCAweERELCAweEZGLAorCTB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0QsIDB4MDEsIDB4NDMsCisJMHhGQywgMHgyQSwgMHgwNywgMHhCQywgMHhGMSwgMHg2NCwgMHgyQiwgMHhFMywgMHgzNCwgMHhBMywgMHhGMSwKKwkweEFFLCAweDA2LCAweEJELCAweEZDLCAweDc3LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QzgsIDB4RkQsCisJMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwgMHg3NiwgMHhGMywgMHhDOCwKKwkweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUMsIDB4MDAsIDB4MDgsIDB4RkYsIDB4RkQsIDB4MDAsIDB4QjUsCisJMHhGRiwgMHg0QiwgMHhGRCwgMHhGNCwgMHg0NywgMHgzMCwgMHgwQiwgMHhCQywgMHhGOSwgMHgxNywgMHgwNCwKKwkweDZFLCAweEZELCAweDZELCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsIDB4OEQsIDB4MDEsIDB4MjYsIDB4RkQsIDB4QUQsIDB4MDQsCisJMHg4MiwgMHhGOCwgMHg4NywgMHgwRSwgMHhGOSwgMHg0NiwgMHgwQywgMHhGQiwgMHhENCwgMHgwMCwgMHg1RCwKKwkweDAwLCAweDVFLCAweEZGLCAweDgyLCAweDAwLCAweEJELCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MDEsIDB4MDcsIDB4QkUsCisJMHhGMiwgMHhENiwgMHgyMywgMHgxRiwgMHgzQiwgMHhBNSwgMHhGMiwgMHhDNSwgMHgwNSwgMHg2MiwgMHhGRCwKKwkweDEwLCAweDAxLCAweEFCLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LAorCTB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsIDB4RkQsIDB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsCisJMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwgMHgyMywgMHgwNywgMHgzNCwgMHhGQywgMHhERCwKKwkweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweENFLCAweEZGLAorCTB4NTYsIDB4MDAsIDB4QjksIDB4RkYsIDB4QjgsIDB4RkYsIDB4RjcsIDB4MDEsIDB4RTIsIDB4RjgsIDB4OEQsCisJMHg0NSwgMHg0NiwgMHgxMiwgMHgzQywgMHhGNywgMHg0MywgMHgwNSwgMHhERiwgMHhGQywgMHhBQywgMHgwMSwKKwkweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLAorCTB4RkYsIDB4NDYsIDB4MDEsIDB4QzMsIDB4RkQsIDB4NkQsIDB4MDMsIDB4MTQsIDB4RkIsIDB4QkUsIDB4MDcsCisJMHhBNiwgMHg0OCwgMHhGOCwgMHhGRiwgMHg3MCwgMHhGRSwgMHhBRSwgMHgwMSwgMHhBQSwgMHhGRSwgMHhEOSwKKwkweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4REUsIDB4MDEsIDB4NUQsIDB4RkMsIDB4NzQsIDB4MDYsIDB4NjMsIDB4RjQsIDB4MjMsIDB4MUMsIDB4NjYsCisJMHg0MCwgMHhBQSwgMHhGNCwgMHg2NSwgMHgwNCwgMHg0NCwgMHhGRSwgMHg4QiwgMHgwMCwgMHhFRSwgMHhGRiwKKwkweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLAorCTB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsIDB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsCisJMHg4MywgMHhGMSwgMHgxMywgMHgwNywgMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywKKwkweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVELCAweEZGLCAweDA1LCAweDAwLCAweDVELCAweDAwLAorCTB4OTUsIDB4RkUsIDB4RTIsIDB4MDMsIDB4N0YsIDB4RjUsIDB4Q0MsIDB4NDEsIDB4QzcsIDB4MTksIDB4RkYsCisJMHhGNCwgMHgzNywgMHgwNiwgMHg3NSwgMHhGQywgMHhENiwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkwLCAweEZGLCAweEY0LCAweDAwLCAweDcyLCAweEZFLCAweDE4LAorCTB4MDIsIDB4QUEsIDB4RkQsIDB4QUIsIDB4MDEsIDB4REYsIDB4NDgsIDB4Q0EsIDB4MDUsIDB4RTEsIDB4RkIsCisJMHgwNSwgMHgwMywgMHhGNywgMHhGRCwgMHgyRSwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJCLCAweDAxLCAweEJBLCAweEZDLAorCTB4OTUsIDB4MDUsIDB4ODMsIDB4RjYsIDB4OEMsIDB4MTQsIDB4ODcsIDB4NDQsIDB4QkIsIDB4RjcsIDB4OTgsCisJMHgwMiwgMHg1QSwgMHhGRiwgMHhFRSwgMHhGRiwgMHgzQywgMHgwMCwgMHhEOCwgMHhGRiwgMHgwQSwgMHgwMCwKKwkweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLAorCTB4MDcsIDB4REMsIDB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsCisJMHhENSwgMHhGQywgMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwKKwkweDAwLCAweDA3LCAweDAwLCAweEJFLCAweEZGLCAweEVBLCAweDAwLCAweEEyLCAweEZELCAweDY1LCAweDA1LAorCTB4MjgsIDB4RjMsIDB4REIsIDB4M0MsIDB4NzgsIDB4MjEsIDB4MzAsIDB4RjMsIDB4REYsIDB4MDYsIDB4M0EsCisJMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEIyLCAweEZGLCAweDlELCAweDAwLCAweDI3LCAweEZGLCAweEMzLCAweDAwLCAweDFGLCAweDAwLCAweDc2LAorCTB4RkMsIDB4QTMsIDB4NDcsIDB4NjAsIDB4MEMsIDB4NEEsIDB4RjksIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkQsCisJMHg3OSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKKwkweDAwLCAweDU4LCAweEZGLCAweDgyLCAweDAxLCAweDNGLCAweEZELCAweDc4LCAweDA0LCAweEYyLCAweEY4LAorCTB4NTAsIDB4MEQsIDB4NUUsIDB4NDcsIDB4RDUsIDB4RkIsIDB4NkYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NDAsCisJMHhGRiwgMHg5MSwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLCAweEYyLCAweDgxLAorCTB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsIDB4RkIsIDB4MDAsCisJMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NSwKKwkweEZGLCAweDVCLCAweDAxLCAweEU5LCAweEZDLCAweDczLCAweDA2LCAweEQ4LCAweEYxLCAweEU1LCAweDM2LAorCTB4MTksIDB4MjksIDB4RjgsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsIDB4MDEsIDB4NDIsCisJMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywgMHgwMCwKKwkweEQ3LCAweEZGLCAweDgyLCAweEZGLCAweDUzLCAweDAyLCAweDM5LCAweEY4LCAweEZELCAweDQ0LCAweDhELAorCTB4MTMsIDB4RDMsIDB4RjYsIDB4NzIsIDB4MDUsIDB4Q0EsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NDUsIDB4RkYsCisJMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3NSwgMHhGRiwgMHgzOSwKKwkweDAxLCAweEUwLCAweEZELCAweDMzLCAweDAzLCAweDg3LCAweEZCLCAweEEyLCAweDA2LCAweENCLCAweDQ4LAorCTB4RUEsIDB4MDAsIDB4MDEsIDB4RkUsIDB4RTksIDB4MDEsIDB4OEEsIDB4RkUsIDB4RTgsIDB4MDAsIDB4OTUsCisJMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQSwgMHgwMSwKKwkweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LCAweENFLCAweDFBLCAweDMyLCAweDQxLCAweDFGLAorCTB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjAsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QiwgMHhGRiwgMHhBQiwgMHgwMSwgMHg2RiwKKwkweEZDLCAweDA4LCAweDA3LCAweDdFLCAweEYxLCAweDIxLCAweDMwLCAweDY3LCAweDMwLCAweDdELCAweEYxLAorCTB4MDUsIDB4MDcsIDB4NzMsIDB4RkMsIDB4QTgsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywgMHgwMCwgMHg2NywgMHhGRSwKKwkweDJELCAweDA0LCAweDA0LCAweEY1LCAweDA3LCAweDQxLCAweDFCLCAweDFCLCAweEE2LCAweEY0LCAweDVBLAorCTB4MDYsIDB4NjcsIDB4RkMsIDB4REIsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFNSwgMHgwMCwgMHg5MSwgMHhGRSwgMHhEQywgMHgwMSwgMHgxQSwKKwkweEZFLCAweEIzLCAweDAwLCAweEMzLCAweDQ4LCAweEUxLCAweDA2LCAweDZFLCAweEZCLCAweDQwLCAweDAzLAorCTB4REEsIDB4RkQsIDB4M0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwgMHhDRiwgMHhGQywgMHg2NywgMHgwNSwKKwkweEVBLCAweEY2LCAweDQ0LCAweDEzLCAweDFFLCAweDQ1LCAweDVFLCAweEY4LCAweDNGLCAweDAyLCAweDhFLAorCTB4RkYsIDB4RDAsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOSwgMHgwMSwgMHgzNiwgMHhGQywgMHgyOCwgMHgwNywgMHgwMSwKKwkweEYyLCAweENFLCAweDI4LCAweDIzLCAweDM3LCAweEUwLCAweEYxLCAweDZCLCAweDA2LCAweEVGLCAweEZDLAorCTB4NTcsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEIsCisJMHgwMCwgMHhCNCwgMHhGRiwgMHgwMCwgMHgwMSwgMHg3RSwgMHhGRCwgMHg5QywgMHgwNSwgMHhEQywgMHhGMiwKKwkweEU0LCAweDNCLCAweENELCAweDIyLCAweEVFLCAweEYyLCAweEYzLCAweDA2LCAweDM1LCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RkYsCisJMHg4RSwgMHgwMCwgMHg0NiwgMHhGRiwgMHg4QSwgMHgwMCwgMHg4NiwgMHgwMCwgMHhBNywgMHhGQiwgMHg0OCwKKwkweDQ3LCAweDk1LCAweDBELCAweEQ5LCAweEY4LCAweDg0LCAweDA0LCAweDM5LCAweEZELCAweDg1LCAweDAxLAorCTB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsCisJMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwgMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywKKwkweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LCAweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLAorCTB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCisJMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywgMHhEQSwgMHgwNiwgMHgzRiwgMHhGMywgMHgyQywgMHgyMSwgMHgxMSwKKwkweDNELCAweDNBLCAweEYzLCAweDU4LCAweDA1LCAweEFBLCAweEZELCAweEU1LCAweDAwLCAweEMxLCAweEZGLAorCTB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NkIsCisJMHgwMSwgMHhDRiwgMHhGQywgMHg5NiwgMHgwNiwgMHhCNywgMHhGMSwgMHhDNiwgMHgzNSwgMHg2NCwgMHgyQSwKKwkweEQ0LCAweEYxLCAweDJCLCAweDA3LCAweDNELCAweEZDLCAweEQyLCAweDAxLCAweDQ1LCAweEZGLCAweDMyLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzksIDB4MDAsIDB4RjQsIDB4RkYsCisJMHg0RSwgMHhGRiwgMHhBQywgMHgwMiwgMHg5OCwgMHhGNywgMHg2NSwgMHg0NCwgMHhENiwgMHgxNCwgMHg2QywKKwkweEY2LCAweDlGLCAweDA1LCAweEI2LCAweEZDLCAweEJELCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RkUsCisJMHhGRCwgMHhGOCwgMHgwMiwgMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwgMHg0OCwgMHhFMywgMHgwMSwKKwkweDkxLCAweEZELCAweDI1LCAweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLCAweDhGLCAweEZGLCAweDFDLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDUsIDB4MDEsIDB4NzgsIDB4RkMsCisJMHgyRiwgMHgwNiwgMHgxMywgMHhGNSwgMHg3QywgMHgxOSwgMHhGNywgMHg0MSwgMHg5QiwgMHhGNSwgMHhEMSwKKwkweDAzLCAweDlGLCAweEZFLCAweDU3LCAweDAwLCAweDA4LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NjEsIDB4RkMsIDB4MTYsCisJMHgwNywgMHg4NSwgMHhGMSwgMHhFNiwgMHgyRSwgMHg5RSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGMywgMHgwNiwKKwkweDg0LCAweEZDLCAweDlELCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDA0LAorCTB4MDAsIDB4RjYsIDB4RkYsIDB4RUIsIDB4RkYsIDB4OTEsIDB4MDAsIDB4M0IsIDB4RkUsIDB4NzUsIDB4MDQsCisJMHg5MiwgMHhGNCwgMHgzNiwgMHg0MCwgMHg2RSwgMHgxQywgMHg1MCwgMHhGNCwgMHg3QiwgMHgwNiwgMHg1QiwKKwkweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLAorCTB4OUMsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsIDB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsCisJMHhGRiwgMHg5QywgMHg0OCwgMHhGRCwgMHgwNywgMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwKKwkweDQ5LCAweDAxLCAweDZFLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAorCTB4MDAsIDB4NDksIDB4RkYsIDB4QUEsIDB4MDEsIDB4RTQsIDB4RkMsIDB4MzgsIDB4MDUsIDB4NTQsIDB4RjcsCisJMHhGRSwgMHgxMSwgMHhBQSwgMHg0NSwgMHgwOSwgMHhGOSwgMHhFMiwgMHgwMSwgMHhDNCwgMHhGRiwgMHhCMywKKwkweEZGLCAweDU5LCAweDAwLCAweENELCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjIsIDB4MDcsIDB4MkIsIDB4RjIsIDB4ODAsCisJMHgyNywgMHgzQiwgMHgzOCwgMHgwQSwgMHhGMiwgMHg0NCwgMHgwNiwgMHgwQiwgMHhGRCwgMHg0NSwgMHgwMSwKKwkweDkwLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE5LAorCTB4RkYsIDB4MTUsIDB4MDEsIDB4NUIsIDB4RkQsIDB4RDAsIDB4MDUsIDB4OTcsIDB4RjIsIDB4RTYsIDB4M0EsCisJMHgyMSwgMHgyNCwgMHhCMSwgMHhGMiwgMHgwNCwgMHgwNywgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLCAweDAwLAorCTB4NjUsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsIDB4Q0QsCisJMHgwRSwgMHg2QSwgMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRiwKKwkweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDZBLAorCTB4MDEsIDB4NzQsIDB4RkQsIDB4MEEsIDB4MDQsIDB4RDUsIDB4RjksIDB4RUQsIDB4MEEsIDB4MDMsIDB4NDgsCisJMHg3QywgMHhGRCwgMHg5RSwgMHhGRiwgMHgwQSwgMHgwMSwgMHgwMSwgMHhGRiwgMHhBRiwgMHgwMCwgMHhBQiwKKwkweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLAorCTB4NDIsIDB4RkMsIDB4QzMsIDB4MDYsIDB4ODcsIDB4RjMsIDB4RDcsIDB4MUYsIDB4RkUsIDB4M0QsIDB4OTEsCisJMHhGMywgMHgxRCwgMHgwNSwgMHhEMSwgMHhGRCwgMHhDRSwgMHgwMCwgMHhDQywgMHhGRiwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc1LCAweEZGLCAweDdBLCAweDAxLCAweEI4LAorCTB4RkMsIDB4QjQsIDB4MDYsIDB4OUUsIDB4RjEsIDB4QTIsIDB4MzQsIDB4QUQsIDB4MkIsIDB4QjYsIDB4RjEsCisJMHgyOSwgMHgwNywgMHg0NSwgMHhGQywgMHhDQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLCAweDAwLCAweDFCLCAweEZGLAorCTB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsIDB4MDcsIDB4RjYsIDB4Q0EsCisJMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDgwLCAweEZGLCAweDFDLCAweDAxLCAweDFDLCAweEZFLCAweEJELAorCTB4MDIsIDB4NkUsIDB4RkMsIDB4N0QsIDB4MDQsIDB4RjMsIDB4NDgsIDB4RTIsIDB4MDIsIDB4MUYsIDB4RkQsCisJMHg2MCwgMHgwMiwgMHg0QywgMHhGRSwgMHgwNiwgMHgwMSwgMHg4OSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENGLCAweDAxLCAweDg4LCAweEZDLCAweDA5LCAweDA2LAorCTB4NzEsIDB4RjUsIDB4MkIsIDB4MTgsIDB4QjIsIDB4NDIsIDB4MjAsIDB4RjYsIDB4ODMsIDB4MDMsIDB4Q0YsCisJMHhGRSwgMHgzQywgMHgwMCwgMHgxNSwgMHgwMCwgMHhFNiwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEJGLCAweDAxLCAweDU0LCAweEZDLCAweDIwLCAweDA3LCAweDk0LAorCTB4RjEsIDB4QTYsIDB4MkQsIDB4RDAsIDB4MzIsIDB4ODUsIDB4RjEsIDB4REQsIDB4MDYsIDB4OTYsIDB4RkMsCisJMHg5MCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwKKwkweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLCAweEZFLCAweEI5LCAweDA0LCAweDI3LCAweEY0LAorCTB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsIDB4OTksIDB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMiwgMHhGRiwKKwkweEM3LCAweDAwLCAweEQwLCAweEZFLCAweDY1LCAweDAxLCAweEY2LCAweEZFLCAweEQ5LCAweEZFLCAweDZBLAorCTB4NDgsIDB4MUYsIDB4MDksIDB4ODcsIDB4RkEsIDB4QjMsIDB4MDMsIDB4QTAsIDB4RkQsIDB4NTYsIDB4MDEsCisJMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RCwKKwkweEZGLCAweEEwLCAweDAxLCAweEZCLCAweEZDLCAweDA3LCAweDA1LCAweEJGLCAweEY3LCAweEJCLCAweDEwLAorCTB4MkIsIDB4NDYsIDB4QkIsIDB4RjksIDB4ODMsIDB4MDEsIDB4RkEsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NjgsCisJMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwKKwkweEUxLCAweDAxLCAweDMxLCAweEZDLCAweDE5LCAweDA3LCAweDVCLCAweEYyLCAweDMwLCAweDI2LCAweDRCLAorCTB4MzksIDB4M0IsIDB4RjIsIDB4MUEsIDB4MDYsIDB4MjksIDB4RkQsIDB4MzMsIDB4MDEsIDB4OTksIDB4RkYsCisJMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwKKwkweDAxLCAweDNBLCAweEZELCAweDAwLCAweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LAorCTB4NzksIDB4RjIsIDB4MTIsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDNCwgMHhGRiwgMHg3MCwgMHgwMCwgMHg4NCwgMHhGRiwKKwkweDE5LCAweDAwLCAweDRELCAweDAxLCAweDIyLCAweEZBLCAweDcwLCAweDQ2LCAweDBBLCAweDEwLCAweEZDLAorCTB4RjcsIDB4RUIsIDB4MDQsIDB4MDgsIDB4RkQsIDB4OUEsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkUsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg5MCwKKwkweEZELCAweEQyLCAweDAzLCAweDQ3LCAweEZBLCAweEMzLCAweDA5LCAweDQ4LCAweDQ4LCAweDVBLCAweEZFLAorCTB4MzMsIDB4RkYsIDB4NDUsIDB4MDEsIDB4RTIsIDB4RkUsIDB4QkUsIDB4MDAsIDB4QTUsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QiwgMHhGQywKKwkweEE5LCAweDA2LCAweEQyLCAweEYzLCAweDgxLCAweDFFLCAweEU0LCAweDNFLCAweEVGLCAweEYzLCAweERFLAorCTB4MDQsIDB4RjksIDB4RkQsIDB4QjcsIDB4MDAsIDB4RDgsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwKKwkweDA2LCAweDhDLCAweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LAorCTB4NEUsIDB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCisJMHgwMCwgMHhFNCwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyRCwgMHgwMCwgMHhFQSwgMHhGRSwgMHg1NiwgMHgwMywKKwkweDZELCAweEY2LCAweDE3LCAweDQzLCAweDcwLCAweDE3LCAweEE2LCAweEY1LCAweEYzLCAweDA1LCAweDkxLAorCTB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHg4NiwgMHhGRiwgMHgwRSwgMHgwMSwgMHgzQiwgMHhGRSwgMHg4MiwgMHgwMiwgMHhFMCwgMHhGQywgMHg3MywKKwkweDAzLCAweEY2LCAweDQ4LCAweEU5LCAweDAzLCAweEFELCAweEZDLCAweDlDLCAweDAyLCAweDJELCAweEZFLAorCTB4MTQsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5OSwgMHhGQywgMHhFMSwgMHgwNSwgMHhEMSwgMHhGNSwKKwkweERDLCAweDE2LCAweDY1LCAweDQzLCAweEFELCAweEY2LCAweDMxLCAweDAzLCAweDAwLCAweEZGLCAweDIwLAorCTB4MDAsIDB4MjMsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsCisJMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwgMHhGMSwgMHg2MiwKKwkweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLCAweDgyLCAweDAxLAorCTB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RDMsCisJMHhGRiwgMHhDMSwgMHgwMCwgMHhFNywgMHhGRCwgMHhGQSwgMHgwNCwgMHhDNCwgMHhGMywgMHg3RSwgMHgzRSwKKwkweDE5LCAweDFGLCAweEIwLCAweEYzLCAweEI1LCAweDA2LCAweDQ3LCAweEZDLCAweEU0LCAweDAxLCAweDM2LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjgsIDB4MDAsCisJMHhGMCwgMHhGRSwgMHgyQiwgMHgwMSwgMHg2MywgMHhGRiwgMHhGNiwgMHhGRCwgMHgyQywgMHg0OCwgMHg0NywKKwkweDBBLCAweDE0LCAweEZBLCAweEVCLCAweDAzLCAweDg0LCAweEZELCAweDYzLCAweDAxLCAweDY0LCAweEZGLAorCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTYsCisJMHgwMSwgMHgxMywgMHhGRCwgMHhENSwgMHgwNCwgMHgyQywgMHhGOCwgMHg3RCwgMHgwRiwgMHhBMywgMHg0NiwKKwkweDc2LCAweEZBLCAweDIyLCAweDAxLCAweDMyLCAweDAwLCAweDc2LCAweEZGLCAweDc2LCAweDAwLCAweEMxLAorCTB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTQsIDB4MDEsCisJMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwgMHhERCwgMHgyNCwgMHg1NCwgMHgzQSwgMHg3NCwKKwkweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLCAweDAxLCAweEEzLCAweEZGLCAweDExLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTUsIDB4RkYsIDB4M0IsIDB4MDEsIDB4MUIsCisJMHhGRCwgMHgyRCwgMHgwNiwgMHgyNCwgMHhGMiwgMHhEMywgMHgzOCwgMHhDNiwgMHgyNiwgMHg0NSwgMHhGMiwKKwkweDFELCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELAorCTB4RkYsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjEsIDB4MDAsIDB4QTIsIDB4RkYsIDB4RTIsIDB4RkYsCisJMHhBRSwgMHgwMSwgMHg2QiwgMHhGOSwgMHhGMiwgMHg0NSwgMHg0QSwgMHgxMSwgMHg4RiwgMHhGNywgMHgxRCwKKwkweDA1LCAweEYxLCAweEZDLCAweEE0LCAweDAxLCAweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NTEsIDB4MDEsIDB4QUMsIDB4RkQsIDB4OUEsCisJMHgwMywgMHhCQSwgMHhGQSwgMHg5RSwgMHgwOCwgMHg4MSwgMHg0OCwgMHg0MCwgMHhGRiwgMHhDNiwgMHhGRSwKKwkweDgwLCAweDAxLCAweEMyLCAweEZFLCAweENFLCAweDAwLCAweDlGLCAweEZGLCAweDE3LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsCisJMHgyMiwgMHhGNCwgMHgyQywgMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwgMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywKKwkweEZFLCAweDlGLCAweDAwLCAweEU0LCAweEZGLCAweEY5LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLAorCTB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTYsIDB4MDEsIDB4OEUsIDB4RkMsIDB4RTcsIDB4MDYsIDB4ODEsCisJMHhGMSwgMHg0OCwgMHgzMiwgMHgzNCwgMHgyRSwgMHg4RCwgMHhGMSwgMHgxQywgMHgwNywgMHg1QSwgMHhGQywKKwkweEJCLCAweDAxLCAweDUzLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU5LAorCTB4RkYsIDB4MEYsIDB4MDAsIDB4NDgsIDB4MDAsIDB4QjksIDB4RkUsIDB4QTYsIDB4MDMsIDB4RTQsIDB4RjUsCisJMHg2MCwgMHg0MiwgMHhDMSwgMHgxOCwgMHg0NywgMHhGNSwgMHgxQSwgMHgwNiwgMHg4MSwgMHhGQywgMHhEMiwKKwkweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhCLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4NUEsIDB4RkUsIDB4NDYsIDB4MDIsIDB4NTIsIDB4RkQsIDB4NzAsIDB4MDIsIDB4RUQsCisJMHg0OCwgMHhGNSwgMHgwNCwgMHgzQiwgMHhGQywgMHhENywgMHgwMiwgMHgwRiwgMHhGRSwgMHgyMywgMHgwMSwKKwkweDdFLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAorCTB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsCisJMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywgMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwKKwkweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ3LCAweEZGLAorCTB4Q0UsIDB4MDEsIDB4NDEsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QzIsIDB4RjEsIDB4MUIsIDB4MkIsIDB4MjUsCisJMHgzNSwgMHhBOCwgMHhGMSwgMHhBNywgMHgwNiwgMHhDMiwgMHhGQywgMHg3NCwgMHgwMSwgMHg3OCwgMHhGRiwKKwkweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweEM3LCAweEZGLCAweEQ5LAorCTB4MDAsIDB4QkYsIDB4RkQsIDB4MzgsIDB4MDUsIDB4NjksIDB4RjMsIDB4OTYsIDB4M0QsIDB4NkYsIDB4MjAsCisJMHg2NiwgMHhGMywgMHhDRSwgMHgwNiwgMHgzRiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFFLCAweEZGLCAweEE5LCAweDAwLCAweDBGLCAweEZGLAorCTB4RjAsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MUIsIDB4RkQsIDB4RTQsIDB4NDcsIDB4NzMsIDB4MEIsIDB4QTIsCisJMHhGOSwgMHgyMywgMHgwNCwgMHg2OCwgMHhGRCwgMHg3MCwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLCAweDhCLCAweDAxLCAweDJCLAorCTB4RkQsIDB4QTEsIDB4MDQsIDB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsIDB4NDcsIDB4MzgsIDB4RkIsCisJMHhCRSwgMHgwMCwgMHg2QSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMCwKKwkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLAorCTB4RkQsIDB4MDYsIDB4Q0IsIDB4RjIsIDB4OEEsIDB4MjMsIDB4NTgsIDB4M0IsIDB4QjQsIDB4RjIsIDB4QkEsCisJMHgwNSwgMHg2QSwgMHhGRCwgMHgwQiwgMHgwMSwgMHhBRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhDLCAweEZGLCAweDRELCAweDAxLCAweEZFLCAweEZDLCAweDU2LAorCTB4MDYsIDB4RjcsIDB4RjEsIDB4QkYsIDB4MzcsIDB4MTUsIDB4MjgsIDB4MTgsIDB4RjIsIDB4MjUsIDB4MDcsCisJMHgzNCwgMHhGQywgMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywKKwkweDAwLCAweENGLCAweEZGLCAweDUyLCAweDAwLCAweEMwLCAweEZGLCAweEFDLCAweEZGLCAweDBDLCAweDAyLAorCTB4QkMsIDB4RjgsIDB4NkQsIDB4NDUsIDB4OEUsIDB4MTIsIDB4MjQsIDB4RjcsIDB4NEQsIDB4MDUsIDB4REIsCisJMHhGQywgMHhBRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQzLCAweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLAorCTB4RkIsIDB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsIDB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsCisJMHhBMywgMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM3LCAweEZGLCAweERELCAweDAxLCAweDYwLCAweEZDLCAweDZELCAweDA2LCAweDc2LCAweEY0LAorCTB4RDgsIDB4MUIsIDB4OTUsIDB4NDAsIDB4QzMsIDB4RjQsIDB4NTYsIDB4MDQsIDB4NEUsIDB4RkUsIDB4ODUsCisJMHgwMCwgMHhGMSwgMHhGRiwgMHhGNCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKKwkweDYwLCAweEZGLCAweEEyLCAweDAxLCAweDdDLCAweEZDLCAweEZCLCAweDA2LCAweDdDLCAweEYxLCAweDE1LAorCTB4MzEsIDB4NzMsIDB4MkYsIDB4ODEsIDB4RjEsIDB4MTAsIDB4MDcsIDB4NjcsIDB4RkMsIDB4QjEsIDB4MDEsCisJMHg1OCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMiwKKwkweDAwLCAweDYzLCAweDAwLCAweDhBLCAweEZFLCAweEYzLCAweDAzLCAweDYzLCAweEY1LCAweEExLCAweDQxLAorCTB4MTIsIDB4MUEsIDB4RUIsIDB4RjQsIDB4M0YsIDB4MDYsIDB4NzIsIDB4RkMsIDB4RDcsIDB4MDEsIDB4MzksCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwgMHgwMCwKKwkweDc5LCAweEZFLCAweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LCAweDA3LAorCTB4MDYsIDB4QzcsIDB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsIDB4RkYsCisJMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQSwKKwkweDAxLCAweEJGLCAweEZDLCAweDhCLCAweDA1LCAweDk5LCAweEY2LCAweDQzLCAweDE0LCAweEE5LCAweDQ0LAorCTB4REUsIDB4RjcsIDB4ODUsIDB4MDIsIDB4NjUsIDB4RkYsIDB4RTcsIDB4RkYsIDB4M0YsIDB4MDAsIDB4RDYsCisJMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhENSwgMHgwMSwKKwkweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEUzLCAweEYxLCAweEQxLCAweDI5LCAweDQ2LCAweDM2LCAweEM1LAorCTB4RjEsIDB4ODcsIDB4MDYsIDB4REEsIDB4RkMsIDB4NjQsIDB4MDEsIDB4ODAsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQywgMHhGRiwgMHhFRiwgMHgwMCwgMHg5QSwKKwkweEZELCAweDcyLCAweDA1LCAweDE2LCAweEYzLCAweEE1LCAweDNDLCAweEM0LCAweDIxLCAweDIxLCAweEYzLAorCTB4RTQsIDB4MDYsIDB4MzksIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwgMHhGRiwgMHhCNiwgMHgwMCwKKwkweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLCAweDMxLCAweEY5LCAweDVBLAorCTB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHg4MCwgMHgwMSwgMHg0NSwgMHhGRCwgMHg2QywKKwkweDA0LCAweDBCLCAweEY5LCAweDBCLCAweDBELCAweDczLCAweDQ3LCAweDAyLCAweEZDLCAweDU4LCAweDAwLAorCTB4QTMsIDB4MDAsIDB4MzksIDB4RkYsIDB4OTQsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNywgMHhGQywgMHhFQiwgMHgwNiwKKwkweDBCLCAweEYzLCAweDM1LCAweDIyLCAweDUyLCAweDNDLCAweEZELCAweEYyLCAweDg0LCAweDA1LCAweDhELAorCTB4RkQsIDB4RjYsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxRCwgMHgwMCwgMHg4MywgMHhGRiwgMHg1RSwgMHgwMSwgMHhFMywgMHhGQywgMHg3QiwgMHgwNiwgMHhEMCwKKwkweEYxLCAweEE1LCAweDM2LCAweDYyLCAweDI5LCAweEVGLCAweEYxLCAweDI5LCAweDA3LCAweDM5LCAweEZDLAorCTB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDUsCisJMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywgMHhGRiwgMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwKKwkweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LCAweDdDLCAweDA1LCAweEM1LCAweEZDLCAweEI3LAorCTB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsCisJMHg3NiwgMHhGRiwgMHgzNSwgMHgwMSwgMHhFNywgMHhGRCwgMHgyNiwgMHgwMywgMHhBMSwgMHhGQiwgMHg2NCwKKwkweDA2LCAweEQyLCAweDQ4LCAweDIxLCAweDAxLCAweEU4LCAweEZELCAweEY3LCAweDAxLCAweDgzLCAweEZFLAorCTB4RUMsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksCisJMHhGRiwgMHhEOSwgMHgwMSwgMHg2RCwgMHhGQywgMHg0QiwgMHgwNiwgMHhDRCwgMHhGNCwgMHg4MywgMHgxQSwKKwkweDVGLCAweDQxLCAweDNBLCAweEY1LCAweDBDLCAweDA0LCAweDdCLCAweEZFLCAweDZDLCAweDAwLCAweEZFLAorCTB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsCisJMHhBRCwgMHgwMSwgMHg2QywgMHhGQywgMHgwQywgMHgwNywgMHg3RiwgMHhGMSwgMHhEQywgMHgyRiwgMHhBRCwKKwkweDMwLCAweDdELCAweEYxLCAweDAxLCAweDA3LCAweDc2LCAweEZDLCAweEE2LCAweDAxLCAweDVFLCAweEZGLAorCTB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsCisJMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwgMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwKKwkweDkzLCAweEY0LCAweDYyLCAweDA2LCAweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTcsIDB4RkYsIDB4RTIsIDB4MDAsIDB4OTgsIDB4RkUsCisJMHhDRiwgMHgwMSwgMHgzMywgMHhGRSwgMHg3RCwgMHgwMCwgMHhCQiwgMHg0OCwgMHgxRiwgMHgwNywgMHg1NCwKKwkweEZCLCAweDRDLCAweDAzLCAweEQzLCAweEZELCAweDNGLCAweDAxLCAweDczLCAweEZGLCAweDIzLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjEsIDB4MDEsIDB4RDMsCisJMHhGQywgMHg1RCwgMHgwNSwgMHgwMSwgMHhGNywgMHhGQiwgMHgxMiwgMHgzRiwgMHg0NSwgMHg4MywgMHhGOCwKKwkweDJBLCAweDAyLCAweDlBLCAweEZGLCAweENBLCAweEZGLCAweDRFLCAweDAwLCAweEQxLCAweEZGLCAweDBDLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REEsIDB4MDEsIDB4MzUsIDB4RkMsCisJMHgyNywgMHgwNywgMHgwOSwgMHhGMiwgMHg4NSwgMHgyOCwgMHg2MywgMHgzNywgMHhFOSwgMHhGMSwgMHg2MywKKwkweDA2LCAweEY1LCAweEZDLCAweDUzLCAweDAxLCAweDg5LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsCisJMHgwNSwgMHhDQywgMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwKKwkweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLAorCTB4MDAsIDB4QjksIDB4RkYsIDB4OEEsIDB4MDAsIDB4NEQsIDB4RkYsIDB4N0QsIDB4MDAsIDB4OUMsIDB4MDAsCisJMHg3QiwgMHhGQiwgMHgzMSwgMHg0NywgMHhEOSwgMHgwRCwgMHhDMCwgMHhGOCwgMHg4RiwgMHgwNCwgMHgzNCwKKwkweEZELCAweDg3LCAweDAxLCAweDU2LCAweEZGLCAweDJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MjksIDB4MDAsIDB4NUUsIDB4RkYsIDB4NzQsIDB4MDEsIDB4NUYsIDB4RkQsIDB4MzUsIDB4MDQsIDB4N0MsCisJMHhGOSwgMHhEOCwgMHgwQiwgMHhDOSwgMHg0NywgMHhENCwgMHhGQywgMHhGMCwgMHhGRiwgMHhERCwgMHgwMCwKKwkweDE5LCAweEZGLCAweEE0LCAweDAwLCAweEFGLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDUsIDB4MDYsIDB4NEYsIDB4RjMsCisJMHhFMCwgMHgyMCwgMHg0NSwgMHgzRCwgMHg0RCwgMHhGMywgMHg0QiwgMHgwNSwgMHhCMywgMHhGRCwgMHhFMCwKKwkweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLAorCTB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsIDB4RjEsIDB4ODYsCisJMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywgMHhEMSwgMHgwMSwKKwkweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweERBLCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkEsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QkYsIDB4MDIsIDB4NzUsIDB4RjcsIDB4NDIsIDB4NDQsCisJMHgyMCwgMHgxNSwgMHg1NSwgMHhGNiwgMHhBOSwgMHgwNSwgMHhCMiwgMHhGQywgMHhCRiwgMHgwMSwgMHg0MSwKKwkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLCAweEZGLAorCTB4MjcsIDB4MDEsIDB4MDUsIDB4RkUsIDB4RUIsIDB4MDIsIDB4MTQsIDB4RkMsIDB4NTAsIDB4MDUsIDB4RUEsCisJMHg0OCwgMHgxQiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgzMiwgMHgwMiwgMHg2NCwgMHhGRSwgMHhGQSwgMHgwMCwKKwkweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ0LAorCTB4MDEsIDB4N0MsIDB4RkMsIDB4MjcsIDB4MDYsIDB4MjgsIDB4RjUsIDB4MzEsIDB4MTksIDB4MjEsIDB4NDIsCisJMHhCOCwgMHhGNSwgMHhDMCwgMHgwMywgMHhBQSwgMHhGRSwgMHg1MSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhFQSwKKwkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU0LCAweEZGLCAweEI3LCAweDAxLAorCTB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsIDB4OUYsIDB4MkUsIDB4RTMsIDB4MzEsIDB4N0UsCisJMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwgMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEU4LCAweEZGLCAweDk2LCAweDAwLCAweDMxLAorCTB4RkUsIDB4ODQsIDB4MDQsIDB4NzksIDB4RjQsIDB4MDcsIDB4NDAsIDB4QkEsIDB4MUMsIDB4M0UsIDB4RjQsCisJMHg4MiwgMHgwNiwgMHg1OCwgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDE4LCAweDAwLCAweDlELCAweEZGLCAweEQzLCAweDAwLCAweEI4LCAweEZFLCAweDkzLCAweDAxLAorCTB4QTEsIDB4RkUsIDB4OEUsIDB4RkYsIDB4OTIsIDB4NDgsIDB4M0QsIDB4MDgsIDB4RTEsIDB4RkEsIDB4ODYsCisJMHgwMywgMHhCNiwgMHhGRCwgMHg0QywgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweEE4LCAweDAxLCAweEU5LCAweEZDLCAweDJELAorCTB4MDUsIDB4NkIsIDB4RjcsIDB4QjYsIDB4MTEsIDB4QzgsIDB4NDUsIDB4MzAsIDB4RjksIDB4Q0QsIDB4MDEsCisJMHhEMCwgMHhGRiwgMHhBQywgMHhGRiwgMHg1QywgMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERGLCAweDAxLCAweDMzLCAweEZDLCAweDIwLCAweDA3LAorCTB4MzUsIDB4RjIsIDB4MzYsIDB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsIDB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsCisJMHhGRCwgMHg0MSwgMHgwMSwgMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDEwLCAweDAwLCAweEE3LCAweEZGLCAweDE5LCAweDAxLCAweDUzLCAweEZELCAweERCLCAweDA1LCAweDg4LAorCTB4RjIsIDB4QUQsIDB4M0EsIDB4NkQsIDB4MjQsIDB4QTQsIDB4RjIsIDB4MDgsIDB4MDcsIDB4MzIsIDB4RkMsCisJMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRiwKKwkweEZGLCAweDdCLCAweDAwLCAweDZDLCAweEZGLCAweDQ0LCAweDAwLCAweDAxLCAweDAxLCAweEI2LCAweEZBLAorCTB4QzgsIDB4NDYsIDB4MTMsIDB4MEYsIDB4NTEsIDB4RjgsIDB4QzQsIDB4MDQsIDB4MUIsIDB4RkQsIDB4OTIsCisJMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKKwkweDYzLCAweEZGLCAweDY3LCAweDAxLCAweDdBLCAweEZELCAweEZFLCAweDAzLCAweEVFLCAweEY5LCAweEFBLAorCTB4MEEsIDB4MTYsIDB4NDgsIDB4QUMsIDB4RkQsIDB4ODYsIDB4RkYsIDB4MTcsIDB4MDEsIDB4RkEsIDB4RkUsCisJMHhCMywgMHgwMCwgMHhBQSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKKwkweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLCAweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLAorCTB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsIDB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsCisJMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3MywgMHhGRiwKKwkweDdELCAweDAxLCAweEIzLCAweEZDLCAweEJCLCAweDA2LCAweDlBLCAweEYxLCAweDYwLCAweDM0LCAweEY1LAorCTB4MkIsIDB4QjAsIDB4RjEsIDB4MjgsIDB4MDcsIDB4NDcsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsCisJMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgxNywKKwkweDAwLCAweDEwLCAweEZGLCAweDE1LCAweDAzLCAweERELCAweEY2LCAweDlFLCAweDQzLCAweDZDLCAweDE2LAorCTB4RjEsIDB4RjUsIDB4RDMsIDB4MDUsIDB4OUYsIDB4RkMsIDB4QzYsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxOSwgMHgwMSwKKwkweDIzLCAweEZFLCAweEIwLCAweDAyLCAweDg3LCAweEZDLCAweDQxLCAweDA0LCAweEY0LCAweDQ4LCAweDFDLAorCTB4MDMsIDB4MDYsIDB4RkQsIDB4NkUsIDB4MDIsIDB4NDUsIDB4RkUsIDB4MDksIDB4MDEsIDB4ODgsIDB4RkYsCisJMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRSwgMHgwMSwgMHg4QywKKwkweEZDLCAweDAwLCAweDA2LCAweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLCAweDQyLCAweDNGLCAweEY2LAorCTB4NzEsIDB4MDMsIDB4RDksIDB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RiwgMHhGRiwgMHhDMSwgMHgwMSwgMHg1MiwgMHhGQywKKwkweDIyLCAweDA3LCAweDk4LCAweEYxLCAweDVFLCAweDJELCAweDEzLCAweDMzLCAweDg3LCAweEYxLCAweEQ4LAorCTB4MDYsIDB4OUIsIDB4RkMsIDB4OEQsIDB4MDEsIDB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMywgMHgwMCwgMHhGQywgMHhGRiwgMHhEQywgMHhGRiwgMHhBRiwgMHgwMCwgMHgwNywgMHhGRSwgMHhDOCwKKwkweDA0LCAweDEwLCAweEY0LCAweDJELCAweDNGLCAweDBGLCAweDFFLCAweEVELCAweEYzLCAweEEwLCAweDA2LAorCTB4NEUsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhBMywgMHhGRiwgMHhDMywgMHgwMCwgMHhENywgMHhGRSwgMHg1OCwgMHgwMSwgMHgwRiwgMHhGRiwKKwkweEE2LCAweEZFLCAweDVELCAweDQ4LCAweDYxLCAweDA5LCAweDZFLCAweEZBLCAweEMwLCAweDAzLCAweDk5LAorCTB4RkQsIDB4NTksIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwgMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywKKwkweEY3LCAweDc1LCAweDEwLCAweDQ4LCAweDQ2LCAweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLAorCTB4OEUsIDB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNiwgMHgwNywgMHg2NywgMHhGMiwKKwkweEU1LCAweDI1LCAweDg3LCAweDM5LCAweDQ3LCAweEYyLCAweDEwLCAweDA2LCAweDMwLCAweEZELCAweDJGLAorCTB4MDEsIDB4OUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHg5RCwgMHhGRiwgMHgyRCwgMHgwMSwgMHgzMywgMHhGRCwgMHgwQiwgMHgwNiwgMHg0RCwgMHhGMiwgMHhBNSwKKwkweDM5LCAweEJGLCAweDI1LCAweDZELCAweEYyLCAweDE1LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAorCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4NkQsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHgwRCwgMHgwMCwgMHg2MywgMHgwMSwgMHhGOSwgMHhGOSwgMHg1NSwgMHg0NiwKKwkweDUxLCAweDEwLCAweEUzLCAweEY3LCAweEY3LCAweDA0LCAweDAzLCAweEZELCAweDlELCAweDAxLCAweDRFLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsCisJMHg1QiwgMHgwMSwgMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwgMHg1NywKKwkweDQ4LCAweDhELCAweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLCAweDAwLAorCTB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsCisJMHgwMSwgMHg0RCwgMHhGQywgMHhBMywgMHgwNiwgMHhFNCwgMHhGMywgMHgzNiwgMHgxRSwgMHgxNiwgMHgzRiwKKwkweDA1LCAweEY0LCAweENGLCAweDA0LCAweDAyLCAweEZFLCAweEIyLCAweDAwLCAweERCLCAweEZGLCAweEZDLAorCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4OEIsIDB4MDEsCisJMHg5RCwgMHhGQywgMHhENSwgMHgwNiwgMHg4OSwgMHhGMSwgMHgzNSwgMHgzMywgMHgzQSwgMHgyRCwgMHg5QSwKKwkweEYxLCAweDIzLCAweDA3LCAweDUxLCAweEZDLCAweEMyLCAweDAxLCAweDRGLCAweEZGLCAweDJGLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MzMsIDB4MDAsIDB4REYsCisJMHhGRSwgMHg2OCwgMHgwMywgMHg0RSwgMHhGNiwgMHhFRSwgMHg0MiwgMHhCQiwgMHgxNywgMHg5MCwgMHhGNSwKKwkweEZDLCAweDA1LCAweDhFLCAweEZDLCAweENELCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsIDB4RkUsIDB4NzQsIDB4MDIsCisJMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwgMHg5NCwgMHhGQywgMHhBOSwKKwkweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzcsIDB4MDEsIDB4OUQsIDB4RkMsIDB4RDgsCisJMHgwNSwgMHhFNywgMHhGNSwgMHg5MSwgMHgxNiwgMHg4OSwgMHg0MywgMHhDRCwgMHhGNiwgMHgxRSwgMHgwMywKKwkweDBCLCAweEZGLCAweDFBLCAweDAwLCAweDI2LCAweDAwLCAweEUwLCAweEZGLCAweDA4LCAweDAwLCAweEZELAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzksIDB4MDEsIDB4NDgsIDB4RkMsIDB4MjgsIDB4MDcsCisJMHhBRCwgMHhGMSwgMHgxOSwgMHgyQywgMHgzRiwgMHgzNCwgMHg5NywgMHhGMSwgMHhCRSwgMHgwNiwgMHhCMCwKKwkweEZDLCAweDdGLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RDAsIDB4RkYsIDB4QzcsIDB4MDAsIDB4REUsIDB4RkQsIDB4MDgsIDB4MDUsIDB4QjAsCisJMHhGMywgMHg0QSwgMHgzRSwgMHg2NCwgMHgxRiwgMHhBMCwgMHhGMywgMHhCQiwgMHgwNiwgMHg0NSwgMHhGQywKKwkweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEE5LAorCTB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsIDB4MDEsIDB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsCisJMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwgMHhGOCwgMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwKKwkweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLAorCTB4NTIsIDB4RkYsIDB4OTMsIDB4MDEsIDB4MTgsIDB4RkQsIDB4QzksIDB4MDQsIDB4NDUsIDB4RjgsIDB4MzYsCisJMHgwRiwgMHhCQiwgMHg0NiwgMHhBMSwgMHhGQSwgMHgwQywgMHgwMSwgMHgzRSwgMHgwMCwgMHg3MCwgMHhGRiwKKwkweDdBLCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LAorCTB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDksIDB4MDcsIDB4OUQsIDB4RjIsIDB4OTIsIDB4MjQsCisJMHg4RiwgMHgzQSwgMHg4MiwgMHhGMiwgMHhFMSwgMHgwNSwgMHg1MCwgMHhGRCwgMHgxQiwgMHgwMSwgMHhBNiwKKwkweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE3LCAweDAwLCAweDkzLCAweEZGLAorCTB4M0YsIDB4MDEsIDB4MTUsIDB4RkQsIDB4MzYsIDB4MDYsIDB4MTksIDB4RjIsIDB4OTcsIDB4MzgsIDB4MTEsCisJMHgyNywgMHgzQiwgMHhGMiwgMHgxRiwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwgMHgwMSwgMHgzRCwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LAorCTB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsCisJMHg3NywgMHhGNywgMHgyOCwgMHgwNSwgMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZELCAweEZGLCAweDRFLCAweDAxLAorCTB4QjMsIDB4RkQsIDB4OEQsIDB4MDMsIDB4RDQsIDB4RkEsIDB4NUQsIDB4MDgsIDB4OEQsIDB4NDgsIDB4NzQsCisJMHhGRiwgMHhBRSwgMHhGRSwgMHg4RCwgMHgwMSwgMHhCQiwgMHhGRSwgMHhEMSwgMHgwMCwgMHg5RSwgMHhGRiwKKwkweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU3LAorCTB4RkMsIDB4ODUsIDB4MDYsIDB4MzQsIDB4RjQsIDB4RTAsIDB4MUMsIDB4RjAsIDB4M0YsIDB4NkQsIDB4RjQsCisJMHg4QywgMHgwNCwgMHgyQywgMHhGRSwgMHg5OSwgMHgwMCwgMHhFNywgMHhGRiwgMHhGOCwgMHhGRiwgMHgwNCwKKwkweDAwLCAweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDk4LCAweDAxLCAweDhBLCAweEZDLAorCTB4RUMsIDB4MDYsIDB4N0YsIDB4RjEsIDB4MDQsIDB4MzIsIDB4N0IsIDB4MkUsIDB4OEEsIDB4RjEsIDB4MUEsCisJMHgwNywgMHg1RCwgMHhGQywgMHhCOCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDA2LCAweDAwLCAweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LAorCTB4MDMsIDB4QzcsIDB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsCisJMHg3RCwgMHhGQywgMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywKKwkweDAwLCAweDhELCAweEZGLCAweEZDLCAweDAwLCAweDYxLCAweEZFLCAweDM5LCAweDAyLCAweDZCLCAweEZELAorCTB4MzcsIDB4MDIsIDB4RUIsIDB4NDgsIDB4MzEsIDB4MDUsIDB4MjEsIDB4RkMsIDB4RTQsIDB4MDIsIDB4MDgsCisJMHhGRSwgMHgyNiwgMHgwMSwgMHg3QywgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEMwLCAweDAxLCAweEFGLCAweEZDLCAweEFELCAweDA1LCAweDRBLAorCTB4RjYsIDB4NDQsIDB4MTUsIDB4MkYsIDB4NDQsIDB4NjQsIDB4RjcsIDB4QzksIDB4MDIsIDB4M0QsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwKKwkweDAwLCAweDQ3LCAweEZGLCAweEQwLCAweDAxLCAweDQwLCAweEZDLCAweDJBLCAweDA3LCAweENBLCAweEYxLAorCTB4RDEsIDB4MkEsIDB4NjUsIDB4MzUsIDB4QUUsIDB4RjEsIDB4QTAsIDB4MDYsIDB4QzcsIDB4RkMsIDB4NzAsCisJMHgwMSwgMHg3QSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LCAweEYzLCAweDYxLAorCTB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsIDB4RTYsIDB4MDEsCisJMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNSwKKwkweDAwLCAweDE2LCAweEZGLCAweEUzLCAweDAwLCAweEU0LCAweEZGLCAweEVCLCAweEZDLCAweEQyLCAweDQ3LAorCTB4QjYsIDB4MEIsIDB4ODksIDB4RjksIDB4MkYsIDB4MDQsIDB4NjIsIDB4RkQsIDB4NzIsIDB4MDEsIDB4NUUsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwKKwkweDg4LCAweDAxLCAweDMxLCAweEZELCAweDk1LCAweDA0LCAweEI0LCAweEY4LCAweEZDLCAweDBELCAweDI2LAorCTB4NDcsIDB4NjQsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4NTEsIDB4RkYsIDB4ODksIDB4MDAsCisJMHhCQSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwKKwkweDAxLCAweDM0LCAweEZDLCAweEY5LCAweDA2LCAweEQ5LCAweEYyLCAweDNGLCAweDIzLCAweDkwLCAweDNCLAorCTB4QzQsIDB4RjIsIDB4QUUsIDB4MDUsIDB4NzIsIDB4RkQsIDB4MDcsIDB4MDEsIDB4QjAsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1MSwgMHgwMSwKKwkweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLCAweDgyLCAweDM3LCAweDYwLCAweDI4LCAweDBFLAorCTB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg0RiwgMHgwMCwgMHhDNywgMHhGRiwgMHhBMCwKKwkweEZGLCAweDIwLCAweDAyLCAweDk2LCAweEY4LCAweDRFLCAweDQ1LCAweEQ3LCAweDEyLCAweDBELCAweEY3LAorCTB4NTgsIDB4MDUsIDB4RDYsIDB4RkMsIDB4QjAsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg0MCwgMHgwMSwgMHhEMCwgMHhGRCwKKwkweDUzLCAweDAzLCAweDQ3LCAweEZCLCAweDNGLCAweDA3LCAweEI4LCAweDQ4LCAweDYyLCAweDAwLCAweDNGLAorCTB4RkUsIDB4QzgsIDB4MDEsIDB4OUMsIDB4RkUsIDB4RTAsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MTksIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQywgMHgwMSwgMHg2MywgMHhGQywgMHg2NiwKKwkweDA2LCAweDg5LCAweEY0LCAweDhDLCAweDFCLCAweEMzLCAweDQwLCAweERELCAweEY0LCAweDQ2LCAweDA0LAorCTB4NTgsIDB4RkUsIDB4ODAsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwgMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwKKwkweDdELCAweEYxLCAweENGLCAweDMwLCAweEI4LCAweDJGLCAweDgwLCAweEYxLCAweDBELCAweDA3LCAweDZBLAorCTB4RkMsIDB4QUUsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OSwgMHgwMCwgMHg4MCwgMHhGRSwgMHgwNCwgMHgwNCwgMHg0OCwKKwkweEY1LCAweDc0LCAweDQxLCAweDVELCAweDFBLCAweEQ3LCAweEY0LCAweDQ3LCAweDA2LCAweDZGLCAweEZDLAorCTB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTMsCisJMHhGRiwgMHhFRCwgMHgwMCwgMHg4MCwgMHhGRSwgMHhGRCwgMHgwMSwgMHhEQywgMHhGRCwgMHgzQywgMHgwMSwKKwkweEQ1LCAweDQ4LCAweDQ1LCAweDA2LCAweEFFLCAweEZCLCAweDFGLCAweDAzLCAweEVBLCAweEZELCAweDM0LAorCTB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsCisJMHg0NCwgMHhGRiwgMHhCOCwgMHgwMSwgMHhDMywgMHhGQywgMHg4MSwgMHgwNSwgMHhCMCwgMHhGNiwgMHhGQSwKKwkweDEzLCAweENDLCAweDQ0LCAweDAyLCAweEY4LCAweDcxLCAweDAyLCAweDcxLCAweEZGLCAweEUxLCAweEZGLAorCTB4NDIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsCisJMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywgMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwKKwkweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLCAweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLAorCTB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QkEsIDB4RkYsCisJMHhGNCwgMHgwMCwgMHg5MSwgMHhGRCwgMHg3RSwgMHgwNSwgMHgwNSwgMHhGMywgMHg2RSwgMHgzQywgMHgxMCwKKwkweDIyLCAweDEyLCAweEYzLCAweEU5LCAweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzUsCisJMHhGRiwgMHhBOSwgMHgwMCwgMHg0RCwgMHgwMCwgMHgxOSwgMHhGQywgMHg3QywgMHg0NywgMHhFOCwgMHgwQywKKwkweDE4LCAweEY5LCAweDY2LCAweDA0LCAweDQ4LCAweEZELCAweDdFLCAweDAxLCAweDVBLCAweEZGLCAweDJCLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUEsIDB4RkYsIDB4N0QsIDB4MDEsCisJMHg0QiwgMHhGRCwgMHg2MCwgMHgwNCwgMHgyNCwgMHhGOSwgMHhDNiwgMHgwQywgMHg4NiwgMHg0NywgMHgzMCwKKwkweEZDLCAweDQxLCAweDAwLCAweEIwLCAweDAwLCAweDMyLCAweEZGLCAweDk4LCAweDAwLCAweEI0LCAweEZGLAorCTB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzgsCisJMHhGQywgMHhFNiwgMHgwNiwgMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwgMHgzQywgMHgwRSwgMHhGMywKKwkweDc4LCAweDA1LCAweDk2LCAweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLCAweDA4LCAweDAwLCAweDAxLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NjIsIDB4MDEsIDB4REQsIDB4RkMsCisJMHg4MywgMHgwNiwgMHhDOSwgMHhGMSwgMHg2NiwgMHgzNiwgMHhBQywgMHgyOSwgMHhFNywgMHhGMSwgMHgyQSwKKwkweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAorCTB4MEIsIDB4MDAsIDB4RDYsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NkIsIDB4RkYsIDB4N0IsCisJMHgwMiwgMHhGMCwgMHhGNywgMHhCQSwgMHg0NCwgMHgxRSwgMHgxNCwgMHhBNSwgMHhGNiwgMHg4NiwgMHgwNSwKKwkweEMxLCAweEZDLCAweEI5LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzIsIDB4MDEsIDB4RUQsIDB4RkQsIDB4MTksIDB4MDMsCisJMHhCQiwgMHhGQiwgMHgyNiwgMHgwNiwgMHhENywgMHg0OCwgMHg1OCwgMHgwMSwgMHhDRiwgMHhGRCwgMHgwNCwKKwkweDAyLCAweDdELCAweEZFLCAweEVGLCAweDAwLCAweDkyLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLAorCTB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsCisJMHhGNCwgMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwgMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwKKwkweDY2LCAweDAwLCAweDAxLCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJCLAorCTB4MDAsIDB4NTksIDB4RkYsIDB4QjAsIDB4MDEsIDB4NjksIDB4RkMsIDB4MEYsIDB4MDcsIDB4ODAsIDB4RjEsCisJMHg5NiwgMHgyRiwgMHhGMiwgMHgzMCwgMHg3QywgMHhGMSwgMHhGRCwgMHgwNiwgMHg3QSwgMHhGQywgMHhBMywKKwkweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEY0LCAweEZGLAorCTB4RjIsIDB4RkYsIDB4ODMsIDB4MDAsIDB4NTMsIDB4RkUsIDB4NEUsIDB4MDQsIDB4RDAsIDB4RjQsIDB4QUIsCisJMHg0MCwgMHhCMiwgMHgxQiwgMHg3RiwgMHhGNCwgMHg2OSwgMHgwNiwgMHg2MiwgMHhGQywgMHhERCwgMHgwMSwKKwkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDk4LCAweEZGLCAweERFLAorCTB4MDAsIDB4OUYsIDB4RkUsIDB4QzIsIDB4MDEsIDB4NEIsIDB4RkUsIDB4NDgsIDB4MDAsIDB4QjMsIDB4NDgsCisJMHg1RSwgMHgwNywgMHgzQiwgMHhGQiwgMHg1OSwgMHgwMywgMHhDRCwgMHhGRCwgMHg0MiwgMHgwMSwgMHg3MSwKKwkweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LCAweEZGLAorCTB4QUYsIDB4MDEsIDB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsIDB4NUMsCisJMHg0NSwgMHhBOSwgMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwgMHgwMCwKKwkweEQwLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERCLAorCTB4MDEsIDB4MzUsIDB4RkMsIDB4MjUsIDB4MDcsIDB4MTMsIDB4RjIsIDB4M0EsIDB4MjgsIDB4QTAsIDB4MzcsCisJMHhGMiwgMHhGMSwgMHg1QSwgMHgwNiwgMHhGQiwgMHhGQywgMHg0RiwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxQSwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEFGLCAweEZGLCAweDA5LCAweDAxLAorCTB4NkUsIDB4RkQsIDB4QjQsIDB4MDUsIDB4QkMsIDB4RjIsIDB4NzMsIDB4M0IsIDB4NjQsIDB4MjMsIDB4RDIsCisJMHhGMiwgMHhGQiwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDExLCAweDAwLCAweEJCLCAweEZGLCAweDg3LCAweDAwLCAweDU0LCAweEZGLCAweDcwLAorCTB4MDAsIDB4QjMsIDB4MDAsIDB4NEUsIDB4RkIsIDB4MUEsIDB4NDcsIDB4MUYsIDB4MEUsIDB4QTgsIDB4RjgsCisJMHg5QiwgMHgwNCwgMHgyRSwgMHhGRCwgMHg4QSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLCAweDAxLCAweDY1LCAweEZELAorCTB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsIDB4MDMsIDB4RkQsIDB4RDksCisJMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwgMHgwMCwKKwkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQwLAorCTB4MDYsIDB4NUUsIDB4RjMsIDB4OTQsIDB4MjAsIDB4N0IsIDB4M0QsIDB4NjAsIDB4RjMsIDB4M0UsIDB4MDUsCisJMHhCQiwgMHhGRCwgMHhEQiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDIwLCAweDAwLCAweDc5LCAweEZGLCAweDcyLCAweDAxLCAweEM0LCAweEZDLCAweEE0LCAweDA2LAorCTB4QUIsIDB4RjEsIDB4NDYsIDB4MzUsIDB4RjcsIDB4MkEsIDB4QzYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDAsCisJMHhGQywgMHhDRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwKKwkweERCLCAweEZGLCAweDMzLCAweDAwLCAweDAxLCAweDAwLCAweDM4LCAweEZGLCAweEQzLCAweDAyLCAweDUzLAorCTB4RjcsIDB4MUYsIDB4NDQsIDB4NjksIDB4MTUsIDB4M0YsIDB4RjYsIDB4QjIsIDB4MDUsIDB4QUQsIDB4RkMsCisJMHhDMSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwKKwkweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLCAweEZFLCAweERFLCAweDAyLCAweDJFLCAweEZDLAorCTB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsIDB4NUUsIDB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsCisJMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweDNCLCAweEZGLCAweEQzLCAweDAxLCAweDdGLCAweEZDLCAweDFGLCAweDA2LCAweDNDLCAweEY1LCAweEU2LAorCTB4MTgsIDB4NEQsIDB4NDIsIDB4RDUsIDB4RjUsIDB4QUYsIDB4MDMsIDB4QjQsIDB4RkUsIDB4NEIsIDB4MDAsCisJMHgwRSwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywKKwkweEZGLCAweEJBLCAweDAxLCAweDVCLCAweEZDLCAweDFCLCAweDA3LCAweDhCLCAweEYxLCAweDU4LCAweDJFLAorCTB4MjYsIDB4MzIsIDB4ODAsIDB4RjEsIDB4RUEsIDB4MDYsIDB4OEMsIDB4RkMsIDB4OTcsIDB4MDEsIDB4NjYsCisJMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhFNiwgMHhGRiwKKwkweDlDLCAweDAwLCAweDI3LCAweEZFLCAweDk0LCAweDA0LCAweDYxLCAweEY0LCAweEQ3LCAweDNGLCAweDA2LAorCTB4MUQsIDB4MkIsIDB4RjQsIDB4ODksIDB4MDYsIDB4NTYsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwKKwkweEZFLCAweDg2LCAweDAxLCAweEJBLCAweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LAorCTB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsIDB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNiwgMHgwMSwKKwkweEVFLCAweEZDLCAweDIzLCAweDA1LCAweDgzLCAweEY3LCAweDZFLCAweDExLCAweEU1LCAweDQ1LCAweDU3LAorCTB4RjksIDB4QjgsIDB4MDEsIDB4REMsIDB4RkYsIDB4QTUsIDB4RkYsIDB4NUYsIDB4MDAsIDB4Q0EsIDB4RkYsCisJMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzRCwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMiwKKwkweEZDLCAweDFFLCAweDA3LCAweDQwLCAweEYyLCAweEVCLCAweDI2LCAweEI1LCAweDM4LCAweDFGLCAweEYyLAorCTB4MzIsIDB4MDYsIDB4MTgsIDB4RkQsIDB4M0QsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhBNCwgMHhGRiwgMHgxRCwgMHgwMSwgMHg0QywgMHhGRCwKKwkweEU2LCAweDA1LCAweDdCLCAweEYyLCAweDcxLCAweDNBLCAweEI4LCAweDI0LCAweDk3LCAweEYyLCAweDBCLAorCTB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwRiwgMHgwMCwgMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywKKwkweDAxLCAweDhCLCAweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LAorCTB4MTUsIDB4RkQsIDB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyOCwgMHgwMCwgMHg2NCwgMHhGRiwgMHg2NSwgMHgwMSwgMHg4MSwgMHhGRCwgMHhGMiwgMHgwMywKKwkweDA4LCAweEZBLCAweDY4LCAweDBBLCAweDI1LCAweDQ4LCAweERFLCAweEZELCAweDZFLCAweEZGLCAweDI0LAorCTB4MDEsIDB4RjMsIDB4RkUsIDB4QjYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NiwgMHhGQywgMHhCOCwgMHgwNiwgMHhBOCwKKwkweEYzLCAweDNGLCAweDFGLCAweDY0LCAweDNFLCAweEJBLCAweEYzLCAweDAxLCAweDA1LCAweEUyLCAweEZELAorCTB4QzQsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsCisJMHgwMCwgMHg3MSwgMHhGRiwgMHg4MSwgMHgwMSwgMHhBRSwgMHhGQywgMHhDMSwgMHgwNiwgMHg5NSwgMHhGMSwKKwkweDFFLCAweDM0LCAweDNFLCAweDJDLCAweEFCLCAweEYxLCAweDI3LCAweDA3LCAweDQ5LCAweEZDLCAweEM4LAorCTB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsCisJMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwgMHhGNiwgMHg3NywKKwkweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLCAweEM4LCAweDAxLAorCTB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsCisJMHhGRiwgMHgxNiwgMHgwMSwgMHgyQSwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMSwgMHhGQywgMHgwNiwgMHgwNCwKKwkweEY1LCAweDQ4LCAweDU2LCAweDAzLCAweEVELCAweEZDLCAweDdCLCAweDAyLCAweDNFLCAweEZFLCAweDBDLAorCTB4MDEsIDB4ODYsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCisJMHhDQywgMHgwMSwgMHg4RiwgMHhGQywgMHhGOCwgMHgwNSwgMHg5QiwgMHhGNSwgMHg5NiwgMHgxNywgMHgwMiwKKwkweDQzLCAweDVFLCAweEY2LCAweDVGLCAweDAzLCAweEU0LCAweEZFLCAweDMwLCAweDAwLCAweDFCLCAweDAwLAorCTB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsCisJMHgwMSwgMHg0RiwgMHhGQywgMHgyNCwgMHgwNywgMHg5QywgMHhGMSwgMHgxNywgMHgyRCwgMHg1NywgMHgzMywKKwkweDhBLCAweEYxLCAweEQzLCAweDA2LCAweDlGLCAweEZDLCAweDhBLCAweDAxLCAweDZELCAweEZGLCAweDI1LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RDksIDB4RkYsIDB4QjQsIDB4MDAsCisJMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywgMHhGQywgMHgzRSwgMHg1QiwgMHgxRSwgMHhEQiwKKwkweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzAsIDB4MDAsIDB4REUsIDB4RkUsIDB4NEIsCisJMHgwMSwgMHgyNywgMHhGRiwgMHg3MywgMHhGRSwgMHg0RiwgMHg0OCwgMHhBMiwgMHgwOSwgMHg1NCwgMHhGQSwKKwkweENDLCAweDAzLCAweDkzLCAweEZELCAweDVDLCAweDAxLCAweDY3LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUMsIDB4MDEsIDB4MDUsIDB4RkQsCisJMHhGMSwgMHgwNCwgMHhGMCwgMHhGNywgMHgyRCwgMHgxMCwgMHg2MSwgMHg0NiwgMHgwRCwgMHhGQSwgMHg1OCwKKwkweDAxLCAweDEzLCAweDAwLCAweDg3LCAweEZGLCAweDZFLCAweDAwLCAweEM0LCAweEZGLCAweDBFLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTQsCisJMHgwNywgMHg3MywgMHhGMiwgMHg5OSwgMHgyNSwgMHhDMiwgMHgzOSwgMHg1NCwgMHhGMiwgMHgwNSwgMHgwNiwKKwkweDM3LCAweEZELCAweDJCLCAweDAxLCAweDlFLCAweEZGLCAweDEzLCAweDAwLCAweEZGLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsIDB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsCisJMHg0MSwgMHhGMiwgMHg2QSwgMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwgMHhGMiwgMHgxNywgMHgwNywgMHgzMSwKKwkweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAorCTB4QzYsIDB4RkYsIDB4NjksIDB4MDAsIDB4OTEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDEsIDB4RDAsCisJMHhGOSwgMHgzOSwgMHg0NiwgMHg5OCwgMHgxMCwgMHhDQiwgMHhGNywgMHgwMiwgMHgwNSwgMHhGRSwgMHhGQywKKwkweDlGLCAweDAxLCAweDRELCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LAorCTB4MDAsIDB4NjksIDB4RkYsIDB4NTgsIDB4MDEsIDB4OUQsIDB4RkQsIDB4QjksIDB4MDMsIDB4N0IsIDB4RkEsCisJMHg0MCwgMHgwOSwgMHg2MywgMHg0OCwgMHhCRiwgMHhGRSwgMHgwMywgMHhGRiwgMHg1RiwgMHgwMSwgMHhENCwKKwkweEZFLCAweEM1LCAweDAwLCAweEEyLCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NEYsIDB4RkMsIDB4OUMsIDB4MDYsIDB4RjUsIDB4RjMsIDB4RUEsCisJMHgxRCwgMHg0NywgMHgzRiwgMHgxQiwgMHhGNCwgMHhDMSwgMHgwNCwgMHgwQiwgMHhGRSwgMHhBQywgMHgwMCwKKwkweERFLCAweEZGLCAweEZCLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLAorCTB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsIDB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsCisJMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwgMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwKKwkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU2LCAweEZGLCAweDE3LCAweDAwLAorCTB4MzksIDB4MDAsIDB4RDQsIDB4RkUsIDB4N0EsIDB4MDMsIDB4MkYsIDB4RjYsIDB4QzcsIDB4NDIsIDB4MDYsCisJMHgxOCwgMHg3QiwgMHhGNSwgMHgwNSwgMHgwNiwgMHg4QSwgMHhGQywgMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwKKwkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDg4LCAweEZGLCAweDA3LCAweDAxLCAweDQ5LAorCTB4RkUsIDB4NjcsIDB4MDIsIDB4MTMsIDB4RkQsIDB4RkYsIDB4MDIsIDB4RjQsIDB4NDgsIDB4NUYsIDB4MDQsCisJMHg3QSwgMHhGQywgMHhCNiwgMHgwMiwgMHgyMCwgMHhGRSwgMHgxQiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM2LCAweDAxLAorCTB4QTEsIDB4RkMsIDB4Q0YsIDB4MDUsIDB4RkMsIDB4RjUsIDB4NDcsIDB4MTYsIDB4QjAsIDB4NDMsIDB4RUUsCisJMHhGNiwgMHgwQywgMHgwMywgMHgxNiwgMHhGRiwgMHgxNCwgMHgwMCwgMHgyOSwgMHgwMCwgMHhERiwgMHhGRiwKKwkweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweENBLCAweDAxLCAweDQ2LAorCTB4RkMsIDB4MjksIDB4MDcsIDB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsIDB4MzQsIDB4OUMsIDB4RjEsCisJMHhCOCwgMHgwNiwgMHhCNSwgMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENFLCAweEZGLCAweENDLCAweDAwLCAweEQ1LCAweEZELAorCTB4MTYsIDB4MDUsIDB4OUIsIDB4RjMsIDB4MTgsIDB4M0UsIDB4QjEsIDB4MUYsIDB4OEYsIDB4RjMsIDB4QzAsCisJMHgwNiwgMHg0MywgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDE1LCAweDAwLCAweEFBLCAweEZGLCAweEIxLCAweDAwLCAweEZFLCAweEZFLCAweDEwLCAweDAxLCAweDkyLAorCTB4RkYsIDB4OTQsIDB4RkQsIDB4MEQsIDB4NDgsIDB4Q0IsIDB4MEEsIDB4RTIsIDB4RjksIDB4MDQsIDB4MDQsCisJMHg3NywgMHhGRCwgMHg2OSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkxLCAweDAxLCAweDFFLCAweEZELCAweEJFLCAweDA0LAorCTB4NUUsIDB4RjgsIDB4RjAsIDB4MEUsIDB4RDMsIDB4NDYsIDB4Q0IsIDB4RkEsIDB4RjYsIDB4MDAsIDB4NEIsCisJMHgwMCwgMHg2OSwgMHhGRiwgMHg3RCwgMHgwMCwgMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLAorCTB4RjIsIDB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsIDB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsCisJMHgxNywgMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwKKwkweDAwLCAweDkxLCAweEZGLCAweDQzLCAweDAxLCAweDBFLCAweEZELCAweDQwLCAweDA2LCAweDBGLCAweEYyLAorCTB4NUIsIDB4MzgsIDB4NUMsIDB4MjcsIDB4MzAsIDB4RjIsIDB4MjEsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsCisJMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQywgMHhGRiwKKwkweDVBLCAweDAwLCAweEFGLCAweEZGLCAweENBLCAweEZGLCAweEQ4LCAweDAxLCAweDFDLCAweEY5LCAweEI4LAorCTB4NDUsIDB4REEsIDB4MTEsIDB4NjAsIDB4RjcsIDB4MzMsIDB4MDUsIDB4RTcsIDB4RkMsIDB4QTksIDB4MDEsCisJMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2RSwKKwkweEZGLCAweDRCLCAweDAxLCAweEI5LCAweEZELCAweDgwLCAweDAzLCAweEVFLCAweEZBLCAweDFELCAweDA4LAorCTB4OTgsIDB4NDgsIDB4QTgsIDB4RkYsIDB4OTUsIDB4RkUsIDB4OUEsIDB4MDEsIDB4QjQsIDB4RkUsIDB4RDQsCisJMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweERGLCAweDAxLCAweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLCAweDFGLAorCTB4NDAsIDB4ODUsIDB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsIDB4RkYsCisJMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5QiwKKwkweDAxLCAweDg2LCAweEZDLCAweEYxLCAweDA2LCAweDdFLCAweEYxLCAweEMwLCAweDMxLCAweEMyLCAweDJFLAorCTB4ODcsIDB4RjEsIDB4MTcsIDB4MDcsIDB4NUYsIDB4RkMsIDB4QjYsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHg1NCwgMHgwMCwKKwkweEE0LCAweEZFLCAweEM5LCAweDAzLCAweEFBLCAweEY1LCAweDBDLCAweDQyLCAweDU2LCAweDE5LCAweDFFLAorCTB4RjUsIDB4MkIsIDB4MDYsIDB4N0EsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RSwgMHhGRiwgMHhGOSwgMHgwMCwgMHg2OCwgMHhGRSwgMHgyQywKKwkweDAyLCAweDg0LCAweEZELCAweEZGLCAweDAxLCAweEU2LCAweDQ4LCAweDZFLCAweDA1LCAweDA3LCAweEZDLAorCTB4RjEsIDB4MDIsIDB4MDEsIDB4RkUsIDB4MjksIDB4MDEsIDB4N0IsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwgMHgwMSwgMHhCNCwgMHhGQywKKwkweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LCAweDg2LCAweEY3LCAweEI2LAorCTB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwgMHgzRSwgMHhGQywgMHgyQiwKKwkweDA3LCAweEQwLCAweEYxLCAweDg5LCAweDJBLCAweEE2LCAweDM1LCAweEI0LCAweEYxLCAweDk5LCAweDA2LAorCTB4Q0QsIDB4RkMsIDB4NkQsIDB4MDEsIDB4N0MsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsCisJMHgwMCwgMHgwNiwgMHgwMCwgMHhDMiwgMHhGRiwgMHhFMywgMHgwMCwgMHhBRSwgMHhGRCwgMHg1MiwgMHgwNSwKKwkweDQ0LCAweEYzLCAweDJBLCAweDNELCAweDA2LCAweDIxLCAweDQ3LCAweEYzLCAweEQ4LCAweDA2LCAweDNDLAorCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhCMCwgMHhGRiwgMHhBMiwgMHgwMCwgMHgxRCwgMHhGRiwgMHhENiwgMHgwMCwgMHhGQywgMHhGRiwgMHhCQywKKwkweEZDLCAweEMwLCAweDQ3LCAweEZBLCAweDBCLCAweDcwLCAweEY5LCAweDNDLCAweDA0LCAweDVDLCAweEZELAorCTB4NzUsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCisJMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwgMHhGRCwgMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwKKwkweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLCAweDkxLCAweDAwLCAweDgzLCAweDAwLCAweDRBLAorCTB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNSwgMHgwNiwgMHhFNywgMHhGMiwgMHhGMiwKKwkweDIyLCAweEM3LCAweDNCLCAweEQ0LCAweEYyLCAweEEyLCAweDA1LCAweDdBLCAweEZELCAweDAyLCAweDAxLAorCTB4QjIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODgsCisJMHhGRiwgMHg1NSwgMHgwMSwgMHhGMiwgMHhGQywgMHg2NywgMHgwNiwgMHhFNCwgMHhGMSwgMHg0NCwgMHgzNywKKwkweEFBLCAweDI4LCAweDA1LCAweEYyLCAweDI3LCAweDA3LCAweDM2LCAweEZDLCAweERBLCAweDAxLCAweDQxLAorCTB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDIsIDB4RkYsIDB4NEMsIDB4MDAsCisJMHhDRCwgMHhGRiwgMHg5NCwgMHhGRiwgMHgzNCwgMHgwMiwgMHg3MCwgMHhGOCwgMHgyRSwgMHg0NSwgMHgyMCwKKwkweDEzLCAweEY2LCAweEY2LCAweDYyLCAweDA1LCAweEQxLCAweEZDLCAweEIyLCAweDAxLCAweDQ2LCAweEZGLAorCTB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsCisJMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwgMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwKKwkweDk4LCAweDAwLCAweDI2LCAweEZFLCAweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LAorCTB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsCisJMHg2NiwgMHhGQywgMHg1RSwgMHgwNiwgMHg5QywgMHhGNCwgMHg0MCwgMHgxQiwgMHhFRiwgMHg0MCwgMHhGNywKKwkweEY0LCAweDM1LCAweDA0LCAweDYyLCAweEZFLCAweDdBLCAweDAwLCAweEY3LCAweEZGLCAweEYyLCAweEZGLAorCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4QTcsIDB4MDEsIDB4NzUsCisJMHhGQywgMHgwMywgMHgwNywgMHg3RCwgMHhGMSwgMHg4QSwgMHgzMCwgMHhGRiwgMHgyRiwgMHg3RSwgMHhGMSwKKwkweDBBLCAweDA3LCAweDZFLCAweEZDLCAweEFDLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsIDB4RkMsIDB4RkYsIDB4NkUsIDB4MDAsIDB4NzYsIDB4RkUsCisJMHgxNSwgMHgwNCwgMHgyQywgMHhGNSwgMHg0OSwgMHg0MSwgMHhBOSwgMHgxQSwgMHhDMywgMHhGNCwgMHg0RiwKKwkweDA2LCAweDZDLCAweEZDLCAweEQ5LCAweDAxLCAweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAorCTB4MUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsCisJMHhGRCwgMHgwNSwgMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywKKwkweEU0LCAweEZELCAweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsIDB4QjYsIDB4MDEsIDB4QzgsIDB4RkMsIDB4NzcsIDB4MDUsCisJMHhDNywgMHhGNiwgMHhCMSwgMHgxMywgMHhFRCwgMHg0NCwgMHgyNiwgMHhGOCwgMHg1RCwgMHgwMiwgMHg3RCwKKwkweEZGLCAweERBLCAweEZGLCAweDQ2LCAweDAwLCAweEQ0LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAorCTB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzgsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjMsCisJMHhGMSwgMHgzRSwgMHgyOSwgMHhDNiwgMHgzNiwgMHhENCwgMHhGMSwgMHg3NywgMHgwNiwgMHhFNiwgMHhGQywKKwkweDVDLCAweDAxLCAweDg0LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLAorCTB4MDAsIDB4QjcsIDB4RkYsIDB4RjksIDB4MDAsIDB4ODksIDB4RkQsIDB4OEEsIDB4MDUsIDB4RjQsIDB4RjIsCisJMHgzNywgMHgzQywgMHg1QiwgMHgyMiwgMHgwMywgMHhGMywgMHhFRCwgMHgwNiwgMHgzNywgMHhGQywgMHhFNiwKKwkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI2LCAweEZGLAorCTB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsIDB4RkIsIDB4NjksCisJMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwgMHg4MSwgMHgwMSwKKwkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVCLAorCTB4RkYsIDB4N0EsIDB4MDEsIDB4NTAsIDB4RkQsIDB4NTQsIDB4MDQsIDB4M0QsIDB4RjksIDB4ODIsIDB4MEMsCisJMHg5QSwgMHg0NywgMHg1RSwgMHhGQywgMHgyQSwgMHgwMCwgMHhCRCwgMHgwMCwgMHgyQiwgMHhGRiwgMHg5QiwKKwkweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4RTIsIDB4MDYsIDB4MjgsIDB4RjMsIDB4OUUsIDB4MjEsIDB4QzAsCisJMHgzQywgMHgxRiwgMHhGMywgMHg2QywgMHgwNSwgMHg5RSwgMHhGRCwgMHhFRCwgMHgwMCwgMHhCRCwgMHhGRiwKKwkweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDgwLCAweEZGLCAweDY2LAorCTB4MDEsIDB4RDgsIDB4RkMsIDB4OEIsIDB4MDYsIDB4QzEsIDB4RjEsIDB4MjcsIDB4MzYsIDB4RjYsIDB4MjksCisJMHhERiwgMHhGMSwgMHgyQSwgMHgwNywgMHgzQiwgMHhGQywgMHhENCwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwKKwkweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ3LCAweEZGLCAweDNFLCAweDAwLCAweEVBLCAweEZGLAorCTB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsIDB4OTksIDB4NDQsIDB4NjgsIDB4MTQsIDB4OEUsCisJMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc5LCAweEZGLCAweDJGLCAweDAxLCAweEY0LAorCTB4RkQsIDB4MEMsIDB4MDMsIDB4RDQsIDB4RkIsIDB4RTksIDB4MDUsIDB4REUsIDB4NDgsIDB4OEYsIDB4MDEsCisJMHhCNiwgMHhGRCwgMHgxMSwgMHgwMiwgMHg3NiwgMHhGRSwgMHhGMiwgMHgwMCwgMHg5MSwgMHhGRiwgMHgxQiwKKwkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LCAweDAxLCAweDczLCAweEZDLAorCTB4M0IsIDB4MDYsIDB4RjUsIDB4RjQsIDB4RUQsIDB4MTksIDB4QjcsIDB4NDEsIDB4NzEsIDB4RjUsIDB4RUIsCisJMHgwMywgMHg5MCwgMHhGRSwgMHg2MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LCAweEZGLCAweEIyLCAweDAxLCAweDY1LCAweEZDLCAweDEyLAorCTB4MDcsIDB4ODIsIDB4RjEsIDB4NTAsIDB4MkYsIDB4MzgsIDB4MzEsIDB4N0MsIDB4RjEsIDB4RjksIDB4MDYsCisJMHg3RSwgMHhGQywgMHhBMSwgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwKKwkweDAwLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDg4LCAweDAwLCAweDQ5LCAweEZFLCAweDVELCAweDA0LAorCTB4QjcsIDB4RjQsIDB4N0QsIDB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsIDB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsCisJMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwKKwkweDlBLCAweEZGLCAweERCLCAweDAwLCAweEE2LCAweEZFLCAweEI0LCAweDAxLCAweDY0LCAweEZFLCAweDEyLAorCTB4MDAsIDB4QUEsIDB4NDgsIDB4OUUsIDB4MDcsIDB4MjEsIDB4RkIsIDB4NjYsIDB4MDMsIDB4QzYsIDB4RkQsCisJMHg0NSwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKKwkweDAwLCAweDQ4LCAweEZGLCAweEFELCAweDAxLCAweERELCAweEZDLCAweDQ4LCAweDA1LCAweDMwLCAweEY3LAorCTB4NkIsIDB4MTIsIDB4N0QsIDB4NDUsIDB4Q0YsIDB4RjgsIDB4MDEsIDB4MDIsIDB4QjIsIDB4RkYsIDB4QkQsCisJMHhGRiwgMHg1NCwgMHgwMCwgMHhDRSwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDNGLCAweEZGLCAweERDLCAweDAxLCAweDM0LCAweEZDLCAweDI0LCAweDA3LCAweDFDLCAweEYyLCAweEYwLAorCTB4MjcsIDB4REYsIDB4MzcsIDB4RkIsIDB4RjEsIDB4NTEsIDB4MDYsIDB4MDEsIDB4RkQsIDB4NEIsIDB4MDEsCisJMHg4RCwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywKKwkweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELCAweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLAorCTB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsIDB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQywgMHhGRiwgMHg4NCwgMHgwMCwKKwkweDVCLCAweEZGLCAweDY0LCAweDAwLCAweEM5LCAweDAwLCAweDIyLCAweEZCLCAweDAyLCAweDQ3LCAweDY0LAorCTB4MEUsIDB4OEYsIDB4RjgsIDB4QTcsIDB4MDQsIDB4MjksIDB4RkQsIDB4OEMsIDB4MDEsIDB4NTQsIDB4RkYsCisJMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RSwKKwkweDAxLCAweDZCLCAweEZELCAweDFELCAweDA0LCAweEFGLCAweEY5LCAweDUxLCAweDBCLCAweEVDLCAweDQ3LAorCTB4MzMsIDB4RkQsIDB4QzEsIDB4RkYsIDB4RjcsIDB4MDAsIDB4MEMsIDB4RkYsIDB4QUEsIDB4MDAsIDB4QUQsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKKwkweDQwLCAweEZDLCAweENCLCAweDA2LCAweDZFLCAweEYzLCAweDQ5LCAweDIwLCAweEIwLCAweDNELCAweDczLAorCTB4RjMsIDB4MzEsIDB4MDUsIDB4QzQsIDB4RkQsIDB4RDYsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwgMHg3NSwgMHgwMSwgMHhCRiwKKwkweEZDLCAweEFCLCAweDA2LCAweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLCAweDJCLCAweEJGLCAweEYxLAorCTB4MkEsIDB4MDcsIDB4NDIsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgyRiwgMHgwMCwgMHgwNywgMHgwMCwgMHgyQywgMHhGRiwKKwkweEU2LCAweDAyLCAweDMxLCAweEY3LCAweEZBLCAweDQzLCAweEIzLCAweDE1LCAweDI5LCAweEY2LCAweEJDLAorCTB4MDUsIDB4QTksIDB4RkMsIDB4QzIsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMSwgMHgwMSwgMHgxMiwgMHhGRSwgMHhEMSwKKwkweDAyLCAweDQ3LCAweEZDLCAweEQ3LCAweDA0LCAweEYwLCAweDQ4LCAweDhELCAweDAyLCAweDQ1LCAweEZELAorCTB4NEQsIDB4MDIsIDB4NTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMSwgMHgwMSwgMHg4MywgMHhGQywgMHgxNiwgMHgwNiwKKwkweDUxLCAweEY1LCAweDlCLCAweDE4LCAweDc1LCAweDQyLCAweEYzLCAweEY1LCAweDlELCAweDAzLCAweEJGLAorCTB4RkUsIDB4NDUsIDB4MDAsIDB4MTEsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywgMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwKKwkweEYxLCAweDExLCAweDJFLCAweDZCLCAweDMyLCAweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLAorCTB4OTQsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjksCisJMHhGRiwgMHhFMywgMHhGRiwgMHhBMSwgMHgwMCwgMHgxRSwgMHhGRSwgMHhBMywgMHgwNCwgMHg0OSwgMHhGNCwKKwkweEE4LCAweDNGLCAweDUyLCAweDFELCAweDE5LCAweEY0LCAweDkwLCAweDA2LCAweDUzLCAweEZDLCAweEUxLAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsCisJMHhDQywgMHgwMCwgMHhDNiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhEMiwgMHhGRSwgMHgyNiwgMHhGRiwgMHg3QywKKwkweDQ4LCAweEJFLCAweDA4LCAweEFFLCAweEZBLCAweEEwLCAweDAzLCAweEE5LCAweEZELCAweDUyLCAweDAxLAorCTB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsCisJMHhGRiwgMHhBMywgMHgwMSwgMHhGMywgMHhGQywgMHgxOCwgMHgwNSwgMHg5QiwgMHhGNywgMHgyNywgMHgxMSwKKwkweDAyLCAweDQ2LCAweDdGLCAweEY5LCAweEEzLCAweDAxLCAweEU4LCAweEZGLCAweDlGLCAweEZGLCAweDYzLAorCTB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsCisJMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwgMHhGMiwKKwkweDM4LCAweDJBLCAweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LCAweEZGLAorCTB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjIsCisJMHgwMSwgMHg0NSwgMHhGRCwgMHhGMSwgMHgwNSwgMHg2RCwgMHhGMiwgMHgzOCwgMHgzQSwgMHgwMywgMHgyNSwKKwkweDhCLCAweEYyLCAweDBFLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDNBLCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4NzUsIDB4MDAsIDB4N0EsIDB4RkYsCisJMHgyQiwgMHgwMCwgMHgyRCwgMHgwMSwgMHg2MSwgMHhGQSwgMHg5NywgMHg0NiwgMHhBMCwgMHgwRiwgMHgyMCwKKwkweEY4LCAweERBLCAweDA0LCAweDEwLCAweEZELCAweDk3LCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjIsIDB4MDEsIDB4ODcsCisJMHhGRCwgMHhFNSwgMHgwMywgMHgyMSwgMHhGQSwgMHgyNSwgMHgwQSwgMHgzMywgMHg0OCwgMHgwRiwgMHhGRSwKKwkweDU3LCAweEZGLCAweDMxLCAweDAxLCAweEVDLCAweEZFLCAweEI5LCAweDAwLCAweEE3LCAweEZGLCAweDE1LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDgsIDB4RkMsCisJMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwgMHhDRiwgMHhGMywgMHhGMywKKwkweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLCAweEZGLCAweDAzLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzAsIDB4RkYsIDB4ODQsIDB4MDEsIDB4QTksIDB4RkMsIDB4QzcsCisJMHgwNiwgMHg5MSwgMHhGMSwgMHhEQywgMHgzMywgMHg4NywgMHgyQywgMHhBNSwgMHhGMSwgMHgyNiwgMHgwNywKKwkweDRCLCAweEZDLCAweEM2LCAweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LAorCTB4MDAsIDB4RTIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjMsIDB4MDAsIDB4RkEsIDB4RkUsIDB4M0EsIDB4MDMsCisJMHg5RCwgMHhGNiwgMHg1MCwgMHg0MywgMHgwMCwgMHgxNywgMHhDNiwgMHhGNSwgMHhFNiwgMHgwNSwgMHg5NywKKwkweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLAorCTB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTMsIDB4MDEsIDB4MzEsIDB4RkUsIDB4OTUsIDB4MDIsIDB4QkEsCisJMHhGQywgMHhDQiwgMHgwMywgMHhGNywgMHg0OCwgMHg5MSwgMHgwMywgMHhEMywgMHhGQywgMHg4OCwgMHgwMiwKKwkweDM4LCAweEZFLCAweDEwLCAweDAxLCAweDg1LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LAorCTB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsIDB4RkMsIDB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsCisJMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwgMHg0RCwgMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwKKwkweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAorCTB4NEQsIDB4RkYsIDB4QzQsIDB4MDEsIDB4NEQsIDB4RkMsIDB4MjUsIDB4MDcsIDB4QTEsIDB4RjEsIDB4Q0UsCisJMHgyQywgMHg5OSwgMHgzMywgMHg4RSwgMHhGMSwgMHhDRCwgMHgwNiwgMHhBNCwgMHhGQywgMHg4NywgMHgwMSwKKwkweDZFLCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ3LAorCTB4RkYsIDB4QkEsIDB4MDAsIDB4RjQsIDB4RkQsIDB4RTUsIDB4MDQsIDB4RTQsIDB4RjMsIDB4Q0EsIDB4M0UsCisJMHhBNywgMHgxRSwgMHhDQSwgMHhGMywgMHhBQywgMHgwNiwgMHg0QSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwKKwkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJELCAweDAwLAorCTB4RTUsIDB4RkUsIDB4M0UsIDB4MDEsIDB4M0YsIDB4RkYsIDB4NDEsIDB4RkUsIDB4NDEsIDB4NDgsIDB4RTQsCisJMHgwOSwgMHgzQiwgMHhGQSwgMHhEOSwgMHgwMywgMHg4RCwgMHhGRCwgMHg1RiwgMHgwMSwgMHg2NiwgMHhGRiwKKwkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LAorCTB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsIDB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsCisJMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywKKwkweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLAorCTB4MzEsIDB4RkMsIDB4MTEsIDB4MDcsIDB4N0YsIDB4RjIsIDB4NEUsIDB4MjUsIDB4RkQsIDB4MzksIDB4NjAsCisJMHhGMiwgMHhGQiwgMHgwNSwgMHgzRSwgMHhGRCwgMHgyNiwgMHgwMSwgMHhBMCwgMHhGRiwgMHgxMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDAwLCAweDk4LCAweEZGLCAweDM1LCAweDAxLCAweDI1LAorCTB4RkQsIDB4MUUsIDB4MDYsIDB4MzUsIDB4RjIsIDB4MkUsIDB4MzksIDB4NTUsIDB4MjYsIDB4NTYsIDB4RjIsCisJMHgxQSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY2LCAweDAwLCAweDk4LCAweEZGLCAweEY0LCAweEZGLAorCTB4OEUsIDB4MDEsIDB4QTcsIDB4RjksIDB4MUQsIDB4NDYsIDB4REYsIDB4MTAsIDB4QjMsIDB4RjcsIDB4MEQsCisJMHgwNSwgMHhGOCwgMHhGQywgMHhBMSwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELAorCTB4MDMsIDB4OTQsIDB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsCisJMHg2QywgMHgwMSwgMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUxLCAweEZDLCAweDk2LCAweDA2LAorCTB4MDcsIDB4RjQsIDB4OUUsIDB4MUQsIDB4NzcsIDB4M0YsIDB4MzIsIDB4RjQsIDB4QjIsIDB4MDQsIDB4MTUsCisJMHhGRSwgMHhBNywgMHgwMCwgMHhFMCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDkxLCAweDAxLCAweDk0LCAweEZDLCAweEUwLCAweDA2LCAweDg0LAorCTB4RjEsIDB4QUYsIDB4MzIsIDB4Q0EsIDB4MkQsIDB4OTIsIDB4RjEsIDB4MUYsIDB4MDcsIDB4NTYsIDB4RkMsCisJMHhCRSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNywKKwkweEZGLCAweDE0LCAweDAwLCAweDNGLCAweDAwLCAweEM5LCAweEZFLCAweDhDLCAweDAzLCAweDExLCAweEY2LAorCTB4OUUsIDB4NDIsIDB4NTAsIDB4MTgsIDB4NjYsIDB4RjUsIDB4MEQsIDB4MDYsIDB4ODYsIDB4RkMsIDB4RDAsCisJMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwKKwkweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LCAweDAyLCAweEYyLAorCTB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsIDB4MUUsIDB4MDEsCisJMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKKwkweEZGLCAweEM0LCAweDAxLCAweEE1LCAweEZDLCAweEM1LCAweDA1LCAweDEzLCAweEY2LCAweEZELCAweDE1LAorCTB4RDQsIDB4NDMsIDB4MEYsIDB4RjcsIDB4RjksIDB4MDIsIDB4MjEsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MkMsCisJMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OSwgMHhGRiwKKwkweENDLCAweDAxLCAweDQ0LCAweEZDLCAweDI5LCAweDA3LCAweEI5LCAweEYxLCAweDg5LCAweDJCLCAweEMzLAorCTB4MzQsIDB4QTAsIDB4RjEsIDB4QjEsIDB4MDYsIDB4QkEsIDB4RkMsIDB4NzksIDB4MDEsIDB4NzYsIDB4RkYsCisJMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHhDQiwgMHhGRiwgMHhEMSwKKwkweDAwLCAweENDLCAweEZELCAweDI0LCAweDA1LCAweDg3LCAweEYzLCAweEU0LCAweDNELCAweEZELCAweDFGLAorCTB4N0YsIDB4RjMsIDB4QzYsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBRSwgMHgwMCwgMHgwNSwgMHhGRiwKKwkweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELCAweEZELCAweDQ3LCAweDBFLCAweDBCLCAweEM4LAorCTB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHg4RiwgMHgwMSwgMHgyMywKKwkweEZELCAweEIyLCAweDA0LCAweDc2LCAweEY4LCAweEFBLCAweDBFLCAweEVELCAweDQ2LCAweEY3LCAweEZBLAorCTB4REYsIDB4MDAsIDB4NTcsIDB4MDAsIDB4NjIsIDB4RkYsIDB4ODAsIDB4MDAsIDB4QkQsIDB4RkYsIDB4MTAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywKKwkweDAzLCAweDA3LCAweEI3LCAweEYyLCAweEZDLCAweDIzLCAweDAzLCAweDNCLCAweDlFLCAweEYyLCAweENCLAorCTB4MDUsIDB4NUYsIDB4RkQsIDB4MTIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4RiwgMHhGRiwgMHg0NywgMHgwMSwgMHgwOCwgMHhGRCwgMHg0OSwKKwkweDA2LCAweDA1LCAweEYyLCAweDFELCAweDM4LCAweEE2LCAweDI3LCAweDI2LCAweEYyLCAweDIzLCAweDA3LAorCTB4MzMsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHhDRCwgMHhGRiwgMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwgMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwKKwkweEY1LCAweEY4LCAweDlCLCAweDQ1LCAweDIyLCAweDEyLCAweDQ4LCAweEY3LCAweDNELCAweDA1LCAweEUyLAorCTB4RkMsIDB4QUIsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyNCwgMHgwMCwgMHg2RiwgMHhGRiwgMHg0OCwgMHgwMSwgMHhDMCwgMHhGRCwgMHg3MywgMHgwMywgMHgwNywKKwkweEZCLCAweERELCAweDA3LCAweEExLCAweDQ4LCAweERELCAweEZGLCAweDdELCAweEZFLCAweEE3LCAweDAxLAorCTB4QUQsIDB4RkUsIDB4RDgsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QywgMHhGQywgMHg3OCwgMHgwNiwgMHg1QSwgMHhGNCwKKwkweDQ5LCAweDFDLCAweDRFLCAweDQwLCAweDlFLCAweEY0LCAweDZELCAweDA0LCAweDNGLCAweEZFLCAweDhFLAorCTB4MDAsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHg2MiwgMHhGRiwgMHg5RSwgMHgwMSwgMHg4MiwgMHhGQywgMHhGNSwgMHgwNiwgMHg3RCwgMHhGMSwgMHg3QiwKKwkweDMxLCAweDA5LCAweDJGLCAweDg0LCAweEYxLCAweDE1LCAweDA3LCAweDYyLCAweEZDLCAweEI0LCAweDAxLAorCTB4NTYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwgMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwKKwkweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLCAweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjUsIDB4MDAsCisJMHg2RiwgMHhGRSwgMHgxRSwgMHgwMiwgMHg5RCwgMHhGRCwgMHhDNywgMHgwMSwgMHhFMSwgMHg0OCwgMHhBQiwKKwkweDA1LCAweEVFLCAweEZCLCAweEZFLCAweDAyLCAweEZCLCAweEZELCAweDJDLCAweDAxLCAweDdBLCAweEZGLAorCTB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkMsCisJMHgwMSwgMHhCOCwgMHhGQywgMHg5QSwgMHgwNSwgMHg3NywgMHhGNiwgMHhCMSwgMHgxNCwgMHg3NywgMHg0NCwKKwkweEE5LCAweEY3LCAweEEyLCAweDAyLCAweDU0LCAweEZGLCAweEYxLCAweEZGLCAweDNBLCAweDAwLCAweEQ4LAorCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4RkYsIDB4RDMsIDB4MDEsCisJMHgzQywgMHhGQywgMHgyQSwgMHgwNywgMHhEOCwgMHhGMSwgMHgzRiwgMHgyQSwgMHhFNiwgMHgzNSwgMHhCQiwKKwkweEYxLCAweDkyLCAweDA2LCAweEQyLCAweEZDLCAweDY5LCAweDAxLCAweDdFLCAweEZGLCAweDFGLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4RTgsIDB4MDAsIDB4QTYsCisJMHhGRCwgMHg1RiwgMHgwNSwgMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwgMHgyMSwgMHgzNywgMHhGMywKKwkweERELCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjQsIDB4RkYsIDB4QzksIDB4MDAsCisJMHgxMywgMHgwMCwgMHg4RCwgMHhGQywgMHhBRSwgMHg0NywgMHgzRSwgMHgwQywgMHg1NiwgMHhGOSwgMHg0OCwKKwkweDA0LCAweDU2LCAweEZELCAweDc4LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODMsIDB4MDEsIDB4M0MsIDB4RkQsIDB4N0UsCisJMHgwNCwgMHhFNiwgMHhGOCwgMHg3MiwgMHgwRCwgMHg1MiwgMHg0NywgMHhCRSwgMHhGQiwgMHg3QSwgMHgwMCwKKwkweDkwLCAweDAwLCAweDQzLCAweEZGLCAweDhGLCAweDAwLCAweEI3LCAweEZGLCAweDExLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RjEsIDB4MDYsCisJMHhGNSwgMHhGMiwgMHhBNywgMHgyMiwgMHhGRiwgMHgzQiwgMHhFNCwgMHhGMiwgMHg5NiwgMHgwNSwgMHg4MSwKKwkweEZELCAweEZELCAweDAwLCAweEI1LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLAorCTB4MUMsIDB4MDAsIDB4ODYsIDB4RkYsIDB4NTksIDB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsCisJMHhGMSwgMHgwNCwgMHgzNywgMHhGMywgMHgyOCwgMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywKKwkweEQ4LCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQzLAorCTB4RkYsIDB4NDksIDB4MDAsIDB4RDQsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NDksIDB4MDIsIDB4NEIsIDB4RjgsCisJMHgwRCwgMHg0NSwgMHg2OCwgMHgxMywgMHhERiwgMHhGNiwgMHg2QywgMHgwNSwgMHhDQywgMHhGQywgMHhCNCwKKwkweDAxLCAweDQ1LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAorCTB4NzQsIDB4RkYsIDB4M0EsIDB4MDEsIDB4REQsIDB4RkQsIDB4MzksIDB4MDMsIDB4N0IsIDB4RkIsIDB4QzEsCisJMHgwNiwgMHhDNywgMHg0OCwgMHhDRiwgMHgwMCwgMHgwRCwgMHhGRSwgMHhFMywgMHgwMSwgMHg4RSwgMHhGRSwKKwkweEU3LCAweDAwLCAweDk1LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAorCTB4RkYsIDB4REEsIDB4MDEsIDB4NjksIDB4RkMsIDB4NTcsIDB4MDYsIDB4QUYsIDB4RjQsIDB4RjUsIDB4MUEsCisJMHgxRCwgMHg0MSwgMHgxMSwgMHhGNSwgMHgyNSwgMHgwNCwgMHg2QywgMHhGRSwgMHg3NCwgMHgwMCwgMHhGOSwKKwkweEZGLCAweEYxLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLAorCTB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsCisJMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwKKwkweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYxLCAweEZGLCAweEY5LCAweEZGLCAweDc0LAorCTB4MDAsIDB4NkMsIDB4RkUsIDB4MjUsIDB4MDQsIDB4MTEsIDB4RjUsIDB4MUQsIDB4NDEsIDB4RjUsIDB4MUEsCisJMHhBRiwgMHhGNCwgMHg1NywgMHgwNiwgMHg2OSwgMHhGQywgMHhEQSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU3LCAweDAwLCAweDhFLCAweEZFLAorCTB4RTMsIDB4MDEsIDB4MEQsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4QzcsIDB4NDgsIDB4QzEsIDB4MDYsIDB4N0IsCisJMHhGQiwgMHgzOSwgMHgwMywgMHhERCwgMHhGRCwgMHgzQSwgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMywgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLCAweEI0LCAweDAxLCAweENDLAorCTB4RkMsIDB4NkMsIDB4MDUsIDB4REYsIDB4RjYsIDB4NjgsIDB4MTMsIDB4MEQsIDB4NDUsIDB4NEIsIDB4RjgsCisJMHg0OSwgMHgwMiwgMHg4OCwgMHhGRiwgMHhENCwgMHhGRiwgMHg0OSwgMHgwMCwgMHhEMywgMHhGRiwgMHgwQiwKKwkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LCAweDAxLCAweDM3LCAweEZDLAorCTB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsIDB4REMsIDB4RjEsIDB4NkYsCisJMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEI1LCAweEZGLCAweEZELCAweDAwLCAweDgxLCAweEZELCAweDk2LAorCTB4MDUsIDB4RTQsIDB4RjIsIDB4RkYsIDB4M0IsIDB4QTcsIDB4MjIsIDB4RjUsIDB4RjIsIDB4RjEsIDB4MDYsCisJMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwKKwkweDAwLCAweEI3LCAweEZGLCAweDhGLCAweDAwLCAweDQzLCAweEZGLCAweDkwLCAweDAwLCAweDdBLCAweDAwLAorCTB4QkUsIDB4RkIsIDB4NTIsIDB4NDcsIDB4NzIsIDB4MEQsIDB4RTYsIDB4RjgsIDB4N0UsIDB4MDQsIDB4M0MsCisJMHhGRCwgMHg4MywgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc4LCAweDAxLCAweDU2LCAweEZELCAweDQ4LCAweDA0LCAweDU2LAorCTB4RjksIDB4M0UsIDB4MEMsIDB4QUUsIDB4NDcsIDB4OEQsIDB4RkMsIDB4MTMsIDB4MDAsIDB4QzksIDB4MDAsCisJMHgyNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLCAweEZDLCAweERELCAweDA2LCAweDM3LCAweEYzLAorCTB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsIDB4NUYsIDB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsCisJMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwKKwkweDdFLCAweEZGLCAweDY5LCAweDAxLCAweEQyLCAweEZDLCAweDkyLCAweDA2LCAweEJCLCAweEYxLCAweEU2LAorCTB4MzUsIDB4M0YsIDB4MkEsIDB4RDgsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsCisJMHg0NSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgzQSwKKwkweDAwLCAweEYxLCAweEZGLCAweDU0LCAweEZGLCAweEEyLCAweDAyLCAweEE5LCAweEY3LCAweDc3LCAweDQ0LAorCTB4QjEsIDB4MTQsIDB4NzcsIDB4RjYsIDB4OUEsIDB4MDUsIDB4QjgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NDIsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwKKwkweDJDLCAweDAxLCAweEZCLCAweEZELCAweEZFLCAweDAyLCAweEVFLCAweEZCLCAweEFCLCAweDA1LCAweEUxLAorCTB4NDgsIDB4QzcsIDB4MDEsIDB4OUQsIDB4RkQsIDB4MUUsIDB4MDIsIDB4NkYsIDB4RkUsIDB4RjUsIDB4MDAsCisJMHg4RiwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwKKwkweDAxLCAweDc3LCAweEZDLCAweDMzLCAweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLAorCTB4OEQsIDB4RjUsIDB4REEsIDB4MDMsIDB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwgMHhCNCwgMHgwMSwKKwkweDYyLCAweEZDLCAweDE1LCAweDA3LCAweDg0LCAweEYxLCAweDA5LCAweDJGLCAweDdCLCAweDMxLCAweDdELAorCTB4RjEsIDB4RjUsIDB4MDYsIDB4ODIsIDB4RkMsIDB4OUUsIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg4RSwgMHgwMCwgMHgzRiwKKwkweEZFLCAweDZELCAweDA0LCAweDlFLCAweEY0LCAweDRFLCAweDQwLCAweDQ5LCAweDFDLCAweDVBLCAweEY0LAorCTB4NzgsIDB4MDYsIDB4NUMsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxOCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhEOCwgMHgwMCwgMHhBRCwgMHhGRSwgMHhBNywgMHgwMSwKKwkweDdELCAweEZFLCAweERELCAweEZGLCAweEExLCAweDQ4LCAweERELCAweDA3LCAweDA3LCAweEZCLCAweDczLAorCTB4MDMsIDB4QzAsIDB4RkQsIDB4NDgsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwKKwkweDA1LCAweDQ4LCAweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLAorCTB4QkUsIDB4RkYsIDB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERCwgMHgwMSwgMHgzMywgMHhGQywgMHgyMywgMHgwNywKKwkweDI2LCAweEYyLCAweEE2LCAweDI3LCAweDFELCAweDM4LCAweDA1LCAweEYyLCAweDQ5LCAweDA2LCAweDA4LAorCTB4RkQsIDB4NDcsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgwRSwgMHgwMCwgMHhBQSwgMHhGRiwgMHgxMiwgMHgwMSwgMHg1RiwgMHhGRCwgMHhDQiwgMHgwNSwgMHg5RSwKKwkweEYyLCAweDAzLCAweDNCLCAweEZDLCAweDIzLCAweEI3LCAweEYyLCAweDAzLCAweDA3LCAweDMzLCAweEZDLAorCTB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkQsCisJMHhGRiwgMHg4MCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg1NywgMHgwMCwgMHhERiwgMHgwMCwgMHhGNywgMHhGQSwKKwkweEVELCAweDQ2LCAweEFBLCAweDBFLCAweDc2LCAweEY4LCAweEIyLCAweDA0LCAweDIzLCAweEZELCAweDhGLAorCTB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCisJMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwgMHhGOSwgMHgwRSwKKwkweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLCAweDA1LCAweEZGLAorCTB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCisJMHhGRiwgMHhFNSwgMHgwMSwgMHg0MSwgMHhGQywgMHhDNiwgMHgwNiwgMHg3RiwgMHhGMywgMHhGRCwgMHgxRiwKKwkweEU0LCAweDNELCAweDg3LCAweEYzLCAweDI0LCAweDA1LCAweENDLCAweEZELCAweEQxLCAweDAwLCAweENCLAorCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzYsIDB4RkYsCisJMHg3OSwgMHgwMSwgMHhCQSwgMHhGQywgMHhCMSwgMHgwNiwgMHhBMCwgMHhGMSwgMHhDMywgMHgzNCwgMHg4OSwKKwkweDJCLCAweEI5LCAweEYxLCAweDI5LCAweDA3LCAweDQ0LCAweEZDLCAweENDLCAweDAxLCAweDQ5LCAweEZGLAorCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4MEQsCisJMHgwMCwgMHgyMSwgMHhGRiwgMHhGOSwgMHgwMiwgMHgwRiwgMHhGNywgMHhENCwgMHg0MywgMHhGRCwgMHgxNSwKKwkweDEzLCAweEY2LCAweEM1LCAweDA1LCAweEE1LCAweEZDLCAweEM0LCAweDAxLCAweDQwLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDEsCisJMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywgMHg5QiwgMHgwNCwgMHhGMiwgMHg0OCwgMHhDNiwKKwkweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLCAweEZFLCAweDA0LCAweDAxLCAweDhBLCAweEZGLAorCTB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDAsIDB4MDEsIDB4ODYsCisJMHhGQywgMHgwRCwgMHgwNiwgMHg2NiwgMHhGNSwgMHg1MCwgMHgxOCwgMHg5RSwgMHg0MiwgMHgxMSwgMHhGNiwKKwkweDhDLCAweDAzLCAweEM5LCAweEZFLCAweDNGLCAweDAwLCAweDE0LCAweDAwLCAweEU3LCAweEZGLCAweDA3LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkUsIDB4MDEsIDB4NTYsIDB4RkMsCisJMHgxRiwgMHgwNywgMHg5MiwgMHhGMSwgMHhDQSwgMHgyRCwgMHhBRiwgMHgzMiwgMHg4NCwgMHhGMSwgMHhFMCwKKwkweDA2LCAweDk0LCAweEZDLCAweDkxLCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLAorCTB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTAsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTUsIDB4RkUsIDB4QjIsCisJMHgwNCwgMHgzMiwgMHhGNCwgMHg3NywgMHgzRiwgMHg5RSwgMHgxRCwgMHgwNywgMHhGNCwgMHg5NiwgMHgwNiwKKwkweDUxLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LAorCTB4MDAsIDB4QTEsIDB4RkYsIDB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsIDB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsCisJMHhGMywgMHhGRSwgMHg3MCwgMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwgMHhGQSwgMHhBRCwgMHgwMywgMHhBMywKKwkweEZELCAweDU1LCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MEQsIDB4MDUsIDB4QjMsCisJMHhGNywgMHhERiwgMHgxMCwgMHgxRCwgMHg0NiwgMHhBNywgMHhGOSwgMHg4RSwgMHgwMSwgMHhGNCwgMHhGRiwKKwkweDk4LCAweEZGLCAweDY2LCAweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LAorCTB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MUEsIDB4MDcsIDB4NTYsIDB4RjIsCisJMHg1NSwgMHgyNiwgMHgyRSwgMHgzOSwgMHgzNSwgMHhGMiwgMHgxRSwgMHgwNiwgMHgyNSwgMHhGRCwgMHgzNSwKKwkweDAxLCAweDk4LCAweEZGLCAweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAorCTB4QTAsIDB4RkYsIDB4MjYsIDB4MDEsIDB4M0UsIDB4RkQsIDB4RkIsIDB4MDUsIDB4NjAsIDB4RjIsIDB4RkQsCisJMHgzOSwgMHg0RSwgMHgyNSwgMHg3RiwgMHhGMiwgMHgxMSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwKKwkweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLAorCTB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsCisJMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwgMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwKKwkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLAorCTB4NUYsIDB4MDEsIDB4OEQsIDB4RkQsIDB4RDksIDB4MDMsIDB4M0IsIDB4RkEsIDB4RTQsIDB4MDksIDB4NDEsCisJMHg0OCwgMHg0MSwgMHhGRSwgMHgzRiwgMHhGRiwgMHgzRSwgMHgwMSwgMHhFNSwgMHhGRSwgMHhCRCwgMHgwMCwKKwkweEE2LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAorCTB4MDEsIDB4NEEsIDB4RkMsIDB4QUMsIDB4MDYsIDB4Q0EsIDB4RjMsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4M0UsCisJMHhFNCwgMHhGMywgMHhFNSwgMHgwNCwgMHhGNCwgMHhGRCwgMHhCQSwgMHgwMCwgMHhENywgMHhGRiwgMHhGRSwKKwkweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDg3LCAweDAxLAorCTB4QTQsIDB4RkMsIDB4Q0QsIDB4MDYsIDB4OEUsIDB4RjEsIDB4OTksIDB4MzMsIDB4Q0UsIDB4MkMsIDB4QTEsCisJMHhGMSwgMHgyNSwgMHgwNywgMHg0RCwgMHhGQywgMHhDNCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLCAweDJBLCAweDAwLCAweEVGLAorCTB4RkUsIDB4NEQsIDB4MDMsIDB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsIDB4MTcsIDB4QjAsIDB4RjUsCisJMHhFRiwgMHgwNSwgMHg5MywgMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDFFLCAweDAwLCAweDg1LCAweEZGLCAweDEwLCAweDAxLCAweDM4LCAweEZFLCAweDg4LCAweDAyLAorCTB4RDMsIDB4RkMsIDB4OTEsIDB4MDMsIDB4RjcsIDB4NDgsIDB4Q0IsIDB4MDMsIDB4QkEsIDB4RkMsIDB4OTUsCisJMHgwMiwgMHgzMSwgMHhGRSwgMHgxMywgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk3LCAweEZDLCAweEU2LAorCTB4MDUsIDB4QzYsIDB4RjUsIDB4MDAsIDB4MTcsIDB4NTAsIDB4NDMsIDB4OUQsIDB4RjYsIDB4M0EsIDB4MDMsCisJMHhGQSwgMHhGRSwgMHgyMywgMHgwMCwgMHgyMSwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDMwLCAweDAwLCAweDRDLCAweEZGLCAweEM2LCAweDAxLCAweDRCLCAweEZDLCAweDI2LCAweDA3LAorCTB4QTUsIDB4RjEsIDB4ODcsIDB4MkMsIDB4REMsIDB4MzMsIDB4OTEsIDB4RjEsIDB4QzcsIDB4MDYsIDB4QTksCisJMHhGQywgMHg4NCwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwKKwkweEZGLCAweEZGLCAweEQ0LCAweEZGLCAweEJGLCAweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLAorCTB4RjMsIDB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsIDB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsCisJMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBNywKKwkweEZGLCAweEI5LCAweDAwLCAweEVDLCAweEZFLCAweDMxLCAweDAxLCAweDU3LCAweEZGLCAweDBGLCAweEZFLAorCTB4MzMsIDB4NDgsIDB4MjUsIDB4MEEsIDB4MjEsIDB4RkEsIDB4RTUsIDB4MDMsIDB4ODcsIDB4RkQsIDB4NjIsCisJMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKKwkweDUwLCAweEZGLCAweDk3LCAweDAxLCAweDEwLCAweEZELCAweERBLCAweDA0LCAweDIwLCAweEY4LCAweEEwLAorCTB4MEYsIDB4OTcsIDB4NDYsIDB4NjEsIDB4RkEsIDB4MkQsIDB4MDEsIDB4MkIsIDB4MDAsIDB4N0EsIDB4RkYsCisJMHg3NSwgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwKKwkweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBFLCAweDA3LCAweDhCLCAweEYyLCAweDAzLCAweDI1LAorCTB4MzgsIDB4M0EsIDB4NkQsIDB4RjIsIDB4RjEsIDB4MDUsIDB4NDUsIDB4RkQsIDB4MjIsIDB4MDEsIDB4QTIsCisJMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwgMHhGRiwKKwkweDM5LCAweDAxLCAweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LCAweEEwLAorCTB4MjYsIDB4NEIsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MywgMHgwMCwgMHg5RiwKKwkweEZGLCAweEU4LCAweEZGLCAweEEzLCAweDAxLCAweDdGLCAweEY5LCAweDAyLCAweDQ2LCAweDI3LCAweDExLAorCTB4OUIsIDB4RjcsIDB4MTgsIDB4MDUsIDB4RjMsIDB4RkMsIDB4QTMsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwgMHg1MiwgMHgwMSwKKwkweEE5LCAweEZELCAweEEwLCAweDAzLCAweEFFLCAweEZBLCAweEJFLCAweDA4LCAweDdDLCAweDQ4LCAweDI2LAorCTB4RkYsIDB4RDIsIDB4RkUsIDB4NzksIDB4MDEsIDB4QzYsIDB4RkUsIDB4Q0MsIDB4MDAsIDB4QTAsIDB4RkYsCisJMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MywKKwkweEZDLCAweDkwLCAweDA2LCAweDE5LCAweEY0LCAweDUyLCAweDFELCAweEE4LCAweDNGLCAweDQ5LCAweEY0LAorCTB4QTMsIDB4MDQsIDB4MUUsIDB4RkUsIDB4QTEsIDB4MDAsIDB4RTMsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwgMHgwMSwgMHg5MCwgMHhGQywKKwkweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLCAweDhFLCAweEYxLCAweDFELAorCTB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg0NSwgMHgwMCwgMHhCRiwgMHhGRSwgMHg5RCwKKwkweDAzLCAweEYzLCAweEY1LCAweDc1LCAweDQyLCAweDlCLCAweDE4LCAweDUxLCAweEY1LCAweDE2LCAweDA2LAorCTB4ODMsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHgwMSwgMHgwMSwgMHg1NiwgMHhGRSwgMHg0RCwgMHgwMiwgMHg0NSwgMHhGRCwKKwkweDhELCAweDAyLCAweEYwLCAweDQ4LCAweEQ3LCAweDA0LCAweDQ3LCAweEZDLCAweEQxLCAweDAyLCAweDEyLAorCTB4RkUsIDB4MjEsIDB4MDEsIDB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMiwgMHgwMSwgMHhBOSwgMHhGQywgMHhCQywgMHgwNSwgMHgyOSwKKwkweEY2LCAweEIzLCAweDE1LCAweEZBLCAweDQzLCAweDMxLCAweEY3LCAweEU2LCAweDAyLCAweDJDLCAweEZGLAorCTB4MDcsIDB4MDAsIDB4MkYsIDB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsCisJMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwgMHhGQywgMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwKKwkweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLCAweEFCLCAweDA2LCAweEJGLCAweEZDLCAweDc1LAorCTB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsCisJMHhDOCwgMHhGRiwgMHhENiwgMHgwMCwgMHhDNCwgMHhGRCwgMHgzMSwgMHgwNSwgMHg3MywgMHhGMywgMHhCMCwKKwkweDNELCAweDQ5LCAweDIwLCAweDZFLCAweEYzLCAweENCLCAweDA2LCAweDQwLCAweEZDLCAweEU2LCAweDAxLAorCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QUEsCisJMHgwMCwgMHgwQywgMHhGRiwgMHhGNywgMHgwMCwgMHhDMSwgMHhGRiwgMHgzMywgMHhGRCwgMHhFQywgMHg0NywKKwkweDUxLCAweDBCLCAweEFGLCAweEY5LCAweDFELCAweDA0LCAweDZCLCAweEZELCAweDZFLCAweDAxLCAweDYwLAorCTB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsCisJMHg4QywgMHgwMSwgMHgyOSwgMHhGRCwgMHhBNywgMHgwNCwgMHg4RiwgMHhGOCwgMHg2NCwgMHgwRSwgMHgwMiwKKwkweDQ3LCAweDIyLCAweEZCLCAweEM5LCAweDAwLCAweDY0LCAweDAwLCAweDVCLCAweEZGLCAweDg0LCAweDAwLAorCTB4QkMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsCisJMHgwMSwgMHgzMywgMHhGQywgMHhGRiwgMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwKKwkweEFELCAweEYyLCAweEJGLCAweDA1LCAweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEQsIDB4RkYsIDB4NEIsIDB4MDEsCisJMHgwMSwgMHhGRCwgMHg1MSwgMHgwNiwgMHhGQiwgMHhGMSwgMHhERiwgMHgzNywgMHhGMCwgMHgyNywgMHgxQywKKwkweEYyLCAweDI0LCAweDA3LCAweDM0LCAweEZDLCAweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4NTQsIDB4MDAsIDB4QkQsIDB4RkYsIDB4QjIsCisJMHhGRiwgMHgwMSwgMHgwMiwgMHhDRiwgMHhGOCwgMHg3RCwgMHg0NSwgMHg2QiwgMHgxMiwgMHgzMCwgMHhGNywKKwkweDQ4LCAweDA1LCAweERELCAweEZDLCAweEFELCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4NDUsIDB4MDEsIDB4QzYsIDB4RkQsCisJMHg2NiwgMHgwMywgMHgyMSwgMHhGQiwgMHg5RSwgMHgwNywgMHhBQSwgMHg0OCwgMHgxMiwgMHgwMCwgMHg2NCwKKwkweEZFLCAweEI0LCAweDAxLCAweEE2LCAweEZFLCAweERCLCAweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsCisJMHgwNiwgMHg2QywgMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwKKwkweDQ5LCAweEZFLCAweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZELAorCTB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4QTEsIDB4MDEsIDB4N0UsIDB4RkMsIDB4RjksIDB4MDYsCisJMHg3QywgMHhGMSwgMHgzOCwgMHgzMSwgMHg1MCwgMHgyRiwgMHg4MiwgMHhGMSwgMHgxMiwgMHgwNywgMHg2NSwKKwkweEZDLCAweEIyLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLAorCTB4RUQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4OTAsIDB4RkUsIDB4RUIsIDB4MDMsIDB4NzEsCisJMHhGNSwgMHhCNywgMHg0MSwgMHhFRCwgMHgxOSwgMHhGNSwgMHhGNCwgMHgzQiwgMHgwNiwgMHg3MywgMHhGQywKKwkweEQ3LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkxLAorCTB4RkYsIDB4RjIsIDB4MDAsIDB4NzYsIDB4RkUsIDB4MTEsIDB4MDIsIDB4QjYsIDB4RkQsIDB4OEYsIDB4MDEsCisJMHhERSwgMHg0OCwgMHhFOSwgMHgwNSwgMHhENCwgMHhGQiwgMHgwQywgMHgwMywgMHhGNCwgMHhGRCwgMHgyRiwKKwkweDAxLCAweDc5LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAorCTB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsIDB4RjYsIDB4NjgsCisJMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwgMHhFQSwgMHhGRiwKKwkweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LAorCTB4RkYsIDB4RDQsIDB4MDEsIDB4M0IsIDB4RkMsIDB4MkEsIDB4MDcsIDB4REYsIDB4RjEsIDB4RjYsIDB4MjksCisJMHgyNywgMHgzNiwgMHhDMSwgMHhGMSwgMHg4QiwgMHgwNiwgMHhEOCwgMHhGQywgMHg2NiwgMHgwMSwgMHg4MCwKKwkweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEJELCAweEZGLAorCTB4RUQsIDB4MDAsIDB4OUUsIDB4RkQsIDB4NkMsIDB4MDUsIDB4MUYsIDB4RjMsIDB4QzAsIDB4M0MsIDB4OUUsCisJMHgyMSwgMHgyOCwgMHhGMywgMHhFMiwgMHgwNiwgMHgzQSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDlCLCAweDAwLCAweDJCLAorCTB4RkYsIDB4QkQsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUUsIDB4RkMsIDB4OUEsIDB4NDcsIDB4ODIsIDB4MEMsCisJMHgzRCwgMHhGOSwgMHg1NCwgMHgwNCwgMHg1MCwgMHhGRCwgMHg3QSwgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweDgxLCAweDAxLAorCTB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsIDB4MkQsIDB4MEQsIDB4NjksIDB4NDcsIDB4RUIsCisJMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywgMHhGRiwgMHg5MywgMHgwMCwgMHhCNiwgMHhGRiwKKwkweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM3LAorCTB4RkMsIDB4RUQsIDB4MDYsIDB4MDMsIDB4RjMsIDB4NUIsIDB4MjIsIDB4MzcsIDB4M0MsIDB4RjQsIDB4RjIsCisJMHg4QSwgMHgwNSwgMHg4OSwgMHhGRCwgMHhGOSwgMHgwMCwgMHhCNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwKKwkweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg0LCAweEZGLCAweDVDLCAweDAxLCAweEU2LCAweEZDLAorCTB4NzcsIDB4MDYsIDB4RDQsIDB4RjEsIDB4QzYsIDB4MzYsIDB4M0UsIDB4MjksIDB4RjMsIDB4RjEsIDB4MjksCisJMHgwNywgMHgzOCwgMHhGQywgMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDBCLCAweDAwLCAweEQ0LCAweEZGLCAweDQ2LCAweDAwLCAweERBLCAweEZGLCAweDdELCAweEZGLCAweDVELAorCTB4MDIsIDB4MjYsIDB4RjgsIDB4RUQsIDB4NDQsIDB4QjEsIDB4MTMsIDB4QzcsIDB4RjYsIDB4NzcsIDB4MDUsCisJMHhDOCwgMHhGQywgMHhCNiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDIyLCAweDAwLCAweDc2LCAweEZGLCAweDM3LCAweDAxLCAweEU0LCAweEZELCAweDJDLCAweDAzLAorCTB4OTQsIDB4RkIsIDB4ODMsIDB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsIDB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsCisJMHgwMSwgMHg4NywgMHhGRSwgMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDM1LCAweDAwLCAweDM4LCAweEZGLCAweEQ5LCAweDAxLCAweDZDLCAweEZDLCAweDRGLCAweDA2LCAweEMzLAorCTB4RjQsIDB4QTksIDB4MUEsIDB4NDksIDB4NDEsIDB4MkMsIDB4RjUsIDB4MTUsIDB4MDQsIDB4NzYsIDB4RkUsCisJMHg2RSwgMHgwMCwgMHhGQywgMHhGRiwgMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwKKwkweDAwLCAweDVBLCAweEZGLCAweEFDLCAweDAxLCAweDZFLCAweEZDLCAweDBBLCAweDA3LCAweDdFLCAweEYxLAorCTB4RkYsIDB4MkYsIDB4OEEsIDB4MzAsIDB4N0QsIDB4RjEsIDB4MDMsIDB4MDcsIDB4NzUsIDB4RkMsIDB4QTcsCisJMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwKKwkweEY3LCAweEZGLCAweDdBLCAweDAwLCAweDYyLCAweEZFLCAweDM1LCAweDA0LCAweEY3LCAweEY0LCAweEVGLAorCTB4NDAsIDB4NDAsIDB4MUIsIDB4OUMsIDB4RjQsIDB4NUUsIDB4MDYsIDB4NjYsIDB4RkMsIDB4REIsIDB4MDEsCisJMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywKKwkweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLCAweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LAorCTB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsIDB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsCisJMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwKKwkweEIyLCAweDAxLCAweEQxLCAweEZDLCAweDYyLCAweDA1LCAweEY2LCAweEY2LCAweDIwLCAweDEzLCAweDJFLAorCTB4NDUsIDB4NzAsIDB4RjgsIDB4MzQsIDB4MDIsIDB4OTQsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4NEMsIDB4MDAsCisJMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEQSwKKwkweDAxLCAweDM2LCAweEZDLCAweDI3LCAweDA3LCAweDA1LCAweEYyLCAweEFBLCAweDI4LCAweDQ0LCAweDM3LAorCTB4RTQsIDB4RjEsIDB4NjcsIDB4MDYsIDB4RjIsIDB4RkMsIDB4NTUsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCMiwgMHhGRiwgMHgwMiwgMHgwMSwKKwkweDdBLCAweEZELCAweEEyLCAweDA1LCAweEQ0LCAweEYyLCAweEM3LCAweDNCLCAweEYyLCAweDIyLCAweEU3LAorCTB4RjIsIDB4RjUsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4MywKKwkweDAwLCAweDkxLCAweDAwLCAweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LCAweDBELCAweENELCAweEY4LAorCTB4ODksIDB4MDQsIDB4MzYsIDB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHg3NSwgMHgwMSwgMHg1QywgMHhGRCwKKwkweDNDLCAweDA0LCAweDcwLCAweEY5LCAweEZBLCAweDBCLCAweEMwLCAweDQ3LCAweEJDLCAweEZDLCAweEZDLAorCTB4RkYsIDB4RDYsIDB4MDAsIDB4MUQsIDB4RkYsIDB4QTIsIDB4MDAsIDB4QjAsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQywgMHhGQywgMHhEOCwKKwkweDA2LCAweDQ3LCAweEYzLCAweDA2LCAweDIxLCAweDJBLCAweDNELCAweDQ0LCAweEYzLCAweDUyLCAweDA1LAorCTB4QUUsIDB4RkQsIDB4RTMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxRiwgMHgwMCwgMHg3QywgMHhGRiwgMHg2RCwgMHgwMSwgMHhDRCwgMHhGQywgMHg5OSwgMHgwNiwKKwkweEI0LCAweEYxLCAweEE2LCAweDM1LCAweDg5LCAweDJBLCAweEQwLCAweEYxLCAweDJCLCAweDA3LCAweDNFLAorCTB4RkMsIDB4RDEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsCisJMHhEOSwgMHhGRiwgMHgzNywgMHgwMCwgMHhGNywgMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwKKwkweEY3LCAweDUzLCAweDQ0LCAweEZCLCAweDE0LCAweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLAorCTB4QkUsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsCisJMHgwMCwgMHg3QiwgMHhGRiwgMHgyOSwgMHgwMSwgMHgwMSwgMHhGRSwgMHhGMSwgMHgwMiwgMHgwNywgMHhGQywKKwkweDZFLCAweDA1LCAweEU2LCAweDQ4LCAweEZGLCAweDAxLCAweDg0LCAweEZELCAweDJDLCAweDAyLCAweDY4LAorCTB4RkUsIDB4RjksIDB4MDAsIDB4OEUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHgzQSwgMHhGRiwgMHhENCwgMHgwMSwgMHg3QSwgMHhGQywgMHgyQiwgMHgwNiwgMHgxRSwgMHhGNSwgMHg1NiwKKwkweDE5LCAweDBDLCAweDQyLCAweEFBLCAweEY1LCAweEM5LCAweDAzLCAweEE0LCAweEZFLCAweDU0LCAweDAwLAorCTB4MDksIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTUsCisJMHhGRiwgMHhCNiwgMHgwMSwgMHg1RiwgMHhGQywgMHgxNywgMHgwNywgMHg4NywgMHhGMSwgMHhDMiwgMHgyRSwKKwkweEMwLCAweDMxLCAweDdFLCAweEYxLCAweEYxLCAweDA2LCAweDg2LCAweEZDLCAweDlCLCAweDAxLCAweDYzLAorCTB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsCisJMHg5MywgMHgwMCwgMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwgMHg5NCwKKwkweDFDLCAweDQ3LCAweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QjQsCisJMHhGRSwgMHg5QSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhBOCwgMHhGRiwgMHg5OCwgMHg0OCwgMHgxRCwgMHgwOCwKKwkweEVFLCAweEZBLCAweDgwLCAweDAzLCAweEI5LCAweEZELCAweDRCLCAweDAxLCAweDZFLCAweEZGLCAweDI1LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTksIDB4MDEsCisJMHhFNywgMHhGQywgMHgzMywgMHgwNSwgMHg2MCwgMHhGNywgMHhEQSwgMHgxMSwgMHhCOCwgMHg0NSwgMHgxQywKKwkweEY5LCAweEQ4LCAweDAxLCAweENBLCAweEZGLCAweEFGLCAweEZGLCAweDVBLCAweDAwLCAweENDLCAweEZGLAorCTB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsCisJMHhGQywgMHgyMSwgMHgwNywgMHgzMCwgMHhGMiwgMHg1QywgMHgyNywgMHg1QiwgMHgzOCwgMHgwRiwgMHhGMiwKKwkweDQwLCAweDA2LCAweDBFLCAweEZELCAweDQzLCAweDAxLCAweDkxLCAweEZGLCAweDE4LCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsIDB4MDEsIDB4NTcsIDB4RkQsCisJMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwgMHhBQSwgMHhGMiwgMHgwNiwKKwkweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NjksIDB4RkYsIDB4NEIsIDB4MDAsIDB4RjYsCisJMHgwMCwgMHhDQiwgMHhGQSwgMHhEMywgMHg0NiwgMHhGMCwgMHgwRSwgMHg1RSwgMHhGOCwgMHhCRSwgMHgwNCwKKwkweDFFLCAweEZELCAweDkxLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NjksIDB4MDEsIDB4NzcsIDB4RkQsIDB4MDQsIDB4MDQsCisJMHhFMiwgMHhGOSwgMHhDQiwgMHgwQSwgMHgwRCwgMHg0OCwgMHg5NCwgMHhGRCwgMHg5MiwgMHhGRiwgMHgxMCwKKwkweDAxLCAweEZFLCAweEZFLCAweEIxLCAweDAwLCAweEFBLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDMsIDB4RkMsIDB4QzAsIDB4MDYsIDB4OEYsCisJMHhGMywgMHhCMSwgMHgxRiwgMHgxOCwgMHgzRSwgMHg5QiwgMHhGMywgMHgxNiwgMHgwNSwgMHhENSwgMHhGRCwKKwkweENDLCAweDAwLCAweENFLCAweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLAorCTB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsIDB4RkMsIDB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsCisJMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwgMHgyOSwgMHgwNywgMHg0NiwgMHhGQywgMHhDQSwKKwkweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERGLCAweEZGLAorCTB4MjksIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4RUUsIDB4RjYsIDB4QjAsCisJMHg0MywgMHg0NywgMHgxNiwgMHhGQywgMHhGNSwgMHhDRiwgMHgwNSwgMHhBMSwgMHhGQywgMHhDNiwgMHgwMSwKKwkweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLAorCTB4RkYsIDB4MUIsIDB4MDEsIDB4MjAsIDB4RkUsIDB4QjYsIDB4MDIsIDB4N0EsIDB4RkMsIDB4NUYsIDB4MDQsCisJMHhGNCwgMHg0OCwgMHhGRiwgMHgwMiwgMHgxMywgMHhGRCwgMHg2NywgMHgwMiwgMHg0OSwgMHhGRSwgMHgwNywKKwkweDAxLCAweDg4LCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLAorCTB4Q0YsIDB4MDEsIDB4OEEsIDB4RkMsIDB4MDUsIDB4MDYsIDB4N0IsIDB4RjUsIDB4MDYsIDB4MTgsIDB4QzcsCisJMHg0MiwgMHgyRiwgMHhGNiwgMHg3QSwgMHgwMywgMHhENCwgMHhGRSwgMHgzOSwgMHgwMCwgMHgxNywgMHgwMCwKKwkweEU2LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLAorCTB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsIDB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsCisJMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwgMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwKKwkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERFLCAweEZGLCAweEFDLCAweDAwLAorCTB4MEIsIDB4RkUsIDB4QzEsIDB4MDQsIDB4MUIsIDB4RjQsIDB4NDcsIDB4M0YsIDB4RUEsIDB4MUQsIDB4RjUsCisJMHhGMywgMHg5QywgMHgwNiwgMHg0RiwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEEyLCAweEZGLCAweEM1LCAweDAwLCAweEQ0LCAweEZFLCAweDVGLAorCTB4MDEsIDB4MDMsIDB4RkYsIDB4QkYsIDB4RkUsIDB4NjMsIDB4NDgsIDB4NDAsIDB4MDksIDB4N0IsIDB4RkEsCisJMHhCOSwgMHgwMywgMHg5RCwgMHhGRCwgMHg1OCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRELCAweEZGLCAweDlGLCAweDAxLCAweEZFLCAweEZDLAorCTB4MDIsIDB4MDUsIDB4Q0IsIDB4RjcsIDB4OTgsIDB4MTAsIDB4MzksIDB4NDYsIDB4RDAsIDB4RjksIDB4NzgsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhGRiwgMHg2OSwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LAorCTB4MDcsIDB4NjEsIDB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsCisJMHgyQywgMHhGRCwgMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDEzLCAweDAwLCAweDlFLCAweEZGLCAweDJCLCAweDAxLCAweDM3LCAweEZELCAweDA1LCAweDA2LAorCTB4NTQsIDB4RjIsIDB4QzIsIDB4MzksIDB4OTksIDB4MjUsIDB4NzMsIDB4RjIsIDB4MTQsIDB4MDcsIDB4MzEsCisJMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEM0LCAweEZGLCAweDZFLCAweDAwLCAweDg3LCAweEZGLCAweDEzLCAweDAwLCAweDU4LCAweDAxLCAweDBELAorCTB4RkEsIDB4NjEsIDB4NDYsIDB4MkQsIDB4MTAsIDB4RjAsIDB4RjcsIDB4RjEsIDB4MDQsIDB4MDUsIDB4RkQsCisJMHg5QywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywKKwkweDAwLCAweDY3LCAweEZGLCAweDVDLCAweDAxLCAweDkzLCAweEZELCAweENDLCAweDAzLCAweDU0LCAweEZBLAorCTB4QTIsIDB4MDksIDB4NEYsIDB4NDgsIDB4NzMsIDB4RkUsIDB4MjcsIDB4RkYsIDB4NEIsIDB4MDEsIDB4REUsCisJMHhGRSwgMHhDMCwgMHgwMCwgMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLCAweEYzLCAweDVCLAorCTB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsIDB4QjQsIDB4MDAsCisJMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2RCwKKwkweEZGLCAweDhBLCAweDAxLCAweDlGLCAweEZDLCAweEQzLCAweDA2LCAweDhBLCAweEYxLCAweDU3LCAweDMzLAorCTB4MTcsIDB4MkQsIDB4OUMsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEYsIDB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsCisJMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgxQiwgMHgwMCwKKwkweDMwLCAweDAwLCAweEU0LCAweEZFLCAweDVGLCAweDAzLCAweDVFLCAweEY2LCAweDAyLCAweDQzLCAweDk2LAorCTB4MTcsIDB4OUIsIDB4RjUsIDB4RjgsIDB4MDUsIDB4OEYsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NiwgMHhGRiwgMHgwQywgMHgwMSwgMHgzRSwKKwkweEZFLCAweDdCLCAweDAyLCAweEVELCAweEZDLCAweDU2LCAweDAzLCAweEY1LCAweDQ4LCAweDA2LCAweDA0LAorCTB4QTEsIDB4RkMsIDB4QTMsIDB4MDIsIDB4MkEsIDB4RkUsIDB4MTYsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOCwgMHgwMSwKKwkweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LCAweEI2LCAweDE2LCAweDc3LCAweDQzLCAweEJELAorCTB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MjUsIDB4MDAsIDB4RTEsIDB4RkYsCisJMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOCwgMHgwMSwgMHg0OSwKKwkweEZDLCAweDI3LCAweDA3LCAweEFCLCAweEYxLCAweDNFLCAweDJDLCAweDFFLCAweDM0LCAweDk1LCAweEYxLAorCTB4QzEsIDB4MDYsIDB4QUUsIDB4RkMsIDB4ODEsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhGRiwgMHhDNCwgMHgwMCwgMHhFMiwgMHhGRCwKKwkweDAxLCAweDA1LCAweEJBLCAweEYzLCAweDY0LCAweDNFLCAweDNGLCAweDFGLCAweEE4LCAweEYzLCAweEI4LAorCTB4MDYsIDB4NDYsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCNiwgMHgwMCwgMHhGMywgMHhGRSwgMHgyNCwgMHgwMSwgMHg2RSwKKwkweEZGLCAweERFLCAweEZELCAweDI1LCAweDQ4LCAweDY4LCAweDBBLCAweDA4LCAweEZBLCAweEYyLCAweDAzLAorCTB4ODEsIDB4RkQsIDB4NjUsIDB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwgMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwKKwkweDM5LCAweEY4LCAweDU5LCAweDBGLCAweEFGLCAweDQ2LCAweDhCLCAweEZBLCAweDE3LCAweDAxLCAweDM4LAorCTB4MDAsIDB4NzMsIDB4RkYsIDB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQiwgMHgwNywgMHg5NywKKwkweEYyLCAweEI4LCAweDI0LCAweDcxLCAweDNBLCAweDdCLCAweEYyLCAweEU2LCAweDA1LCAweDRDLCAweEZELAorCTB4MUQsIDB4MDEsIDB4QTQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHg5NCwgMHhGRiwgMHgzRCwgMHgwMSwgMHgxOCwgMHhGRCwgMHgzMiwgMHgwNiwgMHgxRiwgMHhGMiwKKwkweEI1LCAweDM4LCAweEVCLCAweDI2LCAweDQwLCAweEYyLCAweDFFLCAweDA3LCAweDMyLCAweEZDLCAweERGLAorCTB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0EsIDB4RkYsCisJMHg1RiwgMHgwMCwgMHhBNSwgMHhGRiwgMHhEQywgMHhGRiwgMHhCOCwgMHgwMSwgMHg1NywgMHhGOSwgMHhFNSwKKwkweDQ1LCAweDZFLCAweDExLCAweDgzLCAweEY3LCAweDIzLCAweDA1LCAweEVFLCAweEZDLCAweEE2LCAweDAxLAorCTB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsCisJMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwgMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwKKwkweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLCAweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLAorCTB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhFMCwgMHgwMSwgMHg1NiwgMHhGQywgMHg4OSwgMHgwNiwgMHgyQiwgMHhGNCwgMHgwNiwgMHgxRCwgMHhENywKKwkweDNGLCAweDYxLCAweEY0LCAweDk0LCAweDA0LCAweDI3LCAweEZFLCAweDlDLCAweDAwLCAweEU2LCAweEZGLAorCTB4RjgsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTcsCisJMHgwMSwgMHg4QywgMHhGQywgMHhFQSwgMHgwNiwgMHg4MCwgMHhGMSwgMHgyNiwgMHgzMiwgMHg1OCwgMHgyRSwKKwkweDhCLCAweEYxLCAweDFCLCAweDA3LCAweDVCLCAweEZDLCAweEJBLCAweDAxLCAweDUzLCAweEZGLCAweDJELAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTksIDB4RkYsIDB4MEUsIDB4MDAsIDB4NEIsIDB4MDAsCisJMHhCNCwgMHhGRSwgMHhBRiwgMHgwMywgMHhENSwgMHhGNSwgMHg0RCwgMHg0MiwgMHhFNiwgMHgxOCwgMHgzQywKKwkweEY1LCAweDFGLCAweDA2LCAweDdGLCAweEZDLCAweEQzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0YsCisJMHgwMiwgMHg1RSwgMHhGRCwgMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywgMHgwNSwgMHgyRSwgMHhGQywKKwkweERFLCAweDAyLCAweDBDLCAweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLCAweDIwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QzEsIDB4MDEsIDB4QUQsIDB4RkMsCisJMHhCMiwgMHgwNSwgMHgzRiwgMHhGNiwgMHg2OSwgMHgxNSwgMHgxRiwgMHg0NCwgMHg1MywgMHhGNywgMHhEMywKKwkweDAyLCAweDM4LCAweEZGLCAweDAxLCAweDAwLCAweDMzLCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsCisJMHgwNywgMHhDNiwgMHhGMSwgMHhGNywgMHgyQSwgMHg0NiwgMHgzNSwgMHhBQiwgMHhGMSwgMHhBNCwgMHgwNiwKKwkweEM0LCAweEZDLCAweDcyLCAweDAxLCAweDc5LCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLAorCTB4MDAsIDB4MDQsIDB4MDAsIDB4QzYsIDB4RkYsIDB4REIsIDB4MDAsIDB4QkIsIDB4RkQsIDB4M0UsIDB4MDUsCisJMHg2MCwgMHhGMywgMHg3QiwgMHgzRCwgMHg5NCwgMHgyMCwgMHg1RSwgMHhGMywgMHhEMCwgMHgwNiwgMHgzRSwKKwkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLAorCTB4QUUsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsIDB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsCisJMHhGRCwgMHhEQywgMHg0NywgMHg5NSwgMHgwQiwgMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwKKwkweDcxLCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLAorCTB4MDAsIDB4NTUsIDB4RkYsIDB4OEEsIDB4MDEsIDB4MkUsIDB4RkQsIDB4OUIsIDB4MDQsIDB4QTgsIDB4RjgsCisJMHgxRiwgMHgwRSwgMHgxQSwgMHg0NywgMHg0RSwgMHhGQiwgMHhCMywgMHgwMCwgMHg3MCwgMHgwMCwgMHg1NCwKKwkweEZGLCAweDg3LCAweDAwLCAweEJCLCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsIDB4RkIsIDB4MDYsIDB4RDIsIDB4RjIsIDB4NjQsCisJMHgyMywgMHg3MywgMHgzQiwgMHhCQywgMHhGMiwgMHhCNCwgMHgwNSwgMHg2RSwgMHhGRCwgMHgwOSwgMHgwMSwKKwkweEFGLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhCLAorCTB4RkYsIDB4NEYsIDB4MDEsIDB4RkIsIDB4RkMsIDB4NUEsIDB4MDYsIDB4RjIsIDB4RjEsIDB4QTAsIDB4MzcsCisJMHgzQSwgMHgyOCwgMHgxMywgMHhGMiwgMHgyNSwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwKKwkweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLCAweDAwLAorCTB4QzMsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsIDB4QjIsCisJMHgxMiwgMHgxOSwgMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywgMHhGRiwKKwkweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQyLAorCTB4MDEsIDB4Q0QsIDB4RkQsIDB4NTksIDB4MDMsIDB4M0IsIDB4RkIsIDB4NUUsIDB4MDcsIDB4QjMsIDB4NDgsCisJMHg0OCwgMHgwMCwgMHg0QiwgMHhGRSwgMHhDMiwgMHgwMSwgMHg5RiwgMHhGRSwgMHhERSwgMHgwMCwgMHg5OCwKKwkweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERELCAweDAxLAorCTB4NjIsIDB4RkMsIDB4NjksIDB4MDYsIDB4N0YsIDB4RjQsIDB4QjIsIDB4MUIsIDB4QUIsIDB4NDAsIDB4RDAsCisJMHhGNCwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRSwgMHg4MywgMHgwMCwgMHhGMiwgMHhGRiwgMHhGNCwgMHhGRiwKKwkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEEzLCAweDAxLCAweDdBLAorCTB4RkMsIDB4RkQsIDB4MDYsIDB4N0MsIDB4RjEsIDB4RjIsIDB4MzAsIDB4OTYsIDB4MkYsIDB4ODAsIDB4RjEsCisJMHgwRiwgMHgwNywgMHg2OSwgMHhGQywgMHhCMCwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LCAweDAwLCAweDg1LCAweEZFLAorCTB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsIDB4RTEsIDB4RjQsIDB4NDMsCisJMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFCLCAweDAwLCAweDkyLCAweEZGLCAweEVGLCAweDAwLCAweDdELCAweEZFLCAweDA0LCAweDAyLCAweENGLAorCTB4RkQsIDB4NTgsIDB4MDEsIDB4RDcsIDB4NDgsIDB4MjYsIDB4MDYsIDB4QkIsIDB4RkIsIDB4MTksIDB4MDMsCisJMHhFRCwgMHhGRCwgMHgzMiwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEI5LCAweDAxLCAweEMxLCAweEZDLCAweDg2LCAweDA1LAorCTB4QTUsIDB4RjYsIDB4MUUsIDB4MTQsIDB4QkEsIDB4NDQsIDB4RjAsIDB4RjcsIDB4N0IsIDB4MDIsIDB4NkIsCisJMHhGRiwgMHhFNCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhENiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDMzLCAweDAwLCAweDQzLCAweEZGLCAweEQ1LCAweDAxLCAweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEU3LAorCTB4RjEsIDB4QUMsIDB4MjksIDB4NjYsIDB4MzYsIDB4QzksIDB4RjEsIDB4ODMsIDB4MDYsIDB4REQsIDB4RkMsCisJMHg2MiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwKKwkweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LCAweEZELCAweDc4LCAweDA1LCAweDBFLCAweEYzLAorCTB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsIDB4RTYsIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNCwgMHhGRiwKKwkweDk4LCAweDAwLCAweDMyLCAweEZGLCAweEIwLCAweDAwLCAweDQxLCAweDAwLCAweDMwLCAweEZDLCAweDg2LAorCTB4NDcsIDB4QzYsIDB4MEMsIDB4MjQsIDB4RjksIDB4NjAsIDB4MDQsIDB4NEIsIDB4RkQsIDB4N0QsIDB4MDEsCisJMHg1QSwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1QSwKKwkweEZGLCAweDdFLCAweDAxLCAweDQ4LCAweEZELCAweDY2LCAweDA0LCAweDE4LCAweEY5LCAweEU4LCAweDBDLAorCTB4N0MsIDB4NDcsIDB4MTksIDB4RkMsIDB4NEQsIDB4MDAsIDB4QTksIDB4MDAsIDB4MzUsIDB4RkYsIDB4OTYsCisJMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU5LCAweDA2LCAweDEyLCAweEYzLCAweDEwLCAweDIyLCAweDZFLAorCTB4M0MsIDB4MDUsIDB4RjMsIDB4N0UsIDB4MDUsIDB4OTEsIDB4RkQsIDB4RjQsIDB4MDAsIDB4QkEsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwKKwkweDAxLCAweEUwLCAweEZDLCAweDdGLCAweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LAorCTB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsIDB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0MiwgMHgwMCwgMHhFMSwgMHhGRiwKKwkweDcxLCAweEZGLCAweDcxLCAweDAyLCAweDAyLCAweEY4LCAweENDLCAweDQ0LCAweEZBLCAweDEzLCAweEIwLAorCTB4RjYsIDB4ODEsIDB4MDUsIDB4QzMsIDB4RkMsIDB4QjgsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzNCwgMHgwMSwgMHhFQSwKKwkweEZELCAweDFGLCAweDAzLCAweEFFLCAweEZCLCAweDQ1LCAweDA2LCAweEQ1LCAweDQ4LCAweDNDLCAweDAxLAorCTB4REMsIDB4RkQsIDB4RkQsIDB4MDEsIDB4ODAsIDB4RkUsIDB4RUQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg2RiwgMHhGQywKKwkweDQ3LCAweDA2LCAweEQ3LCAweEY0LCAweDVELCAweDFBLCAweDc0LCAweDQxLCAweDQ4LCAweEY1LCAweDA0LAorCTB4MDQsIDB4ODAsIDB4RkUsIDB4NjksIDB4MDAsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwKKwkweDA3LCAweDgwLCAweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LAorCTB4NzgsIDB4RkMsIDB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsCisJMHgwMCwgMHhGMywgMHhGRiwgMHhGNCwgMHhGRiwgMHg4MCwgMHgwMCwgMHg1OCwgMHhGRSwgMHg0NiwgMHgwNCwKKwkweERELCAweEY0LCAweEMzLCAweDQwLCAweDhDLCAweDFCLCAweDg5LCAweEY0LCAweDY2LCAweDA2LCAweDYzLAorCTB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsCisJMHg5OCwgMHhGRiwgMHhFMCwgMHgwMCwgMHg5QywgMHhGRSwgMHhDOCwgMHgwMSwgMHgzRiwgMHhGRSwgMHg2MiwKKwkweDAwLCAweEI4LCAweDQ4LCAweDNGLCAweDA3LCAweDQ3LCAweEZCLCAweDUzLCAweDAzLCAweEQwLCAweEZELAorCTB4NDAsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCisJMHgwMCwgMHg0NywgMHhGRiwgMHhCMCwgMHgwMSwgMHhENiwgMHhGQywgMHg1OCwgMHgwNSwgMHgwRCwgMHhGNywKKwkweEQ3LCAweDEyLCAweDRFLCAweDQ1LCAweDk2LCAweEY4LCAweDIwLCAweDAyLCAweEEwLCAweEZGLCAweEM3LAorCTB4RkYsIDB4NEYsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwgMHhGMiwgMHg2MCwKKwkweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLCAweDUxLCAweDAxLAorCTB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QjAsCisJMHhGRiwgMHgwNywgMHgwMSwgMHg3MiwgMHhGRCwgMHhBRSwgMHgwNSwgMHhDNCwgMHhGMiwgMHg5MCwgMHgzQiwKKwkweDNGLCAweDIzLCAweEQ5LCAweEYyLCAweEY5LCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkEsIDB4RkYsIDB4ODksIDB4MDAsCisJMHg1MSwgMHhGRiwgMHg3NywgMHgwMCwgMHhBNywgMHgwMCwgMHg2NCwgMHhGQiwgMHgyNiwgMHg0NywgMHhGQywKKwkweDBELCAweEI0LCAweEY4LCAweDk1LCAweDA0LCAweDMxLCAweEZELCAweDg4LCAweDAxLCAweDU2LCAweEZGLAorCTB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUUsIDB4RkYsIDB4NzIsCisJMHgwMSwgMHg2MiwgMHhGRCwgMHgyRiwgMHgwNCwgMHg4OSwgMHhGOSwgMHhCNiwgMHgwQiwgMHhEMiwgMHg0NywKKwkweEVCLCAweEZDLCAweEU0LCAweEZGLCAweEUzLCAweDAwLCAweDE2LCAweEZGLCAweEE1LCAweDAwLCAweEFGLAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCisJMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywgMHhCQSwgMHgyMCwgMHg2MSwgMHgzRCwgMHg1NiwKKwkweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLCAweDAwLCAweEM1LCAweEZGLCAweDA1LCAweDAwLAorCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4N0EsIDB4RkYsIDB4NzAsIDB4MDEsIDB4QzcsCisJMHhGQywgMHhBMCwgMHgwNiwgMHhBRSwgMHhGMSwgMHg2NSwgMHgzNSwgMHhEMSwgMHgyQSwgMHhDQSwgMHhGMSwKKwkweDJBLCAweDA3LCAweDQwLCAweEZDLCAweEQwLCAweDAxLCAweDQ3LCAweEZGLCAweDMyLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDksIDB4MDAsIDB4REIsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4M0QsIDB4RkYsCisJMHhDOSwgMHgwMiwgMHg2NCwgMHhGNywgMHgyRiwgMHg0NCwgMHg0NCwgMHgxNSwgMHg0QSwgMHhGNiwgMHhBRCwKKwkweDA1LCAweEFGLCAweEZDLCAweEMwLCAweDAxLCAweDQxLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsIDB4RkYsIDB4MjYsIDB4MDEsIDB4MDgsIDB4RkUsIDB4RTQsCisJMHgwMiwgMHgyMSwgMHhGQywgMHgzMSwgMHgwNSwgMHhFQiwgMHg0OCwgMHgzNywgMHgwMiwgMHg2QiwgMHhGRCwKKwkweDM5LCAweDAyLCAweDYxLCAweEZFLCAweEZDLCAweDAwLCAweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsCisJMHgzMiwgMHhGNSwgMHgwQywgMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywgMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwKKwkweEZFLCAweDRFLCAweDAwLCAweDBDLCAweDAwLCAweEVBLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLAorCTB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsIDB4QjgsIDB4MDEsIDB4NUQsIDB4RkMsIDB4MUEsIDB4MDcsIDB4OEEsCisJMHhGMSwgMHg3QiwgMHgyRSwgMHgwNCwgMHgzMiwgMHg3RiwgMHhGMSwgMHhFQywgMHgwNiwgMHg4QSwgMHhGQywKKwkweDk4LCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY4LAorCTB4RkYsIDB4RTcsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkMsIDB4RkUsIDB4OEMsIDB4MDQsIDB4NkQsIDB4RjQsCisJMHhGMCwgMHgzRiwgMHhFMCwgMHgxQywgMHgzNCwgMHhGNCwgMHg4NSwgMHgwNiwgMHg1NywgMHhGQywgMHhFMCwKKwkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLCAweDlFLCAweEZGLAorCTB4RDEsIDB4MDAsIDB4QkIsIDB4RkUsIDB4OEQsIDB4MDEsIDB4QUUsIDB4RkUsIDB4NzQsIDB4RkYsIDB4OEQsCisJMHg0OCwgMHg1RCwgMHgwOCwgMHhENCwgMHhGQSwgMHg4RCwgMHgwMywgMHhCMywgMHhGRCwgMHg0RSwgMHgwMSwKKwkweDZELCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLAorCTB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsCisJMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywgMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwKKwkweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAorCTB4REYsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUYsIDB4MDcsIDB4M0IsIDB4RjIsIDB4MTEsIDB4MjcsIDB4OTcsCisJMHgzOCwgMHgxOSwgMHhGMiwgMHgzNiwgMHgwNiwgMHgxNSwgMHhGRCwgMHgzRiwgMHgwMSwgMHg5MywgMHhGRiwKKwkweDE3LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEE2LCAweEZGLCAweDFCLAorCTB4MDEsIDB4NTAsIDB4RkQsIDB4RTEsIDB4MDUsIDB4ODIsIDB4RjIsIDB4OEYsIDB4M0EsIDB4OTIsIDB4MjQsCisJMHg5RCwgMHhGMiwgMHgwOSwgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMwLCAweEZGLCAweDdBLCAweDAwLCAweDcwLCAweEZGLAorCTB4M0UsIDB4MDAsIDB4MEMsIDB4MDEsIDB4QTEsIDB4RkEsIDB4QkIsIDB4NDYsIDB4MzYsIDB4MEYsIDB4NDUsCisJMHhGOCwgMHhDOSwgMHgwNCwgMHgxOCwgMHhGRCwgMHg5MywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDY2LCAweDAxLCAweDdELAorCTB4RkQsIDB4RjgsIDB4MDMsIDB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsIDB4NDgsIDB4QzUsIDB4RkQsCisJMHg3QSwgMHhGRiwgMHgxRCwgMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwgMHhBOSwgMHhGRiwgMHgxNSwKKwkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ1LCAweEZDLAorCTB4QkIsIDB4MDYsIDB4QTAsIDB4RjMsIDB4NjQsIDB4MUYsIDB4NEEsIDB4M0UsIDB4QjAsIDB4RjMsIDB4MDgsCisJMHgwNSwgMHhERSwgMHhGRCwgMHhDNywgMHgwMCwgMHhEMCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDdGLCAweDAxLCAweEIwLCAweEZDLCAweEJFLAorCTB4MDYsIDB4OTcsIDB4RjEsIDB4M0YsIDB4MzQsIDB4MTksIDB4MkMsIDB4QUQsIDB4RjEsIDB4MjgsIDB4MDcsCisJMHg0OCwgMHhGQywgMHhDOSwgMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKKwkweDAwLCAweEUwLCAweEZGLCAweDI2LCAweDAwLCAweDFBLCAweDAwLCAweDBCLCAweEZGLCAweDFFLCAweDAzLAorCTB4Q0QsIDB4RjYsIDB4ODksIDB4NDMsIDB4OTEsIDB4MTYsIDB4RTcsIDB4RjUsIDB4RDgsIDB4MDUsIDB4OUQsCisJMHhGQywgMHhDNywgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDFGLCAweDAwLCAweDgyLCAweEZGLCAweDE4LCAweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LAorCTB4RkMsIDB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsIDB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsCisJMHg0MiwgMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwKKwkweDAwLCAweDNDLCAweEZGLCAweENELCAweDAxLCAweDhFLCAweEZDLCAweEZDLCAweDA1LCAweDkwLCAweEY1LAorCTB4QkIsIDB4MTcsIDB4RUUsIDB4NDIsIDB4NEUsIDB4RjYsIDB4NjgsIDB4MDMsIDB4REYsIDB4RkUsIDB4MzMsCisJMHgwMCwgMHgxQSwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweDRGLCAweEZGLCAweEMyLCAweDAxLCAweDUxLCAweEZDLCAweDIzLCAweDA3LCAweDlBLCAweEYxLCAweDNBLAorCTB4MkQsIDB4MzUsIDB4MzMsIDB4ODksIDB4RjEsIDB4RDUsIDB4MDYsIDB4OUQsIDB4RkMsIDB4OEIsIDB4MDEsCisJMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQywgMHhGRiwgMHhEQiwKKwkweEZGLCAweEIyLCAweDAwLCAweDAyLCAweEZFLCAweENGLCAweDA0LCAweDA1LCAweEY0LCAweDE2LCAweDNGLAorCTB4MzYsIDB4MUUsIDB4RTQsIDB4RjMsIDB4QTMsIDB4MDYsIDB4NEQsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwgMHgwMCwKKwkweERCLCAweEZFLCAweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LCAweDgxLAorCTB4MDksIDB4NjEsIDB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsIDB4RkYsCisJMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RCwKKwkweDAxLCAweDAzLCAweEZELCAweEY3LCAweDA0LCAweEUzLCAweEY3LCAweDUxLCAweDEwLCAweDU1LCAweDQ2LAorCTB4RjksIDB4RjksIDB4NjMsIDB4MDEsIDB4MEQsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NkQsIDB4MDAsIDB4QzUsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwKKwkweDMxLCAweEZDLCAweDE1LCAweDA3LCAweDZELCAweEYyLCAweEJGLCAweDI1LCAweEE1LCAweDM5LCAweDRELAorCTB4RjIsIDB4MEIsIDB4MDYsIDB4MzMsIDB4RkQsIDB4MkQsIDB4MDEsIDB4OUQsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHg5QywgMHhGRiwgMHgyRiwgMHgwMSwgMHgzMCwKKwkweEZELCAweDEwLCAweDA2LCAweDQ3LCAweEYyLCAweDg3LCAweDM5LCAweEU1LCAweDI1LCAweDY3LCAweEYyLAorCTB4MTYsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwgMHhGRiwgMHgwNiwgMHgwMCwKKwkweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLCAweEQ3LCAweEY3LCAweEZDLAorCTB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwgMHg1OSwgMHgwMSwgMHg5OSwgMHhGRCwgMHhDMCwKKwkweDAzLCAweDZFLCAweEZBLCAweDYxLCAweDA5LCAweDVELCAweDQ4LCAweEE2LCAweEZFLCAweDBGLCAweEZGLAorCTB4NTgsIDB4MDEsIDB4RDcsIDB4RkUsIDB4QzMsIDB4MDAsIDB4QTMsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0RSwgMHhGQywgMHhBMCwgMHgwNiwKKwkweEVELCAweEYzLCAweDBGLCAweDFFLCAweDJELCAweDNGLCAweDEwLCAweEY0LCAweEM4LCAweDA0LCAweDA3LAorCTB4RkUsIDB4QUYsIDB4MDAsIDB4REMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwgMHg4RCwgMHgwMSwgMHg5QiwgMHhGQywgMHhEOCwgMHgwNiwgMHg4NywKKwkweEYxLCAweDEzLCAweDMzLCAweDVFLCAweDJELCAweDk4LCAweEYxLCAweDIyLCAweDA3LCAweDUyLCAweEZDLAorCTB4QzEsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsCisJMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRSwgMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwKKwkweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LCAweDAwLCAweDA2LCAweDhDLCAweEZDLCAweENFLAorCTB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsCisJMHgwOSwgMHgwMSwgMHg0NSwgMHhGRSwgMHg2RSwgMHgwMiwgMHgwNiwgMHhGRCwgMHgxQywgMHgwMywgMHhGNCwKKwkweDQ4LCAweDQxLCAweDA0LCAweDg3LCAweEZDLCAweEIwLCAweDAyLCAweDIzLCAweEZFLCAweDE5LCAweDAxLAorCTB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsCisJMHhGRiwgMHhDNiwgMHgwMSwgMHg5RiwgMHhGQywgMHhEMywgMHgwNSwgMHhGMSwgMHhGNSwgMHg2QywgMHgxNiwKKwkweDlFLCAweDQzLCAweERELCAweEY2LCAweDE1LCAweDAzLCAweDEwLCAweEZGLCAweDE3LCAweDAwLCAweDI4LAorCTB4MDAsIDB4REYsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCisJMHhDQSwgMHgwMSwgMHg0NywgMHhGQywgMHgyOCwgMHgwNywgMHhCMCwgMHhGMSwgMHhGNSwgMHgyQiwgMHg2MCwKKwkweDM0LCAweDlBLCAweEYxLCAweEJCLCAweDA2LCAweEIzLCAweEZDLCAweDdELCAweDAxLCAweDczLCAweEZGLAorCTB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksCisJMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwgMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwKKwkweDk3LCAweEYzLCAweEJELCAweDA2LCAweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4QjMsIDB4MDAsIDB4RkEsIDB4RkUsCisJMHgxNywgMHgwMSwgMHg4NiwgMHhGRiwgMHhBQywgMHhGRCwgMHgxNiwgMHg0OCwgMHhBQSwgMHgwQSwgMHhFRSwKKwkweEY5LCAweEZFLCAweDAzLCAweDdBLCAweEZELCAweDY3LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTIsIDB4MDEsIDB4MUIsCisJMHhGRCwgMHhDNCwgMHgwNCwgMHg1MSwgMHhGOCwgMHgxMywgMHgwRiwgMHhDOCwgMHg0NiwgMHhCNiwgMHhGQSwKKwkweDAxLCAweDAxLCAweDQ0LCAweDAwLCAweDZDLCAweEZGLCAweDdCLCAweDAwLCAweEJGLCAweEZGLCAweDEwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsCisJMHgwOCwgMHgwNywgMHhBNCwgMHhGMiwgMHg2RCwgMHgyNCwgMHhBRCwgMHgzQSwgMHg4OCwgMHhGMiwgMHhEQiwKKwkweDA1LCAweDUzLCAweEZELCAweDE5LCAweDAxLCAweEE3LCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsCisJMHgwNiwgMHgxNCwgMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywKKwkweDMzLCAweEZDLCAweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELAorCTB4MDAsIDB4Q0IsIDB4RkYsIDB4NUMsIDB4MDAsIDB4QUMsIDB4RkYsIDB4RDAsIDB4RkYsIDB4Q0QsIDB4MDEsCisJMHgzMCwgMHhGOSwgMHhDOCwgMHg0NSwgMHhCNiwgMHgxMSwgMHg2QiwgMHhGNywgMHgyRCwgMHgwNSwgMHhFOSwKKwkweEZDLCAweEE4LCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MjUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4NEMsIDB4MDEsIDB4QjYsIDB4RkQsIDB4ODYsIDB4MDMsIDB4RTEsCisJMHhGQSwgMHgzRCwgMHgwOCwgMHg5MiwgMHg0OCwgMHg4RSwgMHhGRiwgMHhBMSwgMHhGRSwgMHg5MywgMHgwMSwKKwkweEI4LCAweEZFLCAweEQzLCAweDAwLCAweDlELCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTgsIDB4RkMsIDB4ODIsIDB4MDYsIDB4M0UsIDB4RjQsCisJMHhCQSwgMHgxQywgMHgwNywgMHg0MCwgMHg3OSwgMHhGNCwgMHg4NCwgMHgwNCwgMHgzMSwgMHhGRSwgMHg5NiwKKwkweDAwLCAweEU4LCAweEZGLCAweEY3LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAorCTB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsIDB4RjEsIDB4RTMsCisJMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywgMHhCNywgMHgwMSwKKwkweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVBLCAweEZGLCAweDBCLAorCTB4MDAsIDB4NTEsIDB4MDAsIDB4QUEsIDB4RkUsIDB4QzAsIDB4MDMsIDB4QjgsIDB4RjUsIDB4MjEsIDB4NDIsCisJMHgzMSwgMHgxOSwgMHgyOCwgMHhGNSwgMHgyNywgMHgwNiwgMHg3QywgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwKKwkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhELCAweEZGLCAweEZBLCAweDAwLAorCTB4NjQsIDB4RkUsIDB4MzIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MUIsIDB4MDIsIDB4RUEsIDB4NDgsIDB4NTAsCisJMHgwNSwgMHgxNCwgMHhGQywgMHhFQiwgMHgwMiwgMHgwNSwgMHhGRSwgMHgyNywgMHgwMSwgMHg3QywgMHhGRiwKKwkweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEJGLAorCTB4MDEsIDB4QjIsIDB4RkMsIDB4QTksIDB4MDUsIDB4NTUsIDB4RjYsIDB4MjAsIDB4MTUsIDB4NDIsIDB4NDQsCisJMHg3NSwgMHhGNywgMHhCRiwgMHgwMiwgMHg0MywgMHhGRiwgMHhGQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhEQSwKKwkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLAorCTB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsIDB4QUUsIDB4MkEsIDB4ODYsIDB4MzUsIDB4QjEsCisJMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwgMHgwMSwgMHg3QiwgMHhGRiwgMHgyMCwgMHgwMCwKKwkweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweEMzLCAweEZGLCAweEUwLCAweDAwLCAweEIzLAorCTB4RkQsIDB4NEIsIDB4MDUsIDB4NEQsIDB4RjMsIDB4NDUsIDB4M0QsIDB4RTAsIDB4MjAsIDB4NEYsIDB4RjMsCisJMHhENSwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE0LCAweDAwLCAweDE5LCAweEZGLCAweERELCAweDAwLAorCTB4RjAsIDB4RkYsIDB4RDQsIDB4RkMsIDB4QzksIDB4NDcsIDB4RDgsIDB4MEIsIDB4N0MsIDB4RjksIDB4MzUsCisJMHgwNCwgMHg1RiwgMHhGRCwgMHg3NCwgMHgwMSwgMHg1RSwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDJDLCAweDAwLCAweDU2LCAweEZGLCAweDg3LCAweDAxLCAweDM0LCAweEZELCAweDhGLAorCTB4MDQsIDB4QzAsIDB4RjgsIDB4RDksIDB4MEQsIDB4MzEsIDB4NDcsIDB4N0IsIDB4RkIsIDB4OUMsIDB4MDAsCisJMHg3RCwgMHgwMCwgMHg0RCwgMHhGRiwgMHg4QSwgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY3LCAweDA2LAorCTB4RTAsIDB4RjIsIDB4MTgsIDB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsIDB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsCisJMHhGRCwgMHgwNCwgMHgwMSwgMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFBLCAweDAwLCAweDg5LCAweEZGLCAweDUzLCAweDAxLCAweEY1LCAweEZDLCAweDYzLCAweDA2LCAweEU5LAorCTB4RjEsIDB4NjMsIDB4MzcsIDB4ODUsIDB4MjgsIDB4MDksIDB4RjIsIDB4MjcsIDB4MDcsIDB4MzUsIDB4RkMsCisJMHhEQSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMSwKKwkweEZGLCAweDRFLCAweDAwLCAweENBLCAweEZGLCAweDlBLCAweEZGLCAweDJBLCAweDAyLCAweDgzLCAweEY4LAorCTB4M0YsIDB4NDUsIDB4RkIsIDB4MTIsIDB4MDEsIDB4RjcsIDB4NUQsIDB4MDUsIDB4RDMsIDB4RkMsIDB4QjEsCisJMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKKwkweDczLCAweEZGLCAweDNGLCAweDAxLCAweEQzLCAweEZELCAweDRDLCAweDAzLCAweDU0LCAweEZCLCAweDFGLAorCTB4MDcsIDB4QkIsIDB4NDgsIDB4N0QsIDB4MDAsIDB4MzMsIDB4RkUsIDB4Q0YsIDB4MDEsIDB4OTgsIDB4RkUsCisJMHhFMiwgMHgwMCwgMHg5NywgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKKwkweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLCAweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLAorCTB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsIDB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsCisJMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1RSwgMHhGRiwKKwkweEE2LCAweDAxLCAweDc2LCAweEZDLCAweDAxLCAweDA3LCAweDdELCAweEYxLCAweEFELCAweDMwLCAweERDLAorCTB4MkYsIDB4N0YsIDB4RjEsIDB4MEMsIDB4MDcsIDB4NkMsIDB4RkMsIDB4QUQsIDB4MDEsIDB4NUEsIDB4RkYsCisJMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHg2QywKKwkweDAwLCAweDdCLCAweEZFLCAweDBDLCAweDA0LCAweDNBLCAweEY1LCAweDVGLCAweDQxLCAweDgzLCAweDFBLAorCTB4Q0QsIDB4RjQsIDB4NEIsIDB4MDYsIDB4NkQsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5MywgMHhGRiwgMHhFQywgMHgwMCwgMHg4MywgMHhGRSwKKwkweEY3LCAweDAxLCAweEU4LCAweEZELCAweDIxLCAweDAxLCAweEQyLCAweDQ4LCAweDY0LCAweDA2LCAweEExLAorCTB4RkIsIDB4MjYsIDB4MDMsIDB4RTcsIDB4RkQsIDB4MzUsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCNywgMHgwMSwgMHhDNSwKKwkweEZDLCAweDdDLCAweDA1LCAweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLCAweDQ0LCAweDE0LCAweEY4LAorCTB4NjcsIDB4MDIsIDB4NzcsIDB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOSwgMHhGQywKKwkweDI5LCAweDA3LCAweEVGLCAweEYxLCAweDYyLCAweDI5LCAweEE1LCAweDM2LCAweEQwLCAweEYxLCAweDdCLAorCTB4MDYsIDB4RTMsIDB4RkMsIDB4NUUsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgwMSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGNiwgMHgwMCwgMHg4RCwgMHhGRCwgMHg4NCwKKwkweDA1LCAweEZELCAweEYyLCAweDUyLCAweDNDLCAweDM1LCAweDIyLCAweDBCLCAweEYzLCAweEVCLCAweDA2LAorCTB4MzcsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsCisJMHgwMCwgMHhCNSwgMHhGRiwgMHg5NCwgMHgwMCwgMHgzOSwgMHhGRiwgMHhBMywgMHgwMCwgMHg1OCwgMHgwMCwKKwkweDAyLCAweEZDLCAweDczLCAweDQ3LCAweDBCLCAweDBELCAweDBCLCAweEY5LCAweDZDLCAweDA0LCAweDQ1LAorCTB4RkQsIDB4ODAsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgyQSwgMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywgMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwKKwkweEY5LCAweEE0LCAweDBDLCAweDkwLCAweDQ3LCAweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLAorCTB4MkUsIDB4RkYsIDB4OTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOSwgMHhGQywgMHhFNCwgMHgwNiwgMHgyMSwgMHhGMywKKwkweEM0LCAweDIxLCAweEE1LCAweDNDLCAweDE2LCAweEYzLCAweDcyLCAweDA1LCAweDlBLCAweEZELCAweEVGLAorCTB4MDAsIDB4QkMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHg4MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHhEQSwgMHhGQywgMHg4NywgMHgwNiwgMHhDNSwgMHhGMSwgMHg0NiwKKwkweDM2LCAweEQxLCAweDI5LCAweEUzLCAweEYxLCAweDJBLCAweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLAorCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDYsIDB4RkYsIDB4M0YsCisJMHgwMCwgMHhFNywgMHhGRiwgMHg2NSwgMHhGRiwgMHg4NSwgMHgwMiwgMHhERSwgMHhGNywgMHhBOSwgMHg0NCwKKwkweDQzLCAweDE0LCAweDk5LCAweEY2LCAweDhCLCAweDA1LCAweEJGLCAweEZDLCAweEJBLCAweDAxLCAweDQzLAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsIDB4RkYsCisJMHgzMSwgMHgwMSwgMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwgMHhEQiwKKwkweDQ4LCAweDczLCAweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLCAweDAwLAorCTB4OTEsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsCisJMHgwMSwgMHg3MiwgMHhGQywgMHgzRiwgMHgwNiwgMHhFQiwgMHhGNCwgMHgxMiwgMHgxQSwgMHhBMSwgMHg0MSwKKwkweDYzLCAweEY1LCAweEYzLCAweDAzLCAweDhBLCAweEZFLCAweDYzLCAweDAwLCAweDAyLCAweDAwLCAweEVFLAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTgsIDB4RkYsIDB4QjEsIDB4MDEsCisJMHg2NywgMHhGQywgMHgxMCwgMHgwNywgMHg4MSwgMHhGMSwgMHg3MywgMHgyRiwgMHgxNSwgMHgzMSwgMHg3QywKKwkweEYxLCAweEZCLCAweDA2LCAweDdDLCAweEZDLCAweEEyLCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NEUsCisJMHhGRSwgMHg1NiwgMHgwNCwgMHhDMywgMHhGNCwgMHg5NSwgMHg0MCwgMHhEOCwgMHgxQiwgMHg3NiwgMHhGNCwKKwkweDZELCAweDA2LCAweDYwLCAweEZDLCAweERELCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsIDB4RkUsIDB4QkIsIDB4MDEsCisJMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywgMHgyRSwgMHhGQiwgMHg2MCwKKwkweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUUsIDB4MDEsIDB4REIsIDB4RkMsIDB4NEQsCisJMHgwNSwgMHgyNCwgMHhGNywgMHg4RSwgMHgxMiwgMHg2RCwgMHg0NSwgMHhCQywgMHhGOCwgMHgwQywgMHgwMiwKKwkweEFDLCAweEZGLCAweEMwLCAweEZGLCAweDUyLCAweDAwLCAweENGLCAweEZGLCAweDBDLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REMsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjUsIDB4MDcsCisJMHgxOCwgMHhGMiwgMHgxNSwgMHgyOCwgMHhCRiwgMHgzNywgMHhGNywgMHhGMSwgMHg1NiwgMHgwNiwgMHhGRSwKKwkweEZDLCAweDRELCAweDAxLCAweDhDLCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MEQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NkEsIDB4RkQsIDB4QkEsIDB4MDUsIDB4QjQsCisJMHhGMiwgMHg1OCwgMHgzQiwgMHg4QSwgMHgyMywgMHhDQiwgMHhGMiwgMHhGRCwgMHgwNiwgMHgzNCwgMHhGQywKKwkweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJCLAorCTB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsCisJMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwgMHhBMSwgMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwKKwkweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLAorCTB4NUYsIDB4RkYsIDB4NzAsIDB4MDEsIDB4NjgsIDB4RkQsIDB4MjMsIDB4MDQsIDB4QTIsIDB4RjksIDB4NzMsCisJMHgwQiwgMHhFNCwgMHg0NywgMHgxQiwgMHhGRCwgMHhDRCwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwRiwgMHhGRiwKKwkweEE5LCAweDAwLCAweEFFLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAorCTB4RkYsIDB4RTYsIDB4MDEsIDB4M0YsIDB4RkMsIDB4Q0UsIDB4MDYsIDB4NjYsIDB4RjMsIDB4NkYsIDB4MjAsCisJMHg5NiwgMHgzRCwgMHg2OSwgMHhGMywgMHgzOCwgMHgwNSwgMHhCRiwgMHhGRCwgMHhEOSwgMHgwMCwgMHhDNywKKwkweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDc4LCAweEZGLAorCTB4NzQsIDB4MDEsIDB4QzIsIDB4RkMsIDB4QTcsIDB4MDYsIDB4QTgsIDB4RjEsIDB4MjUsIDB4MzUsIDB4MUIsCisJMHgyQiwgMHhDMiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MSwgMHhGQywgMHhDRSwgMHgwMSwgMHg0NywgMHhGRiwKKwkweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LAorCTB4MDAsIDB4MzIsIDB4RkYsIDB4REMsIDB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsCisJMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwgMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIzLCAweDAxLAorCTB4MEYsIDB4RkUsIDB4RDcsIDB4MDIsIDB4M0IsIDB4RkMsIDB4RjUsIDB4MDQsIDB4RUQsIDB4NDgsIDB4NzAsCisJMHgwMiwgMHg1MiwgMHhGRCwgMHg0NiwgMHgwMiwgMHg1QSwgMHhGRSwgMHhGRiwgMHgwMCwgMHg4QiwgMHhGRiwKKwkweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEQyLCAweDAxLCAweDgxLAorCTB4RkMsIDB4MUEsIDB4MDYsIDB4NDcsIDB4RjUsIDB4QzEsIDB4MTgsIDB4NjAsIDB4NDIsIDB4RTQsIDB4RjUsCisJMHhBNiwgMHgwMywgMHhCOSwgMHhGRSwgMHg0OCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywKKwkweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUzLCAweEZGLCAweEJCLCAweDAxLCAweDVBLCAweEZDLAorCTB4MUMsIDB4MDcsIDB4OEQsIDB4RjEsIDB4MzQsIDB4MkUsIDB4NDgsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTcsCisJMHgwNiwgMHg4RSwgMHhGQywgMHg5NiwgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDA0LCAweDAwLCAweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLAorCTB4MDQsIDB4NTUsIDB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsCisJMHg1NSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywKKwkweDAwLCAweDlGLCAweEZGLCAweENFLCAweDAwLCAweEMyLCAweEZFLCAweDgwLCAweDAxLCAweEM2LCAweEZFLAorCTB4NDAsIDB4RkYsIDB4ODEsIDB4NDgsIDB4OUUsIDB4MDgsIDB4QkEsIDB4RkEsIDB4OUEsIDB4MDMsIDB4QUMsCisJMHhGRCwgMHg1MSwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE0LCAweDAxLCAweEYxLCAweEZDLCAweDFELCAweDA1LCAweDhGLAorCTB4RjcsIDB4NEEsIDB4MTEsIDB4RjIsIDB4NDUsIDB4NkIsIDB4RjksIDB4QUUsIDB4MDEsIDB4RTIsIDB4RkYsCisJMHhBMiwgMHhGRiwgMHg2MSwgMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKKwkweDAwLCAweDNELCAweEZGLCAweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFELCAweDA3LCAweDQ1LCAweEYyLAorCTB4QzYsIDB4MjYsIDB4RDMsIDB4MzgsIDB4MjQsIDB4RjIsIDB4MkQsIDB4MDYsIDB4MUIsIDB4RkQsIDB4M0IsCisJMHgwMSwgMHg5NSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKKwkweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LCAweEYyLCAweDU0LAorCTB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsCisJMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMSwgMHhGRiwgMHg3NiwKKwkweDAwLCAweDc2LCAweEZGLCAweDMyLCAweDAwLCAweDIyLCAweDAxLCAweDc2LCAweEZBLCAweEEzLCAweDQ2LAorCTB4N0QsIDB4MEYsIDB4MkMsIDB4RjgsIDB4RDUsIDB4MDQsIDB4MTMsIDB4RkQsIDB4OTYsIDB4MDEsIDB4NTEsCisJMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NCwgMHhGRiwKKwkweDYzLCAweDAxLCAweDg0LCAweEZELCAweEVCLCAweDAzLCAweDE0LCAweEZBLCAweDQ3LCAweDBBLCAweDJDLAorCTB4NDgsIDB4RjYsIDB4RkQsIDB4NjMsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RjAsIDB4RkUsIDB4QjgsIDB4MDAsCisJMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKKwkweDAxLCAweDQ3LCAweEZDLCAweEI1LCAweDA2LCAweEIwLCAweEYzLCAweDE5LCAweDFGLCAweDdFLCAweDNFLAorCTB4QzQsIDB4RjMsIDB4RkEsIDB4MDQsIDB4RTcsIDB4RkQsIDB4QzEsIDB4MDAsIDB4RDMsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MSwgMHhGRiwgMHg4MiwgMHgwMSwKKwkweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLCAweEZELCAweDMzLCAweDYyLCAweDJDLCAweEE4LAorCTB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwgMHgyMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweDMxLCAweDAzLCAweEFELCAweEY2LCAweDY1LCAweDQzLCAweERDLCAweDE2LCAweEQxLCAweEY1LAorCTB4RTEsIDB4MDUsIDB4OTksIDB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywgMHhGRiwgMHgxNCwgMHgwMSwgMHgyRCwgMHhGRSwKKwkweDlDLCAweDAyLCAweEFELCAweEZDLCAweEU5LCAweDAzLCAweEY2LCAweDQ4LCAweDczLCAweDAzLCAweEUwLAorCTB4RkMsIDB4ODIsIDB4MDIsIDB4M0IsIDB4RkUsIDB4MEUsIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQywgMHgwMSwgMHg5MSwgMHhGQywgMHhGMywKKwkweDA1LCAweEE2LCAweEY1LCAweDcwLCAweDE3LCAweDE3LCAweDQzLCAweDZELCAweEY2LCAweDU2LCAweDAzLAorCTB4RUEsIDB4RkUsIDB4MkQsIDB4MDAsIDB4MUQsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwgMHg0RSwgMHhGQywgMHgyNCwgMHgwNywKKwkweDlFLCAweEYxLCAweEYyLCAweDJDLCAweDc4LCAweDMzLCAweDhDLCAweEYxLCAweEQwLCAweDA2LCAweEEyLAorCTB4RkMsIDB4ODgsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHhEOCwgMHhGRiwgMHhCNywgMHgwMCwgMHhGOSwgMHhGRCwgMHhERSwgMHgwNCwgMHhFRiwKKwkweEYzLCAweEU0LCAweDNFLCAweDgxLCAweDFFLCAweEQyLCAweEYzLCAweEE5LCAweDA2LCAweDRCLCAweEZDLAorCTB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTUsCisJMHhGRiwgMHhCRSwgMHgwMCwgMHhFMiwgMHhGRSwgMHg0NSwgMHgwMSwgMHgzMywgMHhGRiwgMHg1QSwgMHhGRSwKKwkweDQ4LCAweDQ4LCAweEMzLCAweDA5LCAweDQ3LCAweEZBLCAweEQyLCAweDAzLCAweDkwLCAweEZELCAweDVFLAorCTB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCisJMHg0RiwgMHhGRiwgMHg5QSwgMHgwMSwgMHgwOCwgMHhGRCwgMHhFQiwgMHgwNCwgMHhGQywgMHhGNywgMHgwQSwKKwkweDEwLCAweDcwLCAweDQ2LCAweDIyLCAweEZBLCAweDRELCAweDAxLCAweDE5LCAweDAwLCAweDg0LCAweEZGLAorCTB4NzAsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsCisJMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwKKwkweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLCAweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4OTksIDB4RkYsCisJMHgzMywgMHgwMSwgMHgyOSwgMHhGRCwgMHgxQSwgMHgwNiwgMHgzQiwgMHhGMiwgMHg0QiwgMHgzOSwgMHgzMCwKKwkweDI2LCAweDVCLCAweEYyLCAweDE5LCAweDA3LCAweDMxLCAweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLAorCTB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjgsIDB4MDAsIDB4OTUsCisJMHhGRiwgMHhGQSwgMHhGRiwgMHg4MywgMHgwMSwgMHhCQiwgMHhGOSwgMHgyQiwgMHg0NiwgMHhCQiwgMHgxMCwKKwkweEJGLCAweEY3LCAweDA3LCAweDA1LCAweEZCLCAweEZDLCAweEEwLCAweDAxLCAweDRELCAweEZGLCAweDJGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4NTYsIDB4MDEsCisJMHhBMCwgMHhGRCwgMHhCMywgMHgwMywgMHg4NywgMHhGQSwgMHgxRiwgMHgwOSwgMHg2QSwgMHg0OCwgMHhEOSwKKwkweEZFLCAweEY2LCAweEZFLCAweDY1LCAweDAxLCAweEQwLCAweEZFLCAweEM3LCAweDAwLCAweEEyLCAweEZGLAorCTB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTAsCisJMHhGQywgMHg5OSwgMHgwNiwgMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwgMHgzRiwgMHgyNywgMHhGNCwKKwkweEI5LCAweDA0LCAweDEwLCAweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLCAweEZCLCAweEZGLCAweDAzLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4OTAsIDB4MDEsIDB4OTYsIDB4RkMsCisJMHhERCwgMHgwNiwgMHg4NSwgMHhGMSwgMHhEMCwgMHgzMiwgMHhBNiwgMHgyRCwgMHg5NCwgMHhGMSwgMHgyMCwKKwkweDA3LCAweDU0LCAweEZDLCAweEJGLCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAorCTB4MDcsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4M0MsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4ODMsCisJMHgwMywgMHgyMCwgMHhGNiwgMHhCMiwgMHg0MiwgMHgyQiwgMHgxOCwgMHg3MSwgMHhGNSwgMHgwOSwgMHgwNiwKKwkweDg4LCAweEZDLCAweENGLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELAorCTB4MDAsIDB4ODksIDB4RkYsIDB4MDYsIDB4MDEsIDB4NEMsIDB4RkUsIDB4NjAsIDB4MDIsIDB4MUYsIDB4RkQsCisJMHhFMiwgMHgwMiwgMHhGMywgMHg0OCwgMHg3RCwgMHgwNCwgMHg2RSwgMHhGQywgMHhCRCwgMHgwMiwgMHgxQywKKwkweEZFLCAweDFDLCAweDAxLCAweDgwLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsIDB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsCisJMHhGNiwgMHgyMiwgMHgxNiwgMHhDMywgMHg0MywgMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwKKwkweDExLCAweDAwLCAweDJCLCAweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLAorCTB4MDAsIDB4NDksIDB4RkYsIDB4Q0IsIDB4MDEsIDB4NDUsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjYsIDB4RjEsCisJMHhBRCwgMHgyQiwgMHhBMiwgMHgzNCwgMHg5RSwgMHhGMSwgMHhCNCwgMHgwNiwgMHhCOCwgMHhGQywgMHg3QSwKKwkweDAxLCAweDc1LCAweEZGLCAweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAorCTB4Q0MsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4RDEsIDB4RkQsIDB4MUQsIDB4MDUsIDB4OTEsIDB4RjMsIDB4RkUsCisJMHgzRCwgMHhENywgMHgxRiwgMHg4NywgMHhGMywgMHhDMywgMHgwNiwgMHg0MiwgMHhGQywgMHhFNSwgMHgwMSwKKwkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFCLCAweEZGLCAweEFGLAorCTB4MDAsIDB4MDEsIDB4RkYsIDB4MEEsIDB4MDEsIDB4OUUsIDB4RkYsIDB4N0MsIDB4RkQsIDB4MDMsIDB4NDgsCisJMHhFRCwgMHgwQSwgMHhENSwgMHhGOSwgMHgwQSwgMHgwNCwgMHg3NCwgMHhGRCwgMHg2QSwgMHgwMSwgMHg2MiwKKwkweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLAorCTB4OTAsIDB4MDEsIDB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsIDB4RTEsCisJMHg0NiwgMHhFMSwgMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwgMHgwMCwKKwkweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAorCTB4MDEsIDB4MzMsIDB4RkMsIDB4MDQsIDB4MDcsIDB4QjEsIDB4RjIsIDB4MjEsIDB4MjQsIDB4RTYsIDB4M0EsCisJMHg5NywgMHhGMiwgMHhEMCwgMHgwNSwgMHg1QiwgMHhGRCwgMHgxNSwgMHgwMSwgMHhBOSwgMHhGRiwgMHgwRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDkwLCAweEZGLCAweDQ1LCAweDAxLAorCTB4MEIsIDB4RkQsIDB4NDQsIDB4MDYsIDB4MEEsIDB4RjIsIDB4M0IsIDB4MzgsIDB4ODAsIDB4MjcsIDB4MkIsCisJMHhGMiwgMHgyMiwgMHgwNywgMHgzMywgMHhGQywgMHhERSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweEZELCAweEZGLCAweDBELCAweDAwLCAweENELCAweEZGLCAweDU5LCAweDAwLCAweEIzLCAweEZGLCAweEM0LAorCTB4RkYsIDB4RTIsIDB4MDEsIDB4MDksIDB4RjksIDB4QUEsIDB4NDUsIDB4RkUsIDB4MTEsIDB4NTQsIDB4RjcsCisJMHgzOCwgMHgwNSwgMHhFNCwgMHhGQywgMHhBQSwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LCAweDAxLCAweEJDLCAweEZELAorCTB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsIDB4QzMsIDB4RkYsIDB4ODksCisJMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVCLCAweEZDLCAweDdCLAorCTB4MDYsIDB4NTAsIDB4RjQsIDB4NkUsIDB4MUMsIDB4MzYsIDB4NDAsIDB4OTIsIDB4RjQsIDB4NzUsIDB4MDQsCisJMHgzQiwgMHhGRSwgMHg5MSwgMHgwMCwgMHhFQiwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlELCAweDAxLCAweDg0LCAweEZDLCAweEYzLCAweDA2LAorCTB4N0QsIDB4RjEsIDB4OUUsIDB4MzEsIDB4RTYsIDB4MkUsIDB4ODUsIDB4RjEsIDB4MTYsIDB4MDcsIDB4NjEsCisJMHhGQywgMHhCNSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwKKwkweEVDLCAweEZGLCAweDA4LCAweDAwLCAweDU3LCAweDAwLCAweDlGLCAweEZFLCAweEQxLCAweDAzLCAweDlCLAorCTB4RjUsIDB4RjcsIDB4NDEsIDB4N0MsIDB4MTksIDB4MTMsIDB4RjUsIDB4MkYsIDB4MDYsIDB4NzgsIDB4RkMsCisJMHhENSwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RiwKKwkweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LCAweDAyLCAweDkxLCAweEZELCAweEUzLCAweDAxLAorCTB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsIDB4RjgsIDB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsCisJMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKKwkweDQyLCAweEZGLCAweEJELCAweDAxLCAweEI2LCAweEZDLCAweDlGLCAweDA1LCAweDZDLCAweEY2LCAweEQ2LAorCTB4MTQsIDB4NjUsIDB4NDQsIDB4OTgsIDB4RjcsIDB4QUMsIDB4MDIsIDB4NEUsIDB4RkYsIDB4RjQsIDB4RkYsCisJMHgzOSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwKKwkweEZGLCAweEQyLCAweDAxLCAweDNELCAweEZDLCAweDJCLCAweDA3LCAweEQ0LCAweEYxLCAweDY0LCAweDJBLAorCTB4QzYsIDB4MzUsIDB4QjcsIDB4RjEsIDB4OTYsIDB4MDYsIDB4Q0YsIDB4RkMsIDB4NkIsIDB4MDEsIDB4N0QsCisJMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDMSwgMHhGRiwKKwkweEU1LCAweDAwLCAweEFBLCAweEZELCAweDU4LCAweDA1LCAweDNBLCAweEYzLCAweDExLCAweDNELCAweDJDLAorCTB4MjEsIDB4M0YsIDB4RjMsIDB4REEsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwKKwkweEZGLCAweEQwLCAweDAwLCAweDA3LCAweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLAorCTB4NjMsIDB4RjksIDB4NDIsIDB4MDQsIDB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NSwgMHgwMSwKKwkweDM5LCAweEZELCAweDg0LCAweDA0LCAweEQ5LCAweEY4LCAweDk1LCAweDBELCAweDQ4LCAweDQ3LCAweEE3LAorCTB4RkIsIDB4ODYsIDB4MDAsIDB4OEEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4OEUsIDB4MDAsIDB4QjgsIDB4RkYsCisJMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwKKwkweEZDLCAweEYzLCAweDA2LCAweEVFLCAweEYyLCAweENELCAweDIyLCAweEU0LCAweDNCLCAweERDLCAweEYyLAorCTB4OUMsIDB4MDUsIDB4N0UsIDB4RkQsIDB4MDAsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4NywgMHhGRiwgMHg1NywgMHgwMSwgMHhFRiwgMHhGQywKKwkweDZCLCAweDA2LCAweEUwLCAweEYxLCAweDIzLCAweDM3LCAweENFLCAweDI4LCAweDAxLCAweEYyLCAweDI4LAorCTB4MDcsIDB4MzYsIDB4RkMsIDB4RDksIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwKKwkweDAyLCAweDVFLCAweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LAorCTB4Q0YsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyMywgMHgwMCwgMHg3NCwgMHhGRiwgMHgzQywgMHgwMSwgMHhEQSwgMHhGRCwgMHg0MCwgMHgwMywKKwkweDZFLCAweEZCLCAweEUxLCAweDA2LCAweEMzLCAweDQ4LCAweEIzLCAweDAwLCAweDFBLCAweEZFLCAweERDLAorCTB4MDEsIDB4OTEsIDB4RkUsIDB4RTUsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwgMHg2NywgMHhGQywgMHg1QSwgMHgwNiwgMHhBNiwKKwkweEY0LCAweDFCLCAweDFCLCAweDA3LCAweDQxLCAweDA0LCAweEY1LCAweDJELCAweDA0LCAweDY3LCAweEZFLAorCTB4NzcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsCisJMHgwMCwgMHg1QywgMHhGRiwgMHhBOCwgMHgwMSwgMHg3MywgMHhGQywgMHgwNSwgMHgwNywgMHg3RCwgMHhGMSwKKwkweDY3LCAweDMwLCAweDIxLCAweDMwLCAweDdFLCAweEYxLCAweDA4LCAweDA3LCAweDZGLCAweEZDLCAweEFCLAorCTB4MDEsIDB4NUIsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwgMHhGNSwgMHgzMiwKKwkweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLCAweERBLCAweDAxLAorCTB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTgsCisJMHgwMCwgMHg4QSwgMHhGRSwgMHhFOSwgMHgwMSwgMHgwMSwgMHhGRSwgMHhFQSwgMHgwMCwgMHhDQiwgMHg0OCwKKwkweEEyLCAweDA2LCAweDg3LCAweEZCLCAweDMzLCAweDAzLCAweEUwLCAweEZELCAweDM5LCAweDAxLCAweDc1LAorCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsCisJMHhCNSwgMHgwMSwgMHhDQSwgMHhGQywgMHg3MiwgMHgwNSwgMHhEMywgMHhGNiwgMHg4RCwgMHgxMywgMHhGRCwKKwkweDQ0LCAweDM5LCAweEY4LCAweDUzLCAweDAyLCAweDgyLCAweEZGLCAweEQ3LCAweEZGLCAweDQ3LCAweDAwLAorCTB4RDMsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDgsCisJMHgwMSwgMHgzNywgMHhGQywgMHgyOSwgMHgwNywgMHhGOCwgMHhGMSwgMHgxOSwgMHgyOSwgMHhFNSwgMHgzNiwKKwkweEQ4LCAweEYxLCAweDczLCAweDA2LCAweEU5LCAweEZDLCAweDVCLCAweDAxLCAweDg1LCAweEZGLCAweDFDLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjYsIDB4RkYsIDB4RkIsIDB4MDAsCisJMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwgMHgxQywgMHgzQywgMHg4MSwgMHgyMiwgMHhGQywKKwkweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjcsIDB4RkYsIDB4OTEsIDB4MDAsIDB4NDAsIDB4RkYsIDB4OTYsCisJMHgwMCwgMHg2RiwgMHgwMCwgMHhENSwgMHhGQiwgMHg1RSwgMHg0NywgMHg1MCwgMHgwRCwgMHhGMiwgMHhGOCwKKwkweDc4LCAweDA0LCAweDNGLCAweEZELCAweDgyLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzksIDB4MDEsIDB4NTMsIDB4RkQsCisJMHg0RSwgMHgwNCwgMHg0QSwgMHhGOSwgMHg2MCwgMHgwQywgMHhBMywgMHg0NywgMHg3NiwgMHhGQywgMHgxRiwKKwkweDAwLCAweEMzLCAweDAwLCAweDI3LCAweEZGLCAweDlELCAweDAwLCAweEIyLCAweEZGLCAweDEzLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4REYsCisJMHgwNiwgMHgzMCwgMHhGMywgMHg3OCwgMHgyMSwgMHhEQiwgMHgzQywgMHgyOCwgMHhGMywgMHg2NSwgMHgwNSwKKwkweEEyLCAweEZELCAweEVBLCAweDAwLCAweEJFLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsIDB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsCisJMHhCRSwgMHhGMSwgMHgwNiwgMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywKKwkweEZDLCAweEQzLCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLAorCTB4RDgsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RUUsIDB4RkYsIDB4NUEsIDB4RkYsIDB4OTgsIDB4MDIsIDB4QkIsCisJMHhGNywgMHg4NywgMHg0NCwgMHg4QywgMHgxNCwgMHg4MywgMHhGNiwgMHg5NSwgMHgwNSwgMHhCQSwgMHhGQywKKwkweEJCLCAweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLAorCTB4MDAsIDB4NzksIDB4RkYsIDB4MkUsIDB4MDEsIDB4RjcsIDB4RkQsIDB4MDUsIDB4MDMsIDB4RTEsIDB4RkIsCisJMHhDQSwgMHgwNSwgMHhERiwgMHg0OCwgMHhBQiwgMHgwMSwgMHhBQSwgMHhGRCwgMHgxOCwgMHgwMiwgMHg3MiwKKwkweEZFLCAweEY0LCAweDAwLCAweDkwLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAorCTB4MzksIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzUsIDB4RkMsIDB4MzcsIDB4MDYsIDB4RkYsIDB4RjQsIDB4QzcsCisJMHgxOSwgMHhDQywgMHg0MSwgMHg3RiwgMHhGNSwgMHhFMiwgMHgwMywgMHg5NSwgMHhGRSwgMHg1RCwgMHgwMCwKKwkweDA1LCAweDAwLCAweEVELCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LAorCTB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsCisJMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywgMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwKKwkweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY1LCAweEZGLCAweEVFLCAweEZGLAorCTB4OEIsIDB4MDAsIDB4NDQsIDB4RkUsIDB4NjUsIDB4MDQsIDB4QUEsIDB4RjQsIDB4NjYsIDB4NDAsIDB4MjMsCisJMHgxQywgMHg2MywgMHhGNCwgMHg3NCwgMHgwNiwgMHg1RCwgMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDlBLCAweEZGLCAweEQ5LCAweDAwLCAweEFBLAorCTB4RkUsIDB4QUUsIDB4MDEsIDB4NzAsIDB4RkUsIDB4RjgsIDB4RkYsIDB4QTYsIDB4NDgsIDB4QkUsIDB4MDcsCisJMHgxNCwgMHhGQiwgMHg2RCwgMHgwMywgMHhDMywgMHhGRCwgMHg0NiwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFDLCAweDAxLAorCTB4REYsIDB4RkMsIDB4NDMsIDB4MDUsIDB4M0MsIDB4RjcsIDB4NDYsIDB4MTIsIDB4OEQsIDB4NDUsIDB4RTIsCisJMHhGOCwgMHhGNywgMHgwMSwgMHhCOCwgMHhGRiwgMHhCOSwgMHhGRiwgMHg1NiwgMHgwMCwgMHhDRSwgMHhGRiwKKwkweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERELCAweDAxLCAweDM0LAorCTB4RkMsIDB4MjMsIDB4MDcsIDB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsIDB4MzcsIDB4MDAsIDB4RjIsCisJMHg0RCwgMHgwNiwgMHgwNCwgMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFCLCAweEZGLCAweDEwLCAweDAxLCAweDYyLCAweEZELAorCTB4QzUsIDB4MDUsIDB4QTUsIDB4RjIsIDB4MUYsIDB4M0IsIDB4RDYsIDB4MjMsIDB4QkUsIDB4RjIsIDB4MDEsCisJMHgwNywgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDEwLCAweDAwLCAweEJELCAweEZGLCAweDgyLCAweDAwLCAweDVFLCAweEZGLCAweDVELCAweDAwLCAweEQ0LAorCTB4MDAsIDB4MEMsIDB4RkIsIDB4RjksIDB4NDYsIDB4ODcsIDB4MEUsIDB4ODIsIDB4RjgsIDB4QUQsIDB4MDQsCisJMHgyNiwgMHhGRCwgMHg4RCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZELCAweDAxLCAweDZFLCAweEZELCAweDE3LCAweDA0LAorCTB4QkMsIDB4RjksIDB4MzAsIDB4MEIsIDB4RjQsIDB4NDcsIDB4NEIsIDB4RkQsIDB4QjUsIDB4RkYsIDB4RkQsCisJMHgwMCwgMHgwOCwgMHhGRiwgMHhBQywgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LAorCTB4RjMsIDB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsIDB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsCisJMHhENCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwKKwkweDAwLCAweDc3LCAweEZGLCAweDc3LCAweDAxLCAweEJELCAweEZDLCAweEFFLCAweDA2LCAweEEzLCAweEYxLAorCTB4RTMsIDB4MzQsIDB4NjQsIDB4MkIsIDB4QkMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDMsIDB4RkMsIDB4Q0QsCisJMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERCwgMHhGRiwKKwkweDJFLCAweDAwLCAweDBBLCAweDAwLCAweDI3LCAweEZGLCAweEVGLCAweDAyLCAweDIwLCAweEY3LCAweEU3LAorCTB4NDMsIDB4RDgsIDB4MTUsIDB4MUUsIDB4RjYsIDB4QzAsIDB4MDUsIDB4QTcsIDB4RkMsIDB4QzMsIDB4MDEsCisJMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwKKwkweEZGLCAweDIwLCAweDAxLCAweDE2LCAweEZFLCAweENBLCAweDAyLCAweDU0LCAweEZDLCAweEI5LCAweDA0LAorCTB4RjIsIDB4NDgsIDB4QTksIDB4MDIsIDB4MzksIDB4RkQsIDB4NTMsIDB4MDIsIDB4NTMsIDB4RkUsIDB4MDMsCisJMHgwMSwgMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwKKwkweEQxLCAweDAxLCAweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LCAweDg5LAorCTB4NDIsIDB4MDIsIDB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MDAsCisJMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRCwKKwkweDAxLCAweDU3LCAweEZDLCAweDFFLCAweDA3LCAweDkwLCAweEYxLCAweEVELCAweDJELCAweDhDLCAweDMyLAorCTB4ODMsIDB4RjEsIDB4RTIsIDB4MDYsIDB4OTIsIDB4RkMsIDB4OTMsIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMiwgMHhGRiwgMHhBNCwgMHgwMCwKKwkweDE5LCAweEZFLCAweEFBLCAweDA0LCAweDNFLCAweEY0LCAweDkwLCAweDNGLCAweDc4LCAweDFELCAweDEwLAorCTB4RjQsIDB4OTMsIDB4MDYsIDB4NTIsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwgMHhDQSwgMHgwMCwgMHhDOSwgMHhGRSwgMHg3MywKKwkweDAxLCAweERFLCAweEZFLCAweDBDLCAweEZGLCAweDc2LCAweDQ4LCAweERFLCAweDA4LCAweEExLCAweEZBLAorCTB4QTYsIDB4MDMsIDB4QTYsIDB4RkQsIDB4NTMsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwgMHgwMSwgMHhGNiwgMHhGQywKKwkweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LCAweDkzLCAweEY5LCAweDk4LAorCTB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQiwKKwkweDA3LCAweDUwLCAweEYyLCAweDdCLCAweDI2LCAweDExLCAweDM5LCAweDJGLCAweEYyLCAweDIzLCAweDA2LAorCTB4MjIsIDB4RkQsIDB4MzcsIDB4MDEsIDB4OTcsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgxMiwgMHgwMCwgMHhBMSwgMHhGRiwgMHgyNCwgMHgwMSwgMHg0MSwgMHhGRCwgMHhGNiwgMHgwNSwKKwkweDY3LCAweEYyLCAweDFBLCAweDNBLCAweDI5LCAweDI1LCAweDg0LCAweEYyLCAweDBGLCAweDA3LCAweDMxLAorCTB4RkMsIDB4RTMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsCisJMHhDMiwgMHhGRiwgMHg3MywgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgzOCwgMHgwMSwgMHg0QywKKwkweEZBLCAweDg5LCAweDQ2LCAweEMzLCAweDBGLCAweDE0LCAweEY4LCAweEUwLCAweDA0LCAweDBELCAweEZELAorCTB4OTgsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsCisJMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwgMHhGRCwgMHhERiwgMHgwMywgMHgyRSwgMHhGQSwKKwkweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLCAweDRCLCAweEZGLCAweDM4LCAweDAxLCAweEU5LAorCTB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OSwgMHhGQywgMHhBRiwgMHgwNiwgMHhDMSwgMHhGMywgMHhDRCwKKwkweDFFLCAweEIxLCAweDNFLCAweEQ5LCAweEYzLCAweEVDLCAweDA0LCAweEYwLCAweEZELCAweEJDLCAweDAwLAorCTB4RDUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkYsCisJMHhGRiwgMHg4NSwgMHgwMSwgMHhBNiwgMHhGQywgMHhDQSwgMHgwNiwgMHg4RiwgMHhGMSwgMHhCQiwgMHgzMywKKwkweEFCLCAweDJDLCAweEEzLCAweEYxLCAweDI2LCAweDA3LCAweDRDLCAweEZDLCAweEM1LCAweDAxLCAweDRELAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MjAsIDB4MDAsCisJMHgyNiwgMHgwMCwgMHhGNSwgMHhGRSwgMHg0MywgMHgwMywgMHg4RCwgMHhGNiwgMHgzQywgMHg0MywgMHgyNSwKKwkweDE3LCAweEJCLCAweEY1LCAweEVBLCAweDA1LCAweDk1LCAweEZDLCAweENBLCAweDAxLCAweDNELCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsCisJMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwKKwkweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCisJMHgzRCwgMHhGQywgMHhENiwgMHgwNiwgMHg0QywgMHhGMywgMHhFRCwgMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwKKwkweEYzLCAweDRFLCAweDA1LCAweEIxLCAweEZELCAweEUxLCAweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsCisJMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywgMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywKKwkweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsCisJMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywKKwkweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QzUsIDB4MDEsIDB4NEMsIDB4RkMsIDB4MjYsCisJMHgwNywgMHhBMywgMHhGMSwgMHhBQiwgMHgyQywgMHhCQiwgMHgzMywgMHg4RiwgMHhGMSwgMHhDQSwgMHgwNiwKKwkweEE2LCAweEZDLCAweDg1LCAweDAxLCAweDZGLCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDE2LAorCTB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsIDB4RTksIDB4RkUsIDB4MzgsIDB4MDEsIDB4NEIsIDB4RkYsCisJMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwgMHgwQSwgMHgyRSwgMHhGQSwgMHhERiwgMHgwMywgMHg4QSwKKwkweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MEYsIDB4MDcsIDB4ODQsCisJMHhGMiwgMHgyOSwgMHgyNSwgMHgxQSwgMHgzQSwgMHg2NywgMHhGMiwgMHhGNiwgMHgwNSwgMHg0MSwgMHhGRCwKKwkweDI0LCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM4LAorCTB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsIDB4RjksCisJMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwgMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywgMHhBMiwKKwkweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTIsIDB4RkMsIDB4OTMsIDB4MDYsIDB4MTAsIDB4RjQsIDB4NzgsCisJMHgxRCwgMHg5MCwgMHgzRiwgMHgzRSwgMHhGNCwgMHhBQSwgMHgwNCwgMHgxOSwgMHhGRSwgMHhBNCwgMHgwMCwKKwkweEUyLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLAorCTB4MDAsIDB4NDIsIDB4MDAsIDB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsCisJMHg3NiwgMHgxOCwgMHg1QywgMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwKKwkweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLAorCTB4QzMsIDB4MDEsIDB4QTcsIDB4RkMsIDB4QzAsIDB4MDUsIDB4MUUsIDB4RjYsIDB4RDgsIDB4MTUsIDB4RTcsCisJMHg0MywgMHgyMCwgMHhGNywgMHhFRiwgMHgwMiwgMHgyNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgyRSwgMHgwMCwKKwkweERELCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LAorCTB4MDAsIDB4QzgsIDB4RkQsIDB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsCisJMHg3NiwgMHhGMywgMHhDOCwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLCAweDhELCAweDAxLAorCTB4MjYsIDB4RkQsIDB4QUQsIDB4MDQsIDB4ODIsIDB4RjgsIDB4ODcsIDB4MEUsIDB4RjksIDB4NDYsIDB4MEMsCisJMHhGQiwgMHhENCwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1RSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhCRCwgMHhGRiwKKwkweDEwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LAorCTB4RkQsIDB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsIDB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsCisJMHgyMywgMHgwNywgMHgzNCwgMHhGQywgMHhERCwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLCAweEZGLCAweDQ2LCAweDAxLCAweEMzLCAweEZELAorCTB4NkQsIDB4MDMsIDB4MTQsIDB4RkIsIDB4QkUsIDB4MDcsIDB4QTYsIDB4NDgsIDB4RjgsIDB4RkYsIDB4NzAsCisJMHhGRSwgMHhBRSwgMHgwMSwgMHhBQSwgMHhGRSwgMHhEOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwKKwkweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLCAweDAxLCAweDgwLCAweEZDLCAweEY3LAorCTB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsIDB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsCisJMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQiwKKwkweDAwLCAweDkwLCAweEZGLCAweEY0LCAweDAwLCAweDcyLCAweEZFLCAweDE4LCAweDAyLCAweEFBLCAweEZELAorCTB4QUIsIDB4MDEsIDB4REYsIDB4NDgsIDB4Q0EsIDB4MDUsIDB4RTEsIDB4RkIsIDB4MDUsIDB4MDMsIDB4RjcsCisJMHhGRCwgMHgyRSwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLCAweDA3LCAweERDLAorCTB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsIDB4RDUsIDB4RkMsCisJMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMywgMHgwMCwgMHhCMiwKKwkweEZGLCAweDlELCAweDAwLCAweDI3LCAweEZGLCAweEMzLCAweDAwLCAweDFGLCAweDAwLCAweDc2LCAweEZDLAorCTB4QTMsIDB4NDcsIDB4NjAsIDB4MEMsIDB4NEEsIDB4RjksIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkQsIDB4NzksCisJMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLCAweEYyLCAweDgxLAorCTB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsIDB4RkIsIDB4MDAsCisJMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywKKwkweDAwLCAweEQ3LCAweEZGLCAweDgyLCAweEZGLCAweDUzLCAweDAyLCAweDM5LCAweEY4LCAweEZELCAweDQ0LAorCTB4OEQsIDB4MTMsIDB4RDMsIDB4RjYsIDB4NzIsIDB4MDUsIDB4Q0EsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NDUsCisJMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwKKwkweERBLCAweDAxLCAweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LCAweENFLCAweDFBLCAweDMyLAorCTB4NDEsIDB4MUYsIDB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsIDB4MDAsIDB4RkIsIDB4RkYsCisJMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywKKwkweDAwLCAweDY3LCAweEZFLCAweDJELCAweDA0LCAweDA0LCAweEY1LCAweDA3LCAweDQxLCAweDFCLCAweDFCLAorCTB4QTYsIDB4RjQsIDB4NUEsIDB4MDYsIDB4NjcsIDB4RkMsIDB4REIsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwKKwkweENGLCAweEZDLCAweDY3LCAweDA1LCAweEVBLCAweEY2LCAweDQ0LCAweDEzLCAweDFFLCAweDQ1LCAweDVFLAorCTB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCNCwgMHhGRiwgMHgwMCwgMHgwMSwgMHg3RSwKKwkweEZELCAweDlDLCAweDA1LCAweERDLCAweEYyLCAweEU0LCAweDNCLCAweENELCAweDIyLCAweEVFLCAweEYyLAorCTB4RjMsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwKKwkweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLCAweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LAorCTB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg3RCwgMHhGRiwgMHg2QiwgMHgwMSwgMHhDRiwgMHhGQywgMHg5NiwKKwkweDA2LCAweEI3LCAweEYxLCAweEM2LCAweDM1LCAweDY0LCAweDJBLCAweEQ0LCAweEYxLCAweDJCLCAweDA3LAorCTB4M0QsIDB4RkMsIDB4RDIsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwgMHgyQiwgMHgwMSwgMHhGRSwgMHhGRCwgMHhGOCwgMHgwMiwKKwkweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LCAweDQ4LCAweEUzLCAweDAxLCAweDkxLCAweEZELCAweDI1LAorCTB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsIDB4OEYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyRCwgMHgwMCwgMHg1NSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg2MSwgMHhGQywgMHgxNiwgMHgwNywgMHg4NSwKKwkweEYxLCAweEU2LCAweDJFLCAweDlFLCAweDMxLCAweDdELCAweEYxLCAweEYzLCAweDA2LCAweDg0LCAweEZDLAorCTB4OUQsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUMsCisJMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwgMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywgMHhGRiwKKwkweDlDLCAweDQ4LCAweEZELCAweDA3LCAweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELCAweDQ5LAorCTB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywgMHhGQywgMHgyMiwgMHgwNywgMHgyQiwgMHhGMiwgMHg4MCwKKwkweDI3LCAweDNCLCAweDM4LCAweDBBLCAweEYyLCAweDQ0LCAweDA2LCAweDBCLCAweEZELCAweDQ1LCAweDAxLAorCTB4OTAsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsCisJMHgwMCwgMHg2NSwgMHhGRiwgMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwKKwkweENELCAweDBFLCAweDZBLCAweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLAorCTB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCisJMHhFNSwgMHgwMSwgMHg0MiwgMHhGQywgMHhDMywgMHgwNiwgMHg4NywgMHhGMywgMHhENywgMHgxRiwgMHhGRSwKKwkweDNELCAweDkxLCAweEYzLCAweDFELCAweDA1LCAweEQxLCAweEZELCAweENFLCAweDAwLCAweENDLCAweEZGLAorCTB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsCisJMHgwMCwgMHgxQiwgMHhGRiwgMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwKKwkweDA3LCAweEY2LCAweENBLCAweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0YsIDB4MDEsCisJMHg4OCwgMHhGQywgMHgwOSwgMHgwNiwgMHg3MSwgMHhGNSwgMHgyQiwgMHgxOCwgMHhCMiwgMHg0MiwgMHgyMCwKKwkweEY2LCAweDgzLCAweDAzLCAweENGLCAweEZFLCAweDNDLCAweDAwLCAweDE1LCAweDAwLCAweEU2LCAweEZGLAorCTB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsCisJMHhGRSwgMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwgMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywKKwkweDk5LCAweDA2LCAweDUwLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QTAsIDB4MDEsIDB4RkIsIDB4RkMsCisJMHgwNywgMHgwNSwgMHhCRiwgMHhGNywgMHhCQiwgMHgxMCwgMHgyQiwgMHg0NiwgMHhCQiwgMHhGOSwgMHg4MywKKwkweDAxLCAweEZBLCAweEZGLCAweDk1LCAweEZGLCAweDY4LCAweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsCisJMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwgMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywKKwkweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4NUUsIDB4MDEsIDB4OTAsIDB4RkQsIDB4RDIsIDB4MDMsCisJMHg0NywgMHhGQSwgMHhDMywgMHgwOSwgMHg0OCwgMHg0OCwgMHg1QSwgMHhGRSwgMHgzMywgMHhGRiwgMHg0NSwKKwkweDAxLCAweEUyLCAweEZFLCAweEJFLCAweDAwLCAweEE1LCAweEZGLCAweDE2LCAweDAwLCAweEZELCAweEZGLAorCTB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsIDB4MDYsIDB4OEMsCisJMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywgMHg0RSwgMHhGQywKKwkweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDFFLCAweDAwLCAweDg2LAorCTB4RkYsIDB4MEUsIDB4MDEsIDB4M0IsIDB4RkUsIDB4ODIsIDB4MDIsIDB4RTAsIDB4RkMsIDB4NzMsIDB4MDMsCisJMHhGNiwgMHg0OCwgMHhFOSwgMHgwMywgMHhBRCwgMHhGQywgMHg5QywgMHgwMiwgMHgyRCwgMHhGRSwgMHgxNCwKKwkweDAxLCAweDgzLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLAorCTB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsIDB4RjEsIDB4NjIsCisJMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywgMHg4MiwgMHgwMSwKKwkweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI4LAorCTB4MDAsIDB4RjAsIDB4RkUsIDB4MkIsIDB4MDEsIDB4NjMsIDB4RkYsIDB4RjYsIDB4RkQsIDB4MkMsIDB4NDgsCisJMHg0NywgMHgwQSwgMHgxNCwgMHhGQSwgMHhFQiwgMHgwMywgMHg4NCwgMHhGRCwgMHg2MywgMHgwMSwgMHg2NCwKKwkweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLCAweEZGLAorCTB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsIDB4REQsIDB4MjQsIDB4NTQsCisJMHgzQSwgMHg3NCwgMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwgMHgwMSwgMHhBMywgMHhGRiwKKwkweDExLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYxLCAweDAwLCAweEEyLAorCTB4RkYsIDB4RTIsIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkIsIDB4RjksIDB4RjIsIDB4NDUsIDB4NEEsIDB4MTEsCisJMHg4RiwgMHhGNywgMHgxRCwgMHgwNSwgMHhGMSwgMHhGQywgMHhBNCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyRiwKKwkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUxLCAweDAxLAorCTB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsIDB4MjIsIDB4RjQsIDB4MkMsIDB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsCisJMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywgMHhGRSwgMHg5RiwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwKKwkweDA0LCAweDAwLCAweDA3LCAweDAwLCAweEU5LCAweEZGLCAweDBGLCAweDAwLCAweDQ4LCAweDAwLCAweEI5LAorCTB4RkUsIDB4QTYsIDB4MDMsIDB4RTQsIDB4RjUsIDB4NjAsIDB4NDIsIDB4QzEsIDB4MTgsIDB4NDcsIDB4RjUsCisJMHgxQSwgMHgwNiwgMHg4MSwgMHhGQywgMHhEMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLAorCTB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsIDB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsCisJMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwgMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwKKwkweDAyLCAweDAwLCAweDA0LCAweDAwLCAweEM3LCAweEZGLCAweEQ5LCAweDAwLCAweEJGLCAweEZELCAweDM4LAorCTB4MDUsIDB4NjksIDB4RjMsIDB4OTYsIDB4M0QsIDB4NkYsIDB4MjAsIDB4NjYsIDB4RjMsIDB4Q0UsIDB4MDYsCisJMHgzRiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLCAweDhCLCAweDAxLCAweDJCLCAweEZELCAweEExLCAweDA0LAorCTB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsIDB4NDcsIDB4MzgsIDB4RkIsIDB4QkUsIDB4MDAsIDB4NkEsCisJMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDE5LCAweDAwLCAweDhDLCAweEZGLCAweDRELCAweDAxLCAweEZFLCAweEZDLCAweDU2LCAweDA2LCAweEY3LAorCTB4RjEsIDB4QkYsIDB4MzcsIDB4MTUsIDB4MjgsIDB4MTgsIDB4RjIsIDB4MjUsIDB4MDcsIDB4MzQsIDB4RkMsCisJMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwKKwkweDAwLCAweDcxLCAweEZGLCAweDQzLCAweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLCAweEZCLAorCTB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsIDB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsIDB4QTMsCisJMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKKwkweDYwLCAweEZGLCAweEEyLCAweDAxLCAweDdDLCAweEZDLCAweEZCLCAweDA2LCAweDdDLCAweEYxLCAweDE1LAorCTB4MzEsIDB4NzMsIDB4MkYsIDB4ODEsIDB4RjEsIDB4MTAsIDB4MDcsIDB4NjcsIDB4RkMsIDB4QjEsIDB4MDEsCisJMHg1OCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwKKwkweDAwLCAweDc5LCAweEZFLCAweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LAorCTB4MDcsIDB4MDYsIDB4QzcsIDB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsCisJMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwKKwkweEQ1LCAweDAxLCAweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEUzLCAweEYxLCAweEQxLCAweDI5LCAweDQ2LAorCTB4MzYsIDB4QzUsIDB4RjEsIDB4ODcsIDB4MDYsIDB4REEsIDB4RkMsIDB4NjQsIDB4MDEsIDB4ODAsIDB4RkYsCisJMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwKKwkweEZGLCAweEI2LCAweDAwLCAweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLAorCTB4MzEsIDB4RjksIDB4NUEsIDB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwKKwkweDM3LCAweEZDLCAweEVCLCAweDA2LCAweDBCLCAweEYzLCAweDM1LCAweDIyLCAweDUyLCAweDNDLCAweEZELAorCTB4RjIsIDB4ODQsIDB4MDUsIDB4OEQsIDB4RkQsIDB4RjYsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDksIDB4MDAsCisJMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywKKwkweEZGLCAweDY3LCAweDAyLCAweDE0LCAweEY4LCAweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LAorCTB4N0MsIDB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOSwgMHgwMSwgMHg2RCwgMHhGQywKKwkweDRCLCAweDA2LCAweENELCAweEY0LCAweDgzLCAweDFBLCAweDVGLCAweDQxLCAweDNBLCAweEY1LCAweDBDLAorCTB4MDQsIDB4N0IsIDB4RkUsIDB4NkMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwKKwkweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLCAweDkzLCAweEY0LCAweDYyLCAweDA2LAorCTB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMSwgMHgwMSwgMHhEMywgMHhGQywgMHg1RCwgMHgwNSwKKwkweDAxLCAweEY3LCAweEZCLCAweDEyLCAweDNGLCAweDQ1LCAweDgzLCAweEY4LCAweDJBLCAweDAyLCAweDlBLAorCTB4RkYsIDB4Q0EsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwgMHgwNSwgMHhDQywKKwkweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LCAweDM1LCAweEZDLAorCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksCisJMHgwMCwgMHg1RSwgMHhGRiwgMHg3NCwgMHgwMSwgMHg1RiwgMHhGRCwgMHgzNSwgMHgwNCwgMHg3QywgMHhGOSwKKwkweEQ4LCAweDBCLCAweEM5LCAweDQ3LCAweEQ0LCAweEZDLCAweEYwLCAweEZGLCAweERELCAweDAwLCAweDE5LAorCTB4RkYsIDB4QTQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsCisJMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwgMHhGMSwgMHg4NiwKKwkweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLCAweEQxLCAweDAxLAorCTB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsCisJMHhGRiwgMHgyNywgMHgwMSwgMHgwNSwgMHhGRSwgMHhFQiwgMHgwMiwgMHgxNCwgMHhGQywgMHg1MCwgMHgwNSwKKwkweEVBLCAweDQ4LCAweDFCLCAweDAyLCAweDc4LCAweEZELCAweDMyLCAweDAyLCAweDY0LCAweEZFLCAweEZBLAorCTB4MDAsIDB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsCisJMHhCNywgMHgwMSwgMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwgMHg5RiwgMHgyRSwgMHhFMywKKwkweDMxLCAweDdFLCAweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLCAweDAxLCAweDY0LCAweEZGLAorCTB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUQsIDB4RkYsIDB4RDMsIDB4MDAsIDB4QjgsCisJMHhGRSwgMHg5MywgMHgwMSwgMHhBMSwgMHhGRSwgMHg4RSwgMHhGRiwgMHg5MiwgMHg0OCwgMHgzRCwgMHgwOCwKKwkweEUxLCAweEZBLCAweDg2LCAweDAzLCAweEI2LCAweEZELCAweDRDLCAweDAxLCAweDZELCAweEZGLCAweDI1LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REYsIDB4MDEsCisJMHgzMywgMHhGQywgMHgyMCwgMHgwNywgMHgzNSwgMHhGMiwgMHgzNiwgMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwKKwkweEYyLCAweDNCLCAweDA2LCAweDExLCAweEZELCAweDQxLCAweDAxLCAweDkyLCAweEZGLCAweDE3LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkYsIDB4RkYsIDB4N0IsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NDQsCisJMHgwMCwgMHgwMSwgMHgwMSwgMHhCNiwgMHhGQSwgMHhDOCwgMHg0NiwgMHgxMywgMHgwRiwgMHg1MSwgMHhGOCwKKwkweEM0LCAweDA0LCAweDFCLCAweEZELCAweDkyLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsCisJMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwgMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwKKwkweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLCAweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorCTB4MDksIDB4MDAsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MTAsIDB4RkYsIDB4MTUsCisJMHgwMywgMHhERCwgMHhGNiwgMHg5RSwgMHg0MywgMHg2QywgMHgxNiwgMHhGMSwgMHhGNSwgMHhEMywgMHgwNSwKKwkweDlGLCAweEZDLCAweEM2LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4OEMsIDB4RkMsIDB4MDAsIDB4MDYsCisJMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwgMHg0MiwgMHgzRiwgMHhGNiwgMHg3MSwgMHgwMywgMHhEOSwKKwkweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLCAweEU1LCAweEZGLCAweDA3LCAweDAwLCAweDAzLCAweDAwLAorCTB4RkMsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUYsIDB4MDAsIDB4MDcsIDB4RkUsIDB4QzgsIDB4MDQsIDB4MTAsCisJMHhGNCwgMHgyRCwgMHgzRiwgMHgwRiwgMHgxRSwgMHhFRCwgMHhGMywgMHhBMCwgMHgwNiwgMHg0RSwgMHhGQywKKwkweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLAorCTB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsIDB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsIDB4RjcsCisJMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwgMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwgMHg4RSwKKwkweEZGLCAweDZCLCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLCAweEZGLCAweEZGLCAweDEzLCAweDAwLAorCTB4OUQsIDB4RkYsIDB4MkQsIDB4MDEsIDB4MzMsIDB4RkQsIDB4MEIsIDB4MDYsIDB4NEQsIDB4RjIsIDB4QTUsCisJMHgzOSwgMHhCRiwgMHgyNSwgMHg2RCwgMHhGMiwgMHgxNSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKKwkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LAorCTB4RkYsIDB4NUIsIDB4MDEsIDB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksCisJMHg1NywgMHg0OCwgMHg4RCwgMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwKKwkweDAwLCAweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZDLCAweEZGLAorCTB4OEIsIDB4MDEsIDB4OUQsIDB4RkMsIDB4RDUsIDB4MDYsIDB4ODksIDB4RjEsIDB4MzUsIDB4MzMsIDB4M0EsCisJMHgyRCwgMHg5QSwgMHhGMSwgMHgyMywgMHgwNywgMHg1MSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0RiwgMHhGRiwKKwkweDJGLCAweDAwLCAweEZELCAweEZGLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLAorCTB4RkUsIDB4NzQsIDB4MDIsIDB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsCisJMHg5NCwgMHhGQywgMHhBOSwgMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM5LCAweDAxLAorCTB4NDgsIDB4RkMsIDB4MjgsIDB4MDcsIDB4QUQsIDB4RjEsIDB4MTksIDB4MkMsIDB4M0YsIDB4MzQsIDB4OTcsCisJMHhGMSwgMHhCRSwgMHgwNiwgMHhCMCwgMHhGQywgMHg3RiwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwKKwkweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE5LCAweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELAorCTB4MDEsIDB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsIDB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksCisJMHhGOCwgMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLAorCTB4MDksIDB4MDcsIDB4OUQsIDB4RjIsIDB4OTIsIDB4MjQsIDB4OEYsIDB4M0EsIDB4ODIsIDB4RjIsIDB4RTEsCisJMHgwNSwgMHg1MCwgMHhGRCwgMHgxQiwgMHgwMSwgMHhBNiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LCAweEZGLCAweEQ2LCAweEZGLCAweEMzLAorCTB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsIDB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsCisJMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU3LCAweEZDLCAweDg1LCAweDA2LAorCTB4MzQsIDB4RjQsIDB4RTAsIDB4MUMsIDB4RjAsIDB4M0YsIDB4NkQsIDB4RjQsIDB4OEMsIDB4MDQsIDB4MkMsCisJMHhGRSwgMHg5OSwgMHgwMCwgMHhFNywgMHhGRiwgMHhGOCwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LCAweDAzLCAweEM3LAorCTB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsIDB4N0QsIDB4RkMsCisJMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwKKwkweDAwLCAweDQxLCAweEZGLCAweEMwLCAweDAxLCAweEFGLCAweEZDLCAweEFELCAweDA1LCAweDRBLCAweEY2LAorCTB4NDQsIDB4MTUsIDB4MkYsIDB4NDQsIDB4NjQsIDB4RjcsIDB4QzksIDB4MDIsIDB4M0QsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LCAweEYzLCAweDYxLAorCTB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsIDB4RTYsIDB4MDEsCisJMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwKKwkweEZGLCAweDg4LCAweDAxLCAweDMxLCAweEZELCAweDk1LCAweDA0LCAweEI0LCAweEY4LCAweEZDLCAweDBELAorCTB4MjYsIDB4NDcsIDB4NjQsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4NTEsIDB4RkYsIDB4ODksCisJMHgwMCwgMHhCQSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QSwgMHhGRiwKKwkweDUxLCAweDAxLCAweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLCAweDgyLCAweDM3LCAweDYwLAorCTB4MjgsIDB4MEUsIDB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg0MCwKKwkweDAxLCAweEQwLCAweEZELCAweDUzLCAweDAzLCAweDQ3LCAweEZCLCAweDNGLCAweDA3LCAweEI4LCAweDQ4LAorCTB4NjIsIDB4MDAsIDB4M0YsIDB4RkUsIDB4QzgsIDB4MDEsIDB4OUMsIDB4RkUsIDB4RTAsIDB4MDAsIDB4OTgsCisJMHhGRiwgMHgxOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwKKwkweDc4LCAweEZDLCAweEZGLCAweDA2LCAweDdELCAweEYxLCAweENGLCAweDMwLCAweEI4LCAweDJGLCAweDgwLAorCTB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsIDB4RkMsIDB4QUUsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MywgMHhGRiwgMHhFRCwgMHgwMCwgMHg4MCwgMHhGRSwgMHhGRCwKKwkweDAxLCAweERDLCAweEZELCAweDNDLCAweDAxLCAweEQ1LCAweDQ4LCAweDQ1LCAweDA2LCAweEFFLCAweEZCLAorCTB4MUYsIDB4MDMsIDB4RUEsIDB4RkQsIDB4MzQsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywgMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywKKwkweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LCAweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLAorCTB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxMiwgMHgwMCwgMHhCNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzNSwgMHhGRiwgMHhBOSwgMHgwMCwgMHg0RCwKKwkweDAwLCAweDE5LCAweEZDLCAweDdDLCAweDQ3LCAweEU4LCAweDBDLCAweDE4LCAweEY5LCAweDY2LCAweDA0LAorCTB4NDgsIDB4RkQsIDB4N0UsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFNiwgMHgwNiwKKwkweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLCAweDNDLCAweDBFLCAweEYzLCAweDc4LCAweDA1LCAweDk2LAorCTB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsCisJMHhENiwgMHhGRiwgMHg0MSwgMHgwMCwgMHhFNCwgMHhGRiwgMHg2QiwgMHhGRiwgMHg3QiwgMHgwMiwgMHhGMCwKKwkweEY3LCAweEJBLCAweDQ0LCAweDFFLCAweDE0LCAweEE1LCAweEY2LCAweDg2LCAweDA1LCAweEMxLCAweEZDLAorCTB4QjksIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwgMHhGNCwKKwkweDM4LCAweDFBLCAweDhDLCAweDQxLCAweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLCAweDY2LAorCTB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjQsIDB4RkYsCisJMHhGMiwgMHhGRiwgMHg4MywgMHgwMCwgMHg1MywgMHhGRSwgMHg0RSwgMHgwNCwgMHhEMCwgMHhGNCwgMHhBQiwKKwkweDQwLCAweEIyLCAweDFCLCAweDdGLCAweEY0LCAweDY5LCAweDA2LCAweDYyLCAweEZDLCAweERELCAweDAxLAorCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsCisJMHhGRiwgMHhBRiwgMHgwMSwgMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwKKwkweDVDLCAweDQ1LCAweEE5LCAweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLAorCTB4MDAsIDB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QUYsIDB4RkYsCisJMHgwOSwgMHgwMSwgMHg2RSwgMHhGRCwgMHhCNCwgMHgwNSwgMHhCQywgMHhGMiwgMHg3MywgMHgzQiwgMHg2NCwKKwkweDIzLCAweEQyLCAweEYyLCAweEZCLCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsCisJMHgwMSwgMHg2NSwgMHhGRCwgMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywKKwkweDAzLCAweEZELCAweEQ5LCAweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4NzksIDB4RkYsIDB4NzIsIDB4MDEsCisJMHhDNCwgMHhGQywgMHhBNCwgMHgwNiwgMHhBQiwgMHhGMSwgMHg0NiwgMHgzNSwgMHhGNywgMHgyQSwgMHhDNiwKKwkweEYxLCAweDJBLCAweDA3LCAweDQwLCAweEZDLCAweENGLCAweDAxLCAweDQ3LCAweEZGLCAweDMxLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsCisJMHhGRSwgMHhERSwgMHgwMiwgMHgyRSwgMHhGQywgMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwKKwkweDVFLCAweEZELCAweDNGLCAweDAyLCAweDVELCAweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4NUIsIDB4RkMsCisJMHgxQiwgMHgwNywgMHg4QiwgMHhGMSwgMHg1OCwgMHgyRSwgMHgyNiwgMHgzMiwgMHg4MCwgMHhGMSwgMHhFQSwKKwkweDA2LCAweDhDLCAweEZDLCAweDk3LCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLAorCTB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsCisJMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwgMHhDNywgMHhGQSwgMHg5MywgMHgwMywKKwkweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0QsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUUsIDB4MDcsCisJMHg0MCwgMHhGMiwgMHhFQiwgMHgyNiwgMHhCNSwgMHgzOCwgMHgxRiwgMHhGMiwgMHgzMiwgMHgwNiwgMHgxOCwKKwkweEZELCAweDNELCAweDAxLCAweDk0LCAweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDBGLCAweDAwLAorCTB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsIDB4MDEsIDB4OEIsCisJMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwgMHgxNSwgMHhGRCwKKwkweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDYsIDB4RkMsIDB4QjgsIDB4MDYsIDB4QTgsIDB4RjMsCisJMHgzRiwgMHgxRiwgMHg2NCwgMHgzRSwgMHhCQSwgMHhGMywgMHgwMSwgMHgwNSwgMHhFMiwgMHhGRCwgMHhDNCwKKwkweDAwLCAweEQyLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA4LCAweDAwLCAweEUxLCAweEZGLAorCTB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsIDB4RjYsIDB4NzcsCisJMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywgMHhDOCwgMHgwMSwKKwkweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELAorCTB4RkYsIDB4Q0MsIDB4MDEsIDB4OEYsIDB4RkMsIDB4RjgsIDB4MDUsIDB4OUIsIDB4RjUsIDB4OTYsIDB4MTcsCisJMHgwMiwgMHg0MywgMHg1RSwgMHhGNiwgMHg1RiwgMHgwMywgMHhFNCwgMHhGRSwgMHgzMCwgMHgwMCwgMHgxQiwKKwkweDAwLCAweEU0LCAweEZGLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweEQ5LCAweEZGLAorCTB4QjQsIDB4MDAsIDB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsIDB4RkMsIDB4M0UsIDB4NUIsCisJMHgxRSwgMHhEQiwgMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwKKwkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlDLAorCTB4MDEsIDB4MDUsIDB4RkQsIDB4RjEsIDB4MDQsIDB4RjAsIDB4RjcsIDB4MkQsIDB4MTAsIDB4NjEsIDB4NDYsCisJMHgwRCwgMHhGQSwgMHg1OCwgMHgwMSwgMHgxMywgMHgwMCwgMHg4NywgMHhGRiwgMHg2RSwgMHgwMCwgMHhDNCwKKwkweEZGLCAweDBFLCAweDAwLCAweEZGLCAweEZGLCAweDE0LCAweDAwLCAweDlCLCAweEZGLCAweDMxLCAweDAxLAorCTB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsIDB4NDEsIDB4RjIsIDB4NkEsIDB4MzksIDB4MEEsIDB4MjYsIDB4NjEsCisJMHhGMiwgMHgxNywgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDU4LCAweDAxLCAweDlELAorCTB4RkQsIDB4QjksIDB4MDMsIDB4N0IsIDB4RkEsIDB4NDAsIDB4MDksIDB4NjMsIDB4NDgsIDB4QkYsIDB4RkUsCisJMHgwMywgMHhGRiwgMHg1RiwgMHgwMSwgMHhENCwgMHhGRSwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLCAweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLAorCTB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsIDB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsCisJMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDFELCAweDAwLCAweDg4LCAweEZGLCAweDA3LCAweDAxLCAweDQ5LCAweEZFLCAweDY3LCAweDAyLCAweDEzLAorCTB4RkQsIDB4RkYsIDB4MDIsIDB4RjQsIDB4NDgsIDB4NUYsIDB4MDQsIDB4N0EsIDB4RkMsIDB4QjYsIDB4MDIsCisJMHgyMCwgMHhGRSwgMHgxQiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweENBLCAweDAxLCAweDQ2LCAweEZDLCAweDI5LCAweDA3LAorCTB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsIDB4MzQsIDB4OUMsIDB4RjEsIDB4QjgsIDB4MDYsIDB4QjUsCisJMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwKKwkweEFBLCAweEZGLCAweEIxLCAweDAwLCAweEZFLCAweEZFLCAweDEwLCAweDAxLCAweDkyLCAweEZGLCAweDk0LAorCTB4RkQsIDB4MEQsIDB4NDgsIDB4Q0IsIDB4MEEsIDB4RTIsIDB4RjksIDB4MDQsIDB4MDQsIDB4NzcsIDB4RkQsCisJMHg2OSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLCAweEYyLAorCTB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsIDB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsIDB4MTcsCisJMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhDQywgMHhGRiwKKwkweDVBLCAweDAwLCAweEFGLCAweEZGLCAweENBLCAweEZGLCAweEQ4LCAweDAxLCAweDFDLCAweEY5LCAweEI4LAorCTB4NDUsIDB4REEsIDB4MTEsIDB4NjAsIDB4RjcsIDB4MzMsIDB4MDUsIDB4RTcsIDB4RkMsIDB4QTksIDB4MDEsCisJMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywKKwkweEZGLCAweERGLCAweDAxLCAweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLAorCTB4MUYsIDB4NDAsIDB4ODUsIDB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsCisJMHhGRiwgMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwOSwgMHgwMCwKKwkweDU0LCAweDAwLCAweEE0LCAweEZFLCAweEM5LCAweDAzLCAweEFBLCAweEY1LCAweDBDLCAweDQyLCAweDU2LAorCTB4MTksIDB4MUUsIDB4RjUsIDB4MkIsIDB4MDYsIDB4N0EsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwKKwkweDAxLCAweEI0LCAweEZDLCAweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LAorCTB4ODYsIDB4RjcsIDB4QjYsIDB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksCisJMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDMiwgMHhGRiwgMHhFMywgMHgwMCwKKwkweEFFLCAweEZELCAweDUyLCAweDA1LCAweDQ0LCAweEYzLCAweDJBLCAweDNELCAweDA2LCAweDIxLCAweDQ3LAorCTB4RjMsIDB4RDgsIDB4MDYsIDB4M0MsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwKKwkweEZELCAweDg5LCAweDA0LCAweENELCAweEY4LCAweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLAorCTB4OTEsIDB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4OCwgMHhGRiwgMHg1NSwgMHgwMSwgMHhGMiwgMHhGQywKKwkweDY3LCAweDA2LCAweEU0LCAweEYxLCAweDQ0LCAweDM3LCAweEFBLCAweDI4LCAweDA1LCAweEYyLCAweDI3LAorCTB4MDcsIDB4MzYsIDB4RkMsIDB4REEsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwgMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwKKwkweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LCAweDk4LCAweDAwLCAweDI2LCAweEZFLAorCTB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHhBNywgMHgwMSwgMHg3NSwgMHhGQywgMHgwMywgMHgwNywKKwkweDdELCAweEYxLCAweDhBLCAweDMwLCAweEZGLCAweDJGLCAweDdFLCAweEYxLCAweDBBLCAweDA3LCAweDZFLAorCTB4RkMsIDB4QUMsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUEsIDB4MDAsCisJMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwgMHhGRCwgMHgwNSwKKwkweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLCAweEU0LCAweEZELAorCTB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOCwgMHhGQywgMHgyOSwgMHgwNywgMHhGMywgMHhGMSwKKwkweDNFLCAweDI5LCAweEM2LCAweDM2LCAweEQ0LCAweEYxLCAweDc3LCAweDA2LCAweEU2LCAweEZDLCAweDVDLAorCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjYsIDB4RkYsCisJMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwgMHhGQiwgMHg2OSwKKwkweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELCAweDgxLCAweDAxLAorCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsCisJMHhGRiwgMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhFMiwgMHgwNiwgMHgyOCwgMHhGMywgMHg5RSwgMHgyMSwKKwkweEMwLCAweDNDLCAweDFGLCAweEYzLCAweDZDLCAweDA1LCAweDlFLCAweEZELCAweEVELCAweDAwLCAweEJELAorCTB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0UsIDB4MDAsCisJMHhFQSwgMHhGRiwgMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywgMHg5OSwgMHg0NCwgMHg2OCwKKwkweDE0LCAweDhFLCAweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLCAweDAxLCAweDQzLCAweEZGLAorCTB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsCisJMHgwMSwgMHg3MywgMHhGQywgMHgzQiwgMHgwNiwgMHhGNSwgMHhGNCwgMHhFRCwgMHgxOSwgMHhCNywgMHg0MSwKKwkweDcxLCAweEY1LCAweEVCLCAweDAzLCAweDkwLCAweEZFLCAweDYwLCAweDAwLCAweDA0LCAweDAwLCAweEVELAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsCisJMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwgMHhCNywgMHhGNCwgMHg3RCwgMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywKKwkweEY0LCAweDcwLCAweDA2LCAweDVGLCAweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUQsIDB4MDEsIDB4REQsCisJMHhGQywgMHg0OCwgMHgwNSwgMHgzMCwgMHhGNywgMHg2QiwgMHgxMiwgMHg3RCwgMHg0NSwgMHhDRiwgMHhGOCwKKwkweDAxLCAweDAyLCAweEIyLCAweEZGLCAweEJELCAweEZGLCAweDU0LCAweDAwLCAweENFLCAweEZGLCAweDBDLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsCisJMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwgMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwKKwkweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkUsIDB4MDEsIDB4NkIsIDB4RkQsIDB4MUQsCisJMHgwNCwgMHhBRiwgMHhGOSwgMHg1MSwgMHgwQiwgMHhFQywgMHg0NywgMHgzMywgMHhGRCwgMHhDMSwgMHhGRiwKKwkweEY3LCAweDAwLCAweDBDLCAweEZGLCAweEFBLCAweDAwLCAweEFELCAweEZGLCAweDE0LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsIDB4NzUsIDB4MDEsIDB4QkYsIDB4RkMsIDB4QUIsIDB4MDYsCisJMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwgMHgyQiwgMHhCRiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MiwKKwkweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjEsIDB4MDEsIDB4MTIsIDB4RkUsIDB4RDEsIDB4MDIsIDB4NDcsCisJMHhGQywgMHhENywgMHgwNCwgMHhGMCwgMHg0OCwgMHg4RCwgMHgwMiwgMHg0NSwgMHhGRCwgMHg0RCwgMHgwMiwKKwkweDU2LCAweEZFLCAweDAxLCAweDAxLCAweDhCLCAweEZGLCAweDFELCAweDAwLCAweEZELCAweEZGLCAweDJFLAorCTB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsIDB4RjEsCisJMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywgMHg5NCwKKwkweDAxLCAweDY3LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLAorCTB4Q0MsIDB4MDAsIDB4QzYsIDB4RkUsIDB4NzksIDB4MDEsIDB4RDIsIDB4RkUsIDB4MjYsIDB4RkYsIDB4N0MsCisJMHg0OCwgMHhCRSwgMHgwOCwgMHhBRSwgMHhGQSwgMHhBMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg1MiwgMHgwMSwKKwkweDZCLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLAorCTB4RkYsIDB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsCisJMHhGMiwgMHgzOCwgMHgyQSwgMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwKKwkweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDBGLCAweDAwLCAweEMyLCAweEZGLCAweDc1LCAweDAwLAorCTB4N0EsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MkQsIDB4MDEsIDB4NjEsIDB4RkEsIDB4OTcsIDB4NDYsIDB4QTAsCisJMHgwRiwgMHgyMCwgMHhGOCwgMHhEQSwgMHgwNCwgMHgxMCwgMHhGRCwgMHg5NywgMHgwMSwgMHg1MCwgMHhGRiwKKwkweDJFLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAorCTB4MDEsIDB4NDgsIDB4RkMsIDB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsCisJMHhDRiwgMHhGMywgMHhGMywgMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDAzLCAweDAwLCAweDA4LCAweDAwLCAweEUyLCAweEZGLCAweDIxLCAweDAwLCAweDIzLCAweDAwLAorCTB4RkEsIDB4RkUsIDB4M0EsIDB4MDMsIDB4OUQsIDB4RjYsIDB4NTAsIDB4NDMsIDB4MDAsIDB4MTcsIDB4QzYsCisJMHhGNSwgMHhFNiwgMHgwNSwgMHg5NywgMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweEZFLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLAorCTB4RkMsIDB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsIDB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsCisJMHg0RCwgMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwgMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwKKwkweDAwLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ3LCAweEZGLCAweEJBLCAweDAwLCAweEY0LCAweEZELAorCTB4RTUsIDB4MDQsIDB4RTQsIDB4RjMsIDB4Q0EsIDB4M0UsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4RjMsIDB4QUMsCisJMHgwNiwgMHg0QSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LCAweDAxLCAweDBCLCAweEZELCAweEU2LAorCTB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsIDB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsCisJMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDE1LCAweDAwLCAweDk4LCAweEZGLCAweDM1LCAweDAxLCAweDI1LCAweEZELCAweDFFLCAweDA2LAorCTB4MzUsIDB4RjIsIDB4MkUsIDB4MzksIDB4NTUsIDB4MjYsIDB4NTYsIDB4RjIsIDB4MUEsIDB4MDcsIDB4MzEsCisJMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELCAweDAzLCAweDk0LAorCTB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsIDB4NkMsIDB4MDEsCisJMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwKKwkweDAwLCAweDY5LCAweEZGLCAweDkxLCAweDAxLCAweDk0LCAweEZDLCAweEUwLCAweDA2LCAweDg0LCAweEYxLAorCTB4QUYsIDB4MzIsIDB4Q0EsIDB4MkQsIDB4OTIsIDB4RjEsIDB4MUYsIDB4MDcsIDB4NTYsIDB4RkMsIDB4QkUsCisJMHgwMSwgMHg1MSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwKKwkweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LCAweDAyLCAweEYyLAorCTB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsIDB4MUUsIDB4MDEsCisJMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OSwKKwkweEZGLCAweENDLCAweDAxLCAweDQ0LCAweEZDLCAweDI5LCAweDA3LCAweEI5LCAweEYxLCAweDg5LCAweDJCLAorCTB4QzMsIDB4MzQsIDB4QTAsIDB4RjEsIDB4QjEsIDB4MDYsIDB4QkEsIDB4RkMsIDB4NzksIDB4MDEsIDB4NzYsCisJMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBRSwgMHgwMCwKKwkweDA1LCAweEZGLCAweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELCAweEZELCAweDQ3LCAweDBFLAorCTB4MEIsIDB4QzgsIDB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsIDB4MDEsIDB4NjEsIDB4RkYsCisJMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKKwkweDAxLCAweDMzLCAweEZDLCAweDAzLCAweDA3LCAweEI3LCAweEYyLCAweEZDLCAweDIzLCAweDAzLCAweDNCLAorCTB4OUUsIDB4RjIsIDB4Q0IsIDB4MDUsIDB4NUYsIDB4RkQsIDB4MTIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4MEUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhDRCwgMHhGRiwgMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwKKwkweEJFLCAweEZGLCAweEVELCAweDAxLCAweEY1LCAweEY4LCAweDlCLCAweDQ1LCAweDIyLCAweDEyLCAweDQ4LAorCTB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsIDB4RkMsIDB4QUIsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QywKKwkweEZDLCAweDc4LCAweDA2LCAweDVBLCAweEY0LCAweDQ5LCAweDFDLCAweDRFLCAweDQwLCAweDlFLCAweEY0LAorCTB4NkQsIDB4MDQsIDB4M0YsIDB4RkUsIDB4OEUsIDB4MDAsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwKKwkweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLCAweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLAorCTB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCQywgMHgwMSwgMHhCOCwgMHhGQywgMHg5QSwKKwkweDA1LCAweDc3LCAweEY2LCAweEIxLCAweDE0LCAweDc3LCAweDQ0LCAweEE5LCAweEY3LCAweEEyLCAweDAyLAorCTB4NTQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RDgsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHhFOCwgMHgwMCwgMHhBNiwgMHhGRCwgMHg1RiwgMHgwNSwKKwkweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLCAweDIxLCAweDM3LCAweEYzLCAweERELCAweDA2LCAweDNCLAorCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyQiwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4MywgMHgwMSwgMHgzQywgMHhGRCwgMHg3RSwgMHgwNCwgMHhFNiwKKwkweEY4LCAweDcyLCAweDBELCAweDUyLCAweDQ3LCAweEJFLCAweEZCLCAweDdBLCAweDAwLCAweDkwLCAweDAwLAorCTB4NDMsIDB4RkYsIDB4OEYsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwgMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywgMHhGMSwKKwkweDA0LCAweDM3LCAweEYzLCAweDI4LCAweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LAorCTB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCisJMHg3NCwgMHhGRiwgMHgzQSwgMHgwMSwgMHhERCwgMHhGRCwgMHgzOSwgMHgwMywgMHg3QiwgMHhGQiwgMHhDMSwKKwkweDA2LCAweEM3LCAweDQ4LCAweENGLCAweDAwLCAweDBELCAweEZFLCAweEUzLCAweDAxLCAweDhFLCAweEZFLAorCTB4RTcsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsCisJMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwKKwkweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLAorCTB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTcsIDB4MDAsCisJMHg4RSwgMHhGRSwgMHhFMywgMHgwMSwgMHgwRCwgMHhGRSwgMHhDRiwgMHgwMCwgMHhDNywgMHg0OCwgMHhDMSwKKwkweDA2LCAweDdCLCAweEZCLCAweDM5LCAweDAzLCAweERELCAweEZELCAweDNBLCAweDAxLCAweDc0LCAweEZGLAorCTB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsCisJMHgwMSwgMHgzNywgMHhGQywgMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywKKwkweERDLCAweEYxLCAweDZGLCAweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjcsIDB4RkYsIDB4OEYsIDB4MDAsIDB4NDMsIDB4RkYsCisJMHg5MCwgMHgwMCwgMHg3QSwgMHgwMCwgMHhCRSwgMHhGQiwgMHg1MiwgMHg0NywgMHg3MiwgMHgwRCwgMHhFNiwKKwkweEY4LCAweDdFLCAweDA0LCAweDNDLCAweEZELCAweDgzLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsCisJMHhGQywgMHhERCwgMHgwNiwgMHgzNywgMHhGMywgMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywKKwkweDVGLCAweDA1LCAweEE2LCAweEZELCAweEU4LCAweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLAorCTB4MDAsIDB4MEEsIDB4MDAsIDB4RDgsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RjEsIDB4RkYsIDB4NTQsIDB4RkYsCisJMHhBMiwgMHgwMiwgMHhBOSwgMHhGNywgMHg3NywgMHg0NCwgMHhCMSwgMHgxNCwgMHg3NywgMHhGNiwgMHg5QSwKKwkweDA1LCAweEI4LCAweEZDLCAweEJDLCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsCisJMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwgMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywKKwkweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweDA0LAorCTB4MDAsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OEUsIDB4MDAsIDB4M0YsIDB4RkUsIDB4NkQsIDB4MDQsCisJMHg5RSwgMHhGNCwgMHg0RSwgMHg0MCwgMHg0OSwgMHgxQywgMHg1QSwgMHhGNCwgMHg3OCwgMHgwNiwgMHg1QywKKwkweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAorCTB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsIDB4MDUsIDB4NDgsCisJMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwgMHhCRSwgMHhGRiwKKwkweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDBFLAorCTB4MDAsIDB4QUEsIDB4RkYsIDB4MTIsIDB4MDEsIDB4NUYsIDB4RkQsIDB4Q0IsIDB4MDUsIDB4OUUsIDB4RjIsCisJMHgwMywgMHgzQiwgMHhGQywgMHgyMywgMHhCNywgMHhGMiwgMHgwMywgMHgwNywgMHgzMywgMHhGQywgMHhFNSwKKwkweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAorCTB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsIDB4RjksIDB4MEUsCisJMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwgMHgwNSwgMHhGRiwKKwkweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc2LAorCTB4RkYsIDB4NzksIDB4MDEsIDB4QkEsIDB4RkMsIDB4QjEsIDB4MDYsIDB4QTAsIDB4RjEsIDB4QzMsIDB4MzQsCisJMHg4OSwgMHgyQiwgMHhCOSwgMHhGMSwgMHgyOSwgMHgwNywgMHg0NCwgMHhGQywgMHhDQywgMHgwMSwgMHg0OSwKKwkweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLCAweEZGLAorCTB4MUUsIDB4MDEsIDB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsIDB4OUIsIDB4MDQsIDB4RjIsCisJMHg0OCwgMHhDNiwgMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwgMHhGRSwgMHgwNCwgMHgwMSwKKwkweDhBLCAweEZGLCAweDFELCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJFLAorCTB4MDEsIDB4NTYsIDB4RkMsIDB4MUYsIDB4MDcsIDB4OTIsIDB4RjEsIDB4Q0EsIDB4MkQsIDB4QUYsIDB4MzIsCisJMHg4NCwgMHhGMSwgMHhFMCwgMHgwNiwgMHg5NCwgMHhGQywgMHg5MSwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwKKwkweDAwLCAweEZELCAweEZGLCAweDE3LCAweDAwLCAweEExLCAweEZGLCAweEM5LCAweDAwLCAweENELCAweEZFLAorCTB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsIDB4RjMsIDB4RkUsIDB4NzAsIDB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsCisJMHhGQSwgMHhBRCwgMHgwMywgMHhBMywgMHhGRCwgMHg1NSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMxLAorCTB4RkMsIDB4MUEsIDB4MDcsIDB4NTYsIDB4RjIsIDB4NTUsIDB4MjYsIDB4MkUsIDB4MzksIDB4MzUsIDB4RjIsCisJMHgxRSwgMHgwNiwgMHgyNSwgMHhGRCwgMHgzNSwgMHgwMSwgMHg5OCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLCAweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLAorCTB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsIDB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsCisJMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDRBLCAweEZDLCAweEFDLAorCTB4MDYsIDB4Q0EsIDB4RjMsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4M0UsIDB4RTQsIDB4RjMsIDB4RTUsIDB4MDQsCisJMHhGNCwgMHhGRCwgMHhCQSwgMHgwMCwgMHhENywgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwKKwkweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLCAweDJBLCAweDAwLCAweEVGLCAweEZFLCAweDRELCAweDAzLAorCTB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsIDB4MTcsIDB4QjAsIDB4RjUsIDB4RUYsIDB4MDUsIDB4OTMsCisJMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDM0LCAweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk3LCAweEZDLCAweEU2LCAweDA1LCAweEM2LAorCTB4RjUsIDB4MDAsIDB4MTcsIDB4NTAsIDB4NDMsIDB4OUQsIDB4RjYsIDB4M0EsIDB4MDMsIDB4RkEsIDB4RkUsCisJMHgyMywgMHgwMCwgMHgyMSwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwKKwkweEZGLCAweEQ0LCAweEZGLCAweEJGLCAweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLCAweEYzLAorCTB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsIDB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsIDB4RTQsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKKwkweDUwLCAweEZGLCAweDk3LCAweDAxLCAweDEwLCAweEZELCAweERBLCAweDA0LCAweDIwLCAweEY4LCAweEEwLAorCTB4MEYsIDB4OTcsIDB4NDYsIDB4NjEsIDB4RkEsIDB4MkQsIDB4MDEsIDB4MkIsIDB4MDAsIDB4N0EsIDB4RkYsCisJMHg3NSwgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwKKwkweEZGLCAweDM5LCAweDAxLCAweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LAorCTB4QTAsIDB4MjYsIDB4NEIsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwKKwkweDUyLCAweDAxLCAweEE5LCAweEZELCAweEEwLCAweDAzLCAweEFFLCAweEZBLCAweEJFLCAweDA4LCAweDdDLAorCTB4NDgsIDB4MjYsIDB4RkYsIDB4RDIsIDB4RkUsIDB4NzksIDB4MDEsIDB4QzYsIDB4RkUsIDB4Q0MsIDB4MDAsCisJMHhBMCwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwKKwkweDAxLCAweDkwLCAweEZDLCAweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLAorCTB4OEUsIDB4RjEsIDB4MUQsIDB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QiwgMHhGRiwgMHgwMSwgMHgwMSwgMHg1NiwgMHhGRSwKKwkweDRELCAweDAyLCAweDQ1LCAweEZELCAweDhELCAweDAyLCAweEYwLCAweDQ4LCAweEQ3LCAweDA0LCAweDQ3LAorCTB4RkMsIDB4RDEsIDB4MDIsIDB4MTIsIDB4RkUsIDB4MjEsIDB4MDEsIDB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwKKwkweEZDLCAweDJBLCAweDA3LCAweEJGLCAweEYxLCAweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLAorCTB4QUIsIDB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHhBRCwgMHhGRiwgMHhBQSwgMHgwMCwgMHgwQywgMHhGRiwgMHhGNywgMHgwMCwKKwkweEMxLCAweEZGLCAweDMzLCAweEZELCAweEVDLCAweDQ3LCAweDUxLCAweDBCLCAweEFGLCAweEY5LCAweDFELAorCTB4MDQsIDB4NkIsIDB4RkQsIDB4NkUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHhGRiwKKwkweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLCAweEFELCAweEYyLCAweEJGLCAweDA1LAorCTB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsCisJMHgwMCwgMHhDRSwgMHhGRiwgMHg1NCwgMHgwMCwgMHhCRCwgMHhGRiwgMHhCMiwgMHhGRiwgMHgwMSwgMHgwMiwKKwkweENGLCAweEY4LCAweDdELCAweDQ1LCAweDZCLCAweDEyLCAweDMwLCAweEY3LCAweDQ4LCAweDA1LCAweERELAorCTB4RkMsIDB4QUQsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwgMHgwNiwgMHg2QywKKwkweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LCAweDQ5LCAweEZFLAorCTB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUQsCisJMHhGRiwgMHgwNCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg5MCwgMHhGRSwgMHhFQiwgMHgwMywgMHg3MSwgMHhGNSwKKwkweEI3LCAweDQxLCAweEVELCAweDE5LCAweEY1LCAweEY0LCAweDNCLCAweDA2LCAweDczLCAweEZDLCAweEQ3LAorCTB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwgMHhGNiwgMHg2OCwKKwkweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLCAweEVBLCAweEZGLAorCTB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkQsCisJMHhGRiwgMHhFRCwgMHgwMCwgMHg5RSwgMHhGRCwgMHg2QywgMHgwNSwgMHgxRiwgMHhGMywgMHhDMCwgMHgzQywKKwkweDlFLCAweDIxLCAweDI4LCAweEYzLCAweEUyLCAweDA2LCAweDNBLCAweEZDLCAweEU2LCAweDAxLCAweDM3LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsCisJMHg4MSwgMHgwMSwgMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwgMHgyRCwgMHgwRCwgMHg2OSwKKwkweDQ3LCAweEVCLCAweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLCAweEZGLCAweDkzLCAweDAwLAorCTB4QjYsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODQsIDB4RkYsIDB4NUMsCisJMHgwMSwgMHhFNiwgMHhGQywgMHg3NywgMHgwNiwgMHhENCwgMHhGMSwgMHhDNiwgMHgzNiwgMHgzRSwgMHgyOSwKKwkweEYzLCAweEYxLCAweDI5LCAweDA3LCAweDM4LCAweEZDLCAweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsCisJMHhFNCwgMHhGRCwgMHgyQywgMHgwMywgMHg5NCwgMHhGQiwgMHg4MywgMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwKKwkweDAxLCAweEY1LCAweEZELCAweEYwLCAweDAxLCAweDg3LCAweEZFLCAweEVBLCAweDAwLCAweDk0LCAweEZGLAorCTB4MUEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NkUsCisJMHhGQywgMHgwQSwgMHgwNywgMHg3RSwgMHhGMSwgMHhGRiwgMHgyRiwgMHg4QSwgMHgzMCwgMHg3RCwgMHhGMSwKKwkweDAzLCAweDA3LCAweDc1LCAweEZDLCAweEE3LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweEZELAorCTB4RkYsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsIDB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsCisJMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwgMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwKKwkweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4REEsIDB4MDEsIDB4MzYsIDB4RkMsIDB4MjcsCisJMHgwNywgMHgwNSwgMHhGMiwgMHhBQSwgMHgyOCwgMHg0NCwgMHgzNywgMHhFNCwgMHhGMSwgMHg2NywgMHgwNiwKKwkweEYyLCAweEZDLCAweDU1LCAweDAxLCAweDg4LCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDExLAorCTB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4ODMsIDB4MDAsIDB4OTEsIDB4MDAsCisJMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywgMHgwRCwgMHhDRCwgMHhGOCwgMHg4OSwgMHgwNCwgMHgzNiwKKwkweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0MsIDB4RkMsIDB4RDgsIDB4MDYsIDB4NDcsCisJMHhGMywgMHgwNiwgMHgyMSwgMHgyQSwgMHgzRCwgMHg0NCwgMHhGMywgMHg1MiwgMHgwNSwgMHhBRSwgMHhGRCwKKwkweEUzLCAweDAwLCAweEMyLCAweEZGLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEQ5LAorCTB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsIDB4RjcsCisJMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwgMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywgMHhCRSwKKwkweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAorCTB4M0EsIDB4RkYsIDB4RDQsIDB4MDEsIDB4N0EsIDB4RkMsIDB4MkIsIDB4MDYsIDB4MUUsIDB4RjUsIDB4NTYsCisJMHgxOSwgMHgwQywgMHg0MiwgMHhBQSwgMHhGNSwgMHhDOSwgMHgwMywgMHhBNCwgMHhGRSwgMHg1NCwgMHgwMCwKKwkweDA5LCAweDAwLCAweEVCLCAweEZGLCAweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLAorCTB4RkYsIDB4OTMsIDB4MDAsIDB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsCisJMHg5NCwgMHgxQywgMHg0NywgMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywKKwkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAorCTB4QTksIDB4MDEsIDB4RTcsIDB4RkMsIDB4MzMsIDB4MDUsIDB4NjAsIDB4RjcsIDB4REEsIDB4MTEsIDB4QjgsCisJMHg0NSwgMHgxQywgMHhGOSwgMHhEOCwgMHgwMSwgMHhDQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHg1QSwgMHgwMCwKKwkweENDLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LAorCTB4MDEsIDB4NTcsIDB4RkQsIDB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsCisJMHhBQSwgMHhGMiwgMHgwNiwgMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDY5LCAweDAxLAorCTB4NzcsIDB4RkQsIDB4MDQsIDB4MDQsIDB4RTIsIDB4RjksIDB4Q0IsIDB4MEEsIDB4MEQsIDB4NDgsIDB4OTQsCisJMHhGRCwgMHg5MiwgMHhGRiwgMHgxMCwgMHgwMSwgMHhGRSwgMHhGRSwgMHhCMSwgMHgwMCwgMHhBQSwgMHhGRiwKKwkweDE1LCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LAorCTB4RkMsIDB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsIDB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsCisJMHgyOSwgMHgwNywgMHg0NiwgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDFCLCAweDAxLCAweDIwLCAweEZFLAorCTB4QjYsIDB4MDIsIDB4N0EsIDB4RkMsIDB4NUYsIDB4MDQsIDB4RjQsIDB4NDgsIDB4RkYsIDB4MDIsIDB4MTMsCisJMHhGRCwgMHg2NywgMHgwMiwgMHg0OSwgMHhGRSwgMHgwNywgMHgwMSwgMHg4OCwgMHhGRiwgMHgxRCwgMHgwMCwKKwkweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLCAweDAxLCAweDUzLCAweEZDLCAweDIxLAorCTB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsIDB4ODYsIDB4RjEsIDB4REIsIDB4MDYsCisJMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEEyLCAweEZGLCAweEM1LCAweDAwLCAweEQ0LCAweEZFLCAweDVGLCAweDAxLCAweDAzLCAweEZGLAorCTB4QkYsIDB4RkUsIDB4NjMsIDB4NDgsIDB4NDAsIDB4MDksIDB4N0IsIDB4RkEsIDB4QjksIDB4MDMsIDB4OUQsCisJMHhGRCwgMHg1OCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LCAweDA3LCAweDYxLAorCTB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsIDB4MkMsIDB4RkQsCisJMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNCwKKwkweEZGLCAweDZFLCAweDAwLCAweDg3LCAweEZGLCAweDEzLCAweDAwLCAweDU4LCAweDAxLCAweDBELCAweEZBLAorCTB4NjEsIDB4NDYsIDB4MkQsIDB4MTAsIDB4RjAsIDB4RjcsIDB4RjEsIDB4MDQsIDB4MDUsIDB4RkQsIDB4OUMsCisJMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLCAweEYzLCAweDVCLAorCTB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsIDB4QjQsIDB4MDAsCisJMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgxQiwKKwkweDAwLCAweDMwLCAweDAwLCAweEU0LCAweEZFLCAweDVGLCAweDAzLCAweDVFLCAweEY2LCAweDAyLCAweDQzLAorCTB4OTYsIDB4MTcsIDB4OUIsIDB4RjUsIDB4RjgsIDB4MDUsIDB4OEYsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwKKwkweEM4LCAweDAxLCAweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LCAweEI2LCAweDE2LCAweDc3LAorCTB4NDMsIDB4QkQsIDB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MjUsIDB4MDAsCisJMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhGRiwgMHhDNCwKKwkweDAwLCAweEUyLCAweEZELCAweDAxLCAweDA1LCAweEJBLCAweEYzLCAweDY0LCAweDNFLCAweDNGLCAweDFGLAorCTB4QTgsIDB4RjMsIDB4QjgsIDB4MDYsIDB4NDYsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwKKwkweDE1LCAweEZELCAweENGLCAweDA0LCAweDM5LCAweEY4LCAweDU5LCAweDBGLCAweEFGLCAweDQ2LCAweDhCLAorCTB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsCisJMHgwRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NCwgMHhGRiwgMHgzRCwgMHgwMSwgMHgxOCwKKwkweEZELCAweDMyLCAweDA2LCAweDFGLCAweEYyLCAweEI1LCAweDM4LCAweEVCLCAweDI2LCAweDQwLCAweEYyLAorCTB4MUUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwKKwkweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LCAweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLAorCTB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NywgMHgwMSwgMHg4QywgMHhGQywgMHhFQSwKKwkweDA2LCAweDgwLCAweEYxLCAweDI2LCAweDMyLCAweDU4LCAweDJFLCAweDhCLCAweEYxLCAweDFCLCAweDA3LAorCTB4NUIsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRiwgMHgwMiwgMHg1RSwgMHhGRCwKKwkweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLCAweDA1LCAweDJFLCAweEZDLCAweERFLCAweDAyLCAweDBDLAorCTB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwgMHhDRiwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwgMHgwNywgMHhDNiwKKwkweEYxLCAweEY3LCAweDJBLCAweDQ2LCAweDM1LCAweEFCLCAweEYxLCAweEE0LCAweDA2LCAweEM0LCAweEZDLAorCTB4NzIsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUUsCisJMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwgMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywgMHhGRCwKKwkweERDLCAweDQ3LCAweDk1LCAweDBCLCAweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELCAweDcxLAorCTB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywgMHhGQiwgMHgwNiwgMHhEMiwgMHhGMiwgMHg2NCwKKwkweDIzLCAweDczLCAweDNCLCAweEJDLCAweEYyLCAweEI0LCAweDA1LCAweDZFLCAweEZELCAweDA5LCAweDAxLAorCTB4QUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsCisJMHgwMCwgMHhDMywgMHhGRiwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwKKwkweEIyLCAweDEyLCAweDE5LCAweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsCisJMHhERCwgMHgwMSwgMHg2MiwgMHhGQywgMHg2OSwgMHgwNiwgMHg3RiwgMHhGNCwgMHhCMiwgMHgxQiwgMHhBQiwKKwkweDQwLCAweEQwLCAweEY0LCAweDRFLCAweDA0LCAweDUzLCAweEZFLCAweDgzLCAweDAwLCAweEYyLCAweEZGLAorCTB4RjQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsCisJMHgwMCwgMHg4NSwgMHhGRSwgMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwKKwkweEUxLCAweEY0LCAweDQzLCAweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjksIDB4MDEsCisJMHhDMSwgMHhGQywgMHg4NiwgMHgwNSwgMHhBNSwgMHhGNiwgMHgxRSwgMHgxNCwgMHhCQSwgMHg0NCwgMHhGMCwKKwkweEY3LCAweDdCLCAweDAyLCAweDZCLCAweEZGLCAweEU0LCAweEZGLCAweDQxLCAweDAwLCAweEQ2LCAweEZGLAorCTB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsCisJMHhGRCwgMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywgMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywKKwkweEU2LCAweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsIDB4N0UsIDB4MDEsIDB4NDgsIDB4RkQsCisJMHg2NiwgMHgwNCwgMHgxOCwgMHhGOSwgMHhFOCwgMHgwQywgMHg3QywgMHg0NywgMHgxOSwgMHhGQywgMHg0RCwKKwkweDAwLCAweEE5LCAweDAwLCAweDM1LCAweEZGLCAweDk2LCAweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsCisJMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwgMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywKKwkweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzQsIDB4MDEsIDB4RUEsIDB4RkQsIDB4MUYsIDB4MDMsCisJMHhBRSwgMHhGQiwgMHg0NSwgMHgwNiwgMHhENSwgMHg0OCwgMHgzQywgMHgwMSwgMHhEQywgMHhGRCwgMHhGRCwKKwkweDAxLCAweDgwLCAweEZFLCAweEVELCAweDAwLCAweDkzLCAweEZGLCAweDFCLCAweDAwLCAweEZELCAweEZGLAorCTB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsIDB4MDcsIDB4ODAsCisJMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwgMHg3OCwgMHhGQywKKwkweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDE5LCAweDAwLCAweDk4LAorCTB4RkYsIDB4RTAsIDB4MDAsIDB4OUMsIDB4RkUsIDB4QzgsIDB4MDEsIDB4M0YsIDB4RkUsIDB4NjIsIDB4MDAsCisJMHhCOCwgMHg0OCwgMHgzRiwgMHgwNywgMHg0NywgMHhGQiwgMHg1MywgMHgwMywgMHhEMCwgMHhGRCwgMHg0MCwKKwkweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsIDB4RjIsIDB4NjAsCisJMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywgMHg1MSwgMHgwMSwKKwkweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweDExLCAweDAwLCAweEJBLCAweEZGLCAweDg5LAorCTB4MDAsIDB4NTEsIDB4RkYsIDB4NzcsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NjQsIDB4RkIsIDB4MjYsIDB4NDcsCisJMHhGQywgMHgwRCwgMHhCNCwgMHhGOCwgMHg5NSwgMHgwNCwgMHgzMSwgMHhGRCwgMHg4OCwgMHgwMSwgMHg1NiwKKwkweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAorCTB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsIDB4QkEsIDB4MjAsIDB4NjEsCisJMHgzRCwgMHg1NiwgMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwgMHgwMCwgMHhDNSwgMHhGRiwKKwkweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAorCTB4RkYsIDB4M0QsIDB4RkYsIDB4QzksIDB4MDIsIDB4NjQsIDB4RjcsIDB4MkYsIDB4NDQsIDB4NDQsIDB4MTUsCisJMHg0QSwgMHhGNiwgMHhBRCwgMHgwNSwgMHhBRiwgMHhGQywgMHhDMCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwKKwkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQzLCAweDAxLAorCTB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsIDB4MzIsIDB4RjUsIDB4MEMsIDB4MTksIDB4MzgsIDB4NDIsIDB4QzcsCisJMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwgMHhGRSwgMHg0RSwgMHgwMCwgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwKKwkweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY4LCAweEZGLCAweEU3LCAweEZGLCAweDk5LCAweDAwLCAweDJDLAorCTB4RkUsIDB4OEMsIDB4MDQsIDB4NkQsIDB4RjQsIDB4RjAsIDB4M0YsIDB4RTAsIDB4MUMsIDB4MzQsIDB4RjQsCisJMHg4NSwgMHgwNiwgMHg1NywgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLCAweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLAorCTB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsIDB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsCisJMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwgMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEE2LCAweEZGLCAweDFCLCAweDAxLCAweDUwLCAweEZELCAweEUxLAorCTB4MDUsIDB4ODIsIDB4RjIsIDB4OEYsIDB4M0EsIDB4OTIsIDB4MjQsIDB4OUQsIDB4RjIsIDB4MDksIDB4MDcsCisJMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDY2LCAweDAxLCAweDdELCAweEZELCAweEY4LCAweDAzLAorCTB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsIDB4NDgsIDB4QzUsIDB4RkQsIDB4N0EsIDB4RkYsIDB4MUQsCisJMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwgMHhBOSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDdGLCAweDAxLCAweEIwLCAweEZDLCAweEJFLCAweDA2LCAweDk3LAorCTB4RjEsIDB4M0YsIDB4MzQsIDB4MTksIDB4MkMsIDB4QUQsIDB4RjEsIDB4MjgsIDB4MDcsIDB4NDgsIDB4RkMsCisJMHhDOSwgMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwKKwkweDAwLCAweDgyLCAweEZGLCAweDE4LCAweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LCAweEZDLAorCTB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsIDB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsIDB4NDIsCisJMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweDRGLCAweEZGLCAweEMyLCAweDAxLCAweDUxLCAweEZDLCAweDIzLCAweDA3LCAweDlBLCAweEYxLCAweDNBLAorCTB4MkQsIDB4MzUsIDB4MzMsIDB4ODksIDB4RjEsIDB4RDUsIDB4MDYsIDB4OUQsIDB4RkMsIDB4OEIsIDB4MDEsCisJMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwKKwkweDAwLCAweERCLCAweEZFLCAweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LAorCTB4ODEsIDB4MDksIDB4NjEsIDB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsCisJMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwKKwkweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE1LCAweDA3LCAweDZELCAweEYyLCAweEJGLCAweDI1LCAweEE1LAorCTB4MzksIDB4NEQsIDB4RjIsIDB4MEIsIDB4MDYsIDB4MzMsIDB4RkQsIDB4MkQsIDB4MDEsIDB4OUQsIDB4RkYsCisJMHgxMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwKKwkweEZGLCAweDA2LCAweDAwLCAweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLAorCTB4RDcsIDB4RjcsIDB4RkMsIDB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwKKwkweDRFLCAweEZDLCAweEEwLCAweDA2LCAweEVELCAweEYzLCAweDBGLCAweDFFLCAweDJELCAweDNGLCAweDEwLAorCTB4RjQsIDB4QzgsIDB4MDQsIDB4MDcsIDB4RkUsIDB4QUYsIDB4MDAsIDB4REMsIDB4RkYsIDB4RkMsIDB4RkYsCisJMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwKKwkweEZFLCAweDcxLCAweDAzLCAweDNGLCAweEY2LCAweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LAorCTB4MDAsIDB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNiwgMHgwMSwgMHg5RiwgMHhGQywKKwkweEQzLCAweDA1LCAweEYxLCAweEY1LCAweDZDLCAweDE2LCAweDlFLCAweDQzLCAweERELCAweEY2LCAweDE1LAorCTB4MDMsIDB4MTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MjgsIDB4MDAsIDB4REYsIDB4RkYsIDB4MDksIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwgMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwKKwkweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLCAweDk3LCAweEYzLCAweEJELCAweDA2LAorCTB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MiwgMHgwMSwgMHgxQiwgMHhGRCwgMHhDNCwgMHgwNCwKKwkweDUxLCAweEY4LCAweDEzLCAweDBGLCAweEM4LCAweDQ2LCAweEI2LCAweEZBLCAweDAxLCAweDAxLCAweDQ0LAorCTB4MDAsIDB4NkMsIDB4RkYsIDB4N0IsIDB4MDAsIDB4QkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwgMHgwNiwgMHgxNCwKKwkweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LCAweDMzLCAweEZDLAorCTB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsCisJMHgwMCwgMHg2RCwgMHhGRiwgMHg0QywgMHgwMSwgMHhCNiwgMHhGRCwgMHg4NiwgMHgwMywgMHhFMSwgMHhGQSwKKwkweDNELCAweDA4LCAweDkyLCAweDQ4LCAweDhFLCAweEZGLCAweEExLCAweEZFLCAweDkzLCAweDAxLCAweEI4LAorCTB4RkUsIDB4RDMsIDB4MDAsIDB4OUQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhFMywKKwkweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLCAweEI3LCAweDAxLAorCTB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4RkEsCisJMHgwMCwgMHg2NCwgMHhGRSwgMHgzMiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgxQiwgMHgwMiwgMHhFQSwgMHg0OCwKKwkweDUwLCAweDA1LCAweDE0LCAweEZDLCAweEVCLCAweDAyLCAweDA1LCAweEZFLCAweDI3LCAweDAxLCAweDdDLAorCTB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsCisJMHhEMSwgMHgwMSwgMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwgMHhBRSwgMHgyQSwgMHg4NiwKKwkweDM1LCAweEIxLCAweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLCAweDAxLCAweDdCLCAweEZGLAorCTB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTQsIDB4MDAsIDB4MTksCisJMHhGRiwgMHhERCwgMHgwMCwgMHhGMCwgMHhGRiwgMHhENCwgMHhGQywgMHhDOSwgMHg0NywgMHhEOCwgMHgwQiwKKwkweDdDLCAweEY5LCAweDM1LCAweDA0LCAweDVGLCAweEZELCAweDc0LCAweDAxLCAweDVFLCAweEZGLCAweDI5LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsCisJMHgzNSwgMHhGQywgMHhGNywgMHgwNiwgMHhFMCwgMHhGMiwgMHgxOCwgMHgyMywgMHhBQiwgMHgzQiwgMHhDQywKKwkweEYyLCAweEE4LCAweDA1LCAweDc2LCAweEZELCAweDA0LCAweDAxLCAweEIxLCAweEZGLCAweDBDLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDEsIDB4RkYsIDB4NEUsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4OUEsCisJMHhGRiwgMHgyQSwgMHgwMiwgMHg4MywgMHhGOCwgMHgzRiwgMHg0NSwgMHhGQiwgMHgxMiwgMHgwMSwgMHhGNywKKwkweDVELCAweDA1LCAweEQzLCAweEZDLCAweEIxLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLAorCTB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsCisJMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwgMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwKKwkweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LCAweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLAorCTB4MDUsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NkMsIDB4MDAsIDB4N0IsIDB4RkUsIDB4MEMsCisJMHgwNCwgMHgzQSwgMHhGNSwgMHg1RiwgMHg0MSwgMHg4MywgMHgxQSwgMHhDRCwgMHhGNCwgMHg0QiwgMHgwNiwKKwkweDZELCAweEZDLCAweEQ5LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4QzUsIDB4RkMsIDB4N0MsIDB4MDUsCisJMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywgMHg0NCwgMHgxNCwgMHhGOCwgMHg2NywgMHgwMiwgMHg3NywKKwkweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLCAweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLAorCTB4MDksIDB4MDAsIDB4QjgsIDB4RkYsIDB4RjYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4ODQsIDB4MDUsIDB4RkQsCisJMHhGMiwgMHg1MiwgMHgzQywgMHgzNSwgMHgyMiwgMHgwQiwgMHhGMywgMHhFQiwgMHgwNiwgMHgzNywgMHhGQywKKwkweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJBLAorCTB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsIDB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsIDB4RjksCisJMHhBNCwgMHgwQywgMHg5MCwgMHg0NywgMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwgMHgyRSwKKwkweEZGLCAweDk5LCAweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAorCTB4ODAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4REEsIDB4RkMsIDB4ODcsIDB4MDYsIDB4QzUsIDB4RjEsIDB4NDYsCisJMHgzNiwgMHhEMSwgMHgyOSwgMHhFMywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwKKwkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LAorCTB4RkYsIDB4MzEsIDB4MDEsIDB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsCisJMHhEQiwgMHg0OCwgMHg3MywgMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwKKwkweDAwLCAweDkxLCAweEZGLCAweDFCLCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU4LCAweEZGLAorCTB4QjEsIDB4MDEsIDB4NjcsIDB4RkMsIDB4MTAsIDB4MDcsIDB4ODEsIDB4RjEsIDB4NzMsIDB4MkYsIDB4MTUsCisJMHgzMSwgMHg3QywgMHhGMSwgMHhGQiwgMHgwNiwgMHg3QywgMHhGQywgMHhBMiwgMHgwMSwgMHg2MCwgMHhGRiwKKwkweDI5LCAweDAwLCAweEZELCAweEZGLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLAorCTB4RkUsIDB4QkIsIDB4MDEsIDB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsCisJMHgyRSwgMHhGQiwgMHg2MCwgMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwKKwkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERDLCAweDAxLAorCTB4MzQsIDB4RkMsIDB4MjUsIDB4MDcsIDB4MTgsIDB4RjIsIDB4MTUsIDB4MjgsIDB4QkYsIDB4MzcsIDB4RjcsCisJMHhGMSwgMHg1NiwgMHgwNiwgMHhGRSwgMHhGQywgMHg0RCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxOSwgMHgwMCwKKwkweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJCLCAweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLAorCTB4MDAsIDB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsIDB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsCisJMHhBMSwgMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwKKwkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNGLCAweEZDLAorCTB4Q0UsIDB4MDYsIDB4NjYsIDB4RjMsIDB4NkYsIDB4MjAsIDB4OTYsIDB4M0QsIDB4NjksIDB4RjMsIDB4MzgsCisJMHgwNSwgMHhCRiwgMHhGRCwgMHhEOSwgMHgwMCwgMHhDNywgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LCAweDAwLCAweDMyLCAweEZGLCAweERDLAorCTB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsIDB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsCisJMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEQyLCAweDAxLCAweDgxLCAweEZDLCAweDFBLCAweDA2LAorCTB4NDcsIDB4RjUsIDB4QzEsIDB4MTgsIDB4NjAsIDB4NDIsIDB4RTQsIDB4RjUsIDB4QTYsIDB4MDMsIDB4QjksCisJMHhGRSwgMHg0OCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwNCwgMHgwMCwKKwkweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLCAweDA0LCAweDU1LAorCTB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsIDB4NTUsIDB4RkMsCisJMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwKKwkweDAwLCAweDRCLCAweEZGLCAweEE0LCAweDAxLCAweEYxLCAweEZDLCAweDFELCAweDA1LCAweDhGLCAweEY3LAorCTB4NEEsIDB4MTEsIDB4RjIsIDB4NDUsIDB4NkIsIDB4RjksIDB4QUUsIDB4MDEsIDB4RTIsIDB4RkYsIDB4QTIsCisJMHhGRiwgMHg2MSwgMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKKwkweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LCAweEYyLCAweDU0LAorCTB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsCisJMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NCwKKwkweEZGLCAweDYzLCAweDAxLCAweDg0LCAweEZELCAweEVCLCAweDAzLCAweDE0LCAweEZBLCAweDQ3LCAweDBBLAorCTB4MkMsIDB4NDgsIDB4RjYsIDB4RkQsIDB4NjMsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RjAsIDB4RkUsIDB4QjgsCisJMHgwMCwgMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MSwgMHhGRiwKKwkweDgyLCAweDAxLCAweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLCAweEZELCAweDMzLCAweDYyLAorCTB4MkMsIDB4QTgsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsIDB4MDEsIDB4NEMsIDB4RkYsCisJMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywgMHhGRiwgMHgxNCwKKwkweDAxLCAweDJELCAweEZFLCAweDlDLCAweDAyLCAweEFELCAweEZDLCAweEU5LCAweDAzLCAweEY2LCAweDQ4LAorCTB4NzMsIDB4MDMsIDB4RTAsIDB4RkMsIDB4ODIsIDB4MDIsIDB4M0IsIDB4RkUsIDB4MEUsIDB4MDEsIDB4ODYsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwKKwkweDRFLCAweEZDLCAweDI0LCAweDA3LCAweDlFLCAweEYxLCAweEYyLCAweDJDLCAweDc4LCAweDMzLCAweDhDLAorCTB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsIDB4RkMsIDB4ODgsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNSwgMHhGRiwgMHhCRSwgMHgwMCwgMHhFMiwgMHhGRSwgMHg0NSwKKwkweDAxLCAweDMzLCAweEZGLCAweDVBLCAweEZFLCAweDQ4LCAweDQ4LCAweEMzLCAweDA5LCAweDQ3LCAweEZBLAorCTB4RDIsIDB4MDMsIDB4OTAsIDB4RkQsIDB4NUUsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywKKwkweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LCAweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLAorCTB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2OCwgMHgwMCwgMHg5NSwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4MywKKwkweDAxLCAweEJCLCAweEY5LCAweDJCLCAweDQ2LCAweEJCLCAweDEwLCAweEJGLCAweEY3LCAweDA3LCAweDA1LAorCTB4RkIsIDB4RkMsIDB4QTAsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MCwgMHhGQywgMHg5OSwgMHgwNiwKKwkweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLCAweDNGLCAweDI3LCAweEY0LCAweEI5LCAweDA0LCAweDEwLAorCTB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsCisJMHhFNiwgMHhGRiwgMHgxNSwgMHgwMCwgMHgzQywgMHgwMCwgMHhDRiwgMHhGRSwgMHg4MywgMHgwMywgMHgyMCwKKwkweEY2LCAweEIyLCAweDQyLCAweDJCLCAweDE4LCAweDcxLCAweEY1LCAweDA5LCAweDA2LCAweDg4LCAweEZDLAorCTB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwgMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywgMHhGNiwKKwkweDIyLCAweDE2LCAweEMzLCAweDQzLCAweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLCAweDExLAorCTB4MDAsIDB4MkIsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHhDQywgMHhGRiwgMHhDRSwgMHgwMCwgMHhEMSwgMHhGRCwgMHgxRCwgMHgwNSwgMHg5MSwgMHhGMywgMHhGRSwKKwkweDNELCAweEQ3LCAweDFGLCAweDg3LCAweEYzLCAweEMzLCAweDA2LCAweDQyLCAweEZDLCAweEU1LCAweDAxLAorCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsCisJMHhGRiwgMHg5MCwgMHgwMSwgMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwKKwkweEUxLCAweDQ2LCAweEUxLCAweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLAorCTB4MDAsIDB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OTAsIDB4RkYsCisJMHg0NSwgMHgwMSwgMHgwQiwgMHhGRCwgMHg0NCwgMHgwNiwgMHgwQSwgMHhGMiwgMHgzQiwgMHgzOCwgMHg4MCwKKwkweDI3LCAweDJCLCAweEYyLCAweDIyLCAweDA3LCAweDMzLCAweEZDLCAweERFLCAweDAxLCAweDNFLCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksCisJMHgwMSwgMHhCQywgMHhGRCwgMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwKKwkweEMzLCAweEZGLCAweDg5LCAweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLAorCTB4RkYsIDB4MTgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUQsIDB4MDEsCisJMHg4NCwgMHhGQywgMHhGMywgMHgwNiwgMHg3RCwgMHhGMSwgMHg5RSwgMHgzMSwgMHhFNiwgMHgyRSwgMHg4NSwKKwkweEYxLCAweDE2LCAweDA3LCAweDYxLCAweEZDLCAweEI1LCAweDAxLCAweDU1LCAweEZGLCAweDJELCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsCisJMHgwMiwgMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwgMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwKKwkweEY4LCAweDAyLCAweEZFLCAweEZELCAweDJCLCAweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4RkYsIDB4RDIsIDB4MDEsIDB4M0QsIDB4RkMsCisJMHgyQiwgMHgwNywgMHhENCwgMHhGMSwgMHg2NCwgMHgyQSwgMHhDNiwgMHgzNSwgMHhCNywgMHhGMSwgMHg5NiwKKwkweDA2LCAweENGLCAweEZDLCAweDZCLCAweDAxLCAweDdELCAweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLAorCTB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsCisJMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywgMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwKKwkweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjMsIDB4MDYsCisJMHhFRSwgMHhGMiwgMHhDRCwgMHgyMiwgMHhFNCwgMHgzQiwgMHhEQywgMHhGMiwgMHg5QywgMHgwNSwgMHg3RSwKKwkweEZELCAweDAwLCAweDAxLCAweEI0LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLAorCTB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsIDB4MDIsIDB4NUUsCisJMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwgMHhDRiwgMHhGQywKKwkweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsIDB4NjcsIDB4RkMsIDB4NUEsIDB4MDYsIDB4QTYsIDB4RjQsCisJMHgxQiwgMHgxQiwgMHgwNywgMHg0MSwgMHgwNCwgMHhGNSwgMHgyRCwgMHgwNCwgMHg2NywgMHhGRSwgMHg3NywKKwkweDAwLCAweEY4LCAweEZGLCAweEYyLCAweEZGLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweEYwLCAweEZGLAorCTB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsIDB4RjUsIDB4MzIsCisJMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywgMHhEQSwgMHgwMSwKKwkweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LAorCTB4RkYsIDB4QjUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4NzIsIDB4MDUsIDB4RDMsIDB4RjYsIDB4OEQsIDB4MTMsCisJMHhGRCwgMHg0NCwgMHgzOSwgMHhGOCwgMHg1MywgMHgwMiwgMHg4MiwgMHhGRiwgMHhENywgMHhGRiwgMHg0NywKKwkweDAwLCAweEQzLCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEI2LCAweEZGLAorCTB4RkIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsIDB4MUMsIDB4M0MsIDB4ODEsCisJMHgyMiwgMHhGQywgMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc5LAorCTB4MDEsIDB4NTMsIDB4RkQsIDB4NEUsIDB4MDQsIDB4NEEsIDB4RjksIDB4NjAsIDB4MEMsIDB4QTMsIDB4NDcsCisJMHg3NiwgMHhGQywgMHgxRiwgMHgwMCwgMHhDMywgMHgwMCwgMHgyNywgMHhGRiwgMHg5RCwgMHgwMCwgMHhCMiwKKwkweEZGLCAweDEzLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDdGLCAweEZGLCAweDY3LCAweDAxLAorCTB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsIDB4QkUsIDB4RjEsIDB4MDYsIDB4MzYsIDB4MUEsIDB4MkEsIDB4REMsCisJMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwKKwkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDc5LCAweEZGLCAweDJFLCAweDAxLCAweEY3LAorCTB4RkQsIDB4MDUsIDB4MDMsIDB4RTEsIDB4RkIsIDB4Q0EsIDB4MDUsIDB4REYsIDB4NDgsIDB4QUIsIDB4MDEsCisJMHhBQSwgMHhGRCwgMHgxOCwgMHgwMiwgMHg3MiwgMHhGRSwgMHhGNCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgxQiwKKwkweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LCAweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLAorCTB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsIDB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsCisJMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDE5LCAweDAwLCAweDlBLCAweEZGLCAweEQ5LCAweDAwLCAweEFBLCAweEZFLCAweEFFLCAweDAxLCAweDcwLAorCTB4RkUsIDB4RjgsIDB4RkYsIDB4QTYsIDB4NDgsIDB4QkUsIDB4MDcsIDB4MTQsIDB4RkIsIDB4NkQsIDB4MDMsCisJMHhDMywgMHhGRCwgMHg0NiwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERELCAweDAxLCAweDM0LCAweEZDLCAweDIzLCAweDA3LAorCTB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsIDB4MzcsIDB4MDAsIDB4RjIsIDB4NEQsIDB4MDYsIDB4MDQsCisJMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwKKwkweEJELCAweEZGLCAweDgyLCAweDAwLCAweDVFLCAweEZGLCAweDVELCAweDAwLCAweEQ0LCAweDAwLCAweDBDLAorCTB4RkIsIDB4RjksIDB4NDYsIDB4ODcsIDB4MEUsIDB4ODIsIDB4RjgsIDB4QUQsIDB4MDQsIDB4MjYsIDB4RkQsCisJMHg4RCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LCAweEYzLAorCTB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsIDB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsIDB4RDQsCisJMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhERCwgMHhGRiwKKwkweDJFLCAweDAwLCAweDBBLCAweDAwLCAweDI3LCAweEZGLCAweEVGLCAweDAyLCAweDIwLCAweEY3LCAweEU3LAorCTB4NDMsIDB4RDgsIDB4MTUsIDB4MUUsIDB4RjYsIDB4QzAsIDB4MDUsIDB4QTcsIDB4RkMsIDB4QzMsIDB4MDEsCisJMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwKKwkweEZGLCAweEQxLCAweDAxLCAweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LAorCTB4ODksIDB4NDIsIDB4MDIsIDB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsCisJMHgwMCwgMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMiwgMHhGRiwKKwkweEE0LCAweDAwLCAweDE5LCAweEZFLCAweEFBLCAweDA0LCAweDNFLCAweEY0LCAweDkwLCAweDNGLCAweDc4LAorCTB4MUQsIDB4MTAsIDB4RjQsIDB4OTMsIDB4MDYsIDB4NTIsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzYsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwKKwkweDAxLCAweEY2LCAweEZDLCAweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LAorCTB4OTMsIDB4RjksIDB4OTgsIDB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhBMSwgMHhGRiwgMHgyNCwgMHgwMSwKKwkweDQxLCAweEZELCAweEY2LCAweDA1LCAweDY3LCAweEYyLCAweDFBLCAweDNBLCAweDI5LCAweDI1LCAweDg0LAorCTB4RjIsIDB4MEYsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwKKwkweEZELCAweERGLCAweDAzLCAweDJFLCAweEZBLCAweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLAorCTB4NEIsIDB4RkYsIDB4MzgsIDB4MDEsIDB4RTksIDB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RiwgMHhGRiwgMHg4NSwgMHgwMSwgMHhBNiwgMHhGQywKKwkweENBLCAweDA2LCAweDhGLCAweEYxLCAweEJCLCAweDMzLCAweEFCLCAweDJDLCAweEEzLCAweEYxLCAweDI2LAorCTB4MDcsIDB4NEMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwKKwkweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLAorCTB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywKKwkweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLAorCTB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywKKwkweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLAorCTB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsCisJMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywKKwkweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLCAweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENiwgMHgwNiwgMHg0QywgMHhGMywgMHhFRCwKKwkweDIwLCAweDNELCAweDNELCAweDRBLCAweEYzLCAweDRFLCAweDA1LCAweEIxLCAweEZELCAweEUxLCAweDAwLAorCTB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsCisJMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywKKwkweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLAorCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsCisJMHhFOSwgMHhGRSwgMHgzOCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwKKwkweDBBLCAweDJFLCAweEZBLCAweERGLCAweDAzLCAweDhBLCAweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLAorCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzgsIDB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsCisJMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywgMHhGOSwgMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwKKwkweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLCAweEEyLCAweDAxLCAweDRDLCAweEZGLCAweDJGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsIDB4MDAsIDB4NDIsIDB4MDAsCisJMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwgMHg3NiwgMHgxOCwgMHg1QywKKwkweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QzgsCisJMHhGRCwgMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwgMHg3NiwgMHhGMywKKwkweEM4LCAweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsIDB4RkQsCisJMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwgMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwgMHgyMywKKwkweDA3LCAweDM0LCAweEZDLCAweERELCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLAorCTB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsIDB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsCisJMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwgMHg4MywgMHhGMSwgMHgxMywgMHgwNywKKwkweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweEZELAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsCisJMHhEQywgMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwgMHhENSwKKwkweEZDLCAweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsCisJMHhGMiwgMHg4MSwgMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwKKwkweEZCLCAweDAwLCAweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDM1LAorCTB4MDAsIDB4MzgsIDB4RkYsIDB4REEsIDB4MDEsIDB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsCisJMHhDRSwgMHgxQSwgMHgzMiwgMHg0MSwgMHgxRiwgMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwKKwkweDAwLCAweEZCLCAweEZGLCAweEYwLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLAorCTB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsIDB4RUEsIDB4RjYsIDB4NDQsCisJMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwgMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwgMHhGRiwgMHhEMCwgMHhGRiwKKwkweDRBLCAweDAwLCAweEQyLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELAorCTB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsIDB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsCisJMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywgMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwKKwkweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLAorCTB4MkIsIDB4MDEsIDB4RkUsIDB4RkQsIDB4RjgsIDB4MDIsIDB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsCisJMHg0OCwgMHhFMywgMHgwMSwgMHg5MSwgMHhGRCwgMHgyNSwgMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwKKwkweDhGLCAweEZGLCAweDFDLCAweDAwLCAweDE4LCAweDAwLCAweDlDLCAweEZGLCAweEQ2LCAweDAwLCAweEIxLAorCTB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsIDB4RkYsIDB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsCisJMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwgMHg0OSwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwKKwkweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLCAweDAwLCAweDY1LCAweEZGLAorCTB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsIDB4Q0QsIDB4MEUsIDB4NkEsCisJMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLCAweDAwLCAweDFCLAorCTB4RkYsIDB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsIDB4MDcsIDB4RjYsCisJMHhDQSwgMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLCAweEZFLAorCTB4QjksIDB4MDQsIDB4MjcsIDB4RjQsIDB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsIDB4OTksCisJMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LCAweDAxLCAweDNBLCAweEZELCAweDAwLAorCTB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsIDB4NzksIDB4RjIsIDB4MTIsIDB4MDcsCisJMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKKwkweEZGLCAweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLCAweDA2LAorCTB4OEMsIDB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEUsCisJMHhGQywgMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDMwLCAweDAwLCAweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LAorCTB4RjEsIDB4NjIsIDB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsCisJMHg4MiwgMHgwMSwgMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDNBLCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLAorCTB4REQsIDB4MjQsIDB4NTQsIDB4M0EsIDB4NzQsIDB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsCisJMHgwMSwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM3LCAweEZGLCAweEUxLCAweDAxLCAweDU1LCAweEZDLCAweDhDLCAweDA2LCAweDIyLCAweEY0LCAweDJDLAorCTB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsIDB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsIDB4RkUsIDB4OUYsIDB4MDAsCisJMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKKwkweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLCAweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LAorCTB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsIDB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsCisJMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwKKwkweDhCLCAweDAxLCAweDJCLCAweEZELCAweEExLCAweDA0LCAweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLAorCTB4NDcsIDB4MzgsIDB4RkIsIDB4QkUsIDB4MDAsIDB4NkEsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsCisJMHhCQiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywKKwkweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLCAweEZCLCAweDdFLCAweDA3LCAweEFGLCAweDQ4LAorCTB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsIDB4QTMsIDB4RkUsIDB4REQsIDB4MDAsIDB4OTksCisJMHhGRiwgMHgxOSwgMHgwMCwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwgMHgwMCwgMHg3OSwgMHhGRSwKKwkweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LCAweDA3LCAweDA2LCAweEM3LAorCTB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsIDB4RkYsIDB4MjIsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwgMHhGRiwgMHhCNiwKKwkweDAwLCAweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLCAweDMxLCAweEY5LAorCTB4NUEsIDB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywgMHhGRiwKKwkweDY3LCAweDAyLCAweDE0LCAweEY4LCAweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LCAweDdDLAorCTB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwKKwkweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLCAweDkzLCAweEY0LCAweDYyLCAweDA2LAorCTB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwgMHgwNSwKKwkweENDLCAweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LCAweDM1LAorCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgyMCwgMHgwMCwgMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwKKwkweEYxLCAweDg2LCAweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLAorCTB4RDEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkQsCisJMHgwMCwgMHg1NCwgMHhGRiwgMHhCNywgMHgwMSwgMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwKKwkweDlGLCAweDJFLCAweEUzLCAweDMxLCAweDdFLCAweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLAorCTB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMywgMHhGQywgMHgyMCwgMHgwNywgMHgzNSwgMHhGMiwgMHgzNiwKKwkweDI3LCAweDc4LCAweDM4LCAweDE0LCAweEYyLCAweDNCLCAweDA2LCAweDExLCAweEZELCAweDQxLCAweDAxLAorCTB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCisJMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywgMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwKKwkweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLCAweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLAorCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsCisJMHhDRSwgMHgwMSwgMHg4QywgMHhGQywgMHgwMCwgMHgwNiwgMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwKKwkweDQyLCAweDNGLCAweEY2LCAweDcxLCAweDAzLCAweEQ5LCAweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLAorCTB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsCisJMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywgMHhGNywgMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwKKwkweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLCAweDhFLCAweEZGLCAweDZCLCAweDAwLCAweEM2LAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsIDB4NUIsIDB4MDEsCisJMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwgMHg1NywgMHg0OCwgMHg4RCwKKwkweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLCAweDAwLCAweEE0LCAweEZGLAorCTB4MTYsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsIDB4RkUsIDB4NzQsCisJMHgwMiwgMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwgMHg5NCwgMHhGQywKKwkweEE5LCAweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MTUsIDB4MDAsIDB4QTksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsIDB4MDEsCisJMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwgMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwgMHhGOCwKKwkweDAzLCAweDdELCAweEZELCAweDY2LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLAorCTB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksIDB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsCisJMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwgMHg3NywgMHhGNywgMHgyOCwgMHgwNSwKKwkweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDA2LAorCTB4MDAsIDB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsIDB4MDMsCisJMHhDNywgMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwgMHg3RCwKKwkweEZDLCAweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLAorCTB4MDUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsCisJMHhGMywgMHg2MSwgMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywKKwkweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDFBLAorCTB4MDAsIDB4OEEsIDB4RkYsIDB4NTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsCisJMHg4MiwgMHgzNywgMHg2MCwgMHgyOCwgMHgwRSwgMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwKKwkweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDI5LCAweDAwLAorCTB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsIDB4N0QsIDB4RjEsIDB4Q0YsCisJMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwgMHhGQywgMHhBRSwgMHgwMSwKKwkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLAorCTB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsIDB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksCisJMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwgMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwKKwkweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDYsIDB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsCisJMHgzQywgMHgwRSwgMHhGMywgMHg3OCwgMHgwNSwgMHg5NiwgMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwKKwkweDA4LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LAorCTB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsIDB4RjQsIDB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsCisJMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwKKwkweEZGLCAweDA2LCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LCAweEZGLCAweEFGLCAweDAxLAorCTB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsIDB4NUMsIDB4NDUsIDB4QTksCisJMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwgMHgwMCwgMHhEMCwgMHhGRiwKKwkweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLCAweDAxLCAweDY1LAorCTB4RkQsIDB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsIDB4MDMsIDB4RkQsCisJMHhEOSwgMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwKKwkweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLCAweEZFLAorCTB4REUsIDB4MDIsIDB4MkUsIDB4RkMsIDB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsIDB4NUUsCisJMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwgMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywgMHgwMCwKKwkweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLCAweEZFLCAweDg2LCAweDAxLCAweEJBLAorCTB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsIDB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsCisJMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwKKwkweDAwLCAweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LCAweDAxLAorCTB4OEIsIDB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsIDB4MTUsCisJMHhGRCwgMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwKKwkweEUxLCAweEZGLCAweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELAorCTB4RjYsIDB4NzcsIDB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsCisJMHhDOCwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwKKwkweEZGLCAweEQ5LCAweEZGLCAweEI0LCAweDAwLCAweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLAorCTB4RkMsIDB4M0UsIDB4NUIsIDB4MUUsIDB4REIsIDB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwKKwkweDlCLCAweEZGLCAweDMxLCAweDAxLCAweDJDLCAweEZELCAweDE1LCAweDA2LCAweDQxLCAweEYyLCAweDZBLAorCTB4MzksIDB4MEEsIDB4MjYsIDB4NjEsIDB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCisJMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwKKwkweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLCAweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLAorCTB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsIDB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKKwkweENBLCAweDAxLCAweDQ2LCAweEZDLCAweDI5LCAweDA3LCAweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLAorCTB4MzQsIDB4OUMsIDB4RjEsIDB4QjgsIDB4MDYsIDB4QjUsIDB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsCisJMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKKwkweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLCAweEYyLCAweDQ2LCAweDI0LCAweEM4LCAweDNBLAorCTB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsIDB4MTcsIDB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwKKwkweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLCAweDFGLCAweDQwLCAweDg1LAorCTB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4RjcsIDB4RkYsCisJMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwgMHgwMSwgMHhCNCwKKwkweEZDLCAweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LCAweDg2LCAweEY3LAorCTB4QjYsIDB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwgMHhGRCwKKwkweDg5LCAweDA0LCAweENELCAweEY4LCAweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLCAweDkxLAorCTB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwgMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwKKwkweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LCAweDk4LCAweDAwLCAweDI2LCAweEZFLAorCTB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MUEsCisJMHgwMCwgMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwgMHhGRCwKKwkweDA1LCAweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLCAweEU0LAorCTB4RkQsIDB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsCisJMHhCNiwgMHhGRiwgMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwKKwkweEZCLCAweDY5LCAweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELAorCTB4ODEsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDcsCisJMHhGRiwgMHgzRSwgMHgwMCwgMHhFQSwgMHhGRiwgMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywKKwkweDk5LCAweDQ0LCAweDY4LCAweDE0LCAweDhFLCAweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLAorCTB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsCisJMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwgMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwgMHhCNywgMHhGNCwgMHg3RCwKKwkweDQwLCAweEZELCAweDFCLCAweDZDLCAweEY0LCAweDcwLCAweDA2LCAweDVGLCAweEZDLCAweERFLCAweDAxLAorCTB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsCisJMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwKKwkweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLCAweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsCisJMHg3NSwgMHgwMSwgMHhCRiwgMHhGQywgMHhBQiwgMHgwNiwgMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwKKwkweDJCLCAweEJGLCAweEYxLCAweDJBLCAweDA3LCAweDQyLCAweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLAorCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsCisJMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwgMHhGMSwgMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwKKwkweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLCAweDk0LCAweDAxLCAweDY3LCAweEZGLCAweDI2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTAsIDB4MDEsCisJMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwgMHhGMiwgMHgzOCwgMHgyQSwKKwkweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LCAweEZGLCAweDE2LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDgsCisJMHhGQywgMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwgMHhDRiwgMHhGMywKKwkweEYzLCAweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLCAweEZGLCAweDAzLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsIDB4RkMsCisJMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwgMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwgMHg0RCwKKwkweDAzLCAweEVGLCAweEZFLCAweDJBLCAweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksIDB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsCisJMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwgMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwKKwkweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLCAweEZGLCAweDBGLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsIDB4MDMsCisJMHg5NCwgMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwgMHg2QywKKwkweDAxLCAweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweDFELCAweDAwLAorCTB4OEEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsCisJMHgwMiwgMHhGMiwgMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwKKwkweDFFLCAweDAxLCAweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweEFDLAorCTB4RkYsIDB4QUUsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsCisJMHhGRCwgMHg0NywgMHgwRSwgMHgwQiwgMHhDOCwgMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywKKwkweDAxLCAweDYxLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweENELCAweEZGLAorCTB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsIDB4RjUsIDB4RjgsIDB4OUIsCisJMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwgMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwgMHhGQywgMHhBQiwgMHgwMSwKKwkweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LAorCTB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsIDB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsCisJMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywgMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwKKwkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLAorCTB4RTgsIDB4MDAsIDB4QTYsIDB4RkQsIDB4NUYsIDB4MDUsIDB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsCisJMHgyMSwgMHgzNywgMHhGMywgMHhERCwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg2LCAweEZGLCAweDU5LAorCTB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsIDB4RjEsIDB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsCisJMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLAorCTB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsCisJMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwKKwkweEZELCAweEZGLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LCAweDAxLCAweDM3LAorCTB4RkMsIDB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsIDB4REMsIDB4RjEsCisJMHg2RiwgMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwKKwkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLCAweEZDLAorCTB4REQsIDB4MDYsIDB4MzcsIDB4RjMsIDB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsIDB4NUYsCisJMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LCAweDAxLCAweDc3LCAweEZDLCAweDMzLAorCTB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsIDB4OEQsIDB4RjUsIDB4REEsIDB4MDMsCisJMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELCAweDA1LAorCTB4NDgsIDB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsIDB4QkUsCisJMHhGRiwgMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDI4LCAweDAwLCAweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LAorCTB4RjksIDB4MEUsIDB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsCisJMHgwNSwgMHhGRiwgMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKKwkweDAwLCAweDdGLCAweEZGLCAweDFFLCAweDAxLCAweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLAorCTB4OUIsIDB4MDQsIDB4RjIsIDB4NDgsIDB4QzYsIDB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsCisJMHhGRSwgMHgwNCwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgxNywgMHgwMCwgMHhBMSwgMHhGRiwKKwkweEM5LCAweDAwLCAweENELCAweEZFLCAweDZDLCAweDAxLCAweEVBLCAweEZFLCAweEYzLCAweEZFLCAweDcwLAorCTB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsIDB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4NTUsIDB4MDEsCisJMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwKKwkweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LAorCTB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsIDB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwKKwkweDJBLCAweDAwLCAweEVGLCAweEZFLCAweDRELCAweDAzLCAweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLAorCTB4MTcsIDB4QjAsIDB4RjUsIDB4RUYsIDB4MDUsIDB4OTMsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwKKwkweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLCAweEYzLCAweDk4LCAweDNFLCAweEYzLCAweDFFLAorCTB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwgMHhGRiwgMHgzOSwgMHgwMSwKKwkweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LCAweEEwLCAweDI2LCAweDRCLAorCTB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwgMHgwMSwgMHg5MCwKKwkweEZDLCAweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLCAweDhFLCAweEYxLAorCTB4MUQsIDB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwgMHhGQywKKwkweDJBLCAweDA3LCAweEJGLCAweEYxLCAweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLCAweEFCLAorCTB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHhGRiwKKwkweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLCAweEFELCAweEYyLCAweEJGLCAweDA1LAorCTB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwgMHgwNiwKKwkweDZDLCAweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LCAweDQ5LAorCTB4RkUsIDB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwKKwkweEY2LCAweDY4LCAweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLAorCTB4RUEsIDB4RkYsIDB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCisJMHgwMCwgMHg1OSwgMHhGRiwgMHg4MSwgMHgwMSwgMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwKKwkweDJELCAweDBELCAweDY5LCAweDQ3LCAweEVCLCAweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLAorCTB4RkYsIDB4OTMsIDB4MDAsIDB4QjYsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsCisJMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNCwgMHhGRCwgMHgyQywgMHgwMywgMHg5NCwgMHhGQiwgMHg4MywKKwkweDA2LCAweENFLCAweDQ4LCAweDA1LCAweDAxLCAweEY1LCAweEZELCAweEYwLCAweDAxLCAweDg3LCAweEZFLAorCTB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsCisJMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwgMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwKKwkweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LCAweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLAorCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsCisJMHg0QSwgMHhGRiwgMHg4MywgMHgwMCwgMHg5MSwgMHgwMCwgMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywKKwkweDBELCAweENELCAweEY4LCAweDg5LCAweDA0LCAweDM2LCAweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLAorCTB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsCisJMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwgMHhGNywgMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwKKwkweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLCAweEJFLCAweDAxLCAweDQyLCAweEZGLCAweDMyLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTMsIDB4MDAsCisJMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwgMHg5NCwgMHgxQywgMHg0NywKKwkweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsIDB4MDEsIDB4NTcsCisJMHhGRCwgMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwgMHhBQSwgMHhGMiwKKwkweDA2LCAweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsIDB4RkMsCisJMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwgMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwgMHgyOSwKKwkweDA3LCAweDQ2LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLAorCTB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsIDB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsCisJMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwgMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwKKwkweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweEZELAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsIDB4MDcsCisJMHg2MSwgMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwgMHgyQywKKwkweEZELCAweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsCisJMHhGMywgMHg1QiwgMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwKKwkweEI0LCAweDAwLCAweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDMzLAorCTB4MDAsIDB4M0UsIDB4RkYsIDB4QzgsIDB4MDEsIDB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsCisJMHhCNiwgMHgxNiwgMHg3NywgMHg0MywgMHhCRCwgMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwKKwkweDAwLCAweDI1LCAweDAwLCAweEUxLCAweEZGLCAweDA4LCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLAorCTB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsIDB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsIDB4MzksIDB4RjgsIDB4NTksCisJMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwgMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwgMHgwMCwgMHg3MywgMHhGRiwKKwkweDc4LCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLAorCTB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsIDB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsCisJMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwKKwkweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLCAweDFDLCAweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLAorCTB4NUQsIDB4RkUsIDB4M0YsIDB4MDIsIDB4NUUsIDB4RkQsIDB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsCisJMHgwNSwgMHgyRSwgMHhGQywgMHhERSwgMHgwMiwgMHgwQywgMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwKKwkweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweEFFLCAweEZGLCAweEE3LCAweDAwLCAweDEyLAorCTB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsIDB4RkQsIDB4REMsIDB4NDcsIDB4OTUsIDB4MEIsCisJMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwgMHg3MSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwKKwkweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLCAweDAwLCAweEMzLCAweEZGLAorCTB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsIDB4QjIsIDB4MTIsIDB4MTksCisJMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LCAweDAwLCAweDg1LAorCTB4RkUsIDB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsIDB4RTEsIDB4RjQsCisJMHg0MywgMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LCAweEZELAorCTB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsIDB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsIDB4RTYsCisJMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLCAweDAxLCAweEUwLCAweEZDLCAweDdGLAorCTB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksIDB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsCisJMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKKwkweEZGLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELCAweDA3LAorCTB4ODAsIDB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsIDB4NzgsCisJMHhGQywgMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLAorCTB4RjIsIDB4NjAsIDB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsCisJMHg1MSwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLAorCTB4QkEsIDB4MjAsIDB4NjEsIDB4M0QsIDB4NTYsIDB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsCisJMHgwMCwgMHhDNSwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweDNBLCAweEZGLCAweEQzLCAweDAxLCAweDdELCAweEZDLCAweDIzLCAweDA2LCAweDMyLCAweEY1LCAweDBDLAorCTB4MTksIDB4MzgsIDB4NDIsIDB4QzcsIDB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsIDB4RkUsIDB4NEUsIDB4MDAsCisJMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwKKwkweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLCAweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLAorCTB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsIDB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsCisJMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwKKwkweDY2LCAweDAxLCAweDdELCAweEZELCAweEY4LCAweDAzLCAweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELAorCTB4NDgsIDB4QzUsIDB4RkQsIDB4N0EsIDB4RkYsIDB4MUQsIDB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsCisJMHhBOSwgMHhGRiwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwKKwkweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LCAweEZDLCAweDI0LCAweDA0LCAweEY1LCAweDQ4LAorCTB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsIDB4NDIsIDB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwgMHgwMCwgMHhEQiwgMHhGRSwKKwkweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LCAweDgxLCAweDA5LCAweDYxLAorCTB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwgMHhGRiwgMHgwNiwKKwkweDAwLCAweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLCAweEQ3LCAweEY3LAorCTB4RkMsIDB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRSwKKwkweDcxLCAweDAzLCAweDNGLCAweEY2LCAweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LCAweDAwLAorCTB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwgMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwKKwkweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLCAweDk3LCAweEYzLCAweEJELCAweDA2LAorCTB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwgMHgwNiwKKwkweDE0LCAweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LCAweDMzLAorCTB4RkMsIDB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgyOCwgMHgwMCwgMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwKKwkweEYxLCAweEUzLCAweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLAorCTB4QjcsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwgMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwKKwkweEFFLCAweDJBLCAweDg2LCAweDM1LCAweEIxLCAweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLAorCTB4MDEsIDB4N0IsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNywgMHgwNiwgMHhFMCwgMHhGMiwgMHgxOCwKKwkweDIzLCAweEFCLCAweDNCLCAweENDLCAweEYyLCAweEE4LCAweDA1LCAweDc2LCAweEZELCAweDA0LCAweDAxLAorCTB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCisJMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywgMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwKKwkweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLCAweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LAorCTB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsCisJMHhCNywgMHgwMSwgMHhDNSwgMHhGQywgMHg3QywgMHgwNSwgMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywKKwkweDQ0LCAweDE0LCAweEY4LCAweDY3LCAweDAyLCAweDc3LCAweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLAorCTB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsCisJMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwgMHhGOSwgMHhBNCwgMHgwQywgMHg5MCwgMHg0NywKKwkweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLCAweDJFLCAweEZGLCAweDk5LCAweDAwLCAweEIzLAorCTB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsIDB4RkYsIDB4MzEsIDB4MDEsCisJMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwgMHhEQiwgMHg0OCwgMHg3MywKKwkweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLCAweDAwLCAweDkxLCAweEZGLAorCTB4MUIsIDB4MDAsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsIDB4RkUsIDB4QkIsCisJMHgwMSwgMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywgMHgyRSwgMHhGQiwKKwkweDYwLCAweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LCAweDAwLCAweDAwLAorCTB4MDAsIDB4MTAsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsIDB4MDAsCisJMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwgMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwgMHhBMSwKKwkweDA0LCAweDJCLCAweEZELCAweDhCLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MzIsIDB4RkYsIDB4REMsCisJMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwgMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwKKwkweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDA0LAorCTB4MDAsIDB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsIDB4MDQsCisJMHg1NSwgMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwgMHg1NSwKKwkweEZDLCAweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLAorCTB4MTEsIDB4MDAsIDB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsCisJMHhGMiwgMHg1NCwgMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywKKwkweEU0LCAweDAxLCAweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDIzLAorCTB4MDAsIDB4NzEsIDB4RkYsIDB4ODIsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsCisJMHhGRCwgMHgzMywgMHg2MiwgMHgyQywgMHhBOCwgMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywKKwkweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJGLCAweDAwLAorCTB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUUsIDB4RjEsIDB4RjIsCisJMHgyQywgMHg3OCwgMHgzMywgMHg4QywgMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwgMHhGQywgMHg4OCwgMHgwMSwKKwkweDZELCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLAorCTB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsCisJMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwgMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwKKwkweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAorCTB4RTIsIDB4MDEsIDB4NTAsIDB4RkMsIDB4OTksIDB4MDYsIDB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsCisJMHgzRiwgMHgyNywgMHhGNCwgMHhCOSwgMHgwNCwgMHgxMCwgMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwKKwkweEZCLCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM1LAorCTB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsIDB4RjYsIDB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsCisJMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwKKwkweEZGLCAweDA5LCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweDkwLCAweDAxLAorCTB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsIDB4RTEsIDB4NDYsIDB4RTEsCisJMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwgMHgwMCwgMHhCRSwgMHhGRiwKKwkweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LCAweDAxLCAweEJDLAorCTB4RkQsIDB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsIDB4QzMsIDB4RkYsCisJMHg4OSwgMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwKKwkweDAwLCAweDFDLCAweDAwLCAweDhGLCAweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LCAweDAyLAorCTB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsIDB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsIDB4RjgsCisJMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwgMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLCAweEZGLCAweEQwLCAweDAwLCAweDA3LAorCTB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsIDB4NjMsIDB4RjksIDB4NDIsIDB4MDQsCisJMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwKKwkweDAwLCAweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLCAweDAyLAorCTB4NUUsIDB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsIDB4Q0YsCisJMHhGQywgMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwKKwkweEYwLCAweEZGLCAweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLAorCTB4RjUsIDB4MzIsIDB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsCisJMHhEQSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwKKwkweDAwLCAweEI2LCAweEZGLCAweEZCLCAweDAwLCAweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLAorCTB4MUMsIDB4M0MsIDB4ODEsIDB4MjIsIDB4RkMsIDB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweDdGLCAweEZGLCAweDY3LCAweDAxLCAweEQ1LCAweEZDLCAweDhFLCAweDA2LCAweEJFLCAweEYxLCAweDA2LAorCTB4MzYsIDB4MUEsIDB4MkEsIDB4REMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsCisJMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywKKwkweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLCAweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLAorCTB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsIDB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwKKwkweERELCAweDAxLCAweDM0LCAweEZDLCAweDIzLCAweDA3LCAweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLAorCTB4MzcsIDB4MDAsIDB4RjIsIDB4NEQsIDB4MDYsIDB4MDQsIDB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsCisJMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwKKwkweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LCAweEYzLCAweDIyLCAweDIwLCAweENBLCAweDNELAorCTB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsIDB4RDQsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMSwgMHgwMSwKKwkweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LCAweDg5LCAweDQyLCAweDAyLAorCTB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MDAsIDB4RTgsIDB4RkYsCisJMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwgMHgwMSwgMHhGNiwKKwkweEZDLCAweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LCAweDkzLCAweEY5LAorCTB4OTgsIDB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MEUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwgMHhGRCwKKwkweERGLCAweDAzLCAweDJFLCAweEZBLCAweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLCAweDRCLAorCTB4RkYsIDB4MzgsIDB4MDEsIDB4RTksIDB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwKKwkweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLAorCTB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGNCwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHgwMCwgMHgwNywgMHgwMywgMHgxNiwgMHgwNiwKKwkweDdDLCAweDA5LCAweDJBLCAweDBDLCAweDJFLCAweDBELCAweDJBLCAweDBDLCAweDdDLCAweDA5LCAweDE2LAorCTB4MDYsIDB4MDcsIDB4MDMsIDB4RkYsIDB4MDAsIDB4MUEsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjIsIDB4RkYsCisJMHhBMCwgMHhGRiwgMHg3MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHg4NiwgMHgwMywgMHg3MywgMHgwOCwgMHg4OCwKKwkweDBELCAweDc4LCAweDEwLCAweEM5LCAweDBGLCAweEQ1LCAweDBCLCAweDhCLCAweDA2LCAweDI4LCAweDAyLAorCTB4REYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REMsCisJMHhGRiwgMHg4MCwgMHhGRiwgMHg5QSwgMHhGRiwgMHg0NiwgMHgwMSwgMHgxRSwgMHgwNSwgMHg1QSwgMHgwQSwKKwkweEVELCAweDBFLCAweEFBLCAweDEwLCAweEFGLCAweDBFLCAweEZELCAweDA5LCAweENCLCAweDA0LCAweDE4LAorCTB4MDEsIDB4OEUsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RTEsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkQsIDB4RkYsCisJMHg2RCwgMHhGRiwgMHhGNiwgMHhGRiwgMHg2NSwgMHgwMiwgMHhFNSwgMHgwNiwgMHgyQiwgMHgwQywgMHhGMywKKwkweDBGLCAweDYwLCAweDEwLCAweDNCLCAweDBELCAweDE2LCAweDA4LCAweDNGLCAweDAzLCAweDUwLCAweDAwLAorCTB4NkUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NzUsCisJMHhGRiwgMHg5MSwgMHgwMCwgMHhDOSwgMHgwMywgMHhDOCwgMHgwOCwgMHhDQywgMHgwRCwgMHg4OSwgMHgxMCwKKwkweDlGLCAweDBGLCAweDg1LCAweDBCLCAweDNCLCAweDA2LCAweEY0LCAweDAxLCAweENELCAweEZGLCAweDcyLAorCTB4RkYsIDB4QzksIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RkYsIDB4N0IsIDB4RkYsCisJMHhBNSwgMHhGRiwgMHg3MywgMHgwMSwgMHg2QSwgMHgwNSwgMHhBRCwgMHgwQSwgMHgyMSwgMHgwRiwgMHhBNiwKKwkweDEwLCAweDc0LCAweDBFLCAweEE5LCAweDA5LCAweDgzLCAweDA0LCAweEYwLCAweDAwLCAweDg1LCAweEZGLAorCTB4OEIsIDB4RkYsIDB4RTUsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjcsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHg5RCwgMHgwMiwgMHgzNywgMHgwNywgMHg3OCwgMHgwQywgMHgxNSwgMHgxMCwgMHg0NywgMHgxMCwKKwkweEYzLCAweDBDLCAweEMyLCAweDA3LCAweDAxLCAweDAzLCAweDM1LCAweDAwLCAweDZELCAweEZGLCAweEFELAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4RUIsIDB4RkYsIDB4OTQsIDB4RkYsIDB4N0EsIDB4RkYsIDB4QjMsIDB4MDAsCisJMHgwRCwgMHgwNCwgMHgxQywgMHgwOSwgMHgwRCwgMHgwRSwgMHg5NywgMHgxMCwgMHg3MywgMHgwRiwgMHgzNSwKKwkweDBCLCAweEVCLCAweDA1LCAweEMxLCAweDAxLCAweEJELCAweEZGLCAweDc1LCAweEZGLCAweENFLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDIsIDB4RkYsIDB4NzcsIDB4RkYsIDB4QjMsIDB4RkYsIDB4QTEsCisJMHgwMSwgMHhCNywgMHgwNSwgMHhGRiwgMHgwQSwgMHg1MywgMHgwRiwgMHg5RSwgMHgxMCwgMHgzNywgMHgwRSwKKwkweDU1LCAweDA5LCAweDNCLCAweDA0LCAweENCLCAweDAwLCAweDdFLCAweEZGLCAweDkwLCAweEZGLCAweEU5LAorCTB4RkYsIDB4RjgsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RDgsIDB4MDIsCisJMHg4QSwgMHgwNywgMHhDMiwgMHgwQywgMHgzNCwgMHgxMCwgMHgyQSwgMHgxMCwgMHhBQSwgMHgwQywgMHg2RiwKKwkweDA3LCAweEM0LCAweDAyLCAweDFDLCAweDAwLCAweDZDLCAweEZGLCAweEIzLCAweEZGLCAweEY5LCAweEZGLAorCTB4RTgsIDB4RkYsIDB4OEUsIDB4RkYsIDB4ODAsIDB4RkYsIDB4RDcsIDB4MDAsIDB4NTMsIDB4MDQsIDB4NzEsCisJMHgwOSwgMHg0QywgMHgwRSwgMHhBMSwgMHgxMCwgMHg0MywgMHgwRiwgMHhFMywgMHgwQSwgMHg5RCwgMHgwNSwKKwkweDkxLCAweDAxLCAweEFFLCAweEZGLCAweDc5LCAweEZGLCAweEQ0LCAweEZGLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4Q0QsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QzIsIDB4RkYsIDB4RDIsIDB4MDEsIDB4MDYsIDB4MDYsCisJMHg1MCwgMHgwQiwgMHg4MiwgMHgwRiwgMHg5MywgMHgxMCwgMHhGOCwgMHgwRCwgMHgwMCwgMHgwOSwgMHhGNiwKKwkweDAzLCAweEE3LCAweDAwLCAweDc4LCAweEZGLCAweDk2LCAweEZGLCAweEVDLCAweEZGLCAweEY2LCAweEZGLAorCTB4QUIsIDB4RkYsIDB4NkQsIDB4RkYsIDB4M0UsIDB4MDAsIDB4MTUsIDB4MDMsIDB4REUsIDB4MDcsIDB4MEIsCisJMHgwRCwgMHg1MCwgMHgxMCwgMHgwQSwgMHgxMCwgMHg1RSwgMHgwQywgMHgxQywgMHgwNywgMHg4QSwgMHgwMiwKKwkweDA0LCAweDAwLCAweDZDLCAweEZGLCAweEI5LCAweEZGLCAweEZCLCAweEZGLCAweEU0LCAweEZGLCAweDg5LAorCTB4RkYsIDB4ODgsIDB4RkYsIDB4RkQsIDB4MDAsIDB4OUIsIDB4MDQsIDB4QzUsIDB4MDksIDB4ODgsIDB4MEUsCisJMHhBOCwgMHgxMCwgMHgxMCwgMHgwRiwgMHg5MSwgMHgwQSwgMHg1MCwgMHgwNSwgMHg2NCwgMHgwMSwgMHhBMSwKKwkweEZGLCAweDdELCAweEZGLCAweEQ5LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM3LCAweEZGLAorCTB4NzEsIDB4RkYsIDB4RDMsIDB4RkYsIDB4MDUsIDB4MDIsIDB4NTUsIDB4MDYsIDB4QTAsIDB4MEIsIDB4QUQsCisJMHgwRiwgMHg4NCwgMHgxMCwgMHhCNiwgMHgwRCwgMHhBQywgMHgwOCwgMHhCMywgMHgwMywgMHg4NiwgMHgwMCwKKwkweDc0LCAweEZGLCAweDlDLCAweEZGLCAweEYwLCAweEZGLCAweEY0LCAweEZGLCAweEE1LCAweEZGLCAweDZGLAorCTB4RkYsIDB4NUEsIDB4MDAsIDB4NTQsIDB4MDMsIDB4MzIsIDB4MDgsIDB4NTIsIDB4MEQsIDB4NjgsIDB4MTAsCisJMHhFNiwgMHgwRiwgMHgxMSwgMHgwQywgMHhDQSwgMHgwNiwgMHg1MiwgMHgwMiwgMHhFRiwgMHhGRiwgMHg2RSwKKwkweEZGLCAweEJGLCAweEZGLCAweEZDLCAweEZGLCAweERGLCAweEZGLCAweDg0LCAweEZGLCAweDkxLCAweEZGLAorCTB4MjUsIDB4MDEsIDB4RTQsIDB4MDQsIDB4MTksIDB4MEEsIDB4QzIsIDB4MEUsIDB4QUEsIDB4MTAsIDB4REEsCisJMHgwRSwgMHgzRSwgMHgwQSwgMHgwNSwgMHgwNSwgMHgzOCwgMHgwMSwgMHg5NiwgMHhGRiwgMHg4MSwgMHhGRiwKKwkweERELCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMxLCAweEZGLCAweDZFLCAweEZGLCAweEU2LAorCTB4RkYsIDB4M0EsIDB4MDIsIDB4QTYsIDB4MDYsIDB4RUYsIDB4MEIsIDB4RDYsIDB4MEYsIDB4NzEsIDB4MTAsCisJMHg3MSwgMHgwRCwgMHg1NywgMHgwOCwgMHg3MSwgMHgwMywgMHg2NywgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMiwKKwkweEZGLCAweEYzLCAweEZGLCAweEYxLCAweEZGLCAweDlGLCAweEZGLCAweDcyLCAweEZGLCAweDc4LCAweDAwLAorCTB4OTUsIDB4MDMsIDB4ODYsIDB4MDgsIDB4OTgsIDB4MEQsIDB4N0MsIDB4MTAsIDB4QzAsIDB4MEYsIDB4QzMsCisJMHgwQiwgMHg3OSwgMHgwNiwgMHgxQywgMHgwMiwgMHhEQiwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNSwgMHhGRiwKKwkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERCLCAweEZGLCAweDdGLCAweEZGLCAweDlDLCAweEZGLCAweDUwLAorCTB4MDEsIDB4MkYsIDB4MDUsIDB4NkMsIDB4MEEsIDB4RjksIDB4MEUsIDB4QTksIDB4MTAsIDB4QTIsIDB4MEUsCisJMHhFQSwgMHgwOSwgMHhCQiwgMHgwNCwgMHgwRiwgMHgwMSwgMHg4QywgMHhGRiwgMHg4NywgMHhGRiwgMHhFMiwKKwkweEZGLCAweEZDLCAweEZGLCAweEJDLCAweEZGLCAweDZELCAweEZGLCAweEZBLCAweEZGLCAweDcxLCAweDAyLAorCTB4RjcsIDB4MDYsIDB4M0MsIDB4MEMsIDB4RkIsIDB4MEYsIDB4NUIsIDB4MTAsIDB4MkIsIDB4MEQsIDB4MDMsCisJMHgwOCwgMHgzMSwgMHgwMywgMHg0QSwgMHgwMCwgMHg2RSwgMHhGRiwgMHhBOCwgMHhGRiwgMHhGNSwgMHhGRiwKKwkweEVFLCAweEZGLCAweDk5LCAweEZGLCAweDc2LCAweEZGLCAweDk4LCAweDAwLCAweEQ4LCAweDAzLCAweERCLAorCTB4MDgsIDB4REIsIDB4MEQsIDB4OEQsIDB4MTAsIDB4OTYsIDB4MEYsIDB4NzMsIDB4MEIsIDB4MjksIDB4MDYsCisJMHhFOCwgMHgwMSwgMHhDOSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEQ2LCAweEZGLCAweDdBLCAweEZGLCAweEE4LCAweEZGLCAweDdELCAweDAxLCAweDdCLCAweDA1LAorCTB4QkYsIDB4MEEsIDB4MkQsIDB4MEYsIDB4QTUsIDB4MTAsIDB4NjcsIDB4MEUsIDB4OTYsIDB4MDksIDB4NzMsCisJMHgwNCwgMHhFNywgMHgwMCwgMHg4NCwgMHhGRiwgMHg4QywgMHhGRiwgMHhFNiwgMHhGRiwgMHhGQSwgMHhGRiwKKwkweEI2LCAweEZGLCAweDZDLCAweEZGLCAweDExLCAweDAwLCAweEFBLCAweDAyLCAweDRBLCAweDA3LCAweDg4LAorCTB4MEMsIDB4MUMsIDB4MTAsIDB4NDEsIDB4MTAsIDB4RTMsIDB4MEMsIDB4QUYsIDB4MDcsIDB4RjMsIDB4MDIsCisJMHgyRiwgMHgwMCwgMHg2QywgMHhGRiwgMHhBRSwgMHhGRiwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MywKKwkweEZGLCAweDdCLCAweEZGLCAweEJCLCAweDAwLCAweDFDLCAweDA0LCAweDJGLCAweDA5LCAweDFCLCAweDBFLAorCTB4OUEsIDB4MTAsIDB4NjgsIDB4MEYsIDB4MjMsIDB4MEIsIDB4REEsIDB4MDUsIDB4QjcsIDB4MDEsIDB4QjksCisJMHhGRiwgMHg3NiwgMHhGRiwgMHhEMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMSwgMHhGRiwKKwkweDc2LCAweEZGLCAweEI2LCAweEZGLCAweEFDLCAweDAxLCAweEM4LCAweDA1LCAweDExLCAweDBCLCAweDVFLAorCTB4MEYsIDB4OUMsIDB4MTAsIDB4MjksIDB4MEUsIDB4NDIsIDB4MDksIDB4MkMsIDB4MDQsIDB4QzIsIDB4MDAsCisJMHg3RCwgMHhGRiwgMHg5MiwgMHhGRiwgMHhFQSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhCMCwgMHhGRiwgMHg2QywKKwkweEZGLCAweDI5LCAweDAwLCAweEU2LCAweDAyLCAweDlELCAweDA3LCAweEQzLCAweDBDLCAweDNCLCAweDEwLAorCTB4MjMsIDB4MTAsIDB4OTksIDB4MEMsIDB4NUMsIDB4MDcsIDB4QjcsIDB4MDIsIDB4MTYsIDB4MDAsIDB4NkMsCisJMHhGRiwgMHhCNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhFNywgMHhGRiwgMHg4RCwgMHhGRiwgMHg4MiwgMHhGRiwKKwkweERGLCAweDAwLCAweDYzLCAweDA0LCAweDg0LCAweDA5LCAweDU5LCAweDBFLCAweEEzLCAweDEwLCAweDM4LAorCTB4MEYsIDB4RDEsIDB4MEEsIDB4OEMsIDB4MDUsIDB4ODcsIDB4MDEsIDB4QUIsIDB4RkYsIDB4NzksIDB4RkYsCisJMHhENSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDQiwgMHhGRiwgMHg3MywgMHhGRiwgMHhDNiwKKwkweEZGLCAweERELCAweDAxLCAweDE3LCAweDA2LCAweDYyLCAweDBCLCAweDhDLCAweDBGLCAweDkwLCAweDEwLAorCTB4RTksIDB4MEQsIDB4RUQsIDB4MDgsIDB4RTcsIDB4MDMsIDB4QTAsIDB4MDAsIDB4NzcsIDB4RkYsIDB4OTcsCisJMHhGRiwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg2RCwgMHhGRiwgMHg0NCwgMHgwMCwKKwkweDIzLCAweDAzLCAweEYxLCAweDA3LCAweDFCLCAweDBELCAweDU1LCAweDEwLCAweDAyLCAweDEwLCAweDRELAorCTB4MEMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkEsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHhFMywgMHhGRiwgMHg4OCwgMHhGRiwgMHg4QSwgMHhGRiwgMHgwNiwgMHgwMSwgMHhBQiwKKwkweDA0LCAweEQ4LCAweDA5LCAweDk1LCAweDBFLCAweEE5LCAweDEwLCAweDA1LCAweDBGLCAweDdGLCAweDBBLAorCTB4NDAsIDB4MDUsIDB4NUEsIDB4MDEsIDB4OUYsIDB4RkYsIDB4N0UsIDB4RkYsIDB4REEsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHhDNiwgMHhGRiwgMHg3MCwgMHhGRiwgMHhENywgMHhGRiwgMHgxMCwgMHgwMiwKKwkweDY3LCAweDA2LCAweEIxLCAweDBCLCAweEI3LCAweDBGLCAweDgwLCAweDEwLCAweEE3LCAweDBELCAweDk5LAorCTB4MDgsIDB4QTQsIDB4MDMsIDB4N0YsIDB4MDAsIDB4NzMsIDB4RkYsIDB4OUQsIDB4RkYsIDB4RjAsIDB4RkYsCisJMHhGMywgMHhGRiwgMHhBMywgMHhGRiwgMHg3MCwgMHhGRiwgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMywgMHg0NSwKKwkweDA4LCAweDYyLCAweDBELCAweDZDLCAweDEwLCAweERFLCAweDBGLCAweDAwLCAweDBDLCAweEI4LCAweDA2LAorCTB4NDYsIDB4MDIsIDB4RUEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4QzAsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhERSwgMHhGRiwgMHg4MywgMHhGRiwgMHg5NCwgMHhGRiwgMHgyRiwgMHgwMSwgMHhGNCwgMHgwNCwKKwkweDJCLCAweDBBLCAweENFLCAweDBFLCAweEFBLCAweDEwLCAweENFLCAweDBFLCAweDJCLCAweDBBLCAweEY0LAorCTB4MDQsIDB4MkYsIDB4MDEsIDB4OTQsIDB4RkYsIDB4ODMsIDB4RkYsIDB4REUsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHhDMCwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFQSwgMHhGRiwgMHg0NiwgMHgwMiwgMHhCOCwgMHgwNiwgMHgwMCwKKwkweDBDLCAweERFLCAweDBGLCAweDZDLCAweDEwLCAweDYyLCAweDBELCAweDQ1LCAweDA4LCAweDYyLCAweDAzLAorCTB4NjAsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RjMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUQsCisJMHhGRiwgMHg3MywgMHhGRiwgMHg3RiwgMHgwMCwgMHhBNCwgMHgwMywgMHg5OSwgMHgwOCwgMHhBNywgMHgwRCwKKwkweDgwLCAweDEwLCAweEI3LCAweDBGLCAweEIxLCAweDBCLCAweDY3LCAweDA2LCAweDEwLCAweDAyLCAweEQ3LAorCTB4RkYsIDB4NzAsIDB4RkYsIDB4QzYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REEsIDB4RkYsCisJMHg3RSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg1QSwgMHgwMSwgMHg0MCwgMHgwNSwgMHg3RiwgMHgwQSwgMHgwNSwKKwkweDBGLCAweEE5LCAweDEwLCAweDk1LCAweDBFLCAweEQ4LCAweDA5LCAweEFCLCAweDA0LCAweDA2LCAweDAxLAorCTB4OEEsIDB4RkYsIDB4ODgsIDB4RkYsIDB4RTMsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QkEsIDB4RkYsIDB4NkQsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHg3RSwgMHgwMiwgMHgwQSwgMHgwNywgMHg0RCwgMHgwQywgMHgwMiwgMHgxMCwKKwkweDU1LCAweDEwLCAweDFCLCAweDBELCAweEYxLCAweDA3LCAweDIzLCAweDAzLCAweDQ0LCAweDAwLCAweDZELAorCTB4RkYsIDB4QTksIDB4RkYsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NzcsIDB4RkYsCisJMHhBMCwgMHgwMCwgMHhFNywgMHgwMywgMHhFRCwgMHgwOCwgMHhFOSwgMHgwRCwgMHg5MCwgMHgxMCwgMHg4QywKKwkweDBGLCAweDYyLCAweDBCLCAweDE3LCAweDA2LCAweERELCAweDAxLCAweEM2LCAweEZGLCAweDczLCAweEZGLAorCTB4Q0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUIsCisJMHhGRiwgMHg4NywgMHgwMSwgMHg4QywgMHgwNSwgMHhEMSwgMHgwQSwgMHgzOCwgMHgwRiwgMHhBMywgMHgxMCwKKwkweDU5LCAweDBFLCAweDg0LCAweDA5LCAweDYzLCAweDA0LCAweERGLCAweDAwLCAweDgyLCAweEZGLCAweDhELAorCTB4RkYsIDB4RTcsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjQsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTYsIDB4MDAsCisJMHhCNywgMHgwMiwgMHg1QywgMHgwNywgMHg5OSwgMHgwQywgMHgyMywgMHgxMCwgMHgzQiwgMHgxMCwgMHhEMywKKwkweDBDLCAweDlELCAweDA3LCAweEU2LCAweDAyLCAweDI5LCAweDAwLCAweDZDLCAweEZGLCAweEIwLCAweEZGLAorCTB4RjgsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTIsIDB4RkYsIDB4N0QsIDB4RkYsIDB4QzIsIDB4MDAsIDB4MkMsCisJMHgwNCwgMHg0MiwgMHgwOSwgMHgyOSwgMHgwRSwgMHg5QywgMHgxMCwgMHg1RSwgMHgwRiwgMHgxMSwgMHgwQiwKKwkweEM4LCAweDA1LCAweEFDLCAweDAxLCAweEI2LCAweEZGLCAweDc2LCAweEZGLCAweEQxLCAweEZGLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NzYsIDB4RkYsIDB4QjksIDB4RkYsIDB4QjcsIDB4MDEsCisJMHhEQSwgMHgwNSwgMHgyMywgMHgwQiwgMHg2OCwgMHgwRiwgMHg5QSwgMHgxMCwgMHgxQiwgMHgwRSwgMHgyRiwKKwkweDA5LCAweDFDLCAweDA0LCAweEJCLCAweDAwLCAweDdCLCAweEZGLCAweDkzLCAweEZGLCAweEVBLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4QUUsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RjMsIDB4MDIsIDB4QUYsCisJMHgwNywgMHhFMywgMHgwQywgMHg0MSwgMHgxMCwgMHgxQywgMHgxMCwgMHg4OCwgMHgwQywgMHg0QSwgMHgwNywKKwkweEFBLCAweDAyLCAweDExLCAweDAwLCAweDZDLCAweEZGLCAweEI2LCAweEZGLCAweEZBLCAweEZGLCAweEU2LAorCTB4RkYsIDB4OEMsIDB4RkYsIDB4ODQsIDB4RkYsIDB4RTcsIDB4MDAsIDB4NzMsIDB4MDQsIDB4OTYsIDB4MDksCisJMHg2NywgMHgwRSwgMHhBNSwgMHgxMCwgMHgyRCwgMHgwRiwgMHhCRiwgMHgwQSwgMHg3QiwgMHgwNSwgMHg3RCwKKwkweDAxLCAweEE4LCAweEZGLCAweDdBLCAweEZGLCAweEQ2LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAorCTB4Q0EsIDB4RkYsIDB4NzIsIDB4RkYsIDB4QzksIDB4RkYsIDB4RTgsIDB4MDEsIDB4MjksIDB4MDYsIDB4NzMsCisJMHgwQiwgMHg5NiwgMHgwRiwgMHg4RCwgMHgxMCwgMHhEQiwgMHgwRCwgMHhEQiwgMHgwOCwgMHhEOCwgMHgwMywKKwkweDk4LCAweDAwLCAweDc2LCAweEZGLCAweDk5LCAweEZGLCAweEVFLCAweEZGLCAweEY1LCAweEZGLCAweEE4LAorCTB4RkYsIDB4NkUsIDB4RkYsIDB4NEEsIDB4MDAsIDB4MzEsIDB4MDMsIDB4MDMsIDB4MDgsIDB4MkIsIDB4MEQsCisJMHg1QiwgMHgxMCwgMHhGQiwgMHgwRiwgMHgzQywgMHgwQywgMHhGNywgMHgwNiwgMHg3MSwgMHgwMiwgMHhGQSwKKwkweEZGLCAweDZELCAweEZGLCAweEJDLCAweEZGLCAweEZDLCAweEZGLCAweEUyLCAweEZGLCAweDg3LCAweEZGLAorCTB4OEMsIDB4RkYsIDB4MEYsIDB4MDEsIDB4QkIsIDB4MDQsIDB4RUEsIDB4MDksIDB4QTIsIDB4MEUsIDB4QTksCisJMHgxMCwgMHhGOSwgMHgwRSwgMHg2QywgMHgwQSwgMHgyRiwgMHgwNSwgMHg1MCwgMHgwMSwgMHg5QywgMHhGRiwKKwkweDdGLCAweEZGLCAweERCLCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM1LCAweEZGLCAweDcwLAorCTB4RkYsIDB4REIsIDB4RkYsIDB4MUMsIDB4MDIsIDB4NzksIDB4MDYsIDB4QzMsIDB4MEIsIDB4QzAsIDB4MEYsCisJMHg3QywgMHgxMCwgMHg5OCwgMHgwRCwgMHg4NiwgMHgwOCwgMHg5NSwgMHgwMywgMHg3OCwgMHgwMCwgMHg3MiwKKwkweEZGLCAweDlGLCAweEZGLCAweEYxLCAweEZGLCAweEYzLCAweEZGLCAweEEyLCAweEZGLCAweDcwLCAweEZGLAorCTB4NjcsIDB4MDAsIDB4NzEsIDB4MDMsIDB4NTcsIDB4MDgsIDB4NzEsIDB4MEQsIDB4NzEsIDB4MTAsIDB4RDYsCisJMHgwRiwgMHhFRiwgMHgwQiwgMHhBNiwgMHgwNiwgMHgzQSwgMHgwMiwgMHhFNiwgMHhGRiwgMHg2RSwgMHhGRiwKKwkweEMxLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERELCAweEZGLCAweDgxLCAweEZGLCAweDk2LAorCTB4RkYsIDB4MzgsIDB4MDEsIDB4MDUsIDB4MDUsIDB4M0UsIDB4MEEsIDB4REEsIDB4MEUsIDB4QUEsIDB4MTAsCisJMHhDMiwgMHgwRSwgMHgxOSwgMHgwQSwgMHhFNCwgMHgwNCwgMHgyNSwgMHgwMSwgMHg5MSwgMHhGRiwgMHg4NCwKKwkweEZGLCAweERGLCAweEZGLCAweEZDLCAweEZGLCAweEJGLCAweEZGLCAweDZFLCAweEZGLCAweEVGLCAweEZGLAorCTB4NTIsIDB4MDIsIDB4Q0EsIDB4MDYsIDB4MTEsIDB4MEMsIDB4RTYsIDB4MEYsIDB4NjgsIDB4MTAsIDB4NTIsCisJMHgwRCwgMHgzMiwgMHgwOCwgMHg1NCwgMHgwMywgMHg1QSwgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNSwgMHhGRiwKKwkweEY0LCAweEZGLCAweEYwLCAweEZGLCAweDlDLCAweEZGLCAweDc0LCAweEZGLCAweDg2LCAweDAwLCAweEIzLAorCTB4MDMsIDB4QUMsIDB4MDgsIDB4QjYsIDB4MEQsIDB4ODQsIDB4MTAsIDB4QUQsIDB4MEYsIDB4QTAsIDB4MEIsCisJMHg1NSwgMHgwNiwgMHgwNSwgMHgwMiwgMHhEMywgMHhGRiwgMHg3MSwgMHhGRiwgMHhDNywgMHhGRiwgMHhGRSwKKwkweEZGLCAweDAwLCAweDAwLCAweEQ5LCAweEZGLCAweDdELCAweEZGLCAweEExLCAweEZGLCAweDY0LCAweDAxLAorCTB4NTAsIDB4MDUsIDB4OTEsIDB4MEEsIDB4MTAsIDB4MEYsIDB4QTgsIDB4MTAsIDB4ODgsIDB4MEUsIDB4QzUsCisJMHgwOSwgMHg5QiwgMHgwNCwgMHhGRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHg4OSwgMHhGRiwgMHhFNCwgMHhGRiwKKwkweEZCLCAweEZGLCAweEI5LCAweEZGLCAweDZDLCAweEZGLCAweDA0LCAweDAwLCAweDhBLCAweDAyLCAweDFDLAorCTB4MDcsIDB4NUUsIDB4MEMsIDB4MEEsIDB4MTAsIDB4NTAsIDB4MTAsIDB4MEIsIDB4MEQsIDB4REUsIDB4MDcsCisJMHgxNSwgMHgwMywgMHgzRSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBQiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhFQywKKwkweEZGLCAweDk2LCAweEZGLCAweDc4LCAweEZGLCAweEE3LCAweDAwLCAweEY2LCAweDAzLCAweDAwLCAweDA5LAorCTB4RjgsIDB4MEQsIDB4OTMsIDB4MTAsIDB4ODIsIDB4MEYsIDB4NTAsIDB4MEIsIDB4MDYsIDB4MDYsIDB4RDIsCisJMHgwMSwgMHhDMiwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweEQ0LCAweEZGLCAweDc5LCAweEZGLCAweEFFLCAweEZGLCAweDkxLCAweDAxLCAweDlELCAweDA1LCAweEUzLAorCTB4MEEsIDB4NDMsIDB4MEYsIDB4QTEsIDB4MTAsIDB4NEMsIDB4MEUsIDB4NzEsIDB4MDksIDB4NTMsIDB4MDQsCisJMHhENywgMHgwMCwgMHg4MCwgMHhGRiwgMHg4RSwgMHhGRiwgMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMywKKwkweEZGLCAweDZDLCAweEZGLCAweDFDLCAweDAwLCAweEM0LCAweDAyLCAweDZGLCAweDA3LCAweEFBLCAweDBDLAorCTB4MkEsIDB4MTAsIDB4MzQsIDB4MTAsIDB4QzIsIDB4MEMsIDB4OEEsIDB4MDcsIDB4RDgsIDB4MDIsIDB4MjQsCisJMHgwMCwgMHg2QywgMHhGRiwgMHhCMSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhFOSwgMHhGRiwgMHg5MCwgMHhGRiwKKwkweDdFLCAweEZGLCAweENCLCAweDAwLCAweDNCLCAweDA0LCAweDU1LCAweDA5LCAweDM3LCAweDBFLCAweDlFLAorCTB4MTAsIDB4NTMsIDB4MEYsIDB4RkYsIDB4MEEsIDB4QjcsIDB4MDUsIDB4QTEsIDB4MDEsIDB4QjMsIDB4RkYsCisJMHg3NywgMHhGRiwgMHhEMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhGRiwgMHg3NSwKKwkweEZGLCAweEJELCAweEZGLCAweEMxLCAweDAxLCAweEVCLCAweDA1LCAweDM1LCAweDBCLCAweDczLCAweDBGLAorCTB4OTcsIDB4MTAsIDB4MEQsIDB4MEUsIDB4MUMsIDB4MDksIDB4MEQsIDB4MDQsIDB4QjMsIDB4MDAsIDB4N0EsCisJMHhGRiwgMHg5NCwgMHhGRiwgMHhFQiwgMHhGRiwgMHhGNywgMHhGRiwgMHhBRCwgMHhGRiwgMHg2RCwgMHhGRiwKKwkweDM1LCAweDAwLCAweDAxLCAweDAzLCAweEMyLCAweDA3LCAweEYzLCAweDBDLCAweDQ3LCAweDEwLCAweDE1LAorCTB4MTAsIDB4NzgsIDB4MEMsIDB4MzcsIDB4MDcsIDB4OUQsIDB4MDIsIDB4MEMsIDB4MDAsIDB4NkMsIDB4RkYsCisJMHhCNywgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNSwgMHhGRiwgMHg4QiwgMHhGRiwgMHg4NSwgMHhGRiwgMHhGMCwKKwkweDAwLCAweDgzLCAweDA0LCAweEE5LCAweDA5LCAweDc0LCAweDBFLCAweEE2LCAweDEwLCAweDIxLCAweDBGLAorCTB4QUQsIDB4MEEsIDB4NkEsIDB4MDUsIDB4NzMsIDB4MDEsIDB4QTUsIDB4RkYsIDB4N0IsIDB4RkYsIDB4RDcsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDOSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDRCwgMHhGRiwKKwkweEY0LCAweDAxLCAweDNCLCAweDA2LCAweDg1LCAweDBCLCAweDlGLCAweDBGLCAweDg5LCAweDEwLCAweENDLAorCTB4MEQsIDB4QzgsIDB4MDgsIDB4QzksIDB4MDMsIDB4OTEsIDB4MDAsIDB4NzUsIDB4RkYsIDB4OUEsIDB4RkYsCisJMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBNywgMHhGRiwgMHg2RSwgMHhGRiwgMHg1MCwgMHgwMCwgMHgzRiwKKwkweDAzLCAweDE2LCAweDA4LCAweDNCLCAweDBELCAweDYwLCAweDEwLCAweEYzLCAweDBGLCAweDJCLCAweDBDLAorCTB4RTUsIDB4MDYsIDB4NjUsIDB4MDIsIDB4RjYsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkQsIDB4RkYsIDB4RkMsCisJMHhGRiwgMHhFMSwgMHhGRiwgMHg4NSwgMHhGRiwgMHg4RSwgMHhGRiwgMHgxOCwgMHgwMSwgMHhDQiwgMHgwNCwKKwkweEZELCAweDA5LCAweEFGLCAweDBFLCAweEFBLCAweDEwLCAweEVELCAweDBFLCAweDVBLCAweDBBLCAweDFFLAorCTB4MDUsIDB4NDYsIDB4MDEsIDB4OUEsIDB4RkYsIDB4ODAsIDB4RkYsIDB4REMsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHhDMywgMHhGRiwgMHg2RiwgMHhGRiwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMiwgMHg4QiwKKwkweDA2LCAweEQ1LCAweDBCLCAweEM5LCAweDBGLCAweDc4LCAweDEwLCAweDg4LCAweDBELCAweDczLCAweDA4LAorCTB4ODYsIDB4MDMsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RjIsIDB4RkYsIDB4RjIsCisJMHhGRiwgMHhBMSwgMHhGRiwgMHg3MSwgMHhGRiwgMHg2RSwgMHgwMCwgMHg3RiwgMHgwMywgMHg2QSwgMHgwOCwKKwkweDgxLCAweDBELCAweDc2LCAweDEwLCAweENELCAweDBGLCAweERELCAweDBCLCAweDk0LCAweDA2LCAweDJFLAorCTB4MDIsIDB4RTEsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHhEQywgMHhGRiwgMHg4MCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MiwgMHgwMSwgMHgxNiwgMHgwNSwgMHg1MCwKKwkweDBBLCAweEU3LCAweDBFLCAweEFBLCAweDEwLCAweEI1LCAweDBFLCAweDA2LCAweDBBLCAweEQzLCAweDA0LAorCTB4MUMsIDB4MDEsIDB4OEYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RTAsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkUsCisJMHhGRiwgMHg2RCwgMHhGRiwgMHhGMywgMHhGRiwgMHg1RSwgMHgwMiwgMHhEQywgMHgwNiwgMHgyMywgMHgwQywKKwkweEVGLCAweDBGLCAweDYzLCAweDEwLCAweDQzLCAweDBELCAweDFGLCAweDA4LCAweDQ2LCAweDAzLCAweDUzLAorCTB4MDAsIDB4NkUsIDB4RkYsIDB4QTYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUIsIDB4RkYsCisJMHg3NSwgMHhGRiwgMHg4RCwgMHgwMCwgMHhDMSwgMHgwMywgMHhCRSwgMHgwOCwgMHhDNCwgMHgwRCwgMHg4OCwKKwkweDEwLCAweEE0LCAweDBGLCAweDhFLCAweDBCLCAweDQzLCAweDA2LCAweEY5LCAweDAxLCAweENGLCAweEZGLAorCTB4NzEsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RkYsIDB4N0MsCisJMHhGRiwgMHhBNCwgMHhGRiwgMHg2RSwgMHgwMSwgMHg2MSwgMHgwNSwgMHhBMywgMHgwQSwgMHgxQywgMHgwRiwKKwkweEE3LCAweDEwLCAweDdCLCAweDBFLCAweEIyLCAweDA5LCAweDhCLCAweDA0LCAweEY0LCAweDAwLCAweDg2LAorCTB4RkYsIDB4OEEsIDB4RkYsIDB4RTQsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjgsIDB4RkYsIDB4NkMsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHg5NywgMHgwMiwgMHgyRSwgMHgwNywgMHg2RiwgMHgwQywgMHgxMSwgMHgxMCwgMHg0QSwKKwkweDEwLCAweEZCLCAweDBDLCAweENCLCAweDA3LCAweDA3LCAweDAzLCAweDM4LCAweDAwLCAweDZELCAweEZGLAorCTB4QUMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUMsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUYsCisJMHgwMCwgMHgwNSwgMHgwNCwgMHgxMywgMHgwOSwgMHgwNiwgMHgwRSwgMHg5NiwgMHgxMCwgMHg3OCwgMHgwRiwKKwkweDNFLCAweDBCLCAweEY0LCAweDA1LCAweEM3LCAweDAxLCAweEJGLCAweEZGLCAweDc0LCAweEZGLCAweENFLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDIsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QjEsIDB4RkYsCisJMHg5QywgMHgwMSwgMHhBRSwgMHgwNSwgMHhGNiwgMHgwQSwgMHg0RSwgMHgwRiwgMHg5RiwgMHgxMCwgMHgzRSwKKwkweDBFLCAweDVFLCAweDA5LCAweDQzLCAweDA0LCAweENGLCAweDAwLCAweDdGLCAweEZGLCAweDkwLCAweEZGLAorCTB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjIsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RDIsCisJMHgwMiwgMHg4MSwgMHgwNywgMHhCQSwgMHgwQywgMHgzMSwgMHgxMCwgMHgyRSwgMHgxMCwgMHhCMiwgMHgwQywKKwkweDc4LCAweDA3LCAweENCLCAweDAyLCAweDFFLCAweDAwLCAweDZDLCAweEZGLCAweEIyLCAweEZGLCAweEY5LAorCTB4RkYsIDB4RTgsIDB4RkYsIDB4OEYsIDB4RkYsIDB4ODAsIDB4RkYsIDB4RDMsIDB4MDAsIDB4NEIsIDB4MDQsCisJMHg2NywgMHgwOSwgMHg0NSwgMHgwRSwgMHhBMCwgMHgxMCwgMHg0OCwgMHgwRiwgMHhFQywgMHgwQSwgMHhBNiwKKwkweDA1LCAweDk3LCAweDAxLCAweEIwLCAweEZGLCAweDc4LCAweEZGLCAweEQzLCAweEZGLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QzAsIDB4RkYsIDB4Q0MsIDB4MDEsIDB4RkQsCisJMHgwNSwgMHg0NywgMHgwQiwgMHg3RCwgMHgwRiwgMHg5NCwgMHgxMCwgMHhGRiwgMHgwRCwgMHgwQSwgMHgwOSwKKwkweEZFLCAweDAzLCAweEFCLCAweDAwLCAweDc5LCAweEZGLCAweDk1LCAweEZGLCAweEVDLCAweEZGLCAweEY3LAorCTB4RkYsIDB4QUMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4M0IsIDB4MDAsIDB4MEUsIDB4MDMsIDB4RDUsIDB4MDcsCisJMHgwMywgMHgwRCwgMHg0RCwgMHgxMCwgMHgwRSwgMHgxMCwgMHg2NywgMHgwQywgMHgyNSwgMHgwNywgMHg5MSwKKwkweDAyLCAweDA3LCAweDAwLCAweDZDLCAweEZGLCAweEI4LCAweEZGLCAweEZCLCAweEZGLCAweEU0LCAweEZGLAorCTB4ODksIDB4RkYsIDB4ODcsIDB4RkYsIDB4RjksIDB4MDAsIDB4OTMsIDB4MDQsIDB4QkMsIDB4MDksIDB4ODIsCisJMHgwRSwgMHhBNywgMHgxMCwgMHgxNiwgMHgwRiwgMHg5QSwgMHgwQSwgMHg1OSwgMHgwNSwgMHg2OSwgMHgwMSwKKwkweEEzLCAweEZGLCAweDdDLCAweEZGLCAweEQ4LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM4LAorCTB4RkYsIDB4NzEsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NEMsIDB4MDYsIDB4OTcsIDB4MEIsCisJMHhBOSwgMHgwRiwgMHg4NiwgMHgxMCwgMHhCRCwgMHgwRCwgMHhCNSwgMHgwOCwgMHhCQSwgMHgwMywgMHg4QSwKKwkweDAwLCAweDc0LCAweEZGLCAweDlCLCAweEZGLCAweEVGLCAweEZGLCAweEY0LCAweEZGLCAweEE1LCAweEZGLAorCTB4NkYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4NEQsIDB4MDMsIDB4MjksIDB4MDgsIDB4NEIsIDB4MEQsIDB4NjUsCisJMHgxMCwgMHhFQiwgMHgwRiwgMHgxQSwgMHgwQywgMHhEMywgMHgwNiwgMHg1OCwgMHgwMiwgMHhGMSwgMHhGRiwKKwkweDZELCAweEZGLCAweEJFLCAweEZGLCAweEZDLCAweEZGLCAweEUwLCAweEZGLCAweDg0LCAweEZGLCAweDkwLAorCTB4RkYsIDB4MjEsIDB4MDEsIDB4REMsIDB4MDQsIDB4MTAsIDB4MEEsIDB4QkIsIDB4MEUsIDB4QUEsIDB4MTAsCisJMHhFMSwgMHgwRSwgMHg0NywgMHgwQSwgMHgwRCwgMHgwNSwgMHgzRCwgMHgwMSwgMHg5NywgMHhGRiwgMHg4MSwKKwkweEZGLCAweERELCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMyLCAweEZGLCAweDZGLCAweEZGLAorCTB4RTQsIDB4RkYsIDB4MzQsIDB4MDIsIDB4OUQsIDB4MDYsIDB4RTYsIDB4MEIsIDB4RDEsIDB4MEYsIDB4NzMsCisJMHgxMCwgMHg3OSwgMHgwRCwgMHg2MSwgMHgwOCwgMHg3OCwgMHgwMywgMHg2QSwgMHgwMCwgMHg3MCwgMHhGRiwKKwkweEExLCAweEZGLCAweEYyLCAweEZGLCAweEYxLCAweEZGLCAweDlGLCAweEZGLCAweDcyLCAweEZGLCAweDc0LAorCTB4MDAsIDB4OEUsIDB4MDMsIDB4N0QsIDB4MDgsIDB4OTAsIDB4MEQsIDB4N0EsIDB4MTAsIDB4QzQsIDB4MEYsCisJMHhDQywgMHgwQiwgMHg4MiwgMHgwNiwgMHgyMiwgMHgwMiwgMHhERCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDNCwKKwkweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERCLCAweEZGLCAweDdGLCAweEZGLCAweDlCLCAweEZGLAorCTB4NEIsIDB4MDEsIDB4MjYsIDB4MDUsIDB4NjMsIDB4MEEsIDB4RjMsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QTgsCisJMHgwRSwgMHhGNCwgMHgwOSwgMHhDMywgMHgwNCwgMHgxMywgMHgwMSwgMHg4RCwgMHhGRiwgMHg4NiwgMHhGRiwKKwkweEUxLCAweEZGLCAweEZDLCAweEZGLCAweEJDLCAweEZGLCAweDZELCAweEZGLCAweEY4LCAweEZGLCAweDZCLAorCTB4MDIsIDB4RUUsIDB4MDYsIDB4MzQsIDB4MEMsIDB4RjcsIDB4MEYsIDB4NUQsIDB4MTAsIDB4MzMsIDB4MEQsCisJMHgwRCwgMHgwOCwgMHgzOCwgMHgwMywgMHg0RCwgMHgwMCwgMHg2RSwgMHhGRiwgMHhBNywgMHhGRiwgMHhGNSwKKwkweEZGLCAweEVFLCAweEZGLCAweDk5LCAweEZGLCAweDc2LCAweEZGLCAweDk0LCAweDAwLCAweEQwLCAweDAzLAorCTB4RDEsIDB4MDgsIDB4RDMsIDB4MEQsIDB4OEIsIDB4MTAsIDB4OUEsIDB4MEYsIDB4N0MsIDB4MEIsIDB4MzIsCisJMHgwNiwgMHhFRSwgMHgwMSwgMHhDQiwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDAwLCAweDAwLCAweEQ2LCAweEZGLCAweDdCLCAweEZGLCAweEE3LCAweEZGLCAweDc4LCAweDAxLCAweDcyLAorCTB4MDUsIDB4QjYsIDB4MEEsIDB4MjcsIDB4MEYsIDB4QTUsIDB4MTAsIDB4NkUsIDB4MEUsIDB4QTAsIDB4MDksCisJMHg3QiwgMHgwNCwgMHhFQywgMHgwMCwgMHg4NSwgMHhGRiwgMHg4QiwgMHhGRiwgMHhFNSwgMHhGRiwgMHhGQSwKKwkweEZGLCAweEI2LCAweEZGLCAweDZDLCAweEZGLCAweDBFLCAweDAwLCAweEE0LCAweDAyLCAweDQxLCAweDA3LAorCTB4ODAsIDB4MEMsIDB4MTksIDB4MTAsIDB4NDQsIDB4MTAsIDB4RUIsIDB4MEMsIDB4QjksIDB4MDcsIDB4RkEsCisJMHgwMiwgMHgzMiwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBRSwgMHhGRiwgMHhGNywgMHhGRiwgMHhFQiwgMHhGRiwKKwkweDkzLCAweEZGLCAweDdCLCAweEZGLCAweEI3LCAweDAwLCAweDE1LCAweDA0LCAweDI2LCAweDA5LCAweDE0LAorCTB4MEUsIDB4OTgsIDB4MTAsIDB4NkQsIDB4MEYsIDB4MkMsIDB4MEIsIDB4RTMsIDB4MDUsIDB4QkMsIDB4MDEsCisJMHhCQiwgMHhGRiwgMHg3NSwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMSwKKwkweEZGLCAweDc3LCAweEZGLCAweEI1LCAweEZGLCAweEE2LCAweDAxLCAweEMwLCAweDA1LCAweDA4LCAweDBCLAorCTB4NTgsIDB4MEYsIDB4OUQsIDB4MTAsIDB4MzAsIDB4MEUsIDB4NEIsIDB4MDksIDB4MzQsIDB4MDQsIDB4QzYsCisJMHgwMCwgMHg3RCwgMHhGRiwgMHg5MSwgMHhGRiwgMHhFOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhCMCwgMHhGRiwKKwkweDZDLCAweEZGLCAweDI3LCAweDAwLCAweERGLCAweDAyLCAweDk0LCAweDA3LCAweENBLCAweDBDLCAweDM3LAorCTB4MTAsIDB4MjcsIDB4MTAsIDB4QTEsIDB4MEMsIDB4NjUsIDB4MDcsIDB4QkUsIDB4MDIsIDB4MTksIDB4MDAsCisJMHg2QywgMHhGRiwgMHhCNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhFNywgMHhGRiwgMHg4RSwgMHhGRiwgMHg4MSwKKwkweEZGLCAweERCLCAweDAwLCAweDVCLCAweDA0LCAweDdBLCAweDA5LCAweDUzLCAweDBFLCAweEEyLCAweDEwLAorCTB4M0QsIDB4MEYsIDB4REEsIDB4MEEsIDB4OTUsIDB4MDUsIDB4OEMsIDB4MDEsIDB4QUQsIDB4RkYsIDB4NzksCisJMHhGRiwgMHhENCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDQywgMHhGRiwgMHg3MywgMHhGRiwKKwkweEM0LCAweEZGLCAweEQ3LCAweDAxLCAweDBFLCAweDA2LCAweDU5LCAweDBCLCAweDg3LCAweDBGLCAweDkxLAorCTB4MTAsIDB4RjAsIDB4MEQsIDB4RjcsIDB4MDgsIDB4RUYsIDB4MDMsIDB4QTMsIDB4MDAsIDB4NzgsIDB4RkYsCisJMHg5NywgMHhGRiwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHhBQSwgMHhGRiwgMHg2RCwgMHhGRiwgMHg0MSwKKwkweDAwLCAweDFDLCAweDAzLCAweEU3LCAweDA3LCAweDEzLCAweDBELCAweDUyLCAweDEwLCAweDA2LCAweDEwLAorCTB4NTYsIDB4MEMsIDB4MTMsIDB4MDcsIDB4ODQsIDB4MDIsIDB4MDIsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QkEsCisJMHhGRiwgMHhGQiwgMHhGRiwgMHhFMywgMHhGRiwgMHg4OCwgMHhGRiwgMHg4OSwgMHhGRiwgMHgwMSwgMHgwMSwKKwkweEEzLCAweDA0LCAweENFLCAweDA5LCAweDhGLCAweDBFLCAweEE4LCAweDEwLCAweDBBLCAweDBGLCAweDg4LAorCTB4MEEsIDB4NDgsIDB4MDUsIDB4NUYsIDB4MDEsIDB4QTAsIDB4RkYsIDB4N0QsIDB4RkYsIDB4RDksIDB4RkYsCisJMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNywgMHhGRiwgMHg3MCwgMHhGRiwgMHhENSwgMHhGRiwgMHgwQiwKKwkweDAyLCAweDVFLCAweDA2LCAweEE5LCAweDBCLCAweEIyLCAweDBGLCAweDgyLCAweDEwLCAweEFFLCAweDBELAorCTB4QTIsIDB4MDgsIDB4QUIsIDB4MDMsIDB4ODIsIDB4MDAsIDB4NzMsIDB4RkYsIDB4OUQsIDB4RkYsIDB4RjAsCisJMHhGRiwgMHhGMywgMHhGRiwgMHhBNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHg1RCwgMHgwMCwgMHg1QiwgMHgwMywKKwkweDNCLCAweDA4LCAweDVBLCAweDBELCAweDZBLCAweDEwLCAweEUyLCAweDBGLCAweDA5LCAweDBDLCAweEMxLAorCTB4MDYsIDB4NEMsIDB4MDIsIDB4RUMsIDB4RkYsIDB4NkUsIDB4RkYsIDB4QzAsIDB4RkYsIDB4RkMsIDB4RkYsCisJMHhERiwgMHhGRiwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHgyQSwgMHgwMSwgMHhFQywgMHgwNCwgMHgyMiwKKwkweDBBLCAweEM4LCAweDBFLCAweEFCLCAweDEwLCAweEQ0LCAweDBFLCAweDM1LCAweDBBLCAweEZELCAweDA0LAorCTB4MzMsIDB4MDEsIDB4OTUsIDB4RkYsIDB4ODIsIDB4RkYsIDB4REUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhDMSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFOCwgMHhGRiwgMHg0MCwgMHgwMiwgMHhBRiwgMHgwNiwKKwkweEY3LCAweDBCLCAweERBLCAweDBGLCAweDZGLCAweDEwLCAweDZBLCAweDBELCAweDRFLCAweDA4LCAweDZBLAorCTB4MDMsIDB4NjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RjMsIDB4RkYsIDB4RjEsIDB4RkYsCisJMHg5RSwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3QiwgMHgwMCwgMHg5QywgMHgwMywgMHg5MCwgMHgwOCwgMHg5RiwKKwkweDBELCAweDdFLCAweDEwLCAweEJCLCAweDBGLCAweEJBLCAweDBCLCAweDcwLCAweDA2LCAweDE2LCAweDAyLAorCTB4RDksIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REEsCisJMHhGRiwgMHg3RSwgMHhGRiwgMHg5RCwgMHhGRiwgMHg1NSwgMHgwMSwgMHgzNywgMHgwNSwgMHg3NSwgMHgwQSwKKwkweEZGLCAweDBFLCAweEE5LCAweDEwLCAweDlDLCAweDBFLCAweEUxLCAweDA5LCAweEIzLCAweDA0LCAweDBBLAorCTB4MDEsIDB4OEIsIDB4RkYsIDB4ODcsIDB4RkYsIDB4RTIsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QkIsIDB4RkYsCisJMHg2RCwgMHhGRiwgMHhGRCwgMHhGRiwgMHg3NywgMHgwMiwgMHgwMSwgMHgwNywgMHg0NSwgMHgwQywgMHhGRiwKKwkweDBGLCAweDU4LCAweDEwLCAweDIzLCAweDBELCAweEZBLCAweDA3LCAweDJBLCAweDAzLCAweDQ3LCAweDAwLAorCTB4NkUsIDB4RkYsIDB4QTksIDB4RkYsIDB4RjUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NzcsCisJMHhGRiwgMHg5QywgMHgwMCwgMHhERiwgMHgwMywgMHhFNCwgMHgwOCwgMHhFMiwgMHgwRCwgMHg4RSwgMHgxMCwKKwkweDkxLCAweDBGLCAweDZCLCAweDBCLCAweDIwLCAweDA2LCAweEUzLCAweDAxLCAweEM4LCAweEZGLCAweDczLAorCTB4RkYsIDB4Q0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RkYsIDB4N0EsIDB4RkYsCisJMHhBQSwgMHhGRiwgMHg4MiwgMHgwMSwgMHg4MywgMHgwNSwgMHhDOCwgMHgwQSwgMHgzMiwgMHgwRiwgMHhBNCwKKwkweDEwLCAweDYwLCAweDBFLCAweDhELCAweDA5LCAweDZCLCAweDA0LCAweEUzLCAweDAwLCAweDgzLCAweEZGLAorCTB4OEQsIDB4RkYsIDB4RTYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTQsCisJMHgwMCwgMHhCMSwgMHgwMiwgMHg1MywgMHgwNywgMHg5MSwgMHgwQywgMHgyMCwgMHgxMCwgMHgzRSwgMHgxMCwKKwkweERCLCAweDBDLCAweEE2LCAweDA3LCAweEVDLCAweDAyLCAweDJDLCAweDAwLCAweDZDLCAweEZGLCAweEFGLAorCTB4RkYsIDB4RjgsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTIsIDB4RkYsIDB4N0MsIDB4RkYsIDB4QkUsIDB4MDAsCisJMHgyNCwgMHgwNCwgMHgzOCwgMHgwOSwgMHgyMiwgMHgwRSwgMHg5QiwgMHgxMCwgMHg2MywgMHgwRiwgMHgxQSwKKwkweDBCLCAweEQxLCAweDA1LCAweEIxLCAweDAxLCAweEI4LCAweEZGLCAweDc2LCAweEZGLCAweEQwLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NzYsIDB4RkYsIDB4QjgsIDB4RkYsIDB4QjEsCisJMHgwMSwgMHhEMSwgMHgwNSwgMHgxQSwgMHgwQiwgMHg2MywgMHgwRiwgMHg5QiwgMHgxMCwgMHgyMiwgMHgwRSwKKwkweDM4LCAweDA5LCAweDI0LCAweDA0LCAweEJFLCAweDAwLCAweDdDLCAweEZGLCAweDkyLCAweEZGLCAweEVBLAorCTB4RkYsIDB4RjgsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RUMsIDB4MDIsCisJMHhBNiwgMHgwNywgMHhEQiwgMHgwQywgMHgzRSwgMHgxMCwgMHgyMCwgMHgxMCwgMHg5MSwgMHgwQywgMHg1MywKKwkweDA3LCAweEIxLCAweDAyLCAweDE0LCAweDAwLCAweDZDLCAweEZGLCAweEI1LCAweEZGLCAweEZBLCAweEZGLAorCTB4RTYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4ODMsIDB4RkYsIDB4RTMsIDB4MDAsIDB4NkIsIDB4MDQsIDB4OEQsCisJMHgwOSwgMHg2MCwgMHgwRSwgMHhBNCwgMHgxMCwgMHgzMiwgMHgwRiwgMHhDOCwgMHgwQSwgMHg4MywgMHgwNSwKKwkweDgyLCAweDAxLCAweEFBLCAweEZGLCAweDdBLCAweEZGLCAweEQ1LCAweEZGLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4Q0IsIDB4RkYsIDB4NzMsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MjAsIDB4MDYsCisJMHg2QiwgMHgwQiwgMHg5MSwgMHgwRiwgMHg4RSwgMHgxMCwgMHhFMiwgMHgwRCwgMHhFNCwgMHgwOCwgMHhERiwKKwkweDAzLCAweDlDLCAweDAwLCAweDc3LCAweEZGLCAweDk4LCAweEZGLCAweEVELCAweEZGLCAweEY1LCAweEZGLAorCTB4QTksIDB4RkYsIDB4NkUsIDB4RkYsIDB4NDcsIDB4MDAsIDB4MkEsIDB4MDMsIDB4RkEsIDB4MDcsIDB4MjMsCisJMHgwRCwgMHg1OCwgMHgxMCwgMHhGRiwgMHgwRiwgMHg0NSwgMHgwQywgMHgwMSwgMHgwNywgMHg3NywgMHgwMiwKKwkweEZELCAweEZGLCAweDZELCAweEZGLCAweEJCLCAweEZGLCAweEZCLCAweEZGLCAweEUyLCAweEZGLCAweDg3LAorCTB4RkYsIDB4OEIsIDB4RkYsIDB4MEEsIDB4MDEsIDB4QjMsIDB4MDQsIDB4RTEsIDB4MDksIDB4OUMsIDB4MEUsCisJMHhBOSwgMHgxMCwgMHhGRiwgMHgwRSwgMHg3NSwgMHgwQSwgMHgzNywgMHgwNSwgMHg1NSwgMHgwMSwgMHg5RCwKKwkweEZGLCAweDdFLCAweEZGLCAweERBLCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM1LCAweEZGLAorCTB4NzAsIDB4RkYsIDB4RDksIDB4RkYsIDB4MTYsIDB4MDIsIDB4NzAsIDB4MDYsIDB4QkEsIDB4MEIsIDB4QkIsCisJMHgwRiwgMHg3RSwgMHgxMCwgMHg5RiwgMHgwRCwgMHg5MCwgMHgwOCwgMHg5QywgMHgwMywgMHg3QiwgMHgwMCwKKwkweDcyLCAweEZGLCAweDlFLCAweEZGLCAweEYxLCAweEZGLCAweEYzLCAweEZGLCAweEEzLCAweEZGLCAweDcwLAorCTB4RkYsIDB4NjQsIDB4MDAsIDB4NkEsIDB4MDMsIDB4NEUsIDB4MDgsIDB4NkEsIDB4MEQsIDB4NkYsIDB4MTAsCisJMHhEQSwgMHgwRiwgMHhGNywgMHgwQiwgMHhBRiwgMHgwNiwgMHg0MCwgMHgwMiwgMHhFOCwgMHhGRiwgMHg2RSwKKwkweEZGLCAweEMxLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERFLCAweEZGLCAweDgyLCAweEZGLAorCTB4OTUsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RkQsIDB4MDQsIDB4MzUsIDB4MEEsIDB4RDQsIDB4MEUsIDB4QUIsCisJMHgxMCwgMHhDOCwgMHgwRSwgMHgyMiwgMHgwQSwgMHhFQywgMHgwNCwgMHgyQSwgMHgwMSwgMHg5MywgMHhGRiwKKwkweDgzLCAweEZGLCAweERGLCAweEZGLCAweEZDLCAweEZGLCAweEMwLCAweEZGLCAweDZFLCAweEZGLCAweEVDLAorCTB4RkYsIDB4NEMsIDB4MDIsIDB4QzEsIDB4MDYsIDB4MDksIDB4MEMsIDB4RTIsIDB4MEYsIDB4NkEsIDB4MTAsCisJMHg1QSwgMHgwRCwgMHgzQiwgMHgwOCwgMHg1QiwgMHgwMywgMHg1RCwgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNCwKKwkweEZGLCAweEYzLCAweEZGLCAweEYwLCAweEZGLCAweDlELCAweEZGLCAweDczLCAweEZGLCAweDgyLCAweDAwLAorCTB4QUIsIDB4MDMsIDB4QTIsIDB4MDgsIDB4QUUsIDB4MEQsIDB4ODIsIDB4MTAsIDB4QjIsIDB4MEYsIDB4QTksCisJMHgwQiwgMHg1RSwgMHgwNiwgMHgwQiwgMHgwMiwgMHhENSwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNywgMHhGRiwKKwkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ5LCAweEZGLCAweDdELCAweEZGLCAweEEwLCAweEZGLCAweDVGLAorCTB4MDEsIDB4NDgsIDB4MDUsIDB4ODgsIDB4MEEsIDB4MEEsIDB4MEYsIDB4QTgsIDB4MTAsIDB4OEYsIDB4MEUsCisJMHhDRSwgMHgwOSwgMHhBMywgMHgwNCwgMHgwMSwgMHgwMSwgMHg4OSwgMHhGRiwgMHg4OCwgMHhGRiwgMHhFMywKKwkweEZGLCAweEZCLCAweEZGLCAweEJBLCAweEZGLCAweDZELCAweEZGLCAweDAyLCAweDAwLCAweDg0LCAweDAyLAorCTB4MTMsIDB4MDcsIDB4NTYsIDB4MEMsIDB4MDYsIDB4MTAsIDB4NTIsIDB4MTAsIDB4MTMsIDB4MEQsIDB4RTcsCisJMHgwNywgMHgxQywgMHgwMywgMHg0MSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBQSwgMHhGRiwgMHhGNiwgMHhGRiwKKwkweEVELCAweEZGLCAweDk3LCAweEZGLCAweDc4LCAweEZGLCAweEEzLCAweDAwLCAweEVGLCAweDAzLCAweEY3LAorCTB4MDgsIDB4RjAsIDB4MEQsIDB4OTEsIDB4MTAsIDB4ODcsIDB4MEYsIDB4NTksIDB4MEIsIDB4MEUsIDB4MDYsCisJMHhENywgMHgwMSwgMHhDNCwgMHhGRiwgMHg3MywgMHhGRiwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEQ0LCAweEZGLCAweDc5LCAweEZGLCAweEFELCAweEZGLCAweDhDLCAweDAxLCAweDk1LCAweDA1LAorCTB4REEsIDB4MEEsIDB4M0QsIDB4MEYsIDB4QTIsIDB4MTAsIDB4NTMsIDB4MEUsIDB4N0EsIDB4MDksIDB4NUIsCisJMHgwNCwgMHhEQiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg4RSwgMHhGRiwgMHhFNywgMHhGRiwgMHhGOSwgMHhGRiwKKwkweEI0LCAweEZGLCAweDZDLCAweEZGLCAweDE5LCAweDAwLCAweEJFLCAweDAyLCAweDY1LCAweDA3LCAweEExLAorCTB4MEMsIDB4MjcsIDB4MTAsIDB4MzcsIDB4MTAsIDB4Q0EsIDB4MEMsIDB4OTQsIDB4MDcsIDB4REYsIDB4MDIsCisJMHgyNywgMHgwMCwgMHg2QywgMHhGRiwgMHhCMCwgMHhGRiwgMHhGOCwgMHhGRiwgMHhFOSwgMHhGRiwgMHg5MSwKKwkweEZGLCAweDdELCAweEZGLCAweEM2LCAweDAwLCAweDM0LCAweDA0LCAweDRCLCAweDA5LCAweDMwLCAweDBFLAorCTB4OUQsIDB4MTAsIDB4NTgsIDB4MEYsIDB4MDgsIDB4MEIsIDB4QzAsIDB4MDUsIDB4QTYsIDB4MDEsIDB4QjUsCisJMHhGRiwgMHg3NywgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwKKwkweDc1LCAweEZGLCAweEJCLCAweEZGLCAweEJDLCAweDAxLCAweEUzLCAweDA1LCAweDJDLCAweDBCLCAweDZELAorCTB4MEYsIDB4OTgsIDB4MTAsIDB4MTQsIDB4MEUsIDB4MjYsIDB4MDksIDB4MTUsIDB4MDQsIDB4QjcsIDB4MDAsCisJMHg3QiwgMHhGRiwgMHg5MywgMHhGRiwgMHhFQiwgMHhGRiwgMHhGNywgMHhGRiwgMHhBRSwgMHhGRiwgMHg2RCwKKwkweEZGLCAweDMyLCAweDAwLCAweEZBLCAweDAyLCAweEI5LCAweDA3LCAweEVCLCAweDBDLCAweDQ0LCAweDEwLAorCTB4MTksIDB4MTAsIDB4ODAsIDB4MEMsIDB4NDEsIDB4MDcsIDB4QTQsIDB4MDIsIDB4MEUsIDB4MDAsIDB4NkMsCisJMHhGRiwgMHhCNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNSwgMHhGRiwgMHg4QiwgMHhGRiwgMHg4NSwgMHhGRiwKKwkweEVDLCAweDAwLCAweDdCLCAweDA0LCAweEEwLCAweDA5LCAweDZFLCAweDBFLCAweEE1LCAweDEwLCAweDI3LAorCTB4MEYsIDB4QjYsIDB4MEEsIDB4NzIsIDB4MDUsIDB4NzgsIDB4MDEsIDB4QTcsIDB4RkYsIDB4N0IsIDB4RkYsCisJMHhENiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDQSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQiwKKwkweEZGLCAweEVFLCAweDAxLCAweDMyLCAweDA2LCAweDdDLCAweDBCLCAweDlBLCAweDBGLCAweDhCLCAweDEwLAorCTB4RDMsIDB4MEQsIDB4RDEsIDB4MDgsIDB4RDAsIDB4MDMsIDB4OTQsIDB4MDAsIDB4NzYsIDB4RkYsIDB4OTksCisJMHhGRiwgMHhFRSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBNywgMHhGRiwgMHg2RSwgMHhGRiwgMHg0RCwgMHgwMCwKKwkweDM4LCAweDAzLCAweDBELCAweDA4LCAweDMzLCAweDBELCAweDVELCAweDEwLCAweEY3LCAweDBGLCAweDM0LAorCTB4MEMsIDB4RUUsIDB4MDYsIDB4NkIsIDB4MDIsIDB4RjgsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkMsIDB4RkYsCisJMHhGQywgMHhGRiwgMHhFMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4RCwgMHhGRiwgMHgxMywgMHgwMSwgMHhDMywKKwkweDA0LCAweEY0LCAweDA5LCAweEE4LCAweDBFLCAweEFBLCAweDEwLCAweEYzLCAweDBFLCAweDYzLCAweDBBLAorCTB4MjYsIDB4MDUsIDB4NEIsIDB4MDEsIDB4OUIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4REIsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhDNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhERCwgMHhGRiwgMHgyMiwgMHgwMiwKKwkweDgyLCAweDA2LCAweENDLCAweDBCLCAweEM0LCAweDBGLCAweDdBLCAweDEwLCAweDkwLCAweDBELCAweDdELAorCTB4MDgsIDB4OEUsIDB4MDMsIDB4NzQsIDB4MDAsIDB4NzIsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RjEsIDB4RkYsCisJMHhGMiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg3MCwgMHhGRiwgMHg2QSwgMHgwMCwgMHg3OCwgMHgwMywgMHg2MSwKKwkweDA4LCAweDc5LCAweDBELCAweDczLCAweDEwLCAweEQxLCAweDBGLCAweEU2LCAweDBCLCAweDlELCAweDA2LAorCTB4MzQsIDB4MDIsIDB4RTQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzIsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhERCwgMHhGRiwgMHg4MSwgMHhGRiwgMHg5NywgMHhGRiwgMHgzRCwgMHgwMSwgMHgwRCwgMHgwNSwKKwkweDQ3LCAweDBBLCAweEUxLCAweDBFLCAweEFBLCAweDEwLCAweEJCLCAweDBFLCAweDEwLCAweDBBLCAweERDLAorCTB4MDQsIDB4MjEsIDB4MDEsIDB4OTAsIDB4RkYsIDB4ODQsIDB4RkYsIDB4RTAsIDB4RkYsIDB4RkMsIDB4RkYsCisJMHhCRSwgMHhGRiwgMHg2RCwgMHhGRiwgMHhGMSwgMHhGRiwgMHg1OCwgMHgwMiwgMHhEMywgMHgwNiwgMHgxQSwKKwkweDBDLCAweEVCLCAweDBGLCAweDY1LCAweDEwLCAweDRCLCAweDBELCAweDI5LCAweDA4LCAweDRELCAweDAzLAorCTB4NTcsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTUsIDB4RkYsIDB4RjQsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUIsCisJMHhGRiwgMHg3NCwgMHhGRiwgMHg4QSwgMHgwMCwgMHhCQSwgMHgwMywgMHhCNSwgMHgwOCwgMHhCRCwgMHgwRCwKKwkweDg2LCAweDEwLCAweEE5LCAweDBGLCAweDk3LCAweDBCLCAweDRDLCAweDA2LCAweEZGLCAweDAxLCAweEQxLAorCTB4RkYsIDB4NzEsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RkYsCisJMHg3QywgMHhGRiwgMHhBMywgMHhGRiwgMHg2OSwgMHgwMSwgMHg1OSwgMHgwNSwgMHg5QSwgMHgwQSwgMHgxNiwKKwkweDBGLCAweEE3LCAweDEwLCAweDgyLCAweDBFLCAweEJDLCAweDA5LCAweDkzLCAweDA0LCAweEY5LCAweDAwLAorCTB4ODcsIDB4RkYsIDB4ODksIDB4RkYsIDB4RTQsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QjgsIDB4RkYsIDB4NkMsCisJMHhGRiwgMHgwNywgMHgwMCwgMHg5MSwgMHgwMiwgMHgyNSwgMHgwNywgMHg2NywgMHgwQywgMHgwRSwgMHgxMCwKKwkweDRELCAweDEwLCAweDAzLCAweDBELCAweEQ1LCAweDA3LCAweDBFLCAweDAzLCAweDNCLCAweDAwLCAweDZELAorCTB4RkYsIDB4QUMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUMsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NzksIDB4RkYsCisJMHhBQiwgMHgwMCwgMHhGRSwgMHgwMywgMHgwQSwgMHgwOSwgMHhGRiwgMHgwRCwgMHg5NCwgMHgxMCwgMHg3RCwKKwkweDBGLCAweDQ3LCAweDBCLCAweEZELCAweDA1LCAweENDLCAweDAxLCAweEMwLCAweEZGLCAweDc0LCAweEZGLAorCTB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QjAsCisJMHhGRiwgMHg5NywgMHgwMSwgMHhBNiwgMHgwNSwgMHhFQywgMHgwQSwgMHg0OCwgMHgwRiwgMHhBMCwgMHgxMCwKKwkweDQ1LCAweDBFLCAweDY3LCAweDA5LCAweDRCLCAweDA0LCAweEQzLCAweDAwLCAweDgwLCAweEZGLCAweDhGLAorCTB4RkYsIDB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjIsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHhDQiwgMHgwMiwgMHg3OCwgMHgwNywgMHhCMiwgMHgwQywgMHgyRSwgMHgxMCwgMHgzMSwgMHgxMCwgMHhCQSwKKwkweDBDLCAweDgxLCAweDA3LCAweEQyLCAweDAyLCAweDIxLCAweDAwLCAweDZDLCAweEZGLCAweEIyLCAweEZGLAorCTB4RjksIDB4RkYsIDB4RTgsIDB4RkYsIDB4OTAsIDB4RkYsIDB4N0YsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4NDMsCisJMHgwNCwgMHg1RSwgMHgwOSwgMHgzRSwgMHgwRSwgMHg5RiwgMHgxMCwgMHg0RSwgMHgwRiwgMHhGNiwgMHgwQSwKKwkweEFFLCAweDA1LCAweDlDLCAweDAxLCAweEIxLCAweEZGLCAweDc4LCAweEZGLCAweEQyLCAweEZGLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QkYsIDB4RkYsIDB4QzcsIDB4MDEsCisJMHhGNCwgMHgwNSwgMHgzRSwgMHgwQiwgMHg3OCwgMHgwRiwgMHg5NiwgMHgxMCwgMHgwNiwgMHgwRSwgMHgxMywKKwkweDA5LCAweDA1LCAweDA0LCAweEFGLCAweDAwLCAweDc5LCAweEZGLCAweDk1LCAweEZGLCAweEVDLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4QUMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MDcsIDB4MDMsIDB4Q0IsCisJMHgwNywgMHhGQiwgMHgwQywgMHg0QSwgMHgxMCwgMHgxMSwgMHgxMCwgMHg2RiwgMHgwQywgMHgyRSwgMHgwNywKKwkweDk3LCAweDAyLCAweDA5LCAweDAwLCAweDZDLCAweEZGLCAweEI4LCAweEZGLCAweEZBLCAweEZGLCAweEU0LAorCTB4RkYsIDB4OEEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4RjQsIDB4MDAsIDB4OEIsIDB4MDQsIDB4QjIsIDB4MDksCisJMHg3QiwgMHgwRSwgMHhBNywgMHgxMCwgMHgxQywgMHgwRiwgMHhBMywgMHgwQSwgMHg2MSwgMHgwNSwgMHg2RSwKKwkweDAxLCAweEE0LCAweEZGLCAweDdDLCAweEZGLCAweEQ4LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAorCTB4QzgsIDB4RkYsIDB4NzEsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RjksIDB4MDEsIDB4NDMsIDB4MDYsIDB4OEUsCisJMHgwQiwgMHhBNCwgMHgwRiwgMHg4OCwgMHgxMCwgMHhDNCwgMHgwRCwgMHhCRSwgMHgwOCwgMHhDMSwgMHgwMywKKwkweDhELCAweDAwLCAweDc1LCAweEZGLCAweDlCLCAweEZGLCAweEVGLCAweEZGLCAweEY0LCAweEZGLCAweEE2LAorCTB4RkYsIDB4NkUsIDB4RkYsIDB4NTMsIDB4MDAsIDB4NDYsIDB4MDMsIDB4MUYsIDB4MDgsIDB4NDMsIDB4MEQsCisJMHg2MywgMHgxMCwgMHhFRiwgMHgwRiwgMHgyMywgMHgwQywgMHhEQywgMHgwNiwgMHg1RSwgMHgwMiwgMHhGMywKKwkweEZGLCAweDZELCAweEZGLCAweEJFLCAweEZGLCAweEZDLCAweEZGLCAweEUwLCAweEZGLCAweDg1LCAweEZGLAorCTB4OEYsIDB4RkYsIDB4MUMsIDB4MDEsIDB4RDMsIDB4MDQsIDB4MDYsIDB4MEEsIDB4QjUsIDB4MEUsIDB4QUEsCisJMHgxMCwgMHhFNywgMHgwRSwgMHg1MCwgMHgwQSwgMHgxNiwgMHgwNSwgMHg0MiwgMHgwMSwgMHg5OCwgMHhGRiwKKwkweDgwLCAweEZGLCAweERDLCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMzLCAweEZGLCAweDZGLAorCTB4RkYsIDB4RTEsIDB4RkYsIDB4MkUsIDB4MDIsIDB4OTQsIDB4MDYsIDB4REQsIDB4MEIsIDB4Q0QsIDB4MEYsCisJMHg3NiwgMHgxMCwgMHg4MSwgMHgwRCwgMHg2QSwgMHgwOCwgMHg3RiwgMHgwMywgMHg2RSwgMHgwMCwgMHg3MSwKKwkweEZGLCAweEExLCAweEZGLCAweEYyLCAweEZGLCAweDAwLCAweDAwLCAweDE1LCAweDAwLCAweEQxLCAweEZGLAorCTB4OEIsIDB4RkUsIDB4QkMsIDB4RkQsIDB4RTEsIDB4MDAsIDB4ODQsIDB4MDksIDB4QjAsIDB4MTMsIDB4NDcsCisJMHgxOCwgMHhCMCwgMHgxMywgMHg4NCwgMHgwOSwgMHhFMSwgMHgwMCwgMHhCQywgMHhGRCwgMHg4QiwgMHhGRSwKKwkweEQxLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweERBLCAweDAwLCAweDMwLAorCTB4MDAsIDB4NUQsIDB4RkMsIDB4QjMsIDB4RkMsIDB4MzUsIDB4MEEsIDB4QzIsIDB4MUMsIDB4MjQsIDB4MjAsCisJMHg0OCwgMHgxMCwgMHg1RCwgMHhGRiwgMHg3NCwgMHhGQiwgMHgzQSwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MiwKKwkweDAwLCAweEY4LCAweEZGLCAweEZBLCAweEZGLCAweDJDLCAweDAwLCAweEYzLCAweDAwLCAweEFELCAweEZGLAorCTB4QzUsIDB4RkIsIDB4MTEsIDB4RkUsIDB4QUYsIDB4MEQsIDB4RUYsIDB4MUUsIDB4NjgsIDB4MUUsIDB4QkMsCisJMHgwQywgMHhBNywgMHhGRCwgMHhFQSwgMHhGQiwgMHhEMywgMHhGRiwgMHhFRSwgMHgwMCwgMHgyNCwgMHgwMCwKKwkweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRDLCAweDAwLCAweEZCLCAweDAwLCAweDBDLCAweEZGLCAweDVGLAorCTB4RkIsIDB4RTgsIDB4RkYsIDB4M0QsIDB4MTEsIDB4N0UsIDB4MjAsIDB4MTMsIDB4MUMsIDB4NEMsIDB4MDksCisJMHg2QSwgMHhGQywgMHg4QywgMHhGQywgMHg0RSwgMHgwMCwgMHhEMSwgMHgwMCwgMHgwRSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEY3LCAweEZGLCAweDcyLCAweDAwLCAweEVDLCAweDAwLCAweDU1LCAweEZFLCAweDNELCAweEZCLAorCTB4MzcsIDB4MDIsIDB4QkUsIDB4MTQsIDB4NUQsIDB4MjEsIDB4NDAsIDB4MTksIDB4MTgsIDB4MDYsIDB4QTIsCisJMHhGQiwgMHg0NywgMHhGRCwgMHhBNywgMHgwMCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZDLCAweEZGLCAweDlCLCAweDAwLCAweEMwLCAweDAwLCAweDkyLCAweEZELCAweDczLAorCTB4RkIsIDB4RjIsIDB4MDQsIDB4MEUsIDB4MTgsIDB4ODEsIDB4MjEsIDB4MEMsIDB4MTYsIDB4MzcsIDB4MDMsCisJMHg0NywgMHhGQiwgMHgwQiwgMHhGRSwgMHhERiwgMHgwMCwgMHg4MiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDA4LCAweDAwLCAweEMzLCAweDAwLCAweDc0LCAweDAwLCAweEQyLCAweEZDLCAweDEwLCAweEZDLAorCTB4MDgsIDB4MDgsIDB4MEEsIDB4MUIsIDB4RTksIDB4MjAsIDB4OUEsIDB4MTIsIDB4QkUsIDB4MDAsIDB4NDksCisJMHhGQiwgMHhDOCwgMHhGRSwgMHhGOSwgMHgwMCwgMHg1QSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwKKwkweDFCLCAweDAwLCAweEU0LCAweDAwLCAweDA2LCAweDAwLCAweDI0LCAweEZDLCAweDFFLCAweEZELCAweDY1LAorCTB4MEIsIDB4OTQsIDB4MUQsIDB4OUQsIDB4MUYsIDB4MEQsIDB4MEYsIDB4QjgsIDB4RkUsIDB4OTYsIDB4RkIsCisJMHg3MiwgMHhGRiwgMHhGOSwgMHgwMCwgMHgzNywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEY4LCAweDAwLCAweDc4LCAweEZGLCAweDlCLCAweEZCLCAweEE2LCAweEZFLCAweEU5LCAweDBFLAorCTB4OEQsIDB4MUYsIDB4QUEsIDB4MUQsIDB4ODcsIDB4MEIsIDB4MkIsIDB4RkQsIDB4MUUsIDB4RkMsIDB4MDIsCisJMHgwMCwgMHhFNSwgMHgwMCwgMHgxQywgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1OCwgMHgwMCwKKwkweEY5LCAweDAwLCAweENGLCAweEZFLCAweDRBLCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDEyLCAweEUwLAorCTB4MjAsIDB4MjYsIDB4MUIsIDB4MjgsIDB4MDgsIDB4MTgsIDB4RkMsIDB4Q0IsIDB4RkMsIDB4NzEsIDB4MDAsCisJMHhDNSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg4MCwgMHgwMCwgMHhFMSwKKwkweDAwLCAweDEzLCAweEZFLCAweDQ1LCAweEZCLCAweDFELCAweDAzLCAweEVCLCAweDE1LCAweDdGLCAweDIxLAorCTB4MkQsIDB4MTgsIDB4MEUsIDB4MDUsIDB4NzcsIDB4RkIsIDB4OEIsIDB4RkQsIDB4QkUsIDB4MDAsIDB4OUQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhBOSwgMHgwMCwKKwkweEFBLCAweDAwLCAweDRGLCAweEZELCAweDlELCAweEZCLCAweEZBLCAweDA1LCAweDIyLCAweDE5LCAweDYyLAorCTB4MjEsIDB4RTAsIDB4MTQsIDB4NTAsIDB4MDIsIDB4M0UsIDB4RkIsIDB4NEUsIDB4RkUsIDB4RUIsIDB4MDAsCisJMHg3MywgMHgwMCwgMHhGNywgMHhGRiwgMHhGRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhEMCwgMHgwMCwgMHg1MiwKKwkweDAwLCAweDkzLCAweEZDLCAweDYwLCAweEZDLCAweDJDLCAweDA5LCAweEZBLCAweDFCLCAweDhBLCAweDIwLAorCTB4NjAsIDB4MTEsIDB4RkQsIDB4RkYsIDB4NUMsIDB4RkIsIDB4MDYsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NEQsCisJMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyMywgMHgwMCwgMHhFRCwgMHgwMCwgMHhEOSwgMHhGRiwKKwkweEVGLCAweEZCLCAweDk4LCAweEZELCAweDk5LCAweDBDLCAweDU0LCAweDFFLCAweDAyLCAweDFGLCAweEQyLAorCTB4MEQsIDB4MjAsIDB4RkUsIDB4QzAsIDB4RkIsIDB4QTcsIDB4RkYsIDB4RjQsIDB4MDAsIDB4MkQsIDB4MDAsCisJMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0MSwgMHhGRiwgMHg3OCwKKwkweEZCLCAweDRBLCAweEZGLCAweDI1LCAweDEwLCAweDE2LCAweDIwLCAweERBLCAweDFDLCAweDU2LCAweDBBLAorCTB4QkUsIDB4RkMsIDB4NTYsIDB4RkMsIDB4MkMsIDB4MDAsIDB4REIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhGNywgMHhGRiwgMHg2NiwgMHgwMCwgMHhGNCwgMHgwMCwgMHg4RiwgMHhGRSwgMHgzRiwgMHhGQiwKKwkweDc1LCAweDAxLCAweEFFLCAweDEzLCAweDJDLCAweDIxLCAweDJBLCAweDFBLCAweDBELCAweDA3LCAweEQ0LAorCTB4RkIsIDB4MEMsIDB4RkQsIDB4OEYsIDB4MDAsIDB4QjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhGRiwgMHg4RSwgMHgwMCwgMHhEMSwgMHgwMCwgMHhDRiwgMHhGRCwgMHg1OCwKKwkweEZCLCAweDEwLCAweDA0LCAweDEwLCAweDE3LCAweDhBLCAweDIxLCAweDEwLCAweDE3LCAweDEwLCAweDA0LAorCTB4NTgsIDB4RkIsIDB4Q0YsIDB4RkQsIDB4RDEsIDB4MDAsIDB4OEUsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgwMywgMHgwMCwgMHhCNywgMHgwMCwgMHg4RiwgMHgwMCwgMHgwQywgMHhGRCwgMHhENCwgMHhGQiwKKwkweDBELCAweDA3LCAweDJBLCAweDFBLCAweDJDLCAweDIxLCAweEFFLCAweDEzLCAweDc1LCAweDAxLCAweDNGLAorCTB4RkIsIDB4OEYsIDB4RkUsIDB4RjQsIDB4MDAsIDB4NjYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgxNCwgMHgwMCwgMHhEQiwgMHgwMCwgMHgyQywgMHgwMCwgMHg1NiwgMHhGQywgMHhCRSwgMHhGQywgMHg1NiwKKwkweDBBLCAweERBLCAweDFDLCAweDE2LCAweDIwLCAweDI1LCAweDEwLCAweDRBLCAweEZGLCAweDc4LCAweEZCLAorCTB4NDEsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDEsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkQsCisJMHgwMCwgMHhGNCwgMHgwMCwgMHhBNywgMHhGRiwgMHhDMCwgMHhGQiwgMHgyMCwgMHhGRSwgMHhEMiwgMHgwRCwKKwkweDAyLCAweDFGLCAweDU0LCAweDFFLCAweDk5LCAweDBDLCAweDk4LCAweEZELCAweEVGLCAweEZCLCAweEQ5LAorCTB4RkYsIDB4RUQsIDB4MDAsIDB4MjMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEQsIDB4MDAsCisJMHhGQiwgMHgwMCwgMHgwNiwgMHhGRiwgMHg1QywgMHhGQiwgMHhGRCwgMHhGRiwgMHg2MCwgMHgxMSwgMHg4QSwKKwkweDIwLCAweEZBLCAweDFCLCAweDJDLCAweDA5LCAweDYwLCAweEZDLCAweDkzLCAweEZDLCAweDUyLCAweDAwLAorCTB4RDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NzMsIDB4MDAsIDB4RUIsCisJMHgwMCwgMHg0RSwgMHhGRSwgMHgzRSwgMHhGQiwgMHg1MCwgMHgwMiwgMHhFMCwgMHgxNCwgMHg2MiwgMHgyMSwKKwkweDIyLCAweDE5LCAweEZBLCAweDA1LCAweDlELCAweEZCLCAweDRGLCAweEZELCAweEFBLCAweDAwLCAweEE5LAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4OUQsIDB4MDAsCisJMHhCRSwgMHgwMCwgMHg4QiwgMHhGRCwgMHg3NywgMHhGQiwgMHgwRSwgMHgwNSwgMHgyRCwgMHgxOCwgMHg3RiwKKwkweDIxLCAweEVCLCAweDE1LCAweDFELCAweDAzLCAweDQ1LCAweEZCLCAweDEzLCAweEZFLCAweEUxLCAweDAwLAorCTB4ODAsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDgsIDB4MDAsIDB4QzUsIDB4MDAsIDB4NzEsCisJMHgwMCwgMHhDQiwgMHhGQywgMHgxOCwgMHhGQywgMHgyOCwgMHgwOCwgMHgyNiwgMHgxQiwgMHhFMCwgMHgyMCwKKwkweDc3LCAweDEyLCAweEE3LCAweDAwLCAweDRBLCAweEZCLCAweENGLCAweEZFLCAweEY5LCAweDAwLCAweDU4LAorCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RTUsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgxRSwgMHhGQywgMHgyQiwgMHhGRCwgMHg4NywgMHgwQiwgMHhBQSwgMHgxRCwgMHg4RCwgMHgxRiwgMHhFOSwKKwkweDBFLCAweEE2LCAweEZFLCAweDlCLCAweEZCLCAweDc4LCAweEZGLCAweEY4LCAweDAwLCAweDM2LCAweDAwLAorCTB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjksIDB4MDAsIDB4NzIsIDB4RkYsIDB4OTYsCisJMHhGQiwgMHhCOCwgMHhGRSwgMHgwRCwgMHgwRiwgMHg5RCwgMHgxRiwgMHg5NCwgMHgxRCwgMHg2NSwgMHgwQiwKKwkweDFFLCAweEZELCAweDI0LCAweEZDLCAweDA2LCAweDAwLCAweEU0LCAweDAwLCAweDFCLCAweDAwLCAweEZDLAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4NUEsIDB4MDAsIDB4RjksIDB4MDAsIDB4QzgsIDB4RkUsIDB4NDksIDB4RkIsCisJMHhCRSwgMHgwMCwgMHg5QSwgMHgxMiwgMHhFOSwgMHgyMCwgMHgwQSwgMHgxQiwgMHgwOCwgMHgwOCwgMHgxMCwKKwkweEZDLCAweEQyLCAweEZDLCAweDc0LCAweDAwLCAweEMzLCAweDAwLCAweDA4LCAweDAwLCAweEZFLCAweEZGLAorCTB4RjksIDB4RkYsIDB4ODIsIDB4MDAsIDB4REYsIDB4MDAsIDB4MEIsIDB4RkUsIDB4NDcsIDB4RkIsIDB4MzcsCisJMHgwMywgMHgwQywgMHgxNiwgMHg4MSwgMHgyMSwgMHgwRSwgMHgxOCwgMHhGMiwgMHgwNCwgMHg3MywgMHhGQiwKKwkweDkyLCAweEZELCAweEMwLCAweDAwLCAweDlCLCAweDAwLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NDcsIDB4RkQsIDB4QTIsIDB4RkIsCisJMHgxOCwgMHgwNiwgMHg0MCwgMHgxOSwgMHg1RCwgMHgyMSwgMHhCRSwgMHgxNCwgMHgzNywgMHgwMiwgMHgzRCwKKwkweEZCLCAweDU1LCAweEZFLCAweEVDLCAweDAwLCAweDcyLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLAorCTB4MEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4OEMsIDB4RkMsIDB4NkEsIDB4RkMsIDB4NEMsCisJMHgwOSwgMHgxMywgMHgxQywgMHg3RSwgMHgyMCwgMHgzRCwgMHgxMSwgMHhFOCwgMHhGRiwgMHg1RiwgMHhGQiwKKwkweDBDLCAweEZGLCAweEZCLCAweDAwLCAweDRDLCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI0LAorCTB4MDAsIDB4RUUsIDB4MDAsIDB4RDMsIDB4RkYsIDB4RUEsIDB4RkIsIDB4QTcsIDB4RkQsIDB4QkMsIDB4MEMsCisJMHg2OCwgMHgxRSwgMHhFRiwgMHgxRSwgMHhBRiwgMHgwRCwgMHgxMSwgMHhGRSwgMHhDNSwgMHhGQiwgMHhBRCwKKwkweEZGLCAweEYzLCAweDAwLCAweDJDLCAweDAwLCAweEZBLCAweEZGLCAweEY4LCAweEZGLCAweDQyLCAweDAwLAorCTB4RkIsIDB4MDAsIDB4M0EsIDB4RkYsIDB4NzQsIDB4RkIsIDB4NUQsIDB4RkYsIDB4NDgsIDB4MTAsIDB4MjQsCisJMHgyMCwgMHhDMiwgMHgxQywgMHgzNSwgMHgwQSwgMHhCMywgMHhGQywgMHg1RCwgMHhGQywgMHgzMCwgMHgwMCwKKwkweERBLCAweDAwLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDY3LCAweDAwLCAweEYzLAorCTB4MDAsIDB4ODgsIDB4RkUsIDB4M0UsIDB4RkIsIDB4OEMsIDB4MDEsIDB4RDAsIDB4MTMsIDB4MzMsIDB4MjEsCisJMHgwRCwgMHgxQSwgMHhFRSwgMHgwNiwgMHhDRCwgMHhGQiwgMHgxMywgMHhGRCwgMHg5MiwgMHgwMCwgMHhCNiwKKwkweDAwLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZBLCAweEZGLCAweDkwLCAweDAwLAorCTB4Q0YsIDB4MDAsIDB4QzcsIDB4RkQsIDB4NUIsIDB4RkIsIDB4MkIsIDB4MDQsIDB4MzEsIDB4MTcsIDB4OEEsCisJMHgyMSwgMHhGMCwgMHgxNiwgMHhGNCwgMHgwMywgMHg1NiwgMHhGQiwgMHhENiwgMHhGRCwgMHhEMywgMHgwMCwKKwkweDhELCAweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEI5LCAweDAwLCAweDhDLAorCTB4MDAsIDB4MDUsIDB4RkQsIDB4REIsIDB4RkIsIDB4MkMsIDB4MDcsIDB4NDcsIDB4MUEsIDB4MjUsIDB4MjEsCisJMHg4QiwgMHgxMywgMHg1RCwgMHgwMSwgMHg0MCwgMHhGQiwgMHg5NywgMHhGRSwgMHhGNSwgMHgwMCwgMHg2NCwKKwkweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE1LCAweDAwLCAweERDLCAweDAwLCAweDI3LCAweDAwLAorCTB4NTAsIDB4RkMsIDB4Q0EsIDB4RkMsIDB4NzgsIDB4MEEsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MjAsIDB4MDIsCisJMHgxMCwgMHgzNywgMHhGRiwgMHg3QiwgMHhGQiwgMHg0NywgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MCwgMHgwMCwKKwkweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJFLCAweDAwLCAweEY1LCAweDAwLCAweEEyLCAweEZGLCAweEJCLAorCTB4RkIsIDB4MzEsIDB4RkUsIDB4RjUsIDB4MEQsIDB4MTQsIDB4MUYsIDB4M0YsIDB4MUUsIDB4NzcsIDB4MEMsCisJMHg4QSwgMHhGRCwgMHhGNSwgMHhGQiwgMHhERSwgMHhGRiwgMHhFQywgMHgwMCwgMHgyMiwgMHgwMCwgMHhGQiwKKwkweEZGLCAweEY3LCAweEZGLCAweDRFLCAweDAwLCAweEZCLCAweDAwLCAweEZGLCAweEZFLCAweDU5LCAweEZCLAorCTB4MTEsIDB4MDAsIDB4ODMsIDB4MTEsIDB4OTYsIDB4MjAsIDB4RTAsIDB4MUIsIDB4MEIsIDB4MDksIDB4NTYsCisJMHhGQywgMHg5OSwgMHhGQywgMHg1NiwgMHgwMCwgMHhDRSwgMHgwMCwgMHgwRCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEY4LCAweEZGLCAweDc1LCAweDAwLCAweEVBLCAweDAwLCAweDQ3LCAweEZFLCAweDNFLCAweEZCLCAweDY5LAorCTB4MDIsIDB4MDIsIDB4MTUsIDB4NjYsIDB4MjEsIDB4MDQsIDB4MTksIDB4REMsIDB4MDUsIDB4OTgsIDB4RkIsCisJMHg1NiwgMHhGRCwgMHhBRCwgMHgwMCwgMHhBOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweDlFLCAweDAwLCAweEJDLCAweDAwLCAweDgzLCAweEZELCAweDdCLCAweEZCLAorCTB4MkIsIDB4MDUsIDB4NEMsIDB4MTgsIDB4N0MsIDB4MjEsIDB4Q0EsIDB4MTUsIDB4MDMsIDB4MDMsIDB4NDQsCisJMHhGQiwgMHgxQSwgMHhGRSwgMHhFMiwgMHgwMCwgMHg3RSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDA5LCAweDAwLCAweEM2LCAweDAwLCAweDZELCAweDAwLCAweEMzLCAweEZDLCAweDIwLCAweEZDLCAweDQ5LAorCTB4MDgsIDB4NDEsIDB4MUIsIDB4RDYsIDB4MjAsIDB4NTQsIDB4MTIsIDB4OTIsIDB4MDAsIDB4NEMsIDB4RkIsCisJMHhENiwgMHhGRSwgMHhGQSwgMHgwMCwgMHg1NywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRCwKKwkweDAwLCAweEU2LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweEZDLCAweDM4LCAweEZELCAweEE5LCAweDBCLAorCTB4QzAsIDB4MUQsIDB4N0MsIDB4MUYsIDB4QzYsIDB4MEUsIDB4OTUsIDB4RkUsIDB4OUYsIDB4RkIsIDB4N0UsCisJMHhGRiwgMHhGOCwgMHgwMCwgMHgzNSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzOCwgMHgwMCwKKwkweEY5LCAweDAwLCAweDZDLCAweEZGLCAweDkyLCAweEZCLCAweEM5LCAweEZFLCAweDJGLCAweDBGLCAweEFELAorCTB4MUYsIDB4N0QsIDB4MUQsIDB4NDIsIDB4MEIsIDB4MTIsIDB4RkQsIDB4MkEsIDB4RkMsIDB4MEIsIDB4MDAsCisJMHhFMywgMHgwMCwgMHgxQSwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg1QiwgMHgwMCwgMHhGOCwKKwkweDAwLCAweEMxLCAweEZFLCAweDQ3LCAweEZCLCAweEQ0LCAweDAwLCAweEJDLCAweDEyLCAweEYzLCAweDIwLAorCTB4RUYsIDB4MUEsIDB4RTksIDB4MDcsIDB4MDgsIDB4RkMsIDB4RDksIDB4RkMsIDB4NzgsIDB4MDAsIDB4QzIsCisJMHgwMCwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHg4MywgMHgwMCwgMHhERCwgMHgwMCwKKwkweDA0LCAweEZFLCAweDQ5LCAweEZCLCAweDUyLCAweDAzLCAweDJELCAweDE2LCAweDgzLCAweDIxLCAweEVGLAorCTB4MTcsIDB4RDUsIDB4MDQsIDB4NkYsIDB4RkIsIDB4OUEsIDB4RkQsIDB4QzMsIDB4MDAsIDB4OUEsIDB4MDAsCisJMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhBRCwgMHgwMCwgMHhBNCwKKwkweDAwLCAweDQwLCAweEZELCAweEE4LCAweEZCLCAweDM2LCAweDA2LCAweDVFLCAweDE5LCAweDU4LCAweDIxLAorCTB4OUMsIDB4MTQsIDB4MUUsIDB4MDIsIDB4M0QsIDB4RkIsIDB4NUQsIDB4RkUsIDB4RUQsIDB4MDAsIDB4NzAsCisJMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhEMiwgMHgwMCwgMHg0QSwgMHgwMCwKKwkweDg1LCAweEZDLCAweDc0LCAweEZDLCAweDZELCAweDA5LCAweDJELCAweDFDLCAweDcyLCAweDIwLCAweDFBLAorCTB4MTEsIDB4RDQsIDB4RkYsIDB4NjEsIDB4RkIsIDB4MTMsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NEEsIDB4MDAsCisJMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhFRiwgMHgwMCwgMHhDRSwgMHhGRiwgMHhFNCwKKwkweEZCLCAweEI1LCAweEZELCAweERFLCAweDBDLCAweDdDLCAweDFFLCAweERELCAweDFFLCAweDhDLCAweDBELAorCTB4MDEsIDB4RkUsIDB4Q0EsIDB4RkIsIDB4QjMsIDB4RkYsIDB4RjMsIDB4MDAsIDB4MkIsIDB4MDAsIDB4RkEsCisJMHhGRiwgMHhGOCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhGQiwgMHgwMCwgMHgzNCwgMHhGRiwgMHg3MSwgMHhGQiwKKwkweDcxLCAweEZGLCAweDZCLCAweDEwLCAweDMyLCAweDIwLCAweEE5LCAweDFDLCAweDEzLCAweDBBLCAweEE4LAorCTB4RkMsIDB4NjMsIDB4RkMsIDB4MzUsIDB4MDAsIDB4RDksIDB4MDAsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHhGNywgMHhGRiwgMHg2OSwgMHgwMCwgMHhGMiwgMHgwMCwgMHg4MSwgMHhGRSwgMHgzRSwgMHhGQiwgMHhBNCwKKwkweDAxLCAweEYyLCAweDEzLCAweDNBLCAweDIxLCAweEYwLCAweDE5LCAweENGLCAweDA2LCAweEM3LCAweEZCLAorCTB4MUIsIDB4RkQsIDB4OTYsIDB4MDAsIDB4QjQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhGQiwgMHhGRiwgMHg5MiwgMHgwMCwgMHhDRCwgMHgwMCwgMHhDMCwgMHhGRCwgMHg1RSwgMHhGQiwKKwkweDQ3LCAweDA0LCAweDUxLCAweDE3LCAweDhBLCAweDIxLCAweEQwLCAweDE2LCAweEQ5LCAweDAzLCAweDUzLAorCTB4RkIsIDB4REUsIDB4RkQsIDB4RDUsIDB4MDAsIDB4OEIsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHgwNCwgMHgwMCwgMHhCQSwgMHgwMCwgMHg4OSwgMHgwMCwgMHhGRCwgMHhGQywgMHhFMiwgMHhGQiwgMHg0QiwKKwkweDA3LCAweDYzLCAweDFBLCAweDFELCAweDIxLCAweDY5LCAweDEzLCAweDQ2LCAweDAxLCAweDQxLCAweEZCLAorCTB4OUUsIDB4RkUsIDB4RjUsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhERCwgMHgwMCwgMHgyMywgMHgwMCwgMHg0OSwgMHhGQywgMHhENSwgMHhGQywgMHg5OSwgMHgwQSwKKwkweDA5LCAweDFELCAweEY5LCAweDFGLCAweERGLCAweDBGLCAweDI0LCAweEZGLCAweDdGLCAweEZCLCAweDRELAorCTB4RkYsIDB4RkIsIDB4MDAsIDB4M0YsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkYsIDB4MDAsCisJMHhGNSwgMHgwMCwgMHg5QywgMHhGRiwgMHhCNiwgMHhGQiwgMHg0MSwgMHhGRSwgMHgxNywgMHgwRSwgMHgyNiwKKwkweDFGLCAweDJCLCAweDFFLCAweDU0LCAweDBDLCAweDdDLCAweEZELCAweEZBLCAweEZCLCAweEUzLCAweEZGLAorCTB4RUIsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTAsIDB4MDAsIDB4RkIsCisJMHgwMCwgMHhGOCwgMHhGRSwgMHg1NywgMHhGQiwgMHgyNiwgMHgwMCwgMHhBNiwgMHgxMSwgMHhBMSwgMHgyMCwKKwkweEM2LCAweDFCLCAweEVBLCAweDA4LCAweDRELCAweEZDLCAweEEwLCAweEZDLCAweDVBLCAweDAwLCAweENELAorCTB4MDAsIDB4MEMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsIDB4MDAsIDB4RTksIDB4MDAsCisJMHgzRiwgMHhGRSwgMHgzRiwgMHhGQiwgMHg4MiwgMHgwMiwgMHgyMywgMHgxNSwgMHg2QiwgMHgyMSwgMHhFNSwKKwkweDE4LCAweEJFLCAweDA1LCAweDkzLCAweEZCLCAweDVFLCAweEZELCAweEFGLCAweDAwLCAweEE2LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjksCisJMHgwMCwgMHg3QywgMHhGRCwgMHg4MCwgMHhGQiwgMHg0OCwgMHgwNSwgMHg2QiwgMHgxOCwgMHg3OSwgMHgyMSwKKwkweEE5LCAweDE1LCAweEU5LCAweDAyLCAweDQzLCAweEZCLCAweDIxLCAweEZFLCAweEUzLCAweDAwLCAweDdELAorCTB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDksIDB4MDAsIDB4QzcsIDB4MDAsIDB4NjksIDB4MDAsCisJMHhCQywgMHhGQywgMHgyOSwgMHhGQywgMHg2OSwgMHgwOCwgMHg1QywgMHgxQiwgMHhDQywgMHgyMCwgMHgzMiwKKwkweDEyLCAweDdDLCAweDAwLCAweDRFLCAweEZCLCAweERELCAweEZFLCAweEZBLCAweDAwLCAweDU2LCAweDAwLAorCTB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RTcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4MTIsCisJMHhGQywgMHg0NSwgMHhGRCwgMHhDQiwgMHgwQiwgMHhENiwgMHgxRCwgMHg2QywgMHgxRiwgMHhBMywgMHgwRSwKKwkweDg0LCAweEZFLCAweEE0LCAweEZCLCAweDg0LCAweEZGLCAweEY3LCAweDAwLCAweDM0LCAweDAwLCAweEY5LAorCTB4RkYsIDB4RjgsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RkEsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OEUsIDB4RkIsCisJMHhEQiwgMHhGRSwgMHg1MywgMHgwRiwgMHhCRCwgMHgxRiwgMHg2NiwgMHgxRCwgMHgyMSwgMHgwQiwgMHgwNSwKKwkweEZELCAweDMwLCAweEZDLCAweDEwLCAweDAwLCAweEUyLCAweDAwLCAweDE5LCAweDAwLCAweEZDLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RjgsIDB4MDAsIDB4QkEsIDB4RkUsIDB4NDYsIDB4RkIsIDB4RUEsCisJMHgwMCwgMHhERiwgMHgxMiwgMHhGQywgMHgyMCwgMHhEMywgMHgxQSwgMHhDOSwgMHgwNywgMHgwMCwgMHhGQywKKwkweEUwLCAweEZDLCAweDdCLCAweDAwLCAweEMwLCAweDAwLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEY5LAorCTB4RkYsIDB4ODUsIDB4MDAsIDB4REMsIDB4MDAsIDB4RkMsIDB4RkQsIDB4NEEsIDB4RkIsIDB4NkMsIDB4MDMsCisJMHg0RSwgMHgxNiwgMHg4NSwgMHgyMSwgMHhDRiwgMHgxNywgMHhCOCwgMHgwNCwgMHg2QywgMHhGQiwgMHhBMiwKKwkweEZELCAweEM1LCAweDAwLCAweDk4LCAweDAwLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDEsIDB4MDAsIDB4QUUsIDB4MDAsIDB4QTEsIDB4MDAsIDB4MzgsIDB4RkQsIDB4QUUsIDB4RkIsIDB4NTQsCisJMHgwNiwgMHg3QywgMHgxOSwgMHg1MywgMHgyMSwgMHg3QiwgMHgxNCwgMHgwNSwgMHgwMiwgMHgzRCwgMHhGQiwKKwkweDY0LCAweEZFLCAweEVFLCAweDAwLCAweDZGLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDBGLAorCTB4MDAsIDB4RDQsIDB4MDAsIDB4NDYsIDB4MDAsIDB4N0UsIDB4RkMsIDB4N0UsIDB4RkMsIDB4OEUsIDB4MDksCisJMHg0NiwgMHgxQywgMHg2NiwgMHgyMCwgMHhGNywgMHgxMCwgMHhDMCwgMHhGRiwgMHg2NCwgMHhGQiwgMHgxQSwKKwkweEZGLCAweEZDLCAweDAwLCAweDQ5LCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI2LCAweDAwLAorCTB4RjAsIDB4MDAsIDB4QzksIDB4RkYsIDB4REYsIDB4RkIsIDB4QzQsIDB4RkQsIDB4MDEsIDB4MEQsIDB4OTAsCisJMHgxRSwgMHhDQSwgMHgxRSwgMHg2OSwgMHgwRCwgMHhGMSwgMHhGRCwgMHhDRiwgMHhGQiwgMHhCOCwgMHhGRiwKKwkweEYyLCAweDAwLCAweDI5LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDQ1LCAweDAwLCAweEZDLAorCTB4MDAsIDB4MkQsIDB4RkYsIDB4NkQsIDB4RkIsIDB4ODQsIDB4RkYsIDB4OEUsIDB4MTAsIDB4M0YsIDB4MjAsCisJMHg5MSwgMHgxQywgMHhGMiwgMHgwOSwgMHg5RCwgMHhGQywgMHg2QSwgMHhGQywgMHgzOSwgMHgwMCwgMHhENywKKwkweDAwLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDZBLCAweDAwLCAweEYxLCAweDAwLAorCTB4N0EsIDB4RkUsIDB4M0QsIDB4RkIsIDB4QkMsIDB4MDEsIDB4MTQsIDB4MTQsIDB4NDEsIDB4MjEsIDB4RDQsCisJMHgxOSwgMHhCMCwgMHgwNiwgMHhDMCwgMHhGQiwgMHgyMiwgMHhGRCwgMHg5OSwgMHgwMCwgMHhCMywgMHgwMCwKKwkweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweDkzLCAweDAwLCAweENCLAorCTB4MDAsIDB4QjgsIDB4RkQsIDB4NjEsIDB4RkIsIDB4NjMsIDB4MDQsIDB4NzEsIDB4MTcsIDB4ODksIDB4MjEsCisJMHhCMCwgMHgxNiwgMHhCRCwgMHgwMywgMHg1MSwgMHhGQiwgMHhFNiwgMHhGRCwgMHhENywgMHgwMCwgMHg4QSwKKwkweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweDA1LCAweDAwLCAweEJDLCAweDAwLCAweDg2LCAweDAwLAorCTB4RjYsIDB4RkMsIDB4RTksIDB4RkIsIDB4NkEsIDB4MDcsIDB4ODAsIDB4MUEsIDB4MTUsIDB4MjEsIDB4NDcsCisJMHgxMywgMHgyRiwgMHgwMSwgMHg0MiwgMHhGQiwgMHhBNSwgMHhGRSwgMHhGNiwgMHgwMCwgMHg2MSwgMHgwMCwKKwkweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE2LCAweDAwLCAweERGLCAweDAwLCAweDFFLCAweDAwLCAweDQzLAorCTB4RkMsIDB4RTEsIDB4RkMsIDB4QkIsIDB4MEEsIDB4MjEsIDB4MUQsIDB4RUEsIDB4MUYsIDB4QkMsIDB4MEYsCisJMHgxMiwgMHhGRiwgMHg4MiwgMHhGQiwgMHg1NCwgMHhGRiwgMHhGQSwgMHgwMCwgMHgzRCwgMHgwMCwgMHhGOCwKKwkweEZGLCAweEY5LCAweEZGLCAweDMwLCAweDAwLCAweEY2LCAweDAwLCAweDk2LCAweEZGLCAweEIxLCAweEZCLAorCTB4NTEsIDB4RkUsIDB4M0EsIDB4MEUsIDB4MzgsIDB4MUYsIDB4MTYsIDB4MUUsIDB4MzIsIDB4MEMsIDB4NkUsCisJMHhGRCwgMHgwMCwgMHhGQywgMHhFOCwgMHhGRiwgMHhFQSwgMHgwMCwgMHgyMCwgMHgwMCwgMHhGQiwgMHhGRiwKKwkweEY3LCAweEZGLCAweDUxLCAweDAwLCAweEZCLCAweDAwLCAweEYxLCAweEZFLCAweDU0LCAweEZCLCAweDNCLAorCTB4MDAsIDB4QzksIDB4MTEsIDB4QUQsIDB4MjAsIDB4QUMsIDB4MUIsIDB4Q0EsIDB4MDgsIDB4NDQsIDB4RkMsCisJMHhBNywgMHhGQywgMHg1RSwgMHgwMCwgMHhDQywgMHgwMCwgMHgwQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwKKwkweEZGLCAweDc4LCAweDAwLCAweEU3LCAweDAwLCAweDM4LCAweEZFLCAweDQwLCAweEZCLCAweDlCLCAweDAyLAorCTB4NDUsIDB4MTUsIDB4NkYsIDB4MjEsIDB4QzcsIDB4MTgsIDB4QTEsIDB4MDUsIDB4OEUsIDB4RkIsIDB4NjUsCisJMHhGRCwgMHhCMiwgMHgwMCwgMHhBNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZFLCAweEZGLCAweEEyLCAweDAwLCAweEI3LCAweDAwLCAweDc0LCAweEZELCAweDg0LCAweEZCLCAweDY2LAorCTB4MDUsIDB4OEEsIDB4MTgsIDB4NzYsIDB4MjEsIDB4ODcsIDB4MTUsIDB4Q0YsIDB4MDIsIDB4NDEsIDB4RkIsCisJMHgyOSwgMHhGRSwgMHhFNSwgMHgwMCwgMHg3QiwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQSwKKwkweDAwLCAweEM5LCAweDAwLCAweDY2LCAweDAwLCAweEI1LCAweEZDLCAweDMyLCAweEZDLCAweDg5LCAweDA4LAorCTB4NzcsIDB4MUIsIDB4QzIsIDB4MjAsIDB4MEYsIDB4MTIsIDB4NjYsIDB4MDAsIDB4NTAsIDB4RkIsIDB4RTQsCisJMHhGRSwgMHhGQSwgMHgwMCwgMHg1NCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweEU4LCAweDAwLCAweEYzLCAweEZGLCAweDBDLCAweEZDLCAweDUzLCAweEZELCAweEVELCAweDBCLCAweEVCLAorCTB4MUQsIDB4NUEsIDB4MUYsIDB4ODAsIDB4MEUsIDB4NzMsIDB4RkUsIDB4QTgsIDB4RkIsIDB4OEEsIDB4RkYsCisJMHhGNywgMHgwMCwgMHgzMiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzQiwgMHgwMCwgMHhGQSwKKwkweDAwLCAweDYwLCAweEZGLCAweDhBLCAweEZCLCAweEVELCAweEZFLCAweDc2LCAweDBGLCAweENDLCAweDFGLAorCTB4NEYsIDB4MUQsIDB4RkYsIDB4MEEsIDB4RjksIDB4RkMsIDB4MzYsIDB4RkMsIDB4MTUsIDB4MDAsIDB4RTEsCisJMHgwMCwgMHgxOCwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg1RSwgMHgwMCwgMHhGNywgMHgwMCwKKwkweEIzLCAweEZFLCAweDQ0LCAweEZCLCAweDAxLCAweDAxLCAweDAyLCAweDEzLCAweDA0LCAweDIxLCAweEI4LAorCTB4MUEsIDB4QTksIDB4MDcsIDB4RjgsIDB4RkIsIDB4RTcsIDB4RkMsIDB4N0YsIDB4MDAsIDB4QkYsIDB4MDAsCisJMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHg4NiwgMHgwMCwgMHhEQSwgMHgwMCwgMHhGNSwKKwkweEZELCAweDRDLCAweEZCLCAweDg3LCAweDAzLCAweDZFLCAweDE2LCAweDg2LCAweDIxLCAweEIwLCAweDE3LAorCTB4OUMsIDB4MDQsIDB4NjgsIDB4RkIsIDB4QTksIDB4RkQsIDB4QzcsIDB4MDAsIDB4OTYsIDB4MDAsIDB4RkIsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhCMCwgMHgwMCwgMHg5RiwgMHgwMCwKKwkweDMxLCAweEZELCAweEI0LCAweEZCLCAweDczLCAweDA2LCAweDk5LCAweDE5LCAweDRELCAweDIxLCAweDU5LAorCTB4MTQsIDB4RUQsIDB4MDEsIDB4M0QsIDB4RkIsIDB4NkIsIDB4RkUsIDB4RUYsIDB4MDAsIDB4NkQsIDB4MDAsCisJMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhENSwgMHgwMCwgMHg0MiwgMHgwMCwgMHg3NywKKwkweEZDLCAweDg4LCAweEZDLCAweEFGLCAweDA5LCAweDVGLCAweDFDLCAweDU5LCAweDIwLCAweEQ0LCAweDEwLAorCTB4QUMsIDB4RkYsIDB4NjcsIDB4RkIsIDB4MjAsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NDgsIDB4MDAsIDB4RjcsCisJMHhGRiwgMHhGQSwgMHhGRiwgMHgyNywgMHgwMCwgMHhGMCwgMHgwMCwgMHhDMywgMHhGRiwgMHhEOSwgMHhGQiwKKwkweEQzLCAweEZELCAweDI0LCAweDBELCAweEEzLCAweDFFLCAweEI3LCAweDFFLCAweDQ2LCAweDBELCAweEUyLAorCTB4RkQsIDB4RDQsIDB4RkIsIDB4QkUsIDB4RkYsIDB4RjEsIDB4MDAsIDB4MjgsIDB4MDAsIDB4RkEsIDB4RkYsCisJMHhGNywgMHhGRiwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMCwgMHgyNywgMHhGRiwgMHg2QSwgMHhGQiwgMHg5OCwKKwkweEZGLCAweEIxLCAweDEwLCAweDRDLCAweDIwLCAweDc4LCAweDFDLCAweEQxLCAweDA5LCAweDkzLCAweEZDLAorCTB4NzEsIDB4RkMsIDB4M0QsIDB4MDAsIDB4RDYsIDB4MDAsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsCisJMHhGRiwgMHg2QywgMHgwMCwgMHhGMCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgzRCwgMHhGQiwgMHhENCwgMHgwMSwKKwkweDM2LCAweDE0LCAweDQ3LCAweDIxLCAweEI2LCAweDE5LCAweDkxLCAweDA2LCAweEJBLCAweEZCLCAweDI5LAorCTB4RkQsIDB4OUMsIDB4MDAsIDB4QjEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHhGQiwgMHhGRiwgMHg5NSwgMHgwMCwgMHhDOSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg2NSwgMHhGQiwgMHg4MCwKKwkweDA0LCAweDkwLCAweDE3LCAweDg4LCAweDIxLCAweDhGLCAweDE2LCAweEEyLCAweDAzLCAweDRFLCAweEZCLAorCTB4RUQsIDB4RkQsIDB4RDksIDB4MDAsIDB4ODgsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDUsCisJMHgwMCwgMHhCRCwgMHgwMCwgMHg4MiwgMHgwMCwgMHhFRiwgMHhGQywgMHhGMCwgMHhGQiwgMHg4QSwgMHgwNywKKwkweDlDLCAweDFBLCAweDBELCAweDIxLCAweDI0LCAweDEzLCAweDE4LCAweDAxLCAweDQzLCAweEZCLCAweEFDLAorCTB4RkUsIDB4RjcsIDB4MDAsIDB4NjAsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTcsIDB4MDAsCisJMHhFMCwgMHgwMCwgMHgxQSwgMHgwMCwgMHgzRCwgMHhGQywgMHhFRCwgMHhGQywgMHhERCwgMHgwQSwgMHgzOCwKKwkweDFELCAweERCLCAweDFGLCAweDk5LCAweDBGLCAweEZGLCAweEZFLCAweDg2LCAweEZCLCAweDVBLCAweEZGLAorCTB4RkEsIDB4MDAsIDB4M0MsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzEsIDB4MDAsIDB4RjYsCisJMHgwMCwgMHg5MCwgMHhGRiwgMHhBRCwgMHhGQiwgMHg2MiwgMHhGRSwgMHg1RCwgMHgwRSwgMHg0OSwgMHgxRiwKKwkweDAxLCAweDFFLCAweDEwLCAweDBDLCAweDYwLCAweEZELCAweDA2LCAweEZDLCAweEVFLCAweEZGLCAweEU5LAorCTB4MDAsIDB4MUYsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTMsIDB4MDAsIDB4RkIsIDB4MDAsCisJMHhFQiwgMHhGRSwgMHg1MiwgMHhGQiwgMHg1MSwgMHgwMCwgMHhFQywgMHgxMSwgMHhCNywgMHgyMCwgMHg5MSwKKwkweDFCLCAweEE5LCAweDA4LCAweDNCLCAweEZDLCAweEFFLCAweEZDLCAweDYyLCAweDAwLCAweENBLCAweDAwLAorCTB4MEIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0EsIDB4MDAsIDB4RTYsIDB4MDAsIDB4MzAsCisJMHhGRSwgMHg0MCwgMHhGQiwgMHhCNSwgMHgwMiwgMHg2NiwgMHgxNSwgMHg3MywgMHgyMSwgMHhBOSwgMHgxOCwKKwkweDgzLCAweDA1LCAweDg5LCAweEZCLCAweDZELCAweEZELCAweEI0LCAweDAwLCAweEEzLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QTMsIDB4MDAsIDB4QjQsIDB4MDAsCisJMHg2RCwgMHhGRCwgMHg4OSwgMHhGQiwgMHg4MywgMHgwNSwgMHhBOSwgMHgxOCwgMHg3MywgMHgyMSwgMHg2NiwKKwkweDE1LCAweEI1LCAweDAyLCAweDQwLCAweEZCLCAweDMwLCAweEZFLCAweEU2LCAweDAwLCAweDdBLCAweDAwLAorCTB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4Q0EsIDB4MDAsIDB4NjIsIDB4MDAsIDB4QUUsCisJMHhGQywgMHgzQiwgMHhGQywgMHhBOSwgMHgwOCwgMHg5MSwgMHgxQiwgMHhCNywgMHgyMCwgMHhFQywgMHgxMSwKKwkweDUxLCAweDAwLCAweDUyLCAweEZCLCAweEVCLCAweEZFLCAweEZCLCAweDAwLCAweDUzLCAweDAwLCAweEY3LAorCTB4RkYsIDB4RkIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RTksIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4RkMsCisJMHg2MCwgMHhGRCwgMHgxMCwgMHgwQywgMHgwMSwgMHgxRSwgMHg0OSwgMHgxRiwgMHg1RCwgMHgwRSwgMHg2MiwKKwkweEZFLCAweEFELCAweEZCLCAweDkwLCAweEZGLCAweEY2LCAweDAwLCAweDMxLCAweDAwLCAweEY5LCAweEZGLAorCTB4RjgsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RkEsIDB4MDAsIDB4NUEsIDB4RkYsIDB4ODYsIDB4RkIsIDB4RkYsCisJMHhGRSwgMHg5OSwgMHgwRiwgMHhEQiwgMHgxRiwgMHgzOCwgMHgxRCwgMHhERCwgMHgwQSwgMHhFRCwgMHhGQywKKwkweDNELCAweEZDLCAweDFBLCAweDAwLCAweEUwLCAweDAwLCAweDE3LCAweDAwLCAweEZDLCAweEZGLCAweEY3LAorCTB4RkYsIDB4NjAsIDB4MDAsIDB4RjcsIDB4MDAsIDB4QUMsIDB4RkUsIDB4NDMsIDB4RkIsIDB4MTgsIDB4MDEsCisJMHgyNCwgMHgxMywgMHgwRCwgMHgyMSwgMHg5QywgMHgxQSwgMHg4QSwgMHgwNywgMHhGMCwgMHhGQiwgMHhFRiwKKwkweEZDLCAweDgyLCAweDAwLCAweEJELCAweDAwLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLAorCTB4ODgsIDB4MDAsIDB4RDksIDB4MDAsIDB4RUQsIDB4RkQsIDB4NEUsIDB4RkIsIDB4QTIsIDB4MDMsIDB4OEYsCisJMHgxNiwgMHg4OCwgMHgyMSwgMHg5MCwgMHgxNywgMHg4MCwgMHgwNCwgMHg2NSwgMHhGQiwgMHhCMSwgMHhGRCwKKwkweEM5LCAweDAwLCAweDk1LCAweDAwLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLAorCTB4MDAsIDB4QjEsIDB4MDAsIDB4OUMsIDB4MDAsIDB4MjksIDB4RkQsIDB4QkEsIDB4RkIsIDB4OTEsIDB4MDYsCisJMHhCNiwgMHgxOSwgMHg0NywgMHgyMSwgMHgzNiwgMHgxNCwgMHhENCwgMHgwMSwgMHgzRCwgMHhGQiwgMHg3MiwKKwkweEZFLCAweEYwLCAweDAwLCAweDZDLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDExLCAweDAwLAorCTB4RDYsIDB4MDAsIDB4M0QsIDB4MDAsIDB4NzEsIDB4RkMsIDB4OTMsIDB4RkMsIDB4RDEsIDB4MDksIDB4NzgsCisJMHgxQywgMHg0QywgMHgyMCwgMHhCMSwgMHgxMCwgMHg5OCwgMHhGRiwgMHg2QSwgMHhGQiwgMHgyNywgMHhGRiwKKwkweEZDLCAweDAwLCAweDQ2LCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI4LCAweDAwLCAweEYxLAorCTB4MDAsIDB4QkUsIDB4RkYsIDB4RDQsIDB4RkIsIDB4RTIsIDB4RkQsIDB4NDYsIDB4MEQsIDB4QjcsIDB4MUUsCisJMHhBMywgMHgxRSwgMHgyNCwgMHgwRCwgMHhEMywgMHhGRCwgMHhEOSwgMHhGQiwgMHhDMywgMHhGRiwgMHhGMCwKKwkweDAwLCAweDI3LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDQ4LCAweDAwLCAweEZDLCAweDAwLAorCTB4MjAsIDB4RkYsIDB4NjcsIDB4RkIsIDB4QUMsIDB4RkYsIDB4RDQsIDB4MTAsIDB4NTksIDB4MjAsIDB4NUYsCisJMHgxQywgMHhBRiwgMHgwOSwgMHg4OCwgMHhGQywgMHg3NywgMHhGQywgMHg0MiwgMHgwMCwgMHhENSwgMHgwMCwKKwkweDEwLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDZELCAweDAwLCAweEVGLCAweDAwLCAweDZCLAorCTB4RkUsIDB4M0QsIDB4RkIsIDB4RUQsIDB4MDEsIDB4NTksIDB4MTQsIDB4NEQsIDB4MjEsIDB4OTksIDB4MTksCisJMHg3MywgMHgwNiwgMHhCNCwgMHhGQiwgMHgzMSwgMHhGRCwgMHg5RiwgMHgwMCwgMHhCMCwgMHgwMCwgMHgwMSwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweDk2LCAweDAwLCAweEM3LCAweDAwLAorCTB4QTksIDB4RkQsIDB4NjgsIDB4RkIsIDB4OUMsIDB4MDQsIDB4QjAsIDB4MTcsIDB4ODYsIDB4MjEsIDB4NkUsCisJMHgxNiwgMHg4NywgMHgwMywgMHg0QywgMHhGQiwgMHhGNSwgMHhGRCwgMHhEQSwgMHgwMCwgMHg4NiwgMHgwMCwKKwkweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEJGLCAweDAwLCAweDdGLCAweDAwLCAweEU3LAorCTB4RkMsIDB4RjgsIDB4RkIsIDB4QTksIDB4MDcsIDB4QjgsIDB4MUEsIDB4MDQsIDB4MjEsIDB4MDIsIDB4MTMsCisJMHgwMSwgMHgwMSwgMHg0NCwgMHhGQiwgMHhCMywgMHhGRSwgMHhGNywgMHgwMCwgMHg1RSwgMHgwMCwgMHhGNywKKwkweEZGLCAweEZDLCAweEZGLCAweDE4LCAweDAwLCAweEUxLCAweDAwLCAweDE1LCAweDAwLCAweDM2LCAweEZDLAorCTB4RjksIDB4RkMsIDB4RkYsIDB4MEEsIDB4NEYsIDB4MUQsIDB4Q0MsIDB4MUYsIDB4NzYsIDB4MEYsIDB4RUQsCisJMHhGRSwgMHg4QSwgMHhGQiwgMHg2MCwgMHhGRiwgMHhGQSwgMHgwMCwgMHgzQiwgMHgwMCwgMHhGOCwgMHhGRiwKKwkweEY5LCAweEZGLCAweDMyLCAweDAwLCAweEY3LCAweDAwLCAweDhBLCAweEZGLCAweEE4LCAweEZCLCAweDczLAorCTB4RkUsIDB4ODAsIDB4MEUsIDB4NUEsIDB4MUYsIDB4RUIsIDB4MUQsIDB4RUQsIDB4MEIsIDB4NTMsIDB4RkQsCisJMHgwQywgMHhGQywgMHhGMywgMHhGRiwgMHhFOCwgMHgwMCwgMHgxRSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywKKwkweEZGLCAweDU0LCAweDAwLCAweEZBLCAweDAwLCAweEU0LCAweEZFLCAweDUwLCAweEZCLCAweDY2LCAweDAwLAorCTB4MEYsIDB4MTIsIDB4QzIsIDB4MjAsIDB4NzcsIDB4MUIsIDB4ODksIDB4MDgsIDB4MzIsIDB4RkMsIDB4QjUsCisJMHhGQywgMHg2NiwgMHgwMCwgMHhDOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwKKwkweDdCLCAweDAwLCAweEU1LCAweDAwLCAweDI5LCAweEZFLCAweDQxLCAweEZCLCAweENGLCAweDAyLCAweDg3LAorCTB4MTUsIDB4NzYsIDB4MjEsIDB4OEEsIDB4MTgsIDB4NjYsIDB4MDUsIDB4ODQsIDB4RkIsIDB4NzQsIDB4RkQsCisJMHhCNywgMHgwMCwgMHhBMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweEE1LCAweDAwLCAweEIyLCAweDAwLCAweDY1LCAweEZELCAweDhFLCAweEZCLCAweEExLCAweDA1LAorCTB4QzcsIDB4MTgsIDB4NkYsIDB4MjEsIDB4NDUsIDB4MTUsIDB4OUIsIDB4MDIsIDB4NDAsIDB4RkIsIDB4MzgsCisJMHhGRSwgMHhFNywgMHgwMCwgMHg3OCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQiwgMHgwMCwKKwkweENDLCAweDAwLCAweDVFLCAweDAwLCAweEE3LCAweEZDLCAweDQ0LCAweEZDLCAweENBLCAweDA4LCAweEFDLAorCTB4MUIsIDB4QUQsIDB4MjAsIDB4QzksIDB4MTEsIDB4M0IsIDB4MDAsIDB4NTQsIDB4RkIsIDB4RjEsIDB4RkUsCisJMHhGQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgyMCwgMHgwMCwgMHhFQSwKKwkweDAwLCAweEU4LCAweEZGLCAweDAwLCAweEZDLCAweDZFLCAweEZELCAweDMyLCAweDBDLCAweDE2LCAweDFFLAorCTB4MzgsIDB4MUYsIDB4M0EsIDB4MEUsIDB4NTEsIDB4RkUsIDB4QjEsIDB4RkIsIDB4OTYsIDB4RkYsIDB4RjYsCisJMHgwMCwgMHgzMCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzRCwgMHgwMCwgMHhGQSwgMHgwMCwKKwkweDU0LCAweEZGLCAweDgyLCAweEZCLCAweDEyLCAweEZGLCAweEJDLCAweDBGLCAweEVBLCAweDFGLCAweDIxLAorCTB4MUQsIDB4QkIsIDB4MEEsIDB4RTEsIDB4RkMsIDB4NDMsIDB4RkMsIDB4MUUsIDB4MDAsIDB4REYsIDB4MDAsCisJMHgxNiwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg2MSwgMHgwMCwgMHhGNiwgMHgwMCwgMHhBNSwKKwkweEZFLCAweDQyLCAweEZCLCAweDJGLCAweDAxLCAweDQ3LCAweDEzLCAweDE1LCAweDIxLCAweDgwLCAweDFBLAorCTB4NkEsIDB4MDcsIDB4RTksIDB4RkIsIDB4RjYsIDB4RkMsIDB4ODYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4MDUsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4QSwgMHgwMCwgMHhENywgMHgwMCwgMHhFNiwgMHhGRCwKKwkweDUxLCAweEZCLCAweEJELCAweDAzLCAweEIwLCAweDE2LCAweDg5LCAweDIxLCAweDcxLCAweDE3LCAweDYzLAorCTB4MDQsIDB4NjEsIDB4RkIsIDB4QjgsIDB4RkQsIDB4Q0IsIDB4MDAsIDB4OTMsIDB4MDAsIDB4RkIsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMCwgMHhCMywgMHgwMCwgMHg5OSwgMHgwMCwgMHgyMiwKKwkweEZELCAweEMwLCAweEZCLCAweEIwLCAweDA2LCAweEQ0LCAweDE5LCAweDQxLCAweDIxLCAweDE0LCAweDE0LAorCTB4QkMsIDB4MDEsIDB4M0QsIDB4RkIsIDB4N0EsIDB4RkUsIDB4RjEsIDB4MDAsIDB4NkEsIDB4MDAsIDB4RjcsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhENywgMHgwMCwgMHgzOSwgMHgwMCwgMHg2QSwgMHhGQywKKwkweDlELCAweEZDLCAweEYyLCAweDA5LCAweDkxLCAweDFDLCAweDNGLCAweDIwLCAweDhFLCAweDEwLCAweDg0LAorCTB4RkYsIDB4NkQsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NDUsIDB4MDAsIDB4RjcsIDB4RkYsCisJMHhGQSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGMiwgMHgwMCwgMHhCOCwgMHhGRiwgMHhDRiwgMHhGQiwgMHhGMSwKKwkweEZELCAweDY5LCAweDBELCAweENBLCAweDFFLCAweDkwLCAweDFFLCAweDAxLCAweDBELCAweEM0LCAweEZELAorCTB4REYsIDB4RkIsIDB4QzksIDB4RkYsIDB4RjAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsCisJMHhGRiwgMHg0OSwgMHgwMCwgMHhGQywgMHgwMCwgMHgxQSwgMHhGRiwgMHg2NCwgMHhGQiwgMHhDMCwgMHhGRiwKKwkweEY3LCAweDEwLCAweDY2LCAweDIwLCAweDQ2LCAweDFDLCAweDhFLCAweDA5LCAweDdFLCAweEZDLCAweDdFLAorCTB4RkMsIDB4NDYsIDB4MDAsIDB4RDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsCisJMHg2RiwgMHgwMCwgMHhFRSwgMHgwMCwgMHg2NCwgMHhGRSwgMHgzRCwgMHhGQiwgMHgwNSwgMHgwMiwgMHg3QiwKKwkweDE0LCAweDUzLCAweDIxLCAweDdDLCAweDE5LCAweDU0LCAweDA2LCAweEFFLCAweEZCLCAweDM4LCAweEZELAorCTB4QTEsIDB4MDAsIDB4QUUsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkMsCisJMHhGRiwgMHg5OCwgMHgwMCwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRCwgMHg2QywgMHhGQiwgMHhCOCwgMHgwNCwKKwkweENGLCAweDE3LCAweDg1LCAweDIxLCAweDRFLCAweDE2LCAweDZDLCAweDAzLCAweDRBLCAweEZCLCAweEZDLAorCTB4RkQsIDB4REMsIDB4MDAsIDB4ODUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsCisJMHhDMCwgMHgwMCwgMHg3QiwgMHgwMCwgMHhFMCwgMHhGQywgMHgwMCwgMHhGQywgMHhDOSwgMHgwNywgMHhEMywKKwkweDFBLCAweEZDLCAweDIwLCAweERGLCAweDEyLCAweEVBLCAweDAwLCAweDQ2LCAweEZCLCAweEJBLCAweEZFLAorCTB4RjgsIDB4MDAsIDB4NUQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTksIDB4MDAsIDB4RTIsCisJMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHhGQywgMHgwNSwgMHhGRCwgMHgyMSwgMHgwQiwgMHg2NiwgMHgxRCwKKwkweEJELCAweDFGLCAweDUzLCAweDBGLCAweERCLCAweEZFLCAweDhFLCAweEZCLCAweDY2LCAweEZGLCAweEZBLAorCTB4MDAsIDB4M0EsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzQsIDB4MDAsIDB4RjcsIDB4MDAsCisJMHg4NCwgMHhGRiwgMHhBNCwgMHhGQiwgMHg4NCwgMHhGRSwgMHhBMywgMHgwRSwgMHg2QywgMHgxRiwgMHhENiwKKwkweDFELCAweENCLCAweDBCLCAweDQ1LCAweEZELCAweDEyLCAweEZDLCAweEY4LCAweEZGLCAweEU3LCAweDAwLAorCTB4MUQsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTYsIDB4MDAsIDB4RkEsIDB4MDAsIDB4REQsCisJMHhGRSwgMHg0RSwgMHhGQiwgMHg3QywgMHgwMCwgMHgzMiwgMHgxMiwgMHhDQywgMHgyMCwgMHg1QywgMHgxQiwKKwkweDY5LCAweDA4LCAweDI5LCAweEZDLCAweEJDLCAweEZDLCAweDY5LCAweDAwLCAweEM3LCAweDAwLCAweDA5LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0QsIDB4MDAsIDB4RTMsIDB4MDAsIDB4MjEsIDB4RkUsCisJMHg0MywgMHhGQiwgMHhFOSwgMHgwMiwgMHhBOSwgMHgxNSwgMHg3OSwgMHgyMSwgMHg2QiwgMHgxOCwgMHg0OCwKKwkweDA1LCAweDgwLCAweEZCLCAweDdDLCAweEZELCAweEI5LCAweDAwLCAweEEwLCAweDAwLCAweEZELCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QTYsIDB4MDAsIDB4QUYsIDB4MDAsIDB4NUUsCisJMHhGRCwgMHg5MywgMHhGQiwgMHhCRSwgMHgwNSwgMHhFNSwgMHgxOCwgMHg2QiwgMHgyMSwgMHgyMywgMHgxNSwKKwkweDgyLCAweDAyLCAweDNGLCAweEZCLCAweDNGLCAweEZFLCAweEU5LCAweDAwLCAweDc3LCAweDAwLCAweEY4LAorCTB4RkYsIDB4RkUsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4NUEsIDB4MDAsIDB4QTAsIDB4RkMsCisJMHg0RCwgMHhGQywgMHhFQSwgMHgwOCwgMHhDNiwgMHgxQiwgMHhBMSwgMHgyMCwgMHhBNiwgMHgxMSwgMHgyNiwKKwkweDAwLCAweDU3LCAweEZCLCAweEY4LCAweEZFLCAweEZCLCAweDAwLCAweDUwLCAweDAwLCAweEY3LCAweEZGLAorCTB4RkIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4RkEsIDB4RkIsIDB4N0MsCisJMHhGRCwgMHg1NCwgMHgwQywgMHgyQiwgMHgxRSwgMHgyNiwgMHgxRiwgMHgxNywgMHgwRSwgMHg0MSwgMHhGRSwKKwkweEI2LCAweEZCLCAweDlDLCAweEZGLCAweEY1LCAweDAwLCAweDJGLCAweDAwLCAweEY5LCAweEZGLCAweEY4LAorCTB4RkYsIDB4M0YsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NEQsIDB4RkYsIDB4N0YsIDB4RkIsIDB4MjQsIDB4RkYsCisJMHhERiwgMHgwRiwgMHhGOSwgMHgxRiwgMHgwOSwgMHgxRCwgMHg5OSwgMHgwQSwgMHhENSwgMHhGQywgMHg0OSwKKwkweEZDLCAweDIzLCAweDAwLCAweERELCAweDAwLCAweDE2LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLAorCTB4NjMsIDB4MDAsIDB4RjUsIDB4MDAsIDB4OUUsIDB4RkUsIDB4NDEsIDB4RkIsIDB4NDYsIDB4MDEsIDB4NjksCisJMHgxMywgMHgxRCwgMHgyMSwgMHg2MywgMHgxQSwgMHg0QiwgMHgwNywgMHhFMiwgMHhGQiwgMHhGRCwgMHhGQywKKwkweDg5LCAweDAwLCAweEJBLCAweDAwLCAweDA0LCAweDAwLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhCLAorCTB4MDAsIDB4RDUsIDB4MDAsIDB4REUsIDB4RkQsIDB4NTMsIDB4RkIsIDB4RDksIDB4MDMsIDB4RDAsIDB4MTYsCisJMHg4QSwgMHgyMSwgMHg1MSwgMHgxNywgMHg0NywgMHgwNCwgMHg1RSwgMHhGQiwgMHhDMCwgMHhGRCwgMHhDRCwKKwkweDAwLCAweDkyLCAweDAwLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLCAweDAwLAorCTB4QjQsIDB4MDAsIDB4OTYsIDB4MDAsIDB4MUIsIDB4RkQsIDB4QzcsIDB4RkIsIDB4Q0YsIDB4MDYsIDB4RjAsCisJMHgxOSwgMHgzQSwgMHgyMSwgMHhGMiwgMHgxMywgMHhBNCwgMHgwMSwgMHgzRSwgMHhGQiwgMHg4MSwgMHhGRSwKKwkweEYyLCAweDAwLCAweDY5LCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEQ5LAorCTB4MDAsIDB4MzUsIDB4MDAsIDB4NjMsIDB4RkMsIDB4QTgsIDB4RkMsIDB4MTMsIDB4MEEsIDB4QTksIDB4MUMsCisJMHgzMiwgMHgyMCwgMHg2QiwgMHgxMCwgMHg3MSwgMHhGRiwgMHg3MSwgMHhGQiwgMHgzNCwgMHhGRiwgMHhGQiwKKwkweDAwLCAweDQ0LCAweDAwLCAweEY4LCAweEZGLCAweEZBLCAweEZGLCAweDJCLCAweDAwLCAweEYzLCAweDAwLAorCTB4QjMsIDB4RkYsIDB4Q0EsIDB4RkIsIDB4MDEsIDB4RkUsIDB4OEMsIDB4MEQsIDB4REQsIDB4MUUsIDB4N0MsCisJMHgxRSwgMHhERSwgMHgwQywgMHhCNSwgMHhGRCwgMHhFNCwgMHhGQiwgMHhDRSwgMHhGRiwgMHhFRiwgMHgwMCwKKwkweDI1LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRBLCAweDAwLCAweEZDLCAweDAwLCAweDEzLAorCTB4RkYsIDB4NjEsIDB4RkIsIDB4RDQsIDB4RkYsIDB4MUEsIDB4MTEsIDB4NzIsIDB4MjAsIDB4MkQsIDB4MUMsCisJMHg2RCwgMHgwOSwgMHg3NCwgMHhGQywgMHg4NSwgMHhGQywgMHg0QSwgMHgwMCwgMHhEMiwgMHgwMCwgMHgwRiwKKwkweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDcwLCAweDAwLCAweEVELCAweDAwLCAweDVELCAweEZFLAorCTB4M0QsIDB4RkIsIDB4MUUsIDB4MDIsIDB4OUMsIDB4MTQsIDB4NTgsIDB4MjEsIDB4NUUsIDB4MTksIDB4MzYsCisJMHgwNiwgMHhBOCwgMHhGQiwgMHg0MCwgMHhGRCwgMHhBNCwgMHgwMCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZDLCAweEZGLCAweDlBLCAweDAwLCAweEMzLCAweDAwLCAweDlBLAorCTB4RkQsIDB4NkYsIDB4RkIsIDB4RDUsIDB4MDQsIDB4RUYsIDB4MTcsIDB4ODMsIDB4MjEsIDB4MkQsIDB4MTYsCisJMHg1MiwgMHgwMywgMHg0OSwgMHhGQiwgMHgwNCwgMHhGRSwgMHhERCwgMHgwMCwgMHg4MywgMHgwMCwgMHhGOSwKKwkweEZGLCAweEZGLCAweEZGLCAweDA3LCAweDAwLCAweEMyLCAweDAwLCAweDc4LCAweDAwLCAweEQ5LCAweEZDLAorCTB4MDgsIDB4RkMsIDB4RTksIDB4MDcsIDB4RUYsIDB4MUEsIDB4RjMsIDB4MjAsIDB4QkMsIDB4MTIsIDB4RDQsCisJMHgwMCwgMHg0NywgMHhGQiwgMHhDMSwgMHhGRSwgMHhGOCwgMHgwMCwgMHg1QiwgMHgwMCwgMHhGNywgMHhGRiwKKwkweEZDLCAweEZGLCAweDFBLCAweDAwLCAweEUzLCAweDAwLCAweDBCLCAweDAwLCAweDJBLCAweEZDLCAweDEyLAorCTB4RkQsIDB4NDIsIDB4MEIsIDB4N0QsIDB4MUQsIDB4QUQsIDB4MUYsIDB4MkYsIDB4MEYsIDB4QzksIDB4RkUsCisJMHg5MiwgMHhGQiwgMHg2QywgMHhGRiwgMHhGOSwgMHgwMCwgMHgzOCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwKKwkweEZGLCAweDM1LCAweDAwLCAweEY4LCAweDAwLCAweDdFLCAweEZGLCAweDlGLCAweEZCLCAweDk1LCAweEZFLAorCTB4QzYsIDB4MEUsIDB4N0MsIDB4MUYsIDB4QzAsIDB4MUQsIDB4QTksIDB4MEIsIDB4MzgsIDB4RkQsIDB4MTgsCisJMHhGQywgMHhGRCwgMHhGRiwgMHhFNiwgMHgwMCwgMHgxRCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwKKwkweDU3LCAweDAwLCAweEZBLCAweDAwLCAweEQ2LCAweEZFLCAweDRDLCAweEZCLCAweDkyLCAweDAwLCAweDU0LAorCTB4MTIsIDB4RDYsIDB4MjAsIDB4NDEsIDB4MUIsIDB4NDksIDB4MDgsIDB4MjAsIDB4RkMsIDB4QzMsIDB4RkMsCisJMHg2RCwgMHgwMCwgMHhDNiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3RSwKKwkweDAwLCAweEUyLCAweDAwLCAweDFBLCAweEZFLCAweDQ0LCAweEZCLCAweDAzLCAweDAzLCAweENBLCAweDE1LAorCTB4N0MsIDB4MjEsIDB4NEMsIDB4MTgsIDB4MkIsIDB4MDUsIDB4N0IsIDB4RkIsIDB4ODMsIDB4RkQsIDB4QkMsCisJMHgwMCwgMHg5RSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweEE4LCAweDAwLCAweEFELCAweDAwLCAweDU2LCAweEZELCAweDk4LCAweEZCLCAweERDLCAweDA1LCAweDA0LAorCTB4MTksIDB4NjYsIDB4MjEsIDB4MDIsIDB4MTUsIDB4NjksIDB4MDIsIDB4M0UsIDB4RkIsIDB4NDcsIDB4RkUsCisJMHhFQSwgMHgwMCwgMHg3NSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDRSwKKwkweDAwLCAweDU2LCAweDAwLCAweDk5LCAweEZDLCAweDU2LCAweEZDLCAweDBCLCAweDA5LCAweEUwLCAweDFCLAorCTB4OTYsIDB4MjAsIDB4ODMsIDB4MTEsIDB4MTEsIDB4MDAsIDB4NTksIDB4RkIsIDB4RkYsIDB4RkUsIDB4RkIsCisJMHgwMCwgMHg0RSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgyMiwgMHgwMCwgMHhFQywgMHgwMCwKKwkweERFLCAweEZGLCAweEY1LCAweEZCLCAweDhBLCAweEZELCAweDc3LCAweDBDLCAweDNGLCAweDFFLCAweDE0LAorCTB4MUYsIDB4RjUsIDB4MEQsIDB4MzEsIDB4RkUsIDB4QkIsIDB4RkIsIDB4QTIsIDB4RkYsIDB4RjUsIDB4MDAsCisJMHgyRSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MCwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0NywKKwkweEZGLCAweDdCLCAweEZCLCAweDM3LCAweEZGLCAweDAyLCAweDEwLCAweDA3LCAweDIwLCAweEYyLCAweDFDLAorCTB4NzgsIDB4MEEsIDB4Q0EsIDB4RkMsIDB4NTAsIDB4RkMsIDB4MjcsIDB4MDAsIDB4REMsIDB4MDAsIDB4MTUsCisJMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg2NCwgMHgwMCwgMHhGNSwgMHgwMCwgMHg5NywgMHhGRSwKKwkweDQwLCAweEZCLCAweDVELCAweDAxLCAweDhCLCAweDEzLCAweDI1LCAweDIxLCAweDQ3LCAweDFBLCAweDJDLAorCTB4MDcsIDB4REIsIDB4RkIsIDB4MDUsIDB4RkQsIDB4OEMsIDB4MDAsIDB4QjksIDB4MDAsIDB4MDQsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4RCwgMHgwMCwgMHhEMywgMHgwMCwgMHhENiwgMHhGRCwgMHg1NiwKKwkweEZCLCAweEY0LCAweDAzLCAweEYwLCAweDE2LCAweDhBLCAweDIxLCAweDMxLCAweDE3LCAweDJCLCAweDA0LAorCTB4NUIsIDB4RkIsIDB4QzcsIDB4RkQsIDB4Q0YsIDB4MDAsIDB4OTAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwgMHhCNiwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMywgMHhGRCwKKwkweENELCAweEZCLCAweEVFLCAweDA2LCAweDBELCAweDFBLCAweDMzLCAweDIxLCAweEQwLCAweDEzLCAweDhDLAorCTB4MDEsIDB4M0UsIDB4RkIsIDB4ODgsIDB4RkUsIDB4RjMsIDB4MDAsIDB4NjcsIDB4MDAsIDB4RjcsIDB4RkYsCisJMHgwNiwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwMywgMHhGRiwgMHhGRSwgMHgwMCwgMHhBMSwgMHgwMiwgMHhBNiwKKwkweEY4LCAweDU2LCAweDAyLCAweEE1LCAweDI4LCAweEE1LCAweDI4LCAweDU2LCAweDAyLCAweEE2LCAweEY4LAorCTB4QTEsIDB4MDIsIDB4RkUsIDB4MDAsIDB4MDMsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgyMSwgMHgwMCwgMHhBNiwgMHhGRiwgMHgzRiwgMHhGRiwgMHgwQiwgMHgwMywgMHg0MiwgMHhGRSwKKwkweDNFLCAweEY4LCAweDdGLCAweDE1LCAweEFDLCAweDMwLCAweDdGLCAweDE1LCAweDNFLCAweEY4LCAweDQyLAorCTB4RkUsIDB4MEIsIDB4MDMsIDB4M0YsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGQSwgMHhGRiwgMHhDRSwgMHhGRiwgMHgxNCwgMHgwMSwgMHgwMCwgMHhGRCwgMHgzNSwgMHgwNiwgMHhENSwKKwkweEY0LCAweERBLCAweDE1LCAweDkyLCAweDQwLCAweEFFLCAweEZFLCAweEYzLCAweEZDLCAweDY4LCAweDAzLAorCTB4ODYsIDB4RkQsIDB4NTEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUMsCisJMHhGRiwgMHhGOSwgMHhGRiwgMHhDNiwgMHgwMCwgMHg1NSwgMHhGRCwgMHgzNSwgMHgwNiwgMHg5MCwgMHhGMywKKwkweEU1LCAweDFDLCAweDZCLCAweDNELCAweDcxLCAweEZBLCAweDM0LCAweEZGLCAweDQ2LCAweDAyLCAweEZGLAorCTB4RkQsIDB4MkQsIDB4MDEsIDB4OTAsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REIsIDB4RkYsCisJMHgyRCwgMHgwMCwgMHg2MCwgMHgwMCwgMHhFMSwgMHhGRCwgMHhDRSwgMHgwNSwgMHhFRCwgMHhGMiwgMHhGMywKKwkweDIzLCAweDIwLCAweDM5LCAweDIyLCAweEY3LCAweDQ0LCAweDAxLCAweDFGLCAweDAxLCAweDg5LCAweEZFLAorCTB4RkIsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjgsCisJMHgwMCwgMHhFNSwgMHhGRiwgMHhBMCwgMHhGRSwgMHhGQiwgMHgwNCwgMHgwQywgMHhGMywgMHhDNSwgMHgyQSwKKwkweEQ4LCAweDMzLCAweEM5LCAweEY0LCAweDBCLCAweDAzLCAweDA1LCAweDAwLCAweDFBLCAweEZGLCAweEMxLAorCTB4MDAsIDB4QUQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjUsIDB4RkYsIDB4QTUsIDB4MDAsCisJMHg1QywgMHhGRiwgMHg4QywgMHhGRiwgMHhCRiwgMHgwMywgMHgwNiwgMHhGNCwgMHgyMiwgMHgzMSwgMHhDOCwKKwkweDJELCAweDYzLCAweEYzLCAweDc2LCAweDA0LCAweDA4LCAweEZGLCAweEE3LCAweEZGLCAweDg0LCAweDAwLAorCTB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTQsIDB4RkYsIDB4RTEsIDB4MDAsIDB4Q0IsCisJMHhGRSwgMHg5QiwgMHgwMCwgMHgyMSwgMHgwMiwgMHhFRSwgMHhGNSwgMHhDRCwgMHgzNiwgMHgyNCwgMHgyNywKKwkweEUxLCAweEYyLCAweDdBLCAweDA1LCAweDMzLCAweEZFLCAweDJBLCAweDAwLCAweDQ3LCAweDAwLCAweEQzLAorCTB4RkYsIDB4MDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MTcsIDB4MDEsIDB4M0QsIDB4RkUsCisJMHhCRCwgMHgwMSwgMHgzMCwgMHgwMCwgMHhDQywgMHhGOCwgMHg5MiwgMHgzQiwgMHgyQSwgMHgyMCwgMHgyRSwKKwkweEYzLCAweDEyLCAweDA2LCAweDhGLCAweEZELCAweDlBLCAweDAwLCAweDEwLCAweDAwLCAweEU1LCAweEZGLAorCTB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDIsIDB4MDEsIDB4QkIsIDB4RkQsIDB4RTQsCisJMHgwMiwgMHgwMSwgMHhGRSwgMHg5QywgMHhGQywgMHg0NSwgMHgzRiwgMHgxNiwgMHgxOSwgMHgyRCwgMHhGNCwKKwkweDQxLCAweDA2LCAweDIxLCAweEZELCAweEYzLCAweDAwLCAweEUwLCAweEZGLCAweEY0LCAweEZGLCAweDAxLAorCTB4MDAsIDB4MTAsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NUQsIDB4MDEsIDB4NEYsIDB4RkQsIDB4RkIsIDB4MDMsCisJMHhCMiwgMHhGQiwgMHg1MywgMHgwMSwgMHhDMiwgMHg0MSwgMHgyNCwgMHgxMiwgMHhCQSwgMHhGNSwgMHgwRiwKKwkweDA2LCAweEU5LCAweEZDLCAweDMzLCAweDAxLCAweEJCLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MEQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MDQsIDB4RkQsIDB4RUYsIDB4MDQsIDB4NjIsCisJMHhGOSwgMHhENywgMHgwNiwgMHhGMiwgMHg0MiwgMHg4RCwgMHgwQiwgMHhCMCwgMHhGNywgMHg4NywgMHgwNSwKKwkweEU2LCAweEZDLCAweDU4LCAweDAxLCAweEEwLCAweEZGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDcsIDB4MDAsIDB4QTUsIDB4RkYsIDB4NTIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4QUQsIDB4MDUsCisJMHgzNSwgMHhGNywgMHgwOCwgMHgwRCwgMHhDQiwgMHg0MiwgMHg4MSwgMHgwNSwgMHhFOCwgMHhGOSwgMHhCQiwKKwkweDA0LCAweDEyLCAweEZELCAweDY0LCAweDAxLCAweDkwLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4QzIsIDB4RkYsIDB4MjcsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MjIsIDB4MDYsIDB4NTQsCisJMHhGNSwgMHhCOCwgMHgxMywgMHg0QSwgMHg0MSwgMHgyOSwgMHgwMCwgMHgzQywgMHhGQywgMHhCRCwgMHgwMywKKwkweDY2LCAweEZELCAweDU4LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEYxLAorCTB4RkYsIDB4RUIsIDB4RkYsIDB4RTEsIDB4MDAsIDB4MzUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4RTQsIDB4RjMsCisJMHhCNywgMHgxQSwgMHg4NSwgMHgzRSwgMHhBNiwgMHhGQiwgMHg4NiwgMHhGRSwgMHhBMCwgMHgwMiwgMHhENywKKwkweEZELCAweDM5LCAweDAxLCAweDhFLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweEUxLCAweEZGLAorCTB4MUMsIDB4MDAsIDB4ODIsIDB4MDAsIDB4QjAsIDB4RkQsIDB4RjksIDB4MDUsIDB4MEMsIDB4RjMsIDB4Q0IsCisJMHgyMSwgMHg4RiwgMHgzQSwgMHgwRCwgMHhGOCwgMHhBOSwgMHgwMCwgMHg3OSwgMHgwMSwgMHg1RCwgMHhGRSwKKwkweDBCLCAweDAxLCAweDk4LCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENFLCAweEZGLCAweDU1LAorCTB4MDAsIDB4MEQsIDB4MDAsIDB4NjAsIDB4RkUsIDB4NDgsIDB4MDUsIDB4RUMsIDB4RjIsIDB4QjYsIDB4MjgsCisJMHg5MSwgMHgzNSwgMHg2OCwgMHhGNSwgMHg4OCwgMHgwMiwgMHg1QSwgMHgwMCwgMHhFRCwgMHhGRSwgMHhENCwKKwkweDAwLCAweEE4LCAweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweDkyLCAweDAwLAorCTB4ODcsIDB4RkYsIDB4M0YsIDB4RkYsIDB4MkIsIDB4MDQsIDB4QTEsIDB4RjMsIDB4M0QsIDB4MkYsIDB4QjgsCisJMHgyRiwgMHhCOCwgMHhGMywgMHgxMSwgMHgwNCwgMHg1MiwgMHhGRiwgMHg3QywgMHhGRiwgMHg5NywgMHgwMCwKKwkweEJBLCAweEZGLCAweDA4LCAweDAwLCAweDBCLCAweDAwLCAweEE5LCAweEZGLCAweENGLCAweDAwLCAweEY4LAorCTB4RkUsIDB4NDQsIDB4MDAsIDB4QUEsIDB4MDIsIDB4M0UsIDB4RjUsIDB4MjQsIDB4MzUsIDB4M0IsIDB4MjksCisJMHhGMiwgMHhGMiwgMHgzNSwgMHgwNSwgMHg3MCwgMHhGRSwgMHgwMywgMHgwMCwgMHg1QSwgMHgwMCwgMHhDRCwKKwkweEZGLCAweDA1LCAweDAwLCAweDBFLCAweDAwLCAweDk5LCAweEZGLCAweDA3LCAweDAxLCAweDY4LCAweEZFLAorCTB4NjMsIDB4MDEsIDB4RDAsIDB4MDAsIDB4RDAsIDB4RjcsIDB4MzUsIDB4M0EsIDB4NTUsIDB4MjIsIDB4MDIsCisJMHhGMywgMHhFRiwgMHgwNSwgMHhCQywgMHhGRCwgMHg3QSwgMHgwMCwgMHgyMCwgMHgwMCwgMHhERiwgMHhGRiwKKwkweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDhFLCAweEZGLCAweDM2LCAweDAxLCAweEUxLCAweEZELCAweDhBLAorCTB4MDIsIDB4QjIsIDB4RkUsIDB4NTYsIDB4RkIsIDB4NDAsIDB4M0UsIDB4NDIsIDB4MUIsIDB4Q0UsIDB4RjMsCisJMHgzRSwgMHgwNiwgMHgzRCwgMHhGRCwgMHhEQiwgMHgwMCwgMHhFRSwgMHhGRiwgMHhGMCwgMHhGRiwgMHgwMSwKKwkweDAwLCAweDExLCAweDAwLCAweDhBLCAweEZGLCAweDU3LCAweDAxLCAweDZELCAweEZELCAweEE4LCAweDAzLAorCTB4NjksIDB4RkMsIDB4QzgsIDB4RkYsIDB4MjAsIDB4NDEsIDB4NDAsIDB4MTQsIDB4MzMsIDB4RjUsIDB4MjgsCisJMHgwNiwgMHhGNSwgMHhGQywgMHgyMiwgMHgwMSwgMHhDNSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDBGLCAweDAwLCAweDhGLCAweEZGLCAweDY0LCAweDAxLCAweDE3LCAweEZELCAweEE5LCAweDA0LCAweDE2LAorCTB4RkEsIDB4MTAsIDB4MDUsIDB4QjgsIDB4NDIsIDB4ODcsIDB4MEQsIDB4MEQsIDB4RjcsIDB4QjksIDB4MDUsCisJMHhFMiwgMHhGQywgMHg1MCwgMHgwMSwgMHhBNywgMHhGRiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDBBLCAweDAwLCAweDlFLCAweEZGLCAweDVBLCAweDAxLCAweEU4LCAweEZDLCAweDdBLCAweDA1LAorCTB4REEsIDB4RjcsIDB4MTAsIDB4MEIsIDB4RkIsIDB4NDIsIDB4NEIsIDB4MDcsIDB4MzUsIDB4RjksIDB4MDAsCisJMHgwNSwgMHgwMCwgMHhGRCwgMHg2MywgMHgwMSwgMHg5NCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAxLCAweDAwLCAweEI4LCAweEZGLCAweDM3LCAweDAxLCAweEU3LCAweEZDLCAweDA3LCAweDA2LCAweERFLAorCTB4RjUsIDB4OUYsIDB4MTEsIDB4RTQsIDB4NDEsIDB4QjgsIDB4MDEsIDB4ODQsIDB4RkIsIDB4MEYsIDB4MDQsCisJMHg0OCwgMHhGRCwgMHg1RSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNSwKKwkweEZGLCAweERELCAweEZGLCAweEY5LCAweDAwLCAweDFCLCAweEZELCAweDQxLCAweDA2LCAweDQ3LCAweEY0LAorCTB4OEIsIDB4MTgsIDB4ODEsIDB4M0YsIDB4RjEsIDB4RkMsIDB4RDUsIDB4RkQsIDB4RkEsIDB4MDIsIDB4QjIsCisJMHhGRCwgMHg0NSwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNiwgMHhGRiwKKwkweDBDLCAweDAwLCAweEEyLCAweDAwLCAweDg1LCAweEZELCAweDFBLCAweDA2LCAweDNDLCAweEYzLCAweDlGLAorCTB4MUYsIDB4RTYsIDB4M0IsIDB4MEUsIDB4RjksIDB4MDcsIDB4MDAsIDB4RDQsIDB4MDEsIDB4MzMsIDB4RkUsCisJMHgxQiwgMHgwMSwgMHg5NCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENCwgMHhGRiwgMHg0MywKKwkweDAwLCAweDMzLCAweDAwLCAweDI1LCAweEZFLCAweDg5LCAweDA1LCAweEUwLCAweEYyLCAweDlDLCAweDI2LAorCTB4MzMsIDB4MzcsIDB4MUUsIDB4RjYsIDB4RkQsIDB4MDEsIDB4QjAsIDB4MDAsIDB4QzAsIDB4RkUsIDB4RTYsCisJMHgwMCwgMHhBMiwgMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhDMSwgMHhGRiwgMHg3RiwgMHgwMCwKKwkweEIyLCAweEZGLCAweEY2LCAweEZFLCAweDhFLCAweDA0LCAweDUxLCAweEYzLCAweDQ5LCAweDJELCAweDk4LAorCTB4MzEsIDB4MjMsIDB4RjQsIDB4QTIsIDB4MDMsIDB4QTAsIDB4RkYsIDB4NTEsIDB4RkYsIDB4QUEsIDB4MDAsCisJMHhCNCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhBRSwgMHhGRiwgMHhCRCwgMHgwMCwgMHgyNSwKKwkweEZGLCAweEYxLCAweEZGLCAweDJCLCAweDAzLCAweEE1LCAweEY0LCAweDY4LCAweDMzLCAweDQ4LCAweDJCLAorCTB4MTcsIDB4RjMsIDB4RTcsIDB4MDQsIDB4QjEsIDB4RkUsIDB4REIsIDB4RkYsIDB4NkMsIDB4MDAsIDB4QzcsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHgwRCwgMHgwMCwgMHg5RSwgMHhGRiwgMHhGNywgMHgwMCwgMHg5NCwgMHhGRSwKKwkweDA5LCAweDAxLCAweDZBLCAweDAxLCAweEVCLCAweEY2LCAweEMxLCAweDM4LCAweDdELCAweDI0LCAweEU4LAorCTB4RjIsIDB4QzEsIDB4MDUsIDB4RUUsIDB4RkQsIDB4NTcsIDB4MDAsIDB4MzEsIDB4MDAsIDB4REEsIDB4RkYsCisJMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHg5MSwgMHhGRiwgMHgyOSwgMHgwMSwgMHgwOSwgMHhGRSwgMHgyRiwKKwkweDAyLCAweDVGLCAweEZGLCAweDI3LCAweEZBLCAweDIwLCAweDNELCAweDcwLCAweDFELCAweDdELCAweEYzLAorCTB4MzEsIDB4MDYsIDB4NUUsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RUIsIDB4RkYsIDB4MDIsCisJMHgwMCwgMHgxMSwgMHgwMCwgMHg4QiwgMHhGRiwgMHg0RSwgMHgwMSwgMHg4RSwgMHhGRCwgMHg1MiwgMHgwMywKKwkweDIwLCAweEZELCAweDUyLCAweEZFLCAweDYwLCAweDQwLCAweDYzLCAweDE2LCAweEI3LCAweEY0LCAweDM5LAorCTB4MDYsIDB4MDUsIDB4RkQsIDB4MEYsIDB4MDEsIDB4RDEsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHg4RCwgMHhGRiwgMHg2MiwgMHgwMSwgMHgyRSwgMHhGRCwgMHg1RSwgMHgwNCwgMHhDQywKKwkweEZBLCAweDVCLCAweDAzLCAweDVFLCAweDQyLCAweDhFLCAweDBGLCAweDcxLCAweEY2LCAweEU0LCAweDA1LAorCTB4RTIsIDB4RkMsIDB4NDUsIDB4MDEsIDB4QUYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwQiwgMHgwMCwgMHg5OSwgMHhGRiwgMHg2MCwgMHgwMSwgMHhGMiwgMHhGQywgMHg0MCwgMHgwNSwKKwkweDg1LCAweEY4LCAweDI2LCAweDA5LCAweDBDLCAweDQzLCAweDI2LCAweDA5LCAweDg1LCAweEY4LCAweDQwLAorCTB4MDUsIDB4RjIsIDB4RkMsIDB4NjAsIDB4MDEsIDB4OTksIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHg0NSwgMHgwMSwgMHhFMiwgMHhGQywgMHhFNCwgMHgwNSwgMHg3MSwKKwkweEY2LCAweDhFLCAweDBGLCAweDVFLCAweDQyLCAweDVCLCAweDAzLCAweENDLCAweEZBLCAweDVFLCAweDA0LAorCTB4MkUsIDB4RkQsIDB4NjIsIDB4MDEsIDB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksCisJMHhGRiwgMHhEMSwgMHhGRiwgMHgwRiwgMHgwMSwgMHgwNSwgMHhGRCwgMHgzOSwgMHgwNiwgMHhCNywgMHhGNCwKKwkweDYzLCAweDE2LCAweDYwLCAweDQwLCAweDUyLCAweEZFLCAweDIwLCAweEZELCAweDUyLCAweDAzLCAweDhFLAorCTB4RkQsIDB4NEUsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUIsIDB4RkYsCisJMHhGRCwgMHhGRiwgMHhCRiwgMHgwMCwgMHg1RSwgMHhGRCwgMHgzMSwgMHgwNiwgMHg3RCwgMHhGMywgMHg3MCwKKwkweDFELCAweDIwLCAweDNELCAweDI3LCAweEZBLCAweDVGLCAweEZGLCAweDJGLCAweDAyLCAweDA5LCAweEZFLAorCTB4MjksIDB4MDEsIDB4OTEsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REEsIDB4RkYsIDB4MzEsCisJMHgwMCwgMHg1NywgMHgwMCwgMHhFRSwgMHhGRCwgMHhDMSwgMHgwNSwgMHhFOCwgMHhGMiwgMHg3RCwgMHgyNCwKKwkweEMxLCAweDM4LCAweEVCLCAweEY2LCAweDZBLCAweDAxLCAweDA5LCAweDAxLCAweDk0LCAweEZFLCAweEY3LAorCTB4MDAsIDB4OUUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NkMsIDB4MDAsCisJMHhEQiwgMHhGRiwgMHhCMSwgMHhGRSwgMHhFNywgMHgwNCwgMHgxNywgMHhGMywgMHg0OCwgMHgyQiwgMHg2OCwKKwkweDMzLCAweEE1LCAweEY0LCAweDJCLCAweDAzLCAweEYxLCAweEZGLCAweDI1LCAweEZGLCAweEJELCAweDAwLAorCTB4QUUsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjQsIDB4RkYsIDB4QUEsIDB4MDAsIDB4NTEsCisJMHhGRiwgMHhBMCwgMHhGRiwgMHhBMiwgMHgwMywgMHgyMywgMHhGNCwgMHg5OCwgMHgzMSwgMHg0OSwgMHgyRCwKKwkweDUxLCAweEYzLCAweDhFLCAweDA0LCAweEY2LCAweEZFLCAweEIyLCAweEZGLCAweDdGLCAweDAwLCAweEMxLAorCTB4RkYsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTIsIDB4RkYsIDB4RTYsIDB4MDAsIDB4QzAsIDB4RkUsCisJMHhCMCwgMHgwMCwgMHhGRCwgMHgwMSwgMHgxRSwgMHhGNiwgMHgzMywgMHgzNywgMHg5QywgMHgyNiwgMHhFMCwKKwkweEYyLCAweDg5LCAweDA1LCAweDI1LCAweEZFLCAweDMzLCAweDAwLCAweDQzLCAweDAwLCAweEQ0LCAweEZGLAorCTB4MDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUIsIDB4MDEsIDB4MzMsIDB4RkUsIDB4RDQsCisJMHgwMSwgMHgwNywgMHgwMCwgMHgwRSwgMHhGOSwgMHhFNiwgMHgzQiwgMHg5RiwgMHgxRiwgMHgzQywgMHhGMywKKwkweDFBLCAweDA2LCAweDg1LCAweEZELCAweEEyLCAweDAwLCAweDBDLCAweDAwLCAweEU2LCAweEZGLCAweDAyLAorCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDUsIDB4MDEsIDB4QjIsIDB4RkQsIDB4RkEsIDB4MDIsCisJMHhENSwgMHhGRCwgMHhGMSwgMHhGQywgMHg4MSwgMHgzRiwgMHg4QiwgMHgxOCwgMHg0NywgMHhGNCwgMHg0MSwKKwkweDA2LCAweDFCLCAweEZELCAweEY5LCAweDAwLCAweERELCAweEZGLCAweEY1LCAweEZGLCAweDAxLCAweDAwLAorCTB4MTAsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NUUsIDB4MDEsIDB4NDgsIDB4RkQsIDB4MEYsIDB4MDQsIDB4ODQsCisJMHhGQiwgMHhCOCwgMHgwMSwgMHhFNCwgMHg0MSwgMHg5RiwgMHgxMSwgMHhERSwgMHhGNSwgMHgwNywgMHgwNiwKKwkweEU3LCAweEZDLCAweDM3LCAweDAxLCAweEI4LCAweEZGLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDBELAorCTB4MDAsIDB4OTQsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MDAsIDB4MDUsIDB4MzUsIDB4RjksCisJMHg0QiwgMHgwNywgMHhGQiwgMHg0MiwgMHgxMCwgMHgwQiwgMHhEQSwgMHhGNywgMHg3QSwgMHgwNSwgMHhFOCwKKwkweEZDLCAweDVBLCAweDAxLCAweDlFLCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDcsIDB4MDAsIDB4QTcsIDB4RkYsIDB4NTAsIDB4MDEsIDB4RTIsIDB4RkMsIDB4QjksIDB4MDUsIDB4MEQsCisJMHhGNywgMHg4NywgMHgwRCwgMHhCOCwgMHg0MiwgMHgxMCwgMHgwNSwgMHgxNiwgMHhGQSwgMHhBOSwgMHgwNCwKKwkweDE3LCAweEZELCAweDY0LCAweDAxLCAweDhGLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4QzUsIDB4RkYsIDB4MjIsIDB4MDEsIDB4RjUsIDB4RkMsIDB4MjgsIDB4MDYsIDB4MzMsIDB4RjUsCisJMHg0MCwgMHgxNCwgMHgyMCwgMHg0MSwgMHhDOCwgMHhGRiwgMHg2OSwgMHhGQywgMHhBOCwgMHgwMywgMHg2RCwKKwkweEZELCAweDU3LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEYwLCAweEZGLAorCTB4RUUsIDB4RkYsIDB4REIsIDB4MDAsIDB4M0QsIDB4RkQsIDB4M0UsIDB4MDYsIDB4Q0UsIDB4RjMsIDB4NDIsCisJMHgxQiwgMHg0MCwgMHgzRSwgMHg1NiwgMHhGQiwgMHhCMiwgMHhGRSwgMHg4QSwgMHgwMiwgMHhFMSwgMHhGRCwKKwkweDM2LCAweDAxLCAweDhFLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERGLCAweEZGLCAweDIwLAorCTB4MDAsIDB4N0EsIDB4MDAsIDB4QkMsIDB4RkQsIDB4RUYsIDB4MDUsIDB4MDIsIDB4RjMsIDB4NTUsIDB4MjIsCisJMHgzNSwgMHgzQSwgMHhEMCwgMHhGNywgMHhEMCwgMHgwMCwgMHg2MywgMHgwMSwgMHg2OCwgMHhGRSwgMHgwNywKKwkweDAxLCAweDk5LCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENELCAweEZGLCAweDVBLCAweDAwLAorCTB4MDMsIDB4MDAsIDB4NzAsIDB4RkUsIDB4MzUsIDB4MDUsIDB4RjIsIDB4RjIsIDB4M0IsIDB4MjksIDB4MjQsCisJMHgzNSwgMHgzRSwgMHhGNSwgMHhBQSwgMHgwMiwgMHg0NCwgMHgwMCwgMHhGOCwgMHhGRSwgMHhDRiwgMHgwMCwKKwkweEE5LCAweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEJBLCAweEZGLCAweDk3LCAweDAwLCAweDdDLAorCTB4RkYsIDB4NTIsIDB4RkYsIDB4MTEsIDB4MDQsIDB4QjgsIDB4RjMsIDB4QjgsIDB4MkYsIDB4M0QsIDB4MkYsCisJMHhBMSwgMHhGMywgMHgyQiwgMHgwNCwgMHgzRiwgMHhGRiwgMHg4NywgMHhGRiwgMHg5MiwgMHgwMCwgMHhCQiwKKwkweEZGLCAweDA4LCAweDAwLCAweDBCLCAweDAwLCAweEE4LCAweEZGLCAweEQ0LCAweDAwLCAweEVELCAweEZFLAorCTB4NUEsIDB4MDAsIDB4ODgsIDB4MDIsIDB4NjgsIDB4RjUsIDB4OTEsIDB4MzUsIDB4QjYsIDB4MjgsIDB4RUMsCisJMHhGMiwgMHg0OCwgMHgwNSwgMHg2MCwgMHhGRSwgMHgwRCwgMHgwMCwgMHg1NSwgMHgwMCwgMHhDRSwgMHhGRiwKKwkweDA1LCAweDAwLCAweDBFLCAweDAwLCAweDk4LCAweEZGLCAweDBCLCAweDAxLCAweDVELCAweEZFLCAweDc5LAorCTB4MDEsIDB4QTksIDB4MDAsIDB4MEQsIDB4RjgsIDB4OEYsIDB4M0EsIDB4Q0IsIDB4MjEsIDB4MEMsIDB4RjMsCisJMHhGOSwgMHgwNSwgMHhCMCwgMHhGRCwgMHg4MiwgMHgwMCwgMHgxQywgMHgwMCwgMHhFMSwgMHhGRiwgMHgwMywKKwkweDAwLCAweDEwLCAweDAwLCAweDhFLCAweEZGLCAweDM5LCAweDAxLCAweEQ3LCAweEZELCAweEEwLCAweDAyLAorCTB4ODYsIDB4RkUsIDB4QTYsIDB4RkIsIDB4ODUsIDB4M0UsIDB4QjcsIDB4MUEsIDB4RTQsIDB4RjMsIDB4NDAsCisJMHgwNiwgMHgzNSwgMHhGRCwgMHhFMSwgMHgwMCwgMHhFQiwgMHhGRiwgMHhGMSwgMHhGRiwgMHgwMSwgMHgwMCwKKwkweDExLCAweDAwLCAweDhBLCAweEZGLCAweDU4LCAweDAxLCAweDY2LCAweEZELCAweEJELCAweDAzLCAweDNDLAorCTB4RkMsIDB4MjksIDB4MDAsIDB4NEEsIDB4NDEsIDB4QjgsIDB4MTMsIDB4NTQsIDB4RjUsIDB4MjIsIDB4MDYsCisJMHhGMSwgMHhGQywgMHgyNywgMHgwMSwgMHhDMiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwKKwkweDAwLCAweDkwLCAweEZGLCAweDY0LCAweDAxLCAweDEyLCAweEZELCAweEJCLCAweDA0LCAweEU4LCAweEY5LAorCTB4ODEsIDB4MDUsIDB4Q0IsIDB4NDIsIDB4MDgsIDB4MEQsIDB4MzUsIDB4RjcsIDB4QUQsIDB4MDUsIDB4RTIsCisJMHhGQywgMHg1MiwgMHgwMSwgMHhBNSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDA5LCAweDAwLCAweEEwLCAweEZGLCAweDU4LCAweDAxLCAweEU2LCAweEZDLCAweDg3LCAweDA1LCAweEIwLAorCTB4RjcsIDB4OEQsIDB4MEIsIDB4RjIsIDB4NDIsIDB4RDcsIDB4MDYsIDB4NjIsIDB4RjksIDB4RUYsIDB4MDQsCisJMHgwNCwgMHhGRCwgMHg2MywgMHgwMSwgMHg5MywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEJCLCAweEZGLCAweDMzLCAweDAxLCAweEU5LCAweEZDLCAweDBGLCAweDA2LCAweEJBLCAweEY1LAorCTB4MjQsIDB4MTIsIDB4QzIsIDB4NDEsIDB4NTMsIDB4MDEsIDB4QjIsIDB4RkIsIDB4RkIsIDB4MDMsIDB4NEYsCisJMHhGRCwgMHg1RCwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNCwgMHhGRiwKKwkweEUwLCAweEZGLCAweEYzLCAweDAwLCAweDIxLCAweEZELCAweDQxLCAweDA2LCAweDJELCAweEY0LCAweDE2LAorCTB4MTksIDB4NDUsIDB4M0YsIDB4OUMsIDB4RkMsIDB4MDEsIDB4RkUsIDB4RTQsIDB4MDIsIDB4QkIsIDB4RkQsCisJMHg0MiwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNSwgMHhGRiwgMHgxMCwKKwkweDAwLCAweDlBLCAweDAwLCAweDhGLCAweEZELCAweDEyLCAweDA2LCAweDJFLCAweEYzLCAweDJBLCAweDIwLAorCTB4OTIsIDB4M0IsIDB4Q0MsIDB4RjgsIDB4MzAsIDB4MDAsIDB4QkQsIDB4MDEsIDB4M0QsIDB4RkUsIDB4MTcsCisJMHgwMSwgMHg5NSwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywgMHgwMCwKKwkweDJBLCAweDAwLCAweDMzLCAweEZFLCAweDdBLCAweDA1LCAweEUxLCAweEYyLCAweDI0LCAweDI3LCAweENELAorCTB4MzYsIDB4RUUsIDB4RjUsIDB4MjEsIDB4MDIsIDB4OUIsIDB4MDAsIDB4Q0IsIDB4RkUsIDB4RTEsIDB4MDAsCisJMHhBNCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHg4NCwgMHgwMCwgMHhBNywKKwkweEZGLCAweDA4LCAweEZGLCAweDc2LCAweDA0LCAweDYzLCAweEYzLCAweEM4LCAweDJELCAweDIyLCAweDMxLAorCTB4MDYsIDB4RjQsIDB4QkYsIDB4MDMsIDB4OEMsIDB4RkYsIDB4NUMsIDB4RkYsIDB4QTUsIDB4MDAsIDB4QjUsCisJMHhGRiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhBRCwgMHhGRiwgMHhDMSwgMHgwMCwgMHgxQSwgMHhGRiwKKwkweDA1LCAweDAwLCAweDBCLCAweDAzLCAweEM5LCAweEY0LCAweEQ4LCAweDMzLCAweEM1LCAweDJBLCAweDBDLAorCTB4RjMsIDB4RkIsIDB4MDQsIDB4QTAsIDB4RkUsIDB4RTUsIDB4RkYsIDB4NjgsIDB4MDAsIDB4QzksIDB4RkYsCisJMHgwNiwgMHgwMCwgMHgwRCwgMHgwMCwgMHg5QywgMHhGRiwgMHhGQiwgMHgwMCwgMHg4OSwgMHhGRSwgMHgxRiwKKwkweDAxLCAweDQ0LCAweDAxLCAweDIyLCAweEY3LCAweDIwLCAweDM5LCAweEYzLCAweDIzLCAweEVELCAweEYyLAorCTB4Q0UsIDB4MDUsIDB4RTEsIDB4RkQsIDB4NjAsIDB4MDAsIDB4MkQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDMsCisJMHgwMCwgMHgxMCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgyRCwgMHgwMSwgMHhGRiwgMHhGRCwgMHg0NiwgMHgwMiwKKwkweDM0LCAweEZGLCAweDcxLCAweEZBLCAweDZCLCAweDNELCAweEU1LCAweDFDLCAweDkwLCAweEYzLCAweDM1LAorCTB4MDYsIDB4NTUsIDB4RkQsIDB4QzYsIDB4MDAsIDB4RjksIDB4RkYsIDB4RUMsIDB4RkYsIDB4MDEsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1MSwgMHgwMSwgMHg4NiwgMHhGRCwgMHg2OCwgMHgwMywgMHhGMywKKwkweEZDLCAweEFFLCAweEZFLCAweDkyLCAweDQwLCAweERBLCAweDE1LCAweEQ1LCAweEY0LCAweDM1LCAweDA2LAorCTB4MDAsIDB4RkQsIDB4MTQsIDB4MDEsIDB4Q0UsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsCisJMHgwMCwgMHg4RCwgMHhGRiwgMHg2MywgMHgwMSwgMHgyOCwgMHhGRCwgMHg3MSwgMHgwNCwgMHg5RSwgMHhGQSwKKwkweEM3LCAweDAzLCAweDc5LCAweDQyLCAweDBCLCAweDBGLCAweDk3LCAweEY2LCAweERBLCAweDA1LCAweEUyLAorCTB4RkMsIDB4NDgsIDB4MDEsIDB4QUQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwQiwgMHgwMCwgMHg5QSwgMHhGRiwgMHg1RiwgMHgwMSwgMHhFRiwgMHhGQywgMHg0RiwgMHgwNSwgMHg1QSwKKwkweEY4LCAweDlGLCAweDA5LCAweDBBLCAweDQzLCAweEFFLCAweDA4LCAweEIxLCAweEY4LCAweDMwLCAweDA1LAorCTB4RjUsIDB4RkMsIDB4NjEsIDB4MDEsIDB4OTcsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsCisJMHgwMCwgMHhCMSwgMHhGRiwgMHg0MSwgMHgwMSwgMHhFMywgMHhGQywgMHhFRCwgMHgwNSwgMHg0QywgMHhGNiwKKwkweDExLCAweDEwLCAweDQyLCAweDQyLCAweEYxLCAweDAyLCAweEZBLCAweEZBLCAweDRCLCAweDA0LCAweDM0LAorCTB4RkQsIDB4NjEsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjgsIDB4RkYsCisJMHhENCwgMHhGRiwgMHgwQSwgMHgwMSwgMHgwQSwgMHhGRCwgMHgzQywgMHgwNiwgMHg5QSwgMHhGNCwgMHhFRCwKKwkweDE2LCAweDJBLCAweDQwLCAweEY4LCAweEZELCAweDRELCAweEZELCAweDNDLCAweDAzLCAweDk3LCAweEZELAorCTB4NEMsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhCOCwgMHgwMCwgMHg2NywgMHhGRCwgMHgyQywgMHgwNiwgMHg2QiwgMHhGMywgMHhGQywgMHgxRCwKKwkweEQzLCAweDNDLCAweERGLCAweEY5LCAweDg5LCAweEZGLCAweDE4LCAweDAyLCAweDEzLCAweEZFLCAweDI2LAorCTB4MDEsIDB4OTIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzYsIDB4MDAsCisJMHg0RSwgMHgwMCwgMHhGQiwgMHhGRCwgMHhCNCwgMHgwNSwgMHhFNCwgMHhGMiwgMHgwNCwgMHgyNSwgMHg1RiwKKwkweDM4LCAweEI2LCAweEY2LCAweDkwLCAweDAxLCAweEYzLCAweDAwLCAweDlGLCAweEZFLCAweEYzLCAweDAwLAorCTB4OUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NzEsIDB4MDAsIDB4RDEsCisJMHhGRiwgMHhDMiwgMHhGRSwgMHhEMSwgMHgwNCwgMHgyMywgMHhGMywgMHhDOSwgMHgyQiwgMHhGNSwgMHgzMiwKKwkweDgzLCAweEY0LCAweDQ5LCAweDAzLCAweERDLCAweEZGLCAweDMwLCAweEZGLCAweEI4LCAweDAwLCAweEIwLAorCTB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjMsIDB4RkYsIDB4QUUsIDB4MDAsIDB4NDYsIDB4RkYsCisJMHhCNCwgMHhGRiwgMHg4NSwgMHgwMywgMHg0MiwgMHhGNCwgMHgwRSwgMHgzMiwgMHhDQSwgMHgyQywgMHg0MSwKKwkweEYzLCAweEE1LCAweDA0LCAweEU0LCAweEZFLCAweEJDLCAweEZGLCAweDdBLCAweDAwLCAweEMzLCAweEZGLAorCTB4MDcsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RUEsIDB4MDAsIDB4QjUsIDB4RkUsIDB4QzYsCisJMHgwMCwgMHhEOSwgMHgwMSwgMHg0RiwgMHhGNiwgMHg5OSwgMHgzNywgMHgxNiwgMHgyNiwgMHhFMCwgMHhGMiwKKwkweDk4LCAweDA1LCAweDE2LCAweEZFLCAweDNDLCAweDAwLCAweDNGLCAweDAwLCAweEQ2LCAweEZGLCAweDA0LAorCTB4MDAsIDB4MEYsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUYsIDB4MDEsIDB4MjgsIDB4RkUsIDB4RUIsIDB4MDEsCisJMHhERCwgMHhGRiwgMHg1MiwgMHhGOSwgMHgzNiwgMHgzQywgMHgxMywgMHgxRiwgMHg0QiwgMHhGMywgMHgyMCwKKwkweDA2LCAweDdCLCAweEZELCAweEE5LCAweDAwLCAweDA4LCAweDAwLCAweEU3LCAweEZGLCAweDAyLCAweDAwLAorCTB4MTEsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDcsIDB4MDEsIDB4QTksIDB4RkQsIDB4MTAsIDB4MDMsIDB4QTgsCisJMHhGRCwgMHg0NywgMHhGRCwgMHhCQiwgMHgzRiwgMHgwMSwgMHgxOCwgMHg2MiwgMHhGNCwgMHg0MCwgMHgwNiwKKwkweDE1LCAweEZELCAweEZGLCAweDAwLCAweERBLCAweEZGLCAweEY2LCAweEZGLCAweDAxLCAweDAwLCAweDEwLAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4NUYsIDB4MDEsIDB4NDEsIDB4RkQsIDB4MjMsIDB4MDQsIDB4NTYsIDB4RkIsCisJMHgxRiwgMHgwMiwgMHgwNiwgMHg0MiwgMHgxOSwgMHgxMSwgMHgwMiwgMHhGNiwgMHhGRiwgMHgwNSwgMHhFNSwKKwkweEZDLCAweDNCLCAweDAxLCAweEI2LCAweEZGLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLAorCTB4OTUsIDB4RkYsIDB4NjIsIDB4MDEsIDB4RkMsIDB4RkMsIDB4MTAsIDB4MDUsIDB4MDksIDB4RjksIDB4QzEsCisJMHgwNywgMHgwMywgMHg0MywgMHg5NCwgMHgwQSwgMHgwNSwgMHhGOCwgMHg2QywgMHgwNSwgMHhFQSwgMHhGQywKKwkweDVDLCAweDAxLCAweDlELCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LAorCTB4MDAsIDB4QTksIDB4RkYsIDB4NEQsIDB4MDEsIDB4RTEsIDB4RkMsIDB4QzQsIDB4MDUsIDB4RTYsIDB4RjYsCisJMHgwOCwgMHgwRSwgMHhBNSwgMHg0MiwgMHhBMSwgMHgwNCwgMHg0MywgMHhGQSwgMHg5NywgMHgwNCwgMHgxRCwKKwkweEZELCAweDY0LCAweDAxLCAweDhGLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEZGLAorCTB4QzgsIDB4RkYsIDB4MUUsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MkQsIDB4MDYsIDB4MTMsIDB4RjUsIDB4QzgsCisJMHgxNCwgMHhGMiwgMHg0MCwgMHg2OSwgMHhGRiwgMHg5NywgMHhGQywgMHg5MiwgMHgwMywgMHg3NSwgMHhGRCwKKwkweDU1LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVGLCAweEZGLCAweEYyLAorCTB4RkYsIDB4RDQsIDB4MDAsIDB4NDUsIDB4RkQsIDB4M0IsIDB4MDYsIDB4QjgsIDB4RjMsIDB4Q0UsIDB4MUIsCisJMHhGQiwgMHgzRCwgMHgwOCwgMHhGQiwgMHhERSwgMHhGRSwgMHg3MywgMHgwMiwgMHhFQiwgMHhGRCwgMHgzMywKKwkweDAxLCAweDhGLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERFLCAweEZGLCAweDI1LCAweDAwLAorCTB4NzEsIDB4MDAsIDB4QzgsIDB4RkQsIDB4RTUsIDB4MDUsIDB4RkEsIDB4RjIsIDB4REYsIDB4MjIsIDB4REIsCisJMHgzOSwgMHg5NCwgMHhGNywgMHhGNywgMHgwMCwgMHg0QywgMHgwMSwgMHg3MywgMHhGRSwgMHgwMywgMHgwMSwKKwkweDlBLCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENDLCAweEZGLCAweDVFLCAweDAwLCAweEY5LAorCTB4RkYsIDB4ODAsIDB4RkUsIDB4MjMsIDB4MDUsIDB4RjksIDB4RjIsIDB4QzAsIDB4MjksIDB4QjgsIDB4MzQsCisJMHgxNiwgMHhGNSwgMHhDQiwgMHgwMiwgMHgyRiwgMHgwMCwgMHgwMywgMHhGRiwgMHhDQSwgMHgwMCwgMHhBQSwKKwkweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEI4LCAweEZGLCAweDlCLCAweDAwLCAweDcyLCAweEZGLAorCTB4NjUsIDB4RkYsIDB4RjYsIDB4MDMsIDB4RDEsIDB4RjMsIDB4MzEsIDB4MzAsIDB4QzEsIDB4MkUsIDB4OEIsCisJMHhGMywgMHg0NSwgMHgwNCwgMHgyRCwgMHhGRiwgMHg5MiwgMHhGRiwgMHg4RCwgMHgwMCwgMHhCRCwgMHhGRiwKKwkweDA4LCAweDAwLCAweDBDLCAweDAwLCAweEE2LCAweEZGLCAweEQ4LCAweDAwLCAweEUyLCAweEZFLCAweDZGLAorCTB4MDAsIDB4NjYsIDB4MDIsIDB4OTMsIDB4RjUsIDB4RkIsIDB4MzUsIDB4MzEsIDB4MjgsIDB4RTcsIDB4RjIsCisJMHg1OSwgMHgwNSwgMHg1MSwgMHhGRSwgMHgxNywgMHgwMCwgMHg1MCwgMHgwMCwgMHhEMCwgMHhGRiwgMHgwNSwKKwkweDAwLCAweDBFLCAweDAwLCAweDk3LCAweEZGLCAweDBGLCAweDAxLCAweDUzLCAweEZFLCAweDkwLCAweDAxLAorCTB4ODEsIDB4MDAsIDB4NEIsIDB4RjgsIDB4RTYsIDB4M0EsIDB4M0YsIDB4MjEsIDB4MTYsIDB4RjMsIDB4MDIsCisJMHgwNiwgMHhBNSwgMHhGRCwgMHg4QSwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwMiwgMHgwMCwKKwkweDEwLCAweDAwLCAweDhELCAweEZGLCAweDNDLCAweDAxLCAweENFLCAweEZELCAweEI3LCAweDAyLCAweDVBLAorCTB4RkUsIDB4RjcsIDB4RkIsIDB4QzYsIDB4M0UsIDB4MkMsIDB4MUEsIDB4RkMsIDB4RjMsIDB4NDEsIDB4MDYsCisJMHgyRSwgMHhGRCwgMHhFNywgMHgwMCwgMHhFNywgMHhGRiwgMHhGMiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwKKwkweDAwLCAweDhCLCAweEZGLCAweDVBLCAweDAxLCAweDVFLCAweEZELCAweEQyLCAweDAzLCAweDBFLCAweEZDLAorCTB4OEIsIDB4MDAsIDB4NzUsIDB4NDEsIDB4MzIsIDB4MTMsIDB4NzUsIDB4RjUsIDB4MUMsIDB4MDYsIDB4RUUsCisJMHhGQywgMHgyQiwgMHgwMSwgMHhDMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwKKwkweDkxLCAweEZGLCAweDY0LCAweDAxLCAweDBELCAweEZELCAweENELCAweDA0LCAweEJCLCAweEY5LCAweEYyLAorCTB4MDUsIDB4RDksIDB4NDIsIDB4ODgsIDB4MEMsIDB4NUUsIDB4RjcsIDB4QTEsIDB4MDUsIDB4RTMsIDB4RkMsCisJMHg1NCwgMHgwMSwgMHhBMywgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwKKwkweDAwLCAweEEyLCAweEZGLCAweDU2LCAweDAxLCAweEU1LCAweEZDLCAweDk0LCAweDA1LCAweDg3LCAweEY3LAorCTB4MEEsIDB4MEMsIDB4RTYsIDB4NDIsIDB4NjQsIDB4MDYsIDB4OEUsIDB4RjksIDB4REUsIDB4MDQsIDB4MDksCisJMHhGRCwgMHg2NCwgMHgwMSwgMHg5MiwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEJELCAweEZGLCAweDJGLCAweDAxLCAweEVDLCAweEZDLCAweDE2LCAweDA2LCAweDk4LCAweEY1LCAweEFCLAorCTB4MTIsIDB4OUMsIDB4NDEsIDB4RUUsIDB4MDAsIDB4RTAsIDB4RkIsIDB4RTYsIDB4MDMsIDB4NTcsIDB4RkQsCisJMHg1QiwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMywgMHhGRiwgMHhFNCwKKwkweEZGLCAweEVELCAweDAwLCAweDI3LCAweEZELCAweDQxLCAweDA2LCAweDE0LCAweEY0LCAweEExLCAweDE5LAorCTB4MDYsIDB4M0YsIDB4NDksIDB4RkMsIDB4MkUsIDB4RkUsIDB4Q0QsIDB4MDIsIDB4QzQsIDB4RkQsIDB4M0YsCisJMHgwMSwgMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFMywgMHhGRiwgMHgxNCwgMHgwMCwKKwkweDkyLCAweDAwLCAweDlBLCAweEZELCAweDBBLCAweDA2LCAweDIyLCAweEYzLCAweEI0LCAweDIwLCAweDNDLAorCTB4M0IsIDB4OEIsIDB4RjgsIDB4NTgsIDB4MDAsIDB4QTcsIDB4MDEsIDB4NDgsIDB4RkUsIDB4MTMsIDB4MDEsCisJMHg5NiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEMSwgMHhGRiwgMHg0QywgMHgwMCwgMHgyMCwKKwkweDAwLCAweDQyLCAweEZFLCAweDZBLCAweDA1LCAweEUzLCAweEYyLCAweEFCLCAweDI3LCAweDY2LCAweDM2LAorCTB4QzAsIDB4RjUsIDB4NDQsIDB4MDIsIDB4ODUsIDB4MDAsIDB4RDcsIDB4RkUsIDB4REQsIDB4MDAsIDB4QTUsCisJMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhCRSwgMHhGRiwgMHg4OSwgMHgwMCwgMHg5RCwgMHhGRiwKKwkweDFBLCAweEZGLCAweDVFLCAweDA0LCAweDc2LCAweEYzLCAweDQ1LCAweDJFLCAweEFBLCAweDMwLCAweEVCLAorCTB4RjMsIDB4REIsIDB4MDMsIDB4NzksIDB4RkYsIDB4NjcsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjcsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBQywgMHhGRiwgMHhDNiwgMHgwMCwgMHgwRSwgMHhGRiwgMHgxQSwKKwkweDAwLCAweEVCLCAweDAyLCAweEVGLCAweEY0LCAweDQ5LCAweDM0LCAweDQzLCAweDJBLCAweDAyLCAweEYzLAorCTB4MEYsIDB4MDUsIDB4OTAsIDB4RkUsIDB4RUYsIDB4RkYsIDB4NjMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHgwRSwgMHgwMCwgMHg5QiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHhGRSwgMHgzNiwgMHgwMSwKKwkweDFFLCAweDAxLCAweDVCLCAweEY3LCAweDdFLCAweDM5LCAweDY5LCAweDIzLCAweEYzLCAweEYyLCAweEQ5LAorCTB4MDUsIDB4RDQsIDB4RkQsIDB4NjksIDB4MDAsIDB4MjksIDB4MDAsIDB4REQsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgzMCwgMHgwMSwgMHhGNSwgMHhGRCwgMHg1QywgMHgwMiwgMHgwOSwKKwkweEZGLCAweEJDLCAweEZBLCAweEI1LCAweDNELCAweDVBLCAweDFDLCAweEEzLCAweEYzLCAweDM4LCAweDA2LAorCTB4NEQsIDB4RkQsIDB4Q0QsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTEsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHg1MywgMHgwMSwgMHg3RSwgMHhGRCwgMHg3RCwgMHgwMywgMHhDNSwgMHhGQywKKwkweDBCLCAweEZGLCAweEMzLCAweDQwLCAweDUxLCAweDE1LCAweEY0LCAweEY0LCAweDMxLCAweDA2LCAweEZDLAorCTB4RkMsIDB4MTksIDB4MDEsIDB4Q0IsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsCisJMHg4RSwgMHhGRiwgMHg2MywgMHgwMSwgMHgyMiwgMHhGRCwgMHg4NCwgMHgwNCwgMHg3MSwgMHhGQSwgMHgzNCwKKwkweDA0LCAweDkwLCAweDQyLCAweDg5LCAweDBFLCAweEJFLCAweEY2LCAweENGLCAweDA1LCAweEUxLCAweEZDLAorCTB4NEEsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsCisJMHgwMCwgMHg5QiwgMHhGRiwgMHg1RCwgMHgwMSwgMHhFQywgMHhGQywgMHg1RCwgMHgwNSwgMHgyRiwgMHhGOCwKKwkweDE5LCAweDBBLCAweDA3LCAweDQzLCAweDM3LCAweDA4LCAweERELCAweEY4LCAweDIxLCAweDA1LCAweEY4LAorCTB4RkMsIDB4NjIsIDB4MDEsIDB4OTYsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsCisJMHhCNCwgMHhGRiwgMHgzRSwgMHgwMSwgMHhFNCwgMHhGQywgMHhGNiwgMHgwNSwgMHgyNiwgMHhGNiwgMHg5NSwKKwkweDEwLCAweDI2LCAweDQyLCAweDg3LCAweDAyLCAweDI4LCAweEZCLCAweDM3LCAweDA0LCAweDNCLCAweEZELAorCTB4NjAsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RDcsCisJMHhGRiwgMHgwNCwgMHgwMSwgMHgwRiwgMHhGRCwgMHgzRSwgMHgwNiwgMHg3RCwgMHhGNCwgMHg3NiwgMHgxNywKKwkweEY0LCAweDNGLCAweDlGLCAweEZELCAweDdCLCAweEZELCAweDI2LCAweDAzLCAweEEwLCAweEZELCAweDRBLAorCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDQsIDB4MDAsCisJMHhCMSwgMHgwMCwgMHg3MSwgMHhGRCwgMHgyNiwgMHgwNiwgMHg1QSwgMHhGMywgMHg4OCwgMHgxRSwgMHg4NywKKwkweDNDLCAweDk4LCAweEY5LCAweEIzLCAweEZGLCAweDAyLCAweDAyLCAweDFFLCAweEZFLCAweDIyLCAweDAxLAorCTB4OTMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0EsIDB4MDAsIDB4NDUsCisJMHgwMCwgMHgwOSwgMHhGRSwgMHhBNywgMHgwNSwgMHhFMSwgMHhGMiwgMHg4RCwgMHgyNSwgMHhGRCwgMHgzNywKKwkweDgyLCAweEY2LCAweEI1LCAweDAxLCAweERDLCAweDAwLCAweEFBLCAweEZFLCAweEVFLCAweDAwLCAweEEwLAorCTB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzcsIDB4RkYsCisJMHhEMywgMHhGRSwgMHhCQywgMHgwNCwgMHgzMSwgMHhGMywgMHg0QSwgMHgyQywgMHg4MywgMHgzMiwgMHg2MSwKKwkweEY0LCAweDY4LCAweDAzLCAweEM4LCAweEZGLCAweDNCLCAweEZGLCAweEIzLCAweDAwLCAweEIxLCAweEZGLAorCTB4MEEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QjMsIDB4MDAsIDB4M0IsIDB4RkYsIDB4QzgsCisJMHhGRiwgMHg2OCwgMHgwMywgMHg2MSwgMHhGNCwgMHg4MywgMHgzMiwgMHg0QSwgMHgyQywgMHgzMSwgMHhGMywKKwkweEJDLCAweDA0LCAweEQzLCAweEZFLCAweEM3LCAweEZGLCAweDc2LCAweDAwLCAweEM0LCAweEZGLCAweDA2LAorCTB4MDAsIDB4MEQsIDB4MDAsIDB4QTAsIDB4RkYsIDB4RUUsIDB4MDAsIDB4QUEsIDB4RkUsIDB4REMsIDB4MDAsCisJMHhCNSwgMHgwMSwgMHg4MiwgMHhGNiwgMHhGRCwgMHgzNywgMHg4RCwgMHgyNSwgMHhFMSwgMHhGMiwgMHhBNywKKwkweDA1LCAweDA5LCAweEZFLCAweDQ1LCAweDAwLCAweDNBLCAweDAwLCAweEQ3LCAweEZGLCAweDA0LCAweDAwLAorCTB4MEYsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MjIsIDB4MDEsIDB4MUUsIDB4RkUsIDB4MDIsIDB4MDIsIDB4QjMsCisJMHhGRiwgMHg5OCwgMHhGOSwgMHg4NywgMHgzQywgMHg4OCwgMHgxRSwgMHg1QSwgMHhGMywgMHgyNiwgMHgwNiwKKwkweDcxLCAweEZELCAweEIxLCAweDAwLCAweDA0LCAweDAwLCAweEU5LCAweEZGLCAweDAyLCAweDAwLCAweDExLAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4NEEsIDB4MDEsIDB4QTAsIDB4RkQsIDB4MjYsIDB4MDMsIDB4N0IsIDB4RkQsCisJMHg5RiwgMHhGRCwgMHhGNCwgMHgzRiwgMHg3NiwgMHgxNywgMHg3RCwgMHhGNCwgMHgzRSwgMHgwNiwgMHgwRiwKKwkweEZELCAweDA0LCAweDAxLCAweEQ3LCAweEZGLCAweEY3LCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLAorCTB4OEMsIDB4RkYsIDB4NjAsIDB4MDEsIDB4M0IsIDB4RkQsIDB4MzcsIDB4MDQsIDB4MjgsIDB4RkIsIDB4ODcsCisJMHgwMiwgMHgyNiwgMHg0MiwgMHg5NSwgMHgxMCwgMHgyNiwgMHhGNiwgMHhGNiwgMHgwNSwgMHhFNCwgMHhGQywKKwkweDNFLCAweDAxLCAweEI0LCAweEZGLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDk2LAorCTB4RkYsIDB4NjIsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MjEsIDB4MDUsIDB4REQsIDB4RjgsIDB4MzcsIDB4MDgsCisJMHgwNywgMHg0MywgMHgxOSwgMHgwQSwgMHgyRiwgMHhGOCwgMHg1RCwgMHgwNSwgMHhFQywgMHhGQywgMHg1RCwKKwkweDAxLCAweDlCLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAorCTB4QUIsIDB4RkYsIDB4NEEsIDB4MDEsIDB4RTEsIDB4RkMsIDB4Q0YsIDB4MDUsIDB4QkUsIDB4RjYsIDB4ODksCisJMHgwRSwgMHg5MCwgMHg0MiwgMHgzNCwgMHgwNCwgMHg3MSwgMHhGQSwgMHg4NCwgMHgwNCwgMHgyMiwgMHhGRCwKKwkweDYzLCAweDAxLCAweDhFLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweENCLAorCTB4RkYsIDB4MTksIDB4MDEsIDB4RkMsIDB4RkMsIDB4MzEsIDB4MDYsIDB4RjQsIDB4RjQsIDB4NTEsIDB4MTUsCisJMHhDMywgMHg0MCwgMHgwQiwgMHhGRiwgMHhDNSwgMHhGQywgMHg3RCwgMHgwMywgMHg3RSwgMHhGRCwgMHg1MywKKwkweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVELCAweEZGLCAweEY1LCAweEZGLAorCTB4Q0QsIDB4MDAsIDB4NEQsIDB4RkQsIDB4MzgsIDB4MDYsIDB4QTMsIDB4RjMsIDB4NUEsIDB4MUMsIDB4QjUsCisJMHgzRCwgMHhCQywgMHhGQSwgMHgwOSwgMHhGRiwgMHg1QywgMHgwMiwgMHhGNSwgMHhGRCwgMHgzMCwgMHgwMSwKKwkweDkwLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERELCAweEZGLCAweDI5LCAweDAwLCAweDY5LAorCTB4MDAsIDB4RDQsIDB4RkQsIDB4RDksIDB4MDUsIDB4RjMsIDB4RjIsIDB4NjksIDB4MjMsIDB4N0UsIDB4MzksCisJMHg1QiwgMHhGNywgMHgxRSwgMHgwMSwgMHgzNiwgMHgwMSwgMHg3RSwgMHhGRSwgMHhGRiwgMHgwMCwgMHg5QiwKKwkweEZGLCAweDBFLCAweDAwLCAweDA2LCAweDAwLCAweENBLCAweEZGLCAweDYzLCAweDAwLCAweEVGLCAweEZGLAorCTB4OTAsIDB4RkUsIDB4MEYsIDB4MDUsIDB4MDIsIDB4RjMsIDB4NDMsIDB4MkEsIDB4NDksIDB4MzQsIDB4RUYsCisJMHhGNCwgMHhFQiwgMHgwMiwgMHgxQSwgMHgwMCwgMHgwRSwgMHhGRiwgMHhDNiwgMHgwMCwgMHhBQywgMHhGRiwKKwkweDBCLCAweDAwLCAweDA5LCAweDAwLCAweEI3LCAweEZGLCAweEEwLCAweDAwLCAweDY3LCAweEZGLCAweDc5LAorCTB4RkYsIDB4REIsIDB4MDMsIDB4RUIsIDB4RjMsIDB4QUEsIDB4MzAsIDB4NDUsIDB4MkUsIDB4NzYsIDB4RjMsCisJMHg1RSwgMHgwNCwgMHgxQSwgMHhGRiwgMHg5RCwgMHhGRiwgMHg4OSwgMHgwMCwgMHhCRSwgMHhGRiwgMHgwNywKKwkweDAwLCAweDBDLCAweDAwLCAweEE1LCAweEZGLCAweERELCAweDAwLCAweEQ3LCAweEZFLCAweDg1LCAweDAwLAorCTB4NDQsIDB4MDIsIDB4QzAsIDB4RjUsIDB4NjYsIDB4MzYsIDB4QUIsIDB4MjcsIDB4RTMsIDB4RjIsIDB4NkEsCisJMHgwNSwgMHg0MiwgMHhGRSwgMHgyMCwgMHgwMCwgMHg0QywgMHgwMCwgMHhEMSwgMHhGRiwgMHgwNCwgMHgwMCwKKwkweDBGLCAweDAwLCAweDk2LCAweEZGLCAweDEzLCAweDAxLCAweDQ4LCAweEZFLCAweEE3LCAweDAxLCAweDU4LAorCTB4MDAsIDB4OEIsIDB4RjgsIDB4M0MsIDB4M0IsIDB4QjQsIDB4MjAsIDB4MjIsIDB4RjMsIDB4MEEsIDB4MDYsCisJMHg5QSwgMHhGRCwgMHg5MiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhFMywgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMCwKKwkweDAwLCAweDhELCAweEZGLCAweDNGLCAweDAxLCAweEM0LCAweEZELCAweENELCAweDAyLCAweDJFLCAweEZFLAorCTB4NDksIDB4RkMsIDB4MDYsIDB4M0YsIDB4QTEsIDB4MTksIDB4MTQsIDB4RjQsIDB4NDEsIDB4MDYsIDB4MjcsCisJMHhGRCwgMHhFRCwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGMywgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKKwkweDhCLCAweEZGLCAweDVCLCAweDAxLCAweDU3LCAweEZELCAweEU2LCAweDAzLCAweEUwLCAweEZCLCAweEVFLAorCTB4MDAsIDB4OUMsIDB4NDEsIDB4QUIsIDB4MTIsIDB4OTgsIDB4RjUsIDB4MTYsIDB4MDYsIDB4RUMsIDB4RkMsCisJMHgyRiwgMHgwMSwgMHhCRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5MiwKKwkweEZGLCAweDY0LCAweDAxLCAweDA5LCAweEZELCAweERFLCAweDA0LCAweDhFLCAweEY5LCAweDY0LCAweDA2LAorCTB4RTYsIDB4NDIsIDB4MEEsIDB4MEMsIDB4ODcsIDB4RjcsIDB4OTQsIDB4MDUsIDB4RTUsIDB4RkMsIDB4NTYsCisJMHgwMSwgMHhBMiwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwKKwkweEEzLCAweEZGLCAweDU0LCAweDAxLCAweEUzLCAweEZDLCAweEExLCAweDA1LCAweDVFLCAweEY3LCAweDg4LAorCTB4MEMsIDB4RDksIDB4NDIsIDB4RjIsIDB4MDUsIDB4QkIsIDB4RjksIDB4Q0QsIDB4MDQsIDB4MEQsIDB4RkQsCisJMHg2NCwgMHgwMSwgMHg5MSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDMCwKKwkweEZGLCAweDJCLCAweDAxLCAweEVFLCAweEZDLCAweDFDLCAweDA2LCAweDc1LCAweEY1LCAweDMyLCAweDEzLAorCTB4NzUsIDB4NDEsIDB4OEIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4RDIsIDB4MDMsIDB4NUUsIDB4RkQsIDB4NUEsCisJMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhFNywgMHhGRiwKKwkweEU3LCAweDAwLCAweDJFLCAweEZELCAweDQxLCAweDA2LCAweEZDLCAweEYzLCAweDJDLCAweDFBLCAweEM2LAorCTB4M0UsIDB4RjcsIDB4RkIsIDB4NUEsIDB4RkUsIDB4QjcsIDB4MDIsIDB4Q0UsIDB4RkQsIDB4M0MsIDB4MDEsCisJMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFMiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4QSwKKwkweDAwLCAweEE1LCAweEZELCAweDAyLCAweDA2LCAweDE2LCAweEYzLCAweDNGLCAweDIxLCAweEU2LCAweDNBLAorCTB4NEIsIDB4RjgsIDB4ODEsIDB4MDAsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkUsIDB4MEYsIDB4MDEsIDB4OTcsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MCwgMHgwMCwgMHgxNywgMHgwMCwKKwkweDUxLCAweEZFLCAweDU5LCAweDA1LCAweEU3LCAweEYyLCAweDMxLCAweDI4LCAweEZCLCAweDM1LCAweDkzLAorCTB4RjUsIDB4NjYsIDB4MDIsIDB4NkYsIDB4MDAsIDB4RTIsIDB4RkUsIDB4RDgsIDB4MDAsIDB4QTYsIDB4RkYsCisJMHgwQywgMHgwMCwgMHgwOCwgMHgwMCwgMHhCRCwgMHhGRiwgMHg4RCwgMHgwMCwgMHg5MiwgMHhGRiwgMHgyRCwKKwkweEZGLCAweDQ1LCAweDA0LCAweDhCLCAweEYzLCAweEMxLCAweDJFLCAweDMxLCAweDMwLCAweEQxLCAweEYzLAorCTB4RjYsIDB4MDMsIDB4NjUsIDB4RkYsIDB4NzIsIDB4RkYsIDB4OUIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDgsCisJMHgwMCwgMHgwQiwgMHgwMCwgMHhBQSwgMHhGRiwgMHhDQSwgMHgwMCwgMHgwMywgMHhGRiwgMHgyRiwgMHgwMCwKKwkweENCLCAweDAyLCAweDE2LCAweEY1LCAweEI4LCAweDM0LCAweEMwLCAweDI5LCAweEY5LCAweEYyLCAweDIzLAorCTB4MDUsIDB4ODAsIDB4RkUsIDB4RjksIDB4RkYsIDB4NUUsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHgwRSwgMHgwMCwgMHg5QSwgMHhGRiwgMHgwMywgMHgwMSwgMHg3MywgMHhGRSwgMHg0QywgMHgwMSwgMHhGNywKKwkweDAwLCAweDk0LCAweEY3LCAweERCLCAweDM5LCAweERGLCAweDIyLCAweEZBLCAweEYyLCAweEU1LCAweDA1LAorCTB4QzgsIDB4RkQsIDB4NzEsIDB4MDAsIDB4MjUsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MTAsCisJMHgwMCwgMHg4RiwgMHhGRiwgMHgzMywgMHgwMSwgMHhFQiwgMHhGRCwgMHg3MywgMHgwMiwgMHhERSwgMHhGRSwKKwkweDA4LCAweEZCLCAweEZCLCAweDNELCAweENFLCAweDFCLCAweEI4LCAweEYzLCAweDNCLCAweDA2LCAweDQ1LAorCTB4RkQsIDB4RDQsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHg4QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHg3NSwgMHhGRCwgMHg5MiwgMHgwMywgMHg5NywgMHhGQywgMHg2OSwKKwkweEZGLCAweEYyLCAweDQwLCAweEM4LCAweDE0LCAweDEzLCAweEY1LCAweDJELCAweDA2LCAweEY4LCAweEZDLAorCTB4MUUsIDB4MDEsIDB4QzgsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OEYsCisJMHhGRiwgMHg2NCwgMHgwMSwgMHgxRCwgMHhGRCwgMHg5NywgMHgwNCwgMHg0MywgMHhGQSwgMHhBMSwgMHgwNCwKKwkweEE1LCAweDQyLCAweDA4LCAweDBFLCAweEU2LCAweEY2LCAweEM0LCAweDA1LCAweEUxLCAweEZDLCAweDRELAorCTB4MDEsIDB4QTksIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsCisJMHg5RCwgMHhGRiwgMHg1QywgMHgwMSwgMHhFQSwgMHhGQywgMHg2QywgMHgwNSwgMHgwNSwgMHhGOCwgMHg5NCwKKwkweDBBLCAweDAzLCAweDQzLCAweEMxLCAweDA3LCAweDA5LCAweEY5LCAweDEwLCAweDA1LCAweEZDLCAweEZDLAorCTB4NjIsIDB4MDEsIDB4OTUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QjYsCisJMHhGRiwgMHgzQiwgMHgwMSwgMHhFNSwgMHhGQywgMHhGRiwgMHgwNSwgMHgwMiwgMHhGNiwgMHgxOSwgMHgxMSwKKwkweDA2LCAweDQyLCAweDFGLCAweDAyLCAweDU2LCAweEZCLCAweDIzLCAweDA0LCAweDQxLCAweEZELCAweDVGLAorCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjYsIDB4RkYsIDB4REEsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgxNSwgMHhGRCwgMHg0MCwgMHgwNiwgMHg2MiwgMHhGNCwgMHgwMSwgMHgxOCwgMHhCQiwKKwkweDNGLCAweDQ3LCAweEZELCAweEE4LCAweEZELCAweDEwLCAweDAzLCAweEE5LCAweEZELCAweDQ3LCAweDAxLAorCTB4OEMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDgsIDB4MDAsIDB4QTksCisJMHgwMCwgMHg3QiwgMHhGRCwgMHgyMCwgMHgwNiwgMHg0QiwgMHhGMywgMHgxMywgMHgxRiwgMHgzNiwgMHgzQywKKwkweDUyLCAweEY5LCAweERELCAweEZGLCAweEVCLCAweDAxLCAweDI4LCAweEZFLCAweDFGLCAweDAxLCAweDkzLAorCTB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDYsIDB4RkYsIDB4M0YsIDB4MDAsIDB4M0MsIDB4MDAsCisJMHgxNiwgMHhGRSwgMHg5OCwgMHgwNSwgMHhFMCwgMHhGMiwgMHgxNiwgMHgyNiwgMHg5OSwgMHgzNywgMHg0RiwKKwkweEY2LCAweEQ5LCAweDAxLCAweEM2LCAweDAwLCAweEI1LCAweEZFLCAweEVBLCAweDAwLCAweEExLCAweEZGLAorCTB4MEQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzMsIDB4RkYsIDB4N0EsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RTQsCisJMHhGRSwgMHhBNSwgMHgwNCwgMHg0MSwgMHhGMywgMHhDQSwgMHgyQywgMHgwRSwgMHgzMiwgMHg0MiwgMHhGNCwKKwkweDg1LCAweDAzLCAweEI0LCAweEZGLCAweDQ2LCAweEZGLCAweEFFLCAweDAwLCAweEIzLCAweEZGLCAweDA5LAorCTB4MDAsIDB4MEEsIDB4MDAsIDB4QjAsIDB4RkYsIDB4QjgsIDB4MDAsIDB4MzAsIDB4RkYsIDB4REMsIDB4RkYsCisJMHg0OSwgMHgwMywgMHg4MywgMHhGNCwgMHhGNSwgMHgzMiwgMHhDOSwgMHgyQiwgMHgyMywgMHhGMywgMHhEMSwKKwkweDA0LCAweEMyLCAweEZFLCAweEQxLCAweEZGLCAweDcxLCAweDAwLCAweEM2LCAweEZGLCAweDA2LCAweDAwLAorCTB4MEQsIDB4MDAsIDB4OUYsIDB4RkYsIDB4RjMsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RjMsIDB4MDAsIDB4OTAsCisJMHgwMSwgMHhCNiwgMHhGNiwgMHg1RiwgMHgzOCwgMHgwNCwgMHgyNSwgMHhFNCwgMHhGMiwgMHhCNCwgMHgwNSwKKwkweEZCLCAweEZELCAweDRFLCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZGLCAweDA0LCAweDAwLCAweDBGLAorCTB4MDAsIDB4OTIsIDB4RkYsIDB4MjYsIDB4MDEsIDB4MTMsIDB4RkUsIDB4MTgsIDB4MDIsIDB4ODksIDB4RkYsCisJMHhERiwgMHhGOSwgMHhEMywgMHgzQywgMHhGQywgMHgxRCwgMHg2QiwgMHhGMywgMHgyQywgMHgwNiwgMHg2NywKKwkweEZELCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEZGLCAweDAyLCAweDAwLCAweDExLCAweDAwLAorCTB4OEIsIDB4RkYsIDB4NEMsIDB4MDEsIDB4OTcsIDB4RkQsIDB4M0MsIDB4MDMsIDB4NEQsIDB4RkQsIDB4RjgsCisJMHhGRCwgMHgyQSwgMHg0MCwgMHhFRCwgMHgxNiwgMHg5QSwgMHhGNCwgMHgzQywgMHgwNiwgMHgwQSwgMHhGRCwKKwkweDBBLCAweDAxLCAweEQ0LCAweEZGLCAweEY4LCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLCAweDhDLAorCTB4RkYsIDB4NjEsIDB4MDEsIDB4MzQsIDB4RkQsIDB4NEIsIDB4MDQsIDB4RkEsIDB4RkEsIDB4RjEsIDB4MDIsCisJMHg0MiwgMHg0MiwgMHgxMSwgMHgxMCwgMHg0QywgMHhGNiwgMHhFRCwgMHgwNSwgMHhFMywgMHhGQywgMHg0MSwKKwkweDAxLCAweEIxLCAweEZGLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDk3LCAweEZGLAorCTB4NjEsIDB4MDEsIDB4RjUsIDB4RkMsIDB4MzAsIDB4MDUsIDB4QjEsIDB4RjgsIDB4QUUsIDB4MDgsIDB4MEEsCisJMHg0MywgMHg5RiwgMHgwOSwgMHg1QSwgMHhGOCwgMHg0RiwgMHgwNSwgMHhFRiwgMHhGQywgMHg1RiwgMHgwMSwKKwkweDlBLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweEFELAorCTB4RkYsIDB4NDgsIDB4MDEsIDB4RTIsIDB4RkMsIDB4REEsIDB4MDUsIDB4OTcsIDB4RjYsIDB4MEIsIDB4MEYsCisJMHg3OSwgMHg0MiwgMHhDNywgMHgwMywgMHg5RSwgMHhGQSwgMHg3MSwgMHgwNCwgMHgyOCwgMHhGRCwgMHg2MywKKwkweDAxLCAweDhELCAweEZGLCAweDBGLCAweDAwIAorfTsKKworc3RhdGljIHUxNgorY29lZmZpY2llbnRfc2l6ZXNbOCAqIDJdID0geworCS8qIFBsYXliYWNrICovCisJMHgwMEMwLCAweDUwMDAsIDB4MDA2MCwgMHgyODAwLCAweDAwNDAsIDB4MDA2MCwgMHgxNDAwLCAweDAwMDAsCisJLyogY2FwdHVyZSAqLworCTB4MDAyMCwgMHgxMjYwLCAweDAwMjAsIDB4MTI2MCwgMHgwMDAwLCAweDAwNDAsIDB4MTI2MCwgMHgwMDAwLAorfTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTMyLmMgYi9zb3VuZC9wY2kvcm1lMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZhY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3JtZTMyLmMKQEAgLTAsMCArMSwyMDQzIEBACisvKgorICogICBBTFNBIGRyaXZlciBmb3IgUk1FIERpZ2kzMiwgRGlnaTMyLzggYW5kIERpZ2kzMiBQUk8gYXVkaW8gaW50ZXJmYWNlcworICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWxvIENoYW1iZXJ0IDxwaWxvLmNAd2FuYWRvby5mcj4KKyAqCisgKiAgICAgIFRoYW5rcyB0byA6ICAgICAgICBBbmRlcnMgVG9yZ2VyIDx0b3JnZXJAbHVkZC5sdXRoLnNlPiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEhlbmsgSGVzc2VsaW5rIDxoZW5rQGFuZGEubmw+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd3JpdGluZyB0aGUgZGlnaTk2LWRyaXZlciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBSTUUgZm9yIGFsbCBpbmZvcm1hdGlvbnMuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiAKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogTm90ZSAjMSAiU2VrJ2QgbW9kZWxzIiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBtYXJ0aW4gMjAwMi0xMi0wNworICogCisgKiBJZGVudGljYWwgc291bmRjYXJkcyBieSBTZWsnZCB3ZXJlIGxhYmVsZWQ6CisgKiBSTUUgRGlnaSAzMiAgICAgPSBTZWsnZCBQcm9kaWYgMzIKKyAqIFJNRSBEaWdpIDMyIFBybyA9IFNlaydkIFByb2RpZiA5NgorICogUk1FIERpZ2kgMzIvOCAgID0gU2VrJ2QgUHJvZGlmIEdvbGQKKyAqIAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBOb3RlICMyICJmdWxsIGR1cGxleCBtb2RlIiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIG1hcnRpbiAyMDAyLTEyLTA3CisgKiAKKyAqIEZ1bGwgZHVwbGV4IGRvZXNuJ3Qgd29yay4gQWxsIGNhcmRzICgzMiwgMzIvOCwgMzJQcm8pIGFyZSB3b3JraW5nIGlkZW50aWNhbAorICogaW4gdGhpcyBtb2RlLiBSZWMgZGF0YSBhbmQgcGxheSBkYXRhIGFyZSB1c2luZyB0aGUgc2FtZSBidWZmZXIgdGhlcmVmb3JlLiBBdAorICogZmlyc3QgeW91IGhhdmUgZ290IHRoZSBwbGF5aW5nIGJpdHMgaW4gdGhlIGJ1ZmZlciBhbmQgdGhlbiAoYWZ0ZXIgcGxheWluZworICogdGhlbSkgdGhleSB3ZXJlIG92ZXJ3aXR0ZW4gYnkgdGhlIGNhcHR1cmVkIHNvdW5kIG9mIHRoZSBDUzg0MTIvMTQuIEJvdGggCisgKiBtb2RlcyAocGxheS9yZWNvcmQpIGFyZSBydW5uaW5nIGhhcm1vbmljYWxseSBoYW5kIGluIGhhbmQgaW4gdGhlIHNhbWUgYnVmZmVyCisgKiBhbmQgeW91IGhhdmUgb25seSBvbmUgc3RhcnQgYml0IHBsdXMgb25lIGludGVycnVwdCBiaXQgdG8gY29udHJvbCB0aGlzIAorICogcGFpcmVkIGFjdGlvbi4KKyAqIFRoaXMgaXMgb3Bwb3NpdGUgdG8gdGhlIGxhdHRlciBybWU5NiB3aGVyZSBwbGF5aW5nIGFuZCBjYXB0dXJpbmcgaXMgdG90YWxseQorICogc2VwYXJhdGVkIGFuZCBzbyB0aGVpciBmdWxsIGR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSBhbHNhICh1c2luZyB0d28gCisgKiBzdGFydCBiaXRzIGFuZCB0d28gaW50ZXJydXB0cyBmb3IgdHdvIGRpZmZlcmVudCBidWZmZXJzKS4gCisgKiBCdXQgZHVlIHRvIHRoZSB3cm9uZyBzZXF1ZW5jZSBvZiBwbGF5aW5nIGFuZCBjYXB0dXJpbmcgQUxTQSBzaG93cyBubyBzb2x2ZWQKKyAqIGZ1bGwgZHVwbGV4IHN1cHBvcnQgZm9yIHRoZSBybWUzMiBhdCB0aGUgbW9tZW50LiBUaGF0J3MgYmFkLCBidXQgSSdtIG5vdAorICogYWJsZSB0byBzb2x2ZSBpdC4gQXJlIHlvdSBtb3RpdmF0ZWQgZW5vdWdoIHRvIHNvbHZlIHRoaXMgcHJvYmxlbSBub3c/IFlvdXIKKyAqIHBhdGNoIHdvdWxkIGJlIHdlbGNvbWUhCisgKiAKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAiVGhlIHN0b3J5IGFmdGVyIHRoZSBsb25nIHNlZWtpbmciIC0tIHRpd2FpCisgKgorICogT2ssIHRoZSBzaXR1YXRpb24gcmVnYXJkaW5nIHRoZSBmdWxsIGR1cGxleCBpcyBub3cgaW1wcm92ZWQgYSBiaXQuCisgKiBJbiB0aGUgZnVsbGR1cGxleCBtb2RlIChnaXZlbiBieSB0aGUgbW9kdWxlIHBhcmFtZXRlciksIHRoZSBoYXJkd2FyZSBidWZmZXIKKyAqIGlzIHNwbGl0IHRvIGhhbHZlcyBmb3IgcmVhZCBhbmQgd3JpdGUgZGlyZWN0aW9ucyBhdCB0aGUgRE1BIHBvaW50ZXIuCisgKiBUaGF0IGlzLCB0aGUgaGFsZiBhYm92ZSB0aGUgY3VycmVudCBETUEgcG9pbnRlciBpcyB1c2VkIGZvciB3cml0ZSwgYW5kCisgKiB0aGUgaGFsZiBiZWxvdyBpcyB1c2VkIGZvciByZWFkLiAgVG8gbWFuZ2xlIHRoaXMgc3RyYW5nZSBiZWhhdmlvciwgYW4KKyAqIHNvZnR3YXJlIGludGVybWVkaWF0ZSBidWZmZXIgaXMgaW50cm9kdWNlZC4gIFRoaXMgaXMsIG9mIGNvdXJzZSwgbm90IGdvb2QKKyAqIGZyb20gdGhlIHZpZXdwb2ludCBvZiB0aGUgZGF0YSB0cmFuc2ZlciBlZmZpY2llbmN5LiAgSG93ZXZlciwgdGhpcyBhbGxvd3MKKyAqIHlvdSB0byB1c2UgYXJiaXRyYXJ5IGJ1ZmZlciBzaXplcywgaW5zdGVhZCBvZiB0aGUgZml4ZWQgSS9PIGJ1ZmZlciBzaXplLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20taW5kaXJlY3QuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZnVsbGR1cGxleFtTTkRSVl9DQVJEU107IC8vID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBSTUUgRGlnaTMyIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgUk1FIERpZ2kzMiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIFJNRSBEaWdpMzIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxkdXBsZXgsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsZHVwbGV4LCAiU3VwcG9ydCBmdWxsLWR1cGxleCBtb2RlLiIpOworTU9EVUxFX0FVVEhPUigiTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LCBQaWxvIENoYW1iZXJ0IDxwaWxvLmNAd2FuYWRvby5mcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUk1FIERpZ2kzMiwgRGlnaTMyLzgsIERpZ2kzMiBQUk8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1JNRSxEaWdpMzJ9LCIgIntSTUUsRGlnaTMyLzh9LCIgIntSTUUsRGlnaTMyIFBST319Iik7CisKKy8qIERlZmluZXMgZm9yIFJNRSBEaWdpMzIgc2VyaWVzICovCisjZGVmaW5lIFJNRTMyX1NQRElGX05DSEFOTkVMUyAyCisKKy8qIFBsYXliYWNrIGFuZCBjYXB0dXJlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFJNRTMyX0JVRkZFUl9TSVpFIDB4MjAwMDAKKworLyogSU8gYXJlYSBzaXplICovCisjZGVmaW5lIFJNRTMyX0lPX1NJWkUgMHgzMDAwMAorCisvKiBJTyBhcmVhIG9mZnNldHMgKi8KKyNkZWZpbmUgUk1FMzJfSU9fREFUQV9CVUZGRVIgICAgICAgIDB4MAorI2RlZmluZSBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSICAgMHgyMDAwMAorI2RlZmluZSBSTUUzMl9JT19HRVRfUE9TICAgICAgICAgICAgMHgyMDAwMAorI2RlZmluZSBSTUUzMl9JT19DT05GSVJNX0FDVElPTl9JUlEgMHgyMDAwNAorI2RlZmluZSBSTUUzMl9JT19SRVNFVF9QT1MgICAgICAgICAgMHgyMDEwMAorCisvKiBXcml0ZSBjb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgUk1FMzJfV0NSX1NUQVJUICAgICAoMSA8PCAwKSAgICAvKiBzdGFydGJpdCAqLworI2RlZmluZSBSTUUzMl9XQ1JfTU9OTyAgICAgICgxIDw8IDEpICAgIC8qIDA9c3RlcmVvLCAxPW1vbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoZSB3aG9sZSBjYXJkIHRvIG1vbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IHNlZW0gdG8gYmUgdmVyeSB1c2VmdWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzb2Z0d2FyZS1zb2x1dGlvbiBjYW4gaGFuZGxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwtZHVwbGV4IHdpdGggb25lIGRpcmVjdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlbyBhbmQgdGhlIG90aGVyIHdheSBpbiBtb25vLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbywgdGhlIGhhcmR3YXJlIHNob3VsZCB3b3JrIGFsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSBpbiBzdGVyZW8hICovCisjZGVmaW5lIFJNRTMyX1dDUl9NT0RFMjQgICAgKDEgPDwgMikgICAgLyogMD0xNmJpdCwgMT0zMmJpdCAqLworI2RlZmluZSBSTUUzMl9XQ1JfU0VMICAgICAgICgxIDw8IDMpICAgIC8qIDA9aW5wdXQgb24gb3V0cHV0LCAxPW5vcm1hbCBwbGF5YmFjay9jYXB0dXJlICovCisjZGVmaW5lIFJNRTMyX1dDUl9GUkVRXzAgICAgKDEgPDwgNCkgICAgLyogZnJlcXVlbmN5IChwbGF5KSAqLworI2RlZmluZSBSTUUzMl9XQ1JfRlJFUV8xICAgICgxIDw8IDUpCisjZGVmaW5lIFJNRTMyX1dDUl9JTlBfMCAgICAgKDEgPDwgNikgICAgLyogaW5wdXQgc3dpdGNoICovCisjZGVmaW5lIFJNRTMyX1dDUl9JTlBfMSAgICAgKDEgPDwgNykKKyNkZWZpbmUgUk1FMzJfV0NSX1JFU0VUICAgICAoMSA8PCA4KSAgICAvKiBSZXNldCBhZGRyZXNzICovCisjZGVmaW5lIFJNRTMyX1dDUl9NVVRFICAgICAgKDEgPDwgOSkgICAgLyogZGlnaXRhbCBtdXRlIGZvciBvdXRwdXQgKi8KKyNkZWZpbmUgUk1FMzJfV0NSX1BSTyAgICAgICAoMSA8PCAxMCkgICAvKiAxPXByb2Zlc3Npb25hbCwgMD1jb25zdW1lciAqLworI2RlZmluZSBSTUUzMl9XQ1JfRFNfQk0gICAgICgxIDw8IDExKQkvKiAxPURvdWJsZVNwZWVkIChvbmx5IFBSTy1WZXJzaW9uKTsgMT1CbG9ja01vZGUgKG9ubHkgQWRhdC1WZXJzaW9uKSAqLworI2RlZmluZSBSTUUzMl9XQ1JfQURBVCAgICAgICgxIDw8IDEyKQkvKiBBZGF0IE1vZGUgKG9ubHkgQWRhdC1WZXJzaW9uKSAqLworI2RlZmluZSBSTUUzMl9XQ1JfQVVUT1NZTkMgICgxIDw8IDEzKSAgIC8qIEF1dG9TeW5jICovCisjZGVmaW5lIFJNRTMyX1dDUl9QRCAgICAgICAgKDEgPDwgMTQpCS8qIERBQyBSZXNldCAob25seSBQUk8tVmVyc2lvbikgKi8KKyNkZWZpbmUgUk1FMzJfV0NSX0VNUCAgICAgICAoMSA8PCAxNSkJLyogMT1FbXBoYXNpcyBvbiAob25seSBQUk8tVmVyc2lvbikgKi8KKworI2RlZmluZSBSTUUzMl9XQ1JfQklUUE9TX0ZSRVFfMCA0CisjZGVmaW5lIFJNRTMyX1dDUl9CSVRQT1NfRlJFUV8xIDUKKyNkZWZpbmUgUk1FMzJfV0NSX0JJVFBPU19JTlBfMCA2CisjZGVmaW5lIFJNRTMyX1dDUl9CSVRQT1NfSU5QXzEgNworCisvKiBSZWFkIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBSTUUzMl9SQ1JfQVVESU9fQUREUl9NQVNLIDB4MWZmZmYKKyNkZWZpbmUgUk1FMzJfUkNSX0xPQ0sgICAgICAoMSA8PCAyMykgICAvKiAxPWxvY2tlZCwgMD1ub3QgbG9ja2VkICovCisjZGVmaW5lIFJNRTMyX1JDUl9FUkYgICAgICAgKDEgPDwgMjYpICAgLyogMT1FcnJvciwgMD1ubyBFcnJvciAqLworI2RlZmluZSBSTUUzMl9SQ1JfRlJFUV8wICAgICgxIDw8IDI3KSAgIC8qIENTODQxeCBmcmVxdWVuY3kgKHJlY29yZCkgKi8KKyNkZWZpbmUgUk1FMzJfUkNSX0ZSRVFfMSAgICAoMSA8PCAyOCkKKyNkZWZpbmUgUk1FMzJfUkNSX0ZSRVFfMiAgICAoMSA8PCAyOSkKKyNkZWZpbmUgUk1FMzJfUkNSX0tNT0RFICAgICAoMSA8PCAzMCkgICAvKiBjYXJkIG1vZGU6IDE9UExMLCAwPXF1YXJ0eiAqLworI2RlZmluZSBSTUUzMl9SQ1JfSVJRICAgICAgICgxIDw8IDMxKSAgIC8qIGludGVycnVwdCAqLworCisjZGVmaW5lIFJNRTMyX1JDUl9CSVRQT1NfRjAgMjcKKyNkZWZpbmUgUk1FMzJfUkNSX0JJVFBPU19GMSAyOAorI2RlZmluZSBSTUUzMl9SQ1JfQklUUE9TX0YyIDI5CisKKy8qIElucHV0IHR5cGVzICovCisjZGVmaW5lIFJNRTMyX0lOUFVUX09QVElDQUwgMAorI2RlZmluZSBSTUUzMl9JTlBVVF9DT0FYSUFMIDEKKyNkZWZpbmUgUk1FMzJfSU5QVVRfSU5URVJOQUwgMgorI2RlZmluZSBSTUUzMl9JTlBVVF9YTFIgMworCisvKiBDbG9jayBtb2RlcyAqLworI2RlZmluZSBSTUUzMl9DTE9DS01PREVfU0xBVkUgMAorI2RlZmluZSBSTUUzMl9DTE9DS01PREVfTUFTVEVSXzMyIDEKKyNkZWZpbmUgUk1FMzJfQ0xPQ0tNT0RFX01BU1RFUl80NCAyCisjZGVmaW5lIFJNRTMyX0NMT0NLTU9ERV9NQVNURVJfNDggMworCisvKiBCbG9jayBzaXplcyBpbiBieXRlcyAqLworI2RlZmluZSBSTUUzMl9CTE9DS19TSVpFIDgxOTIKKworLyogU29mdHdhcmUgaW50ZXJtZWRpYXRlIGJ1ZmZlciAobWF4KSBzaXplICovCisjZGVmaW5lIFJNRTMyX01JRF9CVUZGRVJfU0laRSAoMTAyNCoxMDI0KQorCisvKiBIYXJkd2FyZSByZXZpc2lvbnMgKi8KKyNkZWZpbmUgUk1FMzJfMzJfUkVWSVNJT04gMTkyCisjZGVmaW5lIFJNRTMyXzMyOF9SRVZJU0lPTl9PTEQgMTAwCisjZGVmaW5lIFJNRTMyXzMyOF9SRVZJU0lPTl9ORVcgMTAxCisjZGVmaW5lIFJNRTMyX1BST19SRVZJU0lPTl9XSVRIXzg0MTIgMTkyCisjZGVmaW5lIFJNRTMyX1BST19SRVZJU0lPTl9XSVRIXzg0MTQgMTUwCisKKworLyogUENJIHZlbmRvci9kZXZpY2UgSUQncyAqLworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1hJTElOWF9STUUKKyMgZGVmaW5lIFBDSV9WRU5ET1JfSURfWElMSU5YX1JNRSAweGVhNjAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0RJR0kzMgorIyBkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJMzIgMHg5ODk2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPCisjIGRlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0kzMl9QUk8gMHg5ODk3CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9ESUdJMzJfOAorIyBkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJMzJfOCAweDk4OTgKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzbmRfcm1lMzIgeworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKworCXUzMiB3Y3JlZzsJCS8qIGNhY2hlZCB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCisJdTMyIHdjcmVnX3NwZGlmOwkvKiBTL1BESUYgc2V0dXAgKi8KKwl1MzIgd2NyZWdfc3BkaWZfc3RyZWFtOwkvKiBTL1BESUYgc2V0dXAgKHRlbXBvcmFyeSkgKi8KKwl1MzIgcmNyZWc7CQkvKiBjYWNoZWQgcmVhZCBjb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCisKKwl1OCByZXY7CQkJLyogY2FyZCByZXZpc2lvbiBudW1iZXIgKi8KKworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX3N1YnN0cmVhbTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpjYXB0dXJlX3N1YnN0cmVhbTsKKworCWludCBwbGF5YmFja19mcmxvZzsJLyogbG9nMiBvZiBmcmFtZXNpemUgKi8KKwlpbnQgY2FwdHVyZV9mcmxvZzsKKworCXNpemVfdCBwbGF5YmFja19wZXJpb2RzaXplOwkvKiBpbiBieXRlcywgemVybyBpZiBub3QgdXNlZCAqLworCXNpemVfdCBjYXB0dXJlX3BlcmlvZHNpemU7CS8qIGluIGJ5dGVzLCB6ZXJvIGlmIG5vdCB1c2VkICovCisKKwl1bnNpZ25lZCBpbnQgZnVsbGR1cGxleF9tb2RlOworCWludCBydW5uaW5nOworCisJc25kX3BjbV9pbmRpcmVjdF90IHBsYXliYWNrX3BjbTsKKwlzbmRfcGNtX2luZGlyZWN0X3QgY2FwdHVyZV9wY207CisKKwlzbmRfY2FyZF90ICpjYXJkOworCXNuZF9wY21fdCAqc3BkaWZfcGNtOworCXNuZF9wY21fdCAqYWRhdF9wY207CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfa2NvbnRyb2xfdCAqc3BkaWZfY3RsOworfSBybWUzMl90OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3JtZTMyX2lkc1tdID0geworCXtQQ0lfVkVORE9SX0lEX1hJTElOWF9STUUsIFBDSV9ERVZJQ0VfSURfRElHSTMyLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLH0sCisJe1BDSV9WRU5ET1JfSURfWElMSU5YX1JNRSwgUENJX0RFVklDRV9JRF9ESUdJMzJfOCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCx9LAorCXtQQ0lfVkVORE9SX0lEX1hJTElOWF9STUUsIFBDSV9ERVZJQ0VfSURfRElHSTMyX1BSTywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCx9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfcm1lMzJfaWRzKTsKKworI2RlZmluZSBSTUUzMl9JU1dPUktJTkcocm1lMzIpICgocm1lMzIpLT53Y3JlZyAmIFJNRTMyX1dDUl9TVEFSVCkKKyNkZWZpbmUgUk1FMzJfUFJPX1dJVEhfODQxNChybWUzMikgKChybWUzMiktPnBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRElHSTMyX1BSTyAmJiAocm1lMzIpLT5yZXYgPT0gUk1FMzJfUFJPX1JFVklTSU9OX1dJVEhfODQxNCkKKworc3RhdGljIGludCBzbmRfcm1lMzJfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKTsKKworc3RhdGljIGludCBzbmRfcm1lMzJfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pOworCitzdGF0aWMgaW50IHNuZF9ybWUzMl9wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKTsKKworc3RhdGljIHZvaWQgc25kX3JtZTMyX3Byb2NfaW5pdChybWUzMl90ICogcm1lMzIpOworCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jcmVhdGVfc3dpdGNoZXMoc25kX2NhcmRfdCAqIGNhcmQsIHJtZTMyX3QgKiBybWUzMik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9ybWUzMl9wY21fYnl0ZXB0cihybWUzMl90ICogcm1lMzIpCit7CisJcmV0dXJuIChyZWFkbChybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fR0VUX1BPUykKKwkJJiBSTUUzMl9SQ1JfQVVESU9fQUREUl9NQVNLKTsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfcmF0ZWNvZGUoaW50IHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAzMjAwMDogcmV0dXJuIFNORFJWX1BDTV9SQVRFXzMyMDAwOworCWNhc2UgNDQxMDA6IHJldHVybiBTTkRSVl9QQ01fUkFURV80NDEwMDsKKwljYXNlIDQ4MDAwOiByZXR1cm4gU05EUlZfUENNX1JBVEVfNDgwMDA7CisJY2FzZSA2NDAwMDogcmV0dXJuIFNORFJWX1BDTV9SQVRFXzY0MDAwOworCWNhc2UgODgyMDA6IHJldHVybiBTTkRSVl9QQ01fUkFURV84ODIwMDsKKwljYXNlIDk2MDAwOiByZXR1cm4gU05EUlZfUENNX1JBVEVfOTYwMDA7CisJfQorCXJldHVybiAwOworfQorCisvKiBzaWxlbmNlIGNhbGxiYWNrIGZvciBoYWxmZHVwbGV4IG1vZGUgKi8KK3N0YXRpYyBpbnQgc25kX3JtZTMyX3BsYXliYWNrX3NpbGVuY2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCS8qIG5vdCB1c2VkIChpbnRlcmxlYXZlZCBkYXRhKSAqLworCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwljb3VudCA8PD0gcm1lMzItPnBsYXliYWNrX2ZybG9nOworCXBvcyA8PD0gcm1lMzItPnBsYXliYWNrX2ZybG9nOworCW1lbXNldF9pbyhybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fREFUQV9CVUZGRVIgKyBwb3MsIDAsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogY29weSBjYWxsYmFjayBmb3IgaGFsZmR1cGxleCBtb2RlICovCitzdGF0aWMgaW50IHNuZF9ybWUzMl9wbGF5YmFja19jb3B5KHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sIGludCBjaGFubmVsLAkvKiBub3QgdXNlZCAoaW50ZXJsZWF2ZWQgZGF0YSkgKi8KKwkJCQkgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCQkJICAgdm9pZCBfX3VzZXIgKnNyYywgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY291bnQgPDw9IHJtZTMyLT5wbGF5YmFja19mcmxvZzsKKwlwb3MgPDw9IHJtZTMyLT5wbGF5YmFja19mcmxvZzsKKwlpZiAoY29weV9mcm9tX3VzZXJfdG9pbyhybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fREFUQV9CVUZGRVIgKyBwb3MsCisJCQkgICAgc3JjLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiBjb3B5IGNhbGxiYWNrIGZvciBoYWxmZHVwbGV4IG1vZGUgKi8KK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NhcHR1cmVfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY2hhbm5lbCwJLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCQkJICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCQkJICB2b2lkIF9fdXNlciAqZHN0LCBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwljb3VudCA8PD0gcm1lMzItPmNhcHR1cmVfZnJsb2c7CisJcG9zIDw8PSBybWUzMi0+Y2FwdHVyZV9mcmxvZzsKKwlpZiAoY29weV90b191c2VyX2Zyb21pbyhkc3QsCisJCQkgICAgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0RBVEFfQlVGRkVSICsgcG9zLAorCQkJICAgIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTUERJRiBJL08gY2FwYWJpbGl0ZXMgKGhhbGYtZHVwbGV4IG1vZGUpCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3JtZTMyX3NwZGlmX2luZm8gPSB7CisJLmluZm8gPQkJKFNORFJWX1BDTV9JTkZPX01NQVBfSU9NRU0gfAorCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgCisJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9CShTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfCAKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCksCisJLnJhdGVfbWluID0JMzIwMDAsCisJLnJhdGVfbWF4ID0JNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CTIsCisJLmNoYW5uZWxzX21heCA9CTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBSTUUzMl9CVUZGRVJfU0laRSwKKwkucGVyaW9kX2J5dGVzX21pbiA9IFJNRTMyX0JMT0NLX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSBSTUUzMl9CTE9DS19TSVpFLAorCS5wZXJpb2RzX21pbiA9CVJNRTMyX0JVRkZFUl9TSVpFIC8gUk1FMzJfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQlSTUUzMl9CVUZGRVJfU0laRSAvIFJNRTMyX0JMT0NLX1NJWkUsCisJLmZpZm9fc2l6ZSA9CTAsCit9OworCisvKgorICogQURBVCBJL08gY2FwYWJpbGl0ZXMgKGhhbGYtZHVwbGV4IG1vZGUpCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3JtZTMyX2FkYXRfaW5mbyA9Cit7CisJLmluZm8gPQkJICAgICAoU05EUlZfUENNX0lORk9fTU1BUF9JT01FTSB8CisJCQkgICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzPSAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9ICAgICAgICAgICAgIChTTkRSVl9QQ01fUkFURV80NDEwMCB8IAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfNDgwMDApLAorCS5yYXRlX21pbiA9ICAgICAgICAgIDQ0MTAwLAorCS5yYXRlX21heCA9ICAgICAgICAgIDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAgICAgIDgsCisJLmNoYW5uZWxzX21heCA9CSAgICAgOCwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICBSTUUzMl9CVUZGRVJfU0laRSwKKwkucGVyaW9kX2J5dGVzX21pbiA9ICBSTUUzMl9CTE9DS19TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gIFJNRTMyX0JMT0NLX1NJWkUsCisJLnBlcmlvZHNfbWluID0JICAgIFJNRTMyX0JVRkZFUl9TSVpFIC8gUk1FMzJfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQkgICAgUk1FMzJfQlVGRkVSX1NJWkUgLyBSTUUzMl9CTE9DS19TSVpFLAorCS5maWZvX3NpemUgPQkgICAgMCwKK307CisKKy8qCisgKiBTUERJRiBJL08gY2FwYWJpbGl0ZXMgKGZ1bGwtZHVwbGV4IG1vZGUpCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3JtZTMyX3NwZGlmX2ZkX2luZm8gPSB7CisJLmluZm8gPQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgCisJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9CShTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfCAKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCksCisJLnJhdGVfbWluID0JMzIwMDAsCisJLnJhdGVfbWF4ID0JNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CTIsCisJLmNoYW5uZWxzX21heCA9CTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBSTUUzMl9NSURfQlVGRkVSX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPSBSTUUzMl9CTE9DS19TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gUk1FMzJfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19taW4gPQkyLAorCS5wZXJpb2RzX21heCA9CVJNRTMyX01JRF9CVUZGRVJfU0laRSAvIFJNRTMyX0JMT0NLX1NJWkUsCisJLmZpZm9fc2l6ZSA9CTAsCit9OworCisvKgorICogQURBVCBJL08gY2FwYWJpbGl0ZXMgKGZ1bGwtZHVwbGV4IG1vZGUpCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3JtZTMyX2FkYXRfZmRfaW5mbyA9Cit7CisJLmluZm8gPQkJICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkgICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzPSAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9ICAgICAgICAgICAgIChTTkRSVl9QQ01fUkFURV80NDEwMCB8IAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfNDgwMDApLAorCS5yYXRlX21pbiA9ICAgICAgICAgIDQ0MTAwLAorCS5yYXRlX21heCA9ICAgICAgICAgIDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAgICAgIDgsCisJLmNoYW5uZWxzX21heCA9CSAgICAgOCwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICBSTUUzMl9NSURfQlVGRkVSX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPSAgUk1FMzJfQkxPQ0tfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heCA9ICBSTUUzMl9CTE9DS19TSVpFLAorCS5wZXJpb2RzX21pbiA9CSAgICAyLAorCS5wZXJpb2RzX21heCA9CSAgICBSTUUzMl9NSURfQlVGRkVSX1NJWkUgLyBSTUUzMl9CTE9DS19TSVpFLAorCS5maWZvX3NpemUgPQkgICAgMCwKK307CisKK3N0YXRpYyB2b2lkIHNuZF9ybWUzMl9yZXNldF9kYWMocm1lMzJfdCAqcm1lMzIpCit7CisgICAgICAgIHdyaXRlbChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfUEQsCisgICAgICAgICAgICAgICBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisgICAgICAgIHdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfcGxheWJhY2tfZ2V0cmF0ZShybWUzMl90ICogcm1lMzIpCit7CisJaW50IHJhdGU7CisKKwlyYXRlID0gKChybWUzMi0+d2NyZWcgPj4gUk1FMzJfV0NSX0JJVFBPU19GUkVRXzApICYgMSkgKworCSAgICAgICAoKChybWUzMi0+d2NyZWcgPj4gUk1FMzJfV0NSX0JJVFBPU19GUkVRXzEpICYgMSkgPDwgMSk7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxOgorCQlyYXRlID0gMzIwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmF0ZSA9IDQ0MTAwOworCQlicmVhazsKKwljYXNlIDM6CisJCXJhdGUgPSA0ODAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9EU19CTSkgPyByYXRlIDw8IDEgOiByYXRlOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jYXB0dXJlX2dldHJhdGUocm1lMzJfdCAqIHJtZTMyLCBpbnQgKmlzX2FkYXQpCit7CisJaW50IG47CisKKwkqaXNfYWRhdCA9IDA7CisJaWYgKHJtZTMyLT5yY3JlZyAmIFJNRTMyX1JDUl9MT0NLKSB7IAorICAgICAgICAgICAgICAgIC8qIEFEQVQgcmF0ZSAqLworICAgICAgICAgICAgICAgICppc19hZGF0ID0gMTsKKwl9CisJaWYgKHJtZTMyLT5yY3JlZyAmIFJNRTMyX1JDUl9FUkYpIHsKKwkJcmV0dXJuIC0xOworCX0KKworICAgICAgICAvKiBTL1BESUYgcmF0ZSAqLworCW4gPSAoKHJtZTMyLT5yY3JlZyA+PiBSTUUzMl9SQ1JfQklUUE9TX0YwKSAmIDEpICsKKwkJKCgocm1lMzItPnJjcmVnID4+IFJNRTMyX1JDUl9CSVRQT1NfRjEpICYgMSkgPDwgMSkgKworCQkoKChybWUzMi0+cmNyZWcgPj4gUk1FMzJfUkNSX0JJVFBPU19GMikgJiAxKSA8PCAyKTsKKworCWlmIChSTUUzMl9QUk9fV0lUSF84NDE0KHJtZTMyKSkKKwkJc3dpdGNoIChuKSB7CS8qIHN1cHBvcnRpbmcgdGhlIENTODQxNCAqLworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJcmV0dXJuIC0xOworCQljYXNlIDM6CisJCQlyZXR1cm4gOTYwMDA7CisJCWNhc2UgNDoKKwkJCXJldHVybiA4ODIwMDsKKwkJY2FzZSA1OgorCQkJcmV0dXJuIDQ4MDAwOworCQljYXNlIDY6CisJCQlyZXR1cm4gNDQxMDA7CisJCWNhc2UgNzoKKwkJCXJldHVybiAzMjAwMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQl9IAorCWVsc2UKKwkJc3dpdGNoIChuKSB7CS8qIHN1cHBvcnRpbmcgdGhlIENTODQxMiAqLworCQljYXNlIDA6CisJCQlyZXR1cm4gLTE7CisJCWNhc2UgMToKKwkJCXJldHVybiA0ODAwMDsKKwkJY2FzZSAyOgorCQkJcmV0dXJuIDQ0MTAwOworCQljYXNlIDM6CisJCQlyZXR1cm4gMzIwMDA7CisJCWNhc2UgNDoKKwkJCXJldHVybiA0ODAwMDsKKwkJY2FzZSA1OgorCQkJcmV0dXJuIDQ0MTAwOworCQljYXNlIDY6CisJCQlyZXR1cm4gNDQwNTY7CisJCWNhc2UgNzoKKwkJCXJldHVybiAzMjAwMDsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9wbGF5YmFja19zZXRyYXRlKHJtZTMyX3QgKiBybWUzMiwgaW50IHJhdGUpCit7CisgICAgICAgIGludCBkczsKKworICAgICAgICBkcyA9IHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9EU19CTTsKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDMyMDAwOgorCQlybWUzMi0+d2NyZWcgJj0gflJNRTMyX1dDUl9EU19CTTsKKwkJcm1lMzItPndjcmVnID0gKHJtZTMyLT53Y3JlZyB8IFJNRTMyX1dDUl9GUkVRXzApICYgCisJCQl+Uk1FMzJfV0NSX0ZSRVFfMTsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJcm1lMzItPndjcmVnICY9IH5STUUzMl9XQ1JfRFNfQk07CisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfRlJFUV8xKSAmIAorCQkJflJNRTMyX1dDUl9GUkVRXzA7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCXJtZTMyLT53Y3JlZyAmPSB+Uk1FMzJfV0NSX0RTX0JNOworCQlybWUzMi0+d2NyZWcgPSAocm1lMzItPndjcmVnIHwgUk1FMzJfV0NSX0ZSRVFfMCkgfCAKKwkJCVJNRTMyX1dDUl9GUkVRXzE7CisJCWJyZWFrOworCWNhc2UgNjQwMDA6CisJCWlmIChybWUzMi0+cGNpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJtZTMyLT53Y3JlZyB8PSBSTUUzMl9XQ1JfRFNfQk07CisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfRlJFUV8wKSAmIAorCQkJflJNRTMyX1dDUl9GUkVRXzE7CisJCWJyZWFrOworCWNhc2UgODgyMDA6CisJCWlmIChybWUzMi0+cGNpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJtZTMyLT53Y3JlZyB8PSBSTUUzMl9XQ1JfRFNfQk07CisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfRlJFUV8xKSAmIAorCQkJflJNRTMyX1dDUl9GUkVRXzA7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCWlmIChybWUzMi0+cGNpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJtZTMyLT53Y3JlZyB8PSBSTUUzMl9XQ1JfRFNfQk07CisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfRlJFUV8wKSB8IAorCQkJUk1FMzJfV0NSX0ZSRVFfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorICAgICAgICBpZiAoKCFkcyAmJiBybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfRFNfQk0pIHx8CisgICAgICAgICAgICAoZHMgJiYgIShybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfRFNfQk0pKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB0by9mcm9tIGRvdWJsZS1zcGVlZDogcmVzZXQgdGhlIERBQyAoaWYgYXZhaWxhYmxlKSAqLworICAgICAgICAgICAgICAgIHNuZF9ybWUzMl9yZXNldF9kYWMocm1lMzIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX3NldGNsb2NrbW9kZShybWUzMl90ICogcm1lMzIsIGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUk1FMzJfQ0xPQ0tNT0RFX1NMQVZFOgorCQkvKiBBdXRvU3luYyAqLworCQlybWUzMi0+d2NyZWcgPSAocm1lMzItPndjcmVnICYgflJNRTMyX1dDUl9GUkVRXzApICYgCisJCQl+Uk1FMzJfV0NSX0ZSRVFfMTsKKwkJYnJlYWs7CisJY2FzZSBSTUUzMl9DTE9DS01PREVfTUFTVEVSXzMyOgorCQkvKiBJbnRlcm5hbCAzMi4wa0h6ICovCisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgfCBSTUUzMl9XQ1JfRlJFUV8wKSAmIAorCQkJflJNRTMyX1dDUl9GUkVRXzE7CisJCWJyZWFrOworCWNhc2UgUk1FMzJfQ0xPQ0tNT0RFX01BU1RFUl80NDoKKwkJLyogSW50ZXJuYWwgNDQuMWtIeiAqLworCQlybWUzMi0+d2NyZWcgPSAocm1lMzItPndjcmVnICYgflJNRTMyX1dDUl9GUkVRXzApIHwgCisJCQlSTUUzMl9XQ1JfRlJFUV8xOworCQlicmVhazsKKwljYXNlIFJNRTMyX0NMT0NLTU9ERV9NQVNURVJfNDg6CisJCS8qIEludGVybmFsIDQ4LjBrSHogKi8KKwkJcm1lMzItPndjcmVnID0gKHJtZTMyLT53Y3JlZyB8IFJNRTMyX1dDUl9GUkVRXzApIHwgCisJCQlSTUUzMl9XQ1JfRlJFUV8xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVsKHJtZTMyLT53Y3JlZywgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTlRST0xfUkVHSVNURVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9nZXRjbG9ja21vZGUocm1lMzJfdCAqIHJtZTMyKQoreworCXJldHVybiAoKHJtZTMyLT53Y3JlZyA+PiBSTUUzMl9XQ1JfQklUUE9TX0ZSRVFfMCkgJiAxKSArCisJICAgICgoKHJtZTMyLT53Y3JlZyA+PiBSTUUzMl9XQ1JfQklUUE9TX0ZSRVFfMSkgJiAxKSA8PCAxKTsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfc2V0aW5wdXR0eXBlKHJtZTMyX3QgKiBybWUzMiwgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSTUUzMl9JTlBVVF9PUFRJQ0FMOgorCQlybWUzMi0+d2NyZWcgPSAocm1lMzItPndjcmVnICYgflJNRTMyX1dDUl9JTlBfMCkgJiAKKwkJCX5STUUzMl9XQ1JfSU5QXzE7CisJCWJyZWFrOworCWNhc2UgUk1FMzJfSU5QVVRfQ09BWElBTDoKKwkJcm1lMzItPndjcmVnID0gKHJtZTMyLT53Y3JlZyB8IFJNRTMyX1dDUl9JTlBfMCkgJiAKKwkJCX5STUUzMl9XQ1JfSU5QXzE7CisJCWJyZWFrOworCWNhc2UgUk1FMzJfSU5QVVRfSU5URVJOQUw6CisJCXJtZTMyLT53Y3JlZyA9IChybWUzMi0+d2NyZWcgJiB+Uk1FMzJfV0NSX0lOUF8wKSB8IAorCQkJUk1FMzJfV0NSX0lOUF8xOworCQlicmVhazsKKwljYXNlIFJNRTMyX0lOUFVUX1hMUjoKKwkJcm1lMzItPndjcmVnID0gKHJtZTMyLT53Y3JlZyB8IFJNRTMyX1dDUl9JTlBfMCkgfCAKKwkJCVJNRTMyX1dDUl9JTlBfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfZ2V0aW5wdXR0eXBlKHJtZTMyX3QgKiBybWUzMikKK3sKKwlyZXR1cm4gKChybWUzMi0+d2NyZWcgPj4gUk1FMzJfV0NSX0JJVFBPU19JTlBfMCkgJiAxKSArCisJICAgICgoKHJtZTMyLT53Y3JlZyA+PiBSTUUzMl9XQ1JfQklUUE9TX0lOUF8xKSAmIDEpIDw8IDEpOworfQorCitzdGF0aWMgdm9pZAorc25kX3JtZTMyX3NldGZyYW1lbG9nKHJtZTMyX3QgKiBybWUzMiwgaW50IG5fY2hhbm5lbHMsIGludCBpc19wbGF5YmFjaykKK3sKKwlpbnQgZnJsb2c7CisKKwlpZiAobl9jaGFubmVscyA9PSAyKSB7CisJCWZybG9nID0gMTsKKwl9IGVsc2UgeworCQkvKiBhc3N1bWUgOCBjaGFubmVscyAqLworCQlmcmxvZyA9IDM7CisJfQorCWlmIChpc19wbGF5YmFjaykgeworCQlmcmxvZyArPSAocm1lMzItPndjcmVnICYgUk1FMzJfV0NSX01PREUyNCkgPyAyIDogMTsKKwkJcm1lMzItPnBsYXliYWNrX2ZybG9nID0gZnJsb2c7CisJfSBlbHNlIHsKKwkJZnJsb2cgKz0gKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9NT0RFMjQpID8gMiA6IDE7CisJCXJtZTMyLT5jYXB0dXJlX2ZybG9nID0gZnJsb2c7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9zZXRmb3JtYXQocm1lMzJfdCAqIHJtZTMyLCBpbnQgZm9ybWF0KQoreworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJcm1lMzItPndjcmVnICY9IH5STUUzMl9XQ1JfTU9ERTI0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlybWUzMi0+d2NyZWcgfD0gUk1FMzJfV0NSX01PREUyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTMyX3BsYXliYWNrX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJICAgICBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zKQoreworCWludCBlcnIsIHJhdGUsIGR1bW15OworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKHJtZTMyLT5mdWxsZHVwbGV4X21vZGUpIHsKKwkJZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCXJ1bnRpbWUtPmRtYV9hcmVhID0gKHZvaWQgKikocm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0RBVEFfQlVGRkVSKTsKKwkJcnVudGltZS0+ZG1hX2FkZHIgPSBybWUzMi0+cG9ydCArIFJNRTMyX0lPX0RBVEFfQlVGRkVSOworCQlydW50aW1lLT5kbWFfYnl0ZXMgPSBSTUUzMl9CVUZGRVJfU0laRTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJaWYgKChybWUzMi0+cmNyZWcgJiBSTUUzMl9SQ1JfS01PREUpICYmCisJICAgIChyYXRlID0gc25kX3JtZTMyX2NhcHR1cmVfZ2V0cmF0ZShybWUzMiwgJmR1bW15KSkgPiAwKSB7CisJCS8qIEF1dG9TeW5jICovCisJCWlmICgoaW50KXBhcmFtc19yYXRlKHBhcmFtcykgIT0gcmF0ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSBpZiAoKGVyciA9IHNuZF9ybWUzMl9wbGF5YmFja19zZXRyYXRlKHJtZTMyLCBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9ybWUzMl9zZXRmb3JtYXQocm1lMzIsIHBhcmFtc19mb3JtYXQocGFyYW1zKSkpIDwgMCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfcm1lMzJfc2V0ZnJhbWVsb2cocm1lMzIsIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLCAxKTsKKwlpZiAocm1lMzItPmNhcHR1cmVfcGVyaW9kc2l6ZSAhPSAwKSB7CisJCWlmIChwYXJhbXNfcGVyaW9kX3NpemUocGFyYW1zKSA8PCBybWUzMi0+cGxheWJhY2tfZnJsb2cgIT0gcm1lMzItPmNhcHR1cmVfcGVyaW9kc2l6ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCXJtZTMyLT5wbGF5YmFja19wZXJpb2RzaXplID0gcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykgPDwgcm1lMzItPnBsYXliYWNrX2ZybG9nOworCS8qIFMvUERJRiBzZXR1cCAqLworCWlmICgocm1lMzItPndjcmVnICYgUk1FMzJfV0NSX0FEQVQpID09IDApIHsKKwkJcm1lMzItPndjcmVnICY9IH4oUk1FMzJfV0NSX1BSTyB8IFJNRTMyX1dDUl9FTVApOworCQlybWUzMi0+d2NyZWcgfD0gcm1lMzItPndjcmVnX3NwZGlmX3N0cmVhbTsKKwkJd3JpdGVsKHJtZTMyLT53Y3JlZywgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTlRST0xfUkVHSVNURVIpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lMzJfY2FwdHVyZV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCSAgICBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zKQoreworCWludCBlcnIsIGlzYWRhdCwgcmF0ZTsKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWlmIChybWUzMi0+ZnVsbGR1cGxleF9tb2RlKSB7CisJCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlydW50aW1lLT5kbWFfYXJlYSA9ICh2b2lkICopcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0RBVEFfQlVGRkVSOworCQlydW50aW1lLT5kbWFfYWRkciA9IHJtZTMyLT5wb3J0ICsgUk1FMzJfSU9fREFUQV9CVUZGRVI7CisJCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IFJNRTMyX0JVRkZFUl9TSVpFOworCX0KKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwkvKiBlbmFibGUgQXV0b1N5bmMgZm9yIHJlY29yZC1wcmVwYXJpbmcgKi8KKwlybWUzMi0+d2NyZWcgfD0gUk1FMzJfV0NSX0FVVE9TWU5DOworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKworCWlmICgoZXJyID0gc25kX3JtZTMyX3NldGZvcm1hdChybWUzMiwgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9ybWUzMl9wbGF5YmFja19zZXRyYXRlKHJtZTMyLCBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKHJhdGUgPSBzbmRfcm1lMzJfY2FwdHVyZV9nZXRyYXRlKHJtZTMyLCAmaXNhZGF0KSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChpbnQpcGFyYW1zX3JhdGUocGFyYW1zKSAhPSByYXRlKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaXNhZGF0ICYmIHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9PSAyKSB8fAorICAgICAgICAgICAgICAgICAgICAoIWlzYWRhdCAmJiBydW50aW1lLT5ody5jaGFubmVsc19taW4gPT0gOCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorCX0KKwkvKiBBdXRvU3luYyBvZmYgZm9yIHJlY29yZGluZyAqLworCXJtZTMyLT53Y3JlZyAmPSB+Uk1FMzJfV0NSX0FVVE9TWU5DOworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKworCXNuZF9ybWUzMl9zZXRmcmFtZWxvZyhybWUzMiwgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyksIDApOworCWlmIChybWUzMi0+cGxheWJhY2tfcGVyaW9kc2l6ZSAhPSAwKSB7CisJCWlmIChwYXJhbXNfcGVyaW9kX3NpemUocGFyYW1zKSA8PCBybWUzMi0+Y2FwdHVyZV9mcmxvZyAhPQorCQkgICAgcm1lMzItPnBsYXliYWNrX3BlcmlvZHNpemUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlybWUzMi0+Y2FwdHVyZV9wZXJpb2RzaXplID0KKwkgICAgcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykgPDwgcm1lMzItPmNhcHR1cmVfZnJsb2c7CisJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfcGNtX2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpZiAoISBybWUzMi0+ZnVsbGR1cGxleF9tb2RlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBzbmRfcm1lMzJfcGNtX3N0YXJ0KHJtZTMyX3QgKiBybWUzMiwgaW50IGZyb21fcGF1c2UpCit7CisJaWYgKCFmcm9tX3BhdXNlKSB7CisJCXdyaXRlbCgwLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fUkVTRVRfUE9TKTsKKwl9CisKKwlybWUzMi0+d2NyZWcgfD0gUk1FMzJfV0NSX1NUQVJUOworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKK30KKworc3RhdGljIHZvaWQgc25kX3JtZTMyX3BjbV9zdG9wKHJtZTMyX3QgKiBybWUzMiwgaW50IHRvX3BhdXNlKQoreworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gdW5jb25maXJtZWQgSVJRLCBpZiBzbyBjb25maXJtIGl0LCBvciBlbHNlCisJICogdGhlIGhhcmR3YXJlIHdpbGwgbm90IHN0b3AgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisJICovCisJcm1lMzItPnJjcmVnID0gcmVhZGwocm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTlRST0xfUkVHSVNURVIpOworCWlmIChybWUzMi0+cmNyZWcgJiBSTUUzMl9SQ1JfSVJRKSB7CisJCXdyaXRlbCgwLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09ORklSTV9BQ1RJT05fSVJRKTsKKwl9CisJcm1lMzItPndjcmVnICY9IH5STUUzMl9XQ1JfU1RBUlQ7CisJaWYgKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9TRUwpCisJCXJtZTMyLT53Y3JlZyB8PSBSTUUzMl9XQ1JfTVVURTsKKwl3cml0ZWwocm1lMzItPndjcmVnLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJaWYgKCEgdG9fcGF1c2UpCisJCXdyaXRlbCgwLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fUkVTRVRfUE9TKTsKK30KKworc3RhdGljIGlycXJldHVybl90CitzbmRfcm1lMzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcm1lMzJfdCAqcm1lMzIgPSAocm1lMzJfdCAqKSBkZXZfaWQ7CisKKwlybWUzMi0+cmNyZWcgPSByZWFkbChybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJaWYgKCEocm1lMzItPnJjcmVnICYgUk1FMzJfUkNSX0lSUSkpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0gZWxzZSB7CisJCWlmIChybWUzMi0+Y2FwdHVyZV9zdWJzdHJlYW0pIHsKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocm1lMzItPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwkJfQorCQlpZiAocm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChybWUzMi0+cGxheWJhY2tfc3Vic3RyZWFtKTsKKwkJfQorCQl3cml0ZWwoMCwgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTkZJUk1fQUNUSU9OX0lSUSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXNbXSA9IHsgUk1FMzJfQkxPQ0tfU0laRSB9OworCisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3BlcmlvZF9ieXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHBlcmlvZF9ieXRlcyksCisJLmxpc3QgPSBwZXJpb2RfYnl0ZXMsCisJLm1hc2sgPSAwCit9OworCitzdGF0aWMgdm9pZCBzbmRfcm1lMzJfc2V0X2J1ZmZlcl9jb25zdHJhaW50KHJtZTMyX3QgKnJtZTMyLCBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwlpZiAoISBybWUzMi0+ZnVsbGR1cGxleF9tb2RlKSB7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQkJCQkgICAgIFJNRTMyX0JVRkZFUl9TSVpFLCBSTUUzMl9CVUZGRVJfU0laRSk7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCisJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCisJCQkJCSAgICZod19jb25zdHJhaW50c19wZXJpb2RfYnl0ZXMpOworCX0KK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWludCByYXRlLCBkdW1teTsKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlpZiAocm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlybWUzMi0+d2NyZWcgJj0gflJNRTMyX1dDUl9BREFUOworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlybWUzMi0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCisJaWYgKHJtZTMyLT5mdWxsZHVwbGV4X21vZGUpCisJCXJ1bnRpbWUtPmh3ID0gc25kX3JtZTMyX3NwZGlmX2ZkX2luZm87CisJZWxzZQorCQlydW50aW1lLT5odyA9IHNuZF9ybWUzMl9zcGRpZl9pbmZvOworCWlmIChybWUzMi0+cGNpLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPKSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IFNORFJWX1BDTV9SQVRFXzY0MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMDsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPSA5NjAwMDsKKwl9CisJaWYgKChybWUzMi0+cmNyZWcgJiBSTUUzMl9SQ1JfS01PREUpICYmCisJICAgIChyYXRlID0gc25kX3JtZTMyX2NhcHR1cmVfZ2V0cmF0ZShybWUzMiwgJmR1bW15KSkgPiAwKSB7CisJCS8qIEF1dG9TeW5jICovCisJCXJ1bnRpbWUtPmh3LnJhdGVzID0gc25kX3JtZTMyX3JhdGVjb2RlKHJhdGUpOworCQlydW50aW1lLT5ody5yYXRlX21pbiA9IHJhdGU7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gcmF0ZTsKKwl9ICAgICAgIAorCisJc25kX3JtZTMyX3NldF9idWZmZXJfY29uc3RyYWludChybWUzMiwgcnVudGltZSk7CisKKwlybWUzMi0+d2NyZWdfc3BkaWZfc3RyZWFtID0gcm1lMzItPndjcmVnX3NwZGlmOworCXJtZTMyLT5zcGRpZl9jdGwtPnZkWzBdLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCXNuZF9jdGxfbm90aWZ5KHJtZTMyLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmcm1lMzItPnNwZGlmX2N0bC0+aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlpbnQgaXNhZGF0LCByYXRlOworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmcm1lMzItPmxvY2spOworICAgICAgICBpZiAocm1lMzItPmNhcHR1cmVfc3Vic3RyZWFtICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCXJtZTMyLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKworCWlmIChybWUzMi0+ZnVsbGR1cGxleF9tb2RlKQorCQlydW50aW1lLT5odyA9IHNuZF9ybWUzMl9zcGRpZl9mZF9pbmZvOworCWVsc2UKKwkJcnVudGltZS0+aHcgPSBzbmRfcm1lMzJfc3BkaWZfaW5mbzsKKwlpZiAoUk1FMzJfUFJPX1dJVEhfODQxNChybWUzMikpIHsKKwkJcnVudGltZS0+aHcucmF0ZXMgfD0gU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMDsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPSA5NjAwMDsKKwl9CisJaWYgKChyYXRlID0gc25kX3JtZTMyX2NhcHR1cmVfZ2V0cmF0ZShybWUzMiwgJmlzYWRhdCkpID4gMCkgeworCQlpZiAoaXNhZGF0KSB7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlydW50aW1lLT5ody5yYXRlcyA9IHNuZF9ybWUzMl9yYXRlY29kZShyYXRlKTsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPSByYXRlOworCQlydW50aW1lLT5ody5yYXRlX21heCA9IHJhdGU7CisJfQorCisJc25kX3JtZTMyX3NldF9idWZmZXJfY29uc3RyYWludChybWUzMiwgcnVudGltZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaW50IHJhdGUsIGR1bW15OworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCQorCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsJCisgICAgICAgIGlmIChybWUzMi0+cGxheWJhY2tfc3Vic3RyZWFtICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCXJtZTMyLT53Y3JlZyB8PSBSTUUzMl9XQ1JfQURBVDsKKwl3cml0ZWwocm1lMzItPndjcmVnLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJcm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwkKKwlpZiAocm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkKKwkJcnVudGltZS0+aHcgPSBzbmRfcm1lMzJfYWRhdF9mZF9pbmZvOworCWVsc2UKKwkJcnVudGltZS0+aHcgPSBzbmRfcm1lMzJfYWRhdF9pbmZvOworCWlmICgocm1lMzItPnJjcmVnICYgUk1FMzJfUkNSX0tNT0RFKSAmJgorCSAgICAocmF0ZSA9IHNuZF9ybWUzMl9jYXB0dXJlX2dldHJhdGUocm1lMzIsICZkdW1teSkpID4gMCkgeworICAgICAgICAgICAgICAgIC8qIEF1dG9TeW5jICovCisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZXMgPSBzbmRfcm1lMzJfcmF0ZWNvZGUocmF0ZSk7CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9taW4gPSByYXRlOworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gcmF0ZTsKKwl9ICAgICAgICAKKworCXNuZF9ybWUzMl9zZXRfYnVmZmVyX2NvbnN0cmFpbnQocm1lMzIsIHJ1bnRpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWludCBpc2FkYXQsIHJhdGU7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAocm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkKKwkJcnVudGltZS0+aHcgPSBzbmRfcm1lMzJfYWRhdF9mZF9pbmZvOworCWVsc2UKKwkJcnVudGltZS0+aHcgPSBzbmRfcm1lMzJfYWRhdF9pbmZvOworCWlmICgocmF0ZSA9IHNuZF9ybWUzMl9jYXB0dXJlX2dldHJhdGUocm1lMzIsICZpc2FkYXQpKSA+IDApIHsKKwkJaWYgKCFpc2FkYXQpIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZXMgPSBzbmRfcm1lMzJfcmF0ZWNvZGUocmF0ZSk7CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9taW4gPSByYXRlOworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gcmF0ZTsKKyAgICAgICAgfQorCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworICAgICAgICAKKwlzcGluX2xvY2tfaXJxKCZybWUzMi0+bG9jayk7CQorCWlmIChybWUzMi0+Y2FwdHVyZV9zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCXJtZTMyLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKworCXNuZF9ybWUzMl9zZXRfYnVmZmVyX2NvbnN0cmFpbnQocm1lMzIsIHJ1bnRpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9wbGF5YmFja19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBzcGRpZiA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJcm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CisJcm1lMzItPnBsYXliYWNrX3BlcmlvZHNpemUgPSAwOworCXNwZGlmID0gKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9BREFUKSA9PSAwOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCWlmIChzcGRpZikgeworCQlybWUzMi0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQlzbmRfY3RsX25vdGlmeShybWUzMi0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfAorCQkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sCisJCQkgICAgICAgJnJtZTMyLT5zcGRpZl9jdGwtPmlkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlybWUzMi0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBOVUxMOworCXJtZTMyLT5jYXB0dXJlX3BlcmlvZHNpemUgPSAwOworCXNwaW5fdW5sb2NrKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlpZiAocm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkgeworCQltZW1zZXQoJnJtZTMyLT5wbGF5YmFja19wY20sIDAsIHNpemVvZihybWUzMi0+cGxheWJhY2tfcGNtKSk7CisJCXJtZTMyLT5wbGF5YmFja19wY20uaHdfYnVmZmVyX3NpemUgPSBSTUUzMl9CVUZGRVJfU0laRTsKKwkJcm1lMzItPnBsYXliYWNrX3BjbS5zd19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCX0gZWxzZSB7CisJCXdyaXRlbCgwLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fUkVTRVRfUE9TKTsKKwl9CisJaWYgKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9TRUwpCisJCXJtZTMyLT53Y3JlZyAmPSB+Uk1FMzJfV0NSX01VVEU7CisJd3JpdGVsKHJtZTMyLT53Y3JlZywgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTlRST0xfUkVHSVNURVIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlpZiAocm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkgeworCQltZW1zZXQoJnJtZTMyLT5jYXB0dXJlX3BjbSwgMCwgc2l6ZW9mKHJtZTMyLT5jYXB0dXJlX3BjbSkpOworCQlybWUzMi0+Y2FwdHVyZV9wY20uaHdfYnVmZmVyX3NpemUgPSBSTUUzMl9CVUZGRVJfU0laRTsKKwkJcm1lMzItPmNhcHR1cmVfcGNtLmh3X3F1ZXVlX3NpemUgPSBSTUUzMl9CVUZGRVJfU0laRSAvIDI7CisJCXJtZTMyLT5jYXB0dXJlX3BjbS5zd19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCX0gZWxzZSB7CisJCXdyaXRlbCgwLCBybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fUkVTRVRfUE9TKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWUzMl9wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCisJc3Bpbl9sb2NrKCZybWUzMi0+bG9jayk7CisJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgeworCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJaWYgKHMgIT0gcm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSAmJgorCQkgICAgcyAhPSBybWUzMi0+Y2FwdHVyZV9zdWJzdHJlYW0pCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJCXJtZTMyLT5ydW5uaW5nIHw9ICgxIDw8IHMtPnN0cmVhbSk7CisJCQlpZiAocm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkgeworCQkJCS8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IERNQSBwb3NpdGlvbiAqLworCQkJCWlmIChzID09IHJtZTMyLT5wbGF5YmFja19zdWJzdHJlYW0pIHsKKwkJCQkJcm1lMzItPnBsYXliYWNrX3BjbS5od19pbyA9CisJCQkJCXJtZTMyLT5wbGF5YmFja19wY20uaHdfZGF0YSA9IHNuZF9ybWUzMl9wY21fYnl0ZXB0cihybWUzMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcm1lMzItPmNhcHR1cmVfcGNtLmh3X2lvID0KKwkJCQkJcm1lMzItPmNhcHR1cmVfcGNtLmh3X2RhdGEgPSBzbmRfcm1lMzJfcGNtX2J5dGVwdHIocm1lMzIpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCQlybWUzMi0+cnVubmluZyAmPSB+KDEgPDwgcy0+c3RyZWFtKTsKKwkJCWJyZWFrOworCQl9CisJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CisJfQorCQorCS8qIHByZWZpbGwgcGxheWJhY2sgYnVmZmVyICovCisJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCAmJiBybWUzMi0+ZnVsbGR1cGxleF9tb2RlKSB7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKKwkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQkJaWYgKHMgPT0gcm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQkJCXMtPm9wcy0+YWNrKHMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAocm1lMzItPnJ1bm5pbmcgJiYgISBSTUUzMl9JU1dPUktJTkcocm1lMzIpKQorCQkJc25kX3JtZTMyX3BjbV9zdGFydChybWUzMiwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJaWYgKCEgcm1lMzItPnJ1bm5pbmcgJiYgUk1FMzJfSVNXT1JLSU5HKHJtZTMyKSkKKwkJCXNuZF9ybWUzMl9wY21fc3RvcChybWUzMiwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKHJtZTMyLT5ydW5uaW5nICYmIFJNRTMyX0lTV09SS0lORyhybWUzMikpCisJCQlzbmRfcm1lMzJfcGNtX3N0b3Aocm1lMzIsIDEpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWlmIChybWUzMi0+cnVubmluZyAmJiAhIFJNRTMyX0lTV09SS0lORyhybWUzMikpCisJCQlzbmRfcm1lMzJfcGNtX3N0YXJ0KHJtZTMyLCAxKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBvaW50ZXIgY2FsbGJhY2sgZm9yIGhhbGZkdXBsZXggbW9kZSAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfcm1lMzJfcGxheWJhY2tfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXJldHVybiBzbmRfcm1lMzJfcGNtX2J5dGVwdHIocm1lMzIpID4+IHJtZTMyLT5wbGF5YmFja19mcmxvZzsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfcm1lMzJfY2FwdHVyZV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9ybWUzMl9wY21fYnl0ZXB0cihybWUzMikgPj4gcm1lMzItPmNhcHR1cmVfZnJsb2c7Cit9CisKKworLyogYWNrIGFuZCBwb2ludGVyIGNhbGxiYWNrcyBmb3IgZnVsbGR1cGxleCBtb2RlICovCitzdGF0aWMgdm9pZCBzbmRfcm1lMzJfcGJfdHJhbnNfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgIHNuZF9wY21faW5kaXJlY3RfdCAqcmVjLCBzaXplX3QgYnl0ZXMpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJbWVtY3B5X3RvaW8ocm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0RBVEFfQlVGRkVSICsgcmVjLT5od19kYXRhLAorCQkgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSArIHJlYy0+c3dfZGF0YSwgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9wbGF5YmFja19mZF9hY2soc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21faW5kaXJlY3RfdCAqcmVjLCAqY3ByZWM7CisKKwlyZWMgPSAmcm1lMzItPnBsYXliYWNrX3BjbTsKKwljcHJlYyA9ICZybWUzMi0+Y2FwdHVyZV9wY207CisJc3Bpbl9sb2NrKCZybWUzMi0+bG9jayk7CisJcmVjLT5od19xdWV1ZV9zaXplID0gUk1FMzJfQlVGRkVSX1NJWkU7CisJaWYgKHJtZTMyLT5ydW5uaW5nICYgKDEgPDwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSkKKwkJcmVjLT5od19xdWV1ZV9zaXplIC09IGNwcmVjLT5od19yZWFkeTsKKwlzcGluX3VubG9jaygmcm1lMzItPmxvY2spOworCXNuZF9wY21faW5kaXJlY3RfcGxheWJhY2tfdHJhbnNmZXIoc3Vic3RyZWFtLCByZWMsCisJCQkJCSAgIHNuZF9ybWUzMl9wYl90cmFuc19jb3B5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3JtZTMyX2NwX3RyYW5zX2NvcHkoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICBzbmRfcGNtX2luZGlyZWN0X3QgKnJlYywgc2l6ZV90IGJ5dGVzKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCW1lbWNweV9mcm9taW8oc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSArIHJlYy0+c3dfZGF0YSwKKwkJICAgICAgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0RBVEFfQlVGRkVSICsgcmVjLT5od19kYXRhLAorCQkgICAgICBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NhcHR1cmVfZmRfYWNrKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2luZGlyZWN0X2NhcHR1cmVfdHJhbnNmZXIoc3Vic3RyZWFtLCAmcm1lMzItPmNhcHR1cmVfcGNtLAorCQkJCQkgIHNuZF9ybWUzMl9jcF90cmFuc19jb3B5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfcm1lMzJfcGxheWJhY2tfZmRfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXJldHVybiBzbmRfcGNtX2luZGlyZWN0X3BsYXliYWNrX3BvaW50ZXIoc3Vic3RyZWFtLCAmcm1lMzItPnBsYXliYWNrX3BjbSwKKwkJCQkJCSBzbmRfcm1lMzJfcGNtX2J5dGVwdHIocm1lMzIpKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfcm1lMzJfY2FwdHVyZV9mZF9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9wY21faW5kaXJlY3RfY2FwdHVyZV9wb2ludGVyKHN1YnN0cmVhbSwgJnJtZTMyLT5jYXB0dXJlX3BjbSwKKwkJCQkJCXNuZF9ybWUzMl9wY21fYnl0ZXB0cihybWUzMikpOworfQorCisvKiBmb3IgaGFsZmR1cGxleCBtb2RlICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcGVuLAorCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3JtZTMyX3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9ybWUzMl9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTMyX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3JtZTMyX3BsYXliYWNrX3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX3JtZTMyX3BsYXliYWNrX2NvcHksCisJLnNpbGVuY2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfc2lsZW5jZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9ybWUzMl9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9ybWUzMl9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lMzJfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfcm1lMzJfY2FwdHVyZV9wb2ludGVyLAorCS5jb3B5ID0JCXNuZF9ybWUzMl9jYXB0dXJlX2NvcHksCisJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wcyA9IHsKKwkub3BlbiA9CQlzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcGVuLAorCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3JtZTMyX3BsYXliYWNrX2h3X3BhcmFtcywKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTMyX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3JtZTMyX3BsYXliYWNrX3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX3JtZTMyX3BsYXliYWNrX2NvcHksCisJLnNpbGVuY2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfc2lsZW5jZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcHMgPSB7CisJLm9wZW4gPQkJc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcGVuLAorCS5jbG9zZSA9CXNuZF9ybWUzMl9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lMzJfY2FwdHVyZV9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfcm1lMzJfY2FwdHVyZV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTMyX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3JtZTMyX2NhcHR1cmVfcG9pbnRlciwKKwkuY29weSA9CQlzbmRfcm1lMzJfY2FwdHVyZV9jb3B5LAorCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCit9OworCisvKiBmb3IgZnVsbGR1cGxleCBtb2RlICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfZmRfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcGVuLAorCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3JtZTMyX3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9ybWUzMl9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTMyX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3JtZTMyX3BsYXliYWNrX2ZkX3BvaW50ZXIsCisJLmFjayA9CQlzbmRfcm1lMzJfcGxheWJhY2tfZmRfYWNrLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfZmRfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9ybWUzMl9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9ybWUzMl9wY21faHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lMzJfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfcm1lMzJfY2FwdHVyZV9mZF9wb2ludGVyLAorCS5hY2sgPQkJc25kX3JtZTMyX2NhcHR1cmVfZmRfYWNrLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfZmRfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTMyX3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lMzJfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX3JtZTMyX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lMzJfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfcm1lMzJfcGxheWJhY2tfZmRfcG9pbnRlciwKKwkuYWNrID0JCXNuZF9ybWUzMl9wbGF5YmFja19mZF9hY2ssCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X2ZkX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9ybWUzMl9jYXB0dXJlX2h3X3BhcmFtcywKKwkucHJlcGFyZSA9CXNuZF9ybWUzMl9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lMzJfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfcm1lMzJfY2FwdHVyZV9mZF9wb2ludGVyLAorCS5hY2sgPQkJc25kX3JtZTMyX2NhcHR1cmVfZmRfYWNrLAorfTsKKworc3RhdGljIHZvaWQgc25kX3JtZTMyX2ZyZWUodm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXJtZTMyX3QgKnJtZTMyID0gKHJtZTMyX3QgKikgcHJpdmF0ZV9kYXRhOworCisJaWYgKHJtZTMyID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAocm1lMzItPmlycSA+PSAwKSB7CisJCXNuZF9ybWUzMl9wY21fc3RvcChybWUzMiwgMCk7CisJCWZyZWVfaXJxKHJtZTMyLT5pcnEsICh2b2lkICopIHJtZTMyKTsKKwkJcm1lMzItPmlycSA9IC0xOworCX0KKwlpZiAocm1lMzItPmlvYmFzZSkgeworCQlpb3VubWFwKHJtZTMyLT5pb2Jhc2UpOworCQlybWUzMi0+aW9iYXNlID0gTlVMTDsKKwl9CisJaWYgKHJtZTMyLT5wb3J0KSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocm1lMzItPnBjaSk7CisJCXJtZTMyLT5wb3J0ID0gMDsKKwl9CisJcGNpX2Rpc2FibGVfZGV2aWNlKHJtZTMyLT5wY2kpOworfQorCitzdGF0aWMgdm9pZCBzbmRfcm1lMzJfZnJlZV9zcGRpZl9wY20oc25kX3BjbV90ICogcGNtKQoreworCXJtZTMyX3QgKnJtZTMyID0gKHJtZTMyX3QgKikgcGNtLT5wcml2YXRlX2RhdGE7CisJcm1lMzItPnNwZGlmX3BjbSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lMzJfZnJlZV9hZGF0X3BjbShzbmRfcGNtX3QgKnBjbSkKK3sKKwlybWUzMl90ICpybWUzMiA9IChybWUzMl90ICopIHBjbS0+cHJpdmF0ZV9kYXRhOworCXJtZTMyLT5hZGF0X3BjbSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ybWUzMl9jcmVhdGUocm1lMzJfdCAqIHJtZTMyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSBybWUzMi0+cGNpOworCWludCBlcnI7CisKKwlybWUzMi0+aXJxID0gLTE7CisJc3Bpbl9sb2NrX2luaXQoJnJtZTMyLT5sb2NrKTsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIlJNRTMyIikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlybWUzMi0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChybWUzMi0+cGNpLCAwKTsKKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTMyX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJSTUUzMiIsICh2b2lkICopIHJtZTMyKSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcm1lMzItPmlycSA9IHBjaS0+aXJxOworCisJaWYgKChybWUzMi0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTMyLT5wb3J0LCBSTUUzMl9JT19TSVpFKSkgPT0gMCkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJCSAgIHJtZTMyLT5wb3J0LCBybWUzMi0+cG9ydCArIFJNRTMyX0lPX1NJWkUgLSAxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogcmVhZCB0aGUgY2FyZCdzIHJldmlzaW9uIG51bWJlciAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgOCwgJnJtZTMyLT5yZXYpOworCisJLyogc2V0IHVwIEFMU0EgcGNtIGRldmljZSBmb3IgUy9QRElGICovCisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhybWUzMi0+Y2FyZCwgIkRpZ2kzMiBJRUM5NTgiLCAwLCAxLCAxLCAmcm1lMzItPnNwZGlmX3BjbSkpIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKwlybWUzMi0+c3BkaWZfcGNtLT5wcml2YXRlX2RhdGEgPSBybWUzMjsKKwlybWUzMi0+c3BkaWZfcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfcm1lMzJfZnJlZV9zcGRpZl9wY207CisJc3RyY3B5KHJtZTMyLT5zcGRpZl9wY20tPm5hbWUsICJEaWdpMzIgSUVDOTU4Iik7CisJaWYgKHJtZTMyLT5mdWxsZHVwbGV4X21vZGUpIHsKKwkJc25kX3BjbV9zZXRfb3BzKHJtZTMyLT5zcGRpZl9wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJJnNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9mZF9vcHMpOworCQlzbmRfcGNtX3NldF9vcHMocm1lMzItPnNwZGlmX3BjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCQkJCSZzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9mZF9vcHMpOworCQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHJtZTMyLT5zcGRpZl9wY20sIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCisJCQkJCQkgICAgICBzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCQkJCSAgICAgIDAsIFJNRTMyX01JRF9CVUZGRVJfU0laRSk7CisJCXJtZTMyLT5zcGRpZl9wY20tPmluZm9fZmxhZ3MgPSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CisJfSBlbHNlIHsKKwkJc25kX3BjbV9zZXRfb3BzKHJtZTMyLT5zcGRpZl9wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJJnNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcHMpOworCQlzbmRfcGNtX3NldF9vcHMocm1lMzItPnNwZGlmX3BjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCQkJCSZzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9vcHMpOworCQlybWUzMi0+c3BkaWZfcGNtLT5pbmZvX2ZsYWdzID0gU05EUlZfUENNX0lORk9fSEFMRl9EVVBMRVg7CisJfQorCisJLyogc2V0IHVwIEFMU0EgcGNtIGRldmljZSBmb3IgQURBVCAqLworCWlmICgocGNpLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ESUdJMzIpIHx8CisJICAgIChwY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0kzMl9QUk8pKSB7CisJCS8qIEFEQVQgaXMgbm90IGF2YWlsYWJsZSBvbiBESUdJMzIgYW5kIERJR0kzMiBQcm8gKi8KKwkJcm1lMzItPmFkYXRfcGNtID0gTlVMTDsKKwl9CisJZWxzZSB7CisJCWlmICgoZXJyID0gc25kX3BjbV9uZXcocm1lMzItPmNhcmQsICJEaWdpMzIgQURBVCIsIDEsCisJCQkJICAgICAgIDEsIDEsICZybWUzMi0+YWRhdF9wY20pKSA8IDApCisJCXsKKwkJCXJldHVybiBlcnI7CisJCX0JCQorCQlybWUzMi0+YWRhdF9wY20tPnByaXZhdGVfZGF0YSA9IHJtZTMyOworCQlybWUzMi0+YWRhdF9wY20tPnByaXZhdGVfZnJlZSA9IHNuZF9ybWUzMl9mcmVlX2FkYXRfcGNtOworCQlzdHJjcHkocm1lMzItPmFkYXRfcGNtLT5uYW1lLCAiRGlnaTMyIEFEQVQiKTsKKwkJaWYgKHJtZTMyLT5mdWxsZHVwbGV4X21vZGUpIHsKKwkJCXNuZF9wY21fc2V0X29wcyhybWUzMi0+YWRhdF9wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssIAorCQkJCQkmc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfZmRfb3BzKTsKKwkJCXNuZF9wY21fc2V0X29wcyhybWUzMi0+YWRhdF9wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgCisJCQkJCSZzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X2ZkX29wcyk7CisJCQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHJtZTMyLT5hZGF0X3BjbSwgU05EUlZfRE1BX1RZUEVfQ09OVElOVU9VUywKKwkJCQkJCQkgICAgICBzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCQkJCQkgICAgICAwLCBSTUUzMl9NSURfQlVGRkVSX1NJWkUpOworCQkJcm1lMzItPmFkYXRfcGNtLT5pbmZvX2ZsYWdzID0gU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOworCQl9IGVsc2UgeworCQkJc25kX3BjbV9zZXRfb3BzKHJtZTMyLT5hZGF0X3BjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgCisJCQkJCSZzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcHMpOworCQkJc25kX3BjbV9zZXRfb3BzKHJtZTMyLT5hZGF0X3BjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAKKwkJCQkJJnNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfb3BzKTsKKwkJCXJtZTMyLT5hZGF0X3BjbS0+aW5mb19mbGFncyA9IFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYOworCQl9CisJfQorCisKKwlybWUzMi0+cGxheWJhY2tfcGVyaW9kc2l6ZSA9IDA7CisJcm1lMzItPmNhcHR1cmVfcGVyaW9kc2l6ZSA9IDA7CisKKwkvKiBtYWtlIHN1cmUgcGxheWJhY2svY2FwdHVyZSBpcyBzdG9wcGVkLCBpZiBieSBzb21lIHJlYXNvbiBhY3RpdmUgKi8KKwlzbmRfcm1lMzJfcGNtX3N0b3Aocm1lMzIsIDApOworCisgICAgICAgIC8qIHJlc2V0IERBQyAqLworICAgICAgICBzbmRfcm1lMzJfcmVzZXRfZGFjKHJtZTMyKTsKKworCS8qIHJlc2V0IGJ1ZmZlciBwb2ludGVyICovCisJd3JpdGVsKDAsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19SRVNFVF9QT1MpOworCisJLyogc2V0IGRlZmF1bHQgdmFsdWVzIGluIHJlZ2lzdGVycyAqLworCXJtZTMyLT53Y3JlZyA9IFJNRTMyX1dDUl9TRUwgfAkgLyogbm9ybWFsIHBsYXliYWNrICovCisJCVJNRTMyX1dDUl9JTlBfMCB8IC8qIGlucHV0IHNlbGVjdCAqLworCQlSTUUzMl9XQ1JfTVVURTsJIC8qIG11dGluZyBvbiAqLworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKworCisJLyogaW5pdCBzd2l0Y2ggaW50ZXJmYWNlICovCisJaWYgKChlcnIgPSBzbmRfcm1lMzJfY3JlYXRlX3N3aXRjaGVzKHJtZTMyLT5jYXJkLCBybWUzMikpIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGluaXQgcHJvYyBpbnRlcmZhY2UgKi8KKwlzbmRfcm1lMzJfcHJvY19pbml0KHJtZTMyKTsKKworCXJtZTMyLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJcm1lMzItPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByb2MgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQKK3NuZF9ybWUzMl9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqIGVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlpbnQgbjsKKwlybWUzMl90ICpybWUzMiA9IChybWUzMl90ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisKKwlybWUzMi0+cmNyZWcgPSByZWFkbChybWUzMi0+aW9iYXNlICsgUk1FMzJfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsIHJtZTMyLT5jYXJkLT5sb25nbmFtZSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiIChpbmRleCAjJWQpXG4iLCBybWUzMi0+Y2FyZC0+bnVtYmVyICsgMSk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbkdlbmVyYWwgc2V0dGluZ3NcbiIpOworCWlmIChybWUzMi0+ZnVsbGR1cGxleF9tb2RlKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgIEZ1bGwtZHVwbGV4IG1vZGVcbiIpOworCWVsc2UKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBIYWxmLWR1cGxleCBtb2RlXG4iKTsKKwlpZiAoUk1FMzJfUFJPX1dJVEhfODQxNChybWUzMikpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICByZWNlaXZlcjogQ1M4NDE0XG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHJlY2VpdmVyOiBDUzg0MTJcbiIpOworCX0KKwlpZiAocm1lMzItPndjcmVnICYgUk1FMzJfV0NSX01PREUyNCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGZvcm1hdDogMjQgYml0Iik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBmb3JtYXQ6IDE2IGJpdCIpOworCX0KKwlpZiAocm1lMzItPndjcmVnICYgUk1FMzJfV0NSX01PTk8pIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiLCBNb25vXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIsIFN0ZXJlb1xuIik7CisJfQorCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5JbnB1dCBzZXR0aW5nc1xuIik7CisJc3dpdGNoIChzbmRfcm1lMzJfZ2V0aW5wdXR0eXBlKHJtZTMyKSkgeworCWNhc2UgUk1FMzJfSU5QVVRfT1BUSUNBTDoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBpbnB1dDogb3B0aWNhbCIpOworCQlicmVhazsKKwljYXNlIFJNRTMyX0lOUFVUX0NPQVhJQUw6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgaW5wdXQ6IGNvYXhpYWwiKTsKKwkJYnJlYWs7CisJY2FzZSBSTUUzMl9JTlBVVF9JTlRFUk5BTDoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBpbnB1dDogaW50ZXJuYWwiKTsKKwkJYnJlYWs7CisJY2FzZSBSTUUzMl9JTlBVVF9YTFI6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgaW5wdXQ6IFhMUiIpOworCQlicmVhazsKKwl9CisJaWYgKHNuZF9ybWUzMl9jYXB0dXJlX2dldHJhdGUocm1lMzIsICZuKSA8IDApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG4gIHNhbXBsZSByYXRlOiBubyB2YWxpZCBzaWduYWxcbiIpOworCX0gZWxzZSB7CisJCWlmIChuKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgKDggY2hhbm5lbHMpXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAoMiBjaGFubmVscylcbiIpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgc2FtcGxlIHJhdGU6ICVkIEh6XG4iLAorCQkJICAgIHNuZF9ybWUzMl9jYXB0dXJlX2dldHJhdGUocm1lMzIsICZuKSk7CisJfQorCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5PdXRwdXQgc2V0dGluZ3NcbiIpOworCWlmIChybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfU0VMKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgb3V0cHV0IHNpZ25hbDogbm9ybWFsIHBsYXliYWNrIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBvdXRwdXQgc2lnbmFsOiBzYW1lIGFzIGlucHV0Iik7CisJfQorCWlmIChybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfTVVURSkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgKG11dGVkKVxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKKwl9CisKKwkvKiBtYXN0ZXIgb3V0cHV0IGZyZXF1ZW5jeSAqLworCWlmICghCisJICAgICgoIShybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfRlJFUV8wKSkKKwkgICAgICYmICghKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9GUkVRXzEpKSkpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBzYW1wbGUgcmF0ZTogJWQgSHpcbiIsCisJCQkgICAgc25kX3JtZTMyX3BsYXliYWNrX2dldHJhdGUocm1lMzIpKTsKKwl9CisJaWYgKHJtZTMyLT5yY3JlZyAmIFJNRTMyX1JDUl9LTU9ERSkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSBjbG9jayBzb3VyY2U6IEF1dG9TeW5jXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSBjbG9jayBzb3VyY2U6IEludGVybmFsXG4iKTsKKwl9CisJaWYgKHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9QUk8pIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBmb3JtYXQ6IEFFUy9FQlUgKHByb2Zlc3Npb25hbClcbiIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgZm9ybWF0OiBJRUM5NTggKGNvbnN1bWVyKVxuIik7CisJfQorCWlmIChybWUzMi0+d2NyZWcgJiBSTUUzMl9XQ1JfRU1QKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgZW1waGFzaXM6IG9uXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGVtcGhhc2lzOiBvZmZcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9ybWUzMl9wcm9jX2luaXQocm1lMzJfdCAqIHJtZTMyKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcocm1lMzItPmNhcmQsICJybWUzMiIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgcm1lMzIsIDEwMjQsIHNuZF9ybWUzMl9wcm9jX3JlYWQpOworfQorCisvKgorICogY29udHJvbCBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgaW50CitzbmRfcm1lMzJfaW5mb19sb29wYmFja19jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTMyX2dldF9sb29wYmFja19jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJICAgIHJtZTMyLT53Y3JlZyAmIFJNRTMyX1dDUl9TRUwgPyAwIDogMTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF9ybWUzMl9wdXRfbG9vcGJhY2tfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAwIDogUk1FMzJfV0NSX1NFTDsKKwlzcGluX2xvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJdmFsID0gKHJtZTMyLT53Y3JlZyAmIH5STUUzMl9XQ1JfU0VMKSB8IHZhbDsKKwljaGFuZ2UgPSB2YWwgIT0gcm1lMzItPndjcmVnOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJdmFsICY9IH5STUUzMl9XQ1JfTVVURTsKKwllbHNlCisJCXZhbCB8PSBSTUUzMl9XQ1JfTVVURTsKKwlybWUzMi0+d2NyZWcgPSB2YWw7CisJd3JpdGVsKHZhbCwgcm1lMzItPmlvYmFzZSArIFJNRTMyX0lPX0NPTlRST0xfUkVHSVNURVIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWUzMl9pbmZvX2lucHV0dHlwZV9jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7ICJPcHRpY2FsIiwgIkNvYXhpYWwiLCAiSW50ZXJuYWwiLCAiWExSIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwlzd2l0Y2ggKHJtZTMyLT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJMzI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMl84OgorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPOgorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJYnJlYWs7CisJfQorCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4KKwkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxKSB7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCX0KKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTMyX2dldF9pbnB1dHR5cGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGl0ZW1zID0gMzsKKworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc25kX3JtZTMyX2dldGlucHV0dHlwZShybWUzMik7CisKKwlzd2l0Y2ggKHJtZTMyLT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJMzI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMl84OgorCQlpdGVtcyA9IDM7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPOgorCQlpdGVtcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJYnJlYWs7CisJfQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGl0ZW1zKSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpdGVtcyAtIDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50CitzbmRfcm1lMzJfcHV0X2lucHV0dHlwZV9jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2UsIGl0ZW1zID0gMzsKKworCXN3aXRjaCAocm1lMzItPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTMyXzg6CisJCWl0ZW1zID0gMzsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMl9QUk86CisJCWl0ZW1zID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlicmVhazsKKwl9CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIGl0ZW1zOworCisJc3Bpbl9sb2NrX2lycSgmcm1lMzItPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSAodW5zaWduZWQgaW50KXNuZF9ybWUzMl9nZXRpbnB1dHR5cGUocm1lMzIpOworCXNuZF9ybWUzMl9zZXRpbnB1dHR5cGUocm1lMzIsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludAorc25kX3JtZTMyX2luZm9fY2xvY2ttb2RlX2NvbnRyb2woc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s0XSA9IHsgIkF1dG9TeW5jIiwgCisJCQkJICAiSW50ZXJuYWwgMzIuMGtIeiIsIAorCQkJCSAgIkludGVybmFsIDQ0LjFrSHoiLCAKKwkJCQkgICJJbnRlcm5hbCA0OC4wa0h6IiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAzKSB7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAzOworCX0KKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTMyX2dldF9jbG9ja21vZGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNuZF9ybWUzMl9nZXRjbG9ja21vZGUocm1lMzIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTMyX3B1dF9jbG9ja21vZGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIDM7CisJc3Bpbl9sb2NrX2lycSgmcm1lMzItPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSAodW5zaWduZWQgaW50KXNuZF9ybWUzMl9nZXRjbG9ja21vZGUocm1lMzIpOworCXNuZF9ybWUzMl9zZXRjbG9ja21vZGUocm1lMzIsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWUzMi0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHUzMiBzbmRfcm1lMzJfY29udmVydF9mcm9tX2FlcyhzbmRfYWVzX2llYzk1OF90ICogYWVzKQoreworCXUzMiB2YWwgPSAwOworCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpID8gUk1FMzJfV0NSX1BSTyA6IDA7CisJaWYgKHZhbCAmIFJNRTMyX1dDUl9QUk8pCisJCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNSkgPyBSTUUzMl9XQ1JfRU1QIDogMDsKKwllbHNlCisJCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSkgPyBSTUUzMl9XQ1JfRU1QIDogMDsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzbmRfcm1lMzJfY29udmVydF90b19hZXMoc25kX2Flc19pZWM5NThfdCAqIGFlcywgdTMyIHZhbCkKK3sKKwlhZXMtPnN0YXR1c1swXSA9ICgodmFsICYgUk1FMzJfV0NSX1BSTykgPyBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwgOiAwKTsKKwlpZiAodmFsICYgUk1FMzJfV0NSX1BSTykKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIFJNRTMyX1dDUl9FTVApID8gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUgOiAwOworCWVsc2UKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIFJNRTMyX1dDUl9FTVApID8gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUgOiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jb250cm9sX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfY29udHJvbF9zcGRpZl9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNuZF9ybWUzMl9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwKKwkJCQkgcm1lMzItPndjcmVnX3NwZGlmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfY29udHJvbF9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWUzMl90ICpybWUzMiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXUzMiB2YWw7CisKKwl2YWwgPSBzbmRfcm1lMzJfY29udmVydF9mcm9tX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCk7CisJc3Bpbl9sb2NrX2lycSgmcm1lMzItPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSBybWUzMi0+d2NyZWdfc3BkaWY7CisJcm1lMzItPndjcmVnX3NwZGlmID0gdmFsOworCXNwaW5fdW5sb2NrX2lycSgmcm1lMzItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2luZm8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJICAgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqCisJCQkJCSAgICAgIHVjb250cm9sKQoreworCXJtZTMyX3QgKnJtZTMyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc25kX3JtZTMyX2NvbnZlcnRfdG9fYWVzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LAorCQkJCSBybWUzMi0+d2NyZWdfc3BkaWZfc3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lMzJfY29udHJvbF9zcGRpZl9zdHJlYW1fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCSAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICoKKwkJCQkJICAgICAgdWNvbnRyb2wpCit7CisJcm1lMzJfdCAqcm1lMzIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1MzIgdmFsOworCisJdmFsID0gc25kX3JtZTMyX2NvbnZlcnRfZnJvbV9hZXMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwljaGFuZ2UgPSB2YWwgIT0gcm1lMzItPndjcmVnX3NwZGlmX3N0cmVhbTsKKwlybWUzMi0+d2NyZWdfc3BkaWZfc3RyZWFtID0gdmFsOworCXJtZTMyLT53Y3JlZyAmPSB+KFJNRTMyX1dDUl9QUk8gfCBSTUUzMl9XQ1JfRU1QKTsKKwlybWUzMi0+d2NyZWcgfD0gdmFsOworCXdyaXRlbChybWUzMi0+d2NyZWcsIHJtZTMyLT5pb2Jhc2UgKyBSTUUzMl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTMyLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9ybWUzMl9jb250cm9sX3NwZGlmX21hc2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfbWFza19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICoKKwkJCQkJICAgIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3JtZTMyX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJCS5uYW1lID0JU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgREVGQVVMVCksCisJCS5pbmZvID0Jc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfaW5mbywKKwkJLmdldCA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX2dldCwKKwkJLnB1dCA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX3B1dAorCX0sCisJeworCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSA9CVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIFBDTV9TVFJFQU0pLAorCQkuaW5mbyA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX3N0cmVhbV9pbmZvLAorCQkuZ2V0ID0Jc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2dldCwKKwkJLnB1dCA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX3N0cmVhbV9wdXQKKwl9LAorCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBDT05fTUFTSyksCisJCS5pbmZvID0Jc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfbWFza19pbmZvLAorCQkuZ2V0ID0Jc25kX3JtZTMyX2NvbnRyb2xfc3BkaWZfbWFza19nZXQsCisJCS5wcml2YXRlX3ZhbHVlID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTCisJfSwKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0JU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgUFJPX01BU0spLAorCQkuaW5mbyA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKKwkJLmdldCA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX21hc2tfZ2V0LAorCQkucHJpdmF0ZV92YWx1ZSA9IElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8IElFQzk1OF9BRVMwX1BST19FTVBIQVNJUworCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPQkiSW5wdXQgQ29ubmVjdG9yIiwKKwkJLmluZm8gPQlzbmRfcm1lMzJfaW5mb19pbnB1dHR5cGVfY29udHJvbCwKKwkJLmdldCA9CXNuZF9ybWUzMl9nZXRfaW5wdXR0eXBlX2NvbnRyb2wsCisJCS5wdXQgPQlzbmRfcm1lMzJfcHV0X2lucHV0dHlwZV9jb250cm9sCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9CSJMb29wYmFjayBJbnB1dCIsCisJCS5pbmZvID0Jc25kX3JtZTMyX2luZm9fbG9vcGJhY2tfY29udHJvbCwKKwkJLmdldCA9CXNuZF9ybWUzMl9nZXRfbG9vcGJhY2tfY29udHJvbCwKKwkJLnB1dCA9CXNuZF9ybWUzMl9wdXRfbG9vcGJhY2tfY29udHJvbAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPQkiU2FtcGxlIENsb2NrIFNvdXJjZSIsCisJCS5pbmZvID0Jc25kX3JtZTMyX2luZm9fY2xvY2ttb2RlX2NvbnRyb2wsCisJCS5nZXQgPQlzbmRfcm1lMzJfZ2V0X2Nsb2NrbW9kZV9jb250cm9sLAorCQkucHV0ID0Jc25kX3JtZTMyX3B1dF9jbG9ja21vZGVfY29udHJvbAorCX0KK307CisKK3N0YXRpYyBpbnQgc25kX3JtZTMyX2NyZWF0ZV9zd2l0Y2hlcyhzbmRfY2FyZF90ICogY2FyZCwgcm1lMzJfdCAqIHJtZTMyKQoreworCWludCBpZHgsIGVycjsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgKGludClBUlJBWV9TSVpFKHNuZF9ybWUzMl9jb250cm9scyk7IGlkeCsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3JtZTMyX2NvbnRyb2xzW2lkeF0sIHJtZTMyKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChpZHggPT0gMSkJLyogSUVDOTU4IChTL1BESUYpIFN0cmVhbSAqLworCQkJcm1lMzItPnNwZGlmX2N0bCA9IGtjdGw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYXJkIGluaXRpYWxpc2F0aW9uCisgKi8KKworc3RhdGljIHZvaWQgc25kX3JtZTMyX2NhcmRfZnJlZShzbmRfY2FyZF90ICogY2FyZCkKK3sKKwlzbmRfcm1lMzJfZnJlZShjYXJkLT5wcml2YXRlX2RhdGEpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc25kX3JtZTMyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJcm1lMzJfdCAqcm1lMzI7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlpbnQgZXJyOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKChjYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJCSBzaXplb2Yocm1lMzJfdCkpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfcm1lMzJfY2FyZF9mcmVlOworCXJtZTMyID0gKHJtZTMyX3QgKikgY2FyZC0+cHJpdmF0ZV9kYXRhOworCXJtZTMyLT5jYXJkID0gY2FyZDsKKwlybWUzMi0+cGNpID0gcGNpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKyAgICAgICAgaWYgKGZ1bGxkdXBsZXhbZGV2XSkKKwkJcm1lMzItPmZ1bGxkdXBsZXhfbW9kZSA9IDE7CisJaWYgKChlcnIgPSBzbmRfcm1lMzJfY3JlYXRlKHJtZTMyKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkRpZ2kzMiIpOworCXN3aXRjaCAocm1lMzItPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMjoKKwkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlJNRSBEaWdpMzIiKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0kzMl84OgorCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiUk1FIERpZ2kzMi84Iik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJMzJfUFJPOgorCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiUk1FIERpZ2kzMiBQUk8iKTsKKwkJYnJlYWs7CisJfQorCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyAoUmV2LiAlZCkgYXQgMHglbHgsIGlycSAlZCIsCisJCWNhcmQtPnNob3J0bmFtZSwgcm1lMzItPnJldiwgcm1lMzItPnBvcnQsIHJtZTMyLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3JtZTMyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0JCSJSTUUgRGlnaTMyIiwKKwkuaWRfdGFibGUgPQlzbmRfcm1lMzJfaWRzLAorCS5wcm9iZSA9CXNuZF9ybWUzMl9wcm9iZSwKKwkucmVtb3ZlID0JX19kZXZleGl0X3Aoc25kX3JtZTMyX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfcm1lMzJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfcm1lMzJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX3JtZTMyX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfcm1lMzJfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5Ni5jIGIvc291bmQvcGNpL3JtZTk2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNjY2OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9ybWU5Ni5jCkBAIC0wLDAgKzEsMjQ0OSBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIFJNRSBEaWdpOTYsIERpZ2k5Ni84IGFuZCBEaWdpOTYvOCBQUk8vUEFEL1BTVCBhdWRpbworICogICBpbnRlcmZhY2VzIAorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBBbmRlcnMgVG9yZ2VyIDx0b3JnZXJAbHVkZC5sdXRoLnNlPgorICogICAgCisgKiAgICAgIFRoYW5rcyB0byBIZW5rIEhlc3NlbGluayA8aGVua0BhbmRhLm5sPiBmb3IgdGhlIGFuYWxvZyB2b2x1bWUgY29udHJvbAorICogICAgICBjb2RlLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIG5vdGUsIHR3byBsYXN0IHBjaXMgc2hvdWxkIGJlIGVxdWFsLCBpdCBpcyBub3QgYSBidWcgKi8KKworTU9EVUxFX0FVVEhPUigiQW5kZXJzIFRvcmdlciA8dG9yZ2VyQGx1ZGQubHV0aC5zZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUk1FIERpZ2k5NiwgRGlnaTk2LzgsIERpZ2k5Ni84IFBSTywgRGlnaTk2LzggUFNULCAiCisJCSAgICJEaWdpOTYvOCBQQUQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1JNRSxEaWdpOTZ9LCIKKwkJIntSTUUsRGlnaTk2Lzh9LCIKKwkJIntSTUUsRGlnaTk2LzggUFJPfSwiCisJCSJ7Uk1FLERpZ2k5Ni84IFBTVH0sIgorCQkie1JNRSxEaWdpOTYvOCBQQUR9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBSTUUgRGlnaTk2IHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgUk1FIERpZ2k5NiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIFJNRSBEaWdpOTYgc291bmRjYXJkLiIpOworCisvKgorICogRGVmaW5lcyBmb3IgUk1FIERpZ2k5NiBzZXJpZXMsIGZyb20gaW50ZXJuYWwgUk1FIHJlZmVyZW5jZSBkb2N1bWVudHMKKyAqIGRhdGVkIDEyLjAxLjAwCisgKi8KKworI2RlZmluZSBSTUU5Nl9TUERJRl9OQ0hBTk5FTFMgMgorCisvKiBQbGF5YmFjayBhbmQgY2FwdHVyZSBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBSTUU5Nl9CVUZGRVJfU0laRSAweDEwMDAwCisKKy8qIElPIGFyZWEgc2l6ZSAqLworI2RlZmluZSBSTUU5Nl9JT19TSVpFIDB4NjAwMDAKKworLyogSU8gYXJlYSBvZmZzZXRzICovCisjZGVmaW5lIFJNRTk2X0lPX1BMQVlfQlVGRkVSICAgICAgMHgwCisjZGVmaW5lIFJNRTk2X0lPX1JFQ19CVUZGRVIgICAgICAgMHgxMDAwMAorI2RlZmluZSBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSIDB4MjAwMDAKKyNkZWZpbmUgUk1FOTZfSU9fQURESVRJT05BTF9SRUcgICAweDIwMDA0CisjZGVmaW5lIFJNRTk2X0lPX0NPTkZJUk1fUExBWV9JUlEgMHgyMDAwOAorI2RlZmluZSBSTUU5Nl9JT19DT05GSVJNX1JFQ19JUlEgIDB4MjAwMEMKKyNkZWZpbmUgUk1FOTZfSU9fU0VUX1BMQVlfUE9TICAgICAweDQwMDAwCisjZGVmaW5lIFJNRTk2X0lPX1JFU0VUX1BMQVlfUE9TICAgMHg0RkZGQworI2RlZmluZSBSTUU5Nl9JT19TRVRfUkVDX1BPUyAgICAgIDB4NTAwMDAKKyNkZWZpbmUgUk1FOTZfSU9fUkVTRVRfUkVDX1BPUyAgICAweDVGRkZDCisjZGVmaW5lIFJNRTk2X0lPX0dFVF9QTEFZX1BPUyAgICAgMHgyMDAwMAorI2RlZmluZSBSTUU5Nl9JT19HRVRfUkVDX1BPUyAgICAgIDB4MzAwMDAKKworLyogV3JpdGUgY29udHJvbCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJNRTk2X1dDUl9TVEFSVCAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUk1FOTZfV0NSX1NUQVJUXzIgICAoMSA8PCAxKQorI2RlZmluZSBSTUU5Nl9XQ1JfR0FJTl8wICAgICgxIDw8IDIpCisjZGVmaW5lIFJNRTk2X1dDUl9HQUlOXzEgICAgKDEgPDwgMykKKyNkZWZpbmUgUk1FOTZfV0NSX01PREUyNCAgICAoMSA8PCA0KQorI2RlZmluZSBSTUU5Nl9XQ1JfTU9ERTI0XzIgICgxIDw8IDUpCisjZGVmaW5lIFJNRTk2X1dDUl9CTSAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgUk1FOTZfV0NSX0JNXzIgICAgICAoMSA8PCA3KQorI2RlZmluZSBSTUU5Nl9XQ1JfQURBVCAgICAgICgxIDw8IDgpCisjZGVmaW5lIFJNRTk2X1dDUl9GUkVRXzAgICAgKDEgPDwgOSkKKyNkZWZpbmUgUk1FOTZfV0NSX0ZSRVFfMSAgICAoMSA8PCAxMCkKKyNkZWZpbmUgUk1FOTZfV0NSX0RTICAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgUk1FOTZfV0NSX1BSTyAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgUk1FOTZfV0NSX0VNUCAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgUk1FOTZfV0NSX1NFTCAgICAgICAoMSA8PCAxNCkKKyNkZWZpbmUgUk1FOTZfV0NSX01BU1RFUiAgICAoMSA8PCAxNSkKKyNkZWZpbmUgUk1FOTZfV0NSX1BEICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgUk1FOTZfV0NSX0lOUF8wICAgICAoMSA8PCAxNykKKyNkZWZpbmUgUk1FOTZfV0NSX0lOUF8xICAgICAoMSA8PCAxOCkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfMCAgICAoMSA8PCAxOSkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfMSAgICAoMSA8PCAyMCkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfMiAgICAoMSA8PCAyMSkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfMyAgICAoMSA8PCAyMikKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfNCAgICAoMSA8PCAyMykKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfNSAgICAoMSA8PCAyNCkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfNiAgICAoMSA8PCAyNSkKKyNkZWZpbmUgUk1FOTZfV0NSX1RIUlVfNyAgICAoMSA8PCAyNikKKyNkZWZpbmUgUk1FOTZfV0NSX0RPTEJZICAgICAoMSA8PCAyNykKKyNkZWZpbmUgUk1FOTZfV0NSX01PTklUT1JfMCAoMSA8PCAyOCkKKyNkZWZpbmUgUk1FOTZfV0NSX01PTklUT1JfMSAoMSA8PCAyOSkKKyNkZWZpbmUgUk1FOTZfV0NSX0lTRUwgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgUk1FOTZfV0NSX0lESVMgICAgICAoMSA8PCAzMSkKKworI2RlZmluZSBSTUU5Nl9XQ1JfQklUUE9TX0dBSU5fMCAyCisjZGVmaW5lIFJNRTk2X1dDUl9CSVRQT1NfR0FJTl8xIDMKKyNkZWZpbmUgUk1FOTZfV0NSX0JJVFBPU19GUkVRXzAgOQorI2RlZmluZSBSTUU5Nl9XQ1JfQklUUE9TX0ZSRVFfMSAxMAorI2RlZmluZSBSTUU5Nl9XQ1JfQklUUE9TX0lOUF8wIDE3CisjZGVmaW5lIFJNRTk2X1dDUl9CSVRQT1NfSU5QXzEgMTgKKyNkZWZpbmUgUk1FOTZfV0NSX0JJVFBPU19NT05JVE9SXzAgMjgKKyNkZWZpbmUgUk1FOTZfV0NSX0JJVFBPU19NT05JVE9SXzEgMjkKKworLyogUmVhZCBjb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgUk1FOTZfUkNSX0FVRElPX0FERFJfTUFTSyAweEZGRkYKKyNkZWZpbmUgUk1FOTZfUkNSX0lSUV8yICAgICAoMSA8PCAxNikKKyNkZWZpbmUgUk1FOTZfUkNSX1RfT1VUICAgICAoMSA8PCAxNykKKyNkZWZpbmUgUk1FOTZfUkNSX0RFVl9JRF8wICAoMSA8PCAyMSkKKyNkZWZpbmUgUk1FOTZfUkNSX0RFVl9JRF8xICAoMSA8PCAyMikKKyNkZWZpbmUgUk1FOTZfUkNSX0xPQ0sgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgUk1FOTZfUkNSX1ZFUkYgICAgICAoMSA8PCAyNikKKyNkZWZpbmUgUk1FOTZfUkNSX0YwICAgICAgICAoMSA8PCAyNykKKyNkZWZpbmUgUk1FOTZfUkNSX0YxICAgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgUk1FOTZfUkNSX0YyICAgICAgICAoMSA8PCAyOSkKKyNkZWZpbmUgUk1FOTZfUkNSX0FVVE9TWU5DICAoMSA8PCAzMCkKKyNkZWZpbmUgUk1FOTZfUkNSX0lSUSAgICAgICAoMSA8PCAzMSkKKworI2RlZmluZSBSTUU5Nl9SQ1JfQklUUE9TX0YwIDI3CisjZGVmaW5lIFJNRTk2X1JDUl9CSVRQT1NfRjEgMjgKKyNkZWZpbmUgUk1FOTZfUkNSX0JJVFBPU19GMiAyOQorCisvKiBBZGRpdG9uYWwgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBSTUU5Nl9BUl9XU0VMICAgICAgICgxIDw8IDApCisjZGVmaW5lIFJNRTk2X0FSX0FOQUxPRyAgICAgKDEgPDwgMSkKKyNkZWZpbmUgUk1FOTZfQVJfRlJFUVBBRF8wICAoMSA8PCAyKQorI2RlZmluZSBSTUU5Nl9BUl9GUkVRUEFEXzEgICgxIDw8IDMpCisjZGVmaW5lIFJNRTk2X0FSX0ZSRVFQQURfMiAgKDEgPDwgNCkKKyNkZWZpbmUgUk1FOTZfQVJfUEQyICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBSTUU5Nl9BUl9EQUNfRU4gICAgICgxIDw8IDYpCisjZGVmaW5lIFJNRTk2X0FSX0NMQVRDSCAgICAgKDEgPDwgNykKKyNkZWZpbmUgUk1FOTZfQVJfQ0NMSyAgICAgICAoMSA8PCA4KQorI2RlZmluZSBSTUU5Nl9BUl9DREFUQSAgICAgICgxIDw8IDkpCisKKyNkZWZpbmUgUk1FOTZfQVJfQklUUE9TX0YwIDIKKyNkZWZpbmUgUk1FOTZfQVJfQklUUE9TX0YxIDMKKyNkZWZpbmUgUk1FOTZfQVJfQklUUE9TX0YyIDQKKworLyogTW9uaXRvciB0cmFja3MgKi8KKyNkZWZpbmUgUk1FOTZfTU9OSVRPUl9UUkFDS1NfMV8yIDAKKyNkZWZpbmUgUk1FOTZfTU9OSVRPUl9UUkFDS1NfM180IDEKKyNkZWZpbmUgUk1FOTZfTU9OSVRPUl9UUkFDS1NfNV82IDIKKyNkZWZpbmUgUk1FOTZfTU9OSVRPUl9UUkFDS1NfN184IDMKKworLyogQXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgUk1FOTZfQVRURU5VQVRJT05fMCAwCisjZGVmaW5lIFJNRTk2X0FUVEVOVUFUSU9OXzYgMQorI2RlZmluZSBSTUU5Nl9BVFRFTlVBVElPTl8xMiAyCisjZGVmaW5lIFJNRTk2X0FUVEVOVUFUSU9OXzE4IDMKKworLyogSW5wdXQgdHlwZXMgKi8KKyNkZWZpbmUgUk1FOTZfSU5QVVRfT1BUSUNBTCAwCisjZGVmaW5lIFJNRTk2X0lOUFVUX0NPQVhJQUwgMQorI2RlZmluZSBSTUU5Nl9JTlBVVF9JTlRFUk5BTCAyCisjZGVmaW5lIFJNRTk2X0lOUFVUX1hMUiAzCisjZGVmaW5lIFJNRTk2X0lOUFVUX0FOQUxPRyA0CisKKy8qIENsb2NrIG1vZGVzICovCisjZGVmaW5lIFJNRTk2X0NMT0NLTU9ERV9TTEFWRSAwCisjZGVmaW5lIFJNRTk2X0NMT0NLTU9ERV9NQVNURVIgMQorI2RlZmluZSBSTUU5Nl9DTE9DS01PREVfV09SRENMT0NLIDIKKworLyogQmxvY2sgc2l6ZXMgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgUk1FOTZfU01BTExfQkxPQ0tfU0laRSAyMDQ4CisjZGVmaW5lIFJNRTk2X0xBUkdFX0JMT0NLX1NJWkUgODE5MgorCisvKiBWb2x1bWUgY29udHJvbCAqLworI2RlZmluZSBSTUU5Nl9BRDE4NTJfVk9MX0JJVFMgMTQKKyNkZWZpbmUgUk1FOTZfQUQxODU1X1ZPTF9CSVRTIDEwCisKKy8qCisgKiBQQ0kgdmVuZG9yL2RldmljZSBpZHMsIGNvdWxkIGluIHRoZSBmdXR1cmUgYmUgZGVmaW5lZCBpbiA8bGludXgvcGNpLmg+LAorICogdGhlcmVmb3JlICNpZm5kZWYgaXMgdXNlZC4KKyAqLworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1hJTElOWAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1hJTElOWCAweDEwZWUKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0RJR0k5NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0k5NiAweDNmYzAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSTk2XzggMHgzZmMxCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9ESUdJOTZfOF9QUk8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJOTZfOF9QUk8gMHgzZmMyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9ESUdJOTZfOF9QQURfT1JfUFNUCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVCAweDNmYzMKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzbmRfcm1lOTYgeworCXNwaW5sb2NrX3QgICAgbG9jazsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKwkKKwl1MzIgd2NyZWc7ICAgIC8qIGNhY2hlZCB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCisJdTMyIHdjcmVnX3NwZGlmOwkJLyogUy9QRElGIHNldHVwICovCisJdTMyIHdjcmVnX3NwZGlmX3N0cmVhbTsJCS8qIFMvUERJRiBzZXR1cCAodGVtcG9yYXJ5KSAqLworCXUzMiByY3JlZzsgICAgLyogY2FjaGVkIHJlYWQgY29udHJvbCByZWdpc3RlciB2YWx1ZSAqLworCXUzMiBhcmVnOyAgICAgLyogY2FjaGVkIGFkZGl0aW9uYWwgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgdm9sWzJdOyAvKiBjYWNoZWQgdm9sdW1lIG9mIGFuYWxvZyBvdXRwdXQgKi8KKworCXU4IHJldjsgLyogY2FyZCByZXZpc2lvbiBudW1iZXIgKi8KKworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX3N1YnN0cmVhbTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpjYXB0dXJlX3N1YnN0cmVhbTsKKworCWludCBwbGF5YmFja19mcmxvZzsgLyogbG9nMiBvZiBmcmFtZXNpemUgKi8KKwlpbnQgY2FwdHVyZV9mcmxvZzsKKwkKKyAgICAgICAgc2l6ZV90IHBsYXliYWNrX3BlcmlvZHNpemU7IC8qIGluIGJ5dGVzLCB6ZXJvIGlmIG5vdCB1c2VkICovCisJc2l6ZV90IGNhcHR1cmVfcGVyaW9kc2l6ZTsgLyogaW4gYnl0ZXMsIHplcm8gaWYgbm90IHVzZWQgKi8KKworCXNuZF9jYXJkX3QgICAgICAgICAqY2FyZDsKKwlzbmRfcGNtX3QgICAgICAgICAgKnNwZGlmX3BjbTsKKwlzbmRfcGNtX3QgICAgICAgICAgKmFkYXRfcGNtOyAKKwlzdHJ1Y3QgcGNpX2RldiAgICAgKnBjaTsKKwlzbmRfa2NvbnRyb2xfdAkgICAqc3BkaWZfY3RsOworfSBybWU5Nl90OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3JtZTk2X2lkc1tdID0geworCXsgUENJX1ZFTkRPUl9JRF9YSUxJTlgsIFBDSV9ERVZJQ0VfSURfRElHSTk2LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfWElMSU5YLCBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfWElMSU5YLCBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX1hJTElOWCwgUENJX0RFVklDRV9JRF9ESUdJOTZfOF9QQURfT1JfUFNULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwgCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX3JtZTk2X2lkcyk7CisKKyNkZWZpbmUgUk1FOTZfSVNQTEFZSU5HKHJtZTk2KSAoKHJtZTk2KS0+d2NyZWcgJiBSTUU5Nl9XQ1JfU1RBUlQpCisjZGVmaW5lIFJNRTk2X0lTUkVDT1JESU5HKHJtZTk2KSAoKHJtZTk2KS0+d2NyZWcgJiBSTUU5Nl9XQ1JfU1RBUlRfMikKKyNkZWZpbmUJUk1FOTZfSEFTX0FOQUxPR19JTihybWU5NikgKChybWU5NiktPnBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVCkKKyNkZWZpbmUJUk1FOTZfSEFTX0FOQUxPR19PVVQocm1lOTYpICgocm1lOTYpLT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTyB8fCBcCisJCQkJICAgICAocm1lOTYpLT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BBRF9PUl9QU1QpCisjZGVmaW5lCVJNRTk2X0RBQ19JU18xODUyKHJtZTk2KSAoUk1FOTZfSEFTX0FOQUxPR19PVVQocm1lOTYpICYmIChybWU5NiktPnJldiA+PSA0KQorI2RlZmluZQlSTUU5Nl9EQUNfSVNfMTg1NShybWU5NikgKCgocm1lOTYpLT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BBRF9PUl9QU1QgJiYgKHJtZTk2KS0+cmV2IDwgNCkgfHwgXAorCQkJICAgICAgICAgICgocm1lOTYpLT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTyAmJiAocm1lOTYpLT5yZXYgPT0gMikpCisjZGVmaW5lCVJNRTk2XzE4NVhfTUFYX09VVChybWU5NikgKCgxIDw8IChSTUU5Nl9EQUNfSVNfMTg1MihybWU5NikgPyBSTUU5Nl9BRDE4NTJfVk9MX0JJVFMgOiBSTUU5Nl9BRDE4NTVfVk9MX0JJVFMpKSAtIDEpCisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSk7CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKTsKKworc3RhdGljIGludAorc25kX3JtZTk2X3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCAKKwkJCSAgIGludCBjbWQpOworCitzdGF0aWMgaW50CitzbmRfcm1lOTZfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgCisJCQkgIGludCBjbWQpOworCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9ybWU5Nl9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSk7CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAorc25kX3JtZTk2X2NhcHR1cmVfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgCitzbmRfcm1lOTZfcHJvY19pbml0KHJtZTk2X3QgKnJtZTk2KTsKKworc3RhdGljIGludAorc25kX3JtZTk2X2NyZWF0ZV9zd2l0Y2hlcyhzbmRfY2FyZF90ICpjYXJkLAorCQkJICBybWU5Nl90ICpybWU5Nik7CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9nZXRpbnB1dHR5cGUocm1lOTZfdCAqcm1lOTYpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorc25kX3JtZTk2X3BsYXliYWNrX3B0cihybWU5Nl90ICpybWU5NikKK3sKKwlyZXR1cm4gKHJlYWRsKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19HRVRfUExBWV9QT1MpCisJCSYgUk1FOTZfUkNSX0FVRElPX0FERFJfTUFTSykgPj4gcm1lOTYtPnBsYXliYWNrX2ZybG9nOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorc25kX3JtZTk2X2NhcHR1cmVfcHRyKHJtZTk2X3QgKnJtZTk2KQoreworCXJldHVybiAocmVhZGwocm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0dFVF9SRUNfUE9TKQorCQkmIFJNRTk2X1JDUl9BVURJT19BRERSX01BU0spID4+IHJtZTk2LT5jYXB0dXJlX2ZybG9nOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfcmF0ZWNvZGUoaW50IHJhdGUpCit7CisgICAgc3dpdGNoIChyYXRlKSB7CisgICAgY2FzZSAzMjAwMDogcmV0dXJuIFNORFJWX1BDTV9SQVRFXzMyMDAwOworICAgIGNhc2UgNDQxMDA6IHJldHVybiBTTkRSVl9QQ01fUkFURV80NDEwMDsKKyAgICBjYXNlIDQ4MDAwOiByZXR1cm4gU05EUlZfUENNX1JBVEVfNDgwMDA7CisgICAgY2FzZSA2NDAwMDogcmV0dXJuIFNORFJWX1BDTV9SQVRFXzY0MDAwOworICAgIGNhc2UgODgyMDA6IHJldHVybiBTTkRSVl9QQ01fUkFURV84ODIwMDsKKyAgICBjYXNlIDk2MDAwOiByZXR1cm4gU05EUlZfUENNX1JBVEVfOTYwMDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfcGxheWJhY2tfc2lsZW5jZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkgICBpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCQkgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCQkgICBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwljb3VudCA8PD0gcm1lOTYtPnBsYXliYWNrX2ZybG9nOworCXBvcyA8PD0gcm1lOTYtPnBsYXliYWNrX2ZybG9nOworCW1lbXNldF9pbyhybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fUExBWV9CVUZGRVIgKyBwb3MsCisJCSAgMCwgY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfcGxheWJhY2tfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQlpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCQl2b2lkIF9fdXNlciAqc3JjLAorCQkJc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY291bnQgPDw9IHJtZTk2LT5wbGF5YmFja19mcmxvZzsKKwlwb3MgPDw9IHJtZTk2LT5wbGF5YmFja19mcmxvZzsKKwljb3B5X2Zyb21fdXNlcl90b2lvKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19QTEFZX0JVRkZFUiArIHBvcywgc3JjLAorCQkJICAgIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2NhcHR1cmVfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCSAgICAgICBpbnQgY2hhbm5lbCwgLyogbm90IHVzZWQgKGludGVybGVhdmVkIGRhdGEpICovCisJCSAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsCisJCSAgICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY291bnQgPDw9IHJtZTk2LT5jYXB0dXJlX2ZybG9nOworCXBvcyA8PD0gcm1lOTYtPmNhcHR1cmVfZnJsb2c7CisJY29weV90b191c2VyX2Zyb21pbyhkc3QsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19SRUNfQlVGRkVSICsgcG9zLAorCQkJICAgIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaWdpdGFsIG91dHB1dCBjYXBhYmlsaXRlcyAoUy9QRElGKQorICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9pbmZvID0KK3sKKwkuaW5mbyA9CQkgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQX0lPTUVNIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9CSAgICAgKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCB8IAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfNjQwMDAgfAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfODgyMDAgfCAKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzk2MDAwKSwKKwkucmF0ZV9taW4gPQkgICAgIDMyMDAwLAorCS5yYXRlX21heCA9CSAgICAgOTYwMDAsCisJLmNoYW5uZWxzX21pbiA9CSAgICAgMiwKKwkuY2hhbm5lbHNfbWF4ID0JICAgICAyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gIFJNRTk2X0JVRkZFUl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gIFJNRTk2X1NNQUxMX0JMT0NLX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19taW4gPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfU01BTExfQkxPQ0tfU0laRSwKKwkuZmlmb19zaXplID0JICAgICAwLAorfTsKKworLyoKKyAqIERpZ2l0YWwgaW5wdXQgY2FwYWJpbGl0ZXMgKFMvUERJRikKKyAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9pbmZvID0KK3sKKwkuaW5mbyA9CQkgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQX0lPTUVNIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9CSAgICAgKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCB8IAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfNjQwMDAgfAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfODgyMDAgfCAKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzk2MDAwKSwKKwkucmF0ZV9taW4gPQkgICAgIDMyMDAwLAorCS5yYXRlX21heCA9CSAgICAgOTYwMDAsCisJLmNoYW5uZWxzX21pbiA9CSAgICAgMiwKKwkuY2hhbm5lbHNfbWF4ID0JICAgICAyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gIFJNRTk2X0JVRkZFUl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gIFJNRTk2X1NNQUxMX0JMT0NLX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19taW4gPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfU01BTExfQkxPQ0tfU0laRSwKKwkuZmlmb19zaXplID0JICAgICAwLAorfTsKKworLyoKKyAqIERpZ2l0YWwgb3V0cHV0IGNhcGFiaWxpdGVzIChBREFUKQorICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X2luZm8gPQoreworCS5pbmZvID0JCSAgICAgKFNORFJWX1BDTV9JTkZPX01NQVBfSU9NRU0gfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkgICAgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkgICAgICBTTkRSVl9QQ01fSU5GT19QQVVTRSksCisJLmZvcm1hdHMgPQkgICAgIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkgICAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJLnJhdGVzID0gICAgICAgICAgICAgKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCksCisJLnJhdGVfbWluID0gICAgICAgICAgNDQxMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9ICAgICAgOCwKKwkuY2hhbm5lbHNfbWF4ID0JICAgICA4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gIFJNRTk2X0JVRkZFUl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gIFJNRTk2X1NNQUxMX0JMT0NLX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19taW4gPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfU01BTExfQkxPQ0tfU0laRSwKKwkuZmlmb19zaXplID0JICAgICAwLAorfTsKKworLyoKKyAqIERpZ2l0YWwgaW5wdXQgY2FwYWJpbGl0ZXMgKEFEQVQpCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3JtZTk2X2NhcHR1cmVfYWRhdF9pbmZvID0KK3sKKwkuaW5mbyA9CQkgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQX0lPTUVNIHwKKwkJCSAgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJICAgICAgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9CSAgICAgKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCksCisJLnJhdGVfbWluID0gICAgICAgICAgNDQxMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9ICAgICAgOCwKKwkuY2hhbm5lbHNfbWF4ID0JICAgICA4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gIFJNRTk2X0JVRkZFUl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gIFJNRTk2X1NNQUxMX0JMT0NLX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19taW4gPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfTEFSR0VfQkxPQ0tfU0laRSwKKwkucGVyaW9kc19tYXggPQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFIC8gUk1FOTZfU01BTExfQkxPQ0tfU0laRSwKKwkuZmlmb19zaXplID0gICAgICAgICAwLAorfTsKKworLyoKKyAqIFRoZSBDREFUQSwgQ0NMSyBhbmQgQ0xBVENIIGJpdHMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdG8gdGhlIFNQSSBpbnRlcmZhY2UKKyAqIG9mIHRoZSBBRDE4NTIgb3IgQUQxODUyIEQvQSBjb252ZXJ0ZXIgb24gdGhlIGJvYXJkLiAgQ0RBVEEgbXVzdCBiZSBzZXQgdXAKKyAqIG9uIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQ0NMSyBhbmQgYmUgc3RhYmxlIG9uIHRoZSByaXNpbmcgZWRnZS4gIFRoZSByaXNpbmcKKyAqIGVkZ2Ugb2YgQ0xBVENIIGFmdGVyIHRoZSBsYXN0IGRhdGEgYml0IGNsb2NrcyBpbiB0aGUgd2hvbGUgZGF0YSB3b3JkLgorICogQSBmYXN0IHByb2Nlc3NvciBjb3VsZCBwcm9iYWJseSBkcml2ZSB0aGUgU1BJIGludGVyZmFjZSBmYXN0ZXIgdGhhbiB0aGUKKyAqIERBQyBjYW4gaGFuZGxlICgzTUh6IGZvciB0aGUgMTg1NSwgdW5rbm93biBmb3IgdGhlIDE4NTIpLiAgVGhlIHVkZWxheSgxKQorICogbGltaXRzIHRoZSBkYXRhIHJhdGUgdG8gNTAwS0h6IGFuZCBvbmx5IGNhdXNlcyBhIGRlbGF5IG9mIDMzIG1pY3Jvc2Vjcy4KKyAqCisgKiBOT1RFOiBpbmNyZWFzZWQgZGVsYXkgZnJvbSAxIHRvIDEwLCBzaW5jZSB0aGVyZSB3aGVyZSBwcm9ibGVtcyBzZXR0aW5nCisgKiB0aGUgdm9sdW1lLgorICovCitzdGF0aWMgdm9pZAorc25kX3JtZTk2X3dyaXRlX1NQSShybWU5Nl90ICpybWU5NiwgdTE2IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmICh2YWwgJiAweDgwMDApIHsKKwkJCXJtZTk2LT5hcmVnIHw9IFJNRTk2X0FSX0NEQVRBOworCQl9IGVsc2UgeworCQkJcm1lOTYtPmFyZWcgJj0gflJNRTk2X0FSX0NEQVRBOworCQl9CisJCXJtZTk2LT5hcmVnICY9IH4oUk1FOTZfQVJfQ0NMSyB8IFJNRTk2X0FSX0NMQVRDSCk7CisJCXdyaXRlbChybWU5Ni0+YXJlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0FERElUSU9OQUxfUkVHKTsKKwkJdWRlbGF5KDEwKTsKKwkJcm1lOTYtPmFyZWcgfD0gUk1FOTZfQVJfQ0NMSzsKKwkJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOworCQl1ZGVsYXkoMTApOworCQl2YWwgPDw9IDE7CisJfQorCXJtZTk2LT5hcmVnICY9IH4oUk1FOTZfQVJfQ0NMSyB8IFJNRTk2X0FSX0NEQVRBKTsKKwlybWU5Ni0+YXJlZyB8PSBSTUU5Nl9BUl9DTEFUQ0g7CisJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOworCXVkZWxheSgxMCk7CisJcm1lOTYtPmFyZWcgJj0gflJNRTk2X0FSX0NMQVRDSDsKKwl3cml0ZWwocm1lOTYtPmFyZWcsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19BRERJVElPTkFMX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTZfYXBwbHlfZGFjX3ZvbHVtZShybWU5Nl90ICpybWU5NikKK3sKKwlpZiAoUk1FOTZfREFDX0lTXzE4NTIocm1lOTYpKSB7CisJCXNuZF9ybWU5Nl93cml0ZV9TUEkocm1lOTYsIChybWU5Ni0+dm9sWzBdIDw8IDIpIHwgMHgwKTsKKwkJc25kX3JtZTk2X3dyaXRlX1NQSShybWU5NiwgKHJtZTk2LT52b2xbMV0gPDwgMikgfCAweDIpOworCX0gZWxzZSBpZiAoUk1FOTZfREFDX0lTXzE4NTUocm1lOTYpKSB7CisJCXNuZF9ybWU5Nl93cml0ZV9TUEkocm1lOTYsIChybWU5Ni0+dm9sWzBdICYgMHgzRkYpIHwgMHgwMDApOworCQlzbmRfcm1lOTZfd3JpdGVfU1BJKHJtZTk2LCAocm1lOTYtPnZvbFsxXSAmIDB4M0ZGKSB8IDB4NDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTZfcmVzZXRfZGFjKHJtZTk2X3QgKnJtZTk2KQoreworCXdyaXRlbChybWU5Ni0+d2NyZWcgfCBSTUU5Nl9XQ1JfUEQsCisJICAgICAgIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9nZXRtb250cmFja3Mocm1lOTZfdCAqcm1lOTYpCit7CisJcmV0dXJuICgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfTU9OSVRPUl8wKSAmIDEpICsKKwkJKCgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfTU9OSVRPUl8xKSAmIDEpIDw8IDEpOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfc2V0bW9udHJhY2tzKHJtZTk2X3QgKnJtZTk2LAorCQkgICAgICAgaW50IG1vbnRyYWNrcykKK3sKKwlpZiAobW9udHJhY2tzICYgMSkgeworCQlybWU5Ni0+d2NyZWcgfD0gUk1FOTZfV0NSX01PTklUT1JfMDsKKwl9IGVsc2UgeworCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9NT05JVE9SXzA7CisJfQorCWlmIChtb250cmFja3MgJiAyKSB7CisJCXJtZTk2LT53Y3JlZyB8PSBSTUU5Nl9XQ1JfTU9OSVRPUl8xOworCX0gZWxzZSB7CisJCXJtZTk2LT53Y3JlZyAmPSB+Uk1FOTZfV0NSX01PTklUT1JfMTsKKwl9CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfZ2V0YXR0ZW51YXRpb24ocm1lOTZfdCAqcm1lOTYpCit7CisJcmV0dXJuICgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfR0FJTl8wKSAmIDEpICsKKwkJKCgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfR0FJTl8xKSAmIDEpIDw8IDEpOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfc2V0YXR0ZW51YXRpb24ocm1lOTZfdCAqcm1lOTYsCisJCQkgaW50IGF0dGVudWF0aW9uKQoreworCXN3aXRjaCAoYXR0ZW51YXRpb24pIHsKKwljYXNlIDA6CisJCXJtZTk2LT53Y3JlZyA9IChybWU5Ni0+d2NyZWcgJiB+Uk1FOTZfV0NSX0dBSU5fMCkgJgorCQkJflJNRTk2X1dDUl9HQUlOXzE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcm1lOTYtPndjcmVnID0gKHJtZTk2LT53Y3JlZyB8IFJNRTk2X1dDUl9HQUlOXzApICYKKwkJCX5STUU5Nl9XQ1JfR0FJTl8xOworCQlicmVhazsKKwljYXNlIDI6CisJCXJtZTk2LT53Y3JlZyA9IChybWU5Ni0+d2NyZWcgJiB+Uk1FOTZfV0NSX0dBSU5fMCkgfAorCQkJUk1FOTZfV0NSX0dBSU5fMTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnIHwgUk1FOTZfV0NSX0dBSU5fMCkgfAorCQkJUk1FOTZfV0NSX0dBSU5fMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlbChybWU5Ni0+d2NyZWcsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2NhcHR1cmVfZ2V0cmF0ZShybWU5Nl90ICpybWU5NiwKKwkJCSAgaW50ICppc19hZGF0KQorewkKKwlpbnQgbiwgcmF0ZTsKKworCSppc19hZGF0ID0gMDsKKwlpZiAocm1lOTYtPmFyZWcgJiBSTUU5Nl9BUl9BTkFMT0cpIHsKKwkJLyogQW5hbG9nIGlucHV0LCBvdmVycmlkZXMgUy9QRElGIHNldHRpbmcgKi8KKwkJbiA9ICgocm1lOTYtPmFyZWcgPj4gUk1FOTZfQVJfQklUUE9TX0YwKSAmIDEpICsKKwkJCSgoKHJtZTk2LT5hcmVnID4+IFJNRTk2X0FSX0JJVFBPU19GMSkgJiAxKSA8PCAxKTsKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgMToKKwkJCXJhdGUgPSAzMjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyYXRlID0gNDQxMDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcmF0ZSA9IDQ4MDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIChybWU5Ni0+YXJlZyAmIFJNRTk2X0FSX0JJVFBPU19GMikgPyByYXRlIDw8IDEgOiByYXRlOworCX0KKworCXJtZTk2LT5yY3JlZyA9IHJlYWRsKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlpZiAocm1lOTYtPnJjcmVnICYgUk1FOTZfUkNSX0xPQ0spIHsKKwkJLyogQURBVCByYXRlICovCisJCSppc19hZGF0ID0gMTsKKwkJaWYgKHJtZTk2LT5yY3JlZyAmIFJNRTk2X1JDUl9UX09VVCkgeworCQkJcmV0dXJuIDQ4MDAwOworCQl9CisJCXJldHVybiA0NDEwMDsKKwl9CisKKwlpZiAocm1lOTYtPnJjcmVnICYgUk1FOTZfUkNSX1ZFUkYpIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKiBTL1BESUYgcmF0ZSAqLworCW4gPSAoKHJtZTk2LT5yY3JlZyA+PiBSTUU5Nl9SQ1JfQklUUE9TX0YwKSAmIDEpICsKKwkJKCgocm1lOTYtPnJjcmVnID4+IFJNRTk2X1JDUl9CSVRQT1NfRjEpICYgMSkgPDwgMSkgKworCQkoKChybWU5Ni0+cmNyZWcgPj4gUk1FOTZfUkNSX0JJVFBPU19GMikgJiAxKSA8PCAyKTsKKwkKKwlzd2l0Y2ggKG4pIHsKKwljYXNlIDA6CQkKKwkJaWYgKHJtZTk2LT5yY3JlZyAmIFJNRTk2X1JDUl9UX09VVCkgeworCQkJcmV0dXJuIDY0MDAwOworCQl9CisJCXJldHVybiAtMTsKKwljYXNlIDM6IHJldHVybiA5NjAwMDsKKwljYXNlIDQ6IHJldHVybiA4ODIwMDsKKwljYXNlIDU6IHJldHVybiA0ODAwMDsKKwljYXNlIDY6IHJldHVybiA0NDEwMDsKKwljYXNlIDc6IHJldHVybiAzMjAwMDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfcGxheWJhY2tfZ2V0cmF0ZShybWU5Nl90ICpybWU5NikKK3sKKwlpbnQgcmF0ZSwgZHVtbXk7CisKKwlpZiAoIShybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfTUFTVEVSKSAmJgorICAgICAgICAgICAgc25kX3JtZTk2X2dldGlucHV0dHlwZShybWU5NikgIT0gUk1FOTZfSU5QVVRfQU5BTE9HICYmCisJICAgIChyYXRlID0gc25kX3JtZTk2X2NhcHR1cmVfZ2V0cmF0ZShybWU5NiwgJmR1bW15KSkgPiAwKQorCXsKKwkgICAgICAgIC8qIHNsYXZlIGNsb2NrICovCisJICAgICAgICByZXR1cm4gcmF0ZTsKKwl9CisJcmF0ZSA9ICgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfRlJFUV8wKSAmIDEpICsKKwkJKCgocm1lOTYtPndjcmVnID4+IFJNRTk2X1dDUl9CSVRQT1NfRlJFUV8xKSAmIDEpIDw8IDEpOworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMToKKwkJcmF0ZSA9IDMyMDAwOworCQlicmVhazsKKwljYXNlIDI6CisJCXJhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyYXRlID0gNDgwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIChybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfRFMpID8gcmF0ZSA8PCAxIDogcmF0ZTsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X3BsYXliYWNrX3NldHJhdGUocm1lOTZfdCAqcm1lOTYsCisJCQkgICBpbnQgcmF0ZSkKK3sKKwlpbnQgZHM7CisKKwlkcyA9IHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9EUzsKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDMyMDAwOgorCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9EUzsKKwkJcm1lOTYtPndjcmVnID0gKHJtZTk2LT53Y3JlZyB8IFJNRTk2X1dDUl9GUkVRXzApICYKKwkJCX5STUU5Nl9XQ1JfRlJFUV8xOworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9EUzsKKwkJcm1lOTYtPndjcmVnID0gKHJtZTk2LT53Y3JlZyB8IFJNRTk2X1dDUl9GUkVRXzEpICYKKwkJCX5STUU5Nl9XQ1JfRlJFUV8wOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9EUzsKKwkJcm1lOTYtPndjcmVnID0gKHJtZTk2LT53Y3JlZyB8IFJNRTk2X1dDUl9GUkVRXzApIHwKKwkJCVJNRTk2X1dDUl9GUkVRXzE7CisJCWJyZWFrOworCWNhc2UgNjQwMDA6CisJCXJtZTk2LT53Y3JlZyB8PSBSTUU5Nl9XQ1JfRFM7CisJCXJtZTk2LT53Y3JlZyA9IChybWU5Ni0+d2NyZWcgfCBSTUU5Nl9XQ1JfRlJFUV8wKSAmCisJCQl+Uk1FOTZfV0NSX0ZSRVFfMTsKKwkJYnJlYWs7CisJY2FzZSA4ODIwMDoKKwkJcm1lOTYtPndjcmVnIHw9IFJNRTk2X1dDUl9EUzsKKwkJcm1lOTYtPndjcmVnID0gKHJtZTk2LT53Y3JlZyB8IFJNRTk2X1dDUl9GUkVRXzEpICYKKwkJCX5STUU5Nl9XQ1JfRlJFUV8wOworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQlybWU5Ni0+d2NyZWcgfD0gUk1FOTZfV0NSX0RTOworCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnIHwgUk1FOTZfV0NSX0ZSRVFfMCkgfAorCQkJUk1FOTZfV0NSX0ZSRVFfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoIWRzICYmIHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9EUykgfHwKKwkgICAgKGRzICYmICEocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX0RTKSkpCisJeworCQkvKiBjaGFuZ2UgdG8vZnJvbSBkb3VibGUtc3BlZWQ6IHJlc2V0IHRoZSBEQUMgKGlmIGF2YWlsYWJsZSkgKi8KKwkJc25kX3JtZTk2X3Jlc2V0X2RhYyhybWU5Nik7CisJfSBlbHNlIHsKKwkJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2NhcHR1cmVfYW5hbG9nX3NldHJhdGUocm1lOTZfdCAqcm1lOTYsCisJCQkJIGludCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMzIwMDA6CisJCXJtZTk2LT5hcmVnID0gKChybWU5Ni0+YXJlZyB8IFJNRTk2X0FSX0ZSRVFQQURfMCkgJgorCQkJICAgICAgIH5STUU5Nl9BUl9GUkVRUEFEXzEpICYgflJNRTk2X0FSX0ZSRVFQQURfMjsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJcm1lOTYtPmFyZWcgPSAoKHJtZTk2LT5hcmVnICYgflJNRTk2X0FSX0ZSRVFQQURfMCkgfAorCQkJICAgICAgIFJNRTk2X0FSX0ZSRVFQQURfMSkgJiB+Uk1FOTZfQVJfRlJFUVBBRF8yOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQlybWU5Ni0+YXJlZyA9ICgocm1lOTYtPmFyZWcgfCBSTUU5Nl9BUl9GUkVRUEFEXzApIHwKKwkJCSAgICAgICBSTUU5Nl9BUl9GUkVRUEFEXzEpICYgflJNRTk2X0FSX0ZSRVFQQURfMjsKKwkJYnJlYWs7CisJY2FzZSA2NDAwMDoKKwkJaWYgKHJtZTk2LT5yZXYgPCA0KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlybWU5Ni0+YXJlZyA9ICgocm1lOTYtPmFyZWcgfCBSTUU5Nl9BUl9GUkVRUEFEXzApICYKKwkJCSAgICAgICB+Uk1FOTZfQVJfRlJFUVBBRF8xKSB8IFJNRTk2X0FSX0ZSRVFQQURfMjsKKwkJYnJlYWs7CisJY2FzZSA4ODIwMDoKKwkJaWYgKHJtZTk2LT5yZXYgPCA0KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlybWU5Ni0+YXJlZyA9ICgocm1lOTYtPmFyZWcgJiB+Uk1FOTZfQVJfRlJFUVBBRF8wKSB8CisJCQkgICAgICAgUk1FOTZfQVJfRlJFUVBBRF8xKSB8IFJNRTk2X0FSX0ZSRVFQQURfMjsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDoKKwkJcm1lOTYtPmFyZWcgPSAoKHJtZTk2LT5hcmVnIHwgUk1FOTZfQVJfRlJFUVBBRF8wKSB8CisJCQkgICAgICAgUk1FOTZfQVJfRlJFUVBBRF8xKSB8IFJNRTk2X0FSX0ZSRVFQQURfMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlbChybWU5Ni0+YXJlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0FERElUSU9OQUxfUkVHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X3NldGNsb2NrbW9kZShybWU5Nl90ICpybWU5NiwKKwkJICAgICAgIGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUk1FOTZfQ0xPQ0tNT0RFX1NMQVZFOgorCSAgICAgICAgLyogQXV0b1N5bmMgKi8gCisJCXJtZTk2LT53Y3JlZyAmPSB+Uk1FOTZfV0NSX01BU1RFUjsKKwkJcm1lOTYtPmFyZWcgJj0gflJNRTk2X0FSX1dTRUw7CisJCWJyZWFrOworCWNhc2UgUk1FOTZfQ0xPQ0tNT0RFX01BU1RFUjoKKwkgICAgICAgIC8qIEludGVybmFsICovCisJCXJtZTk2LT53Y3JlZyB8PSBSTUU5Nl9XQ1JfTUFTVEVSOworCQlybWU5Ni0+YXJlZyAmPSB+Uk1FOTZfQVJfV1NFTDsKKwkJYnJlYWs7CisJY2FzZSBSTUU5Nl9DTE9DS01PREVfV09SRENMT0NLOgorCQkvKiBXb3JkIGNsb2NrIGlzIGEgbWFzdGVyIG1vZGUgKi8KKwkJcm1lOTYtPndjcmVnIHw9IFJNRTk2X1dDUl9NQVNURVI7IAorCQlybWU5Ni0+YXJlZyB8PSBSTUU5Nl9BUl9XU0VMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXdyaXRlbChybWU5Ni0+YXJlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0FERElUSU9OQUxfUkVHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2dldGNsb2NrbW9kZShybWU5Nl90ICpybWU5NikKK3sKKwlpZiAocm1lOTYtPmFyZWcgJiBSTUU5Nl9BUl9XU0VMKSB7CisJCXJldHVybiBSTUU5Nl9DTE9DS01PREVfV09SRENMT0NLOworCX0KKwlyZXR1cm4gKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9NQVNURVIpID8gUk1FOTZfQ0xPQ0tNT0RFX01BU1RFUiA6CisJCVJNRTk2X0NMT0NLTU9ERV9TTEFWRTsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X3NldGlucHV0dHlwZShybWU5Nl90ICpybWU5NiwKKwkJICAgICAgIGludCB0eXBlKQoreworCWludCBuOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSTUU5Nl9JTlBVVF9PUFRJQ0FMOgorCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnICYgflJNRTk2X1dDUl9JTlBfMCkgJgorCQkJflJNRTk2X1dDUl9JTlBfMTsKKwkJYnJlYWs7CisJY2FzZSBSTUU5Nl9JTlBVVF9DT0FYSUFMOgorCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnIHwgUk1FOTZfV0NSX0lOUF8wKSAmCisJCQl+Uk1FOTZfV0NSX0lOUF8xOworCQlicmVhazsKKwljYXNlIFJNRTk2X0lOUFVUX0lOVEVSTkFMOgorCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnICYgflJNRTk2X1dDUl9JTlBfMCkgfAorCQkJUk1FOTZfV0NSX0lOUF8xOworCQlicmVhazsKKwljYXNlIFJNRTk2X0lOUFVUX1hMUjoKKwkJaWYgKChybWU5Ni0+cGNpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9ESUdJOTZfOF9QQURfT1JfUFNUICYmCisJCSAgICAgcm1lOTYtPnBjaS0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUFJPKSB8fAorCQkgICAgKHJtZTk2LT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BBRF9PUl9QU1QgJiYKKwkJICAgICBybWU5Ni0+cmV2ID4gNCkpCisJCXsKKwkJCS8qIE9ubHkgRGlnaTk2LzggUFJPIGFuZCBEaWdpOTYvOCBQQUQgc3VwcG9ydHMgWExSICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlybWU5Ni0+d2NyZWcgPSAocm1lOTYtPndjcmVnIHwgUk1FOTZfV0NSX0lOUF8wKSB8CisJCQlSTUU5Nl9XQ1JfSU5QXzE7CisJCWJyZWFrOworCWNhc2UgUk1FOTZfSU5QVVRfQU5BTE9HOgorCQlpZiAoIVJNRTk2X0hBU19BTkFMT0dfSU4ocm1lOTYpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlybWU5Ni0+YXJlZyB8PSBSTUU5Nl9BUl9BTkFMT0c7CisJCXdyaXRlbChybWU5Ni0+YXJlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0FERElUSU9OQUxfUkVHKTsKKwkJaWYgKHJtZTk2LT5yZXYgPCA0KSB7CisJCQkvKgorCQkJICogUmV2aXNpb24gbGVzcyB0aGFuIDAwNCBkb2VzIG5vdCBzdXBwb3J0IDY0IGFuZAorCQkJICogODguMiBrSHoKKwkJCSAqLworCQkJaWYgKHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZuKSA9PSA4ODIwMCkgeworCQkJCXNuZF9ybWU5Nl9jYXB0dXJlX2FuYWxvZ19zZXRyYXRlKHJtZTk2LCA0NDEwMCk7CisJCQl9CisJCQlpZiAoc25kX3JtZTk2X2NhcHR1cmVfZ2V0cmF0ZShybWU5NiwgJm4pID09IDY0MDAwKSB7CisJCQkJc25kX3JtZTk2X2NhcHR1cmVfYW5hbG9nX3NldHJhdGUocm1lOTYsIDMyMDAwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHR5cGUgIT0gUk1FOTZfSU5QVVRfQU5BTE9HICYmIFJNRTk2X0hBU19BTkFMT0dfSU4ocm1lOTYpKSB7CisJCXJtZTk2LT5hcmVnICY9IH5STUU5Nl9BUl9BTkFMT0c7CisJCXdyaXRlbChybWU5Ni0+YXJlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0FERElUSU9OQUxfUkVHKTsKKwl9CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfZ2V0aW5wdXR0eXBlKHJtZTk2X3QgKnJtZTk2KQoreworCWlmIChybWU5Ni0+YXJlZyAmIFJNRTk2X0FSX0FOQUxPRykgeworCQlyZXR1cm4gUk1FOTZfSU5QVVRfQU5BTE9HOworCX0KKwlyZXR1cm4gKChybWU5Ni0+d2NyZWcgPj4gUk1FOTZfV0NSX0JJVFBPU19JTlBfMCkgJiAxKSArCisJCSgoKHJtZTk2LT53Y3JlZyA+PiBSTUU5Nl9XQ1JfQklUUE9TX0lOUF8xKSAmIDEpIDw8IDEpOworfQorCitzdGF0aWMgdm9pZAorc25kX3JtZTk2X3NldGZyYW1lbG9nKHJtZTk2X3QgKnJtZTk2LAorCQkgICAgICBpbnQgbl9jaGFubmVscywKKwkJICAgICAgaW50IGlzX3BsYXliYWNrKQoreworCWludCBmcmxvZzsKKwkKKwlpZiAobl9jaGFubmVscyA9PSAyKSB7CisJCWZybG9nID0gMTsKKwl9IGVsc2UgeworCQkvKiBhc3N1bWUgOCBjaGFubmVscyAqLworCQlmcmxvZyA9IDM7CisJfQorCWlmIChpc19wbGF5YmFjaykgeworCQlmcmxvZyArPSAocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX01PREUyNCkgPyAyIDogMTsKKwkJcm1lOTYtPnBsYXliYWNrX2ZybG9nID0gZnJsb2c7CisJfSBlbHNlIHsKKwkJZnJsb2cgKz0gKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9NT0RFMjRfMikgPyAyIDogMTsKKwkJcm1lOTYtPmNhcHR1cmVfZnJsb2cgPSBmcmxvZzsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19zZXRmb3JtYXQocm1lOTZfdCAqcm1lOTYsCisJCQkgICAgIGludCBmb3JtYXQpCit7CisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9NT0RFMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCXJtZTk2LT53Y3JlZyB8PSBSTUU5Nl9XQ1JfTU9ERTI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfY2FwdHVyZV9zZXRmb3JtYXQocm1lOTZfdCAqcm1lOTYsCisJCQkgICAgaW50IGZvcm1hdCkKK3sKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCXJtZTk2LT53Y3JlZyAmPSB+Uk1FOTZfV0NSX01PREUyNF8yOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlybWU5Ni0+d2NyZWcgfD0gUk1FOTZfV0NSX01PREUyNF8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc25kX3JtZTk2X3NldF9wZXJpb2RfcHJvcGVydGllcyhybWU5Nl90ICpybWU5NiwKKwkJCQlzaXplX3QgcGVyaW9kX2J5dGVzKQoreworCXN3aXRjaCAocGVyaW9kX2J5dGVzKSB7CisJY2FzZSBSTUU5Nl9MQVJHRV9CTE9DS19TSVpFOgorCQlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9JU0VMOworCQlicmVhazsKKwljYXNlIFJNRTk2X1NNQUxMX0JMT0NLX1NJWkU6CisJCXJtZTk2LT53Y3JlZyB8PSBSTUU5Nl9XQ1JfSVNFTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlicmVhazsKKwl9CisJcm1lOTYtPndjcmVnICY9IH5STUU5Nl9XQ1JfSURJUzsKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVyciwgcmF0ZSwgZHVtbXk7CisKKwlydW50aW1lLT5kbWFfYXJlYSA9ICh2b2lkICopKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19QTEFZX0JVRkZFUik7CisJcnVudGltZS0+ZG1hX2FkZHIgPSBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1BMQVlfQlVGRkVSOworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IFJNRTk2X0JVRkZFUl9TSVpFOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCWlmICghKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9NQVNURVIpICYmCisgICAgICAgICAgICBzbmRfcm1lOTZfZ2V0aW5wdXR0eXBlKHJtZTk2KSAhPSBSTUU5Nl9JTlBVVF9BTkFMT0cgJiYKKwkgICAgKHJhdGUgPSBzbmRfcm1lOTZfY2FwdHVyZV9nZXRyYXRlKHJtZTk2LCAmZHVtbXkpKSA+IDApCisJeworICAgICAgICAgICAgICAgIC8qIHNsYXZlIGNsb2NrICovCisgICAgICAgICAgICAgICAgaWYgKChpbnQpcGFyYW1zX3JhdGUocGFyYW1zKSAhPSByYXRlKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwkJCXJldHVybiAtRUlPOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCX0gZWxzZSBpZiAoKGVyciA9IHNuZF9ybWU5Nl9wbGF5YmFja19zZXRyYXRlKHJtZTk2LCBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9ybWU5Nl9wbGF5YmFja19zZXRmb3JtYXQocm1lOTYsIHBhcmFtc19mb3JtYXQocGFyYW1zKSkpIDwgMCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX3JtZTk2X3NldGZyYW1lbG9nKHJtZTk2LCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSwgMSk7CisJaWYgKHJtZTk2LT5jYXB0dXJlX3BlcmlvZHNpemUgIT0gMCkgeworCQlpZiAocGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykgPDwgcm1lOTYtPnBsYXliYWNrX2ZybG9nICE9CisJCSAgICBybWU5Ni0+Y2FwdHVyZV9wZXJpb2RzaXplKQorCQl7CisJCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJcm1lOTYtPnBsYXliYWNrX3BlcmlvZHNpemUgPQorCQlwYXJhbXNfcGVyaW9kX3NpemUocGFyYW1zKSA8PCBybWU5Ni0+cGxheWJhY2tfZnJsb2c7CisJc25kX3JtZTk2X3NldF9wZXJpb2RfcHJvcGVydGllcyhybWU5Niwgcm1lOTYtPnBsYXliYWNrX3BlcmlvZHNpemUpOworCS8qIFMvUERJRiBzZXR1cCAqLworCWlmICgocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX0FEQVQpID09IDApIHsKKwkJcm1lOTYtPndjcmVnICY9IH4oUk1FOTZfV0NSX1BSTyB8IFJNRTk2X1dDUl9ET0xCWSB8IFJNRTk2X1dDUl9FTVApOworCQl3cml0ZWwocm1lOTYtPndjcmVnIHw9IHJtZTk2LT53Y3JlZ19zcGRpZl9zdHJlYW0sIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfY2FwdHVyZV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcykKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyLCBpc2FkYXQsIHJhdGU7CisJCisJcnVudGltZS0+ZG1hX2FyZWEgPSAodm9pZCAqKShybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fUkVDX0JVRkZFUik7CisJcnVudGltZS0+ZG1hX2FkZHIgPSBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1JFQ19CVUZGRVI7CisJcnVudGltZS0+ZG1hX2J5dGVzID0gUk1FOTZfQlVGRkVSX1NJWkU7CisKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJaWYgKChlcnIgPSBzbmRfcm1lOTZfY2FwdHVyZV9zZXRmb3JtYXQocm1lOTYsIHBhcmFtc19mb3JtYXQocGFyYW1zKSkpIDwgMCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNuZF9ybWU5Nl9nZXRpbnB1dHR5cGUocm1lOTYpID09IFJNRTk2X0lOUFVUX0FOQUxPRykgeworCQlpZiAoKGVyciA9IHNuZF9ybWU5Nl9jYXB0dXJlX2FuYWxvZ19zZXRyYXRlKHJtZTk2LAorCQkJCQkJCSAgICBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKQorCQl7CisJCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9IGVsc2UgaWYgKChyYXRlID0gc25kX3JtZTk2X2NhcHR1cmVfZ2V0cmF0ZShybWU5NiwgJmlzYWRhdCkpID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgoaW50KXBhcmFtc19yYXRlKHBhcmFtcykgIT0gcmF0ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJCQlyZXR1cm4gLUVJTzsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGlzYWRhdCAmJiBydW50aW1lLT5ody5jaGFubmVsc19taW4gPT0gMikgfHwKKyAgICAgICAgICAgICAgICAgICAgKCFpc2FkYXQgJiYgcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID09IDgpKQorICAgICAgICAgICAgICAgIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCQkJcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJc25kX3JtZTk2X3NldGZyYW1lbG9nKHJtZTk2LCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSwgMCk7CisJaWYgKHJtZTk2LT5wbGF5YmFja19wZXJpb2RzaXplICE9IDApIHsKKwkJaWYgKHBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpIDw8IHJtZTk2LT5jYXB0dXJlX2ZybG9nICE9CisJCSAgICBybWU5Ni0+cGxheWJhY2tfcGVyaW9kc2l6ZSkKKwkJeworCQkJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCXJtZTk2LT5jYXB0dXJlX3BlcmlvZHNpemUgPQorCQlwYXJhbXNfcGVyaW9kX3NpemUocGFyYW1zKSA8PCBybWU5Ni0+Y2FwdHVyZV9mcmxvZzsKKwlzbmRfcm1lOTZfc2V0X3BlcmlvZF9wcm9wZXJ0aWVzKHJtZTk2LCBybWU5Ni0+Y2FwdHVyZV9wZXJpb2RzaXplKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc25kX3JtZTk2X3BsYXliYWNrX3N0YXJ0KHJtZTk2X3QgKnJtZTk2LAorCQkJIGludCBmcm9tX3BhdXNlKQoreworCWlmICghZnJvbV9wYXVzZSkgeworCQl3cml0ZWwoMCwgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX1JFU0VUX1BMQVlfUE9TKTsKKwl9CisKKwlybWU5Ni0+d2NyZWcgfD0gUk1FOTZfV0NSX1NUQVJUOworCXdyaXRlbChybWU5Ni0+d2NyZWcsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKK30KKworc3RhdGljIHZvaWQKK3NuZF9ybWU5Nl9jYXB0dXJlX3N0YXJ0KHJtZTk2X3QgKnJtZTk2LAorCQkJaW50IGZyb21fcGF1c2UpCit7CisJaWYgKCFmcm9tX3BhdXNlKSB7CisJCXdyaXRlbCgwLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fUkVTRVRfUkVDX1BPUyk7CisJfQorCisJcm1lOTYtPndjcmVnIHw9IFJNRTk2X1dDUl9TVEFSVF8yOworCXdyaXRlbChybWU5Ni0+d2NyZWcsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKK30KKworc3RhdGljIHZvaWQKK3NuZF9ybWU5Nl9wbGF5YmFja19zdG9wKHJtZTk2X3QgKnJtZTk2KQoreworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gdW5jb25maXJtZWQgSVJRLCBpZiBzbyBjb25maXJtIGl0LCBvciBlbHNlCisJICogdGhlIGhhcmR3YXJlIHdpbGwgbm90IHN0b3AgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisJICovCisJcm1lOTYtPnJjcmVnID0gcmVhZGwocm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCWlmIChybWU5Ni0+cmNyZWcgJiBSTUU5Nl9SQ1JfSVJRKSB7CisJCXdyaXRlbCgwLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09ORklSTV9QTEFZX0lSUSk7CisJfQkKKwlybWU5Ni0+d2NyZWcgJj0gflJNRTk2X1dDUl9TVEFSVDsKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTZfY2FwdHVyZV9zdG9wKHJtZTk2X3QgKnJtZTk2KQoreworCXJtZTk2LT5yY3JlZyA9IHJlYWRsKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlpZiAocm1lOTYtPnJjcmVnICYgUk1FOTZfUkNSX0lSUV8yKSB7CisJCXdyaXRlbCgwLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09ORklSTV9SRUNfSVJRKTsKKwl9CQorCXJtZTk2LT53Y3JlZyAmPSB+Uk1FOTZfV0NSX1NUQVJUXzI7CisJd3JpdGVsKHJtZTk2LT53Y3JlZywgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NuZF9ybWU5Nl9pbnRlcnJ1cHQoaW50IGlycSwKKwkJICAgIHZvaWQgKmRldl9pZCwKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJtZTk2X3QgKnJtZTk2ID0gKHJtZTk2X3QgKilkZXZfaWQ7CisKKwlybWU5Ni0+cmNyZWcgPSByZWFkbChybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJaWYgKCEoKHJtZTk2LT5yY3JlZyAmIFJNRTk2X1JDUl9JUlEpIHx8CisJICAgICAgKHJtZTk2LT5yY3JlZyAmIFJNRTk2X1JDUl9JUlFfMikpKQorCXsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwkKKwlpZiAocm1lOTYtPnJjcmVnICYgUk1FOTZfUkNSX0lSUSkgeworCQkvKiBwbGF5YmFjayAqLworICAgICAgICAgICAgICAgIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQocm1lOTYtPnBsYXliYWNrX3N1YnN0cmVhbSk7CisJCXdyaXRlbCgwLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09ORklSTV9QTEFZX0lSUSk7CisJfQorCWlmIChybWU5Ni0+cmNyZWcgJiBSTUU5Nl9SQ1JfSVJRXzIpIHsKKwkJLyogY2FwdHVyZSAqLworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHJtZTk2LT5jYXB0dXJlX3N1YnN0cmVhbSk7CQkKKwkJd3JpdGVsKDAsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05GSVJNX1JFQ19JUlEpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzW10gPSB7IFJNRTk2X1NNQUxMX0JMT0NLX1NJWkUsIFJNRTk2X0xBUkdFX0JMT0NLX1NJWkUgfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfcGVyaW9kX2J5dGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX2J5dGVzKSwKKwkubGlzdCA9IHBlcmlvZF9ieXRlcywKKwkubWFzayA9IDAKK307CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyAgICAgICAgaW50IHJhdGUsIGR1bW15OworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOwkKKyAgICAgICAgaWYgKHJtZTk2LT5wbGF5YmFja19zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisJcm1lOTYtPndjcmVnICY9IH5STUU5Nl9XQ1JfQURBVDsKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJcm1lOTYtPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKworCXJ1bnRpbWUtPmh3ID0gc25kX3JtZTk2X3BsYXliYWNrX3NwZGlmX2luZm87CisJaWYgKCEocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX01BU1RFUikgJiYKKyAgICAgICAgICAgIHNuZF9ybWU5Nl9nZXRpbnB1dHR5cGUocm1lOTYpICE9IFJNRTk2X0lOUFVUX0FOQUxPRyAmJgorCSAgICAocmF0ZSA9IHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZkdW1teSkpID4gMCkKKwl7CisgICAgICAgICAgICAgICAgLyogc2xhdmUgY2xvY2sgKi8KKyAgICAgICAgICAgICAgICBydW50aW1lLT5ody5yYXRlcyA9IHNuZF9ybWU5Nl9yYXRlY29kZShyYXRlKTsKKyAgICAgICAgICAgICAgICBydW50aW1lLT5ody5yYXRlX21pbiA9IHJhdGU7CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9tYXggPSByYXRlOworCX0gICAgICAgIAorCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgUk1FOTZfQlVGRkVSX1NJWkUsIFJNRTk2X0JVRkZFUl9TSVpFKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfcGVyaW9kX2J5dGVzKTsKKworCXJtZTk2LT53Y3JlZ19zcGRpZl9zdHJlYW0gPSBybWU5Ni0+d2NyZWdfc3BkaWY7CisJcm1lOTYtPnNwZGlmX2N0bC0+dmRbMF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJc25kX2N0bF9ub3RpZnkocm1lOTYtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKKwkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sICZybWU5Ni0+c3BkaWZfY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9jYXB0dXJlX3NwZGlmX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworICAgICAgICBpbnQgaXNhZGF0LCByYXRlOworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJcnVudGltZS0+aHcgPSBzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9pbmZvOworICAgICAgICBpZiAoc25kX3JtZTk2X2dldGlucHV0dHlwZShybWU5NikgIT0gUk1FOTZfSU5QVVRfQU5BTE9HICYmCisgICAgICAgICAgICAocmF0ZSA9IHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZpc2FkYXQpKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNhZGF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZXMgPSBzbmRfcm1lOTZfcmF0ZWNvZGUocmF0ZSk7CisgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9taW4gPSByYXRlOworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gcmF0ZTsKKyAgICAgICAgfQorICAgICAgICAKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisgICAgICAgIGlmIChybWU5Ni0+Y2FwdHVyZV9zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisJcm1lOTYtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCQorCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgUk1FOTZfQlVGRkVSX1NJWkUsIFJNRTk2X0JVRkZFUl9TSVpFKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfcGVyaW9kX2J5dGVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfcGxheWJhY2tfYWRhdF9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKyAgICAgICAgaW50IHJhdGUsIGR1bW15OworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOyAgICAgICAgCisJCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOwkKKyAgICAgICAgaWYgKHJtZTk2LT5wbGF5YmFja19zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisJcm1lOTYtPndjcmVnIHw9IFJNRTk2X1dDUl9BREFUOworCXdyaXRlbChybWU5Ni0+d2NyZWcsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwlybWU5Ni0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCQorCXJ1bnRpbWUtPmh3ID0gc25kX3JtZTk2X3BsYXliYWNrX2FkYXRfaW5mbzsKKwlpZiAoIShybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfTUFTVEVSKSAmJgorICAgICAgICAgICAgc25kX3JtZTk2X2dldGlucHV0dHlwZShybWU5NikgIT0gUk1FOTZfSU5QVVRfQU5BTE9HICYmCisJICAgIChyYXRlID0gc25kX3JtZTk2X2NhcHR1cmVfZ2V0cmF0ZShybWU5NiwgJmR1bW15KSkgPiAwKQorCXsKKyAgICAgICAgICAgICAgICAvKiBzbGF2ZSBjbG9jayAqLworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVzID0gc25kX3JtZTk2X3JhdGVjb2RlKHJhdGUpOworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWluID0gcmF0ZTsKKyAgICAgICAgICAgICAgICBydW50aW1lLT5ody5yYXRlX21heCA9IHJhdGU7CisJfSAgICAgICAgCisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCBSTUU5Nl9CVUZGRVJfU0laRSwgUk1FOTZfQlVGRkVSX1NJWkUpOworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsICZod19jb25zdHJhaW50c19wZXJpb2RfYnl0ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfY2FwdHVyZV9hZGF0X29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworICAgICAgICBpbnQgaXNhZGF0LCByYXRlOworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJcnVudGltZS0+aHcgPSBzbmRfcm1lOTZfY2FwdHVyZV9hZGF0X2luZm87CisgICAgICAgIGlmIChzbmRfcm1lOTZfZ2V0aW5wdXR0eXBlKHJtZTk2KSA9PSBSTUU5Nl9JTlBVVF9BTkFMT0cpIHsKKyAgICAgICAgICAgICAgICAvKiBtYWtlcyBubyBzZW5zZSB0byB1c2UgYW5hbG9nIGlucHV0LiBOb3RlIHRoYXQgYW5hbG9nCisgICAgICAgICAgICAgICAgICAgZXhwZW5zaW9uIGNhcmRzIEFFQjQvOC1JIGFyZSBSTUU5Nl9JTlBVVF9JTlRFUk5BTCAqLworICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisgICAgICAgIGlmICgocmF0ZSA9IHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZpc2FkYXQpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzYWRhdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVzID0gc25kX3JtZTk2X3JhdGVjb2RlKHJhdGUpOworICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWluID0gcmF0ZTsKKyAgICAgICAgICAgICAgICBydW50aW1lLT5ody5yYXRlX21heCA9IHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOwkKKyAgICAgICAgaWYgKHJtZTk2LT5jYXB0dXJlX3N1YnN0cmVhbSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKwlybWU5Ni0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIFJNRTk2X0JVRkZFUl9TSVpFLCBSTUU5Nl9CVUZGRVJfU0laRSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9ieXRlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHNwZGlmID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnJtZTk2LT5sb2NrKTsJCisJaWYgKFJNRTk2X0lTUExBWUlORyhybWU5NikpIHsKKwkJc25kX3JtZTk2X3BsYXliYWNrX3N0b3Aocm1lOTYpOworCX0KKwlybWU5Ni0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKKwlybWU5Ni0+cGxheWJhY2tfcGVyaW9kc2l6ZSA9IDA7CisJc3BkaWYgPSAocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX0FEQVQpID09IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJaWYgKHNwZGlmKSB7CisJCXJtZTk2LT5zcGRpZl9jdGwtPnZkWzBdLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJCXNuZF9jdGxfbm90aWZ5KHJtZTk2LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywgJnJtZTk2LT5zcGRpZl9jdGwtPmlkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CQorCWlmIChSTUU5Nl9JU1JFQ09SRElORyhybWU5NikpIHsKKwkJc25kX3JtZTk2X2NhcHR1cmVfc3RvcChybWU5Nik7CisJfQorCXJtZTk2LT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJcm1lOTYtPmNhcHR1cmVfcGVyaW9kc2l6ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CQorCWlmIChSTUU5Nl9JU1BMQVlJTkcocm1lOTYpKSB7CisJCXNuZF9ybWU5Nl9wbGF5YmFja19zdG9wKHJtZTk2KTsKKwl9CisJd3JpdGVsKDAsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19SRVNFVF9QTEFZX1BPUyk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCQorCXNwaW5fbG9ja19pcnEoJnJtZTk2LT5sb2NrKTsJCisJaWYgKFJNRTk2X0lTUkVDT1JESU5HKHJtZTk2KSkgeworCQlzbmRfcm1lOTZfY2FwdHVyZV9zdG9wKHJtZTk2KTsKKwl9CisJd3JpdGVsKDAsIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19SRVNFVF9SRUNfUE9TKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X3BsYXliYWNrX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCAKKwkJCSAgIGludCBjbWQpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWlmICghUk1FOTZfSVNQTEFZSU5HKHJtZTk2KSkgeworCQkJaWYgKHN1YnN0cmVhbSAhPSBybWU5Ni0+cGxheWJhY2tfc3Vic3RyZWFtKSB7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCXNuZF9ybWU5Nl9wbGF5YmFja19zdGFydChybWU5NiwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWlmIChSTUU5Nl9JU1BMQVlJTkcocm1lOTYpKSB7CisJCQlpZiAoc3Vic3RyZWFtICE9IHJtZTk2LT5wbGF5YmFja19zdWJzdHJlYW0pIHsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJc25kX3JtZTk2X3BsYXliYWNrX3N0b3Aocm1lOTYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlpZiAoUk1FOTZfSVNQTEFZSU5HKHJtZTk2KSkgeworCQkJc25kX3JtZTk2X3BsYXliYWNrX3N0b3Aocm1lOTYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlpZiAoIVJNRTk2X0lTUExBWUlORyhybWU5NikpIHsKKwkJCXNuZF9ybWU5Nl9wbGF5YmFja19zdGFydChybWU5NiwgMSk7CisJCX0KKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2NhcHR1cmVfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIAorCQkJICBpbnQgY21kKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAoIVJNRTk2X0lTUkVDT1JESU5HKHJtZTk2KSkgeworCQkJaWYgKHN1YnN0cmVhbSAhPSBybWU5Ni0+Y2FwdHVyZV9zdWJzdHJlYW0pIHsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJc25kX3JtZTk2X2NhcHR1cmVfc3RhcnQocm1lOTYsIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlpZiAoUk1FOTZfSVNSRUNPUkRJTkcocm1lOTYpKSB7CisJCQlpZiAoc3Vic3RyZWFtICE9IHJtZTk2LT5jYXB0dXJlX3N1YnN0cmVhbSkgeworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlzbmRfcm1lOTZfY2FwdHVyZV9zdG9wKHJtZTk2KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKFJNRTk2X0lTUkVDT1JESU5HKHJtZTk2KSkgeworCQkJc25kX3JtZTk2X2NhcHR1cmVfc3RvcChybWU5Nik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWlmICghUk1FOTZfSVNSRUNPUkRJTkcocm1lOTYpKSB7CisJCQlzbmRfcm1lOTZfY2FwdHVyZV9zdGFydChybWU5NiwgMSk7CisJCX0KKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3NuZF9ybWU5Nl9wbGF5YmFja19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX3JtZTk2X3BsYXliYWNrX3B0cihybWU5Nik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAorc25kX3JtZTk2X2NhcHR1cmVfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9ybWU5Nl9jYXB0dXJlX3B0cihybWU5Nik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcHMgPSB7CisJLm9wZW4gPQkJc25kX3JtZTk2X3BsYXliYWNrX3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTk2X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lOTZfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX3JtZTk2X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lOTZfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ybWU5Nl9wbGF5YmFja19wb2ludGVyLAorCS5jb3B5ID0JCXNuZF9ybWU5Nl9wbGF5YmFja19jb3B5LAorCS5zaWxlbmNlID0Jc25kX3JtZTk2X3BsYXliYWNrX3NpbGVuY2UsCisJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9ybWU5Nl9jYXB0dXJlX3NwZGlmX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9vcGVuLAorCS5jbG9zZSA9CXNuZF9ybWU5Nl9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lOTZfY2FwdHVyZV9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfcm1lOTZfY2FwdHVyZV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTk2X2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ybWU5Nl9jYXB0dXJlX3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX3JtZTk2X2NhcHR1cmVfY29weSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3JtZTk2X3BsYXliYWNrX2FkYXRfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTk2X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lOTZfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX3JtZTk2X3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfcm1lOTZfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ybWU5Nl9wbGF5YmFja19wb2ludGVyLAorCS5jb3B5ID0JCXNuZF9ybWU5Nl9wbGF5YmFja19jb3B5LAorCS5zaWxlbmNlID0Jc25kX3JtZTk2X3BsYXliYWNrX3NpbGVuY2UsCisJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BzID0geworCS5vcGVuID0JCXNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfcm1lOTZfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3JtZTk2X2NhcHR1cmVfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0Jc25kX3JtZTk2X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9ybWU5Nl9jYXB0dXJlX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfcm1lOTZfY2FwdHVyZV9wb2ludGVyLAorCS5jb3B5ID0JCXNuZF9ybWU5Nl9jYXB0dXJlX2NvcHksCisJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKK307CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTZfZnJlZSh2b2lkICpwcml2YXRlX2RhdGEpCit7CisJcm1lOTZfdCAqcm1lOTYgPSAocm1lOTZfdCAqKXByaXZhdGVfZGF0YTsKKworCWlmIChybWU5NiA9PSBOVUxMKSB7CisJICAgICAgICByZXR1cm47CisJfQorCWlmIChybWU5Ni0+aXJxID49IDApIHsKKwkJc25kX3JtZTk2X3BsYXliYWNrX3N0b3Aocm1lOTYpOworCQlzbmRfcm1lOTZfY2FwdHVyZV9zdG9wKHJtZTk2KTsKKwkJcm1lOTYtPmFyZWcgJj0gflJNRTk2X0FSX0RBQ19FTjsKKwkJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOworCQlmcmVlX2lycShybWU5Ni0+aXJxLCAodm9pZCAqKXJtZTk2KTsKKwkJcm1lOTYtPmlycSA9IC0xOworCX0KKwlpZiAocm1lOTYtPmlvYmFzZSkgeworCQlpb3VubWFwKHJtZTk2LT5pb2Jhc2UpOworCQlybWU5Ni0+aW9iYXNlID0gTlVMTDsKKwl9CisJaWYgKHJtZTk2LT5wb3J0KSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocm1lOTYtPnBjaSk7CisJCXJtZTk2LT5wb3J0ID0gMDsKKwl9CisJcGNpX2Rpc2FibGVfZGV2aWNlKHJtZTk2LT5wY2kpOworfQorCitzdGF0aWMgdm9pZAorc25kX3JtZTk2X2ZyZWVfc3BkaWZfcGNtKHNuZF9wY21fdCAqcGNtKQoreworCXJtZTk2X3QgKnJtZTk2ID0gKHJtZTk2X3QgKikgcGNtLT5wcml2YXRlX2RhdGE7CisJcm1lOTYtPnNwZGlmX3BjbSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTZfZnJlZV9hZGF0X3BjbShzbmRfcGNtX3QgKnBjbSkKK3sKKwlybWU5Nl90ICpybWU5NiA9IChybWU5Nl90ICopIHBjbS0+cHJpdmF0ZV9kYXRhOworCXJtZTk2LT5hZGF0X3BjbSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzbmRfcm1lOTZfY3JlYXRlKHJtZTk2X3QgKnJtZTk2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSBybWU5Ni0+cGNpOworCWludCBlcnI7CisKKwlybWU5Ni0+aXJxID0gLTE7CisJc3Bpbl9sb2NrX2luaXQoJnJtZTk2LT5sb2NrKTsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIlJNRTk2IikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlybWU5Ni0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChybWU5Ni0+cGNpLCAwKTsKKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTk2X2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiUk1FOTYiLCAodm9pZCAqKXJtZTk2KSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcm1lOTYtPmlycSA9IHBjaS0+aXJxOworCisJaWYgKChybWU5Ni0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2LT5wb3J0LCBSTUU5Nl9JT19TSVpFKSkgPT0gMCkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwgcm1lOTYtPnBvcnQsIHJtZTk2LT5wb3J0ICsgUk1FOTZfSU9fU0laRSAtIDEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiByZWFkIHRoZSBjYXJkJ3MgcmV2aXNpb24gbnVtYmVyICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCA4LCAmcm1lOTYtPnJldik7CQorCQorCS8qIHNldCB1cCBBTFNBIHBjbSBkZXZpY2UgZm9yIFMvUERJRiAqLworCWlmICgoZXJyID0gc25kX3BjbV9uZXcocm1lOTYtPmNhcmQsICJEaWdpOTYgSUVDOTU4IiwgMCwKKwkJCSAgICAgICAxLCAxLCAmcm1lOTYtPnNwZGlmX3BjbSkpIDwgMCkKKwl7CisJCXJldHVybiBlcnI7CisJfQorCXJtZTk2LT5zcGRpZl9wY20tPnByaXZhdGVfZGF0YSA9IHJtZTk2OworCXJtZTk2LT5zcGRpZl9wY20tPnByaXZhdGVfZnJlZSA9IHNuZF9ybWU5Nl9mcmVlX3NwZGlmX3BjbTsKKwlzdHJjcHkocm1lOTYtPnNwZGlmX3BjbS0+bmFtZSwgIkRpZ2k5NiBJRUM5NTgiKTsKKwlzbmRfcGNtX3NldF9vcHMocm1lOTYtPnNwZGlmX3BjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcHMpOworCXNuZF9wY21fc2V0X29wcyhybWU5Ni0+c3BkaWZfcGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9vcHMpOworCisJcm1lOTYtPnNwZGlmX3BjbS0+aW5mb19mbGFncyA9IDA7CisKKwkvKiBzZXQgdXAgQUxTQSBwY20gZGV2aWNlIGZvciBBREFUICovCisJaWYgKHBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRElHSTk2KSB7CisJCS8qIEFEQVQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgYmFzZSBtb2RlbCAqLworCQlybWU5Ni0+YWRhdF9wY20gPSBOVUxMOworCX0gZWxzZSB7CisJCWlmICgoZXJyID0gc25kX3BjbV9uZXcocm1lOTYtPmNhcmQsICJEaWdpOTYgQURBVCIsIDEsCisJCQkJICAgICAgIDEsIDEsICZybWU5Ni0+YWRhdF9wY20pKSA8IDApCisJCXsKKwkJCXJldHVybiBlcnI7CisJCX0JCQorCQlybWU5Ni0+YWRhdF9wY20tPnByaXZhdGVfZGF0YSA9IHJtZTk2OworCQlybWU5Ni0+YWRhdF9wY20tPnByaXZhdGVfZnJlZSA9IHNuZF9ybWU5Nl9mcmVlX2FkYXRfcGNtOworCQlzdHJjcHkocm1lOTYtPmFkYXRfcGNtLT5uYW1lLCAiRGlnaTk2IEFEQVQiKTsKKwkJc25kX3BjbV9zZXRfb3BzKHJtZTk2LT5hZGF0X3BjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X29wcyk7CisJCXNuZF9wY21fc2V0X29wcyhybWU5Ni0+YWRhdF9wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BzKTsKKwkJCisJCXJtZTk2LT5hZGF0X3BjbS0+aW5mb19mbGFncyA9IDA7CisJfQorCisJcm1lOTYtPnBsYXliYWNrX3BlcmlvZHNpemUgPSAwOworCXJtZTk2LT5jYXB0dXJlX3BlcmlvZHNpemUgPSAwOworCQorCS8qIG1ha2Ugc3VyZSBwbGF5YmFjay9jYXB0dXJlIGlzIHN0b3BwZWQsIGlmIGJ5IHNvbWUgcmVhc29uIGFjdGl2ZSAqLworCXNuZF9ybWU5Nl9wbGF5YmFja19zdG9wKHJtZTk2KTsKKwlzbmRfcm1lOTZfY2FwdHVyZV9zdG9wKHJtZTk2KTsKKwkKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgaW4gcmVnaXN0ZXJzICovCisJcm1lOTYtPndjcmVnID0KKwkJUk1FOTZfV0NSX0ZSRVFfMSB8IC8qIHNldCA0NC4xIGtIeiBwbGF5YmFjayAqLworCQlSTUU5Nl9XQ1JfU0VMIHwgICAgLyogbm9ybWFsIHBsYXliYWNrICovCisJCVJNRTk2X1dDUl9NQVNURVIgfCAvKiBzZXQgdG8gbWFzdGVyIGNsb2NrIG1vZGUgKi8KKwkJUk1FOTZfV0NSX0lOUF8wOyAgIC8qIHNldCBjb2F4aWFsIGlucHV0ICovCisKKwlybWU5Ni0+YXJlZyA9IFJNRTk2X0FSX0ZSRVFQQURfMTsgLyogc2V0IDQ0LjEga0h6IGFuYWxvZyBjYXB0dXJlICovCisKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOworCQorCS8qIHJlc2V0IHRoZSBBREMgKi8KKwl3cml0ZWwocm1lOTYtPmFyZWcgfCBSTUU5Nl9BUl9QRDIsCisJICAgICAgIHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19BRERJVElPTkFMX1JFRyk7CisJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOwkKKworCS8qIHJlc2V0IGFuZCBlbmFibGUgdGhlIERBQyAob3JkZXIgaXMgaW1wb3J0YW50KS4gKi8KKwlzbmRfcm1lOTZfcmVzZXRfZGFjKHJtZTk2KTsKKwlybWU5Ni0+YXJlZyB8PSBSTUU5Nl9BUl9EQUNfRU47CisJd3JpdGVsKHJtZTk2LT5hcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQURESVRJT05BTF9SRUcpOworCisJLyogcmVzZXQgcGxheWJhY2sgYW5kIHJlY29yZCBidWZmZXIgcG9pbnRlcnMgKi8KKwl3cml0ZWwoMCwgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX1JFU0VUX1BMQVlfUE9TKTsKKwl3cml0ZWwoMCwgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX1JFU0VUX1JFQ19QT1MpOworCisJLyogcmVzZXQgdm9sdW1lICovCisJcm1lOTYtPnZvbFswXSA9IHJtZTk2LT52b2xbMV0gPSAwOworCWlmIChSTUU5Nl9IQVNfQU5BTE9HX09VVChybWU5NikpIHsKKwkJc25kX3JtZTk2X2FwcGx5X2RhY192b2x1bWUocm1lOTYpOworCX0KKwkKKwkvKiBpbml0IHN3aXRjaCBpbnRlcmZhY2UgKi8KKwlpZiAoKGVyciA9IHNuZF9ybWU5Nl9jcmVhdGVfc3dpdGNoZXMocm1lOTYtPmNhcmQsIHJtZTk2KSkgPCAwKSB7CisJCXJldHVybiBlcnI7CisJfQorCisgICAgICAgIC8qIGluaXQgcHJvYyBpbnRlcmZhY2UgKi8KKwlzbmRfcm1lOTZfcHJvY19pbml0KHJtZTk2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByb2MgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQgCitzbmRfcm1lOTZfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqYnVmZmVyKQoreworCWludCBuOworCXJtZTk2X3QgKnJtZTk2ID0gKHJtZTk2X3QgKillbnRyeS0+cHJpdmF0ZV9kYXRhOworCQorCXJtZTk2LT5yY3JlZyA9IHJlYWRsKHJtZTk2LT5pb2Jhc2UgKyBSTUU5Nl9JT19DT05UUk9MX1JFR0lTVEVSKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgcm1lOTYtPmNhcmQtPmxvbmduYW1lKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgKGluZGV4ICMlZClcbiIsIHJtZTk2LT5jYXJkLT5udW1iZXIgKyAxKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuR2VuZXJhbCBzZXR0aW5nc1xuIik7CisJaWYgKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9JRElTKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgcGVyaW9kIHNpemU6IE4vQSAoaW50ZXJydXB0cyAiCisJCQkgICAgImRpc2FibGVkKVxuIik7CisJfSBlbHNlIGlmIChybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfSVNFTCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHBlcmlvZCBzaXplOiAyMDQ4IGJ5dGVzXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHBlcmlvZCBzaXplOiA4MTkyIGJ5dGVzXG4iKTsKKwl9CQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuSW5wdXQgc2V0dGluZ3NcbiIpOworCXN3aXRjaCAoc25kX3JtZTk2X2dldGlucHV0dHlwZShybWU5NikpIHsKKwljYXNlIFJNRTk2X0lOUFVUX09QVElDQUw6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgaW5wdXQ6IG9wdGljYWwiKTsKKwkJYnJlYWs7CisJY2FzZSBSTUU5Nl9JTlBVVF9DT0FYSUFMOgorCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGlucHV0OiBjb2F4aWFsIik7CisJCWJyZWFrOworCWNhc2UgUk1FOTZfSU5QVVRfSU5URVJOQUw6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgaW5wdXQ6IGludGVybmFsIik7CisJCWJyZWFrOworCWNhc2UgUk1FOTZfSU5QVVRfWExSOgorCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGlucHV0OiBYTFIiKTsKKwkJYnJlYWs7CisJY2FzZSBSTUU5Nl9JTlBVVF9BTkFMT0c6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgaW5wdXQ6IGFuYWxvZyIpOworCQlicmVhazsKKwl9CisJaWYgKHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZuKSA8IDApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG4gIHNhbXBsZSByYXRlOiBubyB2YWxpZCBzaWduYWxcbiIpOworCX0gZWxzZSB7CisJCWlmIChuKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgKDggY2hhbm5lbHMpXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAoMiBjaGFubmVscylcbiIpOworCQl9CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgc2FtcGxlIHJhdGU6ICVkIEh6XG4iLAorCQkJICAgIHNuZF9ybWU5Nl9jYXB0dXJlX2dldHJhdGUocm1lOTYsICZuKSk7CisJfQorCWlmIChybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfTU9ERTI0XzIpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBzYW1wbGUgZm9ybWF0OiAyNCBiaXRcbiIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgc2FtcGxlIGZvcm1hdDogMTYgYml0XG4iKTsKKwl9CisJCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5PdXRwdXQgc2V0dGluZ3NcbiIpOworCWlmIChybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfU0VMKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgb3V0cHV0IHNpZ25hbDogbm9ybWFsIHBsYXliYWNrXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIG91dHB1dCBzaWduYWw6IHNhbWUgYXMgaW5wdXRcbiIpOworCX0KKwlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSByYXRlOiAlZCBIelxuIiwKKwkJICAgIHNuZF9ybWU5Nl9wbGF5YmFja19nZXRyYXRlKHJtZTk2KSk7CisJaWYgKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9NT0RFMjQpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBzYW1wbGUgZm9ybWF0OiAyNCBiaXRcbiIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgc2FtcGxlIGZvcm1hdDogMTYgYml0XG4iKTsKKwl9CisJaWYgKHJtZTk2LT5hcmVnICYgUk1FOTZfQVJfV1NFTCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSBjbG9jayBzb3VyY2U6IHdvcmQgY2xvY2tcbiIpOworCX0gZWxzZSBpZiAocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX01BU1RFUikgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSBjbG9jayBzb3VyY2U6IGludGVybmFsXG4iKTsKKwl9IGVsc2UgaWYgKHNuZF9ybWU5Nl9nZXRpbnB1dHR5cGUocm1lOTYpID09IFJNRTk2X0lOUFVUX0FOQUxPRykgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHNhbXBsZSBjbG9jayBzb3VyY2U6IGF1dG9zeW5jIChpbnRlcm5hbCBhbnl3YXkgZHVlIHRvIGFuYWxvZyBpbnB1dCBzZXR0aW5nKVxuIik7CisJfSBlbHNlIGlmIChzbmRfcm1lOTZfY2FwdHVyZV9nZXRyYXRlKHJtZTk2LCAmbikgPCAwKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgc2FtcGxlIGNsb2NrIHNvdXJjZTogYXV0b3N5bmMgKGludGVybmFsIGFueXdheSBkdWUgdG8gbm8gdmFsaWQgc2lnbmFsKVxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBzYW1wbGUgY2xvY2sgc291cmNlOiBhdXRvc3luY1xuIik7CisJfQorCWlmIChybWU5Ni0+d2NyZWcgJiBSTUU5Nl9XQ1JfUFJPKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgZm9ybWF0OiBBRVMvRUJVIChwcm9mZXNzaW9uYWwpXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGZvcm1hdDogSUVDOTU4IChjb25zdW1lcilcbiIpOworCX0KKwlpZiAocm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX0VNUCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGVtcGhhc2lzOiBvblxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBlbXBoYXNpczogb2ZmXG4iKTsKKwl9CisJaWYgKHJtZTk2LT53Y3JlZyAmIFJNRTk2X1dDUl9ET0xCWSkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIgIG5vbi1hdWRpbyAoZG9sYnkpOiBvblxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICBub24tYXVkaW8gKGRvbGJ5KTogb2ZmXG4iKTsKKwl9CisJaWYgKFJNRTk2X0hBU19BTkFMT0dfSU4ocm1lOTYpKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQW5hbG9nIG91dHB1dCBzZXR0aW5nc1xuIik7CisJCXN3aXRjaCAoc25kX3JtZTk2X2dldG1vbnRyYWNrcyhybWU5NikpIHsKKwkJY2FzZSBSTUU5Nl9NT05JVE9SX1RSQUNLU18xXzI6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIG1vbml0b3JlZCBBREFUIHRyYWNrczogMSsyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFJNRTk2X01PTklUT1JfVFJBQ0tTXzNfNDoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgbW9uaXRvcmVkIEFEQVQgdHJhY2tzOiAzKzRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUk1FOTZfTU9OSVRPUl9UUkFDS1NfNV82OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICBtb25pdG9yZWQgQURBVCB0cmFja3M6IDUrNlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBSTUU5Nl9NT05JVE9SX1RSQUNLU183Xzg6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIG1vbml0b3JlZCBBREFUIHRyYWNrczogNys4XG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoc25kX3JtZTk2X2dldGF0dGVudWF0aW9uKHJtZTk2KSkgeworCQljYXNlIFJNRTk2X0FUVEVOVUFUSU9OXzA6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGF0dGVudWF0aW9uOiAwIGRCXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFJNRTk2X0FUVEVOVUFUSU9OXzY6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIGF0dGVudWF0aW9uOiAtNiBkQlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBSTUU5Nl9BVFRFTlVBVElPTl8xMjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgYXR0ZW51YXRpb246IC0xMiBkQlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBSTUU5Nl9BVFRFTlVBVElPTl8xODoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgYXR0ZW51YXRpb246IC0xOCBkQlxuIik7CisJCQlicmVhazsKKwkJfQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgIHZvbHVtZSBsZWZ0OiAldVxuIiwgcm1lOTYtPnZvbFswXSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgdm9sdW1lIHJpZ2h0OiAldVxuIiwgcm1lOTYtPnZvbFsxXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgCitzbmRfcm1lOTZfcHJvY19pbml0KHJtZTk2X3QgKnJtZTk2KQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcocm1lOTYtPmNhcmQsICJybWU5NiIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgcm1lOTYsIDEwMjQsIHNuZF9ybWU5Nl9wcm9jX3JlYWQpOworfQorCisvKgorICogY29udHJvbCBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgaW50CitzbmRfcm1lOTZfaW5mb19sb29wYmFja19jb250cm9sKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTk2X2dldF9sb29wYmFja19jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcm1lOTYtPndjcmVnICYgUk1FOTZfV0NSX1NFTCA/IDAgOiAxOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTk2X3B1dF9sb29wYmFja19jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCQorCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IFJNRTk2X1dDUl9TRUw7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXZhbCA9IChybWU5Ni0+d2NyZWcgJiB+Uk1FOTZfV0NSX1NFTCkgfCB2YWw7CisJY2hhbmdlID0gdmFsICE9IHJtZTk2LT53Y3JlZzsKKwlybWU5Ni0+d2NyZWcgPSB2YWw7CisJd3JpdGVsKHZhbCwgcm1lOTYtPmlvYmFzZSArIFJNRTk2X0lPX0NPTlRST0xfUkVHSVNURVIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9pbmZvX2lucHV0dHlwZV9jb250cm9sKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICpfdGV4dHNbNV0gPSB7ICJPcHRpY2FsIiwgIkNvYXhpYWwiLCAiSW50ZXJuYWwiLCAiWExSIiwgIkFuYWxvZyIgfTsKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwljaGFyICp0ZXh0c1s1XSA9IHsgX3RleHRzWzBdLCBfdGV4dHNbMV0sIF90ZXh0c1syXSwgX3RleHRzWzNdLCBfdGV4dHNbNF0gfTsKKwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXN3aXRjaCAocm1lOTYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5NjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2Xzg6CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTzoKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVDoKKwkJaWYgKHJtZTk2LT5yZXYgPiA0KSB7CisJCQkvKiBQU1QgKi8KKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNDsKKwkJCXRleHRzWzNdID0gX3RleHRzWzRdOyAvKiBBbmFsb2cgaW5zdGVhZCBvZiBYTFIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFBBRCAqLworCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA1OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJYnJlYWs7CisJfQorCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxKSB7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJfQorCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50CitzbmRfcm1lOTZfZ2V0X2lucHV0dHlwZV9jb250cm9sKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGl0ZW1zID0gMzsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNuZF9ybWU5Nl9nZXRpbnB1dHR5cGUocm1lOTYpOworCQorCXN3aXRjaCAocm1lOTYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5NjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2Xzg6CisJCWl0ZW1zID0gMzsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTzoKKwkJaXRlbXMgPSA0OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVDoKKwkJaWYgKHJtZTk2LT5yZXYgPiA0KSB7CisJCQkvKiBmb3IgaGFuZGxpbmcgUFNUIGNhc2UsIChJTlBVVF9BTkFMT0cgaXMgbW92ZWQgdG8gSU5QVVRfWExSICovCisJCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSBSTUU5Nl9JTlBVVF9BTkFMT0cpIHsKKwkJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gUk1FOTZfSU5QVVRfWExSOworCQkJfQorCQkJaXRlbXMgPSA0OworCQl9IGVsc2UgeworCQkJaXRlbXMgPSA1OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJYnJlYWs7CisJfQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGl0ZW1zKSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpdGVtcyAtIDE7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTk2X3B1dF9pbnB1dHR5cGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZSwgaXRlbXMgPSAzOworCQorCXN3aXRjaCAocm1lOTYtPnBjaS0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5NjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2Xzg6CisJCWl0ZW1zID0gMzsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BSTzoKKwkJaXRlbXMgPSA0OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVDoKKwkJaWYgKHJtZTk2LT5yZXYgPiA0KSB7CisJCQlpdGVtcyA9IDQ7CisJCX0gZWxzZSB7CisJCQlpdGVtcyA9IDU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX0JVRygpOworCQlicmVhazsKKwl9CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIGl0ZW1zOworCQorCS8qIHNwZWNpYWwgY2FzZSBmb3IgUFNUICovCisJaWYgKHJtZTk2LT5wY2ktPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RJR0k5Nl84X1BBRF9PUl9QU1QgJiYgcm1lOTYtPnJldiA+IDQpIHsKKwkJaWYgKHZhbCA9PSBSTUU5Nl9JTlBVVF9YTFIpIHsKKwkJCXZhbCA9IFJNRTk2X0lOUFVUX0FOQUxPRzsKKwkJfQorCX0KKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gc25kX3JtZTk2X2dldGlucHV0dHlwZShybWU5Nik7CisJc25kX3JtZTk2X3NldGlucHV0dHlwZShybWU5NiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfaW5mb19jbG9ja21vZGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbM10gPSB7ICJBdXRvU3luYyIsICJJbnRlcm5hbCIsICJXb3JkIiB9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMikgeworCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMjsKKwl9CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9nZXRfY2xvY2ttb2RlX2NvbnRyb2woc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNuZF9ybWU5Nl9nZXRjbG9ja21vZGUocm1lOTYpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTk2X3B1dF9jbG9ja21vZGVfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKwkKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICUgMzsKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gc25kX3JtZTk2X2dldGNsb2NrbW9kZShybWU5Nik7CisJc25kX3JtZTk2X3NldGNsb2NrbW9kZShybWU5NiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50CitzbmRfcm1lOTZfaW5mb19hdHRlbnVhdGlvbl9jb250cm9sKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s0XSA9IHsgIjAgZEIiLCAiLTYgZEIiLCAiLTEyIGRCIiwgIi0xOCBkQiIgfTsKKwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNDsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDMpIHsKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDM7CisJfQorCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50CitzbmRfcm1lOTZfZ2V0X2F0dGVudWF0aW9uX2NvbnRyb2woc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNuZF9ybWU5Nl9nZXRhdHRlbnVhdGlvbihybWU5Nik7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50CitzbmRfcm1lOTZfcHV0X2F0dGVudWF0aW9uX2NvbnRyb2woc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2U7CisJCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIDQ7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCisJY2hhbmdlID0gKGludCl2YWwgIT0gc25kX3JtZTk2X2dldGF0dGVudWF0aW9uKHJtZTk2KTsKKwlzbmRfcm1lOTZfc2V0YXR0ZW51YXRpb24ocm1lOTYsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2luZm9fbW9udHJhY2tzX2NvbnRyb2woc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzRdID0geyAiMSsyIiwgIjMrNCIsICI1KzYiLCAiNys4IiB9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMykgeworCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMzsKKwl9CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9nZXRfbW9udHJhY2tzX2NvbnRyb2woc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNuZF9ybWU5Nl9nZXRtb250cmFja3Mocm1lOTYpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOworCXJldHVybiAwOworfQorc3RhdGljIGludAorc25kX3JtZTk2X3B1dF9tb250cmFja3NfY29udHJvbChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZTsKKwkKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICUgNDsKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gc25kX3JtZTk2X2dldG1vbnRyYWNrcyhybWU5Nik7CisJc25kX3JtZTk2X3NldG1vbnRyYWNrcyhybWU5NiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgdTMyIHNuZF9ybWU5Nl9jb252ZXJ0X2Zyb21fYWVzKHNuZF9hZXNfaWVjOTU4X3QgKmFlcykKK3sKKwl1MzIgdmFsID0gMDsKKwl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSA/IFJNRTk2X1dDUl9QUk8gOiAwOworCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9OT05BVURJTykgPyBSTUU5Nl9XQ1JfRE9MQlkgOiAwOworCWlmICh2YWwgJiBSTUU5Nl9XQ1JfUFJPKQorCQl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUpID8gUk1FOTZfV0NSX0VNUCA6IDA7CisJZWxzZQorCQl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpID8gUk1FOTZfV0NSX0VNUCA6IDA7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgc25kX3JtZTk2X2NvbnZlcnRfdG9fYWVzKHNuZF9hZXNfaWVjOTU4X3QgKmFlcywgdTMyIHZhbCkKK3sKKwlhZXMtPnN0YXR1c1swXSA9ICgodmFsICYgUk1FOTZfV0NSX1BSTykgPyBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwgOiAwKSB8CisJCQkgKCh2YWwgJiBSTUU5Nl9XQ1JfRE9MQlkpID8gSUVDOTU4X0FFUzBfTk9OQVVESU8gOiAwKTsKKwlpZiAodmFsICYgUk1FOTZfV0NSX1BSTykKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIFJNRTk2X1dDUl9FTVApID8gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUgOiAwOworCWVsc2UKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIFJNRTk2X1dDUl9FTVApID8gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUgOiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNuZF9ybWU5Nl9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwgcm1lOTYtPndjcmVnX3NwZGlmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXUzMiB2YWw7CisJCisJdmFsID0gc25kX3JtZTk2X2NvbnZlcnRfZnJvbV9hZXMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwljaGFuZ2UgPSB2YWwgIT0gcm1lOTYtPndjcmVnX3NwZGlmOworCXJtZTk2LT53Y3JlZ19zcGRpZiA9IHZhbDsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2LT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX3N0cmVhbV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9zdHJlYW1fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJc25kX3JtZTk2X2NvbnZlcnRfdG9fYWVzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4LCBybWU5Ni0+d2NyZWdfc3BkaWZfc3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9zdHJlYW1fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTZfdCAqcm1lOTYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1MzIgdmFsOworCQorCXZhbCA9IHNuZF9ybWU5Nl9jb252ZXJ0X2Zyb21fYWVzKCZ1Y29udHJvbC0+dmFsdWUuaWVjOTU4KTsKKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IHJtZTk2LT53Y3JlZ19zcGRpZl9zdHJlYW07CisJcm1lOTYtPndjcmVnX3NwZGlmX3N0cmVhbSA9IHZhbDsKKwlybWU5Ni0+d2NyZWcgJj0gfihSTUU5Nl9XQ1JfUFJPIHwgUk1FOTZfV0NSX0RPTEJZIHwgUk1FOTZfV0NSX0VNUCk7CisJcm1lOTYtPndjcmVnIHw9IHZhbDsKKwl3cml0ZWwocm1lOTYtPndjcmVnLCBybWU5Ni0+aW9iYXNlICsgUk1FOTZfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX21hc2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc25kX3JtZTk2X2RhY192b2x1bWVfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlybWU5Nl90ICpybWU5NiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKyAgICAgICAgdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisgICAgICAgIHVpbmZvLT5jb3VudCA9IDI7CisgICAgICAgIHVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gUk1FOTZfMTg1WF9NQVhfT1VUKHJtZTk2KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9kYWNfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTYtPmxvY2spOworICAgICAgICB1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcm1lOTYtPnZvbFswXTsKKyAgICAgICAgdS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHJtZTk2LT52b2xbMV07CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9ybWU5Nl9kYWNfdm9sdW1lX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1KQoreworCXJtZTk2X3QgKnJtZTk2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworICAgICAgICBpbnQgY2hhbmdlID0gMDsKKworCWlmICghUk1FOTZfSEFTX0FOQUxPR19PVVQocm1lOTYpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX2xvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisgICAgICAgIGlmICh1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IHJtZTk2LT52b2xbMF0pIHsKKwkJcm1lOTYtPnZvbFswXSA9IHUtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisgICAgICAgICAgICAgICAgY2hhbmdlID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAhPSBybWU5Ni0+dm9sWzFdKSB7CisJCXJtZTk2LT52b2xbMV0gPSB1LT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworICAgICAgICAgICAgICAgIGNoYW5nZSA9IDE7CisgICAgICAgIH0KKwlpZiAoY2hhbmdlKSB7CisJCXNuZF9ybWU5Nl9hcHBseV9kYWNfdm9sdW1lKHJtZTk2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5Ni0+bG9jayk7CisKKyAgICAgICAgcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfcm1lOTZfY29udHJvbHNbXSA9IHsKK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5pbmZvID0JCXNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX2luZm8sCisJLmdldCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9nZXQsCisJLnB1dCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9wdXQKK30sCit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQQ01fU1RSRUFNKSwKKwkuaW5mbyA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9zdHJlYW1faW5mbywKKwkuZ2V0ID0JCXNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX3N0cmVhbV9nZXQsCisJLnB1dCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9zdHJlYW1fcHV0Cit9LAoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAorCS5pbmZvID0JCXNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKKwkuZ2V0ID0JCXNuZF9ybWU5Nl9jb250cm9sX3NwZGlmX21hc2tfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCUlFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUworfSwKK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBST19NQVNLKSwKKwkuaW5mbyA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCisJLmdldCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2dldCwKKwkucHJpdmF0ZV92YWx1ZSA9IElFQzk1OF9BRVMwX05PTkFVRElPIHwKKwkJCUlFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CisJCQlJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMKK30sCit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIklucHV0IENvbm5lY3RvciIsCisJLmluZm8gPSAgICAgICAgIHNuZF9ybWU5Nl9pbmZvX2lucHV0dHlwZV9jb250cm9sLCAKKwkuZ2V0ID0gICAgICAgICAgc25kX3JtZTk2X2dldF9pbnB1dHR5cGVfY29udHJvbCwKKwkucHV0ID0gICAgICAgICAgc25kX3JtZTk2X3B1dF9pbnB1dHR5cGVfY29udHJvbCAKK30sCit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIkxvb3BiYWNrIElucHV0IiwKKwkuaW5mbyA9ICAgICAgICAgc25kX3JtZTk2X2luZm9fbG9vcGJhY2tfY29udHJvbCwKKwkuZ2V0ID0gICAgICAgICAgc25kX3JtZTk2X2dldF9sb29wYmFja19jb250cm9sLAorCS5wdXQgPSAgICAgICAgICBzbmRfcm1lOTZfcHV0X2xvb3BiYWNrX2NvbnRyb2wKK30sCit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIlNhbXBsZSBDbG9jayBTb3VyY2UiLAorCS5pbmZvID0gICAgICAgICBzbmRfcm1lOTZfaW5mb19jbG9ja21vZGVfY29udHJvbCwgCisJLmdldCA9ICAgICAgICAgIHNuZF9ybWU5Nl9nZXRfY2xvY2ttb2RlX2NvbnRyb2wsCisJLnB1dCA9ICAgICAgICAgIHNuZF9ybWU5Nl9wdXRfY2xvY2ttb2RlX2NvbnRyb2wKK30sCit7CisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIk1vbml0b3IgVHJhY2tzIiwKKwkuaW5mbyA9ICAgICAgICAgc25kX3JtZTk2X2luZm9fbW9udHJhY2tzX2NvbnRyb2wsIAorCS5nZXQgPSAgICAgICAgICBzbmRfcm1lOTZfZ2V0X21vbnRyYWNrc19jb250cm9sLAorCS5wdXQgPSAgICAgICAgICBzbmRfcm1lOTZfcHV0X21vbnRyYWNrc19jb250cm9sCit9LAoreworICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgICJBdHRlbnVhdGlvbiIsCisJLmluZm8gPSAgICAgICAgIHNuZF9ybWU5Nl9pbmZvX2F0dGVudWF0aW9uX2NvbnRyb2wsIAorCS5nZXQgPSAgICAgICAgICBzbmRfcm1lOTZfZ2V0X2F0dGVudWF0aW9uX2NvbnRyb2wsCisJLnB1dCA9ICAgICAgICAgIHNuZF9ybWU5Nl9wdXRfYXR0ZW51YXRpb25fY29udHJvbAorfSwKK3sKKyAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiREFDIFBsYXliYWNrIFZvbHVtZSIsCisJLmluZm8gPSAgICAgICAgIHNuZF9ybWU5Nl9kYWNfdm9sdW1lX2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9ybWU5Nl9kYWNfdm9sdW1lX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX3JtZTk2X2RhY192b2x1bWVfcHV0Cit9Cit9OworCitzdGF0aWMgaW50CitzbmRfcm1lOTZfY3JlYXRlX3N3aXRjaGVzKHNuZF9jYXJkX3QgKmNhcmQsCisJCQkgIHJtZTk2X3QgKnJtZTk2KQoreworCWludCBpZHgsIGVycjsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNzsgaWR4KyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcm1lOTZfY29udHJvbHNbaWR4XSwgcm1lOTYpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGlkeCA9PSAxKQkvKiBJRUM5NTggKFMvUERJRikgU3RyZWFtICovCisJCQlybWU5Ni0+c3BkaWZfY3RsID0ga2N0bDsKKwl9CisKKwlpZiAoUk1FOTZfSEFTX0FOQUxPR19PVVQocm1lOTYpKSB7CisJCWZvciAoaWR4ID0gNzsgaWR4IDwgMTA7IGlkeCsrKQorCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9ybWU5Nl9jb250cm9sc1tpZHhdLCBybWU5NikpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYXJkIGluaXRpYWxpc2F0aW9uCisgKi8KKworc3RhdGljIHZvaWQgc25kX3JtZTk2X2NhcmRfZnJlZShzbmRfY2FyZF90ICpjYXJkKQoreworCXNuZF9ybWU5Nl9mcmVlKGNhcmQtPnByaXZhdGVfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzbmRfcm1lOTZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlybWU5Nl90ICpybWU5NjsKKwlzbmRfY2FyZF90ICpjYXJkOworCWludCBlcnI7CisJdTggdmFsOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWlmICgoY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCQkgc2l6ZW9mKHJtZTk2X3QpKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTk2X2NhcmRfZnJlZTsKKwlybWU5NiA9IChybWU5Nl90ICopY2FyZC0+cHJpdmF0ZV9kYXRhOwkKKwlybWU5Ni0+Y2FyZCA9IGNhcmQ7CisJcm1lOTYtPnBjaSA9IHBjaTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisJaWYgKChlcnIgPSBzbmRfcm1lOTZfY3JlYXRlKHJtZTk2KSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCQorCXN0cmNweShjYXJkLT5kcml2ZXIsICJEaWdpOTYiKTsKKwlzd2l0Y2ggKHJtZTk2LT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJOTY6CisJCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJSTUUgRGlnaTk2Iik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9ESUdJOTZfODoKKwkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlJNRSBEaWdpOTYvOCIpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUFJPOgorCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiUk1FIERpZ2k5Ni84IFBSTyIpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRElHSTk2XzhfUEFEX09SX1BTVDoKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocm1lOTYtPnBjaSwgOCwgJnZhbCk7CisJCWlmICh2YWwgPCA1KSB7CisJCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiUk1FIERpZ2k5Ni84IFBBRCIpOworCQl9IGVsc2UgeworCQkJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlJNRSBEaWdpOTYvOCBQU1QiKTsKKwkJfQorCQlicmVhazsKKwl9CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCisJCXJtZTk2LT5wb3J0LCBybWU5Ni0+aXJxKTsKKwkKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsJCisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3JtZTk2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIlJNRSBEaWdpOTYiLAorCS5pZF90YWJsZSA9IHNuZF9ybWU5Nl9pZHMsCisJLnByb2JlID0gc25kX3JtZTk2X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfcm1lOTZfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9ybWU5Nl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9ybWU5Nl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfcm1lOTZfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9ybWU5Nl9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvTWFrZWZpbGUgYi9zb3VuZC9wY2kvcm1lOTY1Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTczNzRjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgQUxTQQorIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorIworCitzbmQtcm1lOTY1Mi1vYmpzIDo9IHJtZTk2NTIubworc25kLWhkc3Atb2JqcyA6PSBoZHNwLm8KKworIyBUb3BsZXZlbCBNb2R1bGUgRGVwZW5kZW5jeQorb2JqLSQoQ09ORklHX1NORF9STUU5NjUyKSArPSBzbmQtcm1lOTY1Mi5vCitvYmotJChDT05GSUdfU05EX0hEU1ApICs9IHNuZC1oZHNwLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVmYmYwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC0wLDAgKzEsNTIwNiBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIFJNRSBIYW1tZXJmYWxsIERTUCBhdWRpbyBpbnRlcmZhY2UocykKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUGF1bCBEYXZpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmN1cyBBbmRlcnNzb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaG9tYXMgQ2hhcmJvbm5lbAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZHNwLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgUk1FIEhhbW1lcmZhbGwgRFNQIGludGVyZmFjZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgUk1FIEhhbW1lcmZhbGwgRFNQIGludGVyZmFjZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUvZGlzYWJsZSBzcGVjaWZpYyBIYW1tZXJmYWxsIERTUCBzb3VuZGNhcmRzLiIpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEYXZpcyA8cGF1bEBsaW51eGF1ZGlvc3lzdGVtcy5jb20+LCBNYXJjdXMgQW5kZXJzc29uLCBUaG9tYXMgQ2hhcmJvbm5lbCA8dGhvbWFzQHVuZGF0YS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJNRSBIYW1tZXJmYWxsIERTUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Uk1FIEhhbW1lcmZhbGwtRFNQfSwiCisJICAgICAgICAie1JNRSBIRFNQLTk2NTJ9LCIKKwkJIntSTUUgSERTUC05NjMyfX0iKTsKKworI2RlZmluZSBIRFNQX01BWF9DSEFOTkVMUyAgICAgICAgMjYKKyNkZWZpbmUgSERTUF9NQVhfRFNfQ0hBTk5FTFMgICAgIDE0CisjZGVmaW5lIEhEU1BfTUFYX1FTX0NIQU5ORUxTICAgICA4CisjZGVmaW5lIERJR0lGQUNFX1NTX0NIQU5ORUxTICAgICAyNgorI2RlZmluZSBESUdJRkFDRV9EU19DSEFOTkVMUyAgICAgMTQKKyNkZWZpbmUgTVVMVElGQUNFX1NTX0NIQU5ORUxTICAgIDE4CisjZGVmaW5lIE1VTFRJRkFDRV9EU19DSEFOTkVMUyAgICAxNAorI2RlZmluZSBIOTY1Ml9TU19DSEFOTkVMUyAgICAgICAgMjYKKyNkZWZpbmUgSDk2NTJfRFNfQ0hBTk5FTFMgICAgICAgIDE0CisvKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcG9zc2libGUgQW5hbG9nIEV4dGVuc2lvbiBCb2FyZHMKKyAgIEFFQnMgYXJlIGRldGVjdGVkIGF0IGNhcmQgaW5pdGlhbGl6YXRpb24KKyovCisjZGVmaW5lIEg5NjMyX1NTX0NIQU5ORUxTCSAxMgorI2RlZmluZSBIOTYzMl9EU19DSEFOTkVMUwkgOAorI2RlZmluZSBIOTYzMl9RU19DSEFOTkVMUwkgNAorCisvKiBXcml0ZSByZWdpc3RlcnMuIFRoZXNlIGFyZSBkZWZpbmVkIGFzIGJ5dGUtb2Zmc2V0cyBmcm9tIHRoZSBpb2Jhc2UgdmFsdWUuCisgKi8KKyNkZWZpbmUgSERTUF9yZXNldFBvaW50ZXIgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhEU1Bfb3V0cHV0QnVmZmVyQWRkcmVzcwkzMgorI2RlZmluZSBIRFNQX2lucHV0QnVmZmVyQWRkcmVzcwkJMzYKKyNkZWZpbmUgSERTUF9jb250cm9sUmVnaXN0ZXIJCTY0CisjZGVmaW5lIEhEU1BfaW50ZXJydXB0Q29uZmlybWF0aW9uCTk2CisjZGVmaW5lIEhEU1Bfb3V0cHV0RW5hYmxlCSAgCTEyOAorI2RlZmluZSBIRFNQX2NvbnRyb2wyUmVnCQkyNTYKKyNkZWZpbmUgSERTUF9taWRpRGF0YU91dDAgIAkJMzUyCisjZGVmaW5lIEhEU1BfbWlkaURhdGFPdXQxICAJCTM1NgorI2RlZmluZSBIRFNQX2ZpZm9EYXRhICAJCQkzNjgKKyNkZWZpbmUgSERTUF9pbnB1dEVuYWJsZQkgCTM4NAorCisvKiBSZWFkIHJlZ2lzdGVycy4gVGhlc2UgYXJlIGRlZmluZWQgYXMgYnl0ZS1vZmZzZXRzIGZyb20gdGhlIGlvYmFzZSB2YWx1ZQorICovCisKKyNkZWZpbmUgSERTUF9zdGF0dXNSZWdpc3RlciAgICAwCisjZGVmaW5lIEhEU1BfdGltZWNvZGUgICAgICAgIDEyOAorI2RlZmluZSBIRFNQX3N0YXR1czJSZWdpc3RlciAxOTIKKyNkZWZpbmUgSERTUF9taWRpRGF0YU91dDAgICAgMzUyCisjZGVmaW5lIEhEU1BfbWlkaURhdGFPdXQxICAgIDM1NgorI2RlZmluZSBIRFNQX21pZGlEYXRhSW4wICAgICAzNjAKKyNkZWZpbmUgSERTUF9taWRpRGF0YUluMSAgICAgMzY0CisjZGVmaW5lIEhEU1BfbWlkaVN0YXR1c091dDAgIDM4NAorI2RlZmluZSBIRFNQX21pZGlTdGF0dXNPdXQxICAzODgKKyNkZWZpbmUgSERTUF9taWRpU3RhdHVzSW4wICAgMzkyCisjZGVmaW5lIEhEU1BfbWlkaVN0YXR1c0luMSAgIDM5NgorI2RlZmluZSBIRFNQX2ZpZm9TdGF0dXMgICAgICA0MDAKKworLyogdGhlIG1ldGVycyBhcmUgcmVndWxhciBpL28tbWFwcGVkIHJlZ2lzdGVycywgYnV0IG9mZnNldAorICAgY29uc2lkZXJhYmx5IGZyb20gdGhlIHJlc3QuIHRoZSBwZWFrIHJlZ2lzdGVycyBhcmUgcmVzZXQKKyAgIHdoZW4gcmVhZDsgdGhlIGxlYXN0LXNpZ25pZmljYW50IDQgYml0cyBhcmUgZnVsbC1zY2FsZSBjb3VudGVyczsgCisgICB0aGUgYWN0dWFsIHBlYWsgdmFsdWUgaXMgaW4gdGhlIG1vc3Qtc2lnbmlmaWNhbnQgMjQgYml0cy4KKyovCisKKyNkZWZpbmUgSERTUF9wbGF5YmFja1BlYWtMZXZlbCAgNDA5NiAgLyogMjYgKiAzMiBiaXQgdmFsdWVzICovCisjZGVmaW5lIEhEU1BfaW5wdXRQZWFrTGV2ZWwgICAgIDQyMjQgIC8qIDI2ICogMzIgYml0IHZhbHVlcyAqLworI2RlZmluZSBIRFNQX291dHB1dFBlYWtMZXZlbCAgICA0MzUyICAvKiAoMjYrMikgKiAzMiBiaXQgdmFsdWVzICovCisjZGVmaW5lIEhEU1BfcGxheWJhY2tSbXNMZXZlbCAgIDQ2MTIgIC8qIDI2ICogNjQgYml0IHZhbHVlcyAqLworI2RlZmluZSBIRFNQX2lucHV0Um1zTGV2ZWwgICAgICA0ODY4ICAvKiAyNiAqIDY0IGJpdCB2YWx1ZXMgKi8KKworCisvKiBUaGlzIGlzIGZvciBIOTY1MiBjYXJkcworICAgUGVhayB2YWx1ZXMgYXJlIHJlYWQgZG93bndhcmQgZnJvbSB0aGUgYmFzZQorICAgUm1zIHZhbHVlcyBhcmUgcmVhZCB1cHdhcmQKKyAgIFRoZXJlIGFyZSBybXMgdmFsdWVzIGZvciB0aGUgb3V0cHV0cyB0b28KKyAgIDI2KjMgdmFsdWVzIGFyZSByZWFkIGluIHNzIG1vZGUKKyAgIDE0KjMgaW4gZHMgbW9kZSwgd2l0aCBubyBnYXAgYmV0d2VlbiB2YWx1ZXMKKyovCisjZGVmaW5lIEhEU1BfOTY1Ml9wZWFrQmFzZQk3MTY0CQorI2RlZmluZSBIRFNQXzk2NTJfcm1zQmFzZQk0MDk2CisKKy8qIGMuZi4gdGhlIGhkc3BfOTYzMl9tZXRlcnNfdCBzdHJ1Y3QgKi8KKyNkZWZpbmUgSERTUF85NjMyX21ldGVyc0Jhc2UJNDA5NgorCisjZGVmaW5lIEhEU1BfSU9fRVhURU5UICAgICA3MTY4CisKKy8qIGNvbnRyb2wyIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBIRFNQX1RNUyAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEhEU1BfVENLICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSERTUF9UREkgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBIRFNQX0pUQUcgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEhEU1BfUFdETiAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSERTUF9QUk9HUkFNCSAgICAgICAgMHgwMjAKKyNkZWZpbmUgSERTUF9DT05GSUdfTU9ERV8wCTB4MDQwCisjZGVmaW5lIEhEU1BfQ09ORklHX01PREVfMQkweDA4MAorI2RlZmluZSBIRFNQX1ZFUlNJT05fQklUCTB4MTAwCisjZGVmaW5lIEhEU1BfQklHRU5ESUFOX01PREUgICAgIDB4MjAwCisjZGVmaW5lIEhEU1BfUkRfTVVMVElQTEUgICAgICAgIDB4NDAwCisjZGVmaW5lIEhEU1BfOTY1Ml9FTkFCTEVfTUlYRVIgIDB4ODAwCisjZGVmaW5lIEhEU1BfVERPICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKworI2RlZmluZSBIRFNQX1NfUFJPR1JBTSAgICAgCShIRFNQX1BST0dSQU18SERTUF9DT05GSUdfTU9ERV8wKQorI2RlZmluZSBIRFNQX1NfTE9BRAkJKEhEU1BfUFJPR1JBTXxIRFNQX0NPTkZJR19NT0RFXzEpCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIEhEU1BfU3RhcnQgICAgICAgICAgICAgICAgKDE8PDApICAvKiBzdGFydCBlbmdpbmUgKi8KKyNkZWZpbmUgSERTUF9MYXRlbmN5MCAgICAgICAgICAgICAoMTw8MSkgIC8qIGJ1ZmZlciBzaXplID0gMl5uIHdoZXJlIG4gaXMgZGVmaW5lZCBieSBMYXRlbmN5ezIsMSwwfSAqLworI2RlZmluZSBIRFNQX0xhdGVuY3kxICAgICAgICAgICAgICgxPDwyKSAgLyogWyBzZWUgYWJvdmUgXSAqLworI2RlZmluZSBIRFNQX0xhdGVuY3kyICAgICAgICAgICAgICgxPDwzKSAgLyogWyBzZWUgYWJvdmUgXSAqLworI2RlZmluZSBIRFNQX0Nsb2NrTW9kZU1hc3RlciAgICAgICgxPDw0KSAgLyogMT1NYXN0ZXIsIDA9U2xhdmUvQXV0b3N5bmMgKi8KKyNkZWZpbmUgSERTUF9BdWRpb0ludGVycnVwdEVuYWJsZSAoMTw8NSkgIC8qIHdoYXQgZG8geW91IHRoaW5rID8gKi8KKyNkZWZpbmUgSERTUF9GcmVxdWVuY3kwICAgICAgICAgICAoMTw8NikgIC8qIDA9NDQuMWtIei84OC4ya0h6LzE3Ni40a0h6IDE9NDhrSHovOTZrSHovMTkya0h6ICovCisjZGVmaW5lIEhEU1BfRnJlcXVlbmN5MSAgICAgICAgICAgKDE8PDcpICAvKiAwPTMya0h6LzY0a0h6LzEyOGtIeiAqLworI2RlZmluZSBIRFNQX0RvdWJsZVNwZWVkICAgICAgICAgICgxPDw4KSAgLyogMD1ub3JtYWwgc3BlZWQsIDE9ZG91YmxlIHNwZWVkICovCisjZGVmaW5lIEhEU1BfU1BESUZQcm9mZXNzaW9uYWwgICAgKDE8PDkpICAvKiAwPWNvbnN1bWVyLCAxPXByb2Zlc3Npb25hbCAqLworI2RlZmluZSBIRFNQX1NQRElGRW1waGFzaXMgICAgICAgICgxPDwxMCkgLyogMD1ub25lLCAxPW9uICovCisjZGVmaW5lIEhEU1BfU1BESUZOb25BdWRpbyAgICAgICAgKDE8PDExKSAvKiAwPW9mZiwgMT1vbiAqLworI2RlZmluZSBIRFNQX1NQRElGT3B0aWNhbE91dCAgICAgICgxPDwxMikgLyogMT11c2UgMXN0IEFEQVQgY29ubmVjdG9yIGZvciBTUERJRiwgMD1kbyBub3QgKi8KKyNkZWZpbmUgSERTUF9TeW5jUmVmMiAgICAgICAgICAgICAoMTw8MTMpIAorI2RlZmluZSBIRFNQX1NQRElGSW5wdXRTZWxlY3QwICAgICgxPDwxNCkgCisjZGVmaW5lIEhEU1BfU1BESUZJbnB1dFNlbGVjdDEgICAgKDE8PDE1KSAKKyNkZWZpbmUgSERTUF9TeW5jUmVmMCAgICAgICAgICAgICAoMTw8MTYpIAorI2RlZmluZSBIRFNQX1N5bmNSZWYxICAgICAgICAgICAgICgxPDwxNykKKyNkZWZpbmUgSERTUF9BbmFsb2dFeHRlbnNpb25Cb2FyZCAoMTw8MTgpIC8qIEZvciBIOTYzMiBjYXJkcyAqLyAKKyNkZWZpbmUgSERTUF9YTFJCcmVha291dENhYmxlICAgICAoMTw8MjApIC8qIEZvciBIOTYzMiBjYXJkcyAqLworI2RlZmluZSBIRFNQX01pZGkwSW50ZXJydXB0RW5hYmxlICgxPDwyMikKKyNkZWZpbmUgSERTUF9NaWRpMUludGVycnVwdEVuYWJsZSAoMTw8MjMpCisjZGVmaW5lIEhEU1BfTGluZU91dCAgICAgICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBIRFNQX0FER2FpbjAJCSAgKDE8PDI1KSAvKiBGcm9tIGhlcmUgOiBIOTYzMiBzcGVjaWZpYyAqLworI2RlZmluZSBIRFNQX0FER2FpbjEJCSAgKDE8PDI2KQorI2RlZmluZSBIRFNQX0RBR2FpbjAJCSAgKDE8PDI3KQorI2RlZmluZSBIRFNQX0RBR2FpbjEJCSAgKDE8PDI4KQorI2RlZmluZSBIRFNQX1Bob25lR2FpbjAJCSAgKDE8PDI5KQorI2RlZmluZSBIRFNQX1Bob25lR2FpbjEJCSAgKDE8PDMwKQorI2RlZmluZSBIRFNQX1F1YWRTcGVlZAkgIAkgICgxPDwzMSkKKworI2RlZmluZSBIRFNQX0FER2Fpbk1hc2sgICAgICAgKEhEU1BfQURHYWluMHxIRFNQX0FER2FpbjEpCisjZGVmaW5lIEhEU1BfQURHYWluTWludXMxMGRCViAgSERTUF9BREdhaW5NYXNrCisjZGVmaW5lIEhEU1BfQURHYWluUGx1czRkQnUgICAoSERTUF9BREdhaW4wKQorI2RlZmluZSBIRFNQX0FER2Fpbkxvd0dhaW4gICAgIDAKKworI2RlZmluZSBIRFNQX0RBR2Fpbk1hc2sgICAgICAgICAoSERTUF9EQUdhaW4wfEhEU1BfREFHYWluMSkKKyNkZWZpbmUgSERTUF9EQUdhaW5IaWdoR2FpbiAgICAgIEhEU1BfREFHYWluTWFzaworI2RlZmluZSBIRFNQX0RBR2FpblBsdXM0ZEJ1ICAgICAoSERTUF9EQUdhaW4wKQorI2RlZmluZSBIRFNQX0RBR2Fpbk1pbnVzMTBkQlYgICAgMAorCisjZGVmaW5lIEhEU1BfUGhvbmVHYWluTWFzayAgICAgIChIRFNQX1Bob25lR2FpbjB8SERTUF9QaG9uZUdhaW4xKQorI2RlZmluZSBIRFNQX1Bob25lR2FpbjBkQiAgICAgICAgSERTUF9QaG9uZUdhaW5NYXNrCisjZGVmaW5lIEhEU1BfUGhvbmVHYWluTWludXM2ZEIgIChIRFNQX1Bob25lR2FpbjApCisjZGVmaW5lIEhEU1BfUGhvbmVHYWluTWludXMxMmRCICAwCisKKyNkZWZpbmUgSERTUF9MYXRlbmN5TWFzayAgICAoSERTUF9MYXRlbmN5MHxIRFNQX0xhdGVuY3kxfEhEU1BfTGF0ZW5jeTIpCisjZGVmaW5lIEhEU1BfRnJlcXVlbmN5TWFzayAgKEhEU1BfRnJlcXVlbmN5MHxIRFNQX0ZyZXF1ZW5jeTF8SERTUF9Eb3VibGVTcGVlZHxIRFNQX1F1YWRTcGVlZCkKKworI2RlZmluZSBIRFNQX1NQRElGSW5wdXRNYXNrICAgIChIRFNQX1NQRElGSW5wdXRTZWxlY3QwfEhEU1BfU1BESUZJbnB1dFNlbGVjdDEpCisjZGVmaW5lIEhEU1BfU1BESUZJbnB1dEFEQVQxICAgIDAKKyNkZWZpbmUgSERTUF9TUERJRklucHV0Q29heGlhbCAoSERTUF9TUERJRklucHV0U2VsZWN0MCkKKyNkZWZpbmUgSERTUF9TUERJRklucHV0Q2Ryb20gICAoSERTUF9TUERJRklucHV0U2VsZWN0MSkKKyNkZWZpbmUgSERTUF9TUERJRklucHV0QUVTICAgICAoSERTUF9TUERJRklucHV0U2VsZWN0MHxIRFNQX1NQRElGSW5wdXRTZWxlY3QxKQorCisjZGVmaW5lIEhEU1BfU3luY1JlZk1hc2sgICAgICAgIChIRFNQX1N5bmNSZWYwfEhEU1BfU3luY1JlZjF8SERTUF9TeW5jUmVmMikKKyNkZWZpbmUgSERTUF9TeW5jUmVmX0FEQVQxICAgICAgIDAKKyNkZWZpbmUgSERTUF9TeW5jUmVmX0FEQVQyICAgICAgKEhEU1BfU3luY1JlZjApCisjZGVmaW5lIEhEU1BfU3luY1JlZl9BREFUMyAgICAgIChIRFNQX1N5bmNSZWYxKQorI2RlZmluZSBIRFNQX1N5bmNSZWZfU1BESUYgICAgICAoSERTUF9TeW5jUmVmMHxIRFNQX1N5bmNSZWYxKQorI2RlZmluZSBIRFNQX1N5bmNSZWZfV09SRCAgICAgICAoSERTUF9TeW5jUmVmMikKKyNkZWZpbmUgSERTUF9TeW5jUmVmX0FEQVRfU1lOQyAgKEhEU1BfU3luY1JlZjB8SERTUF9TeW5jUmVmMikKKworLyogU2FtcGxlIENsb2NrIFNvdXJjZXMgKi8KKworI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9BVVRPU1lOQyAgICAgICAgICAgMAorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8zMktIWiAgICAgMQorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF80NF8xS0haICAgMgorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF80OEtIWiAgICAgMworI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF82NEtIWiAgICAgNAorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF84OF8yS0haICAgNQorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF85NktIWiAgICAgNgorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8xMjhLSFogICAgNworI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8xNzZfNEtIWiAgOAorI2RlZmluZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8xOTJLSFogICAgOQorCisvKiBQcmVmZXJyZWQgc3luYyByZWZlcmVuY2UgY2hvaWNlcyAtIHVzZWQgYnkgInByZWZfc3luY19yZWYiIGNvbnRyb2wgc3dpdGNoICovCisKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fV09SRCAgICAgIDAKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fU1BESUYgICAgIDEKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fQURBVDEgICAgIDIKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fQURBVF9TWU5DIDMKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fQURBVDIgICAgIDQKKyNkZWZpbmUgSERTUF9TWU5DX0ZST01fQURBVDMgICAgIDUKKworLyogU3luY0NoZWNrIHN0YXR1cyAqLworCisjZGVmaW5lIEhEU1BfU1lOQ19DSEVDS19OT19MT0NLIDAKKyNkZWZpbmUgSERTUF9TWU5DX0NIRUNLX0xPQ0sgICAgMQorI2RlZmluZSBIRFNQX1NZTkNfQ0hFQ0tfU1lOQwkyCisKKy8qIEF1dG9TeW5jIHJlZmVyZW5jZXMgLSB1c2VkIGJ5ICJhdXRvc3luY19yZWYiIGNvbnRyb2wgc3dpdGNoICovCisKKyNkZWZpbmUgSERTUF9BVVRPU1lOQ19GUk9NX1dPUkQgICAgICAwCisjZGVmaW5lIEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUX1NZTkMgMQorI2RlZmluZSBIRFNQX0FVVE9TWU5DX0ZST01fU1BESUYgICAgIDIKKyNkZWZpbmUgSERTUF9BVVRPU1lOQ19GUk9NX05PTkUJICAgICAzCisjZGVmaW5lIEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSAgICAgNAorI2RlZmluZSBIRFNQX0FVVE9TWU5DX0ZST01fQURBVDIgICAgIDUKKyNkZWZpbmUgSERTUF9BVVRPU1lOQ19GUk9NX0FEQVQzICAgICA2CisKKy8qIFBvc3NpYmxlIHNvdXJjZXMgb2YgUy9QRElGIGlucHV0ICovCisKKyNkZWZpbmUgSERTUF9TUERJRklOX09QVElDQUwgIDAJLyogb3B0aWNhbCAgKEFEQVQxKSAqLworI2RlZmluZSBIRFNQX1NQRElGSU5fQ09BWElBTCAgMQkvKiBjb2F4aWFsIChSQ0EpICovCisjZGVmaW5lIEhEU1BfU1BESUZJTl9JTlRFUk5BTCAyCS8qIGludGVybmFsIChDRFJPTSkgKi8KKyNkZWZpbmUgSERTUF9TUERJRklOX0FFUyAgICAgIDMgLyogeGxyIGZvciBIOTYzMiAoQUVTKSovCisKKyNkZWZpbmUgSERTUF9GcmVxdWVuY3kzMktIeiAgICBIRFNQX0ZyZXF1ZW5jeTAKKyNkZWZpbmUgSERTUF9GcmVxdWVuY3k0NF8xS0h6ICBIRFNQX0ZyZXF1ZW5jeTEKKyNkZWZpbmUgSERTUF9GcmVxdWVuY3k0OEtIeiAgICAoSERTUF9GcmVxdWVuY3kxfEhEU1BfRnJlcXVlbmN5MCkKKyNkZWZpbmUgSERTUF9GcmVxdWVuY3k2NEtIeiAgICAoSERTUF9Eb3VibGVTcGVlZHxIRFNQX0ZyZXF1ZW5jeTApCisjZGVmaW5lIEhEU1BfRnJlcXVlbmN5ODhfMktIeiAgKEhEU1BfRG91YmxlU3BlZWR8SERTUF9GcmVxdWVuY3kxKQorI2RlZmluZSBIRFNQX0ZyZXF1ZW5jeTk2S0h6ICAgIChIRFNQX0RvdWJsZVNwZWVkfEhEU1BfRnJlcXVlbmN5MXxIRFNQX0ZyZXF1ZW5jeTApCisvKiBGb3IgSDk2MzIgY2FyZHMgKi8KKyNkZWZpbmUgSERTUF9GcmVxdWVuY3kxMjhLSHogICAoSERTUF9RdWFkU3BlZWR8SERTUF9Eb3VibGVTcGVlZHxIRFNQX0ZyZXF1ZW5jeTApCisjZGVmaW5lIEhEU1BfRnJlcXVlbmN5MTc2XzRLSHogKEhEU1BfUXVhZFNwZWVkfEhEU1BfRG91YmxlU3BlZWR8SERTUF9GcmVxdWVuY3kxKQorI2RlZmluZSBIRFNQX0ZyZXF1ZW5jeTE5MktIeiAgIChIRFNQX1F1YWRTcGVlZHxIRFNQX0RvdWJsZVNwZWVkfEhEU1BfRnJlcXVlbmN5MXxIRFNQX0ZyZXF1ZW5jeTApCisKKyNkZWZpbmUgaGRzcF9lbmNvZGVfbGF0ZW5jeSh4KSAgICAgICAoKCh4KTw8MSkgJiBIRFNQX0xhdGVuY3lNYXNrKQorI2RlZmluZSBoZHNwX2RlY29kZV9sYXRlbmN5KHgpICAgICAgICgoKHgpICYgSERTUF9MYXRlbmN5TWFzayk+PjEpCisKKyNkZWZpbmUgaGRzcF9lbmNvZGVfc3BkaWZfaW4oeCkgKCgoeCkmMHgzKTw8MTQpCisjZGVmaW5lIGhkc3BfZGVjb2RlX3NwZGlmX2luKHgpICgoKHgpPj4xNCkmMHgzKQorCisvKiBTdGF0dXMgUmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIEhEU1BfYXVkaW9JUlFQZW5kaW5nICAgICgxPDwwKQorI2RlZmluZSBIRFNQX0xvY2syICAgICAgICAgICAgICAoMTw8MSkgICAgIC8qIHRoaXMgaXMgZm9yIERpZ2lmYWNlIGFuZCBIOTY1MiAqLworI2RlZmluZSBIRFNQX3NwZGlmRnJlcXVlbmN5MwlIRFNQX0xvY2syIC8qIHRoaXMgaXMgZm9yIEg5NjMyIG9ubHkgKi8KKyNkZWZpbmUgSERTUF9Mb2NrMSAgICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIEhEU1BfTG9jazAgICAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBIRFNQX1NQRElGU3luYyAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgSERTUF9UaW1lY29kZUxvY2sgICAgICAgKDE8PDUpCisjZGVmaW5lIEhEU1BfQnVmZmVyUG9zaXRpb25NYXNrIDB4MDAwRkZDMCAvKiBCaXQgNi4uMTUgOiBoL3cgYnVmZmVyIHBvaW50ZXIgKi8KKyNkZWZpbmUgSERTUF9TeW5jMiAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBIRFNQX1N5bmMxICAgICAgICAgICAgICAoMTw8MTcpCisjZGVmaW5lIEhEU1BfU3luYzAgICAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgSERTUF9Eb3VibGVTcGVlZFN0YXR1cyAgKDE8PDE5KQorI2RlZmluZSBIRFNQX0NvbmZpZ0Vycm9yICAgICAgICAoMTw8MjApCisjZGVmaW5lIEhEU1BfRGxsRXJyb3IgICAgICAgICAgICgxPDwyMSkKKyNkZWZpbmUgSERTUF9zcGRpZkZyZXF1ZW5jeTAgICAgKDE8PDIyKQorI2RlZmluZSBIRFNQX3NwZGlmRnJlcXVlbmN5MSAgICAoMTw8MjMpCisjZGVmaW5lIEhEU1Bfc3BkaWZGcmVxdWVuY3kyICAgICgxPDwyNCkKKyNkZWZpbmUgSERTUF9TUERJRkVycm9yRmxhZyAgICAgKDE8PDI1KQorI2RlZmluZSBIRFNQX0J1ZmZlcklEICAgICAgICAgICAoMTw8MjYpCisjZGVmaW5lIEhEU1BfVGltZWNvZGVTeW5jICAgICAgICgxPDwyNykKKyNkZWZpbmUgSERTUF9BRUJPICAgICAgICAgIAkoMTw8MjgpIC8qIEg5NjMyIHNwZWNpZmljIEFuYWxvZyBFeHRlbnNpb24gQm9hcmRzICovCisjZGVmaW5lIEhEU1BfQUVCSQkJKDE8PDI5KSAvKiAwID0gcHJlc2VudCwgMSA9IGFic2VudCAqLworI2RlZmluZSBIRFNQX21pZGkwSVJRUGVuZGluZyAgICAoMTw8MzApIAorI2RlZmluZSBIRFNQX21pZGkxSVJRUGVuZGluZyAgICAoMTw8MzEpCisKKyNkZWZpbmUgSERTUF9zcGRpZkZyZXF1ZW5jeU1hc2sgICAgKEhEU1Bfc3BkaWZGcmVxdWVuY3kwfEhEU1Bfc3BkaWZGcmVxdWVuY3kxfEhEU1Bfc3BkaWZGcmVxdWVuY3kyKQorCisjZGVmaW5lIEhEU1Bfc3BkaWZGcmVxdWVuY3kzMktIeiAgIChIRFNQX3NwZGlmRnJlcXVlbmN5MCkKKyNkZWZpbmUgSERTUF9zcGRpZkZyZXF1ZW5jeTQ0XzFLSHogKEhEU1Bfc3BkaWZGcmVxdWVuY3kxKQorI2RlZmluZSBIRFNQX3NwZGlmRnJlcXVlbmN5NDhLSHogICAoSERTUF9zcGRpZkZyZXF1ZW5jeTB8SERTUF9zcGRpZkZyZXF1ZW5jeTEpCisKKyNkZWZpbmUgSERTUF9zcGRpZkZyZXF1ZW5jeTY0S0h6ICAgKEhEU1Bfc3BkaWZGcmVxdWVuY3kyKQorI2RlZmluZSBIRFNQX3NwZGlmRnJlcXVlbmN5ODhfMktIeiAoSERTUF9zcGRpZkZyZXF1ZW5jeTB8SERTUF9zcGRpZkZyZXF1ZW5jeTIpCisjZGVmaW5lIEhEU1Bfc3BkaWZGcmVxdWVuY3k5NktIeiAgIChIRFNQX3NwZGlmRnJlcXVlbmN5MnxIRFNQX3NwZGlmRnJlcXVlbmN5MSkKKworLyogVGhpcyBpcyBmb3IgSDk2MzIgY2FyZHMgKi8KKyNkZWZpbmUgSERTUF9zcGRpZkZyZXF1ZW5jeTEyOEtIeiAgIEhEU1Bfc3BkaWZGcmVxdWVuY3lNYXNrCisjZGVmaW5lIEhEU1Bfc3BkaWZGcmVxdWVuY3kxNzZfNEtIeiBIRFNQX3NwZGlmRnJlcXVlbmN5MworI2RlZmluZSBIRFNQX3NwZGlmRnJlcXVlbmN5MTkyS0h6ICAgKEhEU1Bfc3BkaWZGcmVxdWVuY3kzfEhEU1Bfc3BkaWZGcmVxdWVuY3kwKQorCisvKiBTdGF0dXMyIFJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBIRFNQX3ZlcnNpb24wICAgICAoMTw8MCkKKyNkZWZpbmUgSERTUF92ZXJzaW9uMSAgICAgKDE8PDEpCisjZGVmaW5lIEhEU1BfdmVyc2lvbjIgICAgICgxPDwyKQorI2RlZmluZSBIRFNQX3djX2xvY2sgICAgICAoMTw8MykKKyNkZWZpbmUgSERTUF93Y19zeW5jICAgICAgKDE8PDQpCisjZGVmaW5lIEhEU1BfaW5wX2ZyZXEwICAgICgxPDw1KQorI2RlZmluZSBIRFNQX2lucF9mcmVxMSAgICAoMTw8NikKKyNkZWZpbmUgSERTUF9pbnBfZnJlcTIgICAgKDE8PDcpCisjZGVmaW5lIEhEU1BfU2VsU3luY1JlZjAgICgxPDw4KQorI2RlZmluZSBIRFNQX1NlbFN5bmNSZWYxICAoMTw8OSkKKyNkZWZpbmUgSERTUF9TZWxTeW5jUmVmMiAgKDE8PDEwKQorCisjZGVmaW5lIEhEU1Bfd2NfdmFsaWQgKEhEU1Bfd2NfbG9ja3xIRFNQX3djX3N5bmMpCisKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3lNYXNrIChIRFNQX2lucF9mcmVxMHxIRFNQX2lucF9mcmVxMXxIRFNQX2lucF9mcmVxMikKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3kzMiAgIChIRFNQX2lucF9mcmVxMCkKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3k0NF8xIChIRFNQX2lucF9mcmVxMSkKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3k0OCAgIChIRFNQX2lucF9mcmVxMHxIRFNQX2lucF9mcmVxMSkKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3k2NCAgIChIRFNQX2lucF9mcmVxMikKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3k4OF8yIChIRFNQX2lucF9mcmVxMHxIRFNQX2lucF9mcmVxMikKKyNkZWZpbmUgSERTUF9zeXN0ZW1GcmVxdWVuY3k5NiAgIChIRFNQX2lucF9mcmVxMXxIRFNQX2lucF9mcmVxMikKKy8qIEZJWE1FIDogbW9yZSB2YWx1ZXMgZm9yIDk2MzIgY2FyZHMgPyAqLworCisjZGVmaW5lIEhEU1BfU2VsU3luY1JlZk1hc2sgICAgICAgIChIRFNQX1NlbFN5bmNSZWYwfEhEU1BfU2VsU3luY1JlZjF8SERTUF9TZWxTeW5jUmVmMikKKyNkZWZpbmUgSERTUF9TZWxTeW5jUmVmX0FEQVQxICAgICAgMAorI2RlZmluZSBIRFNQX1NlbFN5bmNSZWZfQURBVDIgICAgICAoSERTUF9TZWxTeW5jUmVmMCkKKyNkZWZpbmUgSERTUF9TZWxTeW5jUmVmX0FEQVQzICAgICAgKEhEU1BfU2VsU3luY1JlZjEpCisjZGVmaW5lIEhEU1BfU2VsU3luY1JlZl9TUERJRiAgICAgIChIRFNQX1NlbFN5bmNSZWYwfEhEU1BfU2VsU3luY1JlZjEpCisjZGVmaW5lIEhEU1BfU2VsU3luY1JlZl9XT1JEICAgICAgIChIRFNQX1NlbFN5bmNSZWYyKQorI2RlZmluZSBIRFNQX1NlbFN5bmNSZWZfQURBVF9TWU5DICAoSERTUF9TZWxTeW5jUmVmMHxIRFNQX1NlbFN5bmNSZWYyKQorCisvKiBDYXJkIHN0YXRlIGZsYWdzICovCisKKyNkZWZpbmUgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlICAoMTw8MCkKKyNkZWZpbmUgSERTUF9GaXJtd2FyZUxvYWRlZAkgICAgICgxPDwxKQorI2RlZmluZSBIRFNQX0Zpcm13YXJlQ2FjaGVkCSAgICAgKDE8PDIpCisKKy8qIEZJRk8gd2FpdCB0aW1lcywgZGVmaW5lZCBpbiB0ZXJtcyBvZiAxLzEwdGhzIG9mIG1zZWNzICovCisKKyNkZWZpbmUgSERTUF9MT05HX1dBSVQJIDUwMDAKKyNkZWZpbmUgSERTUF9TSE9SVF9XQUlUICAzMAorCisjZGVmaW5lIFVOSVRZX0dBSU4gICAgICAgICAgICAgICAgICAgICAgIDMyNzY4CisjZGVmaW5lIE1JTlVTX0lORklOSVRZX0dBSU4gICAgICAgICAgICAgIDAKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1hJTElOWAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1hJTElOWAkJMHgxMGVlCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9YSUxJTlhfSEFNTUVSRkFMTF9EU1AKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YSUxJTlhfSEFNTUVSRkFMTF9EU1AgMHgzZmM1CisjZW5kaWYKKworLyogdGhlIHNpemUgb2YgYSBzdWJzdHJlYW0gKDEgbW9ubyBkYXRhIHN0cmVhbSkgKi8KKworI2RlZmluZSBIRFNQX0NIQU5ORUxfQlVGRkVSX1NBTVBMRVMgICgxNioxMDI0KQorI2RlZmluZSBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTICAgICg0KkhEU1BfQ0hBTk5FTF9CVUZGRVJfU0FNUExFUykKKworLyogdGhlIHNpemUgb2YgdGhlIGFyZWEgd2UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgRE1BIHRyYW5zZmVycy4gdGhlCisgICBzaXplIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBjaGFubmVscyAtIHRoZSAKKyAgIE11bHRpZmFjZSBzdGlsbCB1c2VzIHRoZSBzYW1lIG1lbW9yeSBhcmVhLgorCisgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgMSBtb3JlIGNoYW5uZWwgdGhhbiBpcyBhcHBhcmVudGx5IG5lZWRlZAorICAgYmVjYXVzZSB0aGUgaC93IHNlZW1zIHRvIHdyaXRlIDEgYnl0ZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGFzdAorICAgcGFnZS4gU2lnaC4KKyovCisKKyNkZWZpbmUgSERTUF9ETUFfQVJFQV9CWVRFUyAoKEhEU1BfTUFYX0NIQU5ORUxTKzEpICogSERTUF9DSEFOTkVMX0JVRkZFUl9CWVRFUykKKyNkZWZpbmUgSERTUF9ETUFfQVJFQV9LSUxPQllURVMgKEhEU1BfRE1BX0FSRUFfQllURVMvMTAyNCkKKworLyogdXNlIGhvdHBsdWcgZmlybWVhcmUgbG9hZGVyPyAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUikgfHwgZGVmaW5lZChDT05GSUdfRldfTE9BREVSX01PRFVMRSkKKyNpZm5kZWYgSERTUF9VU0VfSFdERVBfTE9BREVSCisjZGVmaW5lIEhEU1BfRldfTE9BREVSCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfaGRzcCAgICAgICAgICAgICBoZHNwX3Q7Cit0eXBlZGVmIHN0cnVjdCBfaGRzcF9taWRpICAgICAgICBoZHNwX21pZGlfdDsKK3R5cGVkZWYgc3RydWN0IF9oZHNwXzk2MzJfbWV0ZXJzIGhkc3BfOTYzMl9tZXRlcnNfdDsKKworc3RydWN0IF9oZHNwXzk2MzJfbWV0ZXJzIHsKKyAgICB1MzIgaW5wdXRfcGVha1sxNl07CisgICAgdTMyIHBsYXliYWNrX3BlYWtbMTZdOworICAgIHUzMiBvdXRwdXRfcGVha1sxNl07CisgICAgdTMyIHh4eF9wZWFrWzE2XTsKKyAgICB1MzIgcGFkZGluZ1s2NF07CisgICAgdTMyIGlucHV0X3Jtc19sb3dbMTZdOworICAgIHUzMiBwbGF5YmFja19ybXNfbG93WzE2XTsKKyAgICB1MzIgb3V0cHV0X3Jtc19sb3dbMTZdOworICAgIHUzMiB4eHhfcm1zX2xvd1sxNl07CisgICAgdTMyIGlucHV0X3Jtc19oaWdoWzE2XTsKKyAgICB1MzIgcGxheWJhY2tfcm1zX2hpZ2hbMTZdOworICAgIHUzMiBvdXRwdXRfcm1zX2hpZ2hbMTZdOworICAgIHUzMiB4eHhfcm1zX2hpZ2hbMTZdOworfTsKKworc3RydWN0IF9oZHNwX21pZGkgeworICAgIGhkc3BfdCAgICAgICAgICAgICAgICAgICpoZHNwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpZDsKKyAgICBzbmRfcmF3bWlkaV90ICAgICAgICAgICAqcm1pZGk7CisgICAgc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKmlucHV0OworICAgIHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICpvdXRwdXQ7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgIGlzdGltZXI7IC8qIHRpbWVyIGluIHVzZSAqLworICAgIHN0cnVjdCB0aW1lcl9saXN0CSAgICAgdGltZXI7CisgICAgc3BpbmxvY2tfdCAgICAgICAgICAgICAgIGxvY2s7CisgICAgaW50CQkJICAgICBwZW5kaW5nOworfTsKKworc3RydWN0IF9oZHNwIHsKKwlzcGlubG9ja190ICAgICAgICAgICAgbG9jazsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICAqY2FwdHVyZV9zdWJzdHJlYW07CisJc25kX3BjbV9zdWJzdHJlYW1fdCAgKnBsYXliYWNrX3N1YnN0cmVhbTsKKyAgICAgICAgaGRzcF9taWRpX3QgICAgICAgICAgIG1pZGlbMl07CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IG1pZGlfdGFza2xldDsKKwlpbnQJCSAgICAgIHVzZV9taWRpX3Rhc2tsZXQ7CisJaW50ICAgICAgICAgICAgICAgICAgIHByZWNpc2VfcHRyOworCXUzMiAgICAgICAgICAgICAgICAgICBjb250cm9sX3JlZ2lzdGVyOwkgICAgIC8qIGNhY2hlZCB2YWx1ZSAqLworCXUzMiAgICAgICAgICAgICAgICAgICBjb250cm9sMl9yZWdpc3RlcjsgICAgIC8qIGNhY2hlZCB2YWx1ZSAqLworCXUzMiAgICAgICAgICAgICAgICAgICBjcmVnX3NwZGlmOworCXUzMiAgICAgICAgICAgICAgICAgICBjcmVnX3NwZGlmX3N0cmVhbTsKKwljaGFyICAgICAgICAgICAgICAgICAqY2FyZF9uYW1lOwkgICAgIC8qIGRpZ2lmYWNlL211bHRpZmFjZSAqLworCUhEU1BfSU9fVHlwZSAgICAgICAgICBpb190eXBlOyAgICAgICAgICAgICAgIC8qIGRpdHRvLCBidXQgZm9yIGNvZGUgdXNlICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICBmaXJtd2FyZV9yZXY7CisJdW5zaWduZWQgc2hvcnQJICAgICAgc3RhdGU7CQkgICAgIC8qIHN0b3JlcyBzdGF0ZSBiaXRzICovCisJdTMyCQkgICAgICBmaXJtd2FyZV9jYWNoZVsyNDQxM107IC8qIHRoaXMgaGVscHMgcmVjb3ZlciBmcm9tIGFjY2lkZW50YWwgaW9ib3ggcG93ZXIgZmFpbHVyZSAqLworCXNpemVfdCAgICAgICAgICAgICAgICBwZXJpb2RfYnl0ZXM7IAkgICAgIC8qIGd1ZXNzIHdoYXQgdGhpcyBpcyAqLworCXVuc2lnbmVkIGNoYXIJICAgICAgbWF4X2NoYW5uZWxzOworCXVuc2lnbmVkIGNoYXIJICAgICAgcXNfaW5fY2hhbm5lbHM7CSAgICAgLyogcXVhZCBzcGVlZCBtb2RlIGZvciBIOTYzMiAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgICBkc19pbl9jaGFubmVsczsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgc3NfaW5fY2hhbm5lbHM7CSAgICAvKiBkaWZmZXJlbnQgZm9yIG11bHRpZmFjZS9kaWdpZmFjZSAqLworCXVuc2lnbmVkIGNoYXIJICAgICAgcXNfb3V0X2NoYW5uZWxzOwkgICAgCisJdW5zaWduZWQgY2hhciAgICAgICAgIGRzX291dF9jaGFubmVsczsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgc3Nfb3V0X2NoYW5uZWxzOworCisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGNhcHR1cmVfZG1hX2J1ZjsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcGxheWJhY2tfZG1hX2J1ZjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAqY2FwdHVyZV9idWZmZXI7CSAgICAvKiBzdWl0YWJseSBhbGlnbmVkIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgICAqcGxheWJhY2tfYnVmZmVyOwkgICAgLyogc3VpdGFibHkgYWxpZ25lZCBhZGRyZXNzICovCisKKwlwaWRfdCAgICAgICAgICAgICAgICAgY2FwdHVyZV9waWQ7CisJcGlkX3QgICAgICAgICAgICAgICAgIHBsYXliYWNrX3BpZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgcnVubmluZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgc3lzdGVtX3NhbXBsZV9yYXRlOworCWNoYXIgICAgICAgICAgICAgICAgICpjaGFubmVsX21hcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgZGV2OworCWludCAgICAgICAgICAgICAgICAgICBpcnE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgIHBvcnQ7CisgICAgICAgIHZvaWQgX19pb21lbSAgICAgICAgICppb2Jhc2U7CisJc25kX2NhcmRfdCAgICAgICAgICAgKmNhcmQ7CisJc25kX3BjbV90ICAgICAgICAgICAgKnBjbTsKKwlzbmRfaHdkZXBfdCAgICAgICAgICAqaHdkZXA7CisJc3RydWN0IHBjaV9kZXYgICAgICAgKnBjaTsKKwlzbmRfa2NvbnRyb2xfdCAgICAgICAqc3BkaWZfY3RsOworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgbWl4ZXJfbWF0cml4W0hEU1BfTUFUUklYX01JWEVSX1NJWkVdOworfTsKKworLyogVGhlc2UgdGFibGVzIG1hcCB0aGUgQUxTQSBjaGFubmVscyAxLi5OIHRvIHRoZSBjaGFubmVscyB0aGF0IHdlCisgICBuZWVkIHRvIHVzZSBpbiBvcmRlciB0byBmaW5kIHRoZSByZWxldmFudCBjaGFubmVsIGJ1ZmZlci4gUk1FCisgICByZWZlciB0byB0aGlzIGtpbmQgb2YgbWFwcGluZyBhcyBiZXR3ZWVuICJ0aGUgQURBVCBjaGFubmVsIGFuZAorICAgdGhlIERNQSBjaGFubmVsLiIgV2UgaW5kZXggaXQgdXNpbmcgdGhlIGxvZ2ljYWwgYXVkaW8gY2hhbm5lbCwKKyAgIGFuZCB0aGUgdmFsdWUgaXMgdGhlIERNQSBjaGFubmVsIChpLmUuIGNoYW5uZWwgYnVmZmVyIG51bWJlcikKKyAgIHdoZXJlIHRoZSBkYXRhIGZvciB0aGF0IGNoYW5uZWwgY2FuIGJlIHJlYWQvd3JpdHRlbiBmcm9tL3RvLgorKi8KKworc3RhdGljIGNoYXIgY2hhbm5lbF9tYXBfZGZfc3NbSERTUF9NQVhfQ0hBTk5FTFNdID0geworCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywKKwkxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUKK307CisKK3N0YXRpYyBjaGFyIGNoYW5uZWxfbWFwX21mX3NzW0hEU1BfTUFYX0NIQU5ORUxTXSA9IHsgLyogTXVsdGlmYWNlICovCisJLyogQW5hbG9nICovCisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgCisJLyogQURBVCAyICovCisJMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAKKwkvKiBTUERJRiAqLworCTI0LCAyNSwKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKK307CisKK3N0YXRpYyBjaGFyIGNoYW5uZWxfbWFwX2RzW0hEU1BfTUFYX0NIQU5ORUxTXSA9IHsKKwkvKiBBREFUIGNoYW5uZWxzIGFyZSByZW1hcHBlZCAqLworCTEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLAorCS8qIGNoYW5uZWxzIDEyIGFuZCAxMyBhcmUgUy9QRElGICovCisJMjQsIDI1LAorCS8qIG90aGVycyBkb24ndCBleGlzdCAqLworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKK307CisKK3N0YXRpYyBjaGFyIGNoYW5uZWxfbWFwX0g5NjMyX3NzW0hEU1BfTUFYX0NIQU5ORUxTXSA9IHsKKwkvKiBBREFUIGNoYW5uZWxzICovCisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywKKwkvKiBTUERJRiAqLworCTgsIDksCisJLyogQW5hbG9nICovCisJMTAsIDExLCAKKwkvKiBBTzRTLTE5MiBhbmQgQUk0Uy0xOTIgZXh0ZW5zaW9uIGJvYXJkcyAqLworCTEyLCAxMywgMTQsIDE1LAorCS8qIG90aGVycyBkb24ndCBleGlzdCAqLworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xCit9OworCitzdGF0aWMgY2hhciBjaGFubmVsX21hcF9IOTYzMl9kc1tIRFNQX01BWF9DSEFOTkVMU10gPSB7CisJLyogQURBVCAqLworCTEsIDMsIDUsIDcsCisJLyogU1BESUYgKi8KKwk4LCA5LAorCS8qIEFuYWxvZyAqLworCTEwLCAxMSwgCisJLyogQU80Uy0xOTIgYW5kIEFJNFMtMTkyIGV4dGVuc2lvbiBib2FyZHMgKi8KKwkxMiwgMTMsIDE0LCAxNSwKKwkvKiBvdGhlcnMgZG9uJ3QgZXhpc3QgKi8KKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorfTsKKworc3RhdGljIGNoYXIgY2hhbm5lbF9tYXBfSDk2MzJfcXNbSERTUF9NQVhfQ0hBTk5FTFNdID0geworCS8qIEFEQVQgaXMgZGlzYWJsZWQgaW4gdGhpcyBtb2RlICovCisJLyogU1BESUYgKi8KKwk4LCA5LAorCS8qIEFuYWxvZyAqLworCTEwLCAxMSwKKwkvKiBBTzRTLTE5MiBhbmQgQUk0Uy0xOTIgZXh0ZW5zaW9uIGJvYXJkcyAqLworCTEyLCAxMywgMTQsIDE1LAorCS8qIG90aGVycyBkb24ndCBleGlzdCAqLworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJLTEsIC0xCit9OworCitzdGF0aWMgaW50IHNuZF9oYW1tZXJmYWxsX2dldF9idWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiLCBzaXplX3Qgc2l6ZSkKK3sKKwlkbWFiLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlkbWFiLT5kZXYuZGV2ID0gc25kX2RtYV9wY2lfZGF0YShwY2kpOworCWlmICghIHNuZF9kbWFfZ2V0X3Jlc2VydmVkX2J1ZihkbWFiLCBzbmRfZG1hX3BjaV9idWZfaWQocGNpKSkpIHsKKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCisJCQkJCXNpemUsIGRtYWIpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2hhbW1lcmZhbGxfZnJlZV9idWZmZXIoc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCWlmIChkbWFiLT5hcmVhKQorCQlzbmRfZG1hX3Jlc2VydmVfYnVmKGRtYWIsIHNuZF9kbWFfcGNpX2J1Zl9pZChwY2kpKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2hkc3BfaWRzW10gPSB7CisJeworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9YSUxJTlgsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1hJTElOWF9IQU1NRVJGQUxMX0RTUCwgCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwl9LCAvKiBSTUUgSGFtbWVyZmFsbC1EU1AgKi8KKwl7IDAsIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2hkc3BfaWRzKTsKKworLyogcHJvdG90eXBlcyAqLworc3RhdGljIGludCBzbmRfaGRzcF9jcmVhdGVfYWxzYV9kZXZpY2VzKHNuZF9jYXJkX3QgKmNhcmQsIGhkc3BfdCAqaGRzcCk7CitzdGF0aWMgaW50IHNuZF9oZHNwX2NyZWF0ZV9wY20oc25kX2NhcmRfdCAqY2FyZCwgaGRzcF90ICpoZHNwKTsKK3N0YXRpYyBpbnQgc25kX2hkc3BfZW5hYmxlX2lvIChoZHNwX3QgKmhkc3ApOworc3RhdGljIHZvaWQgc25kX2hkc3BfaW5pdGlhbGl6ZV9taWRpX2ZsdXNoIChoZHNwX3QgKmhkc3ApOworc3RhdGljIHZvaWQgc25kX2hkc3BfaW5pdGlhbGl6ZV9jaGFubmVscyAoaGRzcF90ICpoZHNwKTsKK3N0YXRpYyBpbnQgaGRzcF9maWZvX3dhaXQoaGRzcF90ICpoZHNwLCBpbnQgY291bnQsIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgaGRzcF9hdXRvc3luY19yZWYoaGRzcF90ICpoZHNwKTsKK3N0YXRpYyBpbnQgc25kX2hkc3Bfc2V0X2RlZmF1bHRzKGhkc3BfdCAqaGRzcCk7CitzdGF0aWMgdm9pZCBzbmRfaGRzcF85NjUyX2VuYWJsZV9taXhlciAoaGRzcF90ICpoZHNwKTsKKworc3RhdGljIGludCBoZHNwX3BsYXliYWNrX3RvX291dHB1dF9rZXkgKGhkc3BfdCAqaGRzcCwgaW50IGluLCBpbnQgb3V0KQoreworCXN3aXRjaCAoaGRzcC0+ZmlybXdhcmVfcmV2KSB7CisJY2FzZSAweGE6CisJCXJldHVybiAoNjQgKiBvdXQpICsgKDMyICsgKGluKSk7CisJY2FzZSAweDk2OgorCWNhc2UgMHg5NzoKKwkJcmV0dXJuICgzMiAqIG91dCkgKyAoMTYgKyAoaW4pKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDUyICogb3V0KSArICgyNiArIChpbikpOworCX0KK30KKworc3RhdGljIGludCBoZHNwX2lucHV0X3RvX291dHB1dF9rZXkgKGhkc3BfdCAqaGRzcCwgaW50IGluLCBpbnQgb3V0KQoreworCXN3aXRjaCAoaGRzcC0+ZmlybXdhcmVfcmV2KSB7CisJY2FzZSAweGE6CisJCXJldHVybiAoNjQgKiBvdXQpICsgaW47CisJY2FzZSAweDk2OgorCWNhc2UgMHg5NzoKKwkJcmV0dXJuICgzMiAqIG91dCkgKyBpbjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDUyICogb3V0KSArIGluOworCX0KK30KKworc3RhdGljIHZvaWQgaGRzcF93cml0ZShoZHNwX3QgKmhkc3AsIGludCByZWcsIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwgaGRzcC0+aW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoZHNwX3JlYWQoaGRzcF90ICpoZHNwLCBpbnQgcmVnKQoreworCXJldHVybiByZWFkbCAoaGRzcC0+aW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGludCBoZHNwX2NoZWNrX2Zvcl9pb2JveCAoaGRzcF90ICpoZHNwKQoreworCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgcmV0dXJuIDA7CisJaWYgKGhkc3BfcmVhZCAoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3RlcikgJiBIRFNQX0NvbmZpZ0Vycm9yKSB7CisJCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogbm8gRGlnaWZhY2Ugb3IgTXVsdGlmYWNlIGNvbm5lY3RlZCFcbiIpOworCQloZHNwLT5zdGF0ZSAmPSB+SERTUF9GaXJtd2FyZUxvYWRlZDsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3BfdCAqaGRzcCkgeworCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoaGRzcF9yZWFkIChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfRGxsRXJyb3IpICE9IDApIHsKKwkJCisJCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogbG9hZGluZyBmaXJtd2FyZVxuIik7CisKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9TX1BST0dSQU0pOworCQloZHNwX3dyaXRlIChoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKKwkJCisJCWlmIChoZHNwX2ZpZm9fd2FpdCAoaGRzcCwgMCwgSERTUF9MT05HX1dBSVQpKSB7CisJCQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHRpbWVvdXQgd2FpdGluZyBmb3IgZG93bmxvYWQgcHJlcGFyYXRpb25cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJCisJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19MT0FEKTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCAyNDQxMzsgKytpKSB7CisJCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfZmlmb0RhdGEsIGhkc3AtPmZpcm13YXJlX2NhY2hlW2ldKTsKKwkJCWlmIChoZHNwX2ZpZm9fd2FpdCAoaGRzcCwgMTI3LCBIRFNQX0xPTkdfV0FJVCkpIHsKKwkJCQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHRpbWVvdXQgZHVyaW5nIGZpcm13YXJlIGxvYWRpbmdcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJaWYgKCgxMDAwIC8gSFopIDwgMzAwMCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgoMzAwMCAqIEhaICsgOTk5KSAvIDEwMDApOworCQl9IGVsc2UgeworCQkJbWRlbGF5KDMwMDApOworCQl9CisJCQorCQlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDAsIEhEU1BfTE9OR19XQUlUKSkgeworCQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiB0aW1lb3V0IGF0IGVuZCBvZiBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJICAgIAlyZXR1cm4gLUVJTzsKKwkJfQorCisjaWZkZWYgU05EUlZfQklHX0VORElBTgorCQloZHNwLT5jb250cm9sMl9yZWdpc3RlciA9IEhEU1BfQklHRU5ESUFOX01PREU7CisjZWxzZQorCQloZHNwLT5jb250cm9sMl9yZWdpc3RlciA9IDA7CisjZW5kaWYKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIpOworCQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IGZpbmlzaGVkIGZpcm13YXJlIGxvYWRpbmdcbiIpOworCQkKKwl9CisJaWYgKGhkc3AtPnN0YXRlICYgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlKSB7CisJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBsb2FkZWQgZnJvbSBjYWNoZSwgcmVzdG9yaW5nIGRlZmF1bHRzXG4iKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhkc3AtPmxvY2ssIGZsYWdzKTsKKwkJc25kX2hkc3Bfc2V0X2RlZmF1bHRzKGhkc3ApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZHNwLT5sb2NrLCBmbGFncyk7IAorCX0KKwkKKwloZHNwLT5zdGF0ZSB8PSBIRFNQX0Zpcm13YXJlTG9hZGVkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9nZXRfaW9ib3hfdmVyc2lvbiAoaGRzcF90ICpoZHNwKQoreworCWlmICgoaGRzcF9yZWFkIChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfRGxsRXJyb3IpICE9IDApIHsKKwkKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9QUk9HUkFNKTsKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9maWZvRGF0YSwgMCk7CisJCWlmIChoZHNwX2ZpZm9fd2FpdCAoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA8IDApIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9TX0xPQUQpOworCQloZHNwX3dyaXRlIChoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKKworCQlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkpIHsKKwkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7CisJCQloZHNwX3dyaXRlIChoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBIRFNQX1ZFUlNJT05fQklUKTsKKwkJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19MT0FEKTsKKwkJCWhkc3BfZmlmb193YWl0IChoZHNwLCAwLCBIRFNQX1NIT1JUX1dBSVQpOworCQl9IGVsc2UgeworCQkJaGRzcC0+aW9fdHlwZSA9IERpZ2lmYWNlOworCQl9IAorCX0gZWxzZSB7CisJCS8qIGZpcm13YXJlIHdhcyBhbHJlYWR5IGxvYWRlZCwgZ2V0IGlvYm94IHR5cGUgKi8KKwkJaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3RlcikgJiBIRFNQX3ZlcnNpb24xKSB7CisJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOworCQl9IGVsc2UgeworCQkJaGRzcC0+aW9fdHlwZSA9IERpZ2lmYWNlOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGRzcF9jaGVja19mb3JfZmlybXdhcmUgKGhkc3BfdCAqaGRzcCkKK3sKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTY1MiB8fCBoZHNwLT5pb190eXBlID09IEg5NjMyKSByZXR1cm4gMDsKKwlpZiAoKGhkc3BfcmVhZCAoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3RlcikgJiBIRFNQX0RsbEVycm9yKSAhPSAwKSB7CisJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBub3QgcHJlc2VudC5cbiIpOworCQloZHNwLT5zdGF0ZSAmPSB+SERTUF9GaXJtd2FyZUxvYWRlZDsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGRzcF9maWZvX3dhaXQoaGRzcF90ICpoZHNwLCBpbnQgY291bnQsIGludCB0aW1lb3V0KQoreyAgICAKKwlpbnQgaTsKKworCS8qIHRoZSBmaWZvU3RhdHVzIHJlZ2lzdGVycyByZXBvcnRzIG9uIGhvdyBtYW55IHdvcmRzCisJICAgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY29tbWFuZCBGSUZPLgorCSovCisJCisJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCisJCWlmICgoaW50KShoZHNwX3JlYWQgKGhkc3AsIEhEU1BfZmlmb1N0YXR1cykgJiAweGZmKSA8PSBjb3VudCkKKwkJCXJldHVybiAwOworCisJCS8qIG5vdCB2ZXJ5IGZyaWVuZGx5LCBidXQgd2Ugb25seSBkbyB0aGlzIGR1cmluZyBhIGZpcm13YXJlCisJCSAgIGxvYWQgYW5kIGNoYW5naW5nIHRoZSBtaXhlciwgc28gd2UganVzdCBwdXQgdXAgd2l0aCBpdC4KKwkJKi8KKworCQl1ZGVsYXkgKDEwMCk7CisJfQorCisJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiB3YWl0IGZvciBGSUZPIHN0YXR1cyA8PSAlZCBmYWlsZWQgYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwKKwkJICAgIGNvdW50LCB0aW1lb3V0KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9yZWFkX2dhaW4gKGhkc3BfdCAqaGRzcCwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJaWYgKGFkZHIgPj0gSERTUF9NQVRSSVhfTUlYRVJfU0laRSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGhkc3AtPm1peGVyX21hdHJpeFthZGRyXTsKK30KKworc3RhdGljIGludCBoZHNwX3dyaXRlX2dhaW4oaGRzcF90ICpoZHNwLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgc2hvcnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgYWQ7CisKKwlpZiAoYWRkciA+PSBIRFNQX01BVFJJWF9NSVhFUl9TSVpFKQorCQlyZXR1cm4gLTE7CisJCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgeworCisJCS8qIGZyb20gbWFydGluIGJqb3Juc2VuOgorCQkgICAKKwkJICAgIllvdSBjYW4gb25seSB3cml0ZSBkd29yZHMgdG8gdGhlCisJCSAgIG1peGVyIG1lbW9yeSB3aGljaCBjb250YWluIHR3bworCQkgICBtaXhlciB2YWx1ZXMgaW4gdGhlIGxvdyBhbmQgaGlnaAorCQkgICB3b3JkLiBTbyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKKwkJICAgdmFsdWUgMCB5b3UgaGF2ZSB0byByZWFkIHZhbHVlIDEKKwkJICAgZnJvbSB0aGUgY2FjaGUgYW5kIHdyaXRlIGJvdGggdG8KKwkJICAgdGhlIGZpcnN0IGR3b3JkIGluIHRoZSBtaXhlcgorCQkgICBtZW1vcnkuIgorCQkqLworCisJCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIGFkZHIgPj0gNTEyKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChoZHNwLT5pb190eXBlID09IEg5NjUyICYmIGFkZHIgPj0gMTM1MikgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQloZHNwLT5taXhlcl9tYXRyaXhbYWRkcl0gPSBkYXRhOworCisJCQorCQkvKiBgYWRkcicgYWRkcmVzc2VzIGEgMTYtYml0IHdpZGUgYWRkcmVzcywgYnV0CisJCSAgIHRoZSBhZGRyZXNzIHNwYWNlIGFjY2Vzc2VkIHZpYSBoZHNwX3dyaXRlCisJCSAgIHVzZXMgYnl0ZSBvZmZzZXRzLiBwdXQgYW5vdGhlciB3YXksIGFkZHIKKwkJICAgdmFyaWVzIGZyb20gMCB0byAxMzUxLCBidXQgdG8gYWNjZXNzIHRoZQorCQkgICBjb3JyZXNwb25kaW5nIG1lbW9yeSBsb2NhdGlvbiwgd2UgbmVlZAorCQkgICB0byBhY2Nlc3MgMCB0byAyNzAzIC4uLgorCQkqLworCQlhZCA9IGFkZHIvMjsKKwkKKwkJaGRzcF93cml0ZSAoaGRzcCwgNDA5NiArIChhZCo0KSwgCisJCQkgICAgKGhkc3AtPm1peGVyX21hdHJpeFsoYWRkciYweDdmZSkrMV0gPDwgMTYpICsgCisJCQkgICAgaGRzcC0+bWl4ZXJfbWF0cml4W2FkZHImMHg3ZmVdKTsKKwkJCisJCXJldHVybiAwOworCisJfSBlbHNlIHsKKworCQlhZCA9IChhZGRyIDw8IDE2KSArIGRhdGE7CisJCQorCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMTI3LCBIRFNQX0xPTkdfV0FJVCkpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfZmlmb0RhdGEsIGFkKTsKKwkJaGRzcC0+bWl4ZXJfbWF0cml4W2FkZHJdID0gZGF0YTsKKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcF90ICpoZHNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGRzcC0+bG9jaywgZmxhZ3MpOworCWlmICgoaGRzcC0+cGxheWJhY2tfcGlkICE9IGhkc3AtPmNhcHR1cmVfcGlkKSAmJgorCSAgICAoaGRzcC0+cGxheWJhY2tfcGlkID49IDApICYmIChoZHNwLT5jYXB0dXJlX3BpZCA+PSAwKSkgeworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZHNwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZHNwX2V4dGVybmFsX3NhbXBsZV9yYXRlIChoZHNwX3QgKmhkc3ApCit7CisJdW5zaWduZWQgaW50IHN0YXR1czIgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpOworCXVuc2lnbmVkIGludCByYXRlX2JpdHMgPSBzdGF0dXMyICYgSERTUF9zeXN0ZW1GcmVxdWVuY3lNYXNrOworCisJc3dpdGNoIChyYXRlX2JpdHMpIHsKKwljYXNlIEhEU1Bfc3lzdGVtRnJlcXVlbmN5MzI6ICAgcmV0dXJuIDMyMDAwOworCWNhc2UgSERTUF9zeXN0ZW1GcmVxdWVuY3k0NF8xOiByZXR1cm4gNDQxMDA7CisJY2FzZSBIRFNQX3N5c3RlbUZyZXF1ZW5jeTQ4OiAgIHJldHVybiA0ODAwMDsKKwljYXNlIEhEU1Bfc3lzdGVtRnJlcXVlbmN5NjQ6ICAgcmV0dXJuIDY0MDAwOworCWNhc2UgSERTUF9zeXN0ZW1GcmVxdWVuY3k4OF8yOiByZXR1cm4gODgyMDA7CisJY2FzZSBIRFNQX3N5c3RlbUZyZXF1ZW5jeTk2OiAgIHJldHVybiA5NjAwMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwX3QgKmhkc3ApCit7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZV9iaXRzID0gKHN0YXR1cyAmIEhEU1Bfc3BkaWZGcmVxdWVuY3lNYXNrKTsKKworCWlmIChzdGF0dXMgJiBIRFNQX1NQRElGRXJyb3JGbGFnKSB7CisJCXJldHVybiAwOworCX0KKwkKKwlzd2l0Y2ggKHJhdGVfYml0cykgeworCWNhc2UgSERTUF9zcGRpZkZyZXF1ZW5jeTMyS0h6OiByZXR1cm4gMzIwMDA7CisJY2FzZSBIRFNQX3NwZGlmRnJlcXVlbmN5NDRfMUtIejogcmV0dXJuIDQ0MTAwOworCWNhc2UgSERTUF9zcGRpZkZyZXF1ZW5jeTQ4S0h6OiByZXR1cm4gNDgwMDA7CisJY2FzZSBIRFNQX3NwZGlmRnJlcXVlbmN5NjRLSHo6IHJldHVybiA2NDAwMDsKKwljYXNlIEhEU1Bfc3BkaWZGcmVxdWVuY3k4OF8yS0h6OiByZXR1cm4gODgyMDA7CisJY2FzZSBIRFNQX3NwZGlmRnJlcXVlbmN5OTZLSHo6IHJldHVybiA5NjAwMDsKKwljYXNlIEhEU1Bfc3BkaWZGcmVxdWVuY3kxMjhLSHo6IAorCQlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgcmV0dXJuIDEyODAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX3NwZGlmRnJlcXVlbmN5MTc2XzRLSHo6IAorCQlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgcmV0dXJuIDE3NjQwMDsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX3NwZGlmRnJlcXVlbmN5MTkyS0h6OiAKKwkJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHJldHVybiAxOTIwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHVua25vd24gc3BkaWYgZnJlcXVlbmN5IHN0YXR1czsgYml0cyA9IDB4JXgsIHN0YXR1cyA9IDB4JXhcbiIsIHJhdGVfYml0cywgc3RhdHVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRzcF9jb21wdXRlX3BlcmlvZF9zaXplKGhkc3BfdCAqaGRzcCkKK3sKKwloZHNwLT5wZXJpb2RfYnl0ZXMgPSAxIDw8ICgoaGRzcF9kZWNvZGVfbGF0ZW5jeShoZHNwLT5jb250cm9sX3JlZ2lzdGVyKSArIDgpKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGhkc3BfaHdfcG9pbnRlcihoZHNwX3QgKmhkc3ApCit7CisJaW50IHBvc2l0aW9uOworCisJcG9zaXRpb24gPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3Rlcik7CisKKwlpZiAoIWhkc3AtPnByZWNpc2VfcHRyKSB7CisJCXJldHVybiAocG9zaXRpb24gJiBIRFNQX0J1ZmZlcklEKSA/IChoZHNwLT5wZXJpb2RfYnl0ZXMgLyA0KSA6IDA7CisJfQorCisJcG9zaXRpb24gJj0gSERTUF9CdWZmZXJQb3NpdGlvbk1hc2s7CisJcG9zaXRpb24gLz0gNDsKKwlwb3NpdGlvbiAmPSAoaGRzcC0+cGVyaW9kX2J5dGVzLzIpIC0gMTsKKwlyZXR1cm4gcG9zaXRpb247Cit9CisKK3N0YXRpYyB2b2lkIGhkc3BfcmVzZXRfaHdfcG9pbnRlcihoZHNwX3QgKmhkc3ApCit7CisJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9yZXNldFBvaW50ZXIsIDApOworfQorCitzdGF0aWMgdm9pZCBoZHNwX3N0YXJ0X2F1ZGlvKGhkc3BfdCAqcykKK3sKKwlzLT5jb250cm9sX3JlZ2lzdGVyIHw9IChIRFNQX0F1ZGlvSW50ZXJydXB0RW5hYmxlIHwgSERTUF9TdGFydCk7CisJaGRzcF93cml0ZShzLCBIRFNQX2NvbnRyb2xSZWdpc3Rlciwgcy0+Y29udHJvbF9yZWdpc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIGhkc3Bfc3RvcF9hdWRpbyhoZHNwX3QgKnMpCit7CisJcy0+Y29udHJvbF9yZWdpc3RlciAmPSB+KEhEU1BfU3RhcnQgfCBIRFNQX0F1ZGlvSW50ZXJydXB0RW5hYmxlKTsKKwloZHNwX3dyaXRlKHMsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBzLT5jb250cm9sX3JlZ2lzdGVyKTsKK30KKworc3RhdGljIHZvaWQgaGRzcF9zaWxlbmNlX3BsYXliYWNrKGhkc3BfdCAqaGRzcCkKK3sKKwltZW1zZXQoaGRzcC0+cGxheWJhY2tfYnVmZmVyLCAwLCBIRFNQX0RNQV9BUkVBX0JZVEVTKTsKK30KKworc3RhdGljIGludCBoZHNwX3NldF9pbnRlcnJ1cHRfaW50ZXJ2YWwoaGRzcF90ICpzLCB1bnNpZ25lZCBpbnQgZnJhbWVzKQoreworCWludCBuOworCisJc3Bpbl9sb2NrX2lycSgmcy0+bG9jayk7CisKKwlmcmFtZXMgPj49IDc7CisJbiA9IDA7CisJd2hpbGUgKGZyYW1lcykgeworCQluKys7CisJCWZyYW1lcyA+Pj0gMTsKKwl9CisKKwlzLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX0xhdGVuY3lNYXNrOworCXMtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gaGRzcF9lbmNvZGVfbGF0ZW5jeShuKTsKKworCWhkc3Bfd3JpdGUocywgSERTUF9jb250cm9sUmVnaXN0ZXIsIHMtPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJaGRzcF9jb21wdXRlX3BlcmlvZF9zaXplKHMpOworCisJc3Bpbl91bmxvY2tfaXJxKCZzLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X3JhdGUoaGRzcF90ICpoZHNwLCBpbnQgcmF0ZSwgaW50IGNhbGxlZF9pbnRlcm5hbGx5KQoreworCWludCByZWplY3RfaWZfb3BlbiA9IDA7CisJaW50IGN1cnJlbnRfcmF0ZTsKKwlpbnQgcmF0ZV9iaXRzOworCisJLyogQVNTVU1QVElPTjogaGRzcC0+bG9jayBpcyBlaXRoZXIgaGVsZCwgb3IKKwkgICB0aGVyZSBpcyBubyBuZWVkIGZvciBpdCAoZS5nLiBkdXJpbmcgbW9kdWxlCisJICAgaW5pdGlhbGl6YXRpb24pLgorCSovCisJCisJaWYgKCEoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfQ2xvY2tNb2RlTWFzdGVyKSkgewkKKwkJaWYgKGNhbGxlZF9pbnRlcm5hbGx5KSB7CisJCQkvKiByZXF1ZXN0IGZyb20gY3RsIG9yIGNhcmQgaW5pdGlhbGl6YXRpb24gKi8KKwkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBkZXZpY2UgaXMgbm90IHJ1bm5pbmcgYXMgYSBjbG9jayBtYXN0ZXI6IGNhbm5vdCBzZXQgc2FtcGxlIHJhdGUuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsJCQorCQkJLyogaHdfcGFyYW0gcmVxdWVzdCB3aGlsZSBpbiBBdXRvU3luYyBtb2RlICovCisJCQlpbnQgZXh0ZXJuYWxfZnJlcSA9IGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCk7CisJCQlpbnQgc3BkaWZfZnJlcSA9IGhkc3Bfc3BkaWZfc2FtcGxlX3JhdGUoaGRzcCk7CisJCQorCQkJaWYgKChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqMikgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRGV0ZWN0ZWQgQURBVCBpbiBkb3VibGUgc3BlZWQgbW9kZVxuIik7CisJCQl9IGVsc2UgaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIgJiYgKHNwZGlmX2ZyZXEgPT0gZXh0ZXJuYWxfZnJlcSo0KSAmJiAoaGRzcF9hdXRvc3luY19yZWYoaGRzcCkgPj0gSERTUF9BVVRPU1lOQ19GUk9NX0FEQVQxKSkgeworCQkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIHF1YWQgc3BlZWQgbW9kZVxuIik7CQkJCisJCQl9IGVsc2UgaWYgKHJhdGUgIT0gZXh0ZXJuYWxfZnJlcSkgeworCQkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBObyBBdXRvU3luYyBzb3VyY2UgZm9yIHJlcXVlc3RlZCByYXRlXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CQkKKwkJfQkKKwl9CisKKwljdXJyZW50X3JhdGUgPSBoZHNwLT5zeXN0ZW1fc2FtcGxlX3JhdGU7CisKKwkvKiBDaGFuZ2luZyBmcm9tIGEgInNpbmdsZSBzcGVlZCIgdG8gYSAiZG91YmxlIHNwZWVkIiByYXRlIGlzCisJICAgbm90IGFsbG93ZWQgaWYgYW55IHN1YnN0cmVhbXMgYXJlIG9wZW4uIFRoaXMgaXMgYmVjYXVzZQorCSAgIHN1Y2ggYSBjaGFuZ2UgY2F1c2VzIGEgc2hpZnQgaW4gdGhlIGxvY2F0aW9uIG9mIAorCSAgIHRoZSBETUEgYnVmZmVycyBhbmQgYSByZWR1Y3Rpb24gaW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUKKwkgICBidWZmZXJzLiAKKworCSAgIE5vdGUgdGhhdCBhIHNpbWlsYXIgYnV0IGVzc2VudGlhbGx5IGluc29sdWJsZSBwcm9ibGVtCisJICAgZXhpc3RzIGZvciBleHRlcm5hbGx5LWRyaXZlbiByYXRlIGNoYW5nZXMuIEFsbCB3ZSBjYW4gZG8KKwkgICBpcyB0byBmbGFnIHJhdGUgY2hhbmdlcyBpbiB0aGUgcmVhZC93cml0ZSByb3V0aW5lcy4gICovCisKKwlpZiAocmF0ZSA+IDk2MDAwICYmIGhkc3AtPmlvX3R5cGUgIT0gSDk2MzIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMzIwMDA6CisJCWlmIChjdXJyZW50X3JhdGUgPiA0ODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGVfYml0cyA9IEhEU1BfRnJlcXVlbmN5MzJLSHo7CisJCWJyZWFrOworCWNhc2UgNDQxMDA6CisJCWlmIChjdXJyZW50X3JhdGUgPiA0ODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGVfYml0cyA9IEhEU1BfRnJlcXVlbmN5NDRfMUtIejsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJaWYgKGN1cnJlbnRfcmF0ZSA+IDQ4MDAwKSB7CisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCX0KKwkJcmF0ZV9iaXRzID0gSERTUF9GcmVxdWVuY3k0OEtIejsKKwkJYnJlYWs7CisJY2FzZSA2NDAwMDoKKwkJaWYgKGN1cnJlbnRfcmF0ZSA8PSA0ODAwMCB8fCBjdXJyZW50X3JhdGUgPiA5NjAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGVfYml0cyA9IEhEU1BfRnJlcXVlbmN5NjRLSHo7CisJCWJyZWFrOworCWNhc2UgODgyMDA6CisJCWlmIChjdXJyZW50X3JhdGUgPD0gNDgwMDAgfHwgY3VycmVudF9yYXRlID4gOTYwMDApIHsKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJfQorCQlyYXRlX2JpdHMgPSBIRFNQX0ZyZXF1ZW5jeTg4XzJLSHo7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCWlmIChjdXJyZW50X3JhdGUgPD0gNDgwMDAgfHwgY3VycmVudF9yYXRlID4gOTYwMDApIHsKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJfQorCQlyYXRlX2JpdHMgPSBIRFNQX0ZyZXF1ZW5jeTk2S0h6OworCQlicmVhazsKKwljYXNlIDEyODAwMDoKKwkJaWYgKGN1cnJlbnRfcmF0ZSA8IDEyODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGVfYml0cyA9IEhEU1BfRnJlcXVlbmN5MTI4S0h6OworCQlicmVhazsKKwljYXNlIDE3NjQwMDoKKwkJaWYgKGN1cnJlbnRfcmF0ZSA8IDEyODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGVfYml0cyA9IEhEU1BfRnJlcXVlbmN5MTc2XzRLSHo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAwOgorCQlpZiAoY3VycmVudF9yYXRlIDwgMTI4MDAwKSB7CisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCX0KKwkJcmF0ZV9iaXRzID0gSERTUF9GcmVxdWVuY3kxOTJLSHo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZWplY3RfaWZfb3BlbiAmJiAoaGRzcC0+Y2FwdHVyZV9waWQgPj0gMCB8fCBoZHNwLT5wbGF5YmFja19waWQgPj0gMCkpIHsKKwkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiBjYW5ub3QgY2hhbmdlIHNwZWVkIG1vZGUgKGNhcHR1cmUgUElEID0gJWQsIHBsYXliYWNrIFBJRCA9ICVkKVxuIiwKKwkJCSAgICBoZHNwLT5jYXB0dXJlX3BpZCwKKwkJCSAgICBoZHNwLT5wbGF5YmFja19waWQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfRnJlcXVlbmN5TWFzazsKKwloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IHJhdGVfYml0czsKKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCWlmIChyYXRlID49IDEyODAwMCkgeworCQloZHNwLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwX0g5NjMyX3FzOworCX0gZWxzZSBpZiAocmF0ZSA+IDQ4MDAwKSB7CisJCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyKSB7CisJCQloZHNwLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwX0g5NjMyX2RzOworCQl9IGVsc2UgeworCQkJaGRzcC0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9kczsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoaGRzcC0+aW9fdHlwZSkgeworCQljYXNlIE11bHRpZmFjZToKKwkJCWhkc3AtPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfbWZfc3M7CisJCQlicmVhazsKKwkJY2FzZSBEaWdpZmFjZToKKwkJY2FzZSBIOTY1MjoKKwkJCWhkc3AtPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfZGZfc3M7CisJCQlicmVhazsKKwkJY2FzZSBIOTYzMjoKKwkJCWhkc3AtPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfSDk2MzJfc3M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCQorCWhkc3AtPnN5c3RlbV9zYW1wbGVfcmF0ZSA9IHJhdGU7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBNSURJCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbmRfaGRzcF9taWRpX3JlYWRfYnl0ZSAoaGRzcF90ICpoZHNwLCBpbnQgaWQpCit7CisJLyogdGhlIGhhcmR3YXJlIGFscmVhZHkgZG9lcyB0aGUgcmVsZXZhbnQgYml0LW1hc2sgd2l0aCAweGZmICovCisJaWYgKGlkKSB7CisJCXJldHVybiBoZHNwX3JlYWQoaGRzcCwgSERTUF9taWRpRGF0YUluMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGhkc3BfcmVhZChoZHNwLCBIRFNQX21pZGlEYXRhSW4wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9oZHNwX21pZGlfd3JpdGVfYnl0ZSAoaGRzcF90ICpoZHNwLCBpbnQgaWQsIGludCB2YWwpCit7CisJLyogdGhlIGhhcmR3YXJlIGFscmVhZHkgZG9lcyB0aGUgcmVsZXZhbnQgYml0LW1hc2sgd2l0aCAweGZmICovCisJaWYgKGlkKSB7CisJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9taWRpRGF0YU91dDEsIHZhbCk7CisJfSBlbHNlIHsKKwkJaGRzcF93cml0ZShoZHNwLCBIRFNQX21pZGlEYXRhT3V0MCwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfbWlkaV9pbnB1dF9hdmFpbGFibGUgKGhkc3BfdCAqaGRzcCwgaW50IGlkKQoreworCWlmIChpZCkgeworCQlyZXR1cm4gKGhkc3BfcmVhZChoZHNwLCBIRFNQX21pZGlTdGF0dXNJbjEpICYgMHhmZik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChoZHNwX3JlYWQoaGRzcCwgSERTUF9taWRpU3RhdHVzSW4wKSAmIDB4ZmYpOworCX0KK30KKworc3RhdGljIGludCBzbmRfaGRzcF9taWRpX291dHB1dF9wb3NzaWJsZSAoaGRzcF90ICpoZHNwLCBpbnQgaWQpCit7CisJaW50IGZpZm9fYnl0ZXNfdXNlZDsKKworCWlmIChpZCkgeworCQlmaWZvX2J5dGVzX3VzZWQgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9taWRpU3RhdHVzT3V0MSkgJiAweGZmOworCX0gZWxzZSB7CisJCWZpZm9fYnl0ZXNfdXNlZCA9IGhkc3BfcmVhZChoZHNwLCBIRFNQX21pZGlTdGF0dXNPdXQwKSAmIDB4ZmY7CisJfQorCisJaWYgKGZpZm9fYnl0ZXNfdXNlZCA8IDEyOCkgeworCQlyZXR1cm4gIDEyOCAtIGZpZm9fYnl0ZXNfdXNlZDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9oZHNwX2ZsdXNoX21pZGlfaW5wdXQgKGhkc3BfdCAqaGRzcCwgaW50IGlkKQoreworCXdoaWxlIChzbmRfaGRzcF9taWRpX2lucHV0X2F2YWlsYWJsZSAoaGRzcCwgaWQpKSB7CisJCXNuZF9oZHNwX21pZGlfcmVhZF9ieXRlIChoZHNwLCBpZCk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX21pZGlfb3V0cHV0X3dyaXRlIChoZHNwX21pZGlfdCAqaG1pZGkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbl9wZW5kaW5nOworCWludCB0b193cml0ZTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMjhdOworCisJLyogT3V0cHV0IGlzIG5vdCBpbnRlcnJ1cHQgZHJpdmVuICovCisJCQorCXNwaW5fbG9ja19pcnFzYXZlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKKwlpZiAoaG1pZGktPm91dHB1dCkgeworCQlpZiAoIXNuZF9yYXdtaWRpX3RyYW5zbWl0X2VtcHR5IChobWlkaS0+b3V0cHV0KSkgeworCQkJaWYgKChuX3BlbmRpbmcgPSBzbmRfaGRzcF9taWRpX291dHB1dF9wb3NzaWJsZSAoaG1pZGktPmhkc3AsIGhtaWRpLT5pZCkpID4gMCkgeworCQkJCWlmIChuX3BlbmRpbmcgPiAoaW50KXNpemVvZiAoYnVmKSkKKwkJCQkJbl9wZW5kaW5nID0gc2l6ZW9mIChidWYpOworCQkJCQorCQkJCWlmICgodG9fd3JpdGUgPSBzbmRfcmF3bWlkaV90cmFuc21pdCAoaG1pZGktPm91dHB1dCwgYnVmLCBuX3BlbmRpbmcpKSA+IDApIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHRvX3dyaXRlOyArK2kpIAorCQkJCQkJc25kX2hkc3BfbWlkaV93cml0ZV9ieXRlIChobWlkaS0+aGRzcCwgaG1pZGktPmlkLCBidWZbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9taWRpX2lucHV0X3JlYWQgKGhkc3BfbWlkaV90ICpobWlkaSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMjhdOyAvKiB0aGlzIGJ1ZmZlciBpcyBkZXNpZ25lZCB0byBtYXRjaCB0aGUgTUlESSBpbnB1dCBGSUZPIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuX3BlbmRpbmc7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmhtaWRpLT5sb2NrLCBmbGFncyk7CisJaWYgKChuX3BlbmRpbmcgPSBzbmRfaGRzcF9taWRpX2lucHV0X2F2YWlsYWJsZSAoaG1pZGktPmhkc3AsIGhtaWRpLT5pZCkpID4gMCkgeworCQlpZiAoaG1pZGktPmlucHV0KSB7CisJCQlpZiAobl9wZW5kaW5nID4gKGludClzaXplb2YgKGJ1ZikpIHsKKwkJCQluX3BlbmRpbmcgPSBzaXplb2YgKGJ1Zik7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgbl9wZW5kaW5nOyArK2kpIHsKKwkJCQlidWZbaV0gPSBzbmRfaGRzcF9taWRpX3JlYWRfYnl0ZSAoaG1pZGktPmhkc3AsIGhtaWRpLT5pZCk7CisJCQl9CisJCQlpZiAobl9wZW5kaW5nKSB7CisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZSAoaG1pZGktPmlucHV0LCBidWYsIG5fcGVuZGluZyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBmbHVzaCB0aGUgTUlESSBpbnB1dCBGSUZPICovCisJCQl3aGlsZSAoLS1uX3BlbmRpbmcpIHsKKwkJCQlzbmRfaGRzcF9taWRpX3JlYWRfYnl0ZSAoaG1pZGktPmhkc3AsIGhtaWRpLT5pZCk7CisJCQl9CisJCX0KKwl9CisJaG1pZGktPnBlbmRpbmcgPSAwOworCWlmIChobWlkaS0+aWQpIHsKKwkJaG1pZGktPmhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9NaWRpMUludGVycnVwdEVuYWJsZTsKKwl9IGVsc2UgeworCQlobWlkaS0+aGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX01pZGkwSW50ZXJydXB0RW5hYmxlOworCX0KKwloZHNwX3dyaXRlKGhtaWRpLT5oZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaG1pZGktPmhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZobWlkaS0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzbmRfaGRzcF9taWRpX291dHB1dF93cml0ZSAoaG1pZGkpOworfQorCitzdGF0aWMgdm9pZCBzbmRfaGRzcF9taWRpX2lucHV0X3RyaWdnZXIoc25kX3Jhd21pZGlfc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sIGludCB1cCkKK3sKKwloZHNwX3QgKmhkc3A7CisJaGRzcF9taWRpX3QgKmhtaWRpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGllOworCisJaG1pZGkgPSAoaGRzcF9taWRpX3QgKikgc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCWhkc3AgPSBobWlkaS0+aGRzcDsKKwlpZSA9IGhtaWRpLT5pZCA/IEhEU1BfTWlkaTFJbnRlcnJ1cHRFbmFibGUgOiBIRFNQX01pZGkwSW50ZXJydXB0RW5hYmxlOworCXNwaW5fbG9ja19pcnFzYXZlICgmaGRzcC0+bG9jaywgZmxhZ3MpOworCWlmICh1cCkgeworCQlpZiAoIShoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgaWUpKSB7CisJCQlzbmRfaGRzcF9mbHVzaF9taWRpX2lucHV0IChoZHNwLCBobWlkaS0+aWQpOworCQkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBpZTsKKwkJfQorCX0gZWxzZSB7CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfmllOworCQl0YXNrbGV0X2tpbGwoJmhkc3AtPm1pZGlfdGFza2xldCk7CisJfQorCisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmhkc3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2hkc3BfbWlkaV9vdXRwdXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWhkc3BfbWlkaV90ICpobWlkaSA9IChoZHNwX21pZGlfdCAqKSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc25kX2hkc3BfbWlkaV9vdXRwdXRfd3JpdGUoaG1pZGkpOworCXNwaW5fbG9ja19pcnFzYXZlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKKworCS8qIHRoaXMgZG9lcyBub3QgYnVtcCBobWlkaS0+aXN0aW1lciwgYmVjYXVzZSB0aGUKKwkgICBrZXJuZWwgYXV0b21hdGljYWxseSByZW1vdmVkIHRoZSB0aW1lciB3aGVuIGl0CisJICAgZXhwaXJlZCwgYW5kIHdlIGFyZSBub3cgYWRkaW5nIGl0IGJhY2ssIHRodXMKKwkgICBsZWF2aW5nIGlzdGltZXIgd2hlcmV2ZXIgaXQgd2FzIHNldCBiZWZvcmUuICAKKwkqLworCisJaWYgKGhtaWRpLT5pc3RpbWVyKSB7CisJCWhtaWRpLT50aW1lci5leHBpcmVzID0gMSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmaG1pZGktPnRpbWVyKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX2hkc3BfbWlkaV9vdXRwdXRfdHJpZ2dlcihzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IHVwKQoreworCWhkc3BfbWlkaV90ICpobWlkaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaG1pZGkgPSAoaGRzcF9taWRpX3QgKikgc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXNwaW5fbG9ja19pcnFzYXZlICgmaG1pZGktPmxvY2ssIGZsYWdzKTsKKwlpZiAodXApIHsKKwkJaWYgKCFobWlkaS0+aXN0aW1lcikgeworCQkJaW5pdF90aW1lcigmaG1pZGktPnRpbWVyKTsKKwkJCWhtaWRpLT50aW1lci5mdW5jdGlvbiA9IHNuZF9oZHNwX21pZGlfb3V0cHV0X3RpbWVyOworCQkJaG1pZGktPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaG1pZGk7CisJCQlobWlkaS0+dGltZXIuZXhwaXJlcyA9IDEgKyBqaWZmaWVzOworCQkJYWRkX3RpbWVyKCZobWlkaS0+dGltZXIpOworCQkJaG1pZGktPmlzdGltZXIrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChobWlkaS0+aXN0aW1lciAmJiAtLWhtaWRpLT5pc3RpbWVyIDw9IDApIHsKKwkJCWRlbF90aW1lciAoJmhtaWRpLT50aW1lcik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmhtaWRpLT5sb2NrLCBmbGFncyk7CisJaWYgKHVwKQorCQlzbmRfaGRzcF9taWRpX291dHB1dF93cml0ZShobWlkaSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfbWlkaV9pbnB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWhkc3BfbWlkaV90ICpobWlkaTsKKworCWhtaWRpID0gKGhkc3BfbWlkaV90ICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzcGluX2xvY2tfaXJxICgmaG1pZGktPmxvY2spOworCXNuZF9oZHNwX2ZsdXNoX21pZGlfaW5wdXQgKGhtaWRpLT5oZHNwLCBobWlkaS0+aWQpOworCWhtaWRpLT5pbnB1dCA9IHN1YnN0cmVhbTsKKwlzcGluX3VubG9ja19pcnEgKCZobWlkaS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9taWRpX291dHB1dF9vcGVuKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWhkc3BfbWlkaV90ICpobWlkaTsKKworCWhtaWRpID0gKGhkc3BfbWlkaV90ICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzcGluX2xvY2tfaXJxICgmaG1pZGktPmxvY2spOworCWhtaWRpLT5vdXRwdXQgPSBzdWJzdHJlYW07CisJc3Bpbl91bmxvY2tfaXJxICgmaG1pZGktPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfbWlkaV9pbnB1dF9jbG9zZShzbmRfcmF3bWlkaV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwloZHNwX21pZGlfdCAqaG1pZGk7CisKKwlzbmRfaGRzcF9taWRpX2lucHV0X3RyaWdnZXIgKHN1YnN0cmVhbSwgMCk7CisKKwlobWlkaSA9IChoZHNwX21pZGlfdCAqKSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3Bpbl9sb2NrX2lycSAoJmhtaWRpLT5sb2NrKTsKKwlobWlkaS0+aW5wdXQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSAoJmhtaWRpLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX21pZGlfb3V0cHV0X2Nsb3NlKHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCWhkc3BfbWlkaV90ICpobWlkaTsKKworCXNuZF9oZHNwX21pZGlfb3V0cHV0X3RyaWdnZXIgKHN1YnN0cmVhbSwgMCk7CisKKwlobWlkaSA9IChoZHNwX21pZGlfdCAqKSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3Bpbl9sb2NrX2lycSAoJmhtaWRpLT5sb2NrKTsKKwlobWlkaS0+b3V0cHV0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEgKCZobWlkaS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9oZHNwX21pZGlfb3V0cHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfaGRzcF9taWRpX291dHB1dF9vcGVuLAorCS5jbG9zZSA9CXNuZF9oZHNwX21pZGlfb3V0cHV0X2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX2hkc3BfbWlkaV9vdXRwdXRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBzbmRfcmF3bWlkaV9vcHNfdCBzbmRfaGRzcF9taWRpX2lucHV0ID0KK3sKKwkub3BlbiA9CQlzbmRfaGRzcF9taWRpX2lucHV0X29wZW4sCisJLmNsb3NlID0Jc25kX2hkc3BfbWlkaV9pbnB1dF9jbG9zZSwKKwkudHJpZ2dlciA9CXNuZF9oZHNwX21pZGlfaW5wdXRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9oZHNwX2NyZWF0ZV9taWRpIChzbmRfY2FyZF90ICpjYXJkLCBoZHNwX3QgKmhkc3AsIGludCBpZCkKK3sKKwljaGFyIGJ1ZlszMl07CisKKwloZHNwLT5taWRpW2lkXS5pZCA9IGlkOworCWhkc3AtPm1pZGlbaWRdLnJtaWRpID0gTlVMTDsKKwloZHNwLT5taWRpW2lkXS5pbnB1dCA9IE5VTEw7CisJaGRzcC0+bWlkaVtpZF0ub3V0cHV0ID0gTlVMTDsKKwloZHNwLT5taWRpW2lkXS5oZHNwID0gaGRzcDsKKwloZHNwLT5taWRpW2lkXS5pc3RpbWVyID0gMDsKKwloZHNwLT5taWRpW2lkXS5wZW5kaW5nID0gMDsKKwlzcGluX2xvY2tfaW5pdCAoJmhkc3AtPm1pZGlbaWRdLmxvY2spOworCisJc3ByaW50ZiAoYnVmLCAiJXMgTUlESSAlZCIsIGNhcmQtPnNob3J0bmFtZSwgaWQrMSk7CisJaWYgKHNuZF9yYXdtaWRpX25ldyAoY2FyZCwgYnVmLCBpZCwgMSwgMSwgJmhkc3AtPm1pZGlbaWRdLnJtaWRpKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwcmludGYgKGhkc3AtPm1pZGlbaWRdLnJtaWRpLT5uYW1lLCAiJXMgTUlESSAlZCIsIGNhcmQtPmlkLCBpZCsxKTsKKwloZHNwLT5taWRpW2lkXS5ybWlkaS0+cHJpdmF0ZV9kYXRhID0gJmhkc3AtPm1pZGlbaWRdOworCisJc25kX3Jhd21pZGlfc2V0X29wcyAoaGRzcC0+bWlkaVtpZF0ucm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVCwgJnNuZF9oZHNwX21pZGlfb3V0cHV0KTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzIChoZHNwLT5taWRpW2lkXS5ybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZzbmRfaGRzcF9taWRpX2lucHV0KTsKKworCWhkc3AtPm1pZGlbaWRdLnJtaWRpLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfAorCQlTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAorCQlTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ29udHJvbCBJbnRlcmZhY2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgc25kX2hkc3BfY29udmVydF9mcm9tX2FlcyhzbmRfYWVzX2llYzk1OF90ICphZXMpCit7CisJdTMyIHZhbCA9IDA7CisJdmFsIHw9IChhZXMtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCkgPyBIRFNQX1NQRElGUHJvZmVzc2lvbmFsIDogMDsKKwl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pID8gSERTUF9TUERJRk5vbkF1ZGlvIDogMDsKKwlpZiAodmFsICYgSERTUF9TUERJRlByb2Zlc3Npb25hbCkKKwkJdmFsIHw9IChhZXMtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1KSA/IEhEU1BfU1BESUZFbXBoYXNpcyA6IDA7CisJZWxzZQorCQl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpID8gSERTUF9TUERJRkVtcGhhc2lzIDogMDsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzbmRfaGRzcF9jb252ZXJ0X3RvX2FlcyhzbmRfYWVzX2llYzk1OF90ICphZXMsIHUzMiB2YWwpCit7CisJYWVzLT5zdGF0dXNbMF0gPSAoKHZhbCAmIEhEU1BfU1BESUZQcm9mZXNzaW9uYWwpID8gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIDogMCkgfAorCQkJICgodmFsICYgSERTUF9TUERJRk5vbkF1ZGlvKSA/IElFQzk1OF9BRVMwX05PTkFVRElPIDogMCk7CisJaWYgKHZhbCAmIEhEU1BfU1BESUZQcm9mZXNzaW9uYWwpCisJCWFlcy0+c3RhdHVzWzBdIHw9ICh2YWwgJiBIRFNQX1NQRElGRW1waGFzaXMpID8gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUgOiAwOworCWVsc2UKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIEhEU1BfU1BESUZFbXBoYXNpcykgPyBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfY29udHJvbF9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9jb250cm9sX3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzbmRfaGRzcF9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwgaGRzcC0+Y3JlZ19zcGRpZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfY29udHJvbF9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1MzIgdmFsOworCQorCXZhbCA9IHNuZF9oZHNwX2NvbnZlcnRfZnJvbV9hZXMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSBoZHNwLT5jcmVnX3NwZGlmOworCWhkc3AtPmNyZWdfc3BkaWYgPSB2YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzbmRfaGRzcF9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwgaGRzcC0+Y3JlZ19zcGRpZl9zdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfc3RyZWFtX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXUzMiB2YWw7CisJCisJdmFsID0gc25kX2hkc3BfY29udmVydF9mcm9tX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCk7CisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IGhkc3AtPmNyZWdfc3BkaWZfc3RyZWFtOworCWhkc3AtPmNyZWdfc3BkaWZfc3RyZWFtID0gdmFsOworCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihIRFNQX1NQRElGUHJvZmVzc2lvbmFsIHwgSERTUF9TUERJRk5vbkF1ZGlvIHwgSERTUF9TUERJRkVtcGhhc2lzKTsKKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfbWFza19pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9jb250cm9sX3NwZGlmX21hc2tfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIRFNQX1NQRElGX0lOKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfaW4sIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9zcGRpZl9pbiwgXAorICAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX2luIH0KKworc3RhdGljIHVuc2lnbmVkIGludCBoZHNwX3NwZGlmX2luKGhkc3BfdCAqaGRzcCkKK3sKKwlyZXR1cm4gaGRzcF9kZWNvZGVfc3BkaWZfaW4oaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZJbnB1dE1hc2spOworfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X3NwZGlmX2lucHV0KGhkc3BfdCAqaGRzcCwgaW50IGluKQoreworCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfU1BESUZJbnB1dE1hc2s7CisJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBoZHNwX2VuY29kZV9zcGRpZl9pbihpbik7CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19zcGRpZl9pbihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7Ik9wdGljYWwiLCAiQ29heGlhbCIsICJJbnRlcm5hbCIsICJBRVMifTsKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gKChoZHNwLT5pb190eXBlID09IEg5NjMyKSA/IDQgOiAzKTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+ICgoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgPyAzIDogMikpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAoKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpID8gMyA6IDIpOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3NwZGlmX2luKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX3NwZGlmX2luKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9zcGRpZl9pbihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisJCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gJSAoKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpID8gNCA6IDMpOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSBoZHNwX3NwZGlmX2luKGhkc3ApOworCWlmIChjaGFuZ2UpCisJCWhkc3Bfc2V0X3NwZGlmX2lucHV0KGhkc3AsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BfU1BESUZfT1VUKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX291dCwgLnB1dCA9IHNuZF9oZHNwX3B1dF9zcGRpZl9vdXQgfQorCitzdGF0aWMgaW50IGhkc3Bfc3BkaWZfb3V0KGhkc3BfdCAqaGRzcCkKK3sKKwlyZXR1cm4gKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1NQRElGT3B0aWNhbE91dCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwX3NldF9zcGRpZl9vdXRwdXQoaGRzcF90ICpoZHNwLCBpbnQgb3V0KQoreworCWlmIChvdXQpIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1NQRElGT3B0aWNhbE91dDsKKwl9IGVsc2UgeworCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX1NQRElGT3B0aWNhbE91dDsKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19zcGRpZl9iaXRzKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9zcGRpZl9vdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZHNwX3NwZGlmX291dChoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfc3BkaWZfb3V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3Bfc3BkaWZfb3V0KGhkc3ApOworCWhkc3Bfc2V0X3NwZGlmX291dHB1dChoZHNwLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX1NQRElGX1BST0ZFU1NJT05BTCh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX3NwZGlmX2JpdHMsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9zcGRpZl9wcm9mZXNzaW9uYWwsIC5wdXQgPSBzbmRfaGRzcF9wdXRfc3BkaWZfcHJvZmVzc2lvbmFsIH0KKworc3RhdGljIGludCBoZHNwX3NwZGlmX3Byb2Zlc3Npb25hbChoZHNwX3QgKmhkc3ApCit7CisJcmV0dXJuIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9TUERJRlByb2Zlc3Npb25hbCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwX3NldF9zcGRpZl9wcm9mZXNzaW9uYWwoaGRzcF90ICpoZHNwLCBpbnQgdmFsKQoreworCWlmICh2YWwpIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1NQRElGUHJvZmVzc2lvbmFsOworCX0gZWxzZSB7CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfU1BESUZQcm9mZXNzaW9uYWw7CisJfQorCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9zcGRpZl9wcm9mZXNzaW9uYWwoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZHNwX3NwZGlmX3Byb2Zlc3Npb25hbChoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfc3BkaWZfcHJvZmVzc2lvbmFsKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3Bfc3BkaWZfcHJvZmVzc2lvbmFsKGhkc3ApOworCWhkc3Bfc2V0X3NwZGlmX3Byb2Zlc3Npb25hbChoZHNwLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX1NQRElGX0VNUEhBU0lTKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX2VtcGhhc2lzLCAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX2VtcGhhc2lzIH0KKworc3RhdGljIGludCBoZHNwX3NwZGlmX2VtcGhhc2lzKGhkc3BfdCAqaGRzcCkKK3sKKwlyZXR1cm4gKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1NQRElGRW1waGFzaXMpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9zZXRfc3BkaWZfZW1waGFzaXMoaGRzcF90ICpoZHNwLCBpbnQgdmFsKQoreworCWlmICh2YWwpIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1NQRElGRW1waGFzaXM7CisJfSBlbHNlIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9TUERJRkVtcGhhc2lzOworCX0KKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfc3BkaWZfZW1waGFzaXMoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZHNwX3NwZGlmX2VtcGhhc2lzKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9zcGRpZl9lbXBoYXNpcyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisJCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwljaGFuZ2UgPSAoaW50KXZhbCAhPSBoZHNwX3NwZGlmX2VtcGhhc2lzKGhkc3ApOworCWhkc3Bfc2V0X3NwZGlmX2VtcGhhc2lzKGhkc3AsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BfU1BESUZfTk9OX0FVRElPKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX25vbmF1ZGlvLCAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX25vbmF1ZGlvIH0KKworc3RhdGljIGludCBoZHNwX3NwZGlmX25vbmF1ZGlvKGhkc3BfdCAqaGRzcCkKK3sKKwlyZXR1cm4gKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1NQRElGTm9uQXVkaW8pID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9zZXRfc3BkaWZfbm9uYXVkaW8oaGRzcF90ICpoZHNwLCBpbnQgdmFsKQoreworCWlmICh2YWwpIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1NQRElGTm9uQXVkaW87CisJfSBlbHNlIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9TUERJRk5vbkF1ZGlvOworCX0KKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfc3BkaWZfbm9uYXVkaW8oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZHNwX3NwZGlmX25vbmF1ZGlvKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9zcGRpZl9ub25hdWRpbyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisJCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwljaGFuZ2UgPSAoaW50KXZhbCAhPSBoZHNwX3NwZGlmX25vbmF1ZGlvKGhkc3ApOworCWhkc3Bfc2V0X3NwZGlmX25vbmF1ZGlvKGhkc3AsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BfU1BESUZfU0FNUExFX1JBVEUoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX3NwZGlmX3NhbXBsZV9yYXRlLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfc3BkaWZfc2FtcGxlX3JhdGUgXAorfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2luZm9fc3BkaWZfc2FtcGxlX3JhdGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7IjMyMDAwIiwgIjQ0MTAwIiwgIjQ4MDAwIiwgIjY0MDAwIiwgIjg4MjAwIiwgIjk2MDAwIiwgIk5vbmUiLCAiMTI4MDAwIiwgIjE3NjQwMCIsICIxOTIwMDAifTsKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpID8gMTAgOiA3OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3NwZGlmX3NhbXBsZV9yYXRlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXN3aXRjaCAoaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwKSkgeworCWNhc2UgMzIwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgNjQwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAzOworCQlicmVhazsKKwljYXNlIDg4MjAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gNDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDU7CisJCWJyZWFrOworCWNhc2UgMTI4MDAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gNzsKKwkJYnJlYWs7CisJY2FzZSAxNzY0MDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSA4OworCQlicmVhazsKKwljYXNlIDE5MjAwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSA2OwkJCisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIEhEU1BfU1lTVEVNX1NBTVBMRV9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb19zeXN0ZW1fc2FtcGxlX3JhdGUsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9zeXN0ZW1fc2FtcGxlX3JhdGUgXAorfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2luZm9fc3lzdGVtX3NhbXBsZV9yYXRlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3N5c3RlbV9zYW1wbGVfcmF0ZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcC0+c3lzdGVtX3NhbXBsZV9yYXRlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEhEU1BfQVVUT1NZTkNfU0FNUExFX1JBVEUoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb19hdXRvc3luY19zYW1wbGVfcmF0ZSwgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X2F1dG9zeW5jX3NhbXBsZV9yYXRlIFwKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX2F1dG9zeW5jX3NhbXBsZV9yYXRlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsiMzIwMDAiLCAiNDQxMDAiLCAiNDgwMDAiLCAiNjQwMDAiLCAiODgyMDAiLCAiOTYwMDAiLCAiTm9uZSIsICIxMjgwMDAiLCAiMTc2NDAwIiwgIjE5MjAwMCJ9OwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpID8gMTAgOiA3IDsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9hdXRvc3luY19zYW1wbGVfcmF0ZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzd2l0Y2ggKGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCkpIHsKKwljYXNlIDMyMDAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMDsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDE7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAyOworCQlicmVhazsKKwljYXNlIDY0MDAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMzsKKwkJYnJlYWs7CisJY2FzZSA4ODIwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDQ7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSA1OworCQlicmVhazsKKwljYXNlIDEyODAwMDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDc7CisJCWJyZWFrOworCWNhc2UgMTc2NDAwOgorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gODsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSA5OworCQlicmVhazsJCisJZGVmYXVsdDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDY7CQkKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSERTUF9TWVNURU1fQ0xPQ0tfTU9ERSh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3lzdGVtX2Nsb2NrX21vZGUsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9zeXN0ZW1fY2xvY2tfbW9kZSBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9zeXN0ZW1fY2xvY2tfbW9kZShoZHNwX3QgKmhkc3ApCit7CisJaWYgKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX0Nsb2NrTW9kZU1hc3RlcikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCkgIT0gaGRzcC0+c3lzdGVtX3NhbXBsZV9yYXRlKSB7CisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19zeXN0ZW1fY2xvY2tfbW9kZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsiTWFzdGVyIiwgIlNsYXZlIiB9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3N5c3RlbV9jbG9ja19tb2RlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX3N5c3RlbV9jbG9ja19tb2RlKGhkc3ApOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEhEU1BfQ0xPQ0tfU09VUkNFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb19jbG9ja19zb3VyY2UsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9jbG9ja19zb3VyY2UsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF9jbG9ja19zb3VyY2UgXAorfQorCitzdGF0aWMgaW50IGhkc3BfY2xvY2tfc291cmNlKGhkc3BfdCAqaGRzcCkKK3sKKwlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfQ2xvY2tNb2RlTWFzdGVyKSB7CisJCXN3aXRjaCAoaGRzcC0+c3lzdGVtX3NhbXBsZV9yYXRlKSB7CisJCWNhc2UgMzIwMDA6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSA0NDEwMDoKKwkJCXJldHVybiAyOworCQljYXNlIDQ4MDAwOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgNjQwMDA6CisJCQlyZXR1cm4gNDsKKwkJY2FzZSA4ODIwMDoKKwkJCXJldHVybiA1OworCQljYXNlIDk2MDAwOgorCQkJcmV0dXJuIDY7CisJCWNhc2UgMTI4MDAwOgorCQkJcmV0dXJuIDc7CisJCWNhc2UgMTc2NDAwOgorCQkJcmV0dXJuIDg7CisJCWNhc2UgMTkyMDAwOgorCQkJcmV0dXJuIDk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMzsJCisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9zZXRfY2xvY2tfc291cmNlKGhkc3BfdCAqaGRzcCwgaW50IG1vZGUpCit7CisJaW50IHJhdGU7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9BVVRPU1lOQzoKKwkJaWYgKGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCkgIT0gMCkgeworCQkgICAgaWYgKCFoZHNwX3NldF9yYXRlKGhkc3AsIGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCksIDEpKSB7CisJCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX0Nsb2NrTW9kZU1hc3RlcjsJCQorCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJCQlyZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCQlyZXR1cm4gLTE7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8zMktIWjoKKwkJcmF0ZSA9IDMyMDAwOworCQlicmVhazsKKwljYXNlIEhEU1BfQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzQ0XzFLSFo6CisJCXJhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CSAgICAKKwljYXNlIEhEU1BfQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzQ4S0haOgorCQlyYXRlID0gNDgwMDA7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfNjRLSFo6CisJCXJhdGUgPSA2NDAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF84OF8yS0haOgorCQlyYXRlID0gODgyMDA7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfOTZLSFo6CisJCXJhdGUgPSA5NjAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8xMjhLSFo6CisJCXJhdGUgPSAxMjgwMDA7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTc2XzRLSFo6CisJCXJhdGUgPSAxNzY0MDA7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTkyS0haOgorCQlyYXRlID0gMTkyMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYXRlID0gNDgwMDA7CisJfQorCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9DbG9ja01vZGVNYXN0ZXI7CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJaGRzcF9zZXRfcmF0ZShoZHNwLCByYXRlLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX2Nsb2NrX3NvdXJjZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsiQXV0b1N5bmMiLCAiSW50ZXJuYWwgMzIuMCBrSHoiLCAiSW50ZXJuYWwgNDQuMSBrSHoiLCAiSW50ZXJuYWwgNDguMCBrSHoiLCAiSW50ZXJuYWwgNjQuMCBrSHoiLCAiSW50ZXJuYWwgODguMiBrSHoiLCAiSW50ZXJuYWwgOTYuMCBrSHoiLCAiSW50ZXJuYWwgMTI4IGtIeiIsICJJbnRlcm5hbCAxNzYuNCBrSHoiLCAiSW50ZXJuYWwgMTkyLjAgS0h6IiB9OworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyKQorCSAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDEwOworCWVsc2UKKwkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA3OwkKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9jbG9ja19zb3VyY2Uoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BfY2xvY2tfc291cmNlKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9jbG9ja19zb3VyY2Uoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwlpbnQgdmFsOworCQorCWlmICghc25kX2hkc3BfdXNlX2lzX2V4Y2x1c2l2ZShoZHNwKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmICh2YWwgPCAwKSB2YWwgPSAwOworCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyKSB7CisJICAgIGlmICh2YWwgPiA5KSB2YWwgPSA5OworCX0gZWxzZSB7CisJICAgIGlmICh2YWwgPiA2KSB2YWwgPSA2OworCX0KKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlpZiAodmFsICE9IGhkc3BfY2xvY2tfc291cmNlKGhkc3ApKSB7CisJCWNoYW5nZSA9IChoZHNwX3NldF9jbG9ja19zb3VyY2UoaGRzcCwgdmFsKSA9PSAwKSA/IDEgOiAwOworCX0gZWxzZSB7CisJCWNoYW5nZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX0RBX0dBSU4oeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fZGFfZ2FpbiwgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X2RhX2dhaW4sIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF9kYV9nYWluIFwKK30KKworc3RhdGljIGludCBoZHNwX2RhX2dhaW4oaGRzcF90ICpoZHNwKQoreworCXN3aXRjaCAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfREFHYWluTWFzaykgeworCWNhc2UgSERTUF9EQUdhaW5IaWdoR2FpbjoKKwkJcmV0dXJuIDA7CisJY2FzZSBIRFNQX0RBR2FpblBsdXM0ZEJ1OgorCQlyZXR1cm4gMTsKKwljYXNlIEhEU1BfREFHYWluTWludXMxMGRCVjoKKwkJcmV0dXJuIDI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CQorCX0KK30KKworc3RhdGljIGludCBoZHNwX3NldF9kYV9nYWluKGhkc3BfdCAqaGRzcCwgaW50IG1vZGUpCit7CisJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9EQUdhaW5NYXNrOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX0RBR2FpbkhpZ2hHYWluOworCQlicmVhazsKKwljYXNlIDE6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9EQUdhaW5QbHVzNGRCdTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfREFHYWluTWludXMxMGRCVjsJCQorCQlicmVhazsJICAgIAorCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKworCX0KKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX2RhX2dhaW4oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7IkhpIEdhaW4iLCAiKzQgZEJ1IiwgIi0xMCBkYlYifTsKKwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9kYV9nYWluKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX2RhX2dhaW4oaGRzcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X2RhX2dhaW4oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwlpbnQgdmFsOworCQorCWlmICghc25kX2hkc3BfdXNlX2lzX2V4Y2x1c2l2ZShoZHNwKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmICh2YWwgPCAwKSB2YWwgPSAwOworCWlmICh2YWwgPiAyKSB2YWwgPSAyOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWlmICh2YWwgIT0gaGRzcF9kYV9nYWluKGhkc3ApKSB7CisJCWNoYW5nZSA9IChoZHNwX3NldF9kYV9nYWluKGhkc3AsIHZhbCkgPT0gMCkgPyAxIDogMDsKKwl9IGVsc2UgeworCQljaGFuZ2UgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUF9BRF9HQUlOKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX2FkX2dhaW4sIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9hZF9nYWluLCBcCisgIC5wdXQgPSBzbmRfaGRzcF9wdXRfYWRfZ2FpbiBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9hZF9nYWluKGhkc3BfdCAqaGRzcCkKK3sKKwlzd2l0Y2ggKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX0FER2Fpbk1hc2spIHsKKwljYXNlIEhEU1BfQURHYWluTWludXMxMGRCVjoKKwkJcmV0dXJuIDA7CisJY2FzZSBIRFNQX0FER2FpblBsdXM0ZEJ1OgorCQlyZXR1cm4gMTsKKwljYXNlIEhEU1BfQURHYWluTG93R2FpbjoKKwkJcmV0dXJuIDI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CQorCX0KK30KKworc3RhdGljIGludCBoZHNwX3NldF9hZF9nYWluKGhkc3BfdCAqaGRzcCwgaW50IG1vZGUpCit7CisJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9BREdhaW5NYXNrOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX0FER2Fpbk1pbnVzMTBkQlY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX0FER2FpblBsdXM0ZEJ1OwkJCisJCWJyZWFrOworCWNhc2UgMjoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX0FER2Fpbkxvd0dhaW47CQkKKwkJYnJlYWs7CSAgICAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19hZF9nYWluKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyItMTAgZEJWIiwgIis0IGRCdSIsICJMbyBHYWluIn07CisJCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfYWRfZ2FpbihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcF9hZF9nYWluKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9hZF9nYWluKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAodmFsIDwgMCkgdmFsID0gMDsKKwlpZiAodmFsID4gMikgdmFsID0gMjsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlpZiAodmFsICE9IGhkc3BfYWRfZ2FpbihoZHNwKSkgeworCQljaGFuZ2UgPSAoaGRzcF9zZXRfYWRfZ2FpbihoZHNwLCB2YWwpID09IDApID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJY2hhbmdlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BfUEhPTkVfR0FJTih4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb19waG9uZV9nYWluLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfcGhvbmVfZ2FpbiwgXAorICAucHV0ID0gc25kX2hkc3BfcHV0X3Bob25lX2dhaW4gXAorfQorCitzdGF0aWMgaW50IGhkc3BfcGhvbmVfZ2FpbihoZHNwX3QgKmhkc3ApCit7CisJc3dpdGNoIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9QaG9uZUdhaW5NYXNrKSB7CisJY2FzZSBIRFNQX1Bob25lR2FpbjBkQjoKKwkJcmV0dXJuIDA7CisJY2FzZSBIRFNQX1Bob25lR2Fpbk1pbnVzNmRCOgorCQlyZXR1cm4gMTsKKwljYXNlIEhEU1BfUGhvbmVHYWluTWludXMxMmRCOgorCQlyZXR1cm4gMjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsJCisJfQorfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X3Bob25lX2dhaW4oaGRzcF90ICpoZHNwLCBpbnQgbW9kZSkKK3sKKwloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX1Bob25lR2Fpbk1hc2s7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUGhvbmVHYWluMGRCOworCQlicmVhazsKKwljYXNlIDE6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9QaG9uZUdhaW5NaW51czZkQjsJCQorCQlicmVhazsKKwljYXNlIDI6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9QaG9uZUdhaW5NaW51czEyZEI7CQkKKwkJYnJlYWs7CSAgICAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19waG9uZV9nYWluKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyIwIGRCIiwgIi02IGRCIiwgIi0xMiBkQiJ9OworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3Bob25lX2dhaW4oc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BfcGhvbmVfZ2FpbihoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfcGhvbmVfZ2FpbihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWludCB2YWw7CisJCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHZhbCA8IDApIHZhbCA9IDA7CisJaWYgKHZhbCA+IDIpIHZhbCA9IDI7CisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJaWYgKHZhbCAhPSBoZHNwX3Bob25lX2dhaW4oaGRzcCkpIHsKKwkJY2hhbmdlID0gKGhkc3Bfc2V0X3Bob25lX2dhaW4oaGRzcCwgdmFsKSA9PSAwKSA/IDEgOiAwOworCX0gZWxzZSB7CisJCWNoYW5nZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX1hMUl9CUkVBS09VVF9DQUJMRSh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb194bHJfYnJlYWtvdXRfY2FibGUsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF94bHJfYnJlYWtvdXRfY2FibGUsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF94bHJfYnJlYWtvdXRfY2FibGUgXAorfQorCitzdGF0aWMgaW50IGhkc3BfeGxyX2JyZWFrb3V0X2NhYmxlKGhkc3BfdCAqaGRzcCkKK3sKKwlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfWExSQnJlYWtvdXRDYWJsZSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF9zZXRfeGxyX2JyZWFrb3V0X2NhYmxlKGhkc3BfdCAqaGRzcCwgaW50IG1vZGUpCit7CisJaWYgKG1vZGUpIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1hMUkJyZWFrb3V0Q2FibGU7CisJfSBlbHNlIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9YTFJCcmVha291dENhYmxlOworCX0KKwloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX3hscl9icmVha291dF9jYWJsZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfeGxyX2JyZWFrb3V0X2NhYmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX3hscl9icmVha291dF9jYWJsZShoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfeGxyX2JyZWFrb3V0X2NhYmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3BfeGxyX2JyZWFrb3V0X2NhYmxlKGhkc3ApOworCWhkc3Bfc2V0X3hscl9icmVha291dF9jYWJsZShoZHNwLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyogKERlKWFjdGl2YXRlcyBvbGQgUk1FIEFuYWxvZyBFeHRlbnNpb24gQm9hcmQKKyAgIFRoZXNlIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmFsIEFEQVQgY29ubmVjdG9yCisgICBTd2l0Y2hpbmcgdGhpcyBvbiBkZXNhY3RpdmF0ZXMgZXh0ZXJuYWwgQURBVAorKi8KKyNkZWZpbmUgSERTUF9BRUIoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fYWViLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfYWViLCBcCisgIC5wdXQgPSBzbmRfaGRzcF9wdXRfYWViIFwKK30KKworc3RhdGljIGludCBoZHNwX2FlYihoZHNwX3QgKmhkc3ApCit7CisJaWYgKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX0FuYWxvZ0V4dGVuc2lvbkJvYXJkKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZHNwX3NldF9hZWIoaGRzcF90ICpoZHNwLCBpbnQgbW9kZSkKK3sKKwlpZiAobW9kZSkgeworCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfQW5hbG9nRXh0ZW5zaW9uQm9hcmQ7CisJfSBlbHNlIHsKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9BbmFsb2dFeHRlbnNpb25Cb2FyZDsKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19hZWIoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X2FlYihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcF9hZWIoaGRzcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X2FlYihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWludCB2YWw7CisJCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwljaGFuZ2UgPSAoaW50KXZhbCAhPSBoZHNwX2FlYihoZHNwKTsKKwloZHNwX3NldF9hZWIoaGRzcCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUF9QUkVGX1NZTkNfUkVGKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX3ByZWZfc3luY19yZWYsIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9wcmVmX3N5bmNfcmVmLCBcCisgIC5wdXQgPSBzbmRfaGRzcF9wdXRfcHJlZl9zeW5jX3JlZiBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9wcmVmX3N5bmNfcmVmKGhkc3BfdCAqaGRzcCkKK3sKKwkvKiBOb3RpY2UgdGhhdCB0aGlzIGxvb2tzIGF0IHRoZSByZXF1ZXN0ZWQgc3luYyBzb3VyY2UsCisJICAgbm90IHRoZSBvbmUgYWN0dWFsbHkgaW4gdXNlLgorCSovCisKKwlzd2l0Y2ggKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1N5bmNSZWZNYXNrKSB7CisJY2FzZSBIRFNQX1N5bmNSZWZfQURBVDE6CisJCXJldHVybiBIRFNQX1NZTkNfRlJPTV9BREFUMTsKKwljYXNlIEhEU1BfU3luY1JlZl9BREFUMjoKKwkJcmV0dXJuIEhEU1BfU1lOQ19GUk9NX0FEQVQyOworCWNhc2UgSERTUF9TeW5jUmVmX0FEQVQzOgorCQlyZXR1cm4gSERTUF9TWU5DX0ZST01fQURBVDM7CisJY2FzZSBIRFNQX1N5bmNSZWZfU1BESUY6CisJCXJldHVybiBIRFNQX1NZTkNfRlJPTV9TUERJRjsKKwljYXNlIEhEU1BfU3luY1JlZl9XT1JEOgorCQlyZXR1cm4gSERTUF9TWU5DX0ZST01fV09SRDsKKwljYXNlIEhEU1BfU3luY1JlZl9BREFUX1NZTkM6CisJCXJldHVybiBIRFNQX1NZTkNfRlJPTV9BREFUX1NZTkM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEhEU1BfU1lOQ19GUk9NX1dPUkQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X3ByZWZfc3luY19yZWYoaGRzcF90ICpoZHNwLCBpbnQgcHJlZikKK3sKKwloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX1N5bmNSZWZNYXNrOworCXN3aXRjaCAocHJlZikgeworCWNhc2UgSERTUF9TWU5DX0ZST01fQURBVDE6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfU3luY1JlZk1hc2s7IC8qIGNsZWFyIFN5bmNSZWYgYml0cyAqLworCQlicmVhazsKKwljYXNlIEhEU1BfU1lOQ19GUk9NX0FEQVQyOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfU3luY1JlZl9BREFUMjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX1NZTkNfRlJPTV9BREFUMzoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1N5bmNSZWZfQURBVDM7CisJCWJyZWFrOworCWNhc2UgSERTUF9TWU5DX0ZST01fU1BESUY6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9TeW5jUmVmX1NQRElGOworCQlicmVhazsKKwljYXNlIEhEU1BfU1lOQ19GUk9NX1dPUkQ6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9TeW5jUmVmX1dPUkQ7CisJCWJyZWFrOworCWNhc2UgSERTUF9TWU5DX0ZST01fQURBVF9TWU5DOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfU3luY1JlZl9BREFUX1NZTkM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19wcmVmX3N5bmNfcmVmKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyJXb3JkIiwgIklFQzk1OCIsICJBREFUMSIsICJBREFUIFN5bmMiLCAiQURBVDIiLCAiQURBVDMiIH07CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisKKwlzd2l0Y2ggKGhkc3AtPmlvX3R5cGUpIHsKKwljYXNlIERpZ2lmYWNlOgorCWNhc2UgSDk2NTI6CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNjsKKwkJYnJlYWs7CisJY2FzZSBNdWx0aWZhY2U6CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNDsKKwkJYnJlYWs7CisJY2FzZSBIOTYzMjoKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDA7CisJCWJyZWFrOworCX0KKwkJCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfcHJlZl9zeW5jX3JlZihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcF9wcmVmX3N5bmNfcmVmKGhkc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9wcmVmX3N5bmNfcmVmKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UsIG1heDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCQorCWlmICghc25kX2hkc3BfdXNlX2lzX2V4Y2x1c2l2ZShoZHNwKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoaGRzcC0+aW9fdHlwZSkgeworCWNhc2UgRGlnaWZhY2U6CisJY2FzZSBIOTY1MjoKKwkJbWF4ID0gNjsKKwkJYnJlYWs7CisJY2FzZSBNdWx0aWZhY2U6CisJCW1heCA9IDQ7CisJCWJyZWFrOworCWNhc2UgSDk2MzI6CisJCW1heCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOworCX0KKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gJSBtYXg7CisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gaGRzcF9wcmVmX3N5bmNfcmVmKGhkc3ApOworCWhkc3Bfc2V0X3ByZWZfc3luY19yZWYoaGRzcCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUF9BVVRPU1lOQ19SRUYoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX2F1dG9zeW5jX3JlZiwgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X2F1dG9zeW5jX3JlZiwgXAorfQorCitzdGF0aWMgaW50IGhkc3BfYXV0b3N5bmNfcmVmKGhkc3BfdCAqaGRzcCkKK3sKKwkvKiBUaGlzIGxvb2tzIGF0IHRoZSBhdXRvc3luYyBzZWxlY3RlZCBzeW5jIHJlZmVyZW5jZSAqLworCXVuc2lnbmVkIGludCBzdGF0dXMyID0gaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKTsKKworCXN3aXRjaCAoc3RhdHVzMiAmIEhEU1BfU2VsU3luY1JlZk1hc2spIHsKKwljYXNlIEhEU1BfU2VsU3luY1JlZl9XT1JEOgorCQlyZXR1cm4gSERTUF9BVVRPU1lOQ19GUk9NX1dPUkQ7CisJY2FzZSBIRFNQX1NlbFN5bmNSZWZfQURBVF9TWU5DOgorCQlyZXR1cm4gSERTUF9BVVRPU1lOQ19GUk9NX0FEQVRfU1lOQzsKKwljYXNlIEhEU1BfU2VsU3luY1JlZl9TUERJRjoKKwkJcmV0dXJuIEhEU1BfQVVUT1NZTkNfRlJPTV9TUERJRjsKKwljYXNlIEhEU1BfU2VsU3luY1JlZk1hc2s6CisJCXJldHVybiBIRFNQX0FVVE9TWU5DX0ZST01fTk9ORTsJCisJY2FzZSBIRFNQX1NlbFN5bmNSZWZfQURBVDE6CisJCXJldHVybiBIRFNQX0FVVE9TWU5DX0ZST01fQURBVDE7CisJY2FzZSBIRFNQX1NlbFN5bmNSZWZfQURBVDI6CisJCXJldHVybiBIRFNQX0FVVE9TWU5DX0ZST01fQURBVDI7CisJY2FzZSBIRFNQX1NlbFN5bmNSZWZfQURBVDM6CisJCXJldHVybiBIRFNQX0FVVE9TWU5DX0ZST01fQURBVDM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEhEU1BfQVVUT1NZTkNfRlJPTV9XT1JEOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX2F1dG9zeW5jX3JlZihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsiV29yZCIsICJBREFUIFN5bmMiLCAiSUVDOTU4IiwgIk5vbmUiLCAiQURBVDEiLCAiQURBVDIiLCAiQURBVDMiIH07CisJCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDc7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfYXV0b3N5bmNfcmVmKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX2F1dG9zeW5jX3JlZihoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIRFNQX0xJTkVfT1VUKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX2xpbmVfb3V0LCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfbGluZV9vdXQsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF9saW5lX291dCBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9saW5lX291dChoZHNwX3QgKmhkc3ApCit7CisJcmV0dXJuIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9MaW5lT3V0KSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X2xpbmVfb3V0cHV0KGhkc3BfdCAqaGRzcCwgaW50IG91dCkKK3sKKwlpZiAob3V0KSB7CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9MaW5lT3V0OworCX0gZWxzZSB7CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfTGluZU91dDsKKwl9CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19saW5lX291dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfbGluZV9vdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZHNwX2xpbmVfb3V0KGhkc3ApOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X2xpbmVfb3V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3BfbGluZV9vdXQoaGRzcCk7CisJaGRzcF9zZXRfbGluZV9vdXRwdXQoaGRzcCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUF9QUkVDSVNFX1BPSU5URVIoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fcHJlY2lzZV9wb2ludGVyLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfcHJlY2lzZV9wb2ludGVyLCBcCisgIC5wdXQgPSBzbmRfaGRzcF9wdXRfcHJlY2lzZV9wb2ludGVyIFwKK30KKworc3RhdGljIGludCBoZHNwX3NldF9wcmVjaXNlX3BvaW50ZXIoaGRzcF90ICpoZHNwLCBpbnQgcHJlY2lzZSkKK3sKKwlpZiAocHJlY2lzZSkgeworCQloZHNwLT5wcmVjaXNlX3B0ciA9IDE7CisJfSBlbHNlIHsKKwkJaGRzcC0+cHJlY2lzZV9wdHIgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX3ByZWNpc2VfcG9pbnRlcihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfcHJlY2lzZV9wb2ludGVyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaGRzcC0+cHJlY2lzZV9wdHI7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfcHJlY2lzZV9wb2ludGVyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3AtPnByZWNpc2VfcHRyOworCWhkc3Bfc2V0X3ByZWNpc2VfcG9pbnRlcihoZHNwLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX1VTRV9NSURJX1RBU0tMRVQoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fdXNlX21pZGlfdGFza2xldCwgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3VzZV9taWRpX3Rhc2tsZXQsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF91c2VfbWlkaV90YXNrbGV0IFwKK30KKworc3RhdGljIGludCBoZHNwX3NldF91c2VfbWlkaV90YXNrbGV0KGhkc3BfdCAqaGRzcCwgaW50IHVzZV90YXNrbGV0KQoreworCWlmICh1c2VfdGFza2xldCkgeworCQloZHNwLT51c2VfbWlkaV90YXNrbGV0ID0gMTsKKwl9IGVsc2UgeworCQloZHNwLT51c2VfbWlkaV90YXNrbGV0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb191c2VfbWlkaV90YXNrbGV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF91c2VfbWlkaV90YXNrbGV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaGRzcC0+dXNlX21pZGlfdGFza2xldDsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF91c2VfbWlkaV90YXNrbGV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3AtPnVzZV9taWRpX3Rhc2tsZXQ7CisJaGRzcF9zZXRfdXNlX21pZGlfdGFza2xldChoZHNwLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX01JWEVSKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBcCisJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX21peGVyLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfbWl4ZXIsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF9taXhlciBcCit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19taXhlcihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAzOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gNjU1MzY7CisJdWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X21peGVyKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzb3VyY2U7CisJaW50IGRlc3RpbmF0aW9uOworCWludCBhZGRyOworCisJc291cmNlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJZGVzdGluYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwkKKwlpZiAoc291cmNlID49IGhkc3AtPm1heF9jaGFubmVscykgeworCQlhZGRyID0gaGRzcF9wbGF5YmFja190b19vdXRwdXRfa2V5KGhkc3Asc291cmNlLWhkc3AtPm1heF9jaGFubmVscyxkZXN0aW5hdGlvbik7CisJfSBlbHNlIHsKKwkJYWRkciA9IGhkc3BfaW5wdXRfdG9fb3V0cHV0X2tleShoZHNwLHNvdXJjZSwgZGVzdGluYXRpb24pOworCX0KKwkKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IGhkc3BfcmVhZF9nYWluIChoZHNwLCBhZGRyKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3B1dF9taXhlcihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWludCBzb3VyY2U7CisJaW50IGRlc3RpbmF0aW9uOworCWludCBnYWluOworCWludCBhZGRyOworCisJaWYgKCFzbmRfaGRzcF91c2VfaXNfZXhjbHVzaXZlKGhkc3ApKQorCQlyZXR1cm4gLUVCVVNZOworCisJc291cmNlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJZGVzdGluYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKworCWlmIChzb3VyY2UgPj0gaGRzcC0+bWF4X2NoYW5uZWxzKSB7CisJCWFkZHIgPSBoZHNwX3BsYXliYWNrX3RvX291dHB1dF9rZXkoaGRzcCxzb3VyY2UtaGRzcC0+bWF4X2NoYW5uZWxzLCBkZXN0aW5hdGlvbik7CisJfSBlbHNlIHsKKwkJYWRkciA9IGhkc3BfaW5wdXRfdG9fb3V0cHV0X2tleShoZHNwLHNvdXJjZSwgZGVzdGluYXRpb24pOworCX0KKworCWdhaW4gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IGdhaW4gIT0gaGRzcF9yZWFkX2dhaW4oaGRzcCwgYWRkcik7CisJaWYgKGNoYW5nZSkKKwkJaGRzcF93cml0ZV9nYWluKGhkc3AsIGFkZHIsIGdhaW4pOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQX1dDX1NZTkNfQ0hFQ0soeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX3N5bmNfY2hlY2ssIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF93Y19zeW5jX2NoZWNrIFwKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX3N5bmNfY2hlY2soc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7Ik5vIExvY2siLCAiTG9jayIsICJTeW5jIiB9OwkKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3Bfd2Nfc3luY19jaGVjayhoZHNwX3QgKmhkc3ApCit7CisJaW50IHN0YXR1czIgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpOworCWlmIChzdGF0dXMyICYgSERTUF93Y19sb2NrKSB7CisJCWlmIChzdGF0dXMyICYgSERTUF93Y19zeW5jKSB7CisJCQlyZXR1cm4gMjsKKwkJfSBlbHNlIHsKKwkJCSByZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CQkKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF93Y19zeW5jX2NoZWNrKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3Bfd2Nfc3luY19jaGVjayhoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIRFNQX1NQRElGX1NZTkNfQ0hFQ0soeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKKyAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX3N5bmNfY2hlY2ssIFwKKyAgLmdldCA9IHNuZF9oZHNwX2dldF9zcGRpZl9zeW5jX2NoZWNrIFwKK30KKworc3RhdGljIGludCBoZHNwX3NwZGlmX3N5bmNfY2hlY2soaGRzcF90ICpoZHNwKQoreworCWludCBzdGF0dXMgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3Rlcik7CisJaWYgKHN0YXR1cyAmIEhEU1BfU1BESUZFcnJvckZsYWcpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsJCisJCWlmIChzdGF0dXMgJiBIRFNQX1NQRElGU3luYykgeworCQkJcmV0dXJuIDI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfc3BkaWZfc3luY19jaGVjayhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX3NwZGlmX3N5bmNfY2hlY2soaGRzcCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSERTUF9BREFUU1lOQ19TWU5DX0NIRUNLKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCisgIC5pbmZvID0gc25kX2hkc3BfaW5mb19zeW5jX2NoZWNrLCBcCisgIC5nZXQgPSBzbmRfaGRzcF9nZXRfYWRhdHN5bmNfc3luY19jaGVjayBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9hZGF0c3luY19zeW5jX2NoZWNrKGhkc3BfdCAqaGRzcCkKK3sKKwlpbnQgc3RhdHVzID0gaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpOworCWlmIChzdGF0dXMgJiBIRFNQX1RpbWVjb2RlTG9jaykgeworCQlpZiAoc3RhdHVzICYgSERTUF9UaW1lY29kZVN5bmMpIHsKKwkJCXJldHVybiAyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9hZGF0c3luY19zeW5jX2NoZWNrKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaGRzcF90ICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BfYWRhdHN5bmNfc3luY19jaGVjayhoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIRFNQX0FEQVRfU1lOQ19DSEVDSyBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3luY19jaGVjaywgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X2FkYXRfc3luY19jaGVjayBcCit9CisKK3N0YXRpYyBpbnQgaGRzcF9hZGF0X3N5bmNfY2hlY2soaGRzcF90ICpoZHNwLCBpbnQgaWR4KQorewkKKwlpbnQgc3RhdHVzID0gaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpOworCQorCWlmIChzdGF0dXMgJiAoSERTUF9Mb2NrMD4+aWR4KSkgeworCQlpZiAoc3RhdHVzICYgKEhEU1BfU3luYzA+PmlkeCkpIHsKKwkJCXJldHVybiAyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDE7CQkKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0JCQorfSAKKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfYWRhdF9zeW5jX2NoZWNrKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJaW50IG9mZnNldDsKKwloZHNwX3QgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlvZmZzZXQgPSB1Y29udHJvbC0+aWQuaW5kZXggLSAxOworCXNuZF9hc3NlcnQob2Zmc2V0ID49IDApOworCisJc3dpdGNoIChoZHNwLT5pb190eXBlKSB7CisJY2FzZSBEaWdpZmFjZToKKwljYXNlIEg5NjUyOgorCQlpZiAob2Zmc2V0ID49IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBNdWx0aWZhY2U6CisJY2FzZSBIOTYzMjoKKwkJaWYgKG9mZnNldCA+PSAxKSAKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcF9hZGF0X3N5bmNfY2hlY2soaGRzcCwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaGRzcF85NjMyX2NvbnRyb2xzW10gPSB7CitIRFNQX0RBX0dBSU4oIkRBIEdhaW4iLCAwKSwKK0hEU1BfQURfR0FJTigiQUQgR2FpbiIsIDApLAorSERTUF9QSE9ORV9HQUlOKCJQaG9uZXMgR2FpbiIsIDApLAorSERTUF9YTFJfQlJFQUtPVVRfQ0FCTEUoIlhMUiBCcmVha291dCBDYWJsZSIsIDApCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9oZHNwX2NvbnRyb2xzW10gPSB7Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKKwkuaW5mbyA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX2luZm8sCisJLmdldCA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX2dldCwKKwkucHV0ID0JCXNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfcHV0LAorfSwKK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBDTV9TVFJFQU0pLAorCS5pbmZvID0JCXNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2luZm8sCisJLmdldCA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX3N0cmVhbV9nZXQsCisJLnB1dCA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX3N0cmVhbV9wdXQsCit9LAoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAorCS5pbmZvID0JCXNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfbWFza19pbmZvLAorCS5nZXQgPQkJc25kX2hkc3BfY29udHJvbF9zcGRpZl9tYXNrX2dldCwKKwkucHJpdmF0ZV92YWx1ZSA9IElFQzk1OF9BRVMwX05PTkFVRElPIHwKKyAgCQkJIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CisJCQkgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSwKK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBST19NQVNLKSwKKwkuaW5mbyA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKKwkuZ2V0ID0JCXNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfbWFza19nZXQsCisJLnByaXZhdGVfdmFsdWUgPSBJRUM5NThfQUVTMF9OT05BVURJTyB8CisJCQkgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMsCit9LAorSERTUF9NSVhFUigiTWl4ZXIiLCAwKSwKK0hEU1BfU1BESUZfSU4oIklFQzk1OCBJbnB1dCBDb25uZWN0b3IiLCAwKSwKK0hEU1BfU1BESUZfT1VUKCJJRUM5NTggT3V0cHV0IGFsc28gb24gQURBVDEiLCAwKSwKK0hEU1BfU1BESUZfUFJPRkVTU0lPTkFMKCJJRUM5NTggUHJvZmVzc2lvbmFsIEJpdCIsIDApLAorSERTUF9TUERJRl9FTVBIQVNJUygiSUVDOTU4IEVtcGhhc2lzIEJpdCIsIDApLAorSERTUF9TUERJRl9OT05fQVVESU8oIklFQzk1OCBOb24tYXVkaW8gQml0IiwgMCksCisvKiAnU2FtcGxlIENsb2NrIFNvdXJjZScgY29tcGxpZXMgd2l0aCB0aGUgYWxzYSBjb250cm9sIG5hbWluZyBzY2hlbWUgKi8gCitIRFNQX0NMT0NLX1NPVVJDRSgiU2FtcGxlIENsb2NrIFNvdXJjZSIsIDApLAorSERTUF9TWVNURU1fQ0xPQ0tfTU9ERSgiU3lzdGVtIENsb2NrIE1vZGUiLCAwKSwKK0hEU1BfUFJFRl9TWU5DX1JFRigiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlIiwgMCksCitIRFNQX0FVVE9TWU5DX1JFRigiQXV0b1N5bmMgUmVmZXJlbmNlIiwgMCksCitIRFNQX1NQRElGX1NBTVBMRV9SQVRFKCJTUERJRiBTYW1wbGUgUmF0ZSIsIDApLAorSERTUF9TWVNURU1fU0FNUExFX1JBVEUoIlN5c3RlbSBTYW1wbGUgUmF0ZSIsIDApLAorLyogJ0V4dGVybmFsIFJhdGUnIGNvbXBsaWVzIHdpdGggdGhlIGFsc2EgY29udHJvbCBuYW1pbmcgc2NoZW1lICovCitIRFNQX0FVVE9TWU5DX1NBTVBMRV9SQVRFKCJFeHRlcm5hbCBSYXRlIiwgMCksCitIRFNQX1dDX1NZTkNfQ0hFQ0soIldvcmQgQ2xvY2sgTG9jayBTdGF0dXMiLCAwKSwKK0hEU1BfU1BESUZfU1lOQ19DSEVDSygiU1BESUYgTG9jayBTdGF0dXMiLCAwKSwKK0hEU1BfQURBVFNZTkNfU1lOQ19DSEVDSygiQURBVCBTeW5jIExvY2sgU3RhdHVzIiwgMCksCitIRFNQX0xJTkVfT1VUKCJMaW5lIE91dCIsIDApLAorSERTUF9QUkVDSVNFX1BPSU5URVIoIlByZWNpc2UgUG9pbnRlciIsIDApLAorSERTUF9VU0VfTUlESV9UQVNLTEVUKCJVc2UgTWlkaSBUYXNrbGV0IiwgMCksCit9OworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9oZHNwXzk2eHhfYWViID0gSERTUF9BRUIoIkFuYWxvZyBFeHRlbnNpb24gQm9hcmQiLCAwKTsKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2hkc3BfYWRhdF9zeW5jX2NoZWNrID0gSERTUF9BREFUX1NZTkNfQ0hFQ0s7CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfY3JlYXRlX2NvbnRyb2xzKHNuZF9jYXJkX3QgKmNhcmQsIGhkc3BfdCAqaGRzcCkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2hkc3BfY29udHJvbHMpOyBpZHgrKykgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZHNwX2NvbnRyb2xzW2lkeF0sIGhkc3ApKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChpZHggPT0gMSkJLyogSUVDOTU4IChTL1BESUYpIFN0cmVhbSAqLworCQkJaGRzcC0+c3BkaWZfY3RsID0ga2N0bDsKKwl9CisKKwkvKiBBREFUIFN5bmNDaGVjayBzdGF0dXMgKi8KKwlzbmRfaGRzcF9hZGF0X3N5bmNfY2hlY2submFtZSA9ICJBREFUIExvY2sgU3RhdHVzIjsKKwlzbmRfaGRzcF9hZGF0X3N5bmNfY2hlY2suaW5kZXggPSAxOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQgKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZHNwX2FkYXRfc3luY19jaGVjaywgaGRzcCkpKSkgeworCQlyZXR1cm4gZXJyOworCX0JCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gRGlnaWZhY2UgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTY1MikgeworCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDM7ICsraWR4KSB7CisJCQlzbmRfaGRzcF9hZGF0X3N5bmNfY2hlY2suaW5kZXggPSBpZHgrMTsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQgKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZHNwX2FkYXRfc3luY19jaGVjaywgaGRzcCkpKSkgeworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9CisJCisJLyogREEsIEFEIGFuZCBQaG9uZSBnYWluIGFuZCBYTFIgYnJlYWtvdXQgY2FibGUgY29udHJvbHMgZm9yIEg5NjMyIGNhcmRzICovCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9oZHNwXzk2MzJfY29udHJvbHMpOyBpZHgrKykgeworCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfaGRzcF85NjMyX2NvbnRyb2xzW2lkeF0sIGhkc3ApKSkgPCAwKSB7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFFQiBjb250cm9sIGZvciBIOTZ4eCBjYXJkICovCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTY1MikgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZHNwXzk2eHhfYWViLCBoZHNwKSkpIDwgMCkgeworCQkJCXJldHVybiBlcnI7CisJCX0JCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAvcHJvYyBpbnRlcmZhY2UgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK3NuZF9oZHNwX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlcikKK3sKKwloZHNwX3QgKmhkc3AgPSAoaGRzcF90ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzMjsKKwljaGFyICpwcmVmX3N5bmNfcmVmOworCWNoYXIgKmF1dG9zeW5jX3JlZjsKKwljaGFyICpzeXN0ZW1fY2xvY2tfbW9kZTsKKwljaGFyICpjbG9ja19zb3VyY2U7CisJaW50IHg7CisKKwlpZiAoaGRzcF9jaGVja19mb3JfaW9ib3ggKGhkc3ApKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk5vIEkvTyBib3ggY29ubmVjdGVkLlxuUGxlYXNlIGNvbm5lY3Qgb25lIGFuZCB1cGxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZHNwX2NoZWNrX2Zvcl9maXJtd2FyZShoZHNwKSkgeworCQlpZiAoaGRzcC0+c3RhdGUgJiBIRFNQX0Zpcm13YXJlQ2FjaGVkKSB7CisJCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICJGaXJtd2FyZSBsb2FkaW5nIGZyb20gY2FjaGUgZmFpbGVkLCBwbGVhc2UgdXBsb2FkIG1hbnVhbGx5LlxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiTm8gZmlybXdhcmUgbG9hZGVkIG5vciBjYWNoZWQsIHBsZWFzZSB1cGxvYWQgZmlybXdhcmUuXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwlzdGF0dXMgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3Rlcik7CisJc3RhdHVzMiA9IGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3Rlcik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIlcyAoQ2FyZCAjJWQpXG4iLCBoZHNwLT5jYXJkX25hbWUsIGhkc3AtPmNhcmQtPm51bWJlciArIDEpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkJ1ZmZlcnM6IGNhcHR1cmUgJXAgcGxheWJhY2sgJXBcbiIsCisJCSAgICBoZHNwLT5jYXB0dXJlX2J1ZmZlciwgaGRzcC0+cGxheWJhY2tfYnVmZmVyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJJUlE6ICVkIFJlZ2lzdGVycyBidXM6IDB4JWx4IFZNOiAweCVseFxuIiwKKwkJICAgIGhkc3AtPmlycSwgaGRzcC0+cG9ydCwgKHVuc2lnbmVkIGxvbmcpaGRzcC0+aW9iYXNlKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDb250cm9sIHJlZ2lzdGVyOiAweCV4XG4iLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDb250cm9sMiByZWdpc3RlcjogMHgleFxuIiwgaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN0YXR1cyByZWdpc3RlcjogMHgleFxuIiwgc3RhdHVzKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTdGF0dXMyIHJlZ2lzdGVyOiAweCV4XG4iLCBzdGF0dXMyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJGSUZPIHN0YXR1czogJWRcbiIsIGhkc3BfcmVhZChoZHNwLCBIRFNQX2ZpZm9TdGF0dXMpICYgMHhmZik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiTUlESTEgT3V0cHV0IHN0YXR1czogMHgleFxuIiwgaGRzcF9yZWFkKGhkc3AsIEhEU1BfbWlkaVN0YXR1c091dDApKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJNSURJMSBJbnB1dCBzdGF0dXM6IDB4JXhcbiIsIGhkc3BfcmVhZChoZHNwLCBIRFNQX21pZGlTdGF0dXNJbjApKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJNSURJMiBPdXRwdXQgc3RhdHVzOiAweCV4XG4iLCBoZHNwX3JlYWQoaGRzcCwgSERTUF9taWRpU3RhdHVzT3V0MSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1JREkyIElucHV0IHN0YXR1czogMHgleFxuIiwgaGRzcF9yZWFkKGhkc3AsIEhEU1BfbWlkaVN0YXR1c0luMSkpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlVzZSBNaWRpIFRhc2tsZXQ6ICVzXG4iLCBoZHNwLT51c2VfbWlkaV90YXNrbGV0ID8gIm9uIiA6ICJvZmYiKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwl4ID0gMSA8PCAoNiArIGhkc3BfZGVjb2RlX2xhdGVuY3koaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfTGF0ZW5jeU1hc2spKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkJ1ZmZlciBTaXplIChMYXRlbmN5KTogJWQgc2FtcGxlcyAoMiBwZXJpb2RzIG9mICVsdSBieXRlcylcbiIsIHgsICh1bnNpZ25lZCBsb25nKSBoZHNwLT5wZXJpb2RfYnl0ZXMpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkhhcmR3YXJlIHBvaW50ZXIgKGZyYW1lcyk6ICVsZFxuIiwgaGRzcF9od19wb2ludGVyKGhkc3ApKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJQcmVjaXNlIHBvaW50ZXI6ICVzXG4iLCBoZHNwLT5wcmVjaXNlX3B0ciA/ICJvbiIgOiAib2ZmIik7CisJc25kX2lwcmludGYoYnVmZmVyLCAiTGluZSBvdXQ6ICVzXG4iLCAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfTGluZU91dCkgPyAib24iIDogIm9mZiIpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiRmlybXdhcmUgdmVyc2lvbjogJWRcbiIsIChzdGF0dXMyJkhEU1BfdmVyc2lvbjApfChzdGF0dXMyJkhEU1BfdmVyc2lvbjEpPDwxfChzdGF0dXMyJkhEU1BfdmVyc2lvbjIpPDwyKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKworCXN3aXRjaCAoaGRzcF9jbG9ja19zb3VyY2UoaGRzcCkpIHsKKwljYXNlIEhEU1BfQ0xPQ0tfU09VUkNFX0FVVE9TWU5DOgorCQljbG9ja19zb3VyY2UgPSAiQXV0b1N5bmMiOworCQlicmVhazsKKwljYXNlIEhEU1BfQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzMyS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMzIga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF80NF8xS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgNDQuMSBrSHoiOworCQlicmVhazsKKwljYXNlIEhEU1BfQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzQ4S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgNDgga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF82NEtIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDY0IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfODhfMktIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDg4LjIga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF85NktIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDk2IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTI4S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTI4IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUF9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTc2XzRLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCAxNzYuNCBrSHoiOworCQlicmVhazsKKwkJY2FzZSBIRFNQX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF8xOTJLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCAxOTIga0h6IjsKKwkJYnJlYWs7CQorCWRlZmF1bHQ6CisJCWNsb2NrX3NvdXJjZSA9ICJFcnJvciI7CQkKKwl9CisJc25kX2lwcmludGYgKGJ1ZmZlciwgIlNhbXBsZSBDbG9jayBTb3VyY2U6ICVzXG4iLCBjbG9ja19zb3VyY2UpOworCQkJCisJaWYgKGhkc3Bfc3lzdGVtX2Nsb2NrX21vZGUoaGRzcCkpIHsKKwkJc3lzdGVtX2Nsb2NrX21vZGUgPSAiU2xhdmUiOworCX0gZWxzZSB7CisJCXN5c3RlbV9jbG9ja19tb2RlID0gIk1hc3RlciI7CisJfQorCQorCXN3aXRjaCAoaGRzcF9wcmVmX3N5bmNfcmVmIChoZHNwKSkgeworCWNhc2UgSERTUF9TWU5DX0ZST01fV09SRDoKKwkJcHJlZl9zeW5jX3JlZiA9ICJXb3JkIENsb2NrIjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX1NZTkNfRlJPTV9BREFUX1NZTkM6CisJCXByZWZfc3luY19yZWYgPSAiQURBVCBTeW5jIjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX1NZTkNfRlJPTV9TUERJRjoKKwkJcHJlZl9zeW5jX3JlZiA9ICJTUERJRiI7CisJCWJyZWFrOworCWNhc2UgSERTUF9TWU5DX0ZST01fQURBVDE6CisJCXByZWZfc3luY19yZWYgPSAiQURBVDEiOworCQlicmVhazsKKwljYXNlIEhEU1BfU1lOQ19GUk9NX0FEQVQyOgorCQlwcmVmX3N5bmNfcmVmID0gIkFEQVQyIjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX1NZTkNfRlJPTV9BREFUMzoKKwkJcHJlZl9zeW5jX3JlZiA9ICJBREFUMyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByZWZfc3luY19yZWYgPSAiV29yZCBDbG9jayI7CisJCWJyZWFrOworCX0KKwlzbmRfaXByaW50ZiAoYnVmZmVyLCAiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlOiAlc1xuIiwgcHJlZl9zeW5jX3JlZik7CisJCisJc3dpdGNoIChoZHNwX2F1dG9zeW5jX3JlZiAoaGRzcCkpIHsKKwljYXNlIEhEU1BfQVVUT1NZTkNfRlJPTV9XT1JEOgorCQlhdXRvc3luY19yZWYgPSAiV29yZCBDbG9jayI7CisJCWJyZWFrOworCWNhc2UgSERTUF9BVVRPU1lOQ19GUk9NX0FEQVRfU1lOQzoKKwkJYXV0b3N5bmNfcmVmID0gIkFEQVQgU3luYyI7CisJCWJyZWFrOworCWNhc2UgSERTUF9BVVRPU1lOQ19GUk9NX1NQRElGOgorCQlhdXRvc3luY19yZWYgPSAiU1BESUYiOworCQlicmVhazsKKwljYXNlIEhEU1BfQVVUT1NZTkNfRlJPTV9OT05FOgorCQlhdXRvc3luY19yZWYgPSAiTm9uZSI7CisJCWJyZWFrOwkKKwljYXNlIEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMToKKwkJYXV0b3N5bmNfcmVmID0gIkFEQVQxIjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQX0FVVE9TWU5DX0ZST01fQURBVDI6CisJCWF1dG9zeW5jX3JlZiA9ICJBREFUMiI7CisJCWJyZWFrOworCWNhc2UgSERTUF9BVVRPU1lOQ19GUk9NX0FEQVQzOgorCQlhdXRvc3luY19yZWYgPSAiQURBVDMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhdXRvc3luY19yZWYgPSAiLS0tIjsKKwkJYnJlYWs7CisJfQorCXNuZF9pcHJpbnRmIChidWZmZXIsICJBdXRvU3luYyBSZWZlcmVuY2U6ICVzXG4iLCBhdXRvc3luY19yZWYpOworCQorCXNuZF9pcHJpbnRmIChidWZmZXIsICJBdXRvU3luYyBGcmVxdWVuY3k6ICVkXG4iLCBoZHNwX2V4dGVybmFsX3NhbXBsZV9yYXRlKGhkc3ApKTsKKwkKKwlzbmRfaXByaW50ZiAoYnVmZmVyLCAiU3lzdGVtIENsb2NrIE1vZGU6ICVzXG4iLCBzeXN0ZW1fY2xvY2tfbW9kZSk7CisKKwlzbmRfaXByaW50ZiAoYnVmZmVyLCAiU3lzdGVtIENsb2NrIEZyZXF1ZW5jeTogJWRcbiIsIGhkc3AtPnN5c3RlbV9zYW1wbGVfcmF0ZSk7CisJCQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwlzd2l0Y2ggKGhkc3Bfc3BkaWZfaW4oaGRzcCkpIHsKKwljYXNlIEhEU1BfU1BESUZJTl9PUFRJQ0FMOgorCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6IE9wdGljYWxcbiIpOworCQlicmVhazsKKwljYXNlIEhEU1BfU1BESUZJTl9DT0FYSUFMOgorCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6IENvYXhpYWxcbiIpOworCQlicmVhazsKKwljYXNlIEhEU1BfU1BESUZJTl9JTlRFUk5BTDoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBJbnRlcm5hbFxuIik7CisJCWJyZWFrOworCWNhc2UgSERTUF9TUERJRklOX0FFUzoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBBRVNcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6ID8/P1xuIik7CisJCWJyZWFrOworCX0KKwkKKwlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZPcHRpY2FsT3V0KSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBvdXRwdXQ6IENvYXhpYWwgJiBBREFUMVxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IG91dHB1dDogQ29heGlhbCBvbmx5XG4iKTsKKwl9CisKKwlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZQcm9mZXNzaW9uYWwpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IFByb2Zlc3Npb25hbFxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IENvbnN1bWVyXG4iKTsKKwl9CisKKwlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZFbXBoYXNpcykgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggZW1waGFzaXM6IG9uXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggZW1waGFzaXM6IG9mZlxuIik7CisJfQorCisJaWYgKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1NQRElGTm9uQXVkaW8pIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IE5vbkF1ZGlvOiBvblxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IE5vbkF1ZGlvOiBvZmZcbiIpOworCX0KKwlpZiAoKHggPSBoZHNwX3NwZGlmX3NhbXBsZV9yYXRlIChoZHNwKSkgIT0gMCkgeworCQlzbmRfaXByaW50ZiAoYnVmZmVyLCAiSUVDOTU4IHNhbXBsZSByYXRlOiAlZFxuIiwgeCk7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYgKGJ1ZmZlciwgIklFQzk1OCBzYW1wbGUgcmF0ZTogRXJyb3IgZmxhZyBzZXRcbiIpOworCX0KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwkvKiBTeW5jIENoZWNrICovCisJeCA9IHN0YXR1cyAmIEhEU1BfU3luYzA7CisJaWYgKHN0YXR1cyAmIEhEU1BfTG9jazApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQURBVDE6ICVzXG4iLCB4ID8gIlN5bmMiIDogIkxvY2siKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUMTogTm8gTG9ja1xuIik7CisJfQorCisJc3dpdGNoIChoZHNwLT5pb190eXBlKSB7CisJY2FzZSBEaWdpZmFjZToKKwljYXNlIEg5NjUyOgorCQl4ID0gc3RhdHVzICYgSERTUF9TeW5jMTsKKwkJaWYgKHN0YXR1cyAmIEhEU1BfTG9jazEpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQyOiAlc1xuIiwgeCA/ICJTeW5jIiA6ICJMb2NrIik7CisJCX0gZWxzZSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUMjogTm8gTG9ja1xuIik7CisJCX0KKwkJeCA9IHN0YXR1cyAmIEhEU1BfU3luYzI7CisJCWlmIChzdGF0dXMgJiBIRFNQX0xvY2syKSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUMzogJXNcbiIsIHggPyAiU3luYyIgOiAiTG9jayIpOworCQl9IGVsc2UgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiQURBVDM6IE5vIExvY2tcbiIpOworCQl9CisJZGVmYXVsdDoKKwkJLyogcmVsYXggKi8KKwkJYnJlYWs7CisJfQorCisJeCA9IHN0YXR1cyAmIEhEU1BfU1BESUZTeW5jOworCWlmIChzdGF0dXMgJiBIRFNQX1NQRElGRXJyb3JGbGFnKSB7CisJCXNuZF9pcHJpbnRmIChidWZmZXIsICJTUERJRjogTm8gTG9ja1xuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYgKGJ1ZmZlciwgIlNQRElGOiAlc1xuIiwgeCA/ICJTeW5jIiA6ICJMb2NrIik7CisJfQorCQorCXggPSBzdGF0dXMyICYgSERTUF93Y19zeW5jOworCWlmIChzdGF0dXMyICYgSERTUF93Y19sb2NrKSB7CisJCXNuZF9pcHJpbnRmIChidWZmZXIsICJXb3JkIENsb2NrOiAlc1xuIiwgeCA/ICJTeW5jIiA6ICJMb2NrIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYgKGJ1ZmZlciwgIldvcmQgQ2xvY2s6IE5vIExvY2tcbiIpOworCX0KKwkKKwl4ID0gc3RhdHVzICYgSERTUF9UaW1lY29kZVN5bmM7CisJaWYgKHN0YXR1cyAmIEhEU1BfVGltZWNvZGVMb2NrKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQgU3luYzogJXNcbiIsIHggPyAiU3luYyIgOiAiTG9jayIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQgU3luYzogTm8gTG9ja1xuIik7CisJfQorCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKKwkKKwkvKiBJbmZvcm1hdGlvbnMgYWJvdXQgSDk2MzIgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgeworCQljaGFyICp0bXA7CisJCisJCXN3aXRjaCAoaGRzcF9hZF9nYWluKGhkc3ApKSB7CisJCWNhc2UgMDoKKwkJCXRtcCA9ICItMTAgZEJWIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0bXAgPSAiKzQgZEJ1IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG1wID0gIkxvIEdhaW4iOworCQkJYnJlYWs7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQUQgR2FpbiA6ICVzXG4iLCB0bXApOworCisJCXN3aXRjaCAoaGRzcF9kYV9nYWluKGhkc3ApKSB7CisJCWNhc2UgMDoKKwkJCXRtcCA9ICJIaSBHYWluIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0bXAgPSAiKzQgZEJ1IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG1wID0gIi0xMCBkQlYiOworCQkJYnJlYWs7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiREEgR2FpbiA6ICVzXG4iLCB0bXApOworCQkKKwkJc3dpdGNoIChoZHNwX3Bob25lX2dhaW4oaGRzcCkpIHsKKwkJY2FzZSAwOgorCQkJdG1wID0gIjAgZEIiOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRtcCA9ICItNiBkQiI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRtcCA9ICItMTIgZEIiOworCQkJYnJlYWs7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUGhvbmVzIEdhaW4gOiAlc1xuIiwgdG1wKTsKKworCQlzbmRfaXByaW50ZihidWZmZXIsICJYTFIgQnJlYWtvdXQgQ2FibGUgOiAlc1xuIiwgaGRzcF94bHJfYnJlYWtvdXRfY2FibGUoaGRzcCkgPyAieWVzIiA6ICJubyIpOwkKKwkJCisJCWlmIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9BbmFsb2dFeHRlbnNpb25Cb2FyZCkgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiQUVCIDogb24gKEFEQVQxIGludGVybmFsKVxuIik7CisJCX0gZWxzZSB7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJBRUIgOiBvZmYgKEFEQVQxIGV4dGVybmFsKVxuIik7CisJCX0KKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9oZHNwX3Byb2NfaW5pdChoZHNwX3QgKmhkc3ApCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhoZHNwLT5jYXJkLCAiaGRzcCIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgaGRzcCwgMTAyNCwgc25kX2hkc3BfcHJvY19yZWFkKTsKK30KKworc3RhdGljIHZvaWQgc25kX2hkc3BfZnJlZV9idWZmZXJzKGhkc3BfdCAqaGRzcCkKK3sKKwlzbmRfaGFtbWVyZmFsbF9mcmVlX2J1ZmZlcigmaGRzcC0+Y2FwdHVyZV9kbWFfYnVmLCBoZHNwLT5wY2kpOworCXNuZF9oYW1tZXJmYWxsX2ZyZWVfYnVmZmVyKCZoZHNwLT5wbGF5YmFja19kbWFfYnVmLCBoZHNwLT5wY2kpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaGRzcF9pbml0aWFsaXplX21lbW9yeShoZHNwX3QgKmhkc3ApCit7CisJdW5zaWduZWQgbG9uZyBwYl9idXMsIGNiX2J1czsKKworCWlmIChzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKGhkc3AtPnBjaSwgJmhkc3AtPmNhcHR1cmVfZG1hX2J1ZiwgSERTUF9ETUFfQVJFQV9CWVRFUykgPCAwIHx8CisJICAgIHNuZF9oYW1tZXJmYWxsX2dldF9idWZmZXIoaGRzcC0+cGNpLCAmaGRzcC0+cGxheWJhY2tfZG1hX2J1ZiwgSERTUF9ETUFfQVJFQV9CWVRFUykgPCAwKSB7CisJCWlmIChoZHNwLT5jYXB0dXJlX2RtYV9idWYuYXJlYSkKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmaGRzcC0+Y2FwdHVyZV9kbWFfYnVmKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIGhkc3AtPmNhcmRfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEFsaWduIHRvIGJ1cy1zcGFjZSA2NEsgYm91bmRhcnkgKi8KKworCWNiX2J1cyA9IChoZHNwLT5jYXB0dXJlX2RtYV9idWYuYWRkciArIDB4RkZGRikgJiB+MHhGRkZGbDsKKwlwYl9idXMgPSAoaGRzcC0+cGxheWJhY2tfZG1hX2J1Zi5hZGRyICsgMHhGRkZGKSAmIH4weEZGRkZsOworCisJLyogVGVsbCB0aGUgY2FyZCB3aGVyZSBpdCBpcyAqLworCisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2lucHV0QnVmZmVyQWRkcmVzcywgY2JfYnVzKTsKKwloZHNwX3dyaXRlKGhkc3AsIEhEU1Bfb3V0cHV0QnVmZmVyQWRkcmVzcywgcGJfYnVzKTsKKworCWhkc3AtPmNhcHR1cmVfYnVmZmVyID0gaGRzcC0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEgKyAoY2JfYnVzIC0gaGRzcC0+Y2FwdHVyZV9kbWFfYnVmLmFkZHIpOworCWhkc3AtPnBsYXliYWNrX2J1ZmZlciA9IGhkc3AtPnBsYXliYWNrX2RtYV9idWYuYXJlYSArIChwYl9idXMgLSBoZHNwLT5wbGF5YmFja19kbWFfYnVmLmFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3Bfc2V0X2RlZmF1bHRzKGhkc3BfdCAqaGRzcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEFTU1VNUFRJT046IGhkc3AtPmxvY2sgaXMgZWl0aGVyIGhlbGQsIG9yCisJICAgdGhlcmUgaXMgbm8gbmVlZCB0byBob2xkIGl0IChlLmcuIGR1cmluZyBtb2R1bGUKKwkgICBpbml0YWxpemF0aW9uKS4KKwkgKi8KKworCS8qIHNldCBkZWZhdWx0czoKKworCSAgIFNQRElGIElucHV0IHZpYSBDb2F4IAorCSAgIE1hc3RlciBjbG9jayBtb2RlCisJICAgbWF4aW11bSBsYXRlbmN5ICg3ID0+IDJeNyA9IDgxOTIgc2FtcGxlcywgNjRLYnl0ZSBidWZmZXIsCisJICAgICAgICAgICAgICAgICAgICB3aGljaCBpbXBsaWVzIDIgNDA5NiBzYW1wbGUsIDMyS2J5dGUgcGVyaW9kcykuCisgICAgICAgICAgIEVuYWJsZSBsaW5lIG91dC4JCQkgICAgCisJICovCisKKwloZHNwLT5jb250cm9sX3JlZ2lzdGVyID0gSERTUF9DbG9ja01vZGVNYXN0ZXIgfCAKKwkJICAgICAgICAgICAgICAgICBIRFNQX1NQRElGSW5wdXRDb2F4aWFsIHwgCisJCSAgICAgICAgICAgICAgICAgaGRzcF9lbmNvZGVfbGF0ZW5jeSg3KSB8IAorCQkgICAgICAgICAgICAgICAgIEhEU1BfTGluZU91dDsKKwkKKworCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCisjaWZkZWYgU05EUlZfQklHX0VORElBTgorCWhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyID0gSERTUF9CSUdFTkRJQU5fTU9ERTsKKyNlbHNlCisJaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOworI2VuZGlmCisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIpIHsKKwkgICAgICAgIHNuZF9oZHNwXzk2NTJfZW5hYmxlX21peGVyIChoZHNwKTsKKwl9IGVsc2UgeworCSAgICBoZHNwX3dyaXRlIChoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBoZHNwLT5jb250cm9sMl9yZWdpc3Rlcik7CisJfSAKKworCWhkc3BfcmVzZXRfaHdfcG9pbnRlcihoZHNwKTsKKwloZHNwX2NvbXB1dGVfcGVyaW9kX3NpemUoaGRzcCk7CisKKwkvKiBzaWxlbmNlIGV2ZXJ5dGhpbmcgKi8KKwkKKwlmb3IgKGkgPSAwOyBpIDwgSERTUF9NQVRSSVhfTUlYRVJfU0laRTsgKytpKSB7CisJCWhkc3AtPm1peGVyX21hdHJpeFtpXSA9IE1JTlVTX0lORklOSVRZX0dBSU47CisJfQorCisJZm9yIChpID0gMDsgaSA8ICgoaGRzcC0+aW9fdHlwZSA9PSBIOTY1MiB8fCBoZHNwLT5pb190eXBlID09IEg5NjMyKSA/IDEzNTIgOiBIRFNQX01BVFJJWF9NSVhFUl9TSVpFKTsgKytpKSB7CisJCWlmIChoZHNwX3dyaXRlX2dhaW4gKGhkc3AsIGksIE1JTlVTX0lORklOSVRZX0dBSU4pKSB7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwkKKwkvKiBIOTYzMiBzcGVjaWZpYyBkZWZhdWx0cyAqLworCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyKSB7CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gKEhEU1BfREFHYWluUGx1czRkQnUgfCBIRFNQX0FER2FpblBsdXM0ZEJ1IHwgSERTUF9QaG9uZUdhaW4wZEIpOworCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwl9CisKKwkvKiBzZXQgYSBkZWZhdWx0IHJhdGUgc28gdGhhdCB0aGUgY2hhbm5lbCBtYXAgaXMgc2V0IHVwLgorCSAqLworCisJaGRzcF9zZXRfcmF0ZShoZHNwLCA0ODAwMCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRzcF9taWRpX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaGRzcF90ICpoZHNwID0gKGhkc3BfdCAqKWFyZzsKKwkKKwlpZiAoaGRzcC0+bWlkaVswXS5wZW5kaW5nKSB7CisJCXNuZF9oZHNwX21pZGlfaW5wdXRfcmVhZCAoJmhkc3AtPm1pZGlbMF0pOworCX0KKwlpZiAoaGRzcC0+bWlkaVsxXS5wZW5kaW5nKSB7CisJCXNuZF9oZHNwX21pZGlfaW5wdXRfcmVhZCAoJmhkc3AtPm1pZGlbMV0pOworCX0KK30gCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfaGRzcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwloZHNwX3QgKmhkc3AgPSAoaGRzcF90ICopIGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCBhdWRpbzsKKwlpbnQgbWlkaTA7CisJaW50IG1pZGkxOworCXVuc2lnbmVkIGludCBtaWRpMHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgbWlkaTFzdGF0dXM7CisJaW50IHNjaGVkdWxlID0gMDsKKwkKKwlzdGF0dXMgPSBoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXNSZWdpc3Rlcik7CisKKwlhdWRpbyA9IHN0YXR1cyAmIEhEU1BfYXVkaW9JUlFQZW5kaW5nOworCW1pZGkwID0gc3RhdHVzICYgSERTUF9taWRpMElSUVBlbmRpbmc7CisJbWlkaTEgPSBzdGF0dXMgJiBIRFNQX21pZGkxSVJRUGVuZGluZzsKKworCWlmICghYXVkaW8gJiYgIW1pZGkwICYmICFtaWRpMSkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ludGVycnVwdENvbmZpcm1hdGlvbiwgMCk7CisKKwltaWRpMHN0YXR1cyA9IGhkc3BfcmVhZCAoaGRzcCwgSERTUF9taWRpU3RhdHVzSW4wKSAmIDB4ZmY7CisJbWlkaTFzdGF0dXMgPSBoZHNwX3JlYWQgKGhkc3AsIEhEU1BfbWlkaVN0YXR1c0luMSkgJiAweGZmOworCQorCWlmIChhdWRpbykgeworCQlpZiAoaGRzcC0+Y2FwdHVyZV9zdWJzdHJlYW0pIHsKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoaGRzcC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKTsKKwkJfQorCQkKKwkJaWYgKGhkc3AtPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChoZHNwLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtKTsKKwkJfQorCX0KKwkKKwlpZiAobWlkaTAgJiYgbWlkaTBzdGF0dXMpIHsKKwkJaWYgKGhkc3AtPnVzZV9taWRpX3Rhc2tsZXQpIHsKKwkJCS8qIHdlIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyBpbnB1dCB1bnRpbCBwcm9jZXNzaW5nIGlzIGRvbmUgKi8KKwkJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BfTWlkaTBJbnRlcnJ1cHRFbmFibGU7CisJCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwkJCWhkc3AtPm1pZGlbMF0ucGVuZGluZyA9IDE7CisJCQlzY2hlZHVsZSA9IDE7CisJCX0gZWxzZSB7CisJCQlzbmRfaGRzcF9taWRpX2lucHV0X3JlYWQgKCZoZHNwLT5taWRpWzBdKTsKKwkJfQorCX0KKwlpZiAoaGRzcC0+aW9fdHlwZSAhPSBNdWx0aWZhY2UgJiYgaGRzcC0+aW9fdHlwZSAhPSBIOTYzMiAmJiBtaWRpMSAmJiBtaWRpMXN0YXR1cykgeworCQlpZiAoaGRzcC0+dXNlX21pZGlfdGFza2xldCkgeworCQkJLyogd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIGlucHV0IHVudGlsIHByb2Nlc3NpbmcgaXMgZG9uZSAqLworCQkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9NaWRpMUludGVycnVwdEVuYWJsZTsKKwkJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCQkJaGRzcC0+bWlkaVsxXS5wZW5kaW5nID0gMTsKKwkJCXNjaGVkdWxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9oZHNwX21pZGlfaW5wdXRfcmVhZCAoJmhkc3AtPm1pZGlbMV0pOworCQl9CisJfQorCWlmIChoZHNwLT51c2VfbWlkaV90YXNrbGV0ICYmIHNjaGVkdWxlKQorCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZoZHNwLT5taWRpX3Rhc2tsZXQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9oZHNwX2h3X3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gaGRzcF9od19wb2ludGVyKGhkc3ApOworfQorCitzdGF0aWMgY2hhciAqaGRzcF9jaGFubmVsX2J1ZmZlcl9sb2NhdGlvbihoZHNwX3QgKmhkc3AsCisJCQkJCSAgICAgaW50IHN0cmVhbSwKKwkJCQkJICAgICBpbnQgY2hhbm5lbCkKKworeworCWludCBtYXBwZWRfY2hhbm5lbDsKKworICAgICAgICBzbmRfYXNzZXJ0KGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgaGRzcC0+bWF4X2NoYW5uZWxzLCByZXR1cm4gTlVMTCk7CisgICAgICAgIAorCWlmICgobWFwcGVkX2NoYW5uZWwgPSBoZHNwLT5jaGFubmVsX21hcFtjaGFubmVsXSkgPCAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlyZXR1cm4gaGRzcC0+Y2FwdHVyZV9idWZmZXIgKyAobWFwcGVkX2NoYW5uZWwgKiBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaGRzcC0+cGxheWJhY2tfYnVmZmVyICsgKG1hcHBlZF9jaGFubmVsICogSERTUF9DSEFOTkVMX0JVRkZFUl9CWVRFUyk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3BsYXliYWNrX2NvcHkoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY2hhbm5lbCwKKwkJCQkgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKnNyYywgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNoYXIgKmNoYW5uZWxfYnVmOworCisJc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCwgcmV0dXJuIC1FSU5WQUwpOworCisJY2hhbm5lbF9idWYgPSBoZHNwX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChoZHNwLCBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwgY2hhbm5lbCk7CisJc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGNoYW5uZWxfYnVmICsgcG9zICogNCwgc3JjLCBjb3VudCAqIDQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfY2FwdHVyZV9jb3B5KHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCisJCQkJIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNoYXIgKmNoYW5uZWxfYnVmOworCisJc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCwgcmV0dXJuIC1FSU5WQUwpOworCisJY2hhbm5lbF9idWYgPSBoZHNwX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChoZHNwLCBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwgY2hhbm5lbCk7CisJc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKGNvcHlfdG9fdXNlcihkc3QsIGNoYW5uZWxfYnVmICsgcG9zICogNCwgY291bnQgKiA0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2h3X3NpbGVuY2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY2hhbm5lbCwKKwkJCQkgIHNuZF9wY21fdWZyYW1lc190IHBvcywgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNoYXIgKmNoYW5uZWxfYnVmOworCisJY2hhbm5lbF9idWYgPSBoZHNwX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChoZHNwLCBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwgY2hhbm5lbCk7CisJc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJbWVtc2V0KGNoYW5uZWxfYnVmICsgcG9zICogNCwgMCwgY291bnQgKiA0KTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcmVzZXQoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWhkc3BfdCAqaGRzcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpvdGhlcjsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJb3RoZXIgPSBoZHNwLT5jYXB0dXJlX3N1YnN0cmVhbTsKKwllbHNlCisJCW90aGVyID0gaGRzcC0+cGxheWJhY2tfc3Vic3RyZWFtOworCWlmIChoZHNwLT5ydW5uaW5nKQorCQlydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9IGhkc3BfaHdfcG9pbnRlcihoZHNwKTsKKwllbHNlCisJCXJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyID0gMDsKKwlpZiAob3RoZXIpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCQlzbmRfcGNtX3J1bnRpbWVfdCAqb3J1bnRpbWUgPSBvdGhlci0+cnVudGltZTsKKwkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgeworCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCQlpZiAocyA9PSBvdGhlcikgeworCQkJCW9ydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9IHJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcykKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IGVycjsKKwlwaWRfdCB0aGlzX3BpZDsKKwlwaWRfdCBvdGhlcl9waWQ7CisKKwlpZiAoaGRzcF9jaGVja19mb3JfaW9ib3ggKGhkc3ApKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChoZHNwX2NoZWNrX2Zvcl9maXJtd2FyZShoZHNwKSkgeworCQlpZiAoaGRzcC0+c3RhdGUgJiBIRFNQX0Zpcm13YXJlQ2FjaGVkKSB7CisJCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRmlybXdhcmUgbG9hZGluZyBmcm9tIGNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisKKwlpZiAoc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH4oSERTUF9TUERJRlByb2Zlc3Npb25hbCB8IEhEU1BfU1BESUZOb25BdWRpbyB8IEhEU1BfU1BESUZFbXBoYXNpcyk7CisJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gaGRzcC0+Y3JlZ19zcGRpZl9zdHJlYW0pOworCQl0aGlzX3BpZCA9IGhkc3AtPnBsYXliYWNrX3BpZDsKKwkJb3RoZXJfcGlkID0gaGRzcC0+Y2FwdHVyZV9waWQ7CisJfSBlbHNlIHsKKwkJdGhpc19waWQgPSBoZHNwLT5jYXB0dXJlX3BpZDsKKwkJb3RoZXJfcGlkID0gaGRzcC0+cGxheWJhY2tfcGlkOworCX0KKworCWlmICgob3RoZXJfcGlkID4gMCkgJiYgKHRoaXNfcGlkICE9IG90aGVyX3BpZCkpIHsKKworCQkvKiBUaGUgb3RoZXIgc3RyZWFtIGlzIG9wZW4sIGFuZCBub3QgYnkgdGhlIHNhbWUKKwkJICAgdGFzayBhcyB0aGlzIG9uZS4gTWFrZSBzdXJlIHRoYXQgdGhlIHBhcmFtZXRlcnMKKwkJICAgdGhhdCBtYXR0ZXIgYXJlIHRoZSBzYW1lLgorCQkgKi8KKworCQlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSAhPSBoZHNwLT5zeXN0ZW1fc2FtcGxlX3JhdGUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlpZiAocGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykgIT0gaGRzcC0+cGVyaW9kX2J5dGVzIC8gNCkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwkJCV9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQkvKiBXZSdyZSBmaW5lLiAqLworCisJCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisgCQlyZXR1cm4gMDsKKworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJfQorCisJLyogaG93IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByYXRlIG1hdGNoZXMgYW4gZXh0ZXJuYWxseS1zZXQgb25lID8KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWlmICgoZXJyID0gaGRzcF9zZXRfcmF0ZShoZHNwLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAwKSkgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJCV9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJfQorCisJaWYgKChlcnIgPSBoZHNwX3NldF9pbnRlcnJ1cHRfaW50ZXJ2YWwoaGRzcCwgcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykpKSA8IDApIHsKKwkJX3NuZF9wY21faHdfcGFyYW1fc2V0ZW1wdHkocGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NoYW5uZWxfaW5mbyhzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkJICAgIHNuZF9wY21fY2hhbm5lbF9pbmZvX3QgKmluZm8pCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCBtYXBwZWRfY2hhbm5lbDsKKworCXNuZF9hc3NlcnQoaW5mby0+Y2hhbm5lbCA8IGhkc3AtPm1heF9jaGFubmVscywgcmV0dXJuIC1FSU5WQUwpOworCisJaWYgKChtYXBwZWRfY2hhbm5lbCA9IGhkc3AtPmNoYW5uZWxfbWFwW2luZm8tPmNoYW5uZWxdKSA8IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+b2Zmc2V0ID0gbWFwcGVkX2NoYW5uZWwgKiBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTOworCWluZm8tPmZpcnN0ID0gMDsKKwlpbmZvLT5zdGVwID0gMzI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW9jdGwoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9JT0NUTDFfUkVTRVQ6CisJeworCQlyZXR1cm4gc25kX2hkc3BfcmVzZXQoc3Vic3RyZWFtKTsKKwl9CisJY2FzZSBTTkRSVl9QQ01fSU9DVEwxX0NIQU5ORUxfSU5GTzoKKwl7CisJCXNuZF9wY21fY2hhbm5lbF9pbmZvX3QgKmluZm8gPSBhcmc7CisJCXJldHVybiBzbmRfaGRzcF9jaGFubmVsX2luZm8oc3Vic3RyZWFtLCBpbmZvKTsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNuZF9wY21fbGliX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpvdGhlcjsKKwlpbnQgcnVubmluZzsKKwkKKwlpZiAoaGRzcF9jaGVja19mb3JfaW9ib3ggKGhkc3ApKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChoZHNwX2NoZWNrX2Zvcl9maXJtd2FyZShoZHNwKSkgeworCQlpZiAoaGRzcC0+c3RhdGUgJiBIRFNQX0Zpcm13YXJlQ2FjaGVkKSB7CisJCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRmlybXdhcmUgbG9hZGluZyBmcm9tIGNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrKCZoZHNwLT5sb2NrKTsKKwlydW5uaW5nID0gaGRzcC0+cnVubmluZzsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXJ1bm5pbmcgfD0gMSA8PCBzdWJzdHJlYW0tPnN0cmVhbTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlydW5uaW5nICY9IH4oMSA8PCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJc3Bpbl91bmxvY2soJmhkc3AtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCW90aGVyID0gaGRzcC0+Y2FwdHVyZV9zdWJzdHJlYW07CisJZWxzZQorCQlvdGhlciA9IGhkc3AtPnBsYXliYWNrX3N1YnN0cmVhbTsKKworCWlmIChvdGhlcikgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCXNuZF9wY21fc3Vic3RyZWFtX3QgKnM7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKKwkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQkJaWYgKHMgPT0gb3RoZXIpIHsKKwkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOworCQkJCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpCisJCQkJCXJ1bm5pbmcgfD0gMSA8PCBzLT5zdHJlYW07CisJCQkJZWxzZQorCQkJCQlydW5uaW5nICY9IH4oMSA8PCBzLT5zdHJlYW0pOworCQkJCWdvdG8gX29rOworCQkJfQorCQl9CisJCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpIHsKKwkJCWlmICghKHJ1bm5pbmcgJiAoMSA8PCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSkgJiYKKwkJCSAgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQkJaGRzcF9zaWxlbmNlX3BsYXliYWNrKGhkc3ApOworCQl9IGVsc2UgeworCQkJaWYgKHJ1bm5pbmcgJiYKKwkJCSAgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQkJCWhkc3Bfc2lsZW5jZV9wbGF5YmFjayhoZHNwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQkJaGRzcF9zaWxlbmNlX3BsYXliYWNrKGhkc3ApOworCX0KKyBfb2s6CisJc25kX3BjbV90cmlnZ2VyX2RvbmUoc3Vic3RyZWFtLCBzdWJzdHJlYW0pOworCWlmICghaGRzcC0+cnVubmluZyAmJiBydW5uaW5nKQorCQloZHNwX3N0YXJ0X2F1ZGlvKGhkc3ApOworCWVsc2UgaWYgKGhkc3AtPnJ1bm5pbmcgJiYgIXJ1bm5pbmcpCisJCWhkc3Bfc3RvcF9hdWRpbyhoZHNwKTsKKwloZHNwLT5ydW5uaW5nID0gcnVubmluZzsKKwlzcGluX3VubG9jaygmaGRzcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoaGRzcF9jaGVja19mb3JfaW9ib3ggKGhkc3ApKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChoZHNwX2NoZWNrX2Zvcl9maXJtd2FyZShoZHNwKSkgeworCQlpZiAoaGRzcC0+c3RhdGUgJiBIRFNQX0Zpcm13YXJlQ2FjaGVkKSB7CisJCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRmlybXdhcmUgbG9hZGluZyBmcm9tIGNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJaWYgKCFoZHNwLT5ydW5uaW5nKQorCQloZHNwX3Jlc2V0X2h3X3BvaW50ZXIoaGRzcCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9oZHNwX3BsYXliYWNrX3N1YmluZm8gPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19OT05JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19ET1VCTEUpLAorI2lmZGVmIFNORFJWX0JJR19FTkRJQU4KKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSwKKyNlbHNlCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisjZW5kaWYKKwkucmF0ZXMgPQkJKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfNjQwMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfODgyMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfOTYwMDApLAorCS5yYXRlX21pbiA9CQkzMjAwMCwKKwkucmF0ZV9tYXggPQkJOTYwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxNCwKKwkuY2hhbm5lbHNfbWF4ID0JCUhEU1BfTUFYX0NIQU5ORUxTLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JSERTUF9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BfTUFYX0NIQU5ORUxTLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JKDY0ICogNCkgKiAxMCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg4MTkyICogNCkgKiBIRFNQX01BWF9DSEFOTkVMUywKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX2hkc3BfY2FwdHVyZV9zdWJpbmZvID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTk9OSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKyNpZmRlZiBTTkRSVl9CSUdfRU5ESUFOCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfQkUsCisjZWxzZQorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorI2VuZGlmCisJLnJhdGVzID0JCShTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzY0MDAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzk2MDAwKSwKKwkucmF0ZV9taW4gPQkJMzIwMDAsCisJLnJhdGVfbWF4ID0JCTk2MDAwLAorCS5jaGFubmVsc19taW4gPQkJMTQsCisJLmNoYW5uZWxzX21heCA9CQlIRFNQX01BWF9DSEFOTkVMUywKKwkuYnVmZmVyX2J5dGVzX21heCA9CUhEU1BfQ0hBTk5FTF9CVUZGRVJfQllURVMgKiBIRFNQX01BWF9DSEFOTkVMUywKKwkucGVyaW9kX2J5dGVzX21pbiA9CSg2NCAqIDQpICogMTAsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoODE5MiAqIDQpICogSERTUF9NQVhfQ0hBTk5FTFMsCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTIsCisJLmZpZm9fc2l6ZSA9CQkwCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGhkc3BfcGVyaW9kX3NpemVzW10gPSB7IDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyIH07CisKK3N0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGhkc3BfaHdfY29uc3RyYWludHNfcGVyaW9kX3NpemVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoaGRzcF9wZXJpb2Rfc2l6ZXMpLAorCS5saXN0ID0gaGRzcF9wZXJpb2Rfc2l6ZXMsCisJLm1hc2sgPSAwCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGhkc3BfOTYzMl9zYW1wbGVfcmF0ZXNbXSA9IHsgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMCwgMTI4MDAwLCAxNzY0MDAsIDE5MjAwMCB9OworCitzdGF0aWMgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdCBoZHNwX2h3X2NvbnN0cmFpbnRzXzk2MzJfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoaGRzcF85NjMyX3NhbXBsZV9yYXRlcyksCisJLmxpc3QgPSBoZHNwXzk2MzJfc2FtcGxlX3JhdGVzLAorCS5tYXNrID0gMAorfTsKKworc3RhdGljIGludCBzbmRfaGRzcF9od19ydWxlX2luX2NoYW5uZWxzKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCQkJc25kX3BjbV9od19ydWxlX3QgKnJ1bGUpCit7CisJaGRzcF90ICpoZHNwID0gcnVsZS0+cHJpdmF0ZTsKKwlzbmRfaW50ZXJ2YWxfdCAqYyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgeworCQl1bnNpZ25lZCBpbnQgbGlzdFszXTsKKwkJbGlzdFswXSA9IGhkc3AtPnFzX2luX2NoYW5uZWxzOworCQlsaXN0WzFdID0gaGRzcC0+ZHNfaW5fY2hhbm5lbHM7CisJCWxpc3RbMl0gPSBoZHNwLT5zc19pbl9jaGFubmVsczsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KGMsIDMsIGxpc3QsIDApOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBsaXN0WzJdOworCQlsaXN0WzBdID0gaGRzcC0+ZHNfaW5fY2hhbm5lbHM7CisJCWxpc3RbMV0gPSBoZHNwLT5zc19pbl9jaGFubmVsczsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KGMsIDIsIGxpc3QsIDApOworCX0KK30KKworc3RhdGljIGludCBzbmRfaGRzcF9od19ydWxlX291dF9jaGFubmVscyhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkJCXNuZF9wY21faHdfcnVsZV90ICpydWxlKQoreworCXVuc2lnbmVkIGludCBsaXN0WzNdOworCWhkc3BfdCAqaGRzcCA9IHJ1bGUtPnByaXZhdGU7CisJc25kX2ludGVydmFsX3QgKmMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJbGlzdFswXSA9IGhkc3AtPnFzX291dF9jaGFubmVsczsKKwkJbGlzdFsxXSA9IGhkc3AtPmRzX291dF9jaGFubmVsczsKKwkJbGlzdFsyXSA9IGhkc3AtPnNzX291dF9jaGFubmVsczsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KGMsIDMsIGxpc3QsIDApOworCX0gZWxzZSB7CisJCWxpc3RbMF0gPSBoZHNwLT5kc19vdXRfY2hhbm5lbHM7CisJCWxpc3RbMV0gPSBoZHNwLT5zc19vdXRfY2hhbm5lbHM7CisJfQorCXJldHVybiBzbmRfaW50ZXJ2YWxfbGlzdChjLCAyLCBsaXN0LCAwKTsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9od19ydWxlX2luX2NoYW5uZWxzX3JhdGUoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCQkgICAgIHNuZF9wY21faHdfcnVsZV90ICpydWxlKQoreworCWhkc3BfdCAqaGRzcCA9IHJ1bGUtPnByaXZhdGU7CisJc25kX2ludGVydmFsX3QgKmMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJc25kX2ludGVydmFsX3QgKnIgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlpZiAoci0+bWluID4gOTYwMDAgJiYgaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgeworCQlzbmRfaW50ZXJ2YWxfdCB0ID0geworCQkJLm1pbiA9IGhkc3AtPnFzX2luX2NoYW5uZWxzLAorCQkJLm1heCA9IGhkc3AtPnFzX2luX2NoYW5uZWxzLAorCQkJLmludGVnZXIgPSAxLAorCQl9OworCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShjLCAmdCk7CQorCX0gZWxzZSBpZiAoci0+bWluID4gNDgwMDAgJiYgci0+bWF4IDw9IDk2MDAwKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gaGRzcC0+ZHNfaW5fY2hhbm5lbHMsCisJCQkubWF4ID0gaGRzcC0+ZHNfaW5fY2hhbm5lbHMsCisJCQkuaW50ZWdlciA9IDEsCisJCX07CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKGMsICZ0KTsKKwl9IGVsc2UgaWYgKHItPm1heCA8IDY0MDAwKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gaGRzcC0+c3NfaW5fY2hhbm5lbHMsCisJCQkubWF4ID0gaGRzcC0+c3NfaW5fY2hhbm5lbHMsCisJCQkuaW50ZWdlciA9IDEsCisJCX07CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKGMsICZ0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaHdfcnVsZV9vdXRfY2hhbm5lbHNfcmF0ZShzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkJCSAgICAgc25kX3BjbV9od19ydWxlX3QgKnJ1bGUpCit7CisJaGRzcF90ICpoZHNwID0gcnVsZS0+cHJpdmF0ZTsKKwlzbmRfaW50ZXJ2YWxfdCAqYyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlzbmRfaW50ZXJ2YWxfdCAqciA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCWlmIChyLT5taW4gPiA5NjAwMCAmJiBoZHNwLT5pb190eXBlID09IEg5NjMyKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gaGRzcC0+cXNfb3V0X2NoYW5uZWxzLAorCQkJLm1heCA9IGhkc3AtPnFzX291dF9jaGFubmVscywKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUoYywgJnQpOwkKKwl9IGVsc2UgaWYgKHItPm1pbiA+IDQ4MDAwICYmIHItPm1heCA8PSA5NjAwMCkgeworCQlzbmRfaW50ZXJ2YWxfdCB0ID0geworCQkJLm1pbiA9IGhkc3AtPmRzX291dF9jaGFubmVscywKKwkJCS5tYXggPSBoZHNwLT5kc19vdXRfY2hhbm5lbHMsCisJCQkuaW50ZWdlciA9IDEsCisJCX07CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKGMsICZ0KTsKKwl9IGVsc2UgaWYgKHItPm1heCA8IDY0MDAwKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gaGRzcC0+c3Nfb3V0X2NoYW5uZWxzLAorCQkJLm1heCA9IGhkc3AtPnNzX291dF9jaGFubmVscywKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUoYywgJnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9od19ydWxlX3JhdGVfb3V0X2NoYW5uZWxzKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCQkJICAgICBzbmRfcGNtX2h3X3J1bGVfdCAqcnVsZSkKK3sKKwloZHNwX3QgKmhkc3AgPSBydWxlLT5wcml2YXRlOworCXNuZF9pbnRlcnZhbF90ICpjID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCXNuZF9pbnRlcnZhbF90ICpyID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJaWYgKGMtPm1pbiA+PSBoZHNwLT5zc19vdXRfY2hhbm5lbHMpIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSAzMjAwMCwKKwkJCS5tYXggPSA0ODAwMCwKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUociwgJnQpOworCX0gZWxzZSBpZiAoYy0+bWF4IDw9IGhkc3AtPnFzX291dF9jaGFubmVscyAmJiBoZHNwLT5pb190eXBlID09IEg5NjMyKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gMTI4MDAwLAorCQkJLm1heCA9IDE5MjAwMCwKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUociwgJnQpOworCX0gZWxzZSBpZiAoYy0+bWF4IDw9IGhkc3AtPmRzX291dF9jaGFubmVscykgeworCQlzbmRfaW50ZXJ2YWxfdCB0ID0geworCQkJLm1pbiA9IDY0MDAwLAorCQkJLm1heCA9IDk2MDAwLAorCQkJLmludGVnZXIgPSAxLAorCQl9OworCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShyLCAmdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2h3X3J1bGVfcmF0ZV9pbl9jaGFubmVscyhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkJCSAgICAgc25kX3BjbV9od19ydWxlX3QgKnJ1bGUpCit7CisJaGRzcF90ICpoZHNwID0gcnVsZS0+cHJpdmF0ZTsKKwlzbmRfaW50ZXJ2YWxfdCAqYyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlzbmRfaW50ZXJ2YWxfdCAqciA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCWlmIChjLT5taW4gPj0gaGRzcC0+c3NfaW5fY2hhbm5lbHMpIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSAzMjAwMCwKKwkJCS5tYXggPSA0ODAwMCwKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUociwgJnQpOworCX0gZWxzZSBpZiAoYy0+bWF4IDw9IGhkc3AtPnFzX2luX2NoYW5uZWxzICYmIGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSAxMjgwMDAsCisJCQkubWF4ID0gMTkyMDAwLAorCQkJLmludGVnZXIgPSAxLAorCQl9OworCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShyLCAmdCk7CisJfSBlbHNlIGlmIChjLT5tYXggPD0gaGRzcC0+ZHNfaW5fY2hhbm5lbHMpIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSA2NDAwMCwKKwkJCS5tYXggPSA5NjAwMCwKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUociwgJnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwloZHNwX3QgKmhkc3AgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoaGRzcF9jaGVja19mb3JfaW9ib3ggKGhkc3ApKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChoZHNwX2NoZWNrX2Zvcl9maXJtd2FyZShoZHNwKSkgeworCQlpZiAoaGRzcC0+c3RhdGUgJiBIRFNQX0Zpcm13YXJlQ2FjaGVkKSB7CisJCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRmlybXdhcmUgbG9hZGluZyBmcm9tIGNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisKKyAgICAgICAgcnVudGltZS0+aHcgPSBzbmRfaGRzcF9wbGF5YmFja19zdWJpbmZvOworCXJ1bnRpbWUtPmRtYV9hcmVhID0gaGRzcC0+cGxheWJhY2tfYnVmZmVyOworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IEhEU1BfRE1BX0FSRUFfQllURVM7CisKKwloZHNwLT5wbGF5YmFja19waWQgPSBjdXJyZW50LT5waWQ7CisJaGRzcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMocnVudGltZSwgMCwgMzIsIDI0KTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsICZoZHNwX2h3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplcyk7CisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGRzcC0+cXNfb3V0X2NoYW5uZWxzOworCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoZHNwLT5zc19vdXRfY2hhbm5lbHM7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gMTkyMDAwOworCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1Q7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaGRzcF9od19jb25zdHJhaW50c185NjMyX3NhbXBsZV9yYXRlcyk7CisJfQorCQorCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJICAgICBzbmRfaGRzcF9od19ydWxlX291dF9jaGFubmVscywgaGRzcCwKKwkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCisJCQkgICAgIHNuZF9oZHNwX2h3X3J1bGVfb3V0X2NoYW5uZWxzX3JhdGUsIGhkc3AsCisJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCSAgICAgc25kX2hkc3BfaHdfcnVsZV9yYXRlX291dF9jaGFubmVscywgaGRzcCwKKwkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisKKwloZHNwLT5jcmVnX3NwZGlmX3N0cmVhbSA9IGhkc3AtPmNyZWdfc3BkaWY7CisJaGRzcC0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShoZHNwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmaGRzcC0+c3BkaWZfY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcGxheWJhY2tfcmVsZWFzZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisKKwloZHNwLT5wbGF5YmFja19waWQgPSAtMTsKKwloZHNwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKworCWhkc3AtPnNwZGlmX2N0bC0+dmRbMF0uYWNjZXNzIHw9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShoZHNwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmaGRzcC0+c3BkaWZfY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbmRfaGRzcF9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCWhkc3BfdCAqaGRzcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWlmIChoZHNwX2NoZWNrX2Zvcl9pb2JveCAoaGRzcCkpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGhkc3BfY2hlY2tfZm9yX2Zpcm13YXJlKGhkc3ApKSB7CisJCWlmIChoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVDYWNoZWQpIHsKKwkJCWlmIChzbmRfaGRzcF9sb2FkX2Zpcm13YXJlX2Zyb21fY2FjaGUoaGRzcCkgIT0gMCkgeworCQkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBGaXJtd2FyZSBsb2FkaW5nIGZyb20gY2FjaGUgZmFpbGVkLCBwbGVhc2UgdXBsb2FkIG1hbnVhbGx5LlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogTm8gZmlybXdhcmUgbG9hZGVkIG5vciBjYWNoZWQsIHBsZWFzZSB1cGxvYWQgZmlybXdhcmUuXG4iKTsKKwkJfQorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKworCXJ1bnRpbWUtPmh3ID0gc25kX2hkc3BfY2FwdHVyZV9zdWJpbmZvOworCXJ1bnRpbWUtPmRtYV9hcmVhID0gaGRzcC0+Y2FwdHVyZV9idWZmZXI7CisJcnVudGltZS0+ZG1hX2J5dGVzID0gSERTUF9ETUFfQVJFQV9CWVRFUzsKKworCWhkc3AtPmNhcHR1cmVfcGlkID0gY3VycmVudC0+cGlkOworCWhkc3AtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMocnVudGltZSwgMCwgMzIsIDI0KTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsICZoZHNwX2h3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplcyk7CisJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGRzcC0+cXNfaW5fY2hhbm5lbHM7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGhkc3AtPnNzX2luX2NoYW5uZWxzOworCQlydW50aW1lLT5ody5yYXRlX21heCA9IDE5MjAwMDsKKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UOworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmhkc3BfaHdfY29uc3RyYWludHNfOTYzMl9zYW1wbGVfcmF0ZXMpOworCX0KKwlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJCSAgICAgc25kX2hkc3BfaHdfcnVsZV9pbl9jaGFubmVscywgaGRzcCwKKwkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCisJCQkgICAgIHNuZF9oZHNwX2h3X3J1bGVfaW5fY2hhbm5lbHNfcmF0ZSwgaGRzcCwKKwkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsIC0xKTsKKwlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJICAgICBzbmRfaGRzcF9od19ydWxlX3JhdGVfaW5fY2hhbm5lbHMsIGhkc3AsCisJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2NhcHR1cmVfcmVsZWFzZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJaGRzcF90ICpoZHNwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisKKwloZHNwLT5jYXB0dXJlX3BpZCA9IC0xOworCWhkc3AtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaHdkZXBfZHVtbXlfb3Aoc25kX2h3ZGVwX3QgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiB3ZSBoYXZlIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZSBidXQgdGhlIGNhbGwgaXMgcmVxdWlyZWQgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb3B5aW5nIG1ldGVyIHZhbHVlcyAqLworc3RhdGljIGlubGluZSBpbnQgY29weV91MzJfbGUodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjKQoreworCXUzMiB2YWwgPSByZWFkbChzcmMpOworCXJldHVybiBjb3B5X3RvX3VzZXIoZGVzdCwgJnZhbCwgNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfdTY0X2xlKHZvaWQgX191c2VyICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyY19sb3csIHZvaWQgX19pb21lbSAqc3JjX2hpZ2gpCit7CisJdTMyIHJtc19sb3csIHJtc19oaWdoOworCXU2NCBybXM7CisJcm1zX2xvdyA9IHJlYWRsKHNyY19sb3cpOworCXJtc19oaWdoID0gcmVhZGwoc3JjX2hpZ2gpOworCXJtcyA9ICgodTY0KXJtc19oaWdoIDw8IDMyKSB8IHJtc19sb3c7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihkZXN0LCAmcm1zLCA4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29weV91NDhfbGUodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjX2xvdywgdm9pZCBfX2lvbWVtICpzcmNfaGlnaCkKK3sKKwl1MzIgcm1zX2xvdywgcm1zX2hpZ2g7CisJdTY0IHJtczsKKwlybXNfbG93ID0gcmVhZGwoc3JjX2xvdykgJiAweGZmZmZmZjAwOworCXJtc19oaWdoID0gcmVhZGwoc3JjX2hpZ2gpICYgMHhmZmZmZmYwMDsKKwlybXMgPSAoKHU2NClybXNfaGlnaCA8PCAzMikgfCBybXNfbG93OworCXJldHVybiBjb3B5X3RvX3VzZXIoZGVzdCwgJnJtcywgOCk7Cit9CisKK3N0YXRpYyBpbnQgaGRzcF85NjUyX2dldF9wZWFrKGhkc3BfdCAqaGRzcCwgaGRzcF9wZWFrX3Jtc190IF9fdXNlciAqcGVha19ybXMpCit7CisJaW50IGRvdWJsZXNwZWVkID0gMDsKKwlpbnQgaSwgaiwgY2hhbm5lbHMsIG9mczsKKworCWlmIChoZHNwX3JlYWQgKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpICYgSERTUF9Eb3VibGVTcGVlZFN0YXR1cykKKwkJZG91Ymxlc3BlZWQgPSAxOworCWNoYW5uZWxzID0gZG91Ymxlc3BlZWQgPyAxNCA6IDI2OworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjY7ICsraSkgeworCQlpZiAoZG91Ymxlc3BlZWQgJiYgKGkgJiA0KSkKKwkJCWNvbnRpbnVlOworCQlvZnMgPSBIRFNQXzk2NTJfcGVha0Jhc2UgLSBqICogNDsKKwkJaWYgKGNvcHlfdTMyX2xlKCZwZWFrX3Jtcy0+aW5wdXRfcGVha3NbaV0sIGhkc3AtPmlvYmFzZSArIG9mcykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb2ZzIC09IGNoYW5uZWxzICogNDsKKwkJaWYgKGNvcHlfdTMyX2xlKCZwZWFrX3Jtcy0+cGxheWJhY2tfcGVha3NbaV0sIGhkc3AtPmlvYmFzZSArIG9mcykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb2ZzIC09IGNoYW5uZWxzICogNDsKKwkJaWYgKGNvcHlfdTMyX2xlKCZwZWFrX3Jtcy0+b3V0cHV0X3BlYWtzW2ldLCBoZHNwLT5pb2Jhc2UgKyBvZnMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mcyA9IEhEU1BfOTY1Ml9ybXNCYXNlICsgaiAqIDg7CisJCWlmIChjb3B5X3U0OF9sZSgmcGVha19ybXMtPmlucHV0X3Jtc1tpXSwgaGRzcC0+aW9iYXNlICsgb2ZzLAorCQkJCWhkc3AtPmlvYmFzZSArIG9mcyArIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mcyArPSBjaGFubmVscyAqIDg7CisJCWlmIChjb3B5X3U0OF9sZSgmcGVha19ybXMtPnBsYXliYWNrX3Jtc1tpXSwgaGRzcC0+aW9iYXNlICsgb2ZzLAorCQkJCWhkc3AtPmlvYmFzZSArIG9mcyArIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mcyArPSBjaGFubmVscyAqIDg7CisJCWlmIChjb3B5X3U0OF9sZSgmcGVha19ybXMtPm91dHB1dF9ybXNbaV0sIGhkc3AtPmlvYmFzZSArIG9mcywKKwkJCQloZHNwLT5pb2Jhc2UgKyBvZnMgKyA0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlqKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3BfOTYzMl9nZXRfcGVhayhoZHNwX3QgKmhkc3AsIGhkc3BfcGVha19ybXNfdCBfX3VzZXIgKnBlYWtfcm1zKQoreworCWludCBpLCBqOworCWhkc3BfOTYzMl9tZXRlcnNfdCBfX2lvbWVtICptOworCWludCBkb3VibGVzcGVlZCA9IDA7CisKKwlpZiAoaGRzcF9yZWFkIChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfRG91YmxlU3BlZWRTdGF0dXMpCisJCWRvdWJsZXNwZWVkID0gMTsKKwltID0gKGhkc3BfOTYzMl9tZXRlcnNfdCBfX2lvbWVtICopKGhkc3AtPmlvYmFzZStIRFNQXzk2MzJfbWV0ZXJzQmFzZSk7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAxNjsgKytpLCArK2opIHsKKwkJaWYgKGNvcHlfdTMyX2xlKCZwZWFrX3Jtcy0+aW5wdXRfcGVha3NbaV0sICZtLT5pbnB1dF9wZWFrW2pdKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV91MzJfbGUoJnBlYWtfcm1zLT5wbGF5YmFja19wZWFrc1tpXSwgJm0tPnBsYXliYWNrX3BlYWtbal0pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X3UzMl9sZSgmcGVha19ybXMtPm91dHB1dF9wZWFrc1tpXSwgJm0tPm91dHB1dF9wZWFrW2pdKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV91NjRfbGUoJnBlYWtfcm1zLT5pbnB1dF9ybXNbaV0sICZtLT5pbnB1dF9ybXNfbG93W2pdLAorCQkJCSZtLT5pbnB1dF9ybXNfaGlnaFtqXSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdTY0X2xlKCZwZWFrX3Jtcy0+cGxheWJhY2tfcm1zW2ldLCAmbS0+cGxheWJhY2tfcm1zX2xvd1tqXSwKKwkJCQkmbS0+cGxheWJhY2tfcm1zX2hpZ2hbal0pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X3U2NF9sZSgmcGVha19ybXMtPm91dHB1dF9ybXNbaV0sICZtLT5vdXRwdXRfcm1zX2xvd1tqXSwKKwkJCQkmbS0+b3V0cHV0X3Jtc19oaWdoW2pdKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZG91Ymxlc3BlZWQgJiYgaSA9PSAzKSBpICs9IDQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3BfZ2V0X3BlYWsoaGRzcF90ICpoZHNwLCBoZHNwX3BlYWtfcm1zX3QgX191c2VyICpwZWFrX3JtcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKSB7CisJCWlmIChjb3B5X3UzMl9sZSgmcGVha19ybXMtPnBsYXliYWNrX3BlYWtzW2ldLAorCQkJCWhkc3AtPmlvYmFzZSArIEhEU1BfcGxheWJhY2tQZWFrTGV2ZWwgKyBpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdTMyX2xlKCZwZWFrX3Jtcy0+aW5wdXRfcGVha3NbaV0sCisJCQkJaGRzcC0+aW9iYXNlICsgSERTUF9pbnB1dFBlYWtMZXZlbCArIGkgKiA0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMjg7IGkrKykgeworCQlpZiAoY29weV91MzJfbGUoJnBlYWtfcm1zLT5vdXRwdXRfcGVha3NbaV0sCisJCQkJaGRzcC0+aW9iYXNlICsgSERTUF9vdXRwdXRQZWFrTGV2ZWwgKyBpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI2OyArK2kpIHsKKwkJaWYgKGNvcHlfdTY0X2xlKCZwZWFrX3Jtcy0+cGxheWJhY2tfcm1zW2ldLAorCQkJCWhkc3AtPmlvYmFzZSArIEhEU1BfcGxheWJhY2tSbXNMZXZlbCArIGkgKiA4ICsgNCwKKwkJCQloZHNwLT5pb2Jhc2UgKyBIRFNQX3BsYXliYWNrUm1zTGV2ZWwgKyBpICogOCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdTY0X2xlKCZwZWFrX3Jtcy0+aW5wdXRfcm1zW2ldLCAKKwkJCQloZHNwLT5pb2Jhc2UgKyBIRFNQX2lucHV0Um1zTGV2ZWwgKyBpICogOCArIDQsCisJCQkJaGRzcC0+aW9iYXNlICsgSERTUF9pbnB1dFJtc0xldmVsICsgaSAqIDgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2h3ZGVwX2lvY3RsKHNuZF9od2RlcF90ICpodywgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWhkc3BfdCAqaGRzcCA9IChoZHNwX3QgKilody0+cHJpdmF0ZV9kYXRhOwkKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9QRUFLX1JNUzogeworCQloZHNwX3BlYWtfcm1zX3QgX191c2VyICpwZWFrX3JtcyA9IChoZHNwX3BlYWtfcm1zX3QgX191c2VyICopYXJnOworCisJCWlmICghKGhkc3AtPnN0YXRlICYgSERTUF9GaXJtd2FyZUxvYWRlZCkpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBuZWVkcyB0byBiZSB1cGxvYWRlZCB0byB0aGUgY2FyZC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGhkc3AtPmlvX3R5cGUpIHsKKwkJY2FzZSBIOTY1MjoKKwkJCXJldHVybiBoZHNwXzk2NTJfZ2V0X3BlYWsoaGRzcCwgcGVha19ybXMpOworCQljYXNlIEg5NjMyOgorCQkJcmV0dXJuIGhkc3BfOTYzMl9nZXRfcGVhayhoZHNwLCBwZWFrX3Jtcyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gaGRzcF9nZXRfcGVhayhoZHNwLCBwZWFrX3Jtcyk7CisJCX0KKwl9CisJY2FzZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9DT05GSUdfSU5GTzogeworCQloZHNwX2NvbmZpZ19pbmZvX3QgaW5mbzsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IGk7CisJCQorCQlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVMb2FkZWQpKSB7CisJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRmlybXdhcmUgbmVlZHMgdG8gYmUgdXBsb2FkZWQgdG8gdGhlIGNhcmQuXG4iKTsJCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGRzcC0+bG9jaywgZmxhZ3MpOworCQlpbmZvLnByZWZfc3luY19yZWYgPSAodW5zaWduZWQgY2hhciloZHNwX3ByZWZfc3luY19yZWYoaGRzcCk7CisJCWluZm8ud29yZGNsb2NrX3N5bmNfY2hlY2sgPSAodW5zaWduZWQgY2hhciloZHNwX3djX3N5bmNfY2hlY2soaGRzcCk7CisJCWlmIChoZHNwLT5pb190eXBlICE9IEg5NjMyKSB7CisJCSAgICBpbmZvLmFkYXRzeW5jX3N5bmNfY2hlY2sgPSAodW5zaWduZWQgY2hhciloZHNwX2FkYXRzeW5jX3N5bmNfY2hlY2soaGRzcCk7CisJCX0KKwkJaW5mby5zcGRpZl9zeW5jX2NoZWNrID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9zcGRpZl9zeW5jX2NoZWNrKGhkc3ApOworCQlmb3IgKGkgPSAwOyBpIDwgKChoZHNwLT5pb190eXBlICE9IE11bHRpZmFjZSAmJiBoZHNwLT5pb190eXBlICE9IEg5NjMyKSA/IDMgOiAxKTsgKytpKSB7CisJCQlpbmZvLmFkYXRfc3luY19jaGVja1tpXSA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfYWRhdF9zeW5jX2NoZWNrKGhkc3AsIGkpOworCQl9CisJCWluZm8uc3BkaWZfaW4gPSAodW5zaWduZWQgY2hhciloZHNwX3NwZGlmX2luKGhkc3ApOworCQlpbmZvLnNwZGlmX291dCA9ICh1bnNpZ25lZCBjaGFyKWhkc3Bfc3BkaWZfb3V0KGhkc3ApOworCQlpbmZvLnNwZGlmX3Byb2Zlc3Npb25hbCA9ICh1bnNpZ25lZCBjaGFyKWhkc3Bfc3BkaWZfcHJvZmVzc2lvbmFsKGhkc3ApOworCQlpbmZvLnNwZGlmX2VtcGhhc2lzID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9zcGRpZl9lbXBoYXNpcyhoZHNwKTsKKwkJaW5mby5zcGRpZl9ub25hdWRpbyA9ICh1bnNpZ25lZCBjaGFyKWhkc3Bfc3BkaWZfbm9uYXVkaW8oaGRzcCk7CisJCWluZm8uc3BkaWZfc2FtcGxlX3JhdGUgPSBoZHNwX3NwZGlmX3NhbXBsZV9yYXRlKGhkc3ApOworCQlpbmZvLnN5c3RlbV9zYW1wbGVfcmF0ZSA9IGhkc3AtPnN5c3RlbV9zYW1wbGVfcmF0ZTsKKwkJaW5mby5hdXRvc3luY19zYW1wbGVfcmF0ZSA9IGhkc3BfZXh0ZXJuYWxfc2FtcGxlX3JhdGUoaGRzcCk7CisJCWluZm8uc3lzdGVtX2Nsb2NrX21vZGUgPSAodW5zaWduZWQgY2hhciloZHNwX3N5c3RlbV9jbG9ja19tb2RlKGhkc3ApOworCQlpbmZvLmNsb2NrX3NvdXJjZSA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfY2xvY2tfc291cmNlKGhkc3ApOworCQlpbmZvLmF1dG9zeW5jX3JlZiA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApOworCQlpbmZvLmxpbmVfb3V0ID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9saW5lX291dChoZHNwKTsKKwkJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2MzIpIHsKKwkJCWluZm8uZGFfZ2FpbiA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfZGFfZ2FpbihoZHNwKTsKKwkJCWluZm8uYWRfZ2FpbiA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfYWRfZ2FpbihoZHNwKTsKKwkJCWluZm8ucGhvbmVfZ2FpbiA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfcGhvbmVfZ2FpbihoZHNwKTsKKwkJCWluZm8ueGxyX2JyZWFrb3V0X2NhYmxlID0gKHVuc2lnbmVkIGNoYXIpaGRzcF94bHJfYnJlYWtvdXRfY2FibGUoaGRzcCk7CisJCQorCQl9CisJCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyIHx8IGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIpIHsKKwkJCWluZm8uYW5hbG9nX2V4dGVuc2lvbl9ib2FyZCA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfYWViKGhkc3ApOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkc3AtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJY2FzZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF85NjMyX0FFQjogeworCQloZHNwXzk2MzJfYWViX3QgaDk2MzJfYWViOworCQkKKwkJaWYgKGhkc3AtPmlvX3R5cGUgIT0gSDk2MzIpIHJldHVybiAtRUlOVkFMOworCQloOTYzMl9hZWIuYWViaSA9IGhkc3AtPnNzX2luX2NoYW5uZWxzIC0gSDk2MzJfU1NfQ0hBTk5FTFM7CisJCWg5NjMyX2FlYi5hZWJvID0gaGRzcC0+c3Nfb3V0X2NoYW5uZWxzIC0gSDk2MzJfU1NfQ0hBTk5FTFM7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmg5NjMyX2FlYiwgc2l6ZW9mKGg5NjMyX2FlYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0hEU1BfSU9DVExfR0VUX1ZFUlNJT046IHsKKwkJaGRzcF92ZXJzaW9uX3QgaGRzcF92ZXJzaW9uOworCQlpbnQgZXJyOworCQkKKwkJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgcmV0dXJuIC1FSU5WQUw7CisJCWlmIChoZHNwLT5pb190eXBlID09IFVuZGVmaW5lZCkgeworCQkJaWYgKChlcnIgPSBoZHNwX2dldF9pb2JveF92ZXJzaW9uKGhkc3ApKSA8IDApIHsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJCWhkc3BfdmVyc2lvbi5pb190eXBlID0gaGRzcC0+aW9fdHlwZTsKKwkJaGRzcF92ZXJzaW9uLmZpcm13YXJlX3JldiA9IGhkc3AtPmZpcm13YXJlX3JldjsKKwkJaWYgKChlcnIgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmhkc3BfdmVyc2lvbiwgc2l6ZW9mKGhkc3BfdmVyc2lvbikpKSkgeworCQkgICAgCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0hEU1BfSU9DVExfVVBMT0FEX0ZJUk1XQVJFOiB7CisJCWhkc3BfZmlybXdhcmVfdCBfX3VzZXIgKmZpcm13YXJlOworCQl1MzIgX191c2VyICpmaXJtd2FyZV9kYXRhOworCQlpbnQgZXJyOworCQkKKwkJaWYgKGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTYzMikgcmV0dXJuIC1FSU5WQUw7CisJCS8qIFNORFJWX0hEU1BfSU9DVExfR0VUX1ZFUlNJT04gbXVzdCBoYXZlIGJlZW4gY2FsbGVkICovCisJCWlmIChoZHNwLT5pb190eXBlID09IFVuZGVmaW5lZCkgcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGhkc3AtPnN0YXRlICYgKEhEU1BfRmlybXdhcmVDYWNoZWQgfCBIRFNQX0Zpcm13YXJlTG9hZGVkKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IGluaXRpYWxpemluZyBmaXJtd2FyZSB1cGxvYWRcbiIpOworCQlmaXJtd2FyZSA9IChoZHNwX2Zpcm13YXJlX3QgX191c2VyICopYXJncDsKKworCQlpZiAoZ2V0X3VzZXIoZmlybXdhcmVfZGF0YSwgJmZpcm13YXJlLT5maXJtd2FyZV9kYXRhKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJCisJCWlmIChoZHNwX2NoZWNrX2Zvcl9pb2JveCAoaGRzcCkpIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGhkc3AtPmZpcm13YXJlX2NhY2hlLCBmaXJtd2FyZV9kYXRhLCBzaXplb2YoaGRzcC0+ZmlybXdhcmVfY2FjaGUpKSAhPSAwKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkKKwkJaGRzcC0+c3RhdGUgfD0gSERTUF9GaXJtd2FyZUNhY2hlZDsKKworCQlpZiAoKGVyciA9IHNuZF9oZHNwX2xvYWRfZmlybXdhcmVfZnJvbV9jYWNoZShoZHNwKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCQorCQlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfSW5pdGlhbGl6YXRpb25Db21wbGV0ZSkpIHsKKwkJCWlmICgoZXJyID0gc25kX2hkc3BfZW5hYmxlX2lvKGhkc3ApKSA8IDApIHsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJCisJCQlzbmRfaGRzcF9pbml0aWFsaXplX2NoYW5uZWxzKGhkc3ApOwkJCisJCQlzbmRfaGRzcF9pbml0aWFsaXplX21pZGlfZmx1c2goaGRzcCk7CisJICAgIAorCQkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfYWxzYV9kZXZpY2VzKGhkc3AtPmNhcmQsIGhkc3ApKSA8IDApIHsKKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogZXJyb3IgY3JlYXRpbmcgYWxzYSBkZXZpY2VzXG4iKTsKKwkJCSAgICByZXR1cm4gZXJyOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0hEU1BfSU9DVExfR0VUX01JWEVSOiB7CisJCWhkc3BfbWl4ZXJfdCBfX3VzZXIgKm1peGVyID0gKGhkc3BfbWl4ZXJfdCBfX3VzZXIgKilhcmdwOworCQlpZiAoY29weV90b191c2VyKG1peGVyLT5tYXRyaXgsIGhkc3AtPm1peGVyX21hdHJpeCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSpIRFNQX01BVFJJWF9NSVhFUl9TSVpFKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaGRzcF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2hkc3BfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfaGRzcF9wbGF5YmFja19yZWxlYXNlLAorCS5pb2N0bCA9CXNuZF9oZHNwX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaGRzcF9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfaGRzcF9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2hkc3BfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9oZHNwX2h3X3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX2hkc3BfcGxheWJhY2tfY29weSwKKwkuc2lsZW5jZSA9CXNuZF9oZHNwX2h3X3NpbGVuY2UsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfaGRzcF9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaGRzcF9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2hkc3BfY2FwdHVyZV9yZWxlYXNlLAorCS5pb2N0bCA9CXNuZF9oZHNwX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaGRzcF9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfaGRzcF9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX2hkc3BfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9oZHNwX2h3X3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX2hkc3BfY2FwdHVyZV9jb3B5LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2hkc3BfY3JlYXRlX2h3ZGVwKHNuZF9jYXJkX3QgKmNhcmQsCisJCQkJCSAgIGhkc3BfdCAqaGRzcCkKK3sKKwlzbmRfaHdkZXBfdCAqaHc7CisJaW50IGVycjsKKwkKKwlpZiAoKGVyciA9IHNuZF9od2RlcF9uZXcoY2FyZCwgIkhEU1AgaHdkZXAiLCAwLCAmaHcpKSA8IDApCisJCXJldHVybiBlcnI7CisJCQorCWhkc3AtPmh3ZGVwID0gaHc7CisJaHctPnByaXZhdGVfZGF0YSA9IGhkc3A7CisJc3RyY3B5KGh3LT5uYW1lLCAiSERTUCBod2RlcCBpbnRlcmZhY2UiKTsKKworCWh3LT5vcHMub3BlbiA9IHNuZF9oZHNwX2h3ZGVwX2R1bW15X29wOworCWh3LT5vcHMuaW9jdGwgPSBzbmRfaGRzcF9od2RlcF9pb2N0bDsKKwlody0+b3BzLnJlbGVhc2UgPSBzbmRfaGRzcF9od2RlcF9kdW1teV9vcDsKKwkJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfY3JlYXRlX3BjbShzbmRfY2FyZF90ICpjYXJkLCBoZHNwX3QgKmhkc3ApCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoY2FyZCwgaGRzcC0+Y2FyZF9uYW1lLCAwLCAxLCAxLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaGRzcC0+cGNtID0gcGNtOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gaGRzcDsKKwlzdHJjcHkocGNtLT5uYW1lLCBoZHNwLT5jYXJkX25hbWUpOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9oZHNwX3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2hkc3BfY2FwdHVyZV9vcHMpOworCisJcGNtLT5pbmZvX2ZsYWdzID0gU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9oZHNwXzk2NTJfZW5hYmxlX21peGVyIChoZHNwX3QgKmhkc3ApCit7CisgICAgICAgIGhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyIHw9IEhEU1BfOTY1Ml9FTkFCTEVfTUlYRVI7CisJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIpOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2VuYWJsZV9pbyAoaGRzcF90ICpoZHNwKQoreworCWludCBpOworCQorCWlmIChoZHNwX2ZpZm9fd2FpdCAoaGRzcCwgMCwgMTAwKSkgeworCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogZW5hYmxlX2lvIGZpZm9fd2FpdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IGhkc3AtPm1heF9jaGFubmVsczsgKytpKSB7CisJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfaW5wdXRFbmFibGUgKyAoNCAqIGkpLCAxKTsKKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9vdXRwdXRFbmFibGUgKyAoNCAqIGkpLCAxKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9oZHNwX2luaXRpYWxpemVfY2hhbm5lbHMoaGRzcF90ICpoZHNwKQoreworCWludCBzdGF0dXMsIGFlYmlfY2hhbm5lbHMsIGFlYm9fY2hhbm5lbHM7CisJCisJc3dpdGNoIChoZHNwLT5pb190eXBlKSB7CisJY2FzZSBEaWdpZmFjZToKKwkJaGRzcC0+Y2FyZF9uYW1lID0gIlJNRSBIYW1tZXJmYWxsIERTUCArIERpZ2lmYWNlIjsKKwkJaGRzcC0+c3NfaW5fY2hhbm5lbHMgPSBoZHNwLT5zc19vdXRfY2hhbm5lbHMgPSBESUdJRkFDRV9TU19DSEFOTkVMUzsKKwkJaGRzcC0+ZHNfaW5fY2hhbm5lbHMgPSBoZHNwLT5kc19vdXRfY2hhbm5lbHMgPSBESUdJRkFDRV9EU19DSEFOTkVMUzsKKwkJYnJlYWs7CisKKwljYXNlIEg5NjUyOgorCQloZHNwLT5jYXJkX25hbWUgPSAiUk1FIEhhbW1lcmZhbGwgSERTUCA5NjUyIjsKKwkJaGRzcC0+c3NfaW5fY2hhbm5lbHMgPSBoZHNwLT5zc19vdXRfY2hhbm5lbHMgPSBIOTY1Ml9TU19DSEFOTkVMUzsKKwkJaGRzcC0+ZHNfaW5fY2hhbm5lbHMgPSBoZHNwLT5kc19vdXRfY2hhbm5lbHMgPSBIOTY1Ml9EU19DSEFOTkVMUzsKKwkJYnJlYWs7CisJCisJY2FzZSBIOTYzMjoKKwkJc3RhdHVzID0gaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpOworCQkvKiBIRFNQX0FFQnggYml0cyBhcmUgbG93IHdoZW4gQUVCIGFyZSBjb25uZWN0ZWQgKi8KKwkJYWViaV9jaGFubmVscyA9IChzdGF0dXMgJiBIRFNQX0FFQkkpID8gMCA6IDQ7CisJCWFlYm9fY2hhbm5lbHMgPSAoc3RhdHVzICYgSERTUF9BRUJPKSA/IDAgOiA0OworCQloZHNwLT5jYXJkX25hbWUgPSAiUk1FIEhhbW1lcmZhbGwgSERTUCA5NjMyIjsKKwkJaGRzcC0+c3NfaW5fY2hhbm5lbHMgPSBIOTYzMl9TU19DSEFOTkVMUythZWJpX2NoYW5uZWxzOworCQloZHNwLT5kc19pbl9jaGFubmVscyA9IEg5NjMyX0RTX0NIQU5ORUxTK2FlYmlfY2hhbm5lbHM7CisJCWhkc3AtPnFzX2luX2NoYW5uZWxzID0gSDk2MzJfUVNfQ0hBTk5FTFMrYWViaV9jaGFubmVsczsKKwkJaGRzcC0+c3Nfb3V0X2NoYW5uZWxzID0gSDk2MzJfU1NfQ0hBTk5FTFMrYWVib19jaGFubmVsczsKKwkJaGRzcC0+ZHNfb3V0X2NoYW5uZWxzID0gSDk2MzJfRFNfQ0hBTk5FTFMrYWVib19jaGFubmVsczsKKwkJaGRzcC0+cXNfb3V0X2NoYW5uZWxzID0gSDk2MzJfUVNfQ0hBTk5FTFMrYWVib19jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE11bHRpZmFjZToKKwkJaGRzcC0+Y2FyZF9uYW1lID0gIlJNRSBIYW1tZXJmYWxsIERTUCArIE11bHRpZmFjZSI7CisJCWhkc3AtPnNzX2luX2NoYW5uZWxzID0gaGRzcC0+c3Nfb3V0X2NoYW5uZWxzID0gTVVMVElGQUNFX1NTX0NIQU5ORUxTOworCQloZHNwLT5kc19pbl9jaGFubmVscyA9IGhkc3AtPmRzX291dF9jaGFubmVscyA9IE1VTFRJRkFDRV9EU19DSEFOTkVMUzsKKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisgCQkvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfaGRzcF9pbml0aWFsaXplX21pZGlfZmx1c2ggKGhkc3BfdCAqaGRzcCkKK3sKKwlzbmRfaGRzcF9mbHVzaF9taWRpX2lucHV0IChoZHNwLCAwKTsKKwlzbmRfaGRzcF9mbHVzaF9taWRpX2lucHV0IChoZHNwLCAxKTsKK30KKworc3RhdGljIGludCBzbmRfaGRzcF9jcmVhdGVfYWxzYV9kZXZpY2VzKHNuZF9jYXJkX3QgKmNhcmQsIGhkc3BfdCAqaGRzcCkKK3sKKwlpbnQgZXJyOworCQorCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX3BjbShjYXJkLCBoZHNwKSkgPCAwKSB7CisJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBFcnJvciBjcmVhdGluZyBwY20gaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisKKwlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9taWRpKGNhcmQsIGhkc3AsIDApKSA8IDApIHsKKwkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IEVycm9yIGNyZWF0aW5nIGZpcnN0IG1pZGkgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBEaWdpZmFjZSB8fCBoZHNwLT5pb190eXBlID09IEg5NjUyKSB7CisJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX21pZGkoY2FyZCwgaGRzcCwgMSkpIDwgMCkgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IEVycm9yIGNyZWF0aW5nIHNlY29uZCBtaWRpIGludGVyZmFjZVxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfY29udHJvbHMoY2FyZCwgaGRzcCkpIDwgMCkgeworCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgY3RsIGludGVyZmFjZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX2hkc3BfcHJvY19pbml0KGhkc3ApOworCisJaGRzcC0+c3lzdGVtX3NhbXBsZV9yYXRlID0gLTE7CisJaGRzcC0+cGxheWJhY2tfcGlkID0gLTE7CisJaGRzcC0+Y2FwdHVyZV9waWQgPSAtMTsKKwloZHNwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJaGRzcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKKworCWlmICgoZXJyID0gc25kX2hkc3Bfc2V0X2RlZmF1bHRzKGhkc3ApKSA8IDApIHsKKwkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IEVycm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfSW5pdGlhbGl6YXRpb25Db21wbGV0ZSkpIHsKKwkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLCBoZHNwLT5jYXJkX25hbWUsIAorCQkJaGRzcC0+cG9ydCwgaGRzcC0+aXJxKTsKKwkgICAgCisJCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IGVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQloZHNwLT5zdGF0ZSB8PSBIRFNQX0luaXRpYWxpemF0aW9uQ29tcGxldGU7CisJfQorCQorCXJldHVybiAwOworfQorCisjaWZkZWYgSERTUF9GV19MT0FERVIKKy8qIGxvYWQgZmlybXdhcmUgdmlhIGhvdHBsdWcgZncgbG9hZGVyICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoZHNwX3JlcXVlc3RfZndfbG9hZGVyKGhkc3BfdCAqaGRzcCkKK3sKKwljb25zdCBjaGFyICpmd2ZpbGU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgZXJyOworCQkKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTY1MiB8fCBoZHNwLT5pb190eXBlID09IEg5NjMyKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBVbmRlZmluZWQpIHsKKwkJaWYgKChlcnIgPSBoZHNwX2dldF9pb2JveF92ZXJzaW9uKGhkc3ApKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTY1MiB8fCBoZHNwLT5pb190eXBlID09IEg5NjMyKQorCQkJcmV0dXJuIDA7CisJfQorCQorCS8qIGNhdXRpb246IG1heCBsZW5ndGggb2YgZmlybXdhcmUgZmlsZW5hbWUgaXMgMzAhICovCisJc3dpdGNoIChoZHNwLT5pb190eXBlKSB7CisJY2FzZSBNdWx0aWZhY2U6CisJCWlmIChoZHNwLT5maXJtd2FyZV9yZXYgPT0gMHhhKQorCQkJZndmaWxlID0gIm11bHRpZmFjZV9maXJtd2FyZS5iaW4iOworCQllbHNlCisJCQlmd2ZpbGUgPSAibXVsdGlmYWNlX2Zpcm13YXJlX3JldjExLmJpbiI7CisJCWJyZWFrOworCWNhc2UgRGlnaWZhY2U6CisJCWlmIChoZHNwLT5maXJtd2FyZV9yZXYgPT0gMHhhKQorCQkJZndmaWxlID0gImRpZ2lmYWNlX2Zpcm13YXJlLmJpbiI7CisJCWVsc2UKKwkJCWZ3ZmlsZSA9ICJkaWdpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd2ZpbGUsICZoZHNwLT5wY2ktPmRldikpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGNhbm5vdCBsb2FkIGZpcm13YXJlICVzXG4iLCBmd2ZpbGUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYgKGZ3LT5zaXplIDwgc2l6ZW9mKGhkc3AtPmZpcm13YXJlX2NhY2hlKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJCSAgIChpbnQpZnctPnNpemUsIChpbnQpc2l6ZW9mKGhkc3AtPmZpcm13YXJlX2NhY2hlKSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjaWZkZWYgU05EUlZfQklHX0VORElBTgorCXsKKwkJaW50IGk7CisJCXUzMiAqc3JjID0gKHUzMiopZnctPmRhdGE7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkc3AtPmZpcm13YXJlX2NhY2hlKTsgaSsrLCBzcmMrKykKKwkJCWhkc3AtPmZpcm13YXJlX2NhY2hlW2ldID0gKCgqc3JjICYgMHgwMDAwMDBmZikgPDwgMTYpIHwKKwkJCQkoKCpzcmMgJiAweDAwMDBmZjAwKSA8PCA4KSAgfAorCQkJCSgoKnNyYyAmIDB4MDBmZjAwMDApID4+IDgpICB8CisJCQkJKCgqc3JjICYgMHhmZjAwMDAwMCkgPj4gMTYpOworCX0KKyNlbHNlCisJbWVtY3B5KGhkc3AtPmZpcm13YXJlX2NhY2hlLCBmdy0+ZGF0YSwgc2l6ZW9mKGhkc3AtPmZpcm13YXJlX2NhY2hlKSk7CisjZW5kaWYKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCisJaGRzcC0+c3RhdGUgfD0gSERTUF9GaXJtd2FyZUNhY2hlZDsKKworCWlmICgoZXJyID0gc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApKSA8IDApCisJCXJldHVybiBlcnI7CisJCQorCWlmICghKGhkc3AtPnN0YXRlICYgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlKSkgeworCQlpZiAoKGVyciA9IHNuZF9oZHNwX2VuYWJsZV9pbyhoZHNwKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgeworCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGh3ZGVwIGRldmljZVxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNuZF9oZHNwX2luaXRpYWxpemVfY2hhbm5lbHMoaGRzcCk7CisJCXNuZF9oZHNwX2luaXRpYWxpemVfbWlkaV9mbHVzaChoZHNwKTsKKwkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfYWxzYV9kZXZpY2VzKGhkc3AtPmNhcmQsIGhkc3ApKSA8IDApIHsKKwkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBlcnJvciBjcmVhdGluZyBhbHNhIGRldmljZXNcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaGRzcF9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwKKwkJCQkgICAgIGhkc3BfdCAqaGRzcCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gaGRzcC0+cGNpOworCWludCBlcnI7CisJaW50IGlzXzk2NTIgPSAwOworCWludCBpc185NjMyID0gMDsKKworCWhkc3AtPmlycSA9IC0xOworCWhkc3AtPnN0YXRlID0gMDsKKwloZHNwLT5taWRpWzBdLnJtaWRpID0gTlVMTDsKKwloZHNwLT5taWRpWzFdLnJtaWRpID0gTlVMTDsKKwloZHNwLT5taWRpWzBdLmlucHV0ID0gTlVMTDsKKwloZHNwLT5taWRpWzFdLmlucHV0ID0gTlVMTDsKKwloZHNwLT5taWRpWzBdLm91dHB1dCA9IE5VTEw7CisJaGRzcC0+bWlkaVsxXS5vdXRwdXQgPSBOVUxMOworCWhkc3AtPm1pZGlbMF0ucGVuZGluZyA9IDA7CisJaGRzcC0+bWlkaVsxXS5wZW5kaW5nID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmaGRzcC0+bWlkaVswXS5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaGRzcC0+bWlkaVsxXS5sb2NrKTsKKwloZHNwLT5pb2Jhc2UgPSBOVUxMOworCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgPSAwOworCWhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyID0gMDsKKwloZHNwLT5pb190eXBlID0gVW5kZWZpbmVkOworCWhkc3AtPm1heF9jaGFubmVscyA9IDI2OworCisJaGRzcC0+Y2FyZCA9IGNhcmQ7CisJCisJc3Bpbl9sb2NrX2luaXQoJmhkc3AtPmxvY2spOworCisJdGFza2xldF9pbml0KCZoZHNwLT5taWRpX3Rhc2tsZXQsIGhkc3BfbWlkaV90YXNrbGV0LCAodW5zaWduZWQgbG9uZyloZHNwKTsKKwkKKwlwY2lfcmVhZF9jb25maWdfd29yZChoZHNwLT5wY2ksIFBDSV9DTEFTU19SRVZJU0lPTiwgJmhkc3AtPmZpcm13YXJlX3Jldik7CisJaGRzcC0+ZmlybXdhcmVfcmV2ICY9IDB4ZmY7CisJCisJLyogRnJvbSBNYXJ0aW4gQmpvZXJuc2VuIDoKKwkgICAgIkl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBjYXJkJ3MgbGF0ZW5jeSB0aW1lciByZWdpc3RlciBpbgorCSAgICB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgaXMgc2V0IHRvIGEgdmFsdWUgbXVjaCBsYXJnZXIKKwkgICAgdGhhbiAwIGJ5IHRoZSBjb21wdXRlcidzIEJJT1Mgb3IgdGhlIGRyaXZlci4KKwkgICAgVGhlIHdpbmRvd3MgZHJpdmVyIGFsd2F5cyBzZXRzIHRoaXMgOCBiaXQgcmVnaXN0ZXIgWy4uLl0KKwkgICAgdG8gaXRzIG1heGltdW0gMjU1IHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc29tZSBjb21wdXRlcnMuIgorCSovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGhkc3AtPnBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIDB4RkYpOworCQorCXN0cmNweShjYXJkLT5kcml2ZXIsICJILURTUCIpOworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJYaWxpbnggRlBHQSIpOworCisJaWYgKGhkc3AtPmZpcm13YXJlX3JldiA8IDB4YSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKGhkc3AtPmZpcm13YXJlX3JldiA8IDB4NjQpIHsKKwkJaGRzcC0+Y2FyZF9uYW1lID0gIlJNRSBIYW1tZXJmYWxsIERTUCI7CisJfSBlbHNlIGlmIChoZHNwLT5maXJtd2FyZV9yZXYgPCAweDk2KSB7CisJCWhkc3AtPmNhcmRfbmFtZSA9ICJSTUUgSERTUCA5NjUyIjsKKwkJaXNfOTY1MiA9IDE7CisJfSBlbHNlIHsKKwkJaGRzcC0+Y2FyZF9uYW1lID0gIlJNRSBIRFNQIDk2MzIiOworCQloZHNwLT5tYXhfY2hhbm5lbHMgPSAxNjsKKwkJaXNfOTYzMiA9IDE7CQorCX0KKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJcGNpX3NldF9tYXN0ZXIoaGRzcC0+cGNpKTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJoZHNwIikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwloZHNwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKChoZHNwLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaGRzcC0+cG9ydCwgSERTUF9JT19FWFRFTlQpKSA9PSBOVUxMKSB7CisJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiB1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBoZHNwLT5wb3J0LCBoZHNwLT5wb3J0ICsgSERTUF9JT19FWFRFTlQgLSAxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9oZHNwX2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiaGRzcCIsICh2b2lkICopaGRzcCkpIHsKKwkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IHVuYWJsZSB0byB1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaGRzcC0+aXJxID0gcGNpLT5pcnE7CisJaGRzcC0+cHJlY2lzZV9wdHIgPSAxOworCWhkc3AtPnVzZV9taWRpX3Rhc2tsZXQgPSAxOworCisJaWYgKChlcnIgPSBzbmRfaGRzcF9pbml0aWFsaXplX21lbW9yeShoZHNwKSkgPCAwKSB7CisJCXJldHVybiBlcnI7CisJfQorCQorCWlmICghaXNfOTY1MiAmJiAhaXNfOTYzMikgeworCQkvKiB3ZSB3YWl0IDIgc2Vjb25kcyB0byBsZXQgZnJlc2hseSBpbnNlcnRlZCBjYXJkYnVzIGNhcmRzIGRvIHRoZWlyIGhhcmR3YXJlIGluaXQgKi8KKyAJCWlmICgoMTAwMCAvIEhaKSA8IDIwMDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoKDIwMDAgKiBIWiArIDk5OSkgLyAxMDAwKTsKKwkJfSBlbHNlIHsKKwkJCW1kZWxheSgyMDAwKTsKKwkJfQorCisJCWlmICgoaGRzcF9yZWFkIChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfRGxsRXJyb3IpICE9IDApIHsKKyNpZmRlZiBIRFNQX0ZXX0xPQURFUgorCQkJaWYgKChlcnIgPSBoZHNwX3JlcXVlc3RfZndfbG9hZGVyKGhkc3ApKSA8IDApIHsKKwkJCQkvKiB3ZSBkb24ndCBmYWlsIGFzIHRoaXMgY2FuIGhhcHBlbgorCQkJCSAgIGlmIHVzZXJzcGFjZSBpcyBub3QgcmVhZHkgZm9yCisJCQkJICAgZmlybXdhcmUgdXBsb2FkCisJCQkJKi8KKwkJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogY291bGRuJ3QgZ2V0IGZpcm13YXJlIGZyb20gdXNlcnNwYWNlLiB0cnkgdXNpbmcgaGRzcGxvYWRlclxuIik7CisJCQl9IGVsc2UgeworCQkJCS8qIGluaXQgaXMgY29tcGxldGUsIHdlIHJldHVybiAqLworCQkJCXJldHVybiAwOworCQkJfQorI2VuZGlmCisJCQkvKiBubyBpb2JveCBjb25uZWN0ZWQsIHdlIGRlZmVyIGluaXRpYWxpemF0aW9uICovCisJCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogY2FyZCBpbml0aWFsaXphdGlvbiBwZW5kaW5nIDogd2FpdGluZyBmb3IgZmlybXdhcmVcbiIpOworCQkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoY2FyZCwgaGRzcCkpIDwgMCkgeworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CSAgICAKKwkJCWlmIChoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpICYgSERTUF92ZXJzaW9uMSkgeworCQkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7CisJCQl9IGVsc2UgeworCQkJCWhkc3AtPmlvX3R5cGUgPSBEaWdpZmFjZTsKKwkJCX0KKwkJfQorCX0KKwkKKwlpZiAoKGVyciA9IHNuZF9oZHNwX2VuYWJsZV9pbyhoZHNwKSkgIT0gMCkgeworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoaXNfOTY1MikgeworCSAgICAgICAgaGRzcC0+aW9fdHlwZSA9IEg5NjUyOworCX0KKwkKKwlpZiAoaXNfOTYzMikgeworCQloZHNwLT5pb190eXBlID0gSDk2MzI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoY2FyZCwgaGRzcCkpIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlzbmRfaGRzcF9pbml0aWFsaXplX2NoYW5uZWxzKGhkc3ApOworCXNuZF9oZHNwX2luaXRpYWxpemVfbWlkaV9mbHVzaChoZHNwKTsKKworCWhkc3AtPnN0YXRlIHw9IEhEU1BfRmlybXdhcmVMb2FkZWQ7CQorCisJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfYWxzYV9kZXZpY2VzKGNhcmQsIGhkc3ApKSA8IDApIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZnJlZShoZHNwX3QgKmhkc3ApCit7CisJaWYgKGhkc3AtPnBvcnQpIHsKKwkJLyogc3RvcCB0aGUgYXVkaW8sIGFuZCBjYW5jZWwgYWxsIGludGVycnVwdHMgKi8KKwkJdGFza2xldF9raWxsKCZoZHNwLT5taWRpX3Rhc2tsZXQpOworCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH4oSERTUF9TdGFydHxIRFNQX0F1ZGlvSW50ZXJydXB0RW5hYmxlfEhEU1BfTWlkaTBJbnRlcnJ1cHRFbmFibGV8SERTUF9NaWRpMUludGVycnVwdEVuYWJsZSk7CisJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbFJlZ2lzdGVyLCBoZHNwLT5jb250cm9sX3JlZ2lzdGVyKTsKKwl9CisKKwlpZiAoaGRzcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGhkc3AtPmlycSwgKHZvaWQgKiloZHNwKTsKKworCXNuZF9oZHNwX2ZyZWVfYnVmZmVycyhoZHNwKTsKKwkKKwlpZiAoaGRzcC0+aW9iYXNlKQorCQlpb3VubWFwKGhkc3AtPmlvYmFzZSk7CisKKwlpZiAoaGRzcC0+cG9ydCkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhoZHNwLT5wY2kpOworCQkKKwlwY2lfZGlzYWJsZV9kZXZpY2UoaGRzcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2hkc3BfY2FyZF9mcmVlKHNuZF9jYXJkX3QgKmNhcmQpCit7CisJaGRzcF90ICpoZHNwID0gKGhkc3BfdCAqKSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoaGRzcCkKKwkJc25kX2hkc3BfZnJlZShoZHNwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2hkc3BfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwloZHNwX3QgKmhkc3A7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlpbnQgZXJyOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKCEoY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgc2l6ZW9mKGhkc3BfdCkpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHNwID0gKGhkc3BfdCAqKSBjYXJkLT5wcml2YXRlX2RhdGE7CisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2hkc3BfY2FyZF9mcmVlOworCWhkc3AtPmRldiA9IGRldjsKKwloZHNwLT5wY2kgPSBwY2k7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCisJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGUoY2FyZCwgaGRzcCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJIYW1tZXJmYWxsIERTUCIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkIiwgaGRzcC0+Y2FyZF9uYW1lLCAKKwkJaGRzcC0+cG9ydCwgaGRzcC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9oZHNwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gICAgICJSTUUgSGFtbWVyZmFsbCBEU1AiLAorCS5pZF90YWJsZSA9IHNuZF9oZHNwX2lkcywKKwkucHJvYmUgPSAgICBzbmRfaGRzcF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2hkc3BfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9oZHNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2hkc3BfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX2hkc3BfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9oZHNwX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZDgxZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwpAQCAtMCwwICsxLDI2NzYgQEAKKy8qCisgKiAgIEFMU0EgZHJpdmVyIGZvciBSTUUgRGlnaTk2NTIgYXVkaW8gaW50ZXJmYWNlcyAKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgSUVNIC0gV2luZnJpZWQgUml0c2NoCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAxICBQYXVsIERhdmlzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBwcmVjaXNlX3B0cltTTkRSVl9DQVJEU10gPSB7IFswIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gMCB9OyAvKiBFbmFibGUgcHJlY2lzZSBwb2ludGVyICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgUk1FIERpZ2k5NjUyIChIYW1tZXJmYWxsKSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIFJNRSBEaWdpOTY1MiAoSGFtbWVyZmFsbCkgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZS9kaXNhYmxlIHNwZWNpZmljIFJNRTk2ezUyLDM2fSBzb3VuZGNhcmRzLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHByZWNpc2VfcHRyLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJlY2lzZV9wdHIsICJFbmFibGUgcHJlY2lzZSBwb2ludGVyIChkb2Vzbid0IHdvcmsgcmVsaWFibHkpLiIpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEYXZpcyA8cGJkQG9wLm5ldD4sIFdpbmZyaWVkIFJpdHNjaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSTUUgRGlnaTk2NTIvRGlnaTk2MzYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1JNRSxIYW1tZXJmYWxsfSwiCisJCSJ7Uk1FLEhhbW1lcmZhbGwtTGlnaHR9fSIpOworCisvKiBUaGUgSGFtbWVyZmFsbCBoYXMgdHdvIHNldHMgb2YgMjQgQURBVCArIDIgUy9QRElGIGNoYW5uZWxzLCBvbmUgZm9yCisgICBjYXB0dXJlLCBvbmUgZm9yIHBsYXliYWNrLiBCb3RoIHRoZSBBREFUIGFuZCBTL1BESUYgY2hhbm5lbHMgYXBwZWFyCisgICB0byB0aGUgaG9zdCBDUFUgaW4gdGhlIHNhbWUgYmxvY2sgb2YgbWVtb3J5LiBUaGVyZSBpcyBubyBmdW5jdGlvbmFsCisgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpbiB0ZXJtcyBvZiBhY2Nlc3MuCisgICAKKyAgIFRoZSBIYW1tZXJmYWxsIExpZ2h0IGlzIGlkZW50aWNhbCB0byB0aGUgSGFtbWVyZmFsbCwgZXhjZXB0IHRoYXQgaXQKKyAgIGhhcyAyIHNldHMgMTggY2hhbm5lbHMgKDE2IEFEQVQgKyAyIFMvUERJRikgZm9yIGNhcHR1cmUgYW5kIHBsYXliYWNrLgorKi8KKworI2RlZmluZSBSTUU5NjUyX05DSEFOTkVMUyAgICAgICAyNgorI2RlZmluZSBSTUU5NjM2X05DSEFOTkVMUyAgICAgICAxOAorCisvKiBQcmVmZXJyZWQgc3luYyBzb3VyY2UgY2hvaWNlcyAtIHVzZWQgYnkgInN5bmNfcHJlZiIgY29udHJvbCBzd2l0Y2ggKi8KKworI2RlZmluZSBSTUU5NjUyX1NZTkNfRlJPTV9TUERJRiAwCisjZGVmaW5lIFJNRTk2NTJfU1lOQ19GUk9NX0FEQVQxIDEKKyNkZWZpbmUgUk1FOTY1Ml9TWU5DX0ZST01fQURBVDIgMgorI2RlZmluZSBSTUU5NjUyX1NZTkNfRlJPTV9BREFUMyAzCisKKy8qIFBvc3NpYmxlIHNvdXJjZXMgb2YgUy9QRElGIGlucHV0ICovCisKKyNkZWZpbmUgUk1FOTY1Ml9TUERJRklOX09QVElDQUwgMAkvKiBvcHRpY2FsIChBREFUMSkgKi8KKyNkZWZpbmUgUk1FOTY1Ml9TUERJRklOX0NPQVhJQUwgMQkvKiBjb2F4aWFsIChSQ0EpICovCisjZGVmaW5lIFJNRTk2NTJfU1BESUZJTl9JTlRFUk4gIDIJLyogaW50ZXJuYWwgKENEUk9NKSAqLworCisvKiAtLS0tLS0tLS0tLS0tIFN0YXR1cy1SZWdpc3RlciBiaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJNRTk2NTJfSVJRCSAgICgxPDwwKQkvKiBJUlEgaXMgSGlnaCBpZiBub3QgcmVzZXQgYnkgaXJxX2NsZWFyICovCisjZGVmaW5lIFJNRTk2NTJfbG9ja18yCSAgICgxPDwxKQkvKiBBREFUIDMtUExMOiAxPWxvY2tlZCwgMD11bmxvY2tlZCAqLworI2RlZmluZSBSTUU5NjUyX2xvY2tfMQkgICAoMTw8MikJLyogQURBVCAyLVBMTDogMT1sb2NrZWQsIDA9dW5sb2NrZWQgKi8KKyNkZWZpbmUgUk1FOTY1Ml9sb2NrXzAJICAgKDE8PDMpCS8qIEFEQVQgMS1QTEw6IDE9bG9ja2VkLCAwPXVubG9ja2VkICovCisjZGVmaW5lIFJNRTk2NTJfZnM0OAkgICAoMTw8NCkJLyogc2FtcGxlIHJhdGUgaXMgMD00NC4xLzg4LjIsMT00OC85NiBLaHogKi8KKyNkZWZpbmUgUk1FOTY1Ml93c2VsX3JkCSAgICgxPDw1KQkvKiBpZiBXb3JkLUNsb2NrIGlzIHVzZWQgYW5kIHZhbGlkIHRoZW4gMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgNi0xNSBlbmNvZGUgaC93IGJ1ZmZlciBwb2ludGVyIHBvc2l0aW9uICovCisjZGVmaW5lIFJNRTk2NTJfc3luY18yCSAgICgxPDwxNikJLyogaWYgQURBVC1JTiAzIGluIHN5bmMgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2NTJfc3luY18xCSAgICgxPDwxNykJLyogaWYgQURBVC1JTiAyIGluIHN5bmMgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2NTJfc3luY18wCSAgICgxPDwxOCkJLyogaWYgQURBVC1JTiAxIGluIHN5bmMgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2NTJfRFNfcmQJICAgKDE8PDE5KQkvKiAxPURvdWJsZSBTcGVlZCBNb2RlLCAwPU5vcm1hbCBTcGVlZCAqLworI2RlZmluZSBSTUU5NjUyX3RjX2J1c3kJICAgKDE8PDIwKQkvKiAxPXRpbWUtY29kZSBjb3B5IGluIHByb2dyZXNzICg5NjBtcykgKi8KKyNkZWZpbmUgUk1FOTY1Ml90Y19vdXQJICAgKDE8PDIxKQkvKiB0aW1lLWNvZGUgb3V0IGJpdCAqLworI2RlZmluZSBSTUU5NjUyX0ZfMAkgICAoMTw8MjIpCS8qIDAwMD02NGtIeiwgMTAwPTg4LjJrSHosIDAxMT05NmtIeiAgKi8KKyNkZWZpbmUgUk1FOTY1Ml9GXzEJICAgKDE8PDIzKQkvKiAxMTE9MzJrSHosIDExMD00NC4xa0h6LCAxMDE9NDhrSHosICovCisjZGVmaW5lIFJNRTk2NTJfRl8yCSAgICgxPDwyNCkJLyogZXh0ZXJuYWwgQ3J5c3RhbCBDaGlwIGlmIEVSRj0xICovCisjZGVmaW5lIFJNRTk2NTJfRVJGCSAgICgxPDwyNSkJLyogRXJyb3ItRmxhZyBvZiBTRFBJRiBSZWNlaXZlciAoMT1ObyBMb2NrKSAqLworI2RlZmluZSBSTUU5NjUyX2J1ZmZlcl9pZCAgKDE8PDI2KQkvKiB0b2dnbGVzIGJ5IGVhY2ggaW50ZXJydXB0IG9uIHJlYy9wbGF5ICovCisjZGVmaW5lIFJNRTk2NTJfdGNfdmFsaWQgICAoMTw8MjcpCS8qIDEgPSBhIHNpZ25hbCBpcyBkZXRlY3RlZCBvbiB0aW1lLWNvZGUgaW5wdXQgKi8KKyNkZWZpbmUgUk1FOTY1Ml9TUERJRl9SRUFEICgxPDwyOCkgICAgICAvKiBieXRlIGF2YWlsYWJsZSBmcm9tIFJldiAxLjUrIFMvUERJRiBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBSTUU5NjUyX3N5bmMJICAoUk1FOTY1Ml9zeW5jXzB8Uk1FOTY1Ml9zeW5jXzF8Uk1FOTY1Ml9zeW5jXzIpCisjZGVmaW5lIFJNRTk2NTJfbG9jawkgIChSTUU5NjUyX2xvY2tfMHxSTUU5NjUyX2xvY2tfMXxSTUU5NjUyX2xvY2tfMikKKyNkZWZpbmUgUk1FOTY1Ml9GCSAgKFJNRTk2NTJfRl8wfFJNRTk2NTJfRl8xfFJNRTk2NTJfRl8yKQorI2RlZmluZSBybWU5NjUyX2RlY29kZV9zcGRpZl9yYXRlKHgpICgoeCk+PjIyKQorCisvKiBCaXQgNi4uMTUgOiBoL3cgYnVmZmVyIHBvaW50ZXIgKi8KKworI2RlZmluZSBSTUU5NjUyX2J1Zl9wb3MJICAweDAwMEZGQzAKKworLyogQml0cyAzMSwzMCwyOSBhcmUgYml0cyA1LDQsMyBvZiBoL3cgcG9pbnRlciBwb3NpdGlvbiBvbiBsYXRlcgorICAgUmV2IEcgRUVQUk9NUyBhbmQgUmV2IDEuNSBjYXJkcyBvciBsYXRlci4KKyovIAorCisjZGVmaW5lIFJNRTk2NTJfUkVWMTVfYnVmX3Bvcyh4KSAoKCgoeCkmMHhFMDAwMDAwMCk+PjI2KXwoKHgpJlJNRTk2NTJfYnVmX3BvcykpCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9YSUxJTlgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YSUxJTlgJCTB4MTBlZQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfWElMSU5YX0hBTU1FUkZBTEwKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9YSUxJTlhfSEFNTUVSRkFMTAkweDNmYzQKKyNlbmRpZgorCisvKiBhbW91bnQgb2YgaW8gc3BhY2Ugd2UgcmVtYXAgZm9yIHJlZ2lzdGVyIGFjY2Vzcy4gaSdtIG5vdCBzdXJlIHdlCisgICBldmVuIG5lZWQgdGhpcyBtdWNoLCBidXQgMUsgaXMgbmljZSByb3VuZCBudW1iZXIgOikKKyovCisKKyNkZWZpbmUgUk1FOTY1Ml9JT19FWFRFTlQgICAgIDEwMjQKKworI2RlZmluZSBSTUU5NjUyX2luaXRfYnVmZmVyICAgICAgIDAKKyNkZWZpbmUgUk1FOTY1Ml9wbGF5X2J1ZmZlciAgICAgICAzMgkvKiBob2xkcyBwdHIgdG8gMjZ4NjRrQml0IGhvc3QgUkFNICovCisjZGVmaW5lIFJNRTk2NTJfcmVjX2J1ZmZlciAgICAgICAgMzYJLyogaG9sZHMgcHRyIHRvIDI2eDY0a0JpdCBob3N0IFJBTSAqLworI2RlZmluZSBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIgIDY0CisjZGVmaW5lIFJNRTk2NTJfaXJxX2NsZWFyICAgICAgICAgOTYKKyNkZWZpbmUgUk1FOTY1Ml90aW1lX2NvZGUgICAgICAgICAxMDAJLyogdXNlZnVsIGlmIHVzZWQgd2l0aCBhbGVzaXMgYWRhdCAqLworI2RlZmluZSBSTUU5NjUyX3RocnVfYmFzZSAgICAgICAgIDEyOAkvKiAxMzIuLi4yMjggVGhydSBmb3IgMjYgY2hhbm5lbHMgKi8KKworLyogUmVhZC1vbmx5IHJlZ2lzdGVycyAqLworCisvKiBXcml0aW5nIHRvIGFueSBvZiB0aGUgcmVnaXN0ZXIgbG9jYXRpb25zIHdyaXRlcyB0byB0aGUgc3RhdHVzCisgICByZWdpc3Rlci4gV2UnbGwgdXNlIHRoZSBmaXJzdCBsb2NhdGlvbiBhcyBvdXIgcG9pbnQgb2YgYWNjZXNzLgorKi8KKworI2RlZmluZSBSTUU5NjUyX3N0YXR1c19yZWdpc3RlciAgICAwCisKKy8qIC0tLS0tLS0tLSBDb250cm9sLVJlZ2lzdGVyIEJpdHMgLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyNkZWZpbmUgUk1FOTY1Ml9zdGFydF9iaXQJICAgKDE8PDApCS8qIHN0YXJ0IHJlY29yZC9wbGF5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIDEtMyBlbmNvZGUgYnVmZmVyc2l6ZS9sYXRlbmN5ICovCisjZGVmaW5lIFJNRTk2NTJfTWFzdGVyCQkgICAoMTw8NCkJLyogQ2xvY2sgTW9kZSBNYXN0ZXI9MSxTbGF2ZS9BdXRvPTAgKi8KKyNkZWZpbmUgUk1FOTY1Ml9JRQkJICAgKDE8PDUpCS8qIEludGVydXB0IEVuYWJsZSAqLworI2RlZmluZSBSTUU5NjUyX2ZyZXEJCSAgICgxPDw2KSAgICAgICAvKiBzYW1wbGVyYXRlIDA9NDQuMS84OC4yLCAxPTQ4Lzk2IGtIeiAqLworI2RlZmluZSBSTUU5NjUyX2ZyZXExCQkgICAoMTw8NykgICAgICAgLyogaWYgMCwgMzJrSHosIGVsc2UgYWx3YXlzIDEgKi8KKyNkZWZpbmUgUk1FOTY1Ml9EUyAgICAgICAgICAgICAgICAgKDE8PDgpCS8qIERvdWxlIFNwZWVkIDA9NDQuMS80OCwgMT04OC4yLzk2IEtoeiAqLworI2RlZmluZSBSTUU5NjUyX1BSTwkJICAgKDE8PDkpCS8qIFMvUERJRiBvdXQ6IDA9Y29uc3VtZXIsIDE9cHJvZmVzc2lvbmFsICovCisjZGVmaW5lIFJNRTk2NTJfRU1QCQkgICAoMTw8MTApCS8qICBFbXBoYXNpcyAwPU5vbmUsIDE9T04gKi8KKyNkZWZpbmUgUk1FOTY1Ml9Eb2xieQkJICAgKDE8PDExKQkvKiAgTm9uLWF1ZGlvIGJpdCAxPXNldCwgMD11bnNldCAqLworI2RlZmluZSBSTUU5NjUyX29wdF9vdXQJICAgICAgICAgICAoMTw8MTIpCS8qIFVzZSAxc3Qgb3B0aWNhbCBPVVQgYXMgU1BESUY6IDE9eWVzLDA9bm8gKi8KKyNkZWZpbmUgUk1FOTY1Ml93c2VsCQkgICAoMTw8MTMpCS8qIHVzZSBXb3JkY2xvY2sgYXMgc3luYyAob3ZlcndyaXRlcyBtYXN0ZXIpICovCisjZGVmaW5lIFJNRTk2NTJfaW5wXzAJCSAgICgxPDwxNCkJLyogU1BESUYtSU46IDAwPW9wdGljYWwgKEFEQVQxKSwgICAgICovCisjZGVmaW5lIFJNRTk2NTJfaW5wXzEJCSAgICgxPDwxNSkJLyogMDE9a29heGlhbCAoQ2luY2gpLCAxMD1JbnRlcm5hbCBDRFJPTSAqLworI2RlZmluZSBSTUU5NjUyX1N5bmNQcmVmX0FEQVQyCSAgICgxPDwxNikKKyNkZWZpbmUgUk1FOTY1Ml9TeW5jUHJlZl9BREFUMwkgICAoMTw8MTcpCisjZGVmaW5lIFJNRTk2NTJfU1BESUZfUkVTRVQgICAgICAgICgxPDwxOCkgICAgICAvKiBSZXYgMS41KzogaC93IFMvUERJRiByZWNlaXZlciAqLworI2RlZmluZSBSTUU5NjUyX1NQRElGX1NFTEVDVCAgICAgICAoMTw8MTkpCisjZGVmaW5lIFJNRTk2NTJfU1BESUZfQ0xPQ0sgICAgICAgICgxPDwyMCkKKyNkZWZpbmUgUk1FOTY1Ml9TUERJRl9XUklURSAgICAgICAgKDE8PDIxKQorI2RlZmluZSBSTUU5NjUyX0FEQVQxX0lOVEVSTkFMICAgICAoMTw8MjIpICAgICAgLyogUmV2IDEuNSs6IGlmIHNldCwgaW50ZXJuYWwgQ0QgY29ubmVjdG9yIGNhcnJpZXMgQURBVCAqLworCisvKiBidWZmZXJzaXplID0gNTEyQnl0ZXMgKiAyXm4sIHdoZXJlIG4gaXMgbWFkZSBmcm9tIEJpdDIgLi4uIEJpdDAgKi8KKworI2RlZmluZSBSTUU5NjUyX2xhdGVuY3kgICAgICAgICAgICAweDBlCisjZGVmaW5lIHJtZTk2NTJfZW5jb2RlX2xhdGVuY3koeCkgICgoKHgpJjB4Nyk8PDEpCisjZGVmaW5lIHJtZTk2NTJfZGVjb2RlX2xhdGVuY3koeCkgICgoKHgpPj4xKSYweDcpCisjZGVmaW5lIHJtZTk2NTJfcnVubmluZ19kb3VibGVfc3BlZWQocykgKChzKS0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfRFMpCisjZGVmaW5lIFJNRTk2NTJfaW5wICAgICAgICAgICAgICAgIChSTUU5NjUyX2lucF8wfFJNRTk2NTJfaW5wXzEpCisjZGVmaW5lIHJtZTk2NTJfZW5jb2RlX3NwZGlmX2luKHgpICgoKHgpJjB4Myk8PDE0KQorI2RlZmluZSBybWU5NjUyX2RlY29kZV9zcGRpZl9pbih4KSAoKCh4KT4+MTQpJjB4MykKKworI2RlZmluZSBSTUU5NjUyX1N5bmNQcmVmX01hc2sgICAgICAoUk1FOTY1Ml9TeW5jUHJlZl9BREFUMnxSTUU5NjUyX1N5bmNQcmVmX0FEQVQzKQorI2RlZmluZSBSTUU5NjUyX1N5bmNQcmVmX0FEQVQxCSAgIDAKKyNkZWZpbmUgUk1FOTY1Ml9TeW5jUHJlZl9TUERJRgkgICAoUk1FOTY1Ml9TeW5jUHJlZl9BREFUMnxSTUU5NjUyX1N5bmNQcmVmX0FEQVQzKQorCisvKiB0aGUgc2l6ZSBvZiBhIHN1YnN0cmVhbSAoMSBtb25vIGRhdGEgc3RyZWFtKSAqLworCisjZGVmaW5lIFJNRTk2NTJfQ0hBTk5FTF9CVUZGRVJfU0FNUExFUyAgKDE2KjEwMjQpCisjZGVmaW5lIFJNRTk2NTJfQ0hBTk5FTF9CVUZGRVJfQllURVMgICAgKDQqUk1FOTY1Ml9DSEFOTkVMX0JVRkZFUl9TQU1QTEVTKQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciBETUEgdHJhbnNmZXJzLiB0aGUKKyAgIHNpemUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIC0gdGhlIAorICAgOTYzNiBzdGlsbCB1c2VzIHRoZSBzYW1lIG1lbW9yeSBhcmVhLgorCisgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgMSBtb3JlIGNoYW5uZWwgdGhhbiBpcyBhcHBhcmVudGx5IG5lZWRlZAorICAgYmVjYXVzZSB0aGUgaC93IHNlZW1zIHRvIHdyaXRlIDEgYnl0ZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGFzdAorICAgcGFnZS4gU2lnaC4KKyovCisKKyNkZWZpbmUgUk1FOTY1Ml9ETUFfQVJFQV9CWVRFUyAoKFJNRTk2NTJfTkNIQU5ORUxTKzEpICogUk1FOTY1Ml9DSEFOTkVMX0JVRkZFUl9CWVRFUykKKyNkZWZpbmUgUk1FOTY1Ml9ETUFfQVJFQV9LSUxPQllURVMgKFJNRTk2NTJfRE1BX0FSRUFfQllURVMvMTAyNCkKKwordHlwZWRlZiBzdHJ1Y3Qgc25kX3JtZTk2NTIgeworCWludCBkZXY7CisKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJdm9pZCBfX2lvbWVtICppb2Jhc2U7CisJCisJaW50IHByZWNpc2VfcHRyOworCisJdTMyIGNvbnRyb2xfcmVnaXN0ZXI7CS8qIGNhY2hlZCB2YWx1ZSAqLworCXUzMiB0aHJ1X2JpdHM7CQkvKiB0aHJ1IDE9b24sIDA9b2ZmIGNoYW5uZWwgMT1CaXQxLi4uIGNoYW5uZWwgMjY9IEJpdDI2ICovCisKKwl1MzIgY3JlZ19zcGRpZjsKKwl1MzIgY3JlZ19zcGRpZl9zdHJlYW07CisKKwljaGFyICpjYXJkX25hbWU7CQkvKiBoYW1tZXJmYWxsIG9yIGhhbW1lcmZhbGwgbGlnaHQgbmFtZXMgKi8KKworICAgICAgICBzaXplX3QgaHdfb2Zmc2V0bWFzazsgICAgIAkvKiAmLXdpdGggc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCByZWFsIGh3X29mZnNldCAqLworCXNpemVfdCBwcmV2X2h3X29mZnNldDsJCS8qIHByZXZpb3VzIGh3IG9mZnNldCAqLworCXNpemVfdCBtYXhfaml0dGVyOwkJLyogbWF4aW11bSBqaXR0ZXIgaW4gZnJhbWVzIGZvciAKKwkJCQkJICAgaHcgcG9pbnRlciAqLworCXNpemVfdCBwZXJpb2RfYnl0ZXM7CQkvKiBndWVzcyB3aGF0IHRoaXMgaXMgKi8KKworCXVuc2lnbmVkIGNoYXIgZHNfY2hhbm5lbHM7CisJdW5zaWduZWQgY2hhciBzc19jaGFubmVsczsJLyogZGlmZmVyZW50IGZvciBoYW1tZXJmYWxsL2hhbW1lcmZhbGwtbGlnaHQgKi8KKworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBwbGF5YmFja19kbWFfYnVmOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBjYXB0dXJlX2RtYV9idWY7CisKKwl1bnNpZ25lZCBjaGFyICpjYXB0dXJlX2J1ZmZlcjsJLyogc3VpdGFibHkgYWxpZ25lZCBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciAqcGxheWJhY2tfYnVmZmVyOwkvKiBzdWl0YWJseSBhbGlnbmVkIGFkZHJlc3MgKi8KKworCXBpZF90IGNhcHR1cmVfcGlkOworCXBpZF90IHBsYXliYWNrX3BpZDsKKworCXNuZF9wY21fc3Vic3RyZWFtX3QgKmNhcHR1cmVfc3Vic3RyZWFtOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnBsYXliYWNrX3N1YnN0cmVhbTsKKwlpbnQgcnVubmluZzsKKworICAgICAgICBpbnQgcGFzc3RocnU7ICAgICAgICAgICAgICAgICAgIC8qIG5vbi16ZXJvIGlmIGRvaW5nIHBhc3MtdGhydSAqLworICAgICAgICBpbnQgaHdfcmV2OyAgICAgICAgICAgICAgICAgICAgIC8qIGgvdyByZXYgKiAxMCAoaS5lLiAxLjUgaGFzIGh3X3JldiA9IDE1KSAqLworCisJaW50IGxhc3Rfc3BkaWZfc2FtcGxlX3JhdGU7CS8qIHNvIHRoYXQgd2UgY2FuIGNhdGNoIGV4dGVybmFsbHkgLi4uICovCisJaW50IGxhc3RfYWRhdF9zYW1wbGVfcmF0ZTsJLyogLi4uIGluZHVjZWQgcmF0ZSBjaGFuZ2VzICAgICAgICAgICAgKi8KKworICAgICAgICBjaGFyICpjaGFubmVsX21hcDsKKworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc25kX3BjbV90ICpwY207CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfa2NvbnRyb2xfdCAqc3BkaWZfY3RsOworCit9IHJtZTk2NTJfdDsKKworLyogVGhlc2UgdGFibGVzIG1hcCB0aGUgQUxTQSBjaGFubmVscyAxLi5OIHRvIHRoZSBjaGFubmVscyB0aGF0IHdlCisgICBuZWVkIHRvIHVzZSBpbiBvcmRlciB0byBmaW5kIHRoZSByZWxldmFudCBjaGFubmVsIGJ1ZmZlci4gUk1FCisgICByZWZlciB0byB0aGlzIGtpbmQgb2YgbWFwcGluZyBhcyBiZXR3ZWVuICJ0aGUgQURBVCBjaGFubmVsIGFuZAorICAgdGhlIERNQSBjaGFubmVsLiIgV2UgaW5kZXggaXQgdXNpbmcgdGhlIGxvZ2ljYWwgYXVkaW8gY2hhbm5lbCwKKyAgIGFuZCB0aGUgdmFsdWUgaXMgdGhlIERNQSBjaGFubmVsIChpLmUuIGNoYW5uZWwgYnVmZmVyIG51bWJlcikKKyAgIHdoZXJlIHRoZSBkYXRhIGZvciB0aGF0IGNoYW5uZWwgY2FuIGJlIHJlYWQvd3JpdHRlbiBmcm9tL3RvLgorKi8KKworc3RhdGljIGNoYXIgY2hhbm5lbF9tYXBfOTY1Ml9zc1syNl0gPSB7CisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LAorCTE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNQorfTsKKworc3RhdGljIGNoYXIgY2hhbm5lbF9tYXBfOTYzNl9zc1syNl0gPSB7CisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgCisJLyogY2hhbm5lbHMgMTYgYW5kIDE3IGFyZSBTL1BESUYgKi8KKwkyNCwgMjUsCisJLyogY2hhbm5lbHMgMTgtMjUgZG9uJ3QgZXhpc3QgKi8KKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKK307CisKK3N0YXRpYyBjaGFyIGNoYW5uZWxfbWFwXzk2NTJfZHNbMjZdID0geworCS8qIEFEQVQgY2hhbm5lbHMgYXJlIHJlbWFwcGVkICovCisJMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMSwgMjMsCisJLyogY2hhbm5lbHMgMTIgYW5kIDEzIGFyZSBTL1BESUYgKi8KKwkyNCwgMjUsCisJLyogb3RoZXJzIGRvbid0IGV4aXN0ICovCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCit9OworCitzdGF0aWMgY2hhciBjaGFubmVsX21hcF85NjM2X2RzWzI2XSA9IHsKKwkvKiBBREFUIGNoYW5uZWxzIGFyZSByZW1hcHBlZCAqLworCTEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsCisJLyogY2hhbm5lbHMgOCBhbmQgOSBhcmUgUy9QRElGICovCisJMjQsIDI1CisJLyogb3RoZXJzIGRvbid0IGV4aXN0ICovCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorfTsKKworc3RhdGljIGludCBzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwgc2l6ZV90IHNpemUpCit7CisJZG1hYi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJZG1hYi0+ZGV2LmRldiA9IHNuZF9kbWFfcGNpX2RhdGEocGNpKTsKKwlpZiAoISBzbmRfZG1hX2dldF9yZXNlcnZlZF9idWYoZG1hYiwgc25kX2RtYV9wY2lfYnVmX2lkKHBjaSkpKSB7CisJCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShwY2kpLAorCQkJCQlzaXplLCBkbWFiKSA8IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9oYW1tZXJmYWxsX2ZyZWVfYnVmZmVyKHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpZiAoZG1hYi0+YXJlYSkKKwkJc25kX2RtYV9yZXNlcnZlX2J1ZihkbWFiLCBzbmRfZG1hX3BjaV9idWZfaWQocGNpKSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF9ybWU5NjUyX2lkc1tdID0geworCXsKKwkJLnZlbmRvcgkgICA9IDB4MTBlZSwKKwkJLmRldmljZQkgICA9IDB4M2ZjNCwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCX0sCS8qIFJNRSBEaWdpOTY1MiAqLworCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfcm1lOTY1Ml9pZHMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTY1Ml93cml0ZShybWU5NjUyX3QgKnJtZTk2NTIsIGludCByZWcsIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwgcm1lOTY1Mi0+aW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcm1lOTY1Ml9yZWFkKHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwocm1lOTY1Mi0+aW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25kX3JtZTk2NTJfdXNlX2lzX2V4Y2x1c2l2ZShybWU5NjUyX3QgKnJtZTk2NTIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZybWU5NjUyLT5sb2NrLCBmbGFncyk7CisJaWYgKChybWU5NjUyLT5wbGF5YmFja19waWQgIT0gcm1lOTY1Mi0+Y2FwdHVyZV9waWQpICYmCisJICAgIChybWU5NjUyLT5wbGF5YmFja19waWQgPj0gMCkgJiYgKHJtZTk2NTItPmNhcHR1cmVfcGlkID49IDApKSB7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJtZTk2NTItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBybWU5NjUyX2FkYXRfc2FtcGxlX3JhdGUocm1lOTY1Ml90ICpybWU5NjUyKQoreworCWlmIChybWU5NjUyX3J1bm5pbmdfZG91YmxlX3NwZWVkKHJtZTk2NTIpKSB7CisJCXJldHVybiAocm1lOTY1Ml9yZWFkKHJtZTk2NTIsIFJNRTk2NTJfc3RhdHVzX3JlZ2lzdGVyKSAmCisJCQlSTUU5NjUyX2ZzNDgpID8gOTYwMDAgOiA4ODIwMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHJtZTk2NTJfcmVhZChybWU5NjUyLCBSTUU5NjUyX3N0YXR1c19yZWdpc3RlcikgJgorCQkJUk1FOTY1Ml9mczQ4KSA/IDQ4MDAwIDogNDQxMDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTY1Ml9jb21wdXRlX3BlcmlvZF9zaXplKHJtZTk2NTJfdCAqcm1lOTY1MikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSBybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTY1Ml9sYXRlbmN5OworCXJtZTk2NTItPnBlcmlvZF9ieXRlcyA9IDEgPDwgKChybWU5NjUyX2RlY29kZV9sYXRlbmN5KGkpICsgOCkpOworCXJtZTk2NTItPmh3X29mZnNldG1hc2sgPSAKKwkJKHJtZTk2NTItPnBlcmlvZF9ieXRlcyAqIDIgLSAxKSAmIFJNRTk2NTJfYnVmX3BvczsKKwlybWU5NjUyLT5tYXhfaml0dGVyID0gODA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBybWU5NjUyX2h3X3BvaW50ZXIocm1lOTY1Ml90ICpybWU5NjUyKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IG9mZnNldCwgZnJhZzsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwZXJpb2Rfc2l6ZSA9IHJtZTk2NTItPnBlcmlvZF9ieXRlcyAvIDQ7CisJc25kX3BjbV9zZnJhbWVzX3QgZGVsdGE7CisKKwlzdGF0dXMgPSBybWU5NjUyX3JlYWQocm1lOTY1MiwgUk1FOTY1Ml9zdGF0dXNfcmVnaXN0ZXIpOworCWlmICghcm1lOTY1Mi0+cHJlY2lzZV9wdHIpCisJCXJldHVybiAoc3RhdHVzICYgUk1FOTY1Ml9idWZmZXJfaWQpID8gcGVyaW9kX3NpemUgOiAwOworCW9mZnNldCA9IHN0YXR1cyAmIFJNRTk2NTJfYnVmX3BvczsKKworCS8qIFRoZSBoYXJkd2FyZSBtYXkgZ2l2ZSBhIGJhY2t3YXJkIG1vdmVtZW50IGZvciB1cCB0byA4MCBmcmFtZXMKKyAgICAgICAgICAgTWFydGluIEtpcnN0IDxtYXJ0aW4ua2lyc3RAZnJlZW5ldC5kZT4ga25vd3MgdGhlIGRldGFpbHMuCisJKi8KKworCWRlbHRhID0gcm1lOTY1Mi0+cHJldl9od19vZmZzZXQgLSBvZmZzZXQ7CisJZGVsdGEgJj0gMHhmZmZmOworCWlmIChkZWx0YSA8PSAoc25kX3BjbV9zZnJhbWVzX3Qpcm1lOTY1Mi0+bWF4X2ppdHRlciAqIDQpCisJCW9mZnNldCA9IHJtZTk2NTItPnByZXZfaHdfb2Zmc2V0OworCWVsc2UKKwkJcm1lOTY1Mi0+cHJldl9od19vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICY9IHJtZTk2NTItPmh3X29mZnNldG1hc2s7CisJb2Zmc2V0IC89IDQ7CisJZnJhZyA9IHN0YXR1cyAmIFJNRTk2NTJfYnVmZmVyX2lkOworCisJaWYgKG9mZnNldCA8IHBlcmlvZF9zaXplKSB7CisJCWlmIChvZmZzZXQgPiBybWU5NjUyLT5tYXhfaml0dGVyKSB7CisJCQlpZiAoZnJhZykKKwkJCQlwcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaHdfcG9pbnRlciBwb3NpdGlvbiAoYnVmaWQgPT0gMCk6IHN0YXR1czogJXggb2Zmc2V0OiAlZFxuIiwgc3RhdHVzLCBvZmZzZXQpOworCQl9IGVsc2UgaWYgKCFmcmFnKQorCQkJcmV0dXJuIDA7CisJCW9mZnNldCAtPSBybWU5NjUyLT5tYXhfaml0dGVyOworCQlpZiAob2Zmc2V0IDwgMCkKKwkJCW9mZnNldCArPSBwZXJpb2Rfc2l6ZSAqIDI7CisJfSBlbHNlIHsKKwkJaWYgKG9mZnNldCA+IHBlcmlvZF9zaXplICsgcm1lOTY1Mi0+bWF4X2ppdHRlcikgeworCQkJaWYgKCFmcmFnKQorCQkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAxKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLCBzdGF0dXMsIG9mZnNldCk7CisJCX0gZWxzZSBpZiAoZnJhZykKKwkJCXJldHVybiBwZXJpb2Rfc2l6ZTsKKwkJb2Zmc2V0IC09IHJtZTk2NTItPm1heF9qaXR0ZXI7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJtZTk2NTJfcmVzZXRfaHdfcG9pbnRlcihybWU5NjUyX3QgKnJtZTk2NTIpCit7CisJaW50IGk7CisKKwkvKiByZXNldCB0aGUgRklGTyBwb2ludGVyIHRvIHplcm8uIFdlIGRvIHRoaXMgYnkgd3JpdGluZyB0byA4CisJICAgcmVnaXN0ZXJzLCBlYWNoIG9mIHdoaWNoIGlzIGEgMzJiaXQgd2lkZSByZWdpc3RlciwgYW5kIHNldAorCSAgIHRoZW0gYWxsIHRvIHplcm8uIE5vdGUgdGhhdCBzLT5pb2Jhc2UgaXMgYSBwb2ludGVyIHRvCisJICAgaW50MzIsIG5vdCBwb2ludGVyIHRvIGNoYXIuICAKKwkqLworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIGkgKiA0LCAwKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJcm1lOTY1Mi0+cHJldl9od19vZmZzZXQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTY1Ml9zdGFydChybWU5NjUyX3QgKnMpCit7CisJcy0+Y29udHJvbF9yZWdpc3RlciB8PSAoUk1FOTY1Ml9JRSB8IFJNRTk2NTJfc3RhcnRfYml0KTsKKwlybWU5NjUyX3dyaXRlKHMsIFJNRTk2NTJfY29udHJvbF9yZWdpc3Rlciwgcy0+Y29udHJvbF9yZWdpc3Rlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBybWU5NjUyX3N0b3Aocm1lOTY1Ml90ICpzKQoreworCXMtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihSTUU5NjUyX3N0YXJ0X2JpdCB8IFJNRTk2NTJfSUUpOworCXJtZTk2NTJfd3JpdGUocywgUk1FOTY1Ml9jb250cm9sX3JlZ2lzdGVyLCBzLT5jb250cm9sX3JlZ2lzdGVyKTsKK30KKworc3RhdGljIGludCBybWU5NjUyX3NldF9pbnRlcnJ1cHRfaW50ZXJ2YWwocm1lOTY1Ml90ICpzLAorCQkJCQkgIHVuc2lnbmVkIGludCBmcmFtZXMpCit7CisJaW50IHJlc3RhcnQgPSAwOworCWludCBuOworCisJc3Bpbl9sb2NrX2lycSgmcy0+bG9jayk7CisKKwlpZiAoKHJlc3RhcnQgPSBzLT5ydW5uaW5nKSkgeworCQlybWU5NjUyX3N0b3Aocyk7CisJfQorCisJZnJhbWVzID4+PSA3OworCW4gPSAwOworCXdoaWxlIChmcmFtZXMpIHsKKwkJbisrOworCQlmcmFtZXMgPj49IDE7CisJfQorCisJcy0+Y29udHJvbF9yZWdpc3RlciAmPSB+Uk1FOTY1Ml9sYXRlbmN5OworCXMtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gcm1lOTY1Ml9lbmNvZGVfbGF0ZW5jeShuKTsKKworCXJtZTk2NTJfd3JpdGUocywgUk1FOTY1Ml9jb250cm9sX3JlZ2lzdGVyLCBzLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJtZTk2NTJfY29tcHV0ZV9wZXJpb2Rfc2l6ZShzKTsKKworCWlmIChyZXN0YXJ0KQorCQlybWU5NjUyX3N0YXJ0KHMpOworCisJc3Bpbl91bmxvY2tfaXJxKCZzLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJtZTk2NTJfc2V0X3JhdGUocm1lOTY1Ml90ICpybWU5NjUyLCBpbnQgcmF0ZSkKK3sKKwlpbnQgcmVzdGFydDsKKwlpbnQgcmVqZWN0X2lmX29wZW4gPSAwOworCWludCB4cmF0ZTsKKworCWlmICghc25kX3JtZTk2NTJfdXNlX2lzX2V4Y2x1c2l2ZSAocm1lOTY1MikpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBDaGFuZ2luZyBmcm9tIGEgInNpbmdsZSBzcGVlZCIgdG8gYSAiZG91YmxlIHNwZWVkIiByYXRlIGlzCisJICAgbm90IGFsbG93ZWQgaWYgYW55IHN1YnN0cmVhbXMgYXJlIG9wZW4uIFRoaXMgaXMgYmVjYXVzZQorCSAgIHN1Y2ggYSBjaGFuZ2UgY2F1c2VzIGEgc2hpZnQgaW4gdGhlIGxvY2F0aW9uIG9mIAorCSAgIHRoZSBETUEgYnVmZmVycyBhbmQgYSByZWR1Y3Rpb24gaW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUKKwkgICBidWZmZXJzLiAKKworCSAgIE5vdGUgdGhhdCBhIHNpbWlsYXIgYnV0IGVzc2VudGlhbGx5IGluc29sdWJsZSBwcm9ibGVtCisJICAgZXhpc3RzIGZvciBleHRlcm5hbGx5LWRyaXZlbiByYXRlIGNoYW5nZXMuIEFsbCB3ZSBjYW4gZG8KKwkgICBpcyB0byBmbGFnIHJhdGUgY2hhbmdlcyBpbiB0aGUgcmVhZC93cml0ZSByb3V0aW5lcy4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXhyYXRlID0gcm1lOTY1Ml9hZGF0X3NhbXBsZV9yYXRlKHJtZTk2NTIpOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJaWYgKHhyYXRlID4gNDgwMDApIHsKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJfQorCQlyYXRlID0gMDsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJaWYgKHhyYXRlID4gNDgwMDApIHsKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJfQorCQlyYXRlID0gUk1FOTY1Ml9mcmVxOworCQlicmVhazsKKwljYXNlIDg4MjAwOgorCQlpZiAoeHJhdGUgPCA0ODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGUgPSBSTUU5NjUyX0RTOworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQlpZiAoeHJhdGUgPCA0ODAwMCkgeworCQkJcmVqZWN0X2lmX29wZW4gPSAxOworCQl9CisJCXJhdGUgPSBSTUU5NjUyX0RTIHwgUk1FOTY1Ml9mcmVxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVqZWN0X2lmX29wZW4gJiYgKHJtZTk2NTItPmNhcHR1cmVfcGlkID49IDAgfHwgcm1lOTY1Mi0+cGxheWJhY2tfcGlkID49IDApKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKChyZXN0YXJ0ID0gcm1lOTY1Mi0+cnVubmluZykpIHsKKwkJcm1lOTY1Ml9zdG9wKHJtZTk2NTIpOworCX0KKwlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICY9IH4oUk1FOTY1Ml9mcmVxIHwgUk1FOTY1Ml9EUyk7CisJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciB8PSByYXRlOworCXJtZTk2NTJfd3JpdGUocm1lOTY1MiwgUk1FOTY1Ml9jb250cm9sX3JlZ2lzdGVyLCBybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCWlmIChyZXN0YXJ0KSB7CisJCXJtZTk2NTJfc3RhcnQocm1lOTY1Mik7CisJfQorCisJaWYgKHJhdGUgJiBSTUU5NjUyX0RTKSB7CisJCWlmIChybWU5NjUyLT5zc19jaGFubmVscyA9PSBSTUU5NjUyX05DSEFOTkVMUykgeworCQkJcm1lOTY1Mi0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF85NjUyX2RzOworCQl9IGVsc2UgeworCQkJcm1lOTY1Mi0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF85NjM2X2RzOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJtZTk2NTItPnNzX2NoYW5uZWxzID09IFJNRTk2NTJfTkNIQU5ORUxTKSB7CisJCQlybWU5NjUyLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwXzk2NTJfc3M7CisJCX0gZWxzZSB7CisJCQlybWU5NjUyLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwXzk2MzZfc3M7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBybWU5NjUyX3NldF90aHJ1KHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IGNoYW5uZWwsIGludCBlbmFibGUpCit7CisJaW50IGk7CisKKwlybWU5NjUyLT5wYXNzdGhydSA9IDA7CisKKwlpZiAoY2hhbm5lbCA8IDApIHsKKworCQkvKiBzZXQgdGhydSBmb3IgYWxsIGNoYW5uZWxzICovCisKKwkJaWYgKGVuYWJsZSkgeworCQkJZm9yIChpID0gMDsgaSA8IFJNRTk2NTJfTkNIQU5ORUxTOyBpKyspIHsKKwkJCQlybWU5NjUyLT50aHJ1X2JpdHMgfD0gKDEgPDwgaSk7CisJCQkJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX3RocnVfYmFzZSArIGkgKiA0LCAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBSTUU5NjUyX05DSEFOTkVMUzsgaSsrKSB7CisJCQkJcm1lOTY1Mi0+dGhydV9iaXRzICY9IH4oMSA8PCBpKTsKKwkJCQlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIFJNRTk2NTJfdGhydV9iYXNlICsgaSAqIDQsIDApOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlpbnQgbWFwcGVkX2NoYW5uZWw7CisKKwkJc25kX2Fzc2VydChjaGFubmVsID09IFJNRTk2NTJfTkNIQU5ORUxTLCByZXR1cm4pOworCisJCW1hcHBlZF9jaGFubmVsID0gcm1lOTY1Mi0+Y2hhbm5lbF9tYXBbY2hhbm5lbF07CisKKwkJaWYgKGVuYWJsZSkgeworCQkJcm1lOTY1Mi0+dGhydV9iaXRzIHw9ICgxIDw8IG1hcHBlZF9jaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCXJtZTk2NTItPnRocnVfYml0cyAmPSB+KDEgPDwgbWFwcGVkX2NoYW5uZWwpOworCQl9CisKKwkJcm1lOTY1Ml93cml0ZShybWU5NjUyLAorCQkJICAgICAgIFJNRTk2NTJfdGhydV9iYXNlICsgbWFwcGVkX2NoYW5uZWwgKiA0LAorCQkJICAgICAgIGVuYWJsZSA/IDEgOiAwKTsJCQkgICAgICAgCisJfQorfQorCitzdGF0aWMgaW50IHJtZTk2NTJfc2V0X3Bhc3N0aHJ1KHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IG9ub2ZmKQoreworCWlmIChvbm9mZikgeworCQlybWU5NjUyX3NldF90aHJ1KHJtZTk2NTIsIC0xLCAxKTsKKworCQkvKiB3ZSBkb24ndCB3YW50IGludGVycnVwdHMsIHNvIGRvIGEKKwkJICAgY3VzdG9tIHZlcnNpb24gb2Ygcm1lOTY1Ml9zdGFydCgpLgorCQkqLworCisJCXJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgPQorCQkJUk1FOTY1Ml9pbnBfMCB8IAorCQkJcm1lOTY1Ml9lbmNvZGVfbGF0ZW5jeSg3KSB8CisJCQlSTUU5NjUyX3N0YXJ0X2JpdDsKKworCQlybWU5NjUyX3Jlc2V0X2h3X3BvaW50ZXIocm1lOTY1Mik7CisKKwkJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsCisJCQkgICAgICBybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyKTsKKwkJcm1lOTY1Mi0+cGFzc3RocnUgPSAxOworCX0gZWxzZSB7CisJCXJtZTk2NTJfc2V0X3RocnUocm1lOTY1MiwgLTEsIDApOworCQlybWU5NjUyX3N0b3Aocm1lOTY1Mik7CQkKKwkJcm1lOTY1Mi0+cGFzc3RocnUgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IG1hc2ssIGludCBvbm9mZikKK3sKKwlpZiAob25vZmYpIAorCQlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyIHw9IG1hc2s7CisJZWxzZSAKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmPSB+bWFzazsKKwkJCisJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsIHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIpOworfQorCitzdGF0aWMgdm9pZCBybWU5NjUyX3NwZGlmX3dyaXRlX2J5dGUgKHJtZTk2NTJfdCAqcm1lOTY1MiwgY29uc3QgaW50IHZhbCkKK3sKKwlsb25nIG1hc2s7CisJbG9uZyBpOworCisJZm9yIChpID0gMCwgbWFzayA9IDB4ODA7IGkgPCA4OyBpKyssIG1hc2sgPj49IDEpIHsKKwkJaWYgKHZhbCAmIG1hc2spCisJCQlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfV1JJVEUsIDEpOworCQllbHNlIAorCQkJcm1lOTY1Ml9zcGRpZl9zZXRfYml0IChybWU5NjUyLCBSTUU5NjUyX1NQRElGX1dSSVRFLCAwKTsKKworCQlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfQ0xPQ0ssIDEpOworCQlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfQ0xPQ0ssIDApOworCX0KK30KKworc3RhdGljIGludCBybWU5NjUyX3NwZGlmX3JlYWRfYnl0ZSAocm1lOTY1Ml90ICpybWU5NjUyKQoreworCWxvbmcgbWFzazsKKwlsb25nIHZhbDsKKwlsb25nIGk7CisKKwl2YWwgPSAwOworCisJZm9yIChpID0gMCwgbWFzayA9IDB4ODA7ICBpIDwgODsgaSsrLCBtYXNrID4+PSAxKSB7CisJCXJtZTk2NTJfc3BkaWZfc2V0X2JpdCAocm1lOTY1MiwgUk1FOTY1Ml9TUERJRl9DTE9DSywgMSk7CisJCWlmIChybWU5NjUyX3JlYWQgKHJtZTk2NTIsIFJNRTk2NTJfc3RhdHVzX3JlZ2lzdGVyKSAmIFJNRTk2NTJfU1BESUZfUkVBRCkKKwkJCXZhbCB8PSBtYXNrOworCQlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfQ0xPQ0ssIDApOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJtZTk2NTJfd3JpdGVfc3BkaWZfY29kZWMgKHJtZTk2NTJfdCAqcm1lOTY1MiwgY29uc3QgaW50IGFkZHJlc3MsIGNvbnN0IGludCBkYXRhKQoreworCXJtZTk2NTJfc3BkaWZfc2V0X2JpdCAocm1lOTY1MiwgUk1FOTY1Ml9TUERJRl9TRUxFQ1QsIDEpOworCXJtZTk2NTJfc3BkaWZfd3JpdGVfYnl0ZSAocm1lOTY1MiwgMHgyMCk7CisJcm1lOTY1Ml9zcGRpZl93cml0ZV9ieXRlIChybWU5NjUyLCBhZGRyZXNzKTsKKwlybWU5NjUyX3NwZGlmX3dyaXRlX2J5dGUgKHJtZTk2NTIsIGRhdGEpOworCXJtZTk2NTJfc3BkaWZfc2V0X2JpdCAocm1lOTY1MiwgUk1FOTY1Ml9TUERJRl9TRUxFQ1QsIDApOworfQorCisKK3N0YXRpYyBpbnQgcm1lOTY1Ml9zcGRpZl9yZWFkX2NvZGVjIChybWU5NjUyX3QgKnJtZTk2NTIsIGNvbnN0IGludCBhZGRyZXNzKQoreworCWludCByZXQ7CisKKwlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfU0VMRUNULCAxKTsKKwlybWU5NjUyX3NwZGlmX3dyaXRlX2J5dGUgKHJtZTk2NTIsIDB4MjApOworCXJtZTk2NTJfc3BkaWZfd3JpdGVfYnl0ZSAocm1lOTY1MiwgYWRkcmVzcyk7CisJcm1lOTY1Ml9zcGRpZl9zZXRfYml0IChybWU5NjUyLCBSTUU5NjUyX1NQRElGX1NFTEVDVCwgMCk7CisJcm1lOTY1Ml9zcGRpZl9zZXRfYml0IChybWU5NjUyLCBSTUU5NjUyX1NQRElGX1NFTEVDVCwgMSk7CisKKwlybWU5NjUyX3NwZGlmX3dyaXRlX2J5dGUgKHJtZTk2NTIsIDB4MjEpOworCXJldCA9IHJtZTk2NTJfc3BkaWZfcmVhZF9ieXRlIChybWU5NjUyKTsKKwlybWU5NjUyX3NwZGlmX3NldF9iaXQgKHJtZTk2NTIsIFJNRTk2NTJfU1BESUZfU0VMRUNULCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJtZTk2NTJfaW5pdGlhbGl6ZV9zcGRpZl9yZWNlaXZlciAocm1lOTY1Ml90ICpybWU5NjUyKQoreworCS8qIFhYWCB3aGF0IHVuc2V0cyB0aGlzID8gKi8KKworCXJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgfD0gUk1FOTY1Ml9TUERJRl9SRVNFVDsKKworCXJtZTk2NTJfd3JpdGVfc3BkaWZfY29kZWMgKHJtZTk2NTIsIDQsIDB4NDApOworCXJtZTk2NTJfd3JpdGVfc3BkaWZfY29kZWMgKHJtZTk2NTIsIDE3LCAweDEzKTsKKwlybWU5NjUyX3dyaXRlX3NwZGlmX2NvZGVjIChybWU5NjUyLCA2LCAweDAyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcm1lOTY1Ml9zcGRpZl9zYW1wbGVfcmF0ZShybWU5NjUyX3QgKnMpCit7CisJdW5zaWduZWQgaW50IHJhdGVfYml0czsKKworCWlmIChybWU5NjUyX3JlYWQocywgUk1FOTY1Ml9zdGF0dXNfcmVnaXN0ZXIpICYgUk1FOTY1Ml9FUkYpIHsKKwkJcmV0dXJuIC0xOwkvKiBlcnJvciBjb25kaXRpb24gKi8KKwl9CisJCisJaWYgKHMtPmh3X3JldiA9PSAxNSkgeworCisJCWludCB4LCB5LCByZXQ7CisJCQorCQl4ID0gcm1lOTY1Ml9zcGRpZl9yZWFkX2NvZGVjIChzLCAzMCk7CisKKwkJaWYgKHggIT0gMCkgCisJCQl5ID0gNDgwMDAgKiA2NCAvIHg7CisJCWVsc2UKKwkJCXkgPSAwOworCisJCWlmICAgICAgKHkgPiAzMDQwMCAmJiB5IDwgMzM2MDApICByZXQgPSAzMjAwMDsgCisJCWVsc2UgaWYgKHkgPiA0MTkwMCAmJiB5IDwgNDYwMDApICByZXQgPSA0NDEwMDsKKwkJZWxzZSBpZiAoeSA+IDQ2MDAwICYmIHkgPCA1MDQwMCkgIHJldCA9IDQ4MDAwOworCQllbHNlIGlmICh5ID4gNjA4MDAgJiYgeSA8IDY3MjAwKSAgcmV0ID0gNjQwMDA7CisJCWVsc2UgaWYgKHkgPiA4MzcwMCAmJiB5IDwgOTIwMDApICByZXQgPSA4ODIwMDsKKwkJZWxzZSBpZiAoeSA+IDkyMDAwICYmIHkgPCAxMDAwMDApIHJldCA9IDk2MDAwOworCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlX2JpdHMgPSBybWU5NjUyX3JlYWQocywgUk1FOTY1Ml9zdGF0dXNfcmVnaXN0ZXIpICYgUk1FOTY1Ml9GOworCisJc3dpdGNoIChybWU5NjUyX2RlY29kZV9zcGRpZl9yYXRlKHJhdGVfYml0cykpIHsKKwljYXNlIDB4NzoKKwkJcmV0dXJuIDMyMDAwOworCQlicmVhazsKKworCWNhc2UgMHg2OgorCQlyZXR1cm4gNDQxMDA7CisJCWJyZWFrOworCisJY2FzZSAweDU6CisJCXJldHVybiA0ODAwMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4NDoKKwkJcmV0dXJuIDg4MjAwOworCQlicmVhazsKKworCWNhc2UgMHgzOgorCQlyZXR1cm4gOTYwMDA7CisJCWJyZWFrOworCisJY2FzZSAweDA6CisJCXJldHVybiA2NDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzbmRfcHJpbnRrKCIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAorCQkJICAgcy0+Y2FyZF9uYW1lLCByYXRlX2JpdHMpOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIENvbnRyb2wgSW50ZXJmYWNlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIHNuZF9ybWU5NjUyX2NvbnZlcnRfZnJvbV9hZXMoc25kX2Flc19pZWM5NThfdCAqYWVzKQoreworCXUzMiB2YWwgPSAwOworCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpID8gUk1FOTY1Ml9QUk8gOiAwOworCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9OT05BVURJTykgPyBSTUU5NjUyX0RvbGJ5IDogMDsKKwlpZiAodmFsICYgUk1FOTY1Ml9QUk8pCisJCXZhbCB8PSAoYWVzLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNSkgPyBSTUU5NjUyX0VNUCA6IDA7CisJZWxzZQorCQl2YWwgfD0gKGFlcy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpID8gUk1FOTY1Ml9FTVAgOiAwOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9ybWU5NjUyX2NvbnZlcnRfdG9fYWVzKHNuZF9hZXNfaWVjOTU4X3QgKmFlcywgdTMyIHZhbCkKK3sKKwlhZXMtPnN0YXR1c1swXSA9ICgodmFsICYgUk1FOTY1Ml9QUk8pID8gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIDogMCkgfAorCQkJICgodmFsICYgUk1FOTY1Ml9Eb2xieSkgPyBJRUM5NThfQUVTMF9OT05BVURJTyA6IDApOworCWlmICh2YWwgJiBSTUU5NjUyX1BSTykKKwkJYWVzLT5zdGF0dXNbMF0gfD0gKHZhbCAmIFJNRTk2NTJfRU1QKSA/IElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1IDogMDsKKwllbHNlCisJCWFlcy0+c3RhdHVzWzBdIHw9ICh2YWwgJiBSTUU5NjUyX0VNUCkgPyBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9jb250cm9sX3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzbmRfcm1lOTY1Ml9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwgcm1lOTY1Mi0+Y3JlZ19zcGRpZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1MzIgdmFsOworCQorCXZhbCA9IHNuZF9ybWU5NjUyX2NvbnZlcnRfZnJvbV9hZXMoJnVjb250cm9sLT52YWx1ZS5pZWM5NTgpOworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCWNoYW5nZSA9IHZhbCAhPSBybWU5NjUyLT5jcmVnX3NwZGlmOworCXJtZTk2NTItPmNyZWdfc3BkaWYgPSB2YWw7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzbmRfcm1lOTY1Ml9jb252ZXJ0X3RvX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCwgcm1lOTY1Mi0+Y3JlZ19zcGRpZl9zdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXUzMiB2YWw7CisJCisJdmFsID0gc25kX3JtZTk2NTJfY29udmVydF9mcm9tX2FlcygmdWNvbnRyb2wtPnZhbHVlLmllYzk1OCk7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IHJtZTk2NTItPmNyZWdfc3BkaWZfc3RyZWFtOworCXJtZTk2NTItPmNyZWdfc3BkaWZfc3RyZWFtID0gdmFsOworCXJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihSTUU5NjUyX1BSTyB8IFJNRTk2NTJfRG9sYnkgfCBSTUU5NjUyX0VNUCk7CisJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsIHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgfD0gdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9tYXNrX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfbWFza19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFJNRTk2NTJfQURBVDFfSU4oeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fYWRhdDFfaW4sIFwKKyAgLmdldCA9IHNuZF9ybWU5NjUyX2dldF9hZGF0MV9pbiwgXAorICAucHV0ID0gc25kX3JtZTk2NTJfcHV0X2FkYXQxX2luIH0KKworc3RhdGljIHVuc2lnbmVkIGludCBybWU5NjUyX2FkYXQxX2luKHJtZTk2NTJfdCAqcm1lOTY1MikKK3sKKwlpZiAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfQURBVDFfSU5URVJOQUwpCisJCXJldHVybiAxOyAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBybWU5NjUyX3NldF9hZGF0MV9pbnB1dChybWU5NjUyX3QgKnJtZTk2NTIsIGludCBpbnRlcm5hbCkKK3sKKwlpbnQgcmVzdGFydCA9IDA7CisKKwlpZiAoaW50ZXJuYWwpIHsKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciB8PSBSTUU5NjUyX0FEQVQxX0lOVEVSTkFMOworCX0gZWxzZSB7CisJCXJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJj0gflJNRTk2NTJfQURBVDFfSU5URVJOQUw7CisJfQorCisJLyogWFhYIGRvIHdlIGFjdHVhbGx5IG5lZWQgdG8gc3RvcCB0aGUgY2FyZCB3aGVuIHdlIGRvIHRoaXMgPyAqLworCisJaWYgKChyZXN0YXJ0ID0gcm1lOTY1Mi0+cnVubmluZykpIHsKKwkJcm1lOTY1Ml9zdG9wKHJtZTk2NTIpOworCX0KKworCXJtZTk2NTJfd3JpdGUocm1lOTY1MiwgUk1FOTY1Ml9jb250cm9sX3JlZ2lzdGVyLCBybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCWlmIChyZXN0YXJ0KSB7CisJCXJtZTk2NTJfc3RhcnQocm1lOTY1Mik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaW5mb19hZGF0MV9pbihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7IkFEQVQxIiwgIkludGVybmFsIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X2FkYXQxX2luKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBybWU5NjUyX2FkYXQxX2luKHJtZTk2NTIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcHV0X2FkYXQxX2luKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9ybWU5NjUyX3VzZV9pc19leGNsdXNpdmUocm1lOTY1MikpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIDI7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IHJtZTk2NTJfYWRhdDFfaW4ocm1lOTY1Mik7CisJaWYgKGNoYW5nZSkKKwkJcm1lOTY1Ml9zZXRfYWRhdDFfaW5wdXQocm1lOTY1MiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgUk1FOTY1Ml9TUERJRl9JTih4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19zcGRpZl9pbiwgXAorICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X3NwZGlmX2luLCAucHV0ID0gc25kX3JtZTk2NTJfcHV0X3NwZGlmX2luIH0KKworc3RhdGljIHVuc2lnbmVkIGludCBybWU5NjUyX3NwZGlmX2luKHJtZTk2NTJfdCAqcm1lOTY1MikKK3sKKwlyZXR1cm4gcm1lOTY1Ml9kZWNvZGVfc3BkaWZfaW4ocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmCisJCQkJICAgICAgIFJNRTk2NTJfaW5wKTsKK30KKworc3RhdGljIGludCBybWU5NjUyX3NldF9zcGRpZl9pbnB1dChybWU5NjUyX3QgKnJtZTk2NTIsIGludCBpbikKK3sKKwlpbnQgcmVzdGFydCA9IDA7CisKKwlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICY9IH5STUU5NjUyX2lucDsKKwlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyIHw9IHJtZTk2NTJfZW5jb2RlX3NwZGlmX2luKGluKTsKKworCWlmICgocmVzdGFydCA9IHJtZTk2NTItPnJ1bm5pbmcpKSB7CisJCXJtZTk2NTJfc3RvcChybWU5NjUyKTsKKwl9CisKKwlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIFJNRTk2NTJfY29udHJvbF9yZWdpc3Rlciwgcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3Rlcik7CisKKwlpZiAocmVzdGFydCkgeworCQlybWU5NjUyX3N0YXJ0KHJtZTk2NTIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2luZm9fc3BkaWZfaW4oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzNdID0geyJBREFUMSIsICJDb2F4aWFsIiwgIkludGVybmFsIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X3NwZGlmX2luKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBybWU5NjUyX3NwZGlmX2luKHJtZTk2NTIpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcHV0X3NwZGlmX2luKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9ybWU5NjUyX3VzZV9pc19leGNsdXNpdmUocm1lOTY1MikpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAlIDM7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IHJtZTk2NTJfc3BkaWZfaW4ocm1lOTY1Mik7CisJaWYgKGNoYW5nZSkKKwkJcm1lOTY1Ml9zZXRfc3BkaWZfaW5wdXQocm1lOTY1MiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgUk1FOTY1Ml9TUERJRl9PVVQoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fc3BkaWZfb3V0LCBcCisgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfb3V0LCAucHV0ID0gc25kX3JtZTk2NTJfcHV0X3NwZGlmX291dCB9CisKK3N0YXRpYyBpbnQgcm1lOTY1Ml9zcGRpZl9vdXQocm1lOTY1Ml90ICpybWU5NjUyKQoreworCXJldHVybiAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfb3B0X291dCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBybWU5NjUyX3NldF9zcGRpZl9vdXRwdXQocm1lOTY1Ml90ICpybWU5NjUyLCBpbnQgb3V0KQoreworCWludCByZXN0YXJ0ID0gMDsKKworCWlmIChvdXQpIHsKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciB8PSBSTUU5NjUyX29wdF9vdXQ7CisJfSBlbHNlIHsKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmPSB+Uk1FOTY1Ml9vcHRfb3V0OworCX0KKworCWlmICgocmVzdGFydCA9IHJtZTk2NTItPnJ1bm5pbmcpKSB7CisJCXJtZTk2NTJfc3RvcChybWU5NjUyKTsKKwl9CisKKwlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIFJNRTk2NTJfY29udHJvbF9yZWdpc3Rlciwgcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3Rlcik7CisKKwlpZiAocmVzdGFydCkgeworCQlybWU5NjUyX3N0YXJ0KHJtZTk2NTIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2luZm9fc3BkaWZfb3V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2dldF9zcGRpZl9vdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBybWU5NjUyX3NwZGlmX291dChybWU5NjUyKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX3B1dF9zcGRpZl9vdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCQorCWlmICghc25kX3JtZTk2NTJfdXNlX2lzX2V4Y2x1c2l2ZShybWU5NjUyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gcm1lOTY1Ml9zcGRpZl9vdXQocm1lOTY1Mik7CisJcm1lOTY1Ml9zZXRfc3BkaWZfb3V0cHV0KHJtZTk2NTIsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIFJNRTk2NTJfU1lOQ19NT0RFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX3N5bmNfbW9kZSwgXAorICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X3N5bmNfbW9kZSwgLnB1dCA9IHNuZF9ybWU5NjUyX3B1dF9zeW5jX21vZGUgfQorCitzdGF0aWMgaW50IHJtZTk2NTJfc3luY19tb2RlKHJtZTk2NTJfdCAqcm1lOTY1MikKK3sKKwlpZiAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfd3NlbCkgeworCQlyZXR1cm4gMjsKKwl9IGVsc2UgaWYgKHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJiBSTUU5NjUyX01hc3RlcikgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcm1lOTY1Ml9zZXRfc3luY19tb2RlKHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IG1vZGUpCit7CisJaW50IHJlc3RhcnQgPSAwOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgorCQlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICY9CisJCSAgICB+KFJNRTk2NTJfTWFzdGVyIHwgUk1FOTY1Ml93c2VsKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyID0KKwkJICAgIChybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgflJNRTk2NTJfd3NlbCkgfCBSTUU5NjUyX01hc3RlcjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyIHw9CisJCSAgICAoUk1FOTY1Ml9NYXN0ZXIgfCBSTUU5NjUyX3dzZWwpOworCQlicmVhazsKKwl9CisKKwlpZiAoKHJlc3RhcnQgPSBybWU5NjUyLT5ydW5uaW5nKSkgeworCQlybWU5NjUyX3N0b3Aocm1lOTY1Mik7CisJfQorCisJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsIHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJaWYgKHJlc3RhcnQpIHsKKwkJcm1lOTY1Ml9zdGFydChybWU5NjUyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9pbmZvX3N5bmNfbW9kZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbM10gPSB7IkF1dG9TeW5jIiwgIk1hc3RlciIsICJXb3JkIENsb2NrIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X3N5bmNfbW9kZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcm1lOTY1Ml9zeW5jX21vZGUocm1lOTY1Mik7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9wdXRfc3luY19tb2RlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICUgMzsKKwlzcGluX2xvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwljaGFuZ2UgPSAoaW50KXZhbCAhPSBybWU5NjUyX3N5bmNfbW9kZShybWU5NjUyKTsKKwlybWU5NjUyX3NldF9zeW5jX21vZGUocm1lOTY1MiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgUk1FOTY1Ml9TWU5DX1BSRUYoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fc3luY19wcmVmLCBcCisgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3luY19wcmVmLCAucHV0ID0gc25kX3JtZTk2NTJfcHV0X3N5bmNfcHJlZiB9CisKK3N0YXRpYyBpbnQgcm1lOTY1Ml9zeW5jX3ByZWYocm1lOTY1Ml90ICpybWU5NjUyKQoreworCXN3aXRjaCAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfU3luY1ByZWZfTWFzaykgeworCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9BREFUMToKKwkJcmV0dXJuIFJNRTk2NTJfU1lOQ19GUk9NX0FEQVQxOworCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9BREFUMjoKKwkJcmV0dXJuIFJNRTk2NTJfU1lOQ19GUk9NX0FEQVQyOworCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9BREFUMzoKKwkJcmV0dXJuIFJNRTk2NTJfU1lOQ19GUk9NX0FEQVQzOworCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9TUERJRjoKKwkJcmV0dXJuIFJNRTk2NTJfU1lOQ19GUk9NX1NQRElGOworCX0KKwkvKiBOb3QgcmVhY2hhYmxlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1lOTY1Ml9zZXRfc3luY19wcmVmKHJtZTk2NTJfdCAqcm1lOTY1MiwgaW50IHByZWYpCit7CisJaW50IHJlc3RhcnQ7CisKKwlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICY9IH5STUU5NjUyX1N5bmNQcmVmX01hc2s7CisJc3dpdGNoIChwcmVmKSB7CisJY2FzZSBSTUU5NjUyX1NZTkNfRlJPTV9BREFUMToKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciB8PSBSTUU5NjUyX1N5bmNQcmVmX0FEQVQxOworCQlicmVhazsKKwljYXNlIFJNRTk2NTJfU1lOQ19GUk9NX0FEQVQyOgorCQlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyIHw9IFJNRTk2NTJfU3luY1ByZWZfQURBVDI7CisJCWJyZWFrOworCWNhc2UgUk1FOTY1Ml9TWU5DX0ZST01fQURBVDM6CisJCXJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgfD0gUk1FOTY1Ml9TeW5jUHJlZl9BREFUMzsKKwkJYnJlYWs7CisJY2FzZSBSTUU5NjUyX1NZTkNfRlJPTV9TUERJRjoKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciB8PSBSTUU5NjUyX1N5bmNQcmVmX1NQRElGOworCQlicmVhazsKKwl9CisKKwlpZiAoKHJlc3RhcnQgPSBybWU5NjUyLT5ydW5uaW5nKSkgeworCQlybWU5NjUyX3N0b3Aocm1lOTY1Mik7CisJfQorCisJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsIHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJaWYgKHJlc3RhcnQpIHsKKwkJcm1lOTY1Ml9zdGFydChybWU5NjUyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9pbmZvX3N5bmNfcHJlZihzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7IklFQzk1OCBJbiIsICJBREFUMSBJbiIsICJBREFUMiBJbiIsICJBREFUMyBJbiJ9OworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBybWU5NjUyLT5zc19jaGFubmVscyA9PSBSTUU5NjUyX05DSEFOTkVMUyA/IDQgOiAzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X3N5bmNfcHJlZihzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcm1lOTY1Ml9zeW5jX3ByZWYocm1lOTY1Mik7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9wdXRfc3luY19wcmVmKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UsIG1heDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCQorCWlmICghc25kX3JtZTk2NTJfdXNlX2lzX2V4Y2x1c2l2ZShybWU5NjUyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwltYXggPSBybWU5NjUyLT5zc19jaGFubmVscyA9PSBSTUU5NjUyX05DSEFOTkVMUyA/IDQgOiAzOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gJSBtYXg7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gcm1lOTY1Ml9zeW5jX3ByZWYocm1lOTY1Mik7CisJcm1lOTY1Ml9zZXRfc3luY19wcmVmKHJtZTk2NTIsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2luZm9fdGhydShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gcm1lOTY1Mi0+c3NfY2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2dldF90aHJ1KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBrOworCXUzMiB0aHJ1X2JpdHMgPSBybWU5NjUyLT50aHJ1X2JpdHM7CisKKwlmb3IgKGsgPSAwOyBrIDwgcm1lOTY1Mi0+c3NfY2hhbm5lbHM7ICsraykgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtrXSA9ICEhKHRocnVfYml0cyAmICgxIDw8IGspKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcHV0X3RocnUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgY2huOworCXUzMiB0aHJ1X2JpdHMgPSAwOworCisJaWYgKCFzbmRfcm1lOTY1Ml91c2VfaXNfZXhjbHVzaXZlKHJtZTk2NTIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZm9yIChjaG4gPSAwOyBjaG4gPCBybWU5NjUyLT5zc19jaGFubmVsczsgKytjaG4pIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2Nobl0pCisJCQl0aHJ1X2JpdHMgfD0gMSA8PCBjaG47CisJfQorCQorCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCWNoYW5nZSA9IHRocnVfYml0cyBeIHJtZTk2NTItPnRocnVfYml0czsKKwlpZiAoY2hhbmdlKSB7CisJCWZvciAoY2huID0gMDsgY2huIDwgcm1lOTY1Mi0+c3NfY2hhbm5lbHM7ICsrY2huKSB7CisJCQlpZiAoIShjaGFuZ2UgJiAoMSA8PCBjaG4pKSkKKwkJCQljb250aW51ZTsKKwkJCXJtZTk2NTJfc2V0X3RocnUocm1lOTY1MixjaG4sdGhydV9iaXRzJigxPDxjaG4pKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiAhIWNoYW5nZTsKK30KKworI2RlZmluZSBSTUU5NjUyX1BBU1NUSFJVKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX3Bhc3N0aHJ1LCBcCisgIC5wdXQgPSBzbmRfcm1lOTY1Ml9wdXRfcGFzc3RocnUsIFwKKyAgLmdldCA9IHNuZF9ybWU5NjUyX2dldF9wYXNzdGhydSB9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaW5mb19wYXNzdGhydShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X3Bhc3N0aHJ1KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBybWU5NjUyLT5wYXNzdGhydTsKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX3B1dF9wYXNzdGhydShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIXNuZF9ybWU5NjUyX3VzZV9pc19leGNsdXNpdmUocm1lOTY1MikpCisJCXJldHVybiAtRUJVU1k7CisKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJY2hhbmdlID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IHJtZTk2NTItPnBhc3N0aHJ1KTsKKwlpZiAoY2hhbmdlKQorCQllcnIgPSBybWU5NjUyX3NldF9wYXNzdGhydShybWU5NjUyLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJcmV0dXJuIGVyciA/IGVyciA6IGNoYW5nZTsKK30KKworLyogUmVhZC1vbmx5IHN3aXRjaGVzICovCisKKyNkZWZpbmUgUk1FOTY1Ml9TUERJRl9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCisgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19zcGRpZl9yYXRlLCBcCisgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfcmF0ZSB9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaW5mb19zcGRpZl9yYXRlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA5NjAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfcmF0ZShzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHJtZTk2NTJfc3BkaWZfc2FtcGxlX3JhdGUocm1lOTY1Mik7CisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBSTUU5NjUyX0FEQVRfU1lOQyh4bmFtZSwgeGluZGV4LCB4aWR4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAorICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fYWRhdF9zeW5jLCBcCisgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfYWRhdF9zeW5jLCAucHJpdmF0ZV92YWx1ZSA9IHhpZHggfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2luZm9fYWRhdF9zeW5jKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s0XSA9IHsiTm8gTG9jayIsICJMb2NrIiwgIk5vIExvY2sgU3luYyIsICJMb2NrIFN5bmMifTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZ2V0X2FkYXRfc3luYyhzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbWFzazEsIG1hc2syLCB2YWw7CisJCisJc3dpdGNoIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCWNhc2UgMDogbWFzazEgPSBSTUU5NjUyX2xvY2tfMDsgbWFzazIgPSBSTUU5NjUyX3N5bmNfMDsgYnJlYWs7CQorCWNhc2UgMTogbWFzazEgPSBSTUU5NjUyX2xvY2tfMTsgbWFzazIgPSBSTUU5NjUyX3N5bmNfMTsgYnJlYWs7CQorCWNhc2UgMjogbWFzazEgPSBSTUU5NjUyX2xvY2tfMjsgbWFzazIgPSBSTUU5NjUyX3N5bmNfMjsgYnJlYWs7CQorCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKwl2YWwgPSBybWU5NjUyX3JlYWQocm1lOTY1MiwgUk1FOTY1Ml9zdGF0dXNfcmVnaXN0ZXIpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsICYgbWFzazEpID8gMSA6IDA7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSB8PSAodmFsICYgbWFzazIpID8gMiA6IDA7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUk1FOTY1Ml9UQ19WQUxJRCh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAorICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fdGNfdmFsaWQsIFwKKyAgLmdldCA9IHNuZF9ybWU5NjUyX2dldF90Y192YWxpZCB9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaW5mb190Y192YWxpZChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9nZXRfdGNfdmFsaWQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAKKwkJKHJtZTk2NTJfcmVhZChybWU5NjUyLCBSTUU5NjUyX3N0YXR1c19yZWdpc3RlcikgJiBSTUU5NjUyX3RjX3ZhbGlkKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCisjaWYgQUxTQV9IQVNfU1RBTkRBUkRfV0FZX09GX1JFVFVSTklOR19USU1FQ09ERQorCisvKiBGSVhNRTogdGhpcyByb3V0aW5lIG5lZWRzIGEgcG9ydCB0byB0aGUgbmV3IGNvbnRyb2wgQVBJIC0tamsgKi8KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9nZXRfdGNfdmFsdWUodm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJCSAgICBzbmRfa3N3aXRjaF90ICprc3dpdGNoLAorCQkJCSAgICBzbmRfc3dpdGNoX3QgKnVzd2l0Y2gpCit7CisJcm1lOTY1Ml90ICpzID0gKHJtZTk2NTJfdCAqKSBwcml2YXRlX2RhdGE7CisJdTMyIHZhbHVlOworCWludCBpOworCisJdXN3aXRjaC0+dHlwZSA9IFNORFJWX1NXX1RZUEVfRFdPUkQ7CisKKwlpZiAoKHJtZTk2NTJfcmVhZChzLCBSTUU5NjUyX3N0YXR1c19yZWdpc3RlcikgJgorCSAgICAgUk1FOTY1Ml90Y192YWxpZCkgPT0gMCkgeworCQl1c3dpdGNoLT52YWx1ZS5kYXRhMzJbMF0gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aW1lY29kZSByZXF1ZXN0ICovCisKKwlybWU5NjUyX3dyaXRlKHMsIFJNRTk2NTJfdGltZV9jb2RlLCAwKTsKKworCS8qIFhYWCBidWcgYWxlcnQ6IGxvb3AtYmFzZWQgdGltaW5nICEhISEgKi8KKworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCWlmICghKHJtZTk2NTJfcmVhZChzLCBpICogNCkgJiBSTUU5NjUyX3RjX2J1c3kpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCEocm1lOTY1Ml9yZWFkKHMsIGkgKiA0KSAmIFJNRTk2NTJfdGNfYnVzeSkpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdmFsdWUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJdmFsdWUgPj49IDE7CisKKwkJaWYgKHJtZTk2NTJfcmVhZChzLCBpICogNCkgJiBSTUU5NjUyX3RjX291dCkKKwkJCXZhbHVlIHw9IDB4ODAwMDAwMDA7CisJfQorCisJaWYgKHZhbHVlID4gMiAqIDYwICogNDgwMDApIHsKKwkJdmFsdWUgLT0gMiAqIDYwICogNDgwMDA7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSAwOworCX0KKworCXVzd2l0Y2gtPnZhbHVlLmRhdGEzMlswXSA9IHZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkJCQkvKiBBTFNBX0hBU19TVEFOREFSRF9XQVlfT0ZfUkVUVVJOSU5HX1RJTUVDT0RFICovCisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3JtZTk2NTJfY29udHJvbHNbXSA9IHsKK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5pbmZvID0JCXNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfaW5mbywKKwkuZ2V0ID0JCXNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfZ2V0LAorCS5wdXQgPQkJc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9wdXQsCit9LAoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUENNX1NUUkVBTSksCisJLmluZm8gPQkJc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9zdHJlYW1faW5mbywKKwkuZ2V0ID0JCXNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX2dldCwKKwkucHV0ID0JCXNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfc3RyZWFtX3B1dCwKK30sCit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxDT05fTUFTSyksCisJLmluZm8gPQkJc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCisJLmdldCA9CQlzbmRfcm1lOTY1Ml9jb250cm9sX3NwZGlmX21hc2tfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCUlFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUywJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30sCit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCisJLmluZm8gPQkJc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCisJLmdldCA9CQlzbmRfcm1lOTY1Ml9jb250cm9sX3NwZGlmX21hc2tfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gSUVDOTU4X0FFUzBfTk9OQVVESU8gfAorCQkJSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKKwkJCUlFQzk1OF9BRVMwX1BST19FTVBIQVNJUywKK30sCitSTUU5NjUyX1NQRElGX0lOKCJJRUM5NTggSW5wdXQgQ29ubmVjdG9yIiwgMCksCitSTUU5NjUyX1NQRElGX09VVCgiSUVDOTU4IE91dHB1dCBhbHNvIG9uIEFEQVQxIiwgMCksCitSTUU5NjUyX1NZTkNfTU9ERSgiU3luYyBNb2RlIiwgMCksCitSTUU5NjUyX1NZTkNfUFJFRigiUHJlZmVycmVkIFN5bmMgU291cmNlIiwgMCksCit7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gIkNoYW5uZWxzIFRocnUiLAorCS5pbmRleCA9IDAsCisJLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX3RocnUsCisJLmdldCA9IHNuZF9ybWU5NjUyX2dldF90aHJ1LAorCS5wdXQgPSBzbmRfcm1lOTY1Ml9wdXRfdGhydSwKK30sCitSTUU5NjUyX1NQRElGX1JBVEUoIklFQzk1OCBTYW1wbGUgUmF0ZSIsIDApLAorUk1FOTY1Ml9BREFUX1NZTkMoIkFEQVQxIFN5bmMgQ2hlY2siLCAwLCAwKSwKK1JNRTk2NTJfQURBVF9TWU5DKCJBREFUMiBTeW5jIENoZWNrIiwgMCwgMSksCitSTUU5NjUyX1RDX1ZBTElEKCJUaW1lY29kZSBWYWxpZCIsIDApLAorUk1FOTY1Ml9QQVNTVEhSVSgiUGFzc3RocnUiLCAwKQorfTsKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfcm1lOTY1Ml9hZGF0M19jaGVjayA9CitSTUU5NjUyX0FEQVRfU1lOQygiQURBVDMgU3luYyBDaGVjayIsIDAsIDIpOworCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9ybWU5NjUyX2FkYXQxX2lucHV0ID0KK1JNRTk2NTJfQURBVDFfSU4oIkFEQVQxIElucHV0IFNvdXJjZSIsIDApOworCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX2NyZWF0ZV9jb250cm9scyhzbmRfY2FyZF90ICpjYXJkLCBybWU5NjUyX3QgKnJtZTk2NTIpCit7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCXNuZF9rY29udHJvbF90ICprY3RsOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9ybWU5NjUyX2NvbnRyb2xzKTsgaWR4KyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfcm1lOTY1Ml9jb250cm9sc1tpZHhdLCBybWU5NjUyKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChpZHggPT0gMSkJLyogSUVDOTU4IChTL1BESUYpIFN0cmVhbSAqLworCQkJcm1lOTY1Mi0+c3BkaWZfY3RsID0ga2N0bDsKKwl9CisKKwlpZiAocm1lOTY1Mi0+c3NfY2hhbm5lbHMgPT0gUk1FOTY1Ml9OQ0hBTk5FTFMpCisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3JtZTk2NTJfYWRhdDNfY2hlY2ssIHJtZTk2NTIpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCWlmIChybWU5NjUyLT5od19yZXYgPj0gMTUpCisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3JtZTk2NTJfYWRhdDFfaW5wdXQsIHJtZTk2NTIpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgL3Byb2MgaW50ZXJmYWNlIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCitzbmRfcm1lOTY1Ml9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gKHJtZTk2NTJfdCAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCXUzMiB0aHJ1X2JpdHMgPSBybWU5NjUyLT50aHJ1X2JpdHM7CisJaW50IHNob3dfYXV0b19zeW5jX3NvdXJjZSA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgeDsKKworCXN0YXR1cyA9IHJtZTk2NTJfcmVhZChybWU5NjUyLCBSTUU5NjUyX3N0YXR1c19yZWdpc3Rlcik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIlcyAoQ2FyZCAjJWQpXG4iLCBybWU5NjUyLT5jYXJkX25hbWUsIHJtZTk2NTItPmNhcmQtPm51bWJlciArIDEpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkJ1ZmZlcnM6IGNhcHR1cmUgJXAgcGxheWJhY2sgJXBcbiIsCisJCSAgICBybWU5NjUyLT5jYXB0dXJlX2J1ZmZlciwgcm1lOTY1Mi0+cGxheWJhY2tfYnVmZmVyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJJUlE6ICVkIFJlZ2lzdGVycyBidXM6IDB4JWx4IFZNOiAweCVseFxuIiwKKwkJICAgIHJtZTk2NTItPmlycSwgcm1lOTY1Mi0+cG9ydCwgKHVuc2lnbmVkIGxvbmcpcm1lOTY1Mi0+aW9iYXNlKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJDb250cm9sIHJlZ2lzdGVyOiAleFxuIiwgcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3Rlcik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCisJeCA9IDEgPDwgKDYgKyBybWU5NjUyX2RlY29kZV9sYXRlbmN5KHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJiAKKwkJCQkJICAgICBSTUU5NjUyX2xhdGVuY3kpKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkxhdGVuY3k6ICVkIHNhbXBsZXMgKDIgcGVyaW9kcyBvZiAlbHUgYnl0ZXMpXG4iLCAKKwkJICAgIHgsICh1bnNpZ25lZCBsb25nKSBybWU5NjUyLT5wZXJpb2RfYnl0ZXMpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkhhcmR3YXJlIHBvaW50ZXIgKGZyYW1lcyk6ICVsZFxuIiwKKwkJICAgIHJtZTk2NTJfaHdfcG9pbnRlcihybWU5NjUyKSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiUGFzc3RocnU6ICVzXG4iLAorCQkgICAgcm1lOTY1Mi0+cGFzc3RocnUgPyAieWVzIiA6ICJubyIpOworCisJaWYgKChybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgKFJNRTk2NTJfTWFzdGVyIHwgUk1FOTY1Ml93c2VsKSkgPT0gMCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJDbG9jayBtb2RlOiBhdXRvc3luY1xuIik7CisJCXNob3dfYXV0b19zeW5jX3NvdXJjZSA9IDE7CisJfSBlbHNlIGlmIChybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTY1Ml93c2VsKSB7CisJCWlmIChzdGF0dXMgJiBSTUU5NjUyX3dzZWxfcmQpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNsb2NrIG1vZGU6IHdvcmQgY2xvY2tcbiIpOworCQl9IGVsc2UgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiQ2xvY2sgbW9kZTogd29yZCBjbG9jayAobm8gc2lnbmFsKVxuIik7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJDbG9jayBtb2RlOiBtYXN0ZXJcbiIpOworCX0KKworCWlmIChzaG93X2F1dG9fc3luY19zb3VyY2UpIHsKKwkJc3dpdGNoIChybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTY1Ml9TeW5jUHJlZl9NYXNrKSB7CisJCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9BREFUMToKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlByZWYuIHN5bmMgc291cmNlOiBBREFUMVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBSTUU5NjUyX1N5bmNQcmVmX0FEQVQyOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiUHJlZi4gc3luYyBzb3VyY2U6IEFEQVQyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFJNRTk2NTJfU3luY1ByZWZfQURBVDM6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJQcmVmLiBzeW5jIHNvdXJjZTogQURBVDNcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUk1FOTY1Ml9TeW5jUHJlZl9TUERJRjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlByZWYuIHN5bmMgc291cmNlOiBJRUM5NThcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJQcmVmLiBzeW5jIHNvdXJjZTogPz8/XG4iKTsKKwkJfQorCX0KKworCWlmIChybWU5NjUyLT5od19yZXYgPj0gMTUpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQURBVDEgSW5wdXQgc291cmNlOiAlc1xuIiwKKwkJCSAgICAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfQURBVDFfSU5URVJOQUwpID8KKwkJCSAgICAiSW50ZXJuYWwiIDogIkFEQVQxIG9wdGljYWwiKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwlzd2l0Y2ggKHJtZTk2NTJfZGVjb2RlX3NwZGlmX2luKHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJiAKKwkJCQkJUk1FOTY1Ml9pbnApKSB7CisJY2FzZSBSTUU5NjUyX1NQRElGSU5fT1BUSUNBTDoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBBREFUMVxuIik7CisJCWJyZWFrOworCWNhc2UgUk1FOTY1Ml9TUERJRklOX0NPQVhJQUw6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBpbnB1dDogQ29heGlhbFxuIik7CisJCWJyZWFrOworCWNhc2UgUk1FOTY1Ml9TUERJRklOX0lOVEVSTjoKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBJbnRlcm5hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBpbnB1dDogPz8/XG4iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgJiBSTUU5NjUyX29wdF9vdXQpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IG91dHB1dDogQ29heGlhbCAmIEFEQVQxXG4iKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggb3V0cHV0OiBDb2F4aWFsIG9ubHlcbiIpOworCX0KKworCWlmIChybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTY1Ml9QUk8pIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IFByb2Zlc3Npb25hbFxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IENvbnN1bWVyXG4iKTsKKwl9CisKKwlpZiAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfRU1QKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBlbXBoYXNpczogb25cbiIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBlbXBoYXNpczogb2ZmXG4iKTsKKwl9CisKKwlpZiAocm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2NTJfRG9sYnkpIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IERvbGJ5OiBvblxuIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IERvbGJ5OiBvZmZcbiIpOworCX0KKworCWkgPSBybWU5NjUyX3NwZGlmX3NhbXBsZV9yYXRlKHJtZTk2NTIpOworCisJaWYgKGkgPCAwKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwKKwkJCSAgICAiSUVDOTU4IHNhbXBsZSByYXRlOiBlcnJvciBmbGFnIHNldFxuIik7CisJfSBlbHNlIGlmIChpID09IDApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHNhbXBsZSByYXRlOiB1bmRldGVybWluZWRcbiIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBzYW1wbGUgcmF0ZTogJWRcbiIsIGkpOworCX0KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJBREFUIFNhbXBsZSByYXRlOiAlZEh6XG4iLAorCQkgICAgcm1lOTY1Ml9hZGF0X3NhbXBsZV9yYXRlKHJtZTk2NTIpKTsKKworCS8qIFN5bmMgQ2hlY2sgKi8KKworCXggPSBzdGF0dXMgJiBSTUU5NjUyX3N5bmNfMDsKKwlpZiAoc3RhdHVzICYgUk1FOTY1Ml9sb2NrXzApIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQURBVDE6ICVzXG4iLCB4ID8gIlN5bmMiIDogIkxvY2siKTsKKwl9IGVsc2UgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUMTogTm8gTG9ja1xuIik7CisJfQorCisJeCA9IHN0YXR1cyAmIFJNRTk2NTJfc3luY18xOworCWlmIChzdGF0dXMgJiBSTUU5NjUyX2xvY2tfMSkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUMjogJXNcbiIsIHggPyAiU3luYyIgOiAiTG9jayIpOworCX0gZWxzZSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQyOiBObyBMb2NrXG4iKTsKKwl9CisKKwl4ID0gc3RhdHVzICYgUk1FOTY1Ml9zeW5jXzI7CisJaWYgKHN0YXR1cyAmIFJNRTk2NTJfbG9ja18yKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQzOiAlc1xuIiwgeCA/ICJTeW5jIiA6ICJMb2NrIik7CisJfSBlbHNlIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQURBVDM6IE5vIExvY2tcbiIpOworCX0KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJUaW1lY29kZSBzaWduYWw6ICVzXG4iLAorCQkgICAgKHN0YXR1cyAmIFJNRTk2NTJfdGNfdmFsaWQpID8gInllcyIgOiAibm8iKTsKKworCS8qIHRocnUgbW9kZXMgKi8KKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlB1bmNoIFN0YXR1czpcblxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm1lOTY1Mi0+c3NfY2hhbm5lbHM7IGkrKykgeworCQlpZiAodGhydV9iaXRzICYgKDEgPDwgaSkpIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUyZDogIG9uICIsIGkgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUyZDogb2ZmICIsIGkgKyAxKTsKKwkJfQorCisJCWlmICgoKGkgKyAxKSAlIDgpID09IDApIHsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJCX0KKwl9CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3JtZTk2NTJfcHJvY19pbml0KHJtZTk2NTJfdCAqcm1lOTY1MikKK3sKKwlzbmRfaW5mb19lbnRyeV90ICplbnRyeTsKKworCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KHJtZTk2NTItPmNhcmQsICJybWU5NjUyIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBybWU5NjUyLCAxMDI0LCBzbmRfcm1lOTY1Ml9wcm9jX3JlYWQpOworfQorCitzdGF0aWMgdm9pZCBzbmRfcm1lOTY1Ml9mcmVlX2J1ZmZlcnMocm1lOTY1Ml90ICpybWU5NjUyKQoreworCXNuZF9oYW1tZXJmYWxsX2ZyZWVfYnVmZmVyKCZybWU5NjUyLT5jYXB0dXJlX2RtYV9idWYsIHJtZTk2NTItPnBjaSk7CisJc25kX2hhbW1lcmZhbGxfZnJlZV9idWZmZXIoJnJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYsIHJtZTk2NTItPnBjaSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfZnJlZShybWU5NjUyX3QgKnJtZTk2NTIpCit7CisJaWYgKHJtZTk2NTItPmlycSA+PSAwKQorCQlybWU5NjUyX3N0b3Aocm1lOTY1Mik7CisJc25kX3JtZTk2NTJfZnJlZV9idWZmZXJzKHJtZTk2NTIpOworCisJaWYgKHJtZTk2NTItPmlycSA+PSAwKQorCQlmcmVlX2lycShybWU5NjUyLT5pcnEsICh2b2lkICopcm1lOTY1Mik7CisJaWYgKHJtZTk2NTItPmlvYmFzZSkKKwkJaW91bm1hcChybWU5NjUyLT5pb2Jhc2UpOworCWlmIChybWU5NjUyLT5wb3J0KQorCQlwY2lfcmVsZWFzZV9yZWdpb25zKHJtZTk2NTItPnBjaSk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2Uocm1lOTY1Mi0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3JtZTk2NTJfaW5pdGlhbGl6ZV9tZW1vcnkocm1lOTY1Ml90ICpybWU5NjUyKQoreworCXVuc2lnbmVkIGxvbmcgcGJfYnVzLCBjYl9idXM7CisKKwlpZiAoc25kX2hhbW1lcmZhbGxfZ2V0X2J1ZmZlcihybWU5NjUyLT5wY2ksICZybWU5NjUyLT5jYXB0dXJlX2RtYV9idWYsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpIDwgMCB8fAorCSAgICBzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKHJtZTk2NTItPnBjaSwgJnJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpIDwgMCkgeworCQlpZiAocm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEpCisJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnJtZTk2NTItPmNhcHR1cmVfZG1hX2J1Zik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGJ1ZmZlcnMgYXZhaWxhYmxlXG4iLCBybWU5NjUyLT5jYXJkX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBbGlnbiB0byBidXMtc3BhY2UgNjRLIGJvdW5kYXJ5ICovCisKKwljYl9idXMgPSAocm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFkZHIgKyAweEZGRkYpICYgfjB4RkZGRmw7CisJcGJfYnVzID0gKHJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYuYWRkciArIDB4RkZGRikgJiB+MHhGRkZGbDsKKworCS8qIFRlbGwgdGhlIGNhcmQgd2hlcmUgaXQgaXMgKi8KKworCXJtZTk2NTJfd3JpdGUocm1lOTY1MiwgUk1FOTY1Ml9yZWNfYnVmZmVyLCBjYl9idXMpOworCXJtZTk2NTJfd3JpdGUocm1lOTY1MiwgUk1FOTY1Ml9wbGF5X2J1ZmZlciwgcGJfYnVzKTsKKworCXJtZTk2NTItPmNhcHR1cmVfYnVmZmVyID0gcm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEgKyAoY2JfYnVzIC0gcm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFkZHIpOworCXJtZTk2NTItPnBsYXliYWNrX2J1ZmZlciA9IHJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYuYXJlYSArIChwYl9idXMgLSBybWU5NjUyLT5wbGF5YmFja19kbWFfYnVmLmFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9ybWU5NjUyX3NldF9kZWZhdWx0cyhybWU5NjUyX3QgKnJtZTk2NTIpCit7CisJdW5zaWduZWQgaW50IGs7CisKKwkvKiBBU1NVTVBUSU9OOiBybWU5NjUyLT5sb2NrIGlzIGVpdGhlciBoZWxkLCBvcgorCSAgIHRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBpdCAoZS5nLiBkdXJpbmcgbW9kdWxlCisJICAgaW5pdGFsaXphdGlvbikuCisJICovCisKKwkvKiBzZXQgZGVmYXVsdHM6CisKKwkgICBTUERJRiBJbnB1dCB2aWEgQ29heCAKKwkgICBhdXRvc3luYyBjbG9jayBtb2RlCisJICAgbWF4aW11bSBsYXRlbmN5ICg3ID0gODE5MiBzYW1wbGVzLCA2NEtieXRlIGJ1ZmZlciwKKwkgICB3aGljaCBpbXBsaWVzIDIgNDA5NiBzYW1wbGUsIDMyS2J5dGUgcGVyaW9kcykuCisJICAgCisJICAgaWYgcmV2IDEuNSwgaW5pdGlhbGl6ZSB0aGUgUy9QRElGIHJlY2VpdmVyLgorCisJICovCisKKwlybWU5NjUyLT5jb250cm9sX3JlZ2lzdGVyID0KKwkgICAgUk1FOTY1Ml9pbnBfMCB8IHJtZTk2NTJfZW5jb2RlX2xhdGVuY3koNyk7CisKKwlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIFJNRTk2NTJfY29udHJvbF9yZWdpc3Rlciwgcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3Rlcik7CisKKwlybWU5NjUyX3Jlc2V0X2h3X3BvaW50ZXIocm1lOTY1Mik7CisJcm1lOTY1Ml9jb21wdXRlX3BlcmlvZF9zaXplKHJtZTk2NTIpOworCisJLyogZGVmYXVsdDogdGhydSBvZmYgZm9yIGFsbCBjaGFubmVscyAqLworCisJZm9yIChrID0gMDsgayA8IFJNRTk2NTJfTkNIQU5ORUxTOyArK2spCisJCXJtZTk2NTJfd3JpdGUocm1lOTY1MiwgUk1FOTY1Ml90aHJ1X2Jhc2UgKyBrICogNCwgMCk7CisKKwlybWU5NjUyLT50aHJ1X2JpdHMgPSAwOworCXJtZTk2NTItPnBhc3N0aHJ1ID0gMDsKKworCS8qIHNldCBhIGRlZmF1bHQgcmF0ZSBzbyB0aGF0IHRoZSBjaGFubmVsIG1hcCBpcyBzZXQgdXAgKi8KKworCXJtZTk2NTJfc2V0X3JhdGUocm1lOTY1MiwgNDgwMDApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX3JtZTk2NTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gKHJtZTk2NTJfdCAqKSBkZXZfaWQ7CisKKwlpZiAoIShybWU5NjUyX3JlYWQocm1lOTY1MiwgUk1FOTY1Ml9zdGF0dXNfcmVnaXN0ZXIpICYgUk1FOTY1Ml9JUlEpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlybWU5NjUyX3dyaXRlKHJtZTk2NTIsIFJNRTk2NTJfaXJxX2NsZWFyLCAwKTsKKworCWlmIChybWU5NjUyLT5jYXB0dXJlX3N1YnN0cmVhbSkgeworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHJtZTk2NTItPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSk7CisJfQorCisJaWYgKHJtZTk2NTItPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHJtZTk2NTItPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcm1lOTY1Ml9od19wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHJtZTk2NTJfaHdfcG9pbnRlcihybWU5NjUyKTsKK30KKworc3RhdGljIGNoYXIgKnJtZTk2NTJfY2hhbm5lbF9idWZmZXJfbG9jYXRpb24ocm1lOTY1Ml90ICpybWU5NjUyLAorCQkJCQkgICAgIGludCBzdHJlYW0sCisJCQkJCSAgICAgaW50IGNoYW5uZWwpCisKK3sKKwlpbnQgbWFwcGVkX2NoYW5uZWw7CisKKyAgICAgICAgc25kX2Fzc2VydChjaGFubmVsID49IDAgfHwgY2hhbm5lbCA8IFJNRTk2NTJfTkNIQU5ORUxTLCByZXR1cm4gTlVMTCk7CisgICAgICAgIAorCWlmICgobWFwcGVkX2NoYW5uZWwgPSBybWU5NjUyLT5jaGFubmVsX21hcFtjaGFubmVsXSkgPCAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlyZXR1cm4gcm1lOTY1Mi0+Y2FwdHVyZV9idWZmZXIgKworCQkJKG1hcHBlZF9jaGFubmVsICogUk1FOTY1Ml9DSEFOTkVMX0JVRkZFUl9CWVRFUyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJtZTk2NTItPnBsYXliYWNrX2J1ZmZlciArCisJCQkobWFwcGVkX2NoYW5uZWwgKiBSTUU5NjUyX0NIQU5ORUxfQlVGRkVSX0JZVEVTKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcGxheWJhY2tfY29weShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sIGludCBjaGFubmVsLAorCQkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zLCB2b2lkIF9fdXNlciAqc3JjLCBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwlybWU5NjUyX3QgKnJtZTk2NTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJY2hhciAqY2hhbm5lbF9idWY7CisKKwlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IFJNRTk2NTJfQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0LCByZXR1cm4gLUVJTlZBTCk7CisKKwljaGFubmVsX2J1ZiA9IHJtZTk2NTJfY2hhbm5lbF9idWZmZXJfbG9jYXRpb24gKHJtZTk2NTIsCisJCQkJCQkgICAgICAgc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0sCisJCQkJCQkgICAgICAgY2hhbm5lbCk7CisJc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGNoYW5uZWxfYnVmICsgcG9zICogNCwgc3JjLCBjb3VudCAqIDQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfY2FwdHVyZV9jb3B5KHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCisJCQkJICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWNoYXIgKmNoYW5uZWxfYnVmOworCisJc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBSTUU5NjUyX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCwgcmV0dXJuIC1FSU5WQUwpOworCisJY2hhbm5lbF9idWYgPSBybWU5NjUyX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChybWU5NjUyLAorCQkJCQkJICAgICAgIHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtLAorCQkJCQkJICAgICAgIGNoYW5uZWwpOworCXNuZF9hc3NlcnQoY2hhbm5lbF9idWYgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChjb3B5X3RvX3VzZXIoZHN0LCBjaGFubmVsX2J1ZiArIHBvcyAqIDQsIGNvdW50ICogNCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9od19zaWxlbmNlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCisJCQkJICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsIHNuZF9wY21fdWZyYW1lc190IGNvdW50KQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwljaGFyICpjaGFubmVsX2J1ZjsKKworCWNoYW5uZWxfYnVmID0gcm1lOTY1Ml9jaGFubmVsX2J1ZmZlcl9sb2NhdGlvbiAocm1lOTY1MiwKKwkJCQkJCSAgICAgICBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwKKwkJCQkJCSAgICAgICBjaGFubmVsKTsKKwlzbmRfYXNzZXJ0KGNoYW5uZWxfYnVmICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwltZW1zZXQoY2hhbm5lbF9idWYgKyBwb3MgKiA0LCAwLCBjb3VudCAqIDQpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9yZXNldChzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKm90aGVyOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlvdGhlciA9IHJtZTk2NTItPmNhcHR1cmVfc3Vic3RyZWFtOworCWVsc2UKKwkJb3RoZXIgPSBybWU5NjUyLT5wbGF5YmFja19zdWJzdHJlYW07CisJaWYgKHJtZTk2NTItPnJ1bm5pbmcpCisJCXJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyID0gcm1lOTY1Ml9od19wb2ludGVyKHJtZTk2NTIpOworCWVsc2UKKwkJcnVudGltZS0+c3RhdHVzLT5od19wdHIgPSAwOworCWlmIChvdGhlcikgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCXNuZF9wY21fc3Vic3RyZWFtX3QgKnM7CisJCXNuZF9wY21fcnVudGltZV90ICpvcnVudGltZSA9IG90aGVyLT5ydW50aW1lOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CisJCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJCWlmIChzID09IG90aGVyKSB7CisJCQkJb3J1bnRpbWUtPnN0YXR1cy0+aHdfcHRyID0gcnVudGltZS0+c3RhdHVzLT5od19wdHI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCXBpZF90IHRoaXNfcGlkOworCXBpZF90IG90aGVyX3BpZDsKKworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCisJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcm1lOTY1Mi0+Y29udHJvbF9yZWdpc3RlciAmPSB+KFJNRTk2NTJfUFJPIHwgUk1FOTY1Ml9Eb2xieSB8IFJNRTk2NTJfRU1QKTsKKwkJcm1lOTY1Ml93cml0ZShybWU5NjUyLCBSTUU5NjUyX2NvbnRyb2xfcmVnaXN0ZXIsIHJtZTk2NTItPmNvbnRyb2xfcmVnaXN0ZXIgfD0gcm1lOTY1Mi0+Y3JlZ19zcGRpZl9zdHJlYW0pOworCQl0aGlzX3BpZCA9IHJtZTk2NTItPnBsYXliYWNrX3BpZDsKKwkJb3RoZXJfcGlkID0gcm1lOTY1Mi0+Y2FwdHVyZV9waWQ7CisJfSBlbHNlIHsKKwkJdGhpc19waWQgPSBybWU5NjUyLT5jYXB0dXJlX3BpZDsKKwkJb3RoZXJfcGlkID0gcm1lOTY1Mi0+cGxheWJhY2tfcGlkOworCX0KKworCWlmICgob3RoZXJfcGlkID4gMCkgJiYgKHRoaXNfcGlkICE9IG90aGVyX3BpZCkpIHsKKworCQkvKiBUaGUgb3RoZXIgc3RyZWFtIGlzIG9wZW4sIGFuZCBub3QgYnkgdGhlIHNhbWUKKwkJICAgdGFzayBhcyB0aGlzIG9uZS4gTWFrZSBzdXJlIHRoYXQgdGhlIHBhcmFtZXRlcnMKKwkJICAgdGhhdCBtYXR0ZXIgYXJlIHRoZSBzYW1lLgorCQkgKi8KKworCQlpZiAoKGludClwYXJhbXNfcmF0ZShwYXJhbXMpICE9CisJCSAgICBybWU5NjUyX2FkYXRfc2FtcGxlX3JhdGUocm1lOTY1MikpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlpZiAocGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykgIT0gcm1lOTY1Mi0+cGVyaW9kX2J5dGVzIC8gNCkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKwkJCV9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQkvKiBXZSdyZSBmaW5lLiAqLworCisJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisgCQlyZXR1cm4gMDsKKworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisJfQorCisJLyogaG93IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByYXRlIG1hdGNoZXMgYW4gZXh0ZXJuYWxseS1zZXQgb25lID8KKwkgKi8KKworCWlmICgoZXJyID0gcm1lOTY1Ml9zZXRfcmF0ZShybWU5NjUyLCBwYXJhbXNfcmF0ZShwYXJhbXMpKSkgPCAwKSB7CisJCV9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gcm1lOTY1Ml9zZXRfaW50ZXJydXB0X2ludGVydmFsKHJtZTk2NTIsIHBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpKSkgPCAwKSB7CisJCV9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9jaGFubmVsX2luZm8oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJCSAgICBzbmRfcGNtX2NoYW5uZWxfaW5mb190ICppbmZvKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgY2huOworCisJc25kX2Fzc2VydChpbmZvLT5jaGFubmVsIDwgUk1FOTY1Ml9OQ0hBTk5FTFMsIHJldHVybiAtRUlOVkFMKTsKKworCWlmICgoY2huID0gcm1lOTY1Mi0+Y2hhbm5lbF9tYXBbaW5mby0+Y2hhbm5lbF0pIDwgMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvLT5vZmZzZXQgPSBjaG4gKiBSTUU5NjUyX0NIQU5ORUxfQlVGRkVSX0JZVEVTOworCWluZm8tPmZpcnN0ID0gMDsKKwlpbmZvLT5zdGVwID0gMzI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaW9jdGwoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9JT0NUTDFfUkVTRVQ6CisJeworCQlyZXR1cm4gc25kX3JtZTk2NTJfcmVzZXQoc3Vic3RyZWFtKTsKKwl9CisJY2FzZSBTTkRSVl9QQ01fSU9DVEwxX0NIQU5ORUxfSU5GTzoKKwl7CisJCXNuZF9wY21fY2hhbm5lbF9pbmZvX3QgKmluZm8gPSBhcmc7CisJCXJldHVybiBzbmRfcm1lOTY1Ml9jaGFubmVsX2luZm8oc3Vic3RyZWFtLCBpbmZvKTsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNuZF9wY21fbGliX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBybWU5NjUyX3NpbGVuY2VfcGxheWJhY2socm1lOTY1Ml90ICpybWU5NjUyKQoreworCW1lbXNldChybWU5NjUyLT5wbGF5YmFja19idWZmZXIsIDAsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgICAgIGludCBjbWQpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKm90aGVyOworCWludCBydW5uaW5nOworCXNwaW5fbG9jaygmcm1lOTY1Mi0+bG9jayk7CisJcnVubmluZyA9IHJtZTk2NTItPnJ1bm5pbmc7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlydW5uaW5nIHw9IDEgPDwgc3Vic3RyZWFtLT5zdHJlYW07CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcnVubmluZyAmPSB+KDEgPDwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfQlVHKCk7CisJCXNwaW5fdW5sb2NrKCZybWU5NjUyLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlvdGhlciA9IHJtZTk2NTItPmNhcHR1cmVfc3Vic3RyZWFtOworCWVsc2UKKwkJb3RoZXIgPSBybWU5NjUyLT5wbGF5YmFja19zdWJzdHJlYW07CisKKwlpZiAob3RoZXIpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CisJCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJCWlmIChzID09IG90aGVyKSB7CisJCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKQorCQkJCQlydW5uaW5nIHw9IDEgPDwgcy0+c3RyZWFtOworCQkJCWVsc2UKKwkJCQkJcnVubmluZyAmPSB+KDEgPDwgcy0+c3RyZWFtKTsKKwkJCQlnb3RvIF9vazsKKwkJCX0KKwkJfQorCQlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CisJCQlpZiAoIShydW5uaW5nICYgKDEgPDwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykpICYmCisJCQkgICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJCXJtZTk2NTJfc2lsZW5jZV9wbGF5YmFjayhybWU5NjUyKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChydW5uaW5nICYmCisJCQkgICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCQlybWU5NjUyX3NpbGVuY2VfcGxheWJhY2socm1lOTY1Mik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSAKKwkJCXJtZTk2NTJfc2lsZW5jZV9wbGF5YmFjayhybWU5NjUyKTsKKwl9CisgX29rOgorCXNuZF9wY21fdHJpZ2dlcl9kb25lKHN1YnN0cmVhbSwgc3Vic3RyZWFtKTsKKwlpZiAoIXJtZTk2NTItPnJ1bm5pbmcgJiYgcnVubmluZykKKwkJcm1lOTY1Ml9zdGFydChybWU5NjUyKTsKKwllbHNlIGlmIChybWU5NjUyLT5ydW5uaW5nICYmICFydW5uaW5nKQorCQlybWU5NjUyX3N0b3Aocm1lOTY1Mik7CisJcm1lOTY1Mi0+cnVubmluZyA9IHJ1bm5pbmc7CisJc3Bpbl91bmxvY2soJnJtZTk2NTItPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcm1lOTY1Mi0+bG9jaywgZmxhZ3MpOworCWlmICghcm1lOTY1Mi0+cnVubmluZykKKwkJcm1lOTY1Ml9yZXNldF9od19wb2ludGVyKHJtZTk2NTIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJtZTk2NTItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9ybWU5NjUyX3BsYXliYWNrX3N1YmluZm8gPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19OT05JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19ET1VCTEUpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCS5yYXRlcyA9CQkoU05EUlZfUENNX1JBVEVfNDQxMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfODgyMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfOTYwMDApLAorCS5yYXRlX21pbiA9CQk0NDEwMCwKKwkucmF0ZV9tYXggPQkJOTYwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxMCwKKwkuY2hhbm5lbHNfbWF4ID0JCTI2LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JUk1FOTY1Ml9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIDI2LAorCS5wZXJpb2RfYnl0ZXNfbWluID0JKDY0ICogNCkgKiAxMCwKKwkucGVyaW9kX2J5dGVzX21heCA9CSg4MTkyICogNCkgKiAyNiwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJMiwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9ybWU5NjUyX2NhcHR1cmVfc3ViaW5mbyA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX05PTklOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnJhdGVzID0JCShTTkRSVl9QQ01fUkFURV80NDEwMCB8IAorCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IAorCQkJCSBTTkRSVl9QQ01fUkFURV84ODIwMCB8IAorCQkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCksCisJLnJhdGVfbWluID0JCTQ0MTAwLAorCS5yYXRlX21heCA9CQk5NjAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEwLAorCS5jaGFubmVsc19tYXggPQkJMjYsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQlSTUU5NjUyX0NIQU5ORUxfQlVGRkVSX0JZVEVTICoyNiwKKwkucGVyaW9kX2J5dGVzX21pbiA9CSg2NCAqIDQpICogMTAsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoODE5MiAqIDQpICogMjYsCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTIsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZXNbXSA9IHsgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYsIDgxOTIgfTsKKworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3QgaHdfY29uc3RyYWludHNfcGVyaW9kX3NpemVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX3NpemVzKSwKKwkubGlzdCA9IHBlcmlvZF9zaXplcywKKwkubWFzayA9IDAKK307CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfaHdfcnVsZV9jaGFubmVscyhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkJCXNuZF9wY21faHdfcnVsZV90ICpydWxlKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHJ1bGUtPnByaXZhdGU7CisJc25kX2ludGVydmFsX3QgKmMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJdW5zaWduZWQgaW50IGxpc3RbMl0gPSB7IHJtZTk2NTItPmRzX2NoYW5uZWxzLCBybWU5NjUyLT5zc19jaGFubmVscyB9OworCXJldHVybiBzbmRfaW50ZXJ2YWxfbGlzdChjLCAyLCBsaXN0LCAwKTsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9od19ydWxlX2NoYW5uZWxzX3JhdGUoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCQkgICAgIHNuZF9wY21faHdfcnVsZV90ICpydWxlKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHJ1bGUtPnByaXZhdGU7CisJc25kX2ludGVydmFsX3QgKmMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJc25kX2ludGVydmFsX3QgKnIgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlpZiAoci0+bWluID4gNDgwMDApIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSBybWU5NjUyLT5kc19jaGFubmVscywKKwkJCS5tYXggPSBybWU5NjUyLT5kc19jaGFubmVscywKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUoYywgJnQpOworCX0gZWxzZSBpZiAoci0+bWF4IDwgODgyMDApIHsKKwkJc25kX2ludGVydmFsX3QgdCA9IHsKKwkJCS5taW4gPSBybWU5NjUyLT5zc19jaGFubmVscywKKwkJCS5tYXggPSBybWU5NjUyLT5zc19jaGFubmVscywKKwkJCS5pbnRlZ2VyID0gMSwKKwkJfTsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUoYywgJnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9od19ydWxlX3JhdGVfY2hhbm5lbHMoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCQkgICAgIHNuZF9wY21faHdfcnVsZV90ICpydWxlKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHJ1bGUtPnByaXZhdGU7CisJc25kX2ludGVydmFsX3QgKmMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJc25kX2ludGVydmFsX3QgKnIgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlpZiAoYy0+bWluID49IHJtZTk2NTItPnNzX2NoYW5uZWxzKSB7CisJCXNuZF9pbnRlcnZhbF90IHQgPSB7CisJCQkubWluID0gNDQxMDAsCisJCQkubWF4ID0gNDgwMDAsCisJCQkuaW50ZWdlciA9IDEsCisJCX07CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKHIsICZ0KTsKKwl9IGVsc2UgaWYgKGMtPm1heCA8PSBybWU5NjUyLT5kc19jaGFubmVscykgeworCQlzbmRfaW50ZXJ2YWxfdCB0ID0geworCQkJLm1pbiA9IDg4MjAwLAorCQkJLm1heCA9IDk2MDAwLAorCQkJLmludGVnZXIgPSAxLAorCQl9OworCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShyLCAmdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9ybWU5NjUyX3BsYXliYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisgICAgICAgIHJ1bnRpbWUtPmh3ID0gc25kX3JtZTk2NTJfcGxheWJhY2tfc3ViaW5mbzsKKwlydW50aW1lLT5kbWFfYXJlYSA9IHJtZTk2NTItPnBsYXliYWNrX2J1ZmZlcjsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSBSTUU5NjUyX0RNQV9BUkVBX0JZVEVTOworCisJaWYgKHJtZTk2NTItPmNhcHR1cmVfc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJcm1lOTY1Ml9zdG9wKHJtZTk2NTIpOworCQlybWU5NjUyX3NldF90aHJ1KHJtZTk2NTIsIC0xLCAwKTsKKwl9CisKKwlybWU5NjUyLT5wbGF5YmFja19waWQgPSBjdXJyZW50LT5waWQ7CisJcm1lOTY1Mi0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMocnVudGltZSwgMCwgMzIsIDI0KTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsICZod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXMpOworCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJICAgICBzbmRfcm1lOTY1Ml9od19ydWxlX2NoYW5uZWxzLCBybWU5NjUyLAorCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKKwlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJCSAgICAgc25kX3JtZTk2NTJfaHdfcnVsZV9jaGFubmVsc19yYXRlLCBybWU5NjUyLAorCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgLTEpOworCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkgICAgIHNuZF9ybWU5NjUyX2h3X3J1bGVfcmF0ZV9jaGFubmVscywgcm1lOTY1MiwKKwkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisKKwlybWU5NjUyLT5jcmVnX3NwZGlmX3N0cmVhbSA9IHJtZTk2NTItPmNyZWdfc3BkaWY7CisJcm1lOTY1Mi0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShybWU5NjUyLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmcm1lOTY1Mi0+c3BkaWZfY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3JtZTk2NTJfcGxheWJhY2tfcmVsZWFzZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycSgmcm1lOTY1Mi0+bG9jayk7CisKKwlybWU5NjUyLT5wbGF5YmFja19waWQgPSAtMTsKKwlybWU5NjUyLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxKCZybWU5NjUyLT5sb2NrKTsKKworCXJtZTk2NTItPnNwZGlmX2N0bC0+dmRbMF0uYWNjZXNzIHw9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShybWU5NjUyLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmcm1lOTY1Mi0+c3BkaWZfY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCisJcnVudGltZS0+aHcgPSBzbmRfcm1lOTY1Ml9jYXB0dXJlX3N1YmluZm87CisJcnVudGltZS0+ZG1hX2FyZWEgPSBybWU5NjUyLT5jYXB0dXJlX2J1ZmZlcjsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSBSTUU5NjUyX0RNQV9BUkVBX0JZVEVTOworCisJaWYgKHJtZTk2NTItPnBsYXliYWNrX3N1YnN0cmVhbSA9PSBOVUxMKSB7CisJCXJtZTk2NTJfc3RvcChybWU5NjUyKTsKKwkJcm1lOTY1Ml9zZXRfdGhydShybWU5NjUyLCAtMSwgMCk7CisJfQorCisJcm1lOTY1Mi0+Y2FwdHVyZV9waWQgPSBjdXJyZW50LT5waWQ7CisJcm1lOTY1Mi0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCisJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplcyk7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCisJCQkgICAgIHNuZF9ybWU5NjUyX2h3X3J1bGVfY2hhbm5lbHMsIHJtZTk2NTIsCisJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJICAgICBzbmRfcm1lOTY1Ml9od19ydWxlX2NoYW5uZWxzX3JhdGUsIHJtZTk2NTIsCisJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCSAgICAgc25kX3JtZTk2NTJfaHdfcnVsZV9yYXRlX2NoYW5uZWxzLCBybWU5NjUyLAorCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfcm1lOTY1Ml9jYXB0dXJlX3JlbGVhc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXJtZTk2NTJfdCAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCisJcm1lOTY1Mi0+Y2FwdHVyZV9waWQgPSAtMTsKKwlybWU5NjUyLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnEoJnJtZTk2NTItPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfcm1lOTY1Ml9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3JtZTk2NTJfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfcm1lOTY1Ml9wbGF5YmFja19yZWxlYXNlLAorCS5pb2N0bCA9CXNuZF9ybWU5NjUyX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lOTY1Ml9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfcm1lOTY1Ml9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTk2NTJfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ybWU5NjUyX2h3X3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX3JtZTk2NTJfcGxheWJhY2tfY29weSwKKwkuc2lsZW5jZSA9CXNuZF9ybWU5NjUyX2h3X3NpbGVuY2UsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfcm1lOTY1Ml9jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfcm1lOTY1Ml9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX3JtZTk2NTJfY2FwdHVyZV9yZWxlYXNlLAorCS5pb2N0bCA9CXNuZF9ybWU5NjUyX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfcm1lOTY1Ml9od19wYXJhbXMsCisJLnByZXBhcmUgPQlzbmRfcm1lOTY1Ml9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3JtZTk2NTJfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9ybWU5NjUyX2h3X3BvaW50ZXIsCisJLmNvcHkgPQkJc25kX3JtZTk2NTJfY2FwdHVyZV9jb3B5LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3JtZTk2NTJfY3JlYXRlX3BjbShzbmRfY2FyZF90ICpjYXJkLAorCQkJCQkgcm1lOTY1Ml90ICpybWU5NjUyKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNhcmQsCisJCQkgICAgICAgcm1lOTY1Mi0+Y2FyZF9uYW1lLAorCQkJICAgICAgIDAsIDEsIDEsICZwY20pKSA8IDApIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlybWU5NjUyLT5wY20gPSBwY207CisJcGNtLT5wcml2YXRlX2RhdGEgPSBybWU5NjUyOworCXN0cmNweShwY20tPm5hbWUsIHJtZTk2NTItPmNhcmRfbmFtZSk7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3JtZTk2NTJfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfcm1lOTY1Ml9jYXB0dXJlX29wcyk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3JtZTk2NTJfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsCisJCQkJICAgICBybWU5NjUyX3QgKnJtZTk2NTIsCisJCQkJICAgICBpbnQgcHJlY2lzZV9wdHIpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaSA9IHJtZTk2NTItPnBjaTsKKwlpbnQgZXJyOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcmV2OworCisJcm1lOTY1Mi0+aXJxID0gLTE7CisJcm1lOTY1Mi0+Y2FyZCA9IGNhcmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChybWU5NjUyLT5wY2ksIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7CisKKwlzd2l0Y2ggKHJldiAmIDB4ZmYpIHsKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgODoKKwljYXNlIDk6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogd2hvIGtub3dzPyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNwaW5fbG9ja19pbml0KCZybWU5NjUyLT5sb2NrKTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJybWU5NjUyIikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlybWU5NjUyLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJcm1lOTY1Mi0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2NTItPnBvcnQsIFJNRTk2NTJfSU9fRVhURU5UKTsKKwlpZiAocm1lOTY1Mi0+aW9iYXNlID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwgcm1lOTY1Mi0+cG9ydCwgcm1lOTY1Mi0+cG9ydCArIFJNRTk2NTJfSU9fRVhURU5UIC0gMSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCQorCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTk2NTJfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJybWU5NjUyIiwgKHZvaWQgKilybWU5NjUyKSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcm1lOTY1Mi0+aXJxID0gcGNpLT5pcnE7CisJcm1lOTY1Mi0+cHJlY2lzZV9wdHIgPSBwcmVjaXNlX3B0cjsKKworCS8qIERldGVybWluZSB0aGUgaC93IHJldiBsZXZlbCBvZiB0aGUgY2FyZC4gVGhpcyBzZWVtcyBsaWtlCisJICAgYSBwYXJ0aWN1bGFybHkga2x1ZGd5IHdheSB0byBlbmNvZGUgaXQsIGJ1dCBpdHMgd2hhdCBSTUUKKwkgICBjaG9zZSB0byBkbywgc28gd2UgZm9sbG93IHRoZW0gLi4uCisJKi8KKworCXN0YXR1cyA9IHJtZTk2NTJfcmVhZChybWU5NjUyLCBSTUU5NjUyX3N0YXR1c19yZWdpc3Rlcik7CisJaWYgKHJtZTk2NTJfZGVjb2RlX3NwZGlmX3JhdGUoc3RhdHVzJlJNRTk2NTJfRikgPT0gMSkgeworCQlybWU5NjUyLT5od19yZXYgPSAxNTsKKwl9IGVsc2UgeworCQlybWU5NjUyLT5od19yZXYgPSAxMTsKKwl9CisKKwkvKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHN0YW5kYXJkIEhhbW1lcmZhbGwsIGFuZCB0aGUKKwkgICAiTGlnaHQiLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBleHBhbnNpb24gYm9hcmQuIFRoaXMKKwkgICBtZXRob2QgY29tZXMgZnJvbSBpbmZvcm1hdGlvbiByZWNlaXZlZCBmcm9tIE1hdGhoaWFzCisJICAgQ2xhdXNlbiBhdCBSTUUuIERpc3BsYXkgdGhlIEVFUFJPTSBhbmQgaC93IHJldklEIHdoZXJlCisJICAgcmVsZXZhbnQuICAKKwkqLworCisJc3dpdGNoIChyZXYpIHsKKwljYXNlIDg6IC8qIG9yaWdpbmFsIGVwcm9tICovCisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJSTUU5NjM2Iik7CisJCWlmIChybWU5NjUyLT5od19yZXYgPT0gMTUpIHsKKwkJCXJtZTk2NTItPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2MzYgKFJldiAxLjUpIjsKKwkJfSBlbHNlIHsKKwkJCXJtZTk2NTItPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2MzYiOworCQl9CisJCXJtZTk2NTItPnNzX2NoYW5uZWxzID0gUk1FOTYzNl9OQ0hBTk5FTFM7CisJCWJyZWFrOworCWNhc2UgOTogLyogVzM2X0cgRVBST00gKi8KKwkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlJNRTk2MzYiKTsKKwkJcm1lOTY1Mi0+Y2FyZF9uYW1lID0gIlJNRSBEaWdpOTYzNiAoUmV2IEcpIjsKKwkJcm1lOTY1Mi0+c3NfY2hhbm5lbHMgPSBSTUU5NjM2X05DSEFOTkVMUzsKKwkJYnJlYWs7CisJY2FzZSA0OiAvKiBXNTJfRyBFUFJPTSAqLworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiUk1FOTY1MiIpOworCQlybWU5NjUyLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjUyIChSZXYgRykiOworCQlybWU5NjUyLT5zc19jaGFubmVscyA9IFJNRTk2NTJfTkNIQU5ORUxTOworCQlicmVhazsKKwljYXNlIDM6IC8qIG9yaWdpbmFsIGVwcm9tICovCisJCXN0cmNweShjYXJkLT5kcml2ZXIsICJSTUU5NjUyIik7CisJCWlmIChybWU5NjUyLT5od19yZXYgPT0gMTUpIHsKKwkJCXJtZTk2NTItPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2NTIgKFJldiAxLjUpIjsKKwkJfSBlbHNlIHsKKwkJCXJtZTk2NTItPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2NTIiOworCQl9CisJCXJtZTk2NTItPnNzX2NoYW5uZWxzID0gUk1FOTY1Ml9OQ0hBTk5FTFM7CisJCWJyZWFrOworCX0KKworCXJtZTk2NTItPmRzX2NoYW5uZWxzID0gKHJtZTk2NTItPnNzX2NoYW5uZWxzIC0gMikgLyAyICsgMjsKKworCXBjaV9zZXRfbWFzdGVyKHJtZTk2NTItPnBjaSk7CisKKwlpZiAoKGVyciA9IHNuZF9ybWU5NjUyX2luaXRpYWxpemVfbWVtb3J5KHJtZTk2NTIpKSA8IDApIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9ybWU5NjUyX2NyZWF0ZV9wY20oY2FyZCwgcm1lOTY1MikpIDwgMCkgeworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX3JtZTk2NTJfY3JlYXRlX2NvbnRyb2xzKGNhcmQsIHJtZTk2NTIpKSA8IDApIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzbmRfcm1lOTY1Ml9wcm9jX2luaXQocm1lOTY1Mik7CisKKwlybWU5NjUyLT5sYXN0X3NwZGlmX3NhbXBsZV9yYXRlID0gLTE7CisJcm1lOTY1Mi0+bGFzdF9hZGF0X3NhbXBsZV9yYXRlID0gLTE7CisJcm1lOTY1Mi0+cGxheWJhY2tfcGlkID0gLTE7CisJcm1lOTY1Mi0+Y2FwdHVyZV9waWQgPSAtMTsKKwlybWU5NjUyLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJcm1lOTY1Mi0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKKworCXNuZF9ybWU5NjUyX3NldF9kZWZhdWx0cyhybWU5NjUyKTsKKworCWlmIChybWU5NjUyLT5od19yZXYgPT0gMTUpIHsKKwkJcm1lOTY1Ml9pbml0aWFsaXplX3NwZGlmX3JlY2VpdmVyIChybWU5NjUyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3JtZTk2NTJfY2FyZF9mcmVlKHNuZF9jYXJkX3QgKmNhcmQpCit7CisJcm1lOTY1Ml90ICpybWU5NjUyID0gKHJtZTk2NTJfdCAqKSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAocm1lOTY1MikKKwkJc25kX3JtZTk2NTJfZnJlZShybWU5NjUyKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3JtZTk2NTJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlybWU5NjUyX3QgKnJtZTk2NTI7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlpbnQgZXJyOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgICBzaXplb2Yocm1lOTY1Ml90KSk7CisKKwlpZiAoIWNhcmQpCisJCXJldHVybiAtRU5PTUVNOworCisJcm1lOTY1MiA9IChybWU5NjUyX3QgKikgY2FyZC0+cHJpdmF0ZV9kYXRhOworCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9ybWU5NjUyX2NhcmRfZnJlZTsKKwlybWU5NjUyLT5kZXYgPSBkZXY7CisJcm1lOTY1Mi0+cGNpID0gcGNpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCWlmICgoZXJyID0gc25kX3JtZTk2NTJfY3JlYXRlKGNhcmQsIHJtZTk2NTIsIHByZWNpc2VfcHRyW2Rldl0pKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBybWU5NjUyLT5jYXJkX25hbWUpOworCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLAorCQljYXJkLT5zaG9ydG5hbWUsIHJtZTk2NTItPnBvcnQsIHJtZTk2NTItPmlycSk7CisKKwkKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CisJZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfcm1lOTY1Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkgID0gIlJNRSBEaWdpOTY1MiAoSGFtbWVyZmFsbCkiLAorCS5pZF90YWJsZSA9IHNuZF9ybWU5NjUyX2lkcywKKwkucHJvYmUJICA9IHNuZF9ybWU5NjUyX3Byb2JlLAorCS5yZW1vdmUJICA9IF9fZGV2ZXhpdF9wKHNuZF9ybWU5NjUyX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfaGFtbWVyZmFsbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9oYW1tZXJmYWxsX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9oYW1tZXJmYWxsX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfaGFtbWVyZmFsbF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3NvbmljdmliZXMuYyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkMmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKQEAgLTAsMCArMSwxNTM0IEBACisvKgorICogIERyaXZlciBmb3IgUzMgU29uaWNWaWJlcyBzb3VuZGNhcmQKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKiAgQlVHUzoKKyAqICAgIEl0IGxvb2tzIGxpa2UgODZjNjE3IHJldiAzIGRvZXNuJ3Qgc3VwcG9ydHMgRERNQSBidWZmZXJzIGFib3ZlIDE2TUI/CisgKiAgICBEcml2ZXIgc29tZXRpbWVzIGhhbmdzLi4uIE5vYm9keSBrbm93cyB3aHkgYXQgdGhpcyBtb21lbnQuLi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvb3BsMy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlMzIFNvbmljVmliZXMgUENJIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tTMyxTb25pY1ZpYmVzIFBDSX19Iik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQorI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLIDEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfUzMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TMyAgICAgICAgICAgICAweDUzMzMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1MzX1NPTklDVklCRVMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTICAweGNhMDAKKyNlbmRpZgorCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgcmV2ZXJiW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07CitzdGF0aWMgaW50IG1nZVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBkbWFpbyA9IDB4N2EwMDsJLyogRERNQSBpL28gYWRkcmVzcyAqLworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIFMzIFNvbmljVmliZXMgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBTMyBTb25pY1ZpYmVzIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgUzMgU29uaWNWaWJlcyBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocmV2ZXJiLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmV2ZXJiLCAiRW5hYmxlIHJldmVyYiAoU1JBTSBpcyBwcmVzZW50KSBmb3IgUzMgU29uaWNWaWJlcyBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobWdlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWdlLCAiTUlDIEdhaW4gRW5hYmxlIGZvciBTMyBTb25pY1ZpYmVzIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbShkbWFpbywgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYWlvLCAiRERNQSBpL28gYmFzZSBhZGRyZXNzIGZvciBTMyBTb25pY1ZpYmVzIHNvdW5kY2FyZC4iKTsKKworLyoKKyAqIEVuaGFuY2VkIHBvcnQgZGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgU1ZfUkVHKHNvbmljLCB4KSAoKHNvbmljKS0+ZW5oX3BvcnQgKyBTVl9SRUdfIyN4KQorCisjZGVmaW5lIFNWX1JFR19DT05UUk9MCTB4MDAJLyogUi9XOiBDT0RFQy9NaXhlciBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICAgU1ZfRU5IQU5DRUQJICAweDAxCS8qIGF1ZGlvIG1vZGUgc2VsZWN0IC0gZW5oYW5jZWQgbW9kZSAqLworI2RlZmluZSAgIFNWX1RFU1QJICAweDAyCS8qIHRlc3QgYml0ICovCisjZGVmaW5lICAgU1ZfUkVWRVJCCSAgMHgwNAkvKiByZXZlcmIgZW5hYmxlICovCisjZGVmaW5lICAgU1ZfV0FWRVRBQkxFCSAgMHgwOAkvKiB3YXZldGFibGUgYWN0aXZlIC8gRk0gYWN0aXZlIGlmIG5vdCBzZXQgKi8KKyNkZWZpbmUgICBTVl9JTlRBCSAgMHgyMAkvKiBJTlRBIGRyaXZpbmcgLSBzaG91bGQgYmUgYWx3YXlzIDEgKi8KKyNkZWZpbmUgICBTVl9SRVNFVAkgIDB4ODAJLyogcmVzZXQgY2hpcCAqLworI2RlZmluZSBTVl9SRUdfSVJRTUFTSwkweDAxCS8qIFIvVzogQ09ERUMvTWl4ZXIgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBTVl9ETUFBX01BU0sJICAweDAxCS8qIG1hc2sgRE1BLUEgaW50ZXJydXB0ICovCisjZGVmaW5lICAgU1ZfRE1BQ19NQVNLCSAgMHgwNAkvKiBtYXNrIERNQS1DIGludGVycnVwdCAqLworI2RlZmluZSAgIFNWX1NQRUNfTUFTSwkgIDB4MDgJLyogc3BlY2lhbCBpbnRlcnJ1cHQgbWFzayAtIHNob3VsZCBiZSBhbHdheXMgbWFza2VkICovCisjZGVmaW5lICAgU1ZfVURfTUFTSwkgIDB4NDAJLyogVXAvRG93biBidXR0b24gaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgICBTVl9NSURJX01BU0sJICAweDgwCS8qIG1hc2sgTUlESSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1ZfUkVHX1NUQVRVUwkweDAyCS8qIFIvTzogQ09ERUMvTWl4ZXIgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICAgU1ZfRE1BQV9JUlEJICAweDAxCS8qIERNQS1BIGludGVycnVwdCAqLworI2RlZmluZSAgIFNWX0RNQUNfSVJRCSAgMHgwNAkvKiBETUEtQyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBTVl9TUEVDX0lSUQkgIDB4MDgJLyogc3BlY2lhbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBTVl9VRF9JUlEJICAweDQwCS8qIFVwL0Rvd24gaW50ZXJydXB0ICovCisjZGVmaW5lICAgU1ZfTUlESV9JUlEJICAweDgwCS8qIE1JREkgaW50ZXJydXB0ICovCisjZGVmaW5lIFNWX1JFR19JTkRFWAkweDA0CS8qIFIvVzogQ09ERUMvTWl4ZXIgaW5kZXggYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSAgIFNWX01DRSAgICAgICAgICAweDQwCS8qIG1vZGUgY2hhbmdlIGVuYWJsZSAqLworI2RlZmluZSAgIFNWX1RSRAkgIDB4ODAJLyogRE1BIHRyYW5zZmVyIHJlcXVlc3QgZGlzYWJsZWQgKi8KKyNkZWZpbmUgU1ZfUkVHX0RBVEEJMHgwNQkvKiBSL1c6IENPREVDL01peGVyIGluZGV4IGRhdGEgcmVnaXN0ZXIgKi8KKworLyoKKyAqIEVuaGFuY2VkIHBvcnQgaW5kaXJlY3QgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBTVl9JUkVHX0xFRlRfQURDCTB4MDAJLyogTGVmdCBBREMgSW5wdXQgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX1JJR0hUX0FEQwkweDAxCS8qIFJpZ2h0IEFEQyBJbnB1dCBDb250cm9sICovCisjZGVmaW5lIFNWX0lSRUdfTEVGVF9BVVgxCTB4MDIJLyogTGVmdCBBVVgxIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19SSUdIVF9BVVgxCTB4MDMJLyogUmlnaHQgQVVYMSBJbnB1dCBDb250cm9sICovCisjZGVmaW5lIFNWX0lSRUdfTEVGVF9DRAkJMHgwNAkvKiBMZWZ0IENEIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19SSUdIVF9DRAkweDA1CS8qIFJpZ2h0IENEIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19MRUZUX0xJTkUJMHgwNgkvKiBMZWZ0IExpbmUgSW5wdXQgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX1JJR0hUX0xJTkUJMHgwNwkvKiBSaWdodCBMaW5lIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19NSUMJCTB4MDgJLyogTUlDIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19HQU1FX1BPUlQJMHgwOQkvKiBHYW1lIFBvcnQgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX0xFRlRfU1lOVEgJMHgwYQkvKiBMZWZ0IFN5bnRoIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19SSUdIVF9TWU5USAkweDBiCS8qIFJpZ2h0IFN5bnRoIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19MRUZUX0FVWDIJMHgwYwkvKiBMZWZ0IEFVWDIgSW5wdXQgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX1JJR0hUX0FVWDIJMHgwZAkvKiBSaWdodCBBVVgyIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19MRUZUX0FOQUxPRwkweDBlCS8qIExlZnQgQW5hbG9nIE1peGVyIE91dHB1dCBDb250cm9sICovCisjZGVmaW5lIFNWX0lSRUdfUklHSFRfQU5BTE9HCTB4MGYJLyogUmlnaHQgQW5hbG9nIE1peGVyIE91dHB1dCBDb250cm9sICovCisjZGVmaW5lIFNWX0lSRUdfTEVGVF9QQ00JMHgxMAkvKiBMZWZ0IFBDTSBJbnB1dCBDb250cm9sICovCisjZGVmaW5lIFNWX0lSRUdfUklHSFRfUENNCTB4MTEJLyogUmlnaHQgUENNIElucHV0IENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19ETUFfREFUQV9GTVQJMHgxMgkvKiBETUEgRGF0YSBGb3JtYXQgKi8KKyNkZWZpbmUgU1ZfSVJFR19QQ19FTkFCTEUJMHgxMwkvKiBQbGF5YmFjay9DYXB0dXJlIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBTVl9JUkVHX1VEX0JVVFRPTgkweDE0CS8qIFVwL0Rvd24gQnV0dG9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFNWX0lSRUdfUkVWSVNJT04JMHgxNQkvKiBSZXZpc2lvbiAqLworI2RlZmluZSBTVl9JUkVHX0FEQ19PVVRQVVRfQ1RSTAkweDE2CS8qIEFEQyBPdXRwdXQgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX0RNQV9BX1VQUEVSCTB4MTgJLyogRE1BIEEgVXBwZXIgQmFzZSBDb3VudCAqLworI2RlZmluZSBTVl9JUkVHX0RNQV9BX0xPV0VSCTB4MTkJLyogRE1BIEEgTG93ZXIgQmFzZSBDb3VudCAqLworI2RlZmluZSBTVl9JUkVHX0RNQV9DX1VQUEVSCTB4MWMJLyogRE1BIEMgVXBwZXIgQmFzZSBDb3VudCAqLworI2RlZmluZSBTVl9JUkVHX0RNQV9DX0xPV0VSCTB4MWQJLyogRE1BIEMgTG93ZXIgQmFzZSBDb3VudCAqLworI2RlZmluZSBTVl9JUkVHX1BDTV9SQVRFX0xPVwkweDFlCS8qIFBDTSBTYW1wbGluZyBSYXRlIExvdyBCeXRlICovCisjZGVmaW5lIFNWX0lSRUdfUENNX1JBVEVfSElHSAkweDFmCS8qIFBDTSBTYW1wbGluZyBSYXRlIEhpZ2ggQnl0ZSAqLworI2RlZmluZSBTVl9JUkVHX1NZTlRIX1JBVEVfTE9XCTB4MjAJLyogU3ludGhlc2l6ZXIgU2FtcGxpbmcgUmF0ZSBMb3cgQnl0ZSAqLworI2RlZmluZSBTVl9JUkVHX1NZTlRIX1JBVEVfSElHSCAweDIxCS8qIFN5bnRoZXNpemVyIFNhbXBsaW5nIFJhdGUgSGlnaCBCeXRlICovCisjZGVmaW5lIFNWX0lSRUdfQURDX0NMT0NLCTB4MjIJLyogQURDIENsb2NrIFNvdXJjZSBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgU1ZfSVJFR19BRENfQUxUX1JBVEUJMHgyMwkvKiBBREMgQWx0ZXJuYXRpdmUgU2FtcGxpbmcgUmF0ZSBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgU1ZfSVJFR19BRENfUExMX00JMHgyNAkvKiBBREMgUExMIE0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1ZfSVJFR19BRENfUExMX04JMHgyNQkvKiBBREMgUExMIE4gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1ZfSVJFR19TWU5USF9QTExfTQkweDI2CS8qIFN5bnRoZXNpemVyIFBMTCBNIFJlZ2lzdGVyICovCisjZGVmaW5lIFNWX0lSRUdfU1lOVEhfUExMX04JMHgyNwkvKiBTeW50aGVzaXplciBQTEwgTiBSZWdpc3RlciAqLworI2RlZmluZSBTVl9JUkVHX01QVTQwMQkJMHgyYQkvKiBNUFUtNDAxIFVBUlQgT3BlcmF0aW9uICovCisjZGVmaW5lIFNWX0lSRUdfRFJJVkVfQ1RSTAkweDJiCS8qIERyaXZlIENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19TUlNfU1BBQ0UJMHgyYwkvKiBTUlMgU3BhY2UgQ29udHJvbCAqLworI2RlZmluZSBTVl9JUkVHX1NSU19DRU5URVIJMHgyZAkvKiBTUlMgQ2VudGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19XQVZFX1NPVVJDRQkweDJlCS8qIFdhdmV0YWJsZSBTYW1wbGUgU291cmNlIFNlbGVjdCAqLworI2RlZmluZSBTVl9JUkVHX0FOQUxPR19QT1dFUgkweDMwCS8qIEFuYWxvZyBQb3dlciBEb3duIENvbnRyb2wgKi8KKyNkZWZpbmUgU1ZfSVJFR19ESUdJVEFMX1BPV0VSCTB4MzEJLyogRGlnaXRhbCBQb3dlciBEb3duIENvbnRyb2wgKi8KKworI2RlZmluZSBTVl9JUkVHX0FEQ19QTEwJCVNWX0lSRUdfQURDX1BMTF9NCisjZGVmaW5lIFNWX0lSRUdfU1lOVEhfUExMCVNWX0lSRUdfU1lOVEhfUExMX00KKworLyoKKyAqICBETUEgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBTVl9ETUFfQUREUjAJCTB4MDAKKyNkZWZpbmUgU1ZfRE1BX0FERFIxCQkweDAxCisjZGVmaW5lIFNWX0RNQV9BRERSMgkJMHgwMgorI2RlZmluZSBTVl9ETUFfQUREUjMJCTB4MDMKKyNkZWZpbmUgU1ZfRE1BX0NPVU5UMAkJMHgwNAorI2RlZmluZSBTVl9ETUFfQ09VTlQxCQkweDA1CisjZGVmaW5lIFNWX0RNQV9DT1VOVDIJCTB4MDYKKyNkZWZpbmUgU1ZfRE1BX01PREUJCTB4MGIKKyNkZWZpbmUgU1ZfRE1BX1JFU0VUCQkweDBkCisjZGVmaW5lIFNWX0RNQV9NQVNLCQkweDBmCisKKy8qCisgKiAgUmVjb3JkIHNvdXJjZXMKKyAqLworCisjZGVmaW5lIFNWX1JFQ1NSQ19SRVNFUlZFRAkoMHgwMDw8NSkKKyNkZWZpbmUgU1ZfUkVDU1JDX0NECQkoMHgwMTw8NSkKKyNkZWZpbmUgU1ZfUkVDU1JDX0RBQwkJKDB4MDI8PDUpCisjZGVmaW5lIFNWX1JFQ1NSQ19BVVgyCQkoMHgwMzw8NSkKKyNkZWZpbmUgU1ZfUkVDU1JDX0xJTkUJCSgweDA0PDw1KQorI2RlZmluZSBTVl9SRUNTUkNfQVVYMQkJKDB4MDU8PDUpCisjZGVmaW5lIFNWX1JFQ1NSQ19NSUMJCSgweDA2PDw1KQorI2RlZmluZSBTVl9SRUNTUkNfT1VUCQkoMHgwNzw8NSkKKworLyoKKyAqICBjb25zdGFudHMKKyAqLworCisjZGVmaW5lIFNWX0ZVTExSQVRFCQk0ODAwMAorI2RlZmluZSBTVl9SRUZGUkVRVUVOQ1kJCTI0NTc2MDAwCisjZGVmaW5lIFNWX0FEQ01VTFQJCTUxMgorCisjZGVmaW5lIFNWX01PREVfUExBWQkJMQorI2RlZmluZSBTVl9NT0RFX0NBUFRVUkUJCTIKKworLyoKKworICovCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfc29uaWN2aWJlcyBzb25pY3ZpYmVzX3Q7CisKK3N0cnVjdCBfc25kX3NvbmljdmliZXMgeworCXVuc2lnbmVkIGxvbmcgZG1hMXNpemU7CisJdW5zaWduZWQgbG9uZyBkbWEyc2l6ZTsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBzYl9wb3J0OworCXVuc2lnbmVkIGxvbmcgZW5oX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBzeW50aF9wb3J0OworCXVuc2lnbmVkIGxvbmcgbWlkaV9wb3J0OworCXVuc2lnbmVkIGxvbmcgZ2FtZV9wb3J0OworCXVuc2lnbmVkIGludCBkbWFhX3BvcnQ7CisJc3RydWN0IHJlc291cmNlICpyZXNfZG1hYTsKKwl1bnNpZ25lZCBpbnQgZG1hY19wb3J0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzX2RtYWM7CisKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGlycW1hc2s7CisJdW5zaWduZWQgY2hhciByZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIGZvcm1hdDsKKwl1bnNpZ25lZCBjaGFyIHNyc19zcGFjZTsKKwl1bnNpZ25lZCBjaGFyIHNyc19jZW50ZXI7CisJdW5zaWduZWQgY2hhciBtcHVfc3dpdGNoOworCXVuc2lnbmVkIGNoYXIgd2F2ZV9zb3VyY2U7CisKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKwlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpwbGF5YmFja19zdWJzdHJlYW07CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqY2FwdHVyZV9zdWJzdHJlYW07CisJc25kX3Jhd21pZGlfdCAqcm1pZGk7CisJc25kX2h3ZGVwX3QgKmZtc3ludGg7CS8qIFMzRk0gKi8KKworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisKKwl1bnNpZ25lZCBpbnQgcF9kbWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY19kbWFfc2l6ZTsKKworCXNuZF9rY29udHJvbF90ICptYXN0ZXJfbXV0ZTsKKwlzbmRfa2NvbnRyb2xfdCAqbWFzdGVyX3ZvbHVtZTsKKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3NvbmljX2lkc1tdID0geworCXsgMHg1MzMzLCAweGNhMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisgICAgICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9zb25pY19pZHMpOworCitzdGF0aWMgcmF0ZGVuX3Qgc29uaWN2aWJlc19hZGNfY2xvY2sgPSB7CisJLm51bV9taW4gPSA0MDAwICogNjU1MzYsCisJLm51bV9tYXggPSA0ODAwMFVMICogNjU1MzYsCisJLm51bV9zdGVwID0gMSwKKwkuZGVuID0gNjU1MzYsCit9Oworc3RhdGljIHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zX3Qgc25kX3NvbmljdmliZXNfaHdfY29uc3RyYWludHNfYWRjX2Nsb2NrID0geworCS5ucmF0cyA9IDEsCisJLnJhdHMgPSAmc29uaWN2aWJlc19hZGNfY2xvY2ssCit9OworCisvKgorICogIGNvbW1vbiBJL08gcm91dGluZXMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3NvbmljdmliZXNfc2V0ZG1hYShzb25pY3ZpYmVzX3QgKiBzb25pYywKKwkJCQkJICB1bnNpZ25lZCBpbnQgYWRkciwKKwkJCQkJICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJY291bnQtLTsKKwlvdXRsKGFkZHIsIHNvbmljLT5kbWFhX3BvcnQgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHNvbmljLT5kbWFhX3BvcnQgKyBTVl9ETUFfQ09VTlQwKTsKKwlvdXRiKDB4MTgsIHNvbmljLT5kbWFhX3BvcnQgKyBTVl9ETUFfTU9ERSk7CisjaWYgMAorCXByaW50aygicHJvZ3JhbSBkbWFhOiBhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4XG4iLCBhZGRyLCBpbmwoc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9BRERSMCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29uaWN2aWJlc19zZXRkbWFjKHNvbmljdmliZXNfdCAqIHNvbmljLAorCQkJCQkgIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCQkgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwkvKiBub3RlOiBkbWFjIGlzIHdvcmtpbmcgaW4gd29yZCBtb2RlISEhICovCisJY291bnQgPj49IDE7CisJY291bnQtLTsKKwlvdXRsKGFkZHIsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQ09VTlQwKTsKKwlvdXRiKDB4MTQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfTU9ERSk7CisjaWYgMAorCXByaW50aygicHJvZ3JhbSBkbWFjOiBhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4XG4iLCBhZGRyLCBpbmwoc29uaWMtPmRtYWNfcG9ydCArIFNWX0RNQV9BRERSMCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb25pY3ZpYmVzX2dldGRtYWEoc29uaWN2aWJlc190ICogc29uaWMpCit7CisJcmV0dXJuIChpbmwoc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9DT1VOVDApICYgMHhmZmZmZmYpICsgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3NvbmljdmliZXNfZ2V0ZG1hYyhzb25pY3ZpYmVzX3QgKiBzb25pYykKK3sKKwkvKiBub3RlOiBkbWFjIGlzIHdvcmtpbmcgaW4gd29yZCBtb2RlISEhICovCisJcmV0dXJuICgoaW5sKHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQ09VTlQwKSAmIDB4ZmZmZmZmKSArIDEpIDw8IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX291dDEoc29uaWN2aWJlc190ICogc29uaWMsCisJCQkJdW5zaWduZWQgY2hhciByZWcsCisJCQkJdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlvdXRiKHJlZywgU1ZfUkVHKHNvbmljLCBJTkRFWCkpOworCXVkZWxheSgxMCk7CisJb3V0Yih2YWx1ZSwgU1ZfUkVHKHNvbmljLCBEQVRBKSk7CisJdWRlbGF5KDEwKTsKK30KKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfb3V0KHNvbmljdmliZXNfdCAqIHNvbmljLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzb25pYy0+cmVnX2xvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgU1ZfUkVHKHNvbmljLCBJTkRFWCkpOworCXVkZWxheSgxMCk7CisJb3V0Yih2YWx1ZSwgU1ZfUkVHKHNvbmljLCBEQVRBKSk7CisJdWRlbGF5KDEwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb25pYy0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX3NvbmljdmliZXNfaW4xKHNvbmljdmliZXNfdCAqIHNvbmljLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworCisJb3V0YihyZWcsIFNWX1JFRyhzb25pYywgSU5ERVgpKTsKKwl1ZGVsYXkoMTApOworCXZhbHVlID0gaW5iKFNWX1JFRyhzb25pYywgREFUQSkpOworCXVkZWxheSgxMCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbmRfc29uaWN2aWJlc19pbihzb25pY3ZpYmVzX3QgKiBzb25pYywgdW5zaWduZWQgY2hhciByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvbmljLT5yZWdfbG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBTVl9SRUcoc29uaWMsIElOREVYKSk7CisJdWRlbGF5KDEwKTsKKwl2YWx1ZSA9IGluYihTVl9SRUcoc29uaWMsIERBVEEpKTsKKwl1ZGVsYXkoMTApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvbmljLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX2RlYnVnKHNvbmljdmliZXNfdCAqIHNvbmljKQoreworCXByaW50aygiU1YgUkVHUzogICAgICAgICAgSU5ERVggPSAweCUwMnggICIsIGluYihTVl9SRUcoc29uaWMsIElOREVYKSkpOworCXByaW50aygiICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKKwlwcmludGsoIiAgMHgwMDogbGVmdCBpbnB1dCAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwMCkpOworCXByaW50aygiICAweDIwOiBzeW50aCByYXRlIGxvdyAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDIwKSk7CisJcHJpbnRrKCIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MDEpKTsKKwlwcmludGsoIiAgMHgyMTogc3ludGggcmF0ZSBoaWdoID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgyMSkpOworCXByaW50aygiICAweDAyOiBsZWZ0IEFVWDEgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSk7CisJcHJpbnRrKCIgIDB4MjI6IEFEQyBjbG9jayAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKKwlwcmludGsoIiAgMHgwMzogcmlnaHQgQVVYMSAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwMykpOworCXByaW50aygiICAweDIzOiBBREMgYWx0IHJhdGUgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDIzKSk7CisJcHJpbnRrKCIgIDB4MDQ6IGxlZnQgQ0QgICAgICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MDQpKTsKKwlwcmludGsoIiAgMHgyNDogQURDIHBsbCBNICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgyNCkpOworCXByaW50aygiICAweDA1OiByaWdodCBDRCAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSk7CisJcHJpbnRrKCIgIDB4MjU6IEFEQyBwbGwgTiAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKKwlwcmludGsoIiAgMHgwNjogbGVmdCBsaW5lICAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwNikpOworCXByaW50aygiICAweDI2OiBTeW50aCBwbGwgTSAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDI2KSk7CisJcHJpbnRrKCIgIDB4MDc6IHJpZ2h0IGxpbmUgICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MDcpKTsKKwlwcmludGsoIiAgMHgyNzogU3ludGggcGxsIE4gICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgyNykpOworCXByaW50aygiICAweDA4OiBNSUMgICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSk7CisJcHJpbnRrKCIgIDB4Mjg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKKwlwcmludGsoIiAgMHgwOTogR2FtZSBwb3J0ICAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwOSkpOworCXByaW50aygiICAweDI5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDI5KSk7CisJcHJpbnRrKCIgIDB4MGE6IGxlZnQgc3ludGggICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MGEpKTsKKwlwcmludGsoIiAgMHgyYTogTVBVNDAxICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgyYSkpOworCXByaW50aygiICAweDBiOiByaWdodCBzeW50aCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSk7CisJcHJpbnRrKCIgIDB4MmI6IGRyaXZlIGN0cmwgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKKwlwcmludGsoIiAgMHgwYzogbGVmdCBBVVgyICAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwYykpOworCXByaW50aygiICAweDJjOiBTUlMgc3BhY2UgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDJjKSk7CisJcHJpbnRrKCIgIDB4MGQ6IHJpZ2h0IEFVWDIgICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MGQpKTsKKwlwcmludGsoIiAgMHgyZDogU1JTIGNlbnRlciAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgyZCkpOworCXByaW50aygiICAweDBlOiBsZWZ0IGFuYWxvZyAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSk7CisJcHJpbnRrKCIgIDB4MmU6IHdhdmUgc291cmNlICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKKwlwcmludGsoIiAgMHgwZjogcmlnaHQgYW5hbG9nICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgwZikpOworCXByaW50aygiICAweDJmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDJmKSk7CisJcHJpbnRrKCIgIDB4MTA6IGxlZnQgUENNICAgICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MTApKTsKKwlwcmludGsoIiAgMHgzMDogYW5hbG9nIHBvd2VyICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzMCkpOworCXByaW50aygiICAweDExOiByaWdodCBQQ00gICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSk7CisJcHJpbnRrKCIgIDB4MzE6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKKwlwcmludGsoIiAgMHgxMjogRE1BIGRhdGEgZm9ybWF0ID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgxMikpOworCXByaW50aygiICAweDMyOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDMyKSk7CisJcHJpbnRrKCIgIDB4MTM6IFAvQyBlbmFibGUgICAgICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MTMpKTsKKwlwcmludGsoIiAgMHgzMzogLS0tICAgICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzMykpOworCXByaW50aygiICAweDE0OiBVL0QgYnV0dG9uICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSk7CisJcHJpbnRrKCIgIDB4MzQ6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKKwlwcmludGsoIiAgMHgxNTogcmV2aXNpb24gICAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgxNSkpOworCXByaW50aygiICAweDM1OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDM1KSk7CisJcHJpbnRrKCIgIDB4MTY6IEFEQyBvdXRwdXQgY3RybCA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MTYpKTsKKwlwcmludGsoIiAgMHgzNjogLS0tICAgICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzNikpOworCXByaW50aygiICAweDE3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSk7CisJcHJpbnRrKCIgIDB4Mzc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKKwlwcmludGsoIiAgMHgxODogRE1BIEEgdXBwZXIgY250ID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgxOCkpOworCXByaW50aygiICAweDM4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDM4KSk7CisJcHJpbnRrKCIgIDB4MTk6IERNQSBBIGxvd2VyIGNudCA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MTkpKTsKKwlwcmludGsoIiAgMHgzOTogLS0tICAgICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzOSkpOworCXByaW50aygiICAweDFhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSk7CisJcHJpbnRrKCIgIDB4M2E6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKKwlwcmludGsoIiAgMHgxYjogLS0tICAgICAgICAgICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgxYikpOworCXByaW50aygiICAweDNiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDNiKSk7CisJcHJpbnRrKCIgIDB4MWM6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MWMpKTsKKwlwcmludGsoIiAgMHgzYzogLS0tICAgICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzYykpOworCXByaW50aygiICAweDFkOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSk7CisJcHJpbnRrKCIgIDB4M2Q6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKKwlwcmludGsoIiAgMHgxZTogUENNIHJhdGUgbG93ICAgID0gMHglMDJ4ICAiLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgxZSkpOworCXByaW50aygiICAweDNlOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDNlKSk7CisJcHJpbnRrKCIgIDB4MWY6IFBDTSByYXRlIGhpZ2ggICA9IDB4JTAyeCAgIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MWYpKTsKKwlwcmludGsoIiAgMHgzZjogLS0tICAgICAgICAgICAgID0gMHglMDJ4XG4iLCBzbmRfc29uaWN2aWJlc19pbihzb25pYywgMHgzZikpOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfc2V0Zm10KHNvbmljdmliZXNfdCAqIHNvbmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc29uaWMtPnJlZ19sb2NrLCBmbGFncyk7CisJb3V0YihTVl9NQ0UgfCBTVl9JUkVHX0RNQV9EQVRBX0ZNVCwgU1ZfUkVHKHNvbmljLCBJTkRFWCkpOworCWlmIChtYXNrKSB7CisJCXNvbmljLT5mb3JtYXQgPSBpbmIoU1ZfUkVHKHNvbmljLCBEQVRBKSk7CisJCXVkZWxheSgxMCk7CisJfQorCXNvbmljLT5mb3JtYXQgPSAoc29uaWMtPmZvcm1hdCAmIG1hc2spIHwgdmFsdWU7CisJb3V0Yihzb25pYy0+Zm9ybWF0LCBTVl9SRUcoc29uaWMsIERBVEEpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgU1ZfUkVHKHNvbmljLCBJTkRFWCkpOworCXVkZWxheSgxMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29uaWMtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX3BsbCh1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJlc19yLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmVzX20sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpyZXNfbikKK3sKKwl1bnNpZ25lZCBpbnQgciwgbSA9IDAsIG4gPSAwOworCXVuc2lnbmVkIGludCB4bSwgeG4sIHhyLCB4ZCwgbWV0cmljID0gfjBVOworCisJaWYgKHJhdGUgPCA2MjUwMDAgLyBTVl9BRENNVUxUKQorCQlyYXRlID0gNjI1MDAwIC8gU1ZfQURDTVVMVDsKKwlpZiAocmF0ZSA+IDE1MDAwMDAwMCAvIFNWX0FEQ01VTFQpCisJCXJhdGUgPSAxNTAwMDAwMDAgLyBTVl9BRENNVUxUOworCS8qIHNsaWdodCB2aW9sYXRpb24gb2Ygc3BlY3MsIG5lZWRlZCBmb3IgY29udGludW91cyBzYW1wbGluZyByYXRlcyAqLworCWZvciAociA9IDA7IHJhdGUgPCA3NTAwMDAwMCAvIFNWX0FEQ01VTFQ7IHIgKz0gMHgyMCwgcmF0ZSA8PD0gMSk7CisJZm9yICh4biA9IDM7IHhuIDwgMzM7IHhuKyspCS8qIDM1ICovCisJCWZvciAoeG0gPSAzOyB4bSA8IDI1NzsgeG0rKykgeworCQkJeHIgPSAoKFNWX1JFRkZSRVFVRU5DWSAvIFNWX0FEQ01VTFQpICogeG0pIC8geG47CisJCQlpZiAoeHIgPj0gcmF0ZSkKKwkJCQl4ZCA9IHhyIC0gcmF0ZTsKKwkJCWVsc2UKKwkJCQl4ZCA9IHJhdGUgLSB4cjsKKwkJCWlmICh4ZCA8IG1ldHJpYykgeworCQkJCW1ldHJpYyA9IHhkOworCQkJCW0gPSB4bSAtIDI7CisJCQkJbiA9IHhuIC0gMjsKKwkJCX0KKwkJfQorCSpyZXNfciA9IHI7CisJKnJlc19tID0gbTsKKwkqcmVzX24gPSBuOworI2lmIDAKKwlwcmludGsoIm1ldHJpYyA9ICVpLCB4bSA9ICVpLCB4biA9ICVpXG4iLCBtZXRyaWMsIHhtLCB4bik7CisJcHJpbnRrKCJwbGw6IG0gPSAweCV4LCByID0gMHgleCwgbiA9IDB4JXhcbiIsIHJlZywgbSwgciwgbik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfc2V0cGxsKHNvbmljdmliZXNfdCAqIHNvbmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHIsIG0sIG47CisKKwlzbmRfc29uaWN2aWJlc19wbGwocmF0ZSwgJnIsICZtLCAmbik7CisJaWYgKHNvbmljICE9IE5VTEwpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNvbmljLT5yZWdfbG9jaywgZmxhZ3MpOworCQlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCByZWcsIG0pOworCQlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCByZWcgKyAxLCByIHwgbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvbmljLT5yZWdfbG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfc2V0X2FkY19yYXRlKHNvbmljdmliZXNfdCAqIHNvbmljLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgY2hhciBjbG9jazsKKworCWRpdiA9IDQ4MDAwIC8gcmF0ZTsKKwlpZiAoZGl2ID4gOCkKKwkJZGl2ID0gODsKKwlpZiAoKDQ4MDAwIC8gZGl2KSA9PSByYXRlKSB7CS8qIHVzZSB0aGUgYWx0ZXJuYXRlIGNsb2NrICovCisJCWNsb2NrID0gMHgxMDsKKwl9IGVsc2UgewkJCS8qIHVzZSB0aGUgUExMIHNvdXJjZSAqLworCQljbG9jayA9IDB4MDA7CisJCXNuZF9zb25pY3ZpYmVzX3NldHBsbChzb25pYywgU1ZfSVJFR19BRENfUExMLCByYXRlKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvbmljLT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIFNWX0lSRUdfQURDX0FMVF9SQVRFLCAoZGl2IC0gMSkgPDwgNCk7CisJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgU1ZfSVJFR19BRENfQ0xPQ0ssIGNsb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb25pYy0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19od19jb25zdHJhaW50X2RhY19yYXRlKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCQkJCSBzbmRfcGNtX2h3X3J1bGVfdCAqcnVsZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmF0ZSwgZGl2LCByLCBtLCBuOworCisJaWYgKGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpLT5taW4gPT0gCisJICAgIGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpLT5tYXgpIHsKKwkJcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpLT5taW47CisJCWRpdiA9IDQ4MDAwIC8gcmF0ZTsKKwkJaWYgKGRpdiA+IDgpCisJCQlkaXYgPSA4OworCQlpZiAoKDQ4MDAwIC8gZGl2KSA9PSByYXRlKSB7CisJCQlwYXJhbXMtPnJhdGVfbnVtID0gcmF0ZTsKKwkJCXBhcmFtcy0+cmF0ZV9kZW4gPSAxOworCQl9IGVsc2UgeworCQkJc25kX3NvbmljdmliZXNfcGxsKHJhdGUsICZyLCAmbSwgJm4pOworCQkJc25kX2Fzc2VydCgoU1ZfUkVGRlJFUVVFTkNZICUgMTYpID09IDAsIHJldHVybiAtRUlOVkFMKTsKKwkJCXNuZF9hc3NlcnQoKFNWX0FEQ01VTFQgJSA1MTIpID09IDAsIHJldHVybiAtRUlOVkFMKTsKKwkJCXBhcmFtcy0+cmF0ZV9udW0gPSAoU1ZfUkVGRlJFUVVFTkNZLzE2KSAqIChuKzIpICogcjsKKwkJCXBhcmFtcy0+cmF0ZV9kZW4gPSAoU1ZfQURDTVVMVC81MTIpICogKG0rMik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX3NldF9kYWNfcmF0ZShzb25pY3ZpYmVzX3QgKiBzb25pYywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGl2ID0gKHJhdGUgKiA2NTUzNiArIFNWX0ZVTExSQVRFIC8gMikgLyBTVl9GVUxMUkFURTsKKwlpZiAoZGl2ID4gNjU1MzUpCisJCWRpdiA9IDY1NTM1OworCXNwaW5fbG9ja19pcnFzYXZlKCZzb25pYy0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCBTVl9JUkVHX1BDTV9SQVRFX0hJR0gsIGRpdiA+PiA4KTsKKwlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCBTVl9JUkVHX1BDTV9SQVRFX0xPVywgZGl2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb25pYy0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc190cmlnZ2VyKHNvbmljdmliZXNfdCAqIHNvbmljLCBpbnQgd2hhdCwgaW50IGNtZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXNwaW5fbG9jaygmc29uaWMtPnJlZ19sb2NrKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CisJCWlmICghKHNvbmljLT5lbmFibGUgJiB3aGF0KSkgeworCQkJc29uaWMtPmVuYWJsZSB8PSB3aGF0OworCQkJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgU1ZfSVJFR19QQ19FTkFCTEUsIHNvbmljLT5lbmFibGUpOworCQl9CisJfSBlbHNlIGlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgeworCQlpZiAoc29uaWMtPmVuYWJsZSAmIHdoYXQpIHsKKwkJCXNvbmljLT5lbmFibGUgJj0gfndoYXQ7CisJCQlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCBTVl9JUkVHX1BDX0VOQUJMRSwgc29uaWMtPmVuYWJsZSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKwlzcGluX3VubG9jaygmc29uaWMtPnJlZ19sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX3NvbmljdmliZXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IGRldl9pZDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpOworCWlmICghKHN0YXR1cyAmIChTVl9ETUFBX0lSUSB8IFNWX0RNQUNfSVJRIHwgU1ZfTUlESV9JUlEpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCWlmIChzdGF0dXMgPT0gMHhmZikgewkvKiBmYWlsdXJlICovCisJCW91dGIoc29uaWMtPmlycW1hc2sgPSB+MCwgU1ZfUkVHKHNvbmljLCBJUlFNQVNLKSk7CisJCXNuZF9wcmludGsoIklSUSBmYWlsdXJlIC0gaW50ZXJydXB0cyBkaXNhYmxlZCEhXG4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlpZiAoc29uaWMtPnBjbSkgeworCQlpZiAoc3RhdHVzICYgU1ZfRE1BQV9JUlEpCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHNvbmljLT5wbGF5YmFja19zdWJzdHJlYW0pOworCQlpZiAoc3RhdHVzICYgU1ZfRE1BQ19JUlEpCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHNvbmljLT5jYXB0dXJlX3N1YnN0cmVhbSk7CisJfQorCWlmIChzb25pYy0+cm1pZGkpIHsKKwkJaWYgKHN0YXR1cyAmIFNWX01JRElfSVJRKQorCQkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpcnEsIHNvbmljLT5ybWlkaS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKwl9CisJaWYgKHN0YXR1cyAmIFNWX1VEX0lSUSkgeworCQl1bnNpZ25lZCBjaGFyIHVkcmVnOworCQlpbnQgdm9sLCBvbGVmdCwgb3JpZ2h0LCBtbGVmdCwgbXJpZ2h0OworCisJCXNwaW5fbG9jaygmc29uaWMtPnJlZ19sb2NrKTsKKwkJdWRyZWcgPSBzbmRfc29uaWN2aWJlc19pbjEoc29uaWMsIFNWX0lSRUdfVURfQlVUVE9OKTsKKwkJdm9sID0gdWRyZWcgJiAweDNmOworCQlpZiAoISh1ZHJlZyAmIDB4NDApKQorCQkJdm9sID0gLXZvbDsKKwkJb2xlZnQgPSBtbGVmdCA9IHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgU1ZfSVJFR19MRUZUX0FOQUxPRyk7CisJCW9yaWdodCA9IG1yaWdodCA9IHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgU1ZfSVJFR19SSUdIVF9BTkFMT0cpOworCQlvbGVmdCAmPSAweDFmOworCQlvcmlnaHQgJj0gMHgxZjsKKwkJb2xlZnQgKz0gdm9sOworCQlpZiAob2xlZnQgPCAwKQorCQkJb2xlZnQgPSAwOworCQlpZiAob2xlZnQgPiAweDFmKQorCQkJb2xlZnQgPSAweDFmOworCQlvcmlnaHQgKz0gdm9sOworCQlpZiAob3JpZ2h0IDwgMCkKKwkJCW9yaWdodCA9IDA7CisJCWlmIChvcmlnaHQgPiAweDFmKQorCQkJb3JpZ2h0ID0gMHgxZjsKKwkJaWYgKHVkcmVnICYgMHg4MCkgeworCQkJbWxlZnQgXj0gMHg4MDsKKwkJCW1yaWdodCBePSAweDgwOworCQl9CisJCW9sZWZ0IHw9IG1sZWZ0ICYgMHg4MDsKKwkJb3JpZ2h0IHw9IG1yaWdodCAmIDB4ODA7CisJCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIFNWX0lSRUdfTEVGVF9BTkFMT0csIG9sZWZ0KTsKKwkJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgU1ZfSVJFR19SSUdIVF9BTkFMT0csIG9yaWdodCk7CisJCXNwaW5fdW5sb2NrKCZzb25pYy0+cmVnX2xvY2spOworCQlzbmRfY3RsX25vdGlmeShzb25pYy0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZzb25pYy0+bWFzdGVyX211dGUtPmlkKTsKKwkJc25kX2N0bF9ub3RpZnkoc29uaWMtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmc29uaWMtPm1hc3Rlcl92b2x1bWUtPmlkKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogIFBDTSBwYXJ0CisgKi8KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19wbGF5YmFja190cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJCSAgIGludCBjbWQpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX3NvbmljdmliZXNfdHJpZ2dlcihzb25pYywgMSwgY21kKTsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19jYXB0dXJlX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJICBpbnQgY21kKQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9zb25pY3ZpYmVzX3RyaWdnZXIoc29uaWMsIDIsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgY2hhciBmbXQgPSAwOworCXVuc2lnbmVkIGludCBzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisKKwlzb25pYy0+cF9kbWFfc2l6ZSA9IHNpemU7CisJY291bnQtLTsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKQorCQlmbXQgfD0gMTsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNikKKwkJZm10IHw9IDI7CisJc25kX3NvbmljdmliZXNfc2V0Zm10KHNvbmljLCB+MywgZm10KTsKKwlzbmRfc29uaWN2aWJlc19zZXRfZGFjX3JhdGUoc29uaWMsIHJ1bnRpbWUtPnJhdGUpOworCXNwaW5fbG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJc25kX3NvbmljdmliZXNfc2V0ZG1hYShzb25pYywgcnVudGltZS0+ZG1hX2FkZHIsIHNpemUpOworCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIFNWX0lSRUdfRE1BX0FfVVBQRVIsIGNvdW50ID4+IDgpOworCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIFNWX0lSRUdfRE1BX0FfTE9XRVIsIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1bnNpZ25lZCBjaGFyIGZtdCA9IDA7CisJdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKworCXNvbmljLT5jX2RtYV9zaXplID0gc2l6ZTsKKwljb3VudCA+Pj0gMTsKKwljb3VudC0tOworCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCWZtdCB8PSAweDEwOworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQlmbXQgfD0gMHgyMDsKKwlzbmRfc29uaWN2aWJlc19zZXRmbXQoc29uaWMsIH4weDMwLCBmbXQpOworCXNuZF9zb25pY3ZpYmVzX3NldF9hZGNfcmF0ZShzb25pYywgcnVudGltZS0+cmF0ZSk7CisJc3Bpbl9sb2NrX2lycSgmc29uaWMtPnJlZ19sb2NrKTsKKwlzbmRfc29uaWN2aWJlc19zZXRkbWFjKHNvbmljLCBydW50aW1lLT5kbWFfYWRkciwgc2l6ZSk7CisJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgU1ZfSVJFR19ETUFfQ19VUFBFUiwgY291bnQgPj4gOCk7CisJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgU1ZfSVJFR19ETUFfQ19MT1dFUiwgY291bnQpOworCXNwaW5fdW5sb2NrX2lycSgmc29uaWMtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisKKwlpZiAoIShzb25pYy0+ZW5hYmxlICYgMSkpCisJCXJldHVybiAwOworCXB0ciA9IHNvbmljLT5wX2RtYV9zaXplIC0gc25kX3NvbmljdmliZXNfZ2V0ZG1hYShzb25pYyk7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfc29uaWN2aWJlc19jYXB0dXJlX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNpemVfdCBwdHI7CisJaWYgKCEoc29uaWMtPmVuYWJsZSAmIDIpKQorCQlyZXR1cm4gMDsKKwlwdHIgPSBzb25pYy0+Y19kbWFfc2l6ZSAtIHNuZF9zb25pY3ZpYmVzX2dldGRtYWMoc29uaWMpOworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOworfQorCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9zb25pY3ZpYmVzX3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQkzMiwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfc29uaWN2aWJlc19jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDAwMCwKKwkucmF0ZV9tYXggPQkJNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9CQkxLAorCS5jaGFubmVsc19tYXggPQkJMiwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQkzMiwKKwkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTEsCisJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXNvbmljLT5tb2RlIHw9IFNWX01PREVfUExBWTsKKwlzb25pYy0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX3NvbmljdmliZXNfcGxheWJhY2s7CisJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgc25kX3NvbmljdmliZXNfaHdfY29uc3RyYWludF9kYWNfcmF0ZSwgTlVMTCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsIC0xKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc29uaWMtPm1vZGUgfD0gU1ZfTU9ERV9DQVBUVVJFOworCXNvbmljLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF9zb25pY3ZpYmVzX2NhcHR1cmU7CisJc25kX3BjbV9od19jb25zdHJhaW50X3JhdGRlbnMocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgICAgJnNuZF9zb25pY3ZpYmVzX2h3X2NvbnN0cmFpbnRzX2FkY19jbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc29uaWMtPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CisJc29uaWMtPm1vZGUgJj0gflNWX01PREVfUExBWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXNvbmljLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJc29uaWMtPm1vZGUgJj0gflNWX01PREVfQ0FQVFVSRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX3NvbmljdmliZXNfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9zb25pY3ZpYmVzX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF9zb25pY3ZpYmVzX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfc29uaWN2aWJlc19wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3NvbmljdmliZXNfcGxheWJhY2tfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX3NvbmljdmliZXNfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3NvbmljdmliZXNfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX3NvbmljdmliZXNfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBwY20tPnByaXZhdGVfZGF0YTsKKwlzb25pYy0+cGNtID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NvbmljdmliZXNfcGNtKHNvbmljdmliZXNfdCAqIHNvbmljLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhzb25pYy0+Y2FyZCwgInMzXzg2YzYxNyIsIGRldmljZSwgMSwgMSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfYXNzZXJ0KHBjbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wcyk7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IHNvbmljOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX3NvbmljdmliZXNfcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiUzMgU29uaWNWaWJlcyIpOworCXNvbmljLT5wY20gPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKHNvbmljLT5wY2kpLCA2NCoxMDI0LCAxMjgqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTWl4ZXIgcGFydAorICovCisKKyNkZWZpbmUgU09OSUNWSUJFU19NVVgoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX3NvbmljdmliZXNfaW5mb19tdXgsIFwKKyAgLmdldCA9IHNuZF9zb25pY3ZpYmVzX2dldF9tdXgsIC5wdXQgPSBzbmRfc29uaWN2aWJlc19wdXRfbXV4IH0KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19pbmZvX211eChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbN10gPSB7CisJCSJDRCIsICJQQ00iLCAiQXV4MSIsICJMaW5lIiwgIkF1eDAiLCAiTWljIiwgIk1peCIKKwl9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDc7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gNykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDY7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19nZXRfbXV4KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwkKKwlzcGluX2xvY2tfaXJxKCZzb25pYy0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAoKHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgU1ZfSVJFR19MRUZUX0FEQykgJiBTVl9SRUNTUkNfT1VUKSA+PiA1KSAtIDE7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9ICgoc25kX3NvbmljdmliZXNfaW4xKHNvbmljLCBTVl9JUkVHX1JJR0hUX0FEQykgJiBTVl9SRUNTUkNfT1VUKSA+PiA1KSAtIDE7CisJc3Bpbl91bmxvY2tfaXJxKCZzb25pYy0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX3B1dF9tdXgoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IGxlZnQsIHJpZ2h0LCBvdmFsMSwgb3ZhbDI7CisJaW50IGNoYW5nZTsKKwkKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSA3IHx8CisJICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPj0gNykKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGVmdCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMSkgPDwgNTsKKwlyaWdodCA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdICsgMSkgPDwgNTsKKwlzcGluX2xvY2tfaXJxKCZzb25pYy0+cmVnX2xvY2spOworCW92YWwxID0gc25kX3NvbmljdmliZXNfaW4xKHNvbmljLCBTVl9JUkVHX0xFRlRfQURDKTsKKwlvdmFsMiA9IHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgU1ZfSVJFR19SSUdIVF9BREMpOworCWxlZnQgPSAob3ZhbDEgJiB+U1ZfUkVDU1JDX09VVCkgfCBsZWZ0OworCXJpZ2h0ID0gKG92YWwyICYgflNWX1JFQ1NSQ19PVVQpIHwgcmlnaHQ7CisJY2hhbmdlID0gbGVmdCAhPSBvdmFsMSB8fCByaWdodCAhPSBvdmFsMjsKKwlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCBTVl9JUkVHX0xFRlRfQURDLCBsZWZ0KTsKKwlzbmRfc29uaWN2aWJlc19vdXQxKHNvbmljLCBTVl9JUkVHX1JJR0hUX0FEQywgcmlnaHQpOworCXNwaW5fdW5sb2NrX2lycSgmc29uaWMtPnJlZ19sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIFNPTklDVklCRVNfU0lOR0xFKHhuYW1lLCB4aW5kZXgsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX3NvbmljdmliZXNfaW5mb19zaW5nbGUsIFwKKyAgLmdldCA9IHNuZF9zb25pY3ZpYmVzX2dldF9zaW5nbGUsIC5wdXQgPSBzbmRfc29uaWN2aWJlc19wdXRfc2luZ2xlLCBcCisgIC5wcml2YXRlX3ZhbHVlID0gcmVnIHwgKHNoaWZ0IDw8IDgpIHwgKG1hc2sgPDwgMTYpIHwgKGludmVydCA8PCAyNCkgfQorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX2luZm9fc2luZ2xlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19nZXRfc2luZ2xlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJCisJc3Bpbl9sb2NrX2lycSgmc29uaWMtPnJlZ19sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChzbmRfc29uaWN2aWJlc19pbjEoc29uaWMsIHJlZyk+PiBzaGlmdCkgJiBtYXNrOworCXNwaW5fdW5sb2NrX2lycSgmc29uaWMtPnJlZ19sb2NrKTsKKwlpZiAoaW52ZXJ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19wdXRfc2luZ2xlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIG92YWw7CisJCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl2YWwgPDw9IHNoaWZ0OworCXNwaW5fbG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJb3ZhbCA9IHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgcmVnKTsKKwl2YWwgPSAob3ZhbCAmIH4obWFzayA8PCBzaGlmdCkpIHwgdmFsOworCWNoYW5nZSA9IHZhbCAhPSBvdmFsOworCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIHJlZywgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBTT05JQ1ZJQkVTX0RPVUJMRSh4bmFtZSwgeGluZGV4LCBsZWZ0X3JlZywgcmlnaHRfcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfc29uaWN2aWJlc19pbmZvX2RvdWJsZSwgXAorICAuZ2V0ID0gc25kX3NvbmljdmliZXNfZ2V0X2RvdWJsZSwgLnB1dCA9IHNuZF9zb25pY3ZpYmVzX3B1dF9kb3VibGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSBsZWZ0X3JlZyB8IChyaWdodF9yZWcgPDwgOCkgfCAoc2hpZnRfbGVmdCA8PCAxNikgfCAoc2hpZnRfcmlnaHQgPDwgMTkpIHwgKG1hc2sgPDwgMjQpIHwgKGludmVydCA8PCAyMikgfQorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX2luZm9fZG91YmxlKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29uaWN2aWJlc19nZXRfZG91YmxlKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJc29uaWN2aWJlc190ICpzb25pYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgbGVmdF9yZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHJpZ2h0X3JlZyA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IHNoaWZ0X2xlZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHgwNzsKKwlpbnQgc2hpZnRfcmlnaHQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHgwNzsKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjIpICYgMTsKKwkKKwlzcGluX2xvY2tfaXJxKCZzb25pYy0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgbGVmdF9yZWcpID4+IHNoaWZ0X2xlZnQpICYgbWFzazsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChzbmRfc29uaWN2aWJlc19pbjEoc29uaWMsIHJpZ2h0X3JlZykgPj4gc2hpZnRfcmlnaHQpICYgbWFzazsKKwlzcGluX3VubG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJaWYgKGludmVydCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBtYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX3B1dF9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgdmFsMSwgdmFsMiwgb3ZhbDEsIG92YWwyOworCQorCXZhbDEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2s7CisJdmFsMiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzazsKKwlpZiAoaW52ZXJ0KSB7CisJCXZhbDEgPSBtYXNrIC0gdmFsMTsKKwkJdmFsMiA9IG1hc2sgLSB2YWwyOworCX0KKwl2YWwxIDw8PSBzaGlmdF9sZWZ0OworCXZhbDIgPDw9IHNoaWZ0X3JpZ2h0OworCXNwaW5fbG9ja19pcnEoJnNvbmljLT5yZWdfbG9jayk7CisJb3ZhbDEgPSBzbmRfc29uaWN2aWJlc19pbjEoc29uaWMsIGxlZnRfcmVnKTsKKwlvdmFsMiA9IHNuZF9zb25pY3ZpYmVzX2luMShzb25pYywgcmlnaHRfcmVnKTsKKwl2YWwxID0gKG92YWwxICYgfihtYXNrIDw8IHNoaWZ0X2xlZnQpKSB8IHZhbDE7CisJdmFsMiA9IChvdmFsMiAmIH4obWFzayA8PCBzaGlmdF9yaWdodCkpIHwgdmFsMjsKKwljaGFuZ2UgPSB2YWwxICE9IG92YWwxIHx8IHZhbDIgIT0gb3ZhbDI7CisJc25kX3NvbmljdmliZXNfb3V0MShzb25pYywgbGVmdF9yZWcsIHZhbDEpOworCXNuZF9zb25pY3ZpYmVzX291dDEoc29uaWMsIHJpZ2h0X3JlZywgdmFsMik7CisJc3Bpbl91bmxvY2tfaXJxKCZzb25pYy0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3NvbmljdmliZXNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworU09OSUNWSUJFU19ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgMCwgU1ZfSVJFR19MRUZUX0FEQywgU1ZfSVJFR19SSUdIVF9BREMsIDAsIDAsIDE1LCAwKSwKK1NPTklDVklCRVNfRE9VQkxFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMCwgU1ZfSVJFR19MRUZUX0FVWDEsIFNWX0lSRUdfUklHSFRfQVVYMSwgNywgNywgMSwgMSksCitTT05JQ1ZJQkVTX0RPVUJMRSgiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDAsIFNWX0lSRUdfTEVGVF9BVVgxLCBTVl9JUkVHX1JJR0hUX0FVWDEsIDAsIDAsIDMxLCAxKSwKK1NPTklDVklCRVNfRE9VQkxFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAwLCBTVl9JUkVHX0xFRlRfQ0QsIFNWX0lSRUdfUklHSFRfQ0QsIDcsIDcsIDEsIDEpLAorU09OSUNWSUJFU19ET1VCTEUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDAsIFNWX0lSRUdfTEVGVF9DRCwgU1ZfSVJFR19SSUdIVF9DRCwgMCwgMCwgMzEsIDEpLAorU09OSUNWSUJFU19ET1VCTEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMCwgU1ZfSVJFR19MRUZUX0xJTkUsIFNWX0lSRUdfUklHSFRfTElORSwgNywgNywgMSwgMSksCitTT05JQ1ZJQkVTX0RPVUJMRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAwLCBTVl9JUkVHX0xFRlRfTElORSwgU1ZfSVJFR19SSUdIVF9MSU5FLCAwLCAwLCAzMSwgMSksCitTT05JQ1ZJQkVTX1NJTkdMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsIFNWX0lSRUdfTUlDLCA3LCAxLCAxKSwKK1NPTklDVklCRVNfU0lOR0xFKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMCwgU1ZfSVJFR19NSUMsIDAsIDE1LCAxKSwKK1NPTklDVklCRVNfU0lOR0xFKCJNaWMgQm9vc3QiLCAwLCBTVl9JUkVHX0xFRlRfQURDLCA0LCAxLCAwKSwKK1NPTklDVklCRVNfRE9VQkxFKCJTeW50aCBQbGF5YmFjayBTd2l0Y2giLCAwLCBTVl9JUkVHX0xFRlRfU1lOVEgsIFNWX0lSRUdfUklHSFRfU1lOVEgsIDcsIDcsIDEsIDEpLAorU09OSUNWSUJFU19ET1VCTEUoIlN5bnRoIFBsYXliYWNrIFZvbHVtZSIsIDAsIFNWX0lSRUdfTEVGVF9TWU5USCwgU1ZfSVJFR19SSUdIVF9TWU5USCwgMCwgMCwgMzEsIDEpLAorU09OSUNWSUJFU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLCBTVl9JUkVHX0xFRlRfQVVYMiwgU1ZfSVJFR19SSUdIVF9BVVgyLCA3LCA3LCAxLCAxKSwKK1NPTklDVklCRVNfRE9VQkxFKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMSwgU1ZfSVJFR19MRUZUX0FVWDIsIFNWX0lSRUdfUklHSFRfQVVYMiwgMCwgMCwgMzEsIDEpLAorU09OSUNWSUJFU19ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAwLCBTVl9JUkVHX0xFRlRfQU5BTE9HLCBTVl9JUkVHX1JJR0hUX0FOQUxPRywgNywgNywgMSwgMSksCitTT05JQ1ZJQkVTX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIFNWX0lSRUdfTEVGVF9BTkFMT0csIFNWX0lSRUdfUklHSFRfQU5BTE9HLCAwLCAwLCAzMSwgMSksCitTT05JQ1ZJQkVTX0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsIFNWX0lSRUdfTEVGVF9QQ00sIFNWX0lSRUdfUklHSFRfUENNLCA3LCA3LCAxLCAxKSwKK1NPTklDVklCRVNfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwgU1ZfSVJFR19MRUZUX1BDTSwgU1ZfSVJFR19SSUdIVF9QQ00sIDAsIDAsIDYzLCAxKSwKK1NPTklDVklCRVNfU0lOR0xFKCJMb29wYmFjayBDYXB0dXJlIFN3aXRjaCIsIDAsIFNWX0lSRUdfQURDX09VVFBVVF9DVFJMLCAwLCAxLCAwKSwKK1NPTklDVklCRVNfU0lOR0xFKCJMb29wYmFjayBDYXB0dXJlIFZvbHVtZSIsIDAsIFNWX0lSRUdfQURDX09VVFBVVF9DVFJMLCAyLCA2MywgMSksCitTT05JQ1ZJQkVTX01VWCgiQ2FwdHVyZSBTb3VyY2UiLCAwKQorfTsKKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfbWFzdGVyX2ZyZWUoc25kX2tjb250cm9sX3QgKmtjb250cm9sKQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc29uaWMtPm1hc3Rlcl9tdXRlID0gTlVMTDsKKwlzb25pYy0+bWFzdGVyX3ZvbHVtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zb25pY3ZpYmVzX21peGVyKHNvbmljdmliZXNfdCAqIHNvbmljKQoreworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJc25kX2Fzc2VydChzb25pYyAhPSBOVUxMICYmIHNvbmljLT5jYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwljYXJkID0gc29uaWMtPmNhcmQ7CisJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIlMzIFNvbmljVmliZXMiKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfc29uaWN2aWJlc19jb250cm9scyk7IGlkeCsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3NvbmljdmliZXNfY29udHJvbHNbaWR4XSwgc29uaWMpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJc3dpdGNoIChpZHgpIHsKKwkJY2FzZSAwOgorCQljYXNlIDE6IGtjdGwtPnByaXZhdGVfZnJlZSA9IHNuZF9zb25pY3ZpYmVzX21hc3Rlcl9mcmVlOyBicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKworICovCisKK3N0YXRpYyB2b2lkIHNuZF9zb25pY3ZpYmVzX3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgCisJCQkJICAgICBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwlzb25pY3ZpYmVzX3QgKnNvbmljID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCXRtcCA9IHNvbmljLT5zcnNfc3BhY2UgJiAweDBmOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNSUyAzRCAgICAgICAgICAgOiAlc1xuIiwKKwkJICAgIHNvbmljLT5zcnNfc3BhY2UgJiAweDgwID8gIm9mZiIgOiAib24iKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTUlMgU3BhY2UgICAgICAgIDogJXNcbiIsCisJCSAgICB0bXAgPT0gMHgwMCA/ICIxMDAlIiA6CisJCSAgICB0bXAgPT0gMHgwMSA/ICI3NSUiIDoKKwkJICAgIHRtcCA9PSAweDAyID8gIjUwJSIgOgorCQkgICAgdG1wID09IDB4MDMgPyAiMjUlIiA6ICIwJSIpOworCXRtcCA9IHNvbmljLT5zcnNfY2VudGVyICYgMHgwZjsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTUlMgQ2VudGVyICAgICAgIDogJXNcbiIsCisJCSAgICB0bXAgPT0gMHgwMCA/ICIxMDAlIiA6CisJCSAgICB0bXAgPT0gMHgwMSA/ICI3NSUiIDoKKwkJICAgIHRtcCA9PSAweDAyID8gIjUwJSIgOgorCQkgICAgdG1wID09IDB4MDMgPyAiMjUlIiA6ICIwJSIpOworCXRtcCA9IHNvbmljLT53YXZlX3NvdXJjZSAmIDB4MDM7CisJc25kX2lwcmludGYoYnVmZmVyLCAiV2F2ZVRhYmxlIFNvdXJjZSA6ICVzXG4iLAorCQkgICAgdG1wID09IDB4MDAgPyAib24tYm9hcmQgUk9NIiA6CisJCSAgICB0bXAgPT0gMHgwMSA/ICJQQ0kgYnVzIiA6ICJvbi1ib2FyZCBST00gKyBQQ0kgYnVzIik7CisJdG1wID0gc29uaWMtPm1wdV9zd2l0Y2g7CisJc25kX2lwcmludGYoYnVmZmVyLCAiT25ib2FyZCBzeW50aCAgICA6ICVzXG4iLCB0bXAgJiAweDAxID8gIm9uIiA6ICJvZmYiKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJFeHQuIFJ4IHRvIHN5bnRoIDogJXNcbiIsIHRtcCAmIDB4MDIgPyAib24iIDogIm9mZiIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1JREkgdG8gZXh0LiBUeCAgOiAlc1xuIiwgdG1wICYgMHgwNCA/ICJvbiIgOiAib2ZmIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfc29uaWN2aWJlc19wcm9jX2luaXQoc29uaWN2aWJlc190ICogc29uaWMpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhzb25pYy0+Y2FyZCwgInNvbmljdmliZXMiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHNvbmljLCAxMDI0LCBzbmRfc29uaWN2aWJlc19wcm9jX3JlYWQpOworfQorCisvKgorCisgKi8KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3NvbmljdmliZXNfZ2FtZV9jb250cm9sIF9fZGV2aW5pdGRhdGEgPQorU09OSUNWSUJFU19TSU5HTEUoIkpveXN0aWNrIFNwZWVkIiwgMCwgU1ZfSVJFR19HQU1FX1BPUlQsIDEsIDE1LCAwKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NvbmljdmliZXNfY3JlYXRlX2dhbWVwb3J0KHNvbmljdmliZXNfdCAqc29uaWMpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKworCXNvbmljLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb25pY3ZpYmVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiU29uaWNWaWJlcyBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUoc29uaWMtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmc29uaWMtPnBjaS0+ZGV2KTsKKwlncC0+aW8gPSBzb25pYy0+Z2FtZV9wb3J0OworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlzbmRfY3RsX2FkZChzb25pYy0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfc29uaWN2aWJlc19nYW1lX2NvbnRyb2wsIHNvbmljKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfZnJlZV9nYW1lcG9ydChzb25pY3ZpYmVzX3QgKnNvbmljKQoreworCWlmIChzb25pYy0+Z2FtZXBvcnQpIHsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHNvbmljLT5nYW1lcG9ydCk7CisJCXNvbmljLT5nYW1lcG9ydCA9IE5VTEw7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9zb25pY3ZpYmVzX2NyZWF0ZV9nYW1lcG9ydChzb25pY3ZpYmVzX3QgKnNvbmljKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3NvbmljdmliZXNfZnJlZV9nYW1lcG9ydChzb25pY3ZpYmVzX3QgKnNvbmljKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX2ZyZWUoc29uaWN2aWJlc190ICpzb25pYykKK3sKKwlzbmRfc29uaWN2aWJlc19mcmVlX2dhbWVwb3J0KHNvbmljKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbmljLT5wY2ksIDB4NDAsIHNvbmljLT5kbWFhX3BvcnQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29uaWMtPnBjaSwgMHg0OCwgc29uaWMtPmRtYWNfcG9ydCk7CisJaWYgKHNvbmljLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoc29uaWMtPmlycSwgKHZvaWQgKilzb25pYyk7CisJaWYgKHNvbmljLT5yZXNfZG1hYSkgeworCQlyZWxlYXNlX3Jlc291cmNlKHNvbmljLT5yZXNfZG1hYSk7CisJCWtmcmVlX25vY2hlY2soc29uaWMtPnJlc19kbWFhKTsKKwl9CisJaWYgKHNvbmljLT5yZXNfZG1hYykgeworCQlyZWxlYXNlX3Jlc291cmNlKHNvbmljLT5yZXNfZG1hYyk7CisJCWtmcmVlX25vY2hlY2soc29uaWMtPnJlc19kbWFjKTsKKwl9CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhzb25pYy0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2Uoc29uaWMtPnBjaSk7CisJa2ZyZWUoc29uaWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb25pY3ZpYmVzX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NvbmljdmliZXNfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkJCQlzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCQlpbnQgcmV2ZXJiLAorCQkJCQlpbnQgbWdlLAorCQkJCQlzb25pY3ZpYmVzX3QgKiogcnNvbmljKQoreworCXNvbmljdmliZXNfdCAqc29uaWM7CisJdW5zaWduZWQgaW50IGRtYWEsIGRtYWM7CisJaW50IGVycjsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF9zb25pY3ZpYmVzX2Rldl9mcmVlLAorCX07CisKKwkqcnNvbmljID0gTlVMTDsKKwkvKiBlbmFibGUgUENJIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjQgYml0cyAqLworICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIDB4MDBmZmZmZmYpIDwgMCB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCAweDAwZmZmZmZmKSA8IDApIHsKKyAgICAgICAgICAgICAgICBzbmRfcHJpbnRrKCJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKworCXNvbmljID0ga2NhbGxvYygxLCBzaXplb2YoKnNvbmljKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNvbmljID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmc29uaWMtPnJlZ19sb2NrKTsKKwlzb25pYy0+Y2FyZCA9IGNhcmQ7CisJc29uaWMtPnBjaSA9IHBjaTsKKwlzb25pYy0+aXJxID0gLTE7CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCAiUzMgU29uaWNWaWJlcyIpKSA8IDApIHsKKwkJa2ZyZWUoc29uaWMpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzb25pYy0+c2JfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCXNvbmljLT5lbmhfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCXNvbmljLT5zeW50aF9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJc29uaWMtPm1pZGlfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOworCXNvbmljLT5nYW1lX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCA0KTsKKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3NvbmljdmliZXNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJTMyBTb25pY1ZpYmVzIiwgKHZvaWQgKilzb25pYykpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF9zb25pY3ZpYmVzX2ZyZWUoc29uaWMpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzb25pYy0+aXJxID0gcGNpLT5pcnE7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCAweDQwLCAmZG1hYSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgMHg0OCwgJmRtYWMpOworCWRtYWlvICY9IH4weDBmOworCWRtYWEgJj0gfjB4MGY7CisJZG1hYyAmPSB+MHgwZjsKKwlpZiAoIWRtYWEpIHsKKwkJZG1hYSA9IGRtYWlvOworCQlkbWFpbyArPSAweDEwOworCQlzbmRfcHJpbnRrKCJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEEgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwgZG1hYSk7CisJfQorCWlmICghZG1hYykgeworCQlkbWFjID0gZG1haW87CisJCWRtYWlvICs9IDB4MTA7CisJCXNuZF9wcmludGsoIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQyBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFjKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIGRtYWEpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQ4LCBkbWFjKTsKKworCWlmICgoc29uaWMtPnJlc19kbWFhID0gcmVxdWVzdF9yZWdpb24oZG1hYSwgMHgxMCwgIlMzIFNvbmljVmliZXMgRERNQS1BIikpID09IE5VTEwpIHsKKwkJc25kX3NvbmljdmliZXNfZnJlZShzb25pYyk7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIERETUEtQSBwb3J0IGF0IDB4JXgtMHgleFxuIiwgZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKChzb25pYy0+cmVzX2RtYWMgPSByZXF1ZXN0X3JlZ2lvbihkbWFjLCAweDEwLCAiUzMgU29uaWNWaWJlcyBERE1BLUMiKSkgPT0gTlVMTCkgeworCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgRERNQS1DIHBvcnQgYXQgMHgleC0weCV4XG4iLCBkbWFjLCBkbWFjICsgMHgxMCAtIDEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsICZzb25pYy0+ZG1hYV9wb3J0KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCAweDQ4LCAmc29uaWMtPmRtYWNfcG9ydCk7CisJc29uaWMtPmRtYWFfcG9ydCAmPSB+MHgwZjsKKwlzb25pYy0+ZG1hY19wb3J0ICY9IH4weDBmOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQwLCBzb25pYy0+ZG1hYV9wb3J0IHwgOSk7CS8qIGVuYWJsZSArIGVuaGFuY2VkICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDgsIHNvbmljLT5kbWFjX3BvcnQgfCA5KTsJLyogZW5hYmxlICovCisJLyogb2suLiBpbml0aWFsaXplIFMzIFNvbmljVmliZXMgY2hpcCAqLworCW91dGIoU1ZfUkVTRVQsIFNWX1JFRyhzb25pYywgQ09OVFJPTCkpOwkJLyogcmVzZXQgY2hpcCAqLworCXVkZWxheSgxMDApOworCW91dGIoMCwgU1ZfUkVHKHNvbmljLCBDT05UUk9MKSk7CS8qIHJlbGVhc2UgcmVzZXQgKi8KKwl1ZGVsYXkoMTAwKTsKKwlvdXRiKFNWX0VOSEFOQ0VEIHwgU1ZfSU5UQSB8IChyZXZlcmIgPyBTVl9SRVZFUkIgOiAwKSwgU1ZfUkVHKHNvbmljLCBDT05UUk9MKSk7CisJaW5iKFNWX1JFRyhzb25pYywgU1RBVFVTKSk7CS8qIGNsZWFyIElSUXMgKi8KKyNpZiAxCisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX0RSSVZFX0NUUkwsIDApOwkvKiBkcml2ZSBjdXJyZW50IDE2bUEgKi8KKyNlbHNlCisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX0RSSVZFX0NUUkwsIDB4NDApOwkvKiBkcml2ZSBjdXJyZW50IDhtQSAqLworI2VuZGlmCisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1BDX0VOQUJMRSwgc29uaWMtPmVuYWJsZSA9IDApOwkvKiBkaXNhYmxlIHBsYXliYWNrICYgY2FwdHVyZSAqLworCW91dGIoc29uaWMtPmlycW1hc2sgPSB+KFNWX0RNQUFfTUFTSyB8IFNWX0RNQUNfTUFTSyB8IFNWX1VEX01BU0spLCBTVl9SRUcoc29uaWMsIElSUU1BU0spKTsKKwlpbmIoU1ZfUkVHKHNvbmljLCBTVEFUVVMpKTsJLyogY2xlYXIgSVJRcyAqLworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19BRENfQ0xPQ0ssIDApOwkvKiB1c2UgUExMIGFzIGNsb2NrIHNvdXJjZSAqLworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19BTkFMT0dfUE9XRVIsIDApOwkvKiBwb3dlciB1cCBhbmFsb2cgcGFydHMgKi8KKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfRElHSVRBTF9QT1dFUiwgMCk7CS8qIHBvd2VyIHVwIGRpZ2l0YWwgcGFydHMgKi8KKwlzbmRfc29uaWN2aWJlc19zZXRwbGwoc29uaWMsIFNWX0lSRUdfQURDX1BMTCwgODAwMCk7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1NSU19TUEFDRSwgc29uaWMtPnNyc19zcGFjZSA9IDB4ODApOwkvKiBTUlMgc3BhY2Ugb2ZmICovCisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1NSU19DRU5URVIsIHNvbmljLT5zcnNfY2VudGVyID0gMHgwMCk7LyogU1JTIGNlbnRlciBvZmYgKi8KKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfTVBVNDAxLCBzb25pYy0+bXB1X3N3aXRjaCA9IDB4MDUpOwkvKiBNUFUtNDAxIHN3aXRjaCAqLworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19XQVZFX1NPVVJDRSwgc29uaWMtPndhdmVfc291cmNlID0gMHgwMCk7CS8qIG9uYm9hcmQgUk9NICovCisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1BDTV9SQVRFX0xPVywgKDgwMDAgKiA2NTUzNiAvIFNWX0ZVTExSQVRFKSAmIDB4ZmYpOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19QQ01fUkFURV9ISUdILCAoKDgwMDAgKiA2NTUzNiAvIFNWX0ZVTExSQVRFKSA+PiA4KSAmIDB4ZmYpOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19MRUZUX0FEQywgbWdlID8gMHhkMCA6IDB4YzApOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19SSUdIVF9BREMsIDB4YzApOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19MRUZUX0FVWDEsIDB4OWYpOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19SSUdIVF9BVVgxLCAweDlmKTsKKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfTEVGVF9DRCwgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1JJR0hUX0NELCAweDlmKTsKKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfTEVGVF9MSU5FLCAweDlmKTsKKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfUklHSFRfTElORSwgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX01JQywgMHg4Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX0xFRlRfU1lOVEgsIDB4OWYpOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19SSUdIVF9TWU5USCwgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX0xFRlRfQVVYMiwgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1JJR0hUX0FVWDIsIDB4OWYpOworCXNuZF9zb25pY3ZpYmVzX291dChzb25pYywgU1ZfSVJFR19MRUZUX0FOQUxPRywgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX1JJR0hUX0FOQUxPRywgMHg5Zik7CisJc25kX3NvbmljdmliZXNfb3V0KHNvbmljLCBTVl9JUkVHX0xFRlRfUENNLCAweGJmKTsKKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfUklHSFRfUENNLCAweGJmKTsKKwlzbmRfc29uaWN2aWJlc19vdXQoc29uaWMsIFNWX0lSRUdfQURDX09VVFBVVF9DVFJMLCAweGZjKTsKKyNpZiAwCisJc25kX3NvbmljdmliZXNfZGVidWcoc29uaWMpOworI2VuZGlmCisJc29uaWMtPnJldmlzaW9uID0gc25kX3NvbmljdmliZXNfaW4oc29uaWMsIFNWX0lSRUdfUkVWSVNJT04pOworCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbmljLCAmb3BzKSkgPCAwKSB7CisJCXNuZF9zb25pY3ZpYmVzX2ZyZWUoc29uaWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9zb25pY3ZpYmVzX3Byb2NfaW5pdChzb25pYyk7CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcnNvbmljID0gc29uaWM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTUlESSBzZWN0aW9uCisgKi8KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfc29uaWN2aWJlc19taWRpX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK1NPTklDVklCRVNfU0lOR0xFKCJTb25pY1ZpYmVzIFdhdmUgU291cmNlIFJBTSIsIDAsIFNWX0lSRUdfV0FWRV9TT1VSQ0UsIDAsIDEsIDApLAorU09OSUNWSUJFU19TSU5HTEUoIlNvbmljVmliZXMgV2F2ZSBTb3VyY2UgUkFNK1JPTSIsIDAsIFNWX0lSRUdfV0FWRV9TT1VSQ0UsIDEsIDEsIDApLAorU09OSUNWSUJFU19TSU5HTEUoIlNvbmljVmliZXMgT25ib2FyZCBTeW50aCIsIDAsIFNWX0lSRUdfTVBVNDAxLCAwLCAxLCAwKSwKK1NPTklDVklCRVNfU0lOR0xFKCJTb25pY1ZpYmVzIEV4dGVybmFsIFJ4IHRvIFN5bnRoIiwgMCwgU1ZfSVJFR19NUFU0MDEsIDEsIDEsIDApLAorU09OSUNWSUJFU19TSU5HTEUoIlNvbmljVmliZXMgRXh0ZXJuYWwgVHgiLCAwLCBTVl9JUkVHX01QVTQwMSwgMiwgMSwgMCkKK307CisKK3N0YXRpYyBpbnQgc25kX3NvbmljdmliZXNfbWlkaV9pbnB1dF9vcGVuKG1wdTQwMV90ICogbXB1KQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBtcHUtPnByaXZhdGVfZGF0YTsKKwlvdXRiKHNvbmljLT5pcnFtYXNrICY9IH5TVl9NSURJX01BU0ssIFNWX1JFRyhzb25pYywgSVJRTUFTSykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfc29uaWN2aWJlc19taWRpX2lucHV0X2Nsb3NlKG1wdTQwMV90ICogbXB1KQoreworCXNvbmljdmliZXNfdCAqc29uaWMgPSBtcHUtPnByaXZhdGVfZGF0YTsKKwlvdXRiKHNvbmljLT5pcnFtYXNrIHw9IFNWX01JRElfTUFTSywgU1ZfUkVHKHNvbmljLCBJUlFNQVNLKSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zb25pY3ZpYmVzX21pZGkoc29uaWN2aWJlc190ICogc29uaWMsIHNuZF9yYXdtaWRpX3QgKiBybWlkaSkKK3sKKwltcHU0MDFfdCAqIG1wdSA9IHJtaWRpLT5wcml2YXRlX2RhdGE7CisJc25kX2NhcmRfdCAqY2FyZCA9IHNvbmljLT5jYXJkOworCXNuZF9yYXdtaWRpX3N0cl90ICpkaXI7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCisJbXB1LT5wcml2YXRlX2RhdGEgPSBzb25pYzsKKwltcHUtPm9wZW5faW5wdXQgPSBzbmRfc29uaWN2aWJlc19taWRpX2lucHV0X29wZW47CisJbXB1LT5jbG9zZV9pbnB1dCA9IHNuZF9zb25pY3ZpYmVzX21pZGlfaW5wdXRfY2xvc2U7CisJZGlyID0gJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVF07CisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9zb25pY3ZpYmVzX21pZGlfY29udHJvbHMpOyBpZHgrKykKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9zb25pY3ZpYmVzX21pZGlfY29udHJvbHNbaWR4XSwgc29uaWMpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NvbmljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0YXRpYyBpbnQgZGV2OworCXNuZF9jYXJkX3QgKmNhcmQ7CisJc29uaWN2aWJlc190ICpzb25pYzsKKwlzbmRfcmF3bWlkaV90ICptaWRpX3VhcnQ7CisJb3BsM190ICpvcGwzOworCWludCBpZHgsIGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyAKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDU7IGlkeCsrKSB7CisJCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCBpZHgpID09IDAgfHwKKwkJICAgICEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgaWR4KSAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJaWYgKChlcnIgPSBzbmRfc29uaWN2aWJlc19jcmVhdGUoY2FyZCwgcGNpLAorCQkJCQkgcmV2ZXJiW2Rldl0gPyAxIDogMCwKKwkJCQkJIG1nZVtkZXZdID8gMSA6IDAsCisJCQkJCSAmc29uaWMpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiU29uaWNWaWJlcyIpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJTMyBTb25pY1ZpYmVzIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIHJldiAlaSBhdCAweCVseCwgaXJxICVpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLAorCQlzb25pYy0+cmV2aXNpb24sCisJCXBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpLAorCQlzb25pYy0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX3NvbmljdmliZXNfcGNtKHNvbmljLCAwLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX3NvbmljdmliZXNfbWl4ZXIoc29uaWMpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19TT05JQ1ZJQkVTLAorCQkJCSAgICAgICBzb25pYy0+bWlkaV9wb3J0LCAxLAorCQkJCSAgICAgICBzb25pYy0+aXJxLCAwLAorCQkJCSAgICAgICAmbWlkaV91YXJ0KSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9zb25pY3ZpYmVzX21pZGkoc29uaWMsIG1pZGlfdWFydCk7CisJaWYgKChlcnIgPSBzbmRfb3BsM19jcmVhdGUoY2FyZCwgc29uaWMtPnN5bnRoX3BvcnQsCisJCQkJICAgc29uaWMtPnN5bnRoX3BvcnQgKyAyLAorCQkJCSAgIE9QTDNfSFdfT1BMM19TViwgMSwgJm9wbDMpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMSwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9zb25pY3ZpYmVzX2NyZWF0ZV9nYW1lcG9ydChzb25pYyk7CisKKwlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CisJZGV2Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfc29uaWNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiUzMgU29uaWNWaWJlcyIsCisJLmlkX3RhYmxlID0gc25kX3NvbmljX2lkcywKKwkucHJvYmUgPSBzbmRfc29uaWNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9zb25pY19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX3NvbmljdmliZXNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfc29uaWN2aWJlc19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfc29uaWN2aWJlc19pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX3NvbmljdmliZXNfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L01ha2VmaWxlIGIvc291bmQvcGNpL3RyaWRlbnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViYzViNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyMKKworc25kLXRyaWRlbnQtb2JqcyA6PSB0cmlkZW50Lm8gdHJpZGVudF9tYWluLm8gdHJpZGVudF9tZW1vcnkubworc25kLXRyaWRlbnQtc3ludGgtb2JqcyA6PSB0cmlkZW50X3N5bnRoLm8KKworIworIyB0aGlzIGZ1bmN0aW9uIHJldHVybnM6CisjICAgIm0iIC0gQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbQorIyAgIDxlbXB0eSBzdHJpbmc+IC0gQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgdW5kZWZpbmVkCisjICAgb3RoZXJ3aXNlIHBhcmFtZXRlciAjMSB2YWx1ZQorIworc2VxdWVuY2VyID0gJChpZiAkKHN1YnN0IHksLCQoQ09ORklHX1NORF9TRVFVRU5DRVIpKSwkKGlmICQoMSksbSksJChpZiAkKENPTkZJR19TTkRfU0VRVUVOQ0VSKSwkKDEpKSkKKworIyBUb3BsZXZlbCBNb2R1bGUgRGVwZW5kZW5jeQorb2JqLSQoQ09ORklHX1NORF9UUklERU5UKSArPSBzbmQtdHJpZGVudC5vCitvYmotJChjYWxsIHNlcXVlbmNlciwkKENPTkZJR19TTkRfVFJJREVOVCkpICs9IHNuZC10cmlkZW50LXN5bnRoLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU4ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogIERyaXZlciBmb3IgVHJpZGVudCA0RFdhdmUgRFgvTlggJiBTaVMgU0k3MDE4IEF1ZGlvIFBDSSBzb3VuZGNhcmQKKyAqCisgKiAgRHJpdmVyIHdhcyBvcmlnaW5hdGVkIGJ5IFRyaWRlbnQgPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+CisgKiAgCQkJICAgICBGcmkgRmViIDE5IDE1OjU1OjI4IE1TVCAxOTk5CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvdHJpZGVudC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiwgPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRyaWRlbnQgNEQtV2F2ZURYL05YICYgU2lTIFNJNzAxOCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7VHJpZGVudCw0RFdhdmUgRFh9LCIKKwkJIntUcmlkZW50LDREV2F2ZSBOWH0sIgorCQkie1NpUyxTSTcwMTggUENJIEF1ZGlvfSwiCisJCSJ7QmVzdCBVbmlvbixNaXNzIE1lbG9keSA0RFdhdmUgUENJfSwiCisJCSJ7SElTLDREV2F2ZSBQQ0l9LCIKKwkJIntXYXJwc3BlZWQsT05TcGVlZCA0RFdhdmUgUENJfSwiCisJCSJ7QXp0ZWNoIFN5c3RlbXMsUENJIDY0LVEzRH0sIgorCQkie0FkZG9uaWNzLFNWIDc1MH0sIgorCQkie0NISUMsVHJ1ZSBTb3VuZCA0RHdhdmV9LCIKKwkJIntTaGFyayxQcmVkYXRvcjRELVBDSX0sIgorCQkie0phdG9uLFNvbmljV2F2ZSA0RH0sIgorCQkie0hvb250ZWNoLFNvdW5kVHJhY2sgRGlnaXRhbCA0RFdhdmUgTlh9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgcGNtX2NoYW5uZWxzW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMzJ9Oworc3RhdGljIGludCB3YXZldGFibGVfc2l6ZVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDgxOTJ9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIFRyaWRlbnQgNERXYXZlIFBDSSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIFRyaWRlbnQgNERXYXZlIFBDSSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIFRyaWRlbnQgNERXYXZlIFBDSSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGNtX2NoYW5uZWxzLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwY21fY2hhbm5lbHMsICJOdW1iZXIgb2YgaGFyZHdhcmUgY2hhbm5lbHMgYXNzaWduZWQgZm9yIFBDTS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheSh3YXZldGFibGVfc2l6ZSwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2F2ZXRhYmxlX3NpemUsICJNYXhpbXVtIG1lbW9yeSBzaXplIGluIGtCIGZvciB3YXZldGFibGUgc3ludGguIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfdHJpZGVudF9pZHNbXSA9IHsKKwl7IDB4MTAyMywgMHgyMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAkvKiBUcmlkZW50IDREV2F2ZSBEWCBQQ0kgQXVkaW8gKi8KKwl7IDB4MTAyMywgMHgyMDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAkvKiBUcmlkZW50IDREV2F2ZSBOWCBQQ0kgQXVkaW8gKi8KKwl7IDB4MTAzOSwgMHg3MDE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LAkvKiBTaVMgU0k3MDE4IFBDSSBBdWRpbyAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF90cmlkZW50X2lkcyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF90cmlkZW50X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwl0cmlkZW50X3QgKnRyaWRlbnQ7CisJY29uc3QgY2hhciAqc3RyOworCWludCBlcnIsIHBjbV9kZXYgPSAwOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGVyciA9IHNuZF90cmlkZW50X2NyZWF0ZShjYXJkLCBwY2ksCisJCQkJICAgICAgcGNtX2NoYW5uZWxzW2Rldl0sCisJCQkJICAgICAgKChwY2ktPnZlbmRvciA8PCAxNikgfCBwY2ktPmRldmljZSkgPT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4ID8gMSA6IDIsCisJCQkJICAgICAgd2F2ZXRhYmxlX3NpemVbZGV2XSwKKwkJCQkgICAgICAmdHJpZGVudCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKKwkJc3RyID0gIlRSSUQ0RFdBVkVEWCI7CisJCWJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CisJCXN0ciA9ICJUUklENERXQVZFTlgiOworCQlicmVhazsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX1NJNzAxODoKKwkJc3RyID0gIlNJNzAxOCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0ciA9ICJVbmtub3duIjsKKwl9CisJc3RyY3B5KGNhcmQtPmRyaXZlciwgc3RyKTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiU2lTICIpOworCX0gZWxzZSB7CisJCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJUcmlkZW50ICIpOworCX0KKwlzdHJjYXQoY2FyZC0+c2hvcnRuYW1lLCBjYXJkLT5kcml2ZXIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBQQ0kgQXVkaW8gYXQgMHglbHgsIGlycSAlZCIsCisJCWNhcmQtPnNob3J0bmFtZSwgdHJpZGVudC0+cG9ydCwgdHJpZGVudC0+aXJxKTsKKworCWlmICgoZXJyID0gc25kX3RyaWRlbnRfcGNtKHRyaWRlbnQsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlzd2l0Y2ggKHRyaWRlbnQtPmRldmljZSkgeworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfRFg6CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9OWDoKKwkJaWYgKChlcnIgPSBzbmRfdHJpZGVudF9mb2xkYmFja19wY20odHJpZGVudCwgcGNtX2RldisrLCBOVUxMKSkgPCAwKSB7CisJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCB8fCB0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4KSB7CisJCWlmICgoZXJyID0gc25kX3RyaWRlbnRfc3BkaWZfcGNtKHRyaWRlbnQsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19UUklENERXQVZFLAorCQkJCSAgICAgICB0cmlkZW50LT5taWRpX3BvcnQsIDEsCisJCQkJICAgICAgIHRyaWRlbnQtPmlycSwgMCwgJnRyaWRlbnQtPnJtaWRpKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUikgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkpCisJaWYgKChlcnIgPSBzbmRfdHJpZGVudF9hdHRhY2hfc3ludGhlc2l6ZXIodHJpZGVudCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCisJc25kX3RyaWRlbnRfY3JlYXRlX2dhbWVwb3J0KHRyaWRlbnQpOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3RyaWRlbnRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiVHJpZGVudDREV2F2ZUF1ZGlvIiwKKwkuaWRfdGFibGUgPSBzbmRfdHJpZGVudF9pZHMsCisJLnByb2JlID0gc25kX3RyaWRlbnRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF90cmlkZW50X3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF90cmlkZW50X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX3RyaWRlbnRfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV9jYXJkX3RyaWRlbnRfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF90cmlkZW50X2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDVjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMCwwICsxLDM5OTEgQEAKKy8qCisgKiAgTWFpbnRhaW5lZCBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKiAgT3JpZ2luYXRlZCBieSBhdWRpb0B0cmlkZW50bWljcm8uY29tCisgKiAgRnJpIEZlYiAxOSAxNTo1NToyOCBNU1QgMTk5OQorICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIFRyaWRlbnQgNERXYXZlIChEWCBhbmQgTlgpIGNoaXAKKyAqCisgKiAgQlVHUzoKKyAqCisgKiAgVE9ETzoKKyAqICAgIC0tLQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogIFNpUzcwMTggUy9QRElGIHN1cHBvcnQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciA8dGhvbWFzQHdpbmlzY2hob2Zlci5uZXQ+CisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3RyaWRlbnQuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX21peGVyX2J1aWxkKHRyaWRlbnRfdCAqdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pOworc3RhdGljIGludCBzbmRfdHJpZGVudF9wY21fbWl4ZXJfZnJlZSh0cmlkZW50X3QgKnRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3N1c3BlbmQoc25kX2NhcmRfdCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcmVzdW1lKHNuZF9jYXJkX3QgKmNhcmQpOworI2VuZGlmCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3Npc19yZXNldCh0cmlkZW50X3QgKnRyaWRlbnQpOworCitzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9jbGVhcl92b2ljZXModHJpZGVudF90ICogdHJpZGVudCwgdW5zaWduZWQgc2hvcnQgdl9taW4sIHVuc2lnbmVkIHNob3J0IHZfbWF4KTsKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfZnJlZSh0cmlkZW50X3QgKnRyaWRlbnQpOworCisvKgorICogIGNvbW1vbiBJL08gcm91dGluZXMKKyAqLworCisKKyNpZiAwCitzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9wcmludF92b2ljZV9yZWdzKHRyaWRlbnRfdCAqdHJpZGVudCwgaW50IHZvaWNlKQoreworCXVuc2lnbmVkIGludCB2YWwsIHRtcDsKKworCXByaW50aygiVHJpZGVudCB2b2ljZSAlaTpcbiIsIHZvaWNlKTsKKwlvdXRiKHZvaWNlLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOworCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9MQkEpKTsKKwlwcmludGsoIkxCQTogMHgleFxuIiwgdmFsKTsKKwl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDKSk7CisJcHJpbnRrKCJHVlNlbDogJWlcbiIsIHZhbCA+PiAzMSk7CisJcHJpbnRrKCJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7CisJcHJpbnRrKCJWb2w6IDB4JXhcbiIsICh2YWwgPj4gMTYpICYgMHhmZik7CisJcHJpbnRrKCJDVFJMOiAweCV4XG4iLCAodmFsID4+IDEyKSAmIDB4MGYpOworCXByaW50aygiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CisJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUykpOworCQlwcmludGsoIkNTTzogMHgleFxuIiwgdmFsID4+IDE2KTsKKwkJcHJpbnRrKCJBbHBoYTogMHgleFxuIiwgKHZhbCA+PiA0KSAmIDB4MGZmZik7CisJCXByaW50aygiRk1TOiAweCV4XG4iLCB2YWwgJiAweDBmKTsKKwkJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0VTT19ERUxUQSkpOworCQlwcmludGsoIkVTTzogMHgleFxuIiwgdmFsID4+IDE2KTsKKwkJcHJpbnRrKCJEZWx0YTogMHgleFxuIiwgdmFsICYgMHhmZmZmKTsKKwkJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0ZNQ19SVk9MX0NWT0wpKTsKKwl9IGVsc2UgewkJLy8gVFJJREVOVF9ERVZJQ0VfSURfTlgKKwkJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0RFTFRBX0NTTykpOworCQl0bXAgPSAodmFsID4+IDI0KSAmIDB4ZmY7CisJCXByaW50aygiQ1NPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0RFTFRBX0VTTykpOworCQl0bXAgfD0gKHZhbCA+PiAxNikgJiAweGZmMDA7CisJCXByaW50aygiRGVsdGE6IDB4JXhcbiIsIHRtcCk7CisJCXByaW50aygiRVNPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0FMUEhBX0ZNU19GTUNfUlZPTF9DVk9MKSk7CisJCXByaW50aygiQWxwaGE6IDB4JXhcbiIsIHZhbCA+PiAyMCk7CisJCXByaW50aygiRk1TOiAweCV4XG4iLCAodmFsID4+IDE2KSAmIDB4MGYpOworCX0KKwlwcmludGsoIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKKwlwcmludGsoIlJWb2w6IDB4JXhcbiIsICh2YWwgPj4gNykgJiAweDdmKTsKKwlwcmludGsoIkNWb2w6IDB4JXhcbiIsIHZhbCAmIDB4N2YpOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB1bnNpZ25lZCBzaG9ydCBzbmRfdHJpZGVudF9jb2RlY19yZWFkKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCBkbyBhbGwgb2YgdGhlIHJlYWRpbmcgZnJvbSB0aGUgZXh0ZXJuYWwKKyAgICAgICAgICAgICAgICBDT0RFQyAoQUM5NykuCisgIAorICAgUGFyYW1ldGVyczogIGFjOTcgLSBhYzk3IGNvZGVjIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIHJlZyAtIENPREVDIHJlZ2lzdGVyIGluZGV4LCBmcm9tIEFDOTcgSGFsLgorIAorICAgcmV0dXJuczogICAgIDE2IGJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIEFDOTcuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF90cmlkZW50X2NvZGVjX3JlYWQoYWM5N190ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJdW5zaWduZWQgaW50IGRhdGEgPSAwLCB0cmVnOworCXVuc2lnbmVkIHNob3J0IGNvdW50ID0gMHhmZmZmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdHJpZGVudF90ICp0cmlkZW50ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9EWCkgeworCQlkYXRhID0gKERYX0FDOTdfQlVTWV9SRUFEIHwgKHJlZyAmIDB4MDAwMDAwZmYpKTsKKwkJb3V0bChkYXRhLCBUUklEX1JFRyh0cmlkZW50LCBEWF9BQ1IxX0FDOTdfUikpOworCQlkbyB7CisJCQlkYXRhID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIERYX0FDUjFfQUM5N19SKSk7CisJCQlpZiAoKGRhdGEgJiBEWF9BQzk3X0JVU1lfUkVBRCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfSBlbHNlIGlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfTlgpIHsKKwkJZGF0YSA9IChOWF9BQzk3X0JVU1lfUkVBRCB8IChyZWcgJiAweDAwMDAwMGZmKSk7CisJCXRyZWcgPSBhYzk3LT5udW0gPT0gMCA/IE5YX0FDUjJfQUM5N19SX1BSSU1BUlkgOiBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CisJCW91dGwoZGF0YSwgVFJJRF9SRUcodHJpZGVudCwgdHJlZykpOworCQlkbyB7CisJCQlkYXRhID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIHRyZWcpKTsKKwkJCWlmICgoZGF0YSAmIDB4MDAwMDBDMDApID09IDApCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tY291bnQpOworCX0gZWxzZSBpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQlkYXRhID0gU0lfQUM5N19CVVNZX1JFQUQgfCBTSV9BQzk3X0FVRElPX0JVU1kgfCAocmVnICYgMHgwMDAwMDBmZik7CisJCWlmIChhYzk3LT5udW0gPT0gMSkKKwkJCWRhdGEgfD0gU0lfQUM5N19TRUNPTkRBUlk7CisJCW91dGwoZGF0YSwgVFJJRF9SRUcodHJpZGVudCwgU0lfQUM5N19SRUFEKSk7CisJCWRvIHsKKwkJCWRhdGEgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfQUM5N19SRUFEKSk7CisJCQlpZiAoKGRhdGEgJiAoU0lfQUM5N19CVVNZX1JFQUQpKSA9PSAwKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9CisKKwlpZiAoY291bnQgPT0gMCAmJiAhdHJpZGVudC0+YWM5N19kZXRlY3QpIHsKKwkJc25kX3ByaW50aygiYWM5NyBjb2RlYyByZWFkIFRJTUVPVVQgWzB4JXgvMHgleF0hISFcbiIsIHJlZywgZGF0YSk7CisJCWRhdGEgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuICgodW5zaWduZWQgc2hvcnQpIChkYXRhID4+IDE2KSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB2b2lkIHNuZF90cmlkZW50X2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB3ZGF0YSkKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgZG8gYWxsIG9mIHRoZSB3cml0aW5nIHRvIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgICAgIENPREVDIChBQzk3KS4KKyAgCisgICBQYXJhbWV0ZXJzOglhYzk3IC0gYWM5NyBjb2RlYyBzdHJ1Y3R1cmUKKyAgIAkgICAgICAgIHJlZyAtIENPREVDIHJlZ2lzdGVyIGluZGV4LCBmcm9tIEFDOTcgSGFsLgorICAgICAgICAgICAgICAgIGRhdGEgIC0gTG93ZXIgMTYgYml0cyBhcmUgdGhlIGRhdGEgdG8gd3JpdGUgdG8gQ09ERUMuCisgIAorICAgcmV0dXJuczogICAgIFRSVUUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBlbHNlIEZBTFNFLgorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB3ZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgYWRkcmVzcywgZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRyaWRlbnRfdCAqdHJpZGVudCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKworCWRhdGEgPSAoKHVuc2lnbmVkIGxvbmcpIHdkYXRhKSA8PCAxNjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfRFgpIHsKKwkJYWRkcmVzcyA9IERYX0FDUjBfQUM5N19XOworCisJCS8qIHJlYWQgQUMtOTcgd3JpdGUgcmVnaXN0ZXIgc3RhdHVzICovCisJCWRvIHsKKwkJCWlmICgoaW53KFRSSURfUkVHKHRyaWRlbnQsIGFkZHJlc3MpKSAmIERYX0FDOTdfQlVTWV9XUklURSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisKKwkJZGF0YSB8PSAoRFhfQUM5N19CVVNZX1dSSVRFIHwgKHJlZyAmIDB4MDAwMDAwZmYpKTsKKwl9IGVsc2UgaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlhZGRyZXNzID0gTlhfQUNSMV9BQzk3X1c7CisKKwkJLyogcmVhZCBBQy05NyB3cml0ZSByZWdpc3RlciBzdGF0dXMgKi8KKwkJZG8geworCQkJaWYgKChpbncoVFJJRF9SRUcodHJpZGVudCwgYWRkcmVzcykpICYgTlhfQUM5N19CVVNZX1dSSVRFKSA9PSAwKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgtLWNvdW50KTsKKworCQlkYXRhIHw9IChOWF9BQzk3X0JVU1lfV1JJVEUgfCAoYWM5Ny0+bnVtIDw8IDgpIHwgKHJlZyAmIDB4MDAwMDAwZmYpKTsKKwl9IGVsc2UgaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKwkJYWRkcmVzcyA9IFNJX0FDOTdfV1JJVEU7CisKKwkJLyogcmVhZCBBQy05NyB3cml0ZSByZWdpc3RlciBzdGF0dXMgKi8KKwkJZG8geworCQkJaWYgKChpbncoVFJJRF9SRUcodHJpZGVudCwgYWRkcmVzcykpICYgKFNJX0FDOTdfQlVTWV9XUklURSkpID09IDApCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tY291bnQpOworCisJCWRhdGEgfD0gU0lfQUM5N19CVVNZX1dSSVRFIHwgU0lfQUM5N19BVURJT19CVVNZIHwgKHJlZyAmIDB4MDAwMDAwZmYpOworCQlpZiAoYWM5Ny0+bnVtID09IDEpCisJCQlkYXRhIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCX0gZWxzZSB7CisJCWFkZHJlc3MgPSAwOwkvKiBrZWVwIEdDQyBoYXBweSAqLworCQljb3VudCA9IDA7CS8qIHJldHVybiAqLworCX0KKworCWlmIChjb3VudCA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJb3V0bChkYXRhLCBUUklEX1JFRyh0cmlkZW50LCBhZGRyZXNzKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHZvaWQgc25kX3RyaWRlbnRfZW5hYmxlX2Vzbyh0cmlkZW50X3QgKnRyaWRlbnQpCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGVuYWJsZSBlbmQgb2YgbG9vcCBpbnRlcnJ1cHRzLgorICAgICAgICAgICAgICAgIEVuZCBvZiBsb29wIGludGVycnVwdHMgd2lsbCBvY2N1ciB3aGVuIGEgcnVubmluZworICAgICAgICAgICAgICAgIGNoYW5uZWwgcmVhY2hlcyBFU08uCisgICAgICAgICAgICAgICAgQWxzbyBlbmFibGVzIG1pZGRsZSBvZiBsb29wIGludGVycnVwdHMuCisgIAorICAgUGFyYW1ldGVyczogIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X2VuYWJsZV9lc28odHJpZGVudF90ICogdHJpZGVudCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJdmFsIHw9IEVORExQX0lFOworCXZhbCB8PSBNSURMUF9JRTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkKKwkJdmFsIHw9IEJBTktfQl9FTjsKKwlvdXRsKHZhbCwgVFJJRF9SRUcodHJpZGVudCwgVDREX0xGT19HQ19DSVIpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHZvaWQgc25kX3RyaWRlbnRfZGlzYWJsZV9lc28odHJpZGVudF90ICp0cmlkZW50KQorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCBkaXNhYmxlIGVuZCBvZiBsb29wIGludGVycnVwdHMuCisgICAgICAgICAgICAgICAgRW5kIG9mIGxvb3AgaW50ZXJydXB0cyB3aWxsIG9jY3VyIHdoZW4gYSBydW5uaW5nCisgICAgICAgICAgICAgICAgY2hhbm5lbCByZWFjaGVzIEVTTy4KKyAgICAgICAgICAgICAgICBBbHNvIGRpc2FibGVzIG1pZGRsZSBvZiBsb29wIGludGVycnVwdHMuCisgIAorICAgUGFyYW1ldGVyczogIAorICAgICAgICAgICAgICAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgCisgICByZXR1cm5zOiAgICAgVFJVRSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGVsc2UgRkFMU0UuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9kaXNhYmxlX2Vzbyh0cmlkZW50X3QgKiB0cmlkZW50KQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwl0bXAgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgVDREX0xGT19HQ19DSVIpKTsKKwl0bXAgJj0gfkVORExQX0lFOworCXRtcCAmPSB+TUlETFBfSUU7CisJb3V0bCh0bXAsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB2b2lkIHNuZF90cmlkZW50X3N0YXJ0X3ZvaWNlKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHVuc2lnbmVkIGludCB2b2ljZSkKKworICAgIERlc2NyaXB0aW9uOiBTdGFydCBhIHZvaWNlLCBhbnkgY2hhbm5lbCAwIHRocnUgNjMuCisgICAgICAgICAgICAgICAgIFRoaXMgcm91dGluZSBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgbW9yZSB0aGFuIDMyIGNoYW5uZWxzIGF2YWlsYWJsZS4KKworICAgIFBhcmFtZXRlcnMgOiB2b2ljZSAtIFZvaWNlIG51bWJlciAwIHRocnUgbi4KKyAgICAgICAgICAgICAgICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorCisgICAgUmV0dXJuIFZhbHVlOiBOb25lLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgc25kX3RyaWRlbnRfc3RhcnRfdm9pY2UodHJpZGVudF90ICogdHJpZGVudCwgdW5zaWduZWQgaW50IHZvaWNlKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAodm9pY2UgJiAweDFmKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gKHZvaWNlICYgMHgyMCkgPyBUNERfU1RBUlRfQiA6IFQ0RF9TVEFSVF9BOworCisJb3V0bChtYXNrLCBUUklEX1JFRyh0cmlkZW50LCByZWcpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHZvaWQgc25kX3RyaWRlbnRfc3RvcF92b2ljZSh0cmlkZW50X3QgKiB0cmlkZW50LCB1bnNpZ25lZCBpbnQgdm9pY2UpCisKKyAgICBEZXNjcmlwdGlvbjogU3RvcCBhIHZvaWNlLCBhbnkgY2hhbm5lbCAwIHRocnUgNjMuCisgICAgICAgICAgICAgICAgIFRoaXMgcm91dGluZSBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgbW9yZSB0aGFuIDMyIGNoYW5uZWxzIGF2YWlsYWJsZS4KKworICAgIFBhcmFtZXRlcnMgOiB2b2ljZSAtIFZvaWNlIG51bWJlciAwIHRocnUgbi4KKyAgICAgICAgICAgICAgICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorCisgICAgUmV0dXJuIFZhbHVlOiBOb25lLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgc25kX3RyaWRlbnRfc3RvcF92b2ljZSh0cmlkZW50X3QgKiB0cmlkZW50LCB1bnNpZ25lZCBpbnQgdm9pY2UpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8ICh2b2ljZSAmIDB4MWYpOworCXVuc2lnbmVkIGludCByZWcgPSAodm9pY2UgJiAweDIwKSA/IFQ0RF9TVE9QX0IgOiBUNERfU1RPUF9BOworCisJb3V0bChtYXNrLCBUUklEX1JFRyh0cmlkZW50LCByZWcpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpbnQgc25kX3RyaWRlbnRfYWxsb2NhdGVfcGNtX2NoYW5uZWwodHJpZGVudF90ICp0cmlkZW50KQorICAKKyAgICBEZXNjcmlwdGlvbjogQWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBpbiBCYW5rIEIgKDMyLTYzKS4KKyAgCisgICAgUGFyYW1ldGVycyA6ICB0cmlkZW50IC0gcG9pbnRlciB0byB0YXJnZXQgZGV2aWNlIGNsYXNzIGZvciA0RFdhdmUuCisgIAorICAgIFJldHVybiBWYWx1ZTogaGFyZHdhcmUgY2hhbm5lbCAtIDMyLTYzIG9yIC0xIHdoZW4gbm8gY2hhbm5lbCBpcyBhdmFpbGFibGUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfYWxsb2NhdGVfcGNtX2NoYW5uZWwodHJpZGVudF90ICogdHJpZGVudCkKK3sKKwlpbnQgaWR4OworCisJaWYgKHRyaWRlbnQtPkNoYW5QQ01jbnQgPj0gdHJpZGVudC0+Q2hhblBDTSkKKwkJcmV0dXJuIC0xOworCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgeworCQlpZiAoISh0cmlkZW50LT5DaGFuTWFwW1Q0RF9CQU5LX0JdICYgKDEgPDwgaWR4KSkpIHsKKwkJCXRyaWRlbnQtPkNoYW5NYXBbVDREX0JBTktfQl0gfD0gMSA8PCBpZHg7CisJCQl0cmlkZW50LT5DaGFuUENNY250Kys7CisJCQlyZXR1cm4gaWR4ICsgMzI7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZvaWQgc25kX3RyaWRlbnRfZnJlZV9wY21fY2hhbm5lbChpbnQgY2hhbm5lbCkKKyAgCisgICAgRGVzY3JpcHRpb246IEZyZWUgaGFyZHdhcmUgY2hhbm5lbCBpbiBCYW5rIEIgKDMyLTYzKQorICAKKyAgICBQYXJhbWV0ZXJzIDogIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKwkgICAgICAgICAgY2hhbm5lbCAtIGhhcmR3YXJlIGNoYW5uZWwgbnVtYmVyIDAtNjMKKyAgCisgICAgUmV0dXJuIFZhbHVlOiBub25lCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHRyaWRlbnRfdCAqdHJpZGVudCwgaW50IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPCAzMiB8fCBjaGFubmVsID4gNjMpCisJCXJldHVybjsKKwljaGFubmVsICY9IDB4MWY7CisJaWYgKHRyaWRlbnQtPkNoYW5NYXBbVDREX0JBTktfQl0gJiAoMSA8PCBjaGFubmVsKSkgeworCQl0cmlkZW50LT5DaGFuTWFwW1Q0RF9CQU5LX0JdICY9IH4oMSA8PCBjaGFubmVsKTsKKwkJdHJpZGVudC0+Q2hhblBDTWNudC0tOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB1bnNpZ25lZCBpbnQgc25kX3RyaWRlbnRfYWxsb2NhdGVfc3ludGhfY2hhbm5lbCh2b2lkKQorICAKKyAgICBEZXNjcmlwdGlvbjogQWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBpbiBCYW5rIEEgKDAtMzEpLgorICAKKyAgICBQYXJhbWV0ZXJzIDogIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgCisgICAgUmV0dXJuIFZhbHVlOiBoYXJkd2FyZSBjaGFubmVsIC0gMC0zMSBvciAtMSB3aGVuIG5vIGNoYW5uZWwgaXMgYXZhaWxhYmxlCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2FsbG9jYXRlX3N5bnRoX2NoYW5uZWwodHJpZGVudF90ICogdHJpZGVudCkKK3sKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAzMTsgaWR4ID49IDA7IGlkeC0tKSB7CisJCWlmICghKHRyaWRlbnQtPkNoYW5NYXBbVDREX0JBTktfQV0gJiAoMSA8PCBpZHgpKSkgeworCQkJdHJpZGVudC0+Q2hhbk1hcFtUNERfQkFOS19BXSB8PSAxIDw8IGlkeDsKKwkJCXRyaWRlbnQtPnN5bnRoLkNoYW5TeW50aENvdW50Kys7CisJCQlyZXR1cm4gaWR4OworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2b2lkIHNuZF90cmlkZW50X2ZyZWVfc3ludGhfY2hhbm5lbCggaW50IGNoYW5uZWwgKQorICAKKyAgICBEZXNjcmlwdGlvbjogRnJlZSBoYXJkd2FyZSBjaGFubmVsIGluIEJhbmsgQiAoMC0zMSkuCisgIAorICAgIFBhcmFtZXRlcnMgOiAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorCSAgICAgICAgICBjaGFubmVsIC0gaGFyZHdhcmUgY2hhbm5lbCBudW1iZXIgMC02MworICAKKyAgICBSZXR1cm4gVmFsdWU6IG5vbmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X2ZyZWVfc3ludGhfY2hhbm5lbCh0cmlkZW50X3QgKnRyaWRlbnQsIGludCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMzEpCisJCXJldHVybjsKKwljaGFubmVsICY9IDB4MWY7CisJaWYgKHRyaWRlbnQtPkNoYW5NYXBbVDREX0JBTktfQV0gJiAoMSA8PCBjaGFubmVsKSkgeworCQl0cmlkZW50LT5DaGFuTWFwW1Q0RF9CQU5LX0FdICY9IH4oMSA8PCBjaGFubmVsKTsKKwkJdHJpZGVudC0+c3ludGguQ2hhblN5bnRoQ291bnQtLTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF93cml0ZV92b2ljZV9yZWdzCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGNvbXBsZXRlIGFuZCB3cml0ZSB0aGUgNSBoYXJkd2FyZSBjaGFubmVsCisgICAgICAgICAgICAgICAgcmVnaXN0ZXJzIHRvIGhhcmR3YXJlLgorICAKKyAgIFBhcmFtdGVyczogICB0cmlkZW50IC0gcG9pbnRlciB0byB0YXJnZXQgZGV2aWNlIGNsYXNzIGZvciA0RFdhdmUuCisgICAgICAgICAgICAgICAgdm9pY2UgLSBzeW50aGVzaXplciB2b2ljZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICBFYWNoIHJlZ2lzdGVyIGZpZWxkLgorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBzbmRfdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHRyaWRlbnRfdCAqIHRyaWRlbnQsCisJCQkJICBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UpCit7CisJdW5zaWduZWQgaW50IEZtY1J2b2xDdm9sOworCXVuc2lnbmVkIGludCByZWdzWzVdOworCisJcmVnc1sxXSA9IHZvaWNlLT5MQkE7CisJcmVnc1s0XSA9ICh2b2ljZS0+R1ZTZWwgPDwgMzEpIHwKKwkJICAoKHZvaWNlLT5QYW4gJiAweDAwMDAwMDdmKSA8PCAyNCkgfAorCQkgICgodm9pY2UtPkNUUkwgJiAweDAwMDAwMDBmKSA8PCAxMik7CisJRm1jUnZvbEN2b2wgPSAoKHZvaWNlLT5GTUMgJiAzKSA8PCAxNCkgfAorCSAgICAgICAgICAgICAgKCh2b2ljZS0+UlZvbCAmIDB4N2YpIDw8IDcpIHwKKwkgICAgICAgICAgICAgICh2b2ljZS0+Q1ZvbCAmIDB4N2YpOworCisJc3dpdGNoICh0cmlkZW50LT5kZXZpY2UpIHsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX1NJNzAxODoKKwkJcmVnc1s0XSB8PSB2b2ljZS0+bnVtYmVyID4gMzEgPworCQkJCSh2b2ljZS0+Vm9sICYgMHgwMDAwMDNmZikgOgorCQkJCSgodm9pY2UtPlZvbCAmIDB4MDAwMDNmYykgPDwgKDE2LTIpKSB8CisJCQkJKHZvaWNlLT5FQyAmIDB4MDAwMDBmZmYpOworCQlyZWdzWzBdID0gKHZvaWNlLT5DU08gPDwgMTYpIHwgKCh2b2ljZS0+QWxwaGEgJiAweDAwMDAwZmZmKSA8PCA0KSB8ICh2b2ljZS0+Rk1TICYgMHgwMDAwMDAwZik7CisJCXJlZ3NbMl0gPSAodm9pY2UtPkVTTyA8PCAxNikgfCAodm9pY2UtPkRlbHRhICYgMHgwZmZmZik7CisJCXJlZ3NbM10gPSAodm9pY2UtPkF0dHJpYnV0ZSA8PCAxNikgfCBGbWNSdm9sQ3ZvbDsKKwkJYnJlYWs7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKKwkJcmVnc1s0XSB8PSAoKHZvaWNlLT5Wb2wgJiAweDAwMDAwM2ZjKSA8PCAoMTYtMikpIHwKKwkJCSAgICh2b2ljZS0+RUMgJiAweDAwMDAwZmZmKTsKKwkJcmVnc1swXSA9ICh2b2ljZS0+Q1NPIDw8IDE2KSB8ICgodm9pY2UtPkFscGhhICYgMHgwMDAwMGZmZikgPDwgNCkgfCAodm9pY2UtPkZNUyAmIDB4MDAwMDAwMGYpOworCQlyZWdzWzJdID0gKHZvaWNlLT5FU08gPDwgMTYpIHwgKHZvaWNlLT5EZWx0YSAmIDB4MGZmZmYpOworCQlyZWdzWzNdID0gRm1jUnZvbEN2b2w7CisJCWJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CisJCXJlZ3NbNF0gfD0gKCh2b2ljZS0+Vm9sICYgMHgwMDAwMDNmYykgPDwgKDE2LTIpKSB8CisJCQkgICAodm9pY2UtPkVDICYgMHgwMDAwMGZmZik7CisJCXJlZ3NbMF0gPSAodm9pY2UtPkRlbHRhIDw8IDI0KSB8ICh2b2ljZS0+Q1NPICYgMHgwMGZmZmZmZik7CisJCXJlZ3NbMl0gPSAoKHZvaWNlLT5EZWx0YSA8PCAxNikgJiAweGZmMDAwMDAwKSB8ICh2b2ljZS0+RVNPICYgMHgwMGZmZmZmZik7CisJCXJlZ3NbM10gPSAodm9pY2UtPkFscGhhIDw8IDIwKSB8ICgodm9pY2UtPkZNUyAmIDB4MDAwMDAwMGYpIDw8IDE2KSB8IEZtY1J2b2xDdm9sOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfQlVHKCk7CisJfQorCisJb3V0Yih2b2ljZS0+bnVtYmVyLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOworCW91dGwocmVnc1swXSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAwKSk7CisJb3V0bChyZWdzWzFdLCBUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDQpKTsKKwlvdXRsKHJlZ3NbMl0sIFRSSURfUkVHKHRyaWRlbnQsIENIX1NUQVJUICsgOCkpOworCW91dGwocmVnc1szXSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxMikpOworCW91dGwocmVnc1s0XSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxNikpOworCisjaWYgMAorCXByaW50aygid3JpdHRlbiAlaSBjaGFubmVsOlxuIiwgdm9pY2UtPm51bWJlcik7CisJcHJpbnRrKCIgIHJlZ3NbMF0gPSAweCV4LzB4JXhcbiIsIHJlZ3NbMF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDApKSk7CisJcHJpbnRrKCIgIHJlZ3NbMV0gPSAweCV4LzB4JXhcbiIsIHJlZ3NbMV0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDQpKSk7CisJcHJpbnRrKCIgIHJlZ3NbMl0gPSAweCV4LzB4JXhcbiIsIHJlZ3NbMl0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDgpKSk7CisJcHJpbnRrKCIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsIHJlZ3NbM10sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDEyKSkpOworCXByaW50aygiICByZWdzWzRdID0gMHgleC8weCV4XG4iLCByZWdzWzRdLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxNikpKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfd3JpdGVfY3NvX3JlZworICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCB3cml0ZSB0aGUgbmV3IENTTyBvZmZzZXQKKyAgICAgICAgICAgICAgICByZWdpc3RlciB0byBoYXJkd2FyZS4KKyAgCisgICBQYXJhbXRlcnM6ICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorICAgICAgICAgICAgICAgIHZvaWNlIC0gc3ludGhlc2l6ZXIgdm9pY2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgQ1NPIC0gbmV3IENTTyB2YWx1ZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfd3JpdGVfY3NvX3JlZyh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHVuc2lnbmVkIGludCBDU08pCit7CisJdm9pY2UtPkNTTyA9IENTTzsKKwlvdXRiKHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlvdXR3KHZvaWNlLT5DU08sIFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0NTT19BTFBIQV9GTVMpICsgMik7CisJfSBlbHNlIHsKKwkJb3V0bCgodm9pY2UtPkRlbHRhIDw8IDI0KSB8ICh2b2ljZS0+Q1NPICYgMHgwMGZmZmZmZiksIFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0RFTFRBX0NTTykpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3dyaXRlX2Vzb19yZWcKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgd3JpdGUgdGhlIG5ldyBFU08gb2Zmc2V0CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdG8gaGFyZHdhcmUuCisgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgICAgICAgICAgICAgICB2b2ljZSAtIHN5bnRoZXNpemVyIHZvaWNlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIEVTTyAtIG5ldyBFU08gdmFsdWUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3dyaXRlX2Vzb19yZWcodHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCB1bnNpZ25lZCBpbnQgRVNPKQoreworCXZvaWNlLT5FU08gPSBFU087CisJb3V0Yih2b2ljZS0+bnVtYmVyLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOworCWlmICh0cmlkZW50LT5kZXZpY2UgIT0gVFJJREVOVF9ERVZJQ0VfSURfTlgpIHsKKwkJb3V0dyh2b2ljZS0+RVNPLCBUUklEX1JFRyh0cmlkZW50LCBDSF9EWF9FU09fREVMVEEpICsgMik7CisJfSBlbHNlIHsKKwkJb3V0bCgoKHZvaWNlLT5EZWx0YSA8PCAxNikgJiAweGZmMDAwMDAwKSB8ICh2b2ljZS0+RVNPICYgMHgwMGZmZmZmZiksIFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0RFTFRBX0VTTykpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3dyaXRlX3ZvbF9yZWcKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgd3JpdGUgdGhlIG5ldyB2b2ljZSB2b2x1bWUKKyAgICAgICAgICAgICAgICByZWdpc3RlciB0byBoYXJkd2FyZS4KKyAgCisgICBQYXJhbXRlcnM6ICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorICAgICAgICAgICAgICAgIHZvaWNlIC0gc3ludGhlc2l6ZXIgdm9pY2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgVm9sIC0gbmV3IHZvaWNlIHZvbHVtZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfd3JpdGVfdm9sX3JlZyh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHVuc2lnbmVkIGludCBWb2wpCit7CisJdm9pY2UtPlZvbCA9IFZvbDsKKwlvdXRiKHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJc3dpdGNoICh0cmlkZW50LT5kZXZpY2UpIHsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX0RYOgorCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CisJCW91dGIodm9pY2UtPlZvbCA+PiAyLCBUUklEX1JFRyh0cmlkZW50LCBDSF9HVlNFTF9QQU5fVk9MX0NUUkxfRUMgKyAyKSk7CisJCWJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4OgorCQkvLyBwcmludGsoInZvaWNlLT5Wb2wgPSAweCV4XG4iLCB2b2ljZS0+Vm9sKTsKKwkJb3V0dygodm9pY2UtPkNUUkwgPDwgMTIpIHwgdm9pY2UtPlZvbCwgVFJJRF9SRUcodHJpZGVudCwgQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDKSk7CisJCWJyZWFrOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3dyaXRlX3Bhbl9yZWcKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgd3JpdGUgdGhlIG5ldyB2b2ljZSBwYW4KKyAgICAgICAgICAgICAgICByZWdpc3RlciB0byBoYXJkd2FyZS4KKyAgCisgICBQYXJhbXRlcnM6ICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorICAgICAgICAgICAgICAgIHZvaWNlIC0gc3ludGhlc2l6ZXIgdm9pY2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgUGFuIC0gbmV3IHBhbiB2YWx1ZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfd3JpdGVfcGFuX3JlZyh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHVuc2lnbmVkIGludCBQYW4pCit7CisJdm9pY2UtPlBhbiA9IFBhbjsKKwlvdXRiKHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJb3V0YigoKHZvaWNlLT5HVlNlbCAmIDB4MDEpIDw8IDcpIHwgKHZvaWNlLT5QYW4gJiAweDdmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDICsgMykpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfd3JpdGVfcnZvbF9yZWcKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgd3JpdGUgdGhlIG5ldyByZXZlcmIgdm9sdW1lCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdG8gaGFyZHdhcmUuCisgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgICAgICAgICAgICAgICB2b2ljZSAtIHN5bnRoZXNpemVyIHZvaWNlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIFJWb2wgLSBuZXcgcmV2ZXJiIHZvbHVtZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfd3JpdGVfcnZvbF9yZWcodHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCB1bnNpZ25lZCBpbnQgUlZvbCkKK3sKKwl2b2ljZS0+UlZvbCA9IFJWb2w7CisJb3V0Yih2b2ljZS0+bnVtYmVyLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOworCW91dHcoKCh2b2ljZS0+Rk1DICYgMHgwMDAzKSA8PCAxNCkgfCAoKHZvaWNlLT5SVm9sICYgMHgwMDdmKSA8PCA3KSB8ICh2b2ljZS0+Q1ZvbCAmIDB4MDA3ZiksCisJICAgICBUUklEX1JFRyh0cmlkZW50LCB0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfTlggPyBDSF9OWF9BTFBIQV9GTVNfRk1DX1JWT0xfQ1ZPTCA6IENIX0RYX0ZNQ19SVk9MX0NWT0wpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3dyaXRlX2N2b2xfcmVnCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIHdyaXRlIHRoZSBuZXcgY2hvcnVzIHZvbHVtZQorICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHRvIGhhcmR3YXJlLgorICAKKyAgIFBhcmFtdGVyczogICB0cmlkZW50IC0gcG9pbnRlciB0byB0YXJnZXQgZGV2aWNlIGNsYXNzIGZvciA0RFdhdmUuCisgICAgICAgICAgICAgICAgdm9pY2UgLSBzeW50aGVzaXplciB2b2ljZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICBDVm9sIC0gbmV3IGNob3J1cyB2b2x1bWUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3dyaXRlX2N2b2xfcmVnKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgdW5zaWduZWQgaW50IENWb2wpCit7CisJdm9pY2UtPkNWb2wgPSBDVm9sOworCW91dGIodm9pY2UtPm51bWJlciwgVFJJRF9SRUcodHJpZGVudCwgVDREX0xGT19HQ19DSVIpKTsKKwlvdXR3KCgodm9pY2UtPkZNQyAmIDB4MDAwMykgPDwgMTQpIHwgKCh2b2ljZS0+UlZvbCAmIDB4MDA3ZikgPDwgNykgfCAodm9pY2UtPkNWb2wgJiAweDAwN2YpLAorCSAgICAgVFJJRF9SRUcodHJpZGVudCwgdHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX05YID8gQ0hfTlhfQUxQSEFfRk1TX0ZNQ19SVk9MX0NWT0wgOiBDSF9EWF9GTUNfUlZPTF9DVk9MKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9jb252ZXJ0X3JhdGUKKworICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSBjb252ZXJ0cyByYXRlIGluIEhaIHRvIGhhcmR3YXJlIGRlbHRhIHZhbHVlLgorICAKKyAgIFBhcmFtdGVyczogICB0cmlkZW50IC0gcG9pbnRlciB0byB0YXJnZXQgZGV2aWNlIGNsYXNzIGZvciA0RFdhdmUuCisgICAgICAgICAgICAgICAgcmF0ZSAtIFJlYWwgb3IgVmlydHVhbCBjaGFubmVsIG51bWJlci4KKyAgCisgICBSZXR1cm5zOiAgICAgRGVsdGEgdmFsdWUuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfdHJpZGVudF9jb252ZXJ0X3JhdGUodW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRlbHRhOworCisJLy8gV2Ugc3BlY2lhbCBjYXNlIDQ0MTAwIGFuZCA4MDAwIHNpbmNlIHJvdW5kaW5nIHdpdGggdGhlIGVxdWF0aW9uCisJLy8gZG9lcyBub3QgZ2l2ZSB1cyBhbiBhY2N1cmF0ZSBlbm91Z2ggdmFsdWUuIEZvciAxMTAyNSBhbmQgMjIwNTAKKwkvLyB0aGUgZXF1YXRpb24gZ2l2ZXMgdXMgdGhlIGJlc3QgYW5zd2VyLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMgd2lsbAorCS8vIGFsc28gdXNlIHRoZSBlcXVhdGlvbi4gSkRXCisJaWYgKHJhdGUgPT0gNDQxMDApCisJCWRlbHRhID0gMHhlYjM7CisJZWxzZSBpZiAocmF0ZSA9PSA4MDAwKQorCQlkZWx0YSA9IDB4MmFiOworCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCisJCWRlbHRhID0gMHgxMDAwOworCWVsc2UKKwkJZGVsdGEgPSAoKChyYXRlIDw8IDEyKSArIDI0MDAwKSAvIDQ4MDAwKSAmIDB4MDAwMGZmZmY7CisJcmV0dXJuIGRlbHRhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfY29udmVydF9hZGNfcmF0ZQorCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIGNvbnZlcnRzIHJhdGUgaW4gSFogdG8gaGFyZHdhcmUgZGVsdGEgdmFsdWUuCisgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgICAgICAgICAgICAgICByYXRlIC0gUmVhbCBvciBWaXJ0dWFsIGNoYW5uZWwgbnVtYmVyLgorICAKKyAgIFJldHVybnM6ICAgICBEZWx0YSB2YWx1ZS4KKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF90cmlkZW50X2NvbnZlcnRfYWRjX3JhdGUodW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRlbHRhOworCisJLy8gV2Ugc3BlY2lhbCBjYXNlIDQ0MTAwIGFuZCA4MDAwIHNpbmNlIHJvdW5kaW5nIHdpdGggdGhlIGVxdWF0aW9uCisJLy8gZG9lcyBub3QgZ2l2ZSB1cyBhbiBhY2N1cmF0ZSBlbm91Z2ggdmFsdWUuIEZvciAxMTAyNSBhbmQgMjIwNTAKKwkvLyB0aGUgZXF1YXRpb24gZ2l2ZXMgdXMgdGhlIGJlc3QgYW5zd2VyLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMgd2lsbAorCS8vIGFsc28gdXNlIHRoZSBlcXVhdGlvbi4gSkRXCisJaWYgKHJhdGUgPT0gNDQxMDApCisJCWRlbHRhID0gMHgxMTZhOworCWVsc2UgaWYgKHJhdGUgPT0gODAwMCkKKwkJZGVsdGEgPSAweDYwMDA7CisJZWxzZSBpZiAocmF0ZSA9PSA0ODAwMCkKKwkJZGVsdGEgPSAweDEwMDA7CisJZWxzZQorCQlkZWx0YSA9ICgoNDgwMDAgPDwgMTIpIC8gcmF0ZSkgJiAweDAwMDBmZmZmOworCXJldHVybiBkZWx0YTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NwdXJpb3VzX3RocmVzaG9sZAorCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIGNvbnZlcnRzIHJhdGUgaW4gSFogdG8gc3B1cmlvdXMgdGhyZXNob2xkLgorICAKKyAgIFBhcmFtdGVyczogICB0cmlkZW50IC0gcG9pbnRlciB0byB0YXJnZXQgZGV2aWNlIGNsYXNzIGZvciA0RFdhdmUuCisgICAgICAgICAgICAgICAgcmF0ZSAtIFJlYWwgb3IgVmlydHVhbCBjaGFubmVsIG51bWJlci4KKyAgCisgICBSZXR1cm5zOiAgICAgRGVsdGEgdmFsdWUuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfdHJpZGVudF9zcHVyaW91c190aHJlc2hvbGQodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzID0gKHJhdGUgKiBwZXJpb2Rfc2l6ZSkgLyA0ODAwMDsKKwlpZiAocmVzIDwgNjQpCisJCXJlcyA9IHJlcyAvIDI7CisJZWxzZQorCQlyZXMgLT0gMzI7CisJcmV0dXJuIHJlczsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X2NvbnRyb2xfbW9kZQorCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb250cm9sIG1vZGUgZm9yIGEgUENNIGNoYW5uZWwuCisgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKyAgICAgICAgICAgICAgICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbQorICAKKyAgIFJldHVybnM6ICAgICBDb250cm9sIHZhbHVlLgorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3RyaWRlbnRfY29udHJvbF9tb2RlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwl1bnNpZ25lZCBpbnQgQ1RSTDsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCS8qIHNldCBjdHJsIG1vZGUKKwkgICBDVFJMIGRlZmF1bHQ6IDgtYml0ICh1bnNpZ25lZCkgbW9ubywgbG9vcCBtb2RlIGVuYWJsZWQKKwkgKi8KKwlDVFJMID0gMHgwMDAwMDAwMTsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNikKKwkJQ1RSTCB8PSAweDAwMDAwMDA4OwkvLyAxNi1iaXQgZGF0YQorCWlmIChzbmRfcGNtX2Zvcm1hdF9zaWduZWQocnVudGltZS0+Zm9ybWF0KSkKKwkJQ1RSTCB8PSAweDAwMDAwMDAyOwkvLyBzaWduZWQgZGF0YQorCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCUNUUkwgfD0gMHgwMDAwMDAwNDsJLy8gc3RlcmVvIGRhdGEKKwlyZXR1cm4gQ1RSTDsKK30KKworLyoKKyAqICBQQ00gcGFydAorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9pb2N0bAorICAKKyAgIERlc2NyaXB0aW9uOiBEZXZpY2UgSS9PIGNvbnRyb2wgaGFuZGxlciBmb3IgcGxheWJhY2svY2FwdHVyZSBwYXJhbWV0ZXJzLgorICAKKyAgIFBhcmFtdGVyczogICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworICAgICAgICAgICAgICAgIGNtZCAgICAgLSB3aGF0IGlvY3RsIG1lc3NhZ2UgdG8gcHJvY2VzcworICAgICAgICAgICAgICAgIGFyZyAgICAgLSBhZGRpdGlvbmFsIG1lc3NhZ2UgaW5mb2FyZyAgICAgCisgIAorICAgUmV0dXJuczogICAgIEVycm9yIHN0YXR1cworICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9pb2N0bChzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB2b2lkICphcmcpCit7CisJLyogRklYTUU6IGl0IHNlZW1zIHRoYXQgd2l0aCBzbWFsbCBwZXJpb2RzIHRoZSBiZWhhdmlvdXIgb2YKKwkgICAgICAgICAgdHJpZGVudCBoYXJkd2FyZSBpcyB1bnByZWRpY3RhYmxlIGFuZCBpbnRlcnJ1cHQgZ2VuZXJhdG9yCisJICAgICAgICAgIGlzIGJyb2tlbiAqLworCXJldHVybiBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X2FsbG9jYXRlX3BjbV9tZW0KKyAgCisgICBEZXNjcmlwdGlvbjogQWxsb2NhdGUgUENNIHJpbmcgYnVmZmVyIGZvciBnaXZlbiBzdWJzdHJlYW0KKyAgCisgICBQYXJhbWV0ZXJzOiAgc3Vic3RyZWFtICAtIFBDTSBzdWJzdHJlYW0gY2xhc3MKKwkJaHdfcGFyYW1zICAtIGhhcmR3YXJlIHBhcmFtZXRlcnMKKyAgCisgICBSZXR1cm5zOiAgICAgRXJyb3Igc3RhdHVzCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2FsbG9jYXRlX3BjbV9tZW0oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2UgPSAoc25kX3RyaWRlbnRfdm9pY2VfdCAqKSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlpZiAoZXJyID4gMCkgeyAvKiBjaGFuZ2UgKi8KKwkJCWlmICh2b2ljZS0+bWVtYmxrKQorCQkJCXNuZF90cmlkZW50X2ZyZWVfcGFnZXModHJpZGVudCwgdm9pY2UtPm1lbWJsayk7CisJCQl2b2ljZS0+bWVtYmxrID0gc25kX3RyaWRlbnRfYWxsb2NfcGFnZXModHJpZGVudCwgc3Vic3RyZWFtKTsKKwkJCWlmICh2b2ljZS0+bWVtYmxrID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9hbGxvY2F0ZV9ldm9pY2UKKyAgCisgICBEZXNjcmlwdGlvbjogQWxsb2NhdGUgZXh0cmEgdm9pY2UgYXMgaW50ZXJydXB0IGdlbmVyYXRvcgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCQlod19wYXJhbXMgIC0gaGFyZHdhcmUgcGFyYW1ldGVycworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfYWxsb2NhdGVfZXZvaWNlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlID0gKHNuZF90cmlkZW50X3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKmV2b2ljZSA9IHZvaWNlLT5leHRyYTsKKworCS8qIHZvaWNlIG1hbmFnZW1lbnQgKi8KKworCWlmIChwYXJhbXNfYnVmZmVyX3NpemUoaHdfcGFyYW1zKSAvIDIgIT0gcGFyYW1zX3BlcmlvZF9zaXplKGh3X3BhcmFtcykpIHsKKwkJaWYgKGV2b2ljZSA9PSBOVUxMKSB7CisJCQlldm9pY2UgPSBzbmRfdHJpZGVudF9hbGxvY192b2ljZSh0cmlkZW50LCBTTkRSVl9UUklERU5UX1ZPSUNFX1RZUEVfUENNLCAwLCAwKTsKKwkJCWlmIChldm9pY2UgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXZvaWNlLT5leHRyYSA9IGV2b2ljZTsKKwkJCWV2b2ljZS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGV2b2ljZSAhPSBOVUxMKSB7CisJCQlzbmRfdHJpZGVudF9mcmVlX3ZvaWNlKHRyaWRlbnQsIGV2b2ljZSk7CisJCQl2b2ljZS0+ZXh0cmEgPSBldm9pY2UgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9od19wYXJhbXMKKyAgCisgICBEZXNjcmlwdGlvbjogU2V0IHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciB0aGUgcGxheWJhY2sgZGV2aWNlLgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCQlod19wYXJhbXMgIC0gaGFyZHdhcmUgcGFyYW1ldGVycworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfaHdfcGFyYW1zKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJaW50IGVycjsKKworCWVyciA9IHNuZF90cmlkZW50X2FsbG9jYXRlX3BjbV9tZW0oc3Vic3RyZWFtLCBod19wYXJhbXMpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gc25kX3RyaWRlbnRfYWxsb2NhdGVfZXZvaWNlKHN1YnN0cmVhbSwgaHdfcGFyYW1zKTsKKwlyZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfcGxheWJhY2tfaHdfZnJlZQorICAKKyAgIERlc2NyaXB0aW9uOiBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgZm9yIHRoZSBwbGF5YmFjayBkZXZpY2UuCisgIAorICAgUGFyYW1ldGVyczogIHN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisgIAorICAgUmV0dXJuczogICAgIEVycm9yIHN0YXR1cworICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlID0gKHNuZF90cmlkZW50X3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKmV2b2ljZSA9IHZvaWNlID8gdm9pY2UtPmV4dHJhIDogTlVMTDsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlpZiAodm9pY2UgJiYgdm9pY2UtPm1lbWJsaykgeworCQkJc25kX3RyaWRlbnRfZnJlZV9wYWdlcyh0cmlkZW50LCB2b2ljZS0+bWVtYmxrKTsKKwkJCXZvaWNlLT5tZW1ibGsgPSBOVUxMOworCQl9CisJfQorCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlpZiAoZXZvaWNlICE9IE5VTEwpIHsKKwkJc25kX3RyaWRlbnRfZnJlZV92b2ljZSh0cmlkZW50LCBldm9pY2UpOworCQl2b2ljZS0+ZXh0cmEgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3BsYXliYWNrX3ByZXBhcmUKKyAgCisgICBEZXNjcmlwdGlvbjogUHJlcGFyZSBwbGF5YmFjayBkZXZpY2UgZm9yIHBsYXliYWNrLgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICpldm9pY2UgPSB2b2ljZS0+ZXh0cmE7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKm1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOwkKKworCS8qIHNldCBkZWx0YSAocmF0ZSkgdmFsdWUgKi8KKwl2b2ljZS0+RGVsdGEgPSBzbmRfdHJpZGVudF9jb252ZXJ0X3JhdGUocnVudGltZS0+cmF0ZSk7CisJdm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZCA9IHNuZF90cmlkZW50X3NwdXJpb3VzX3RocmVzaG9sZChydW50aW1lLT5yYXRlLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisKKwkvKiBzZXQgTG9vcCBCZWdpbiBBZGRyZXNzICovCisJaWYgKHZvaWNlLT5tZW1ibGspCisJCXZvaWNlLT5MQkEgPSB2b2ljZS0+bWVtYmxrLT5vZmZzZXQ7CisJZWxzZQorCQl2b2ljZS0+TEJBID0gcnVudGltZS0+ZG1hX2FkZHI7CisgCisJdm9pY2UtPkNTTyA9IDA7CisJdm9pY2UtPkVTTyA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gMTsJLyogaW4gc2FtcGxlcyAqLworCXZvaWNlLT5DVFJMID0gc25kX3RyaWRlbnRfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CisJdm9pY2UtPkZNQyA9IDM7CisJdm9pY2UtPkdWU2VsID0gMTsKKwl2b2ljZS0+RUMgPSAwOworCXZvaWNlLT5BbHBoYSA9IDA7CisJdm9pY2UtPkZNUyA9IDA7CisJdm9pY2UtPlZvbCA9IG1peC0+dm9sOworCXZvaWNlLT5SVm9sID0gbWl4LT5ydm9sOworCXZvaWNlLT5DVm9sID0gbWl4LT5jdm9sOworCXZvaWNlLT5QYW4gPSBtaXgtPnBhbjsKKwl2b2ljZS0+QXR0cmlidXRlID0gMDsKKyNpZiAwCisJdm9pY2UtPkF0dHJpYnV0ZSA9ICgxPDwoMzAtMTYpKXwoMjw8KDI2LTE2KSl8CisJCQkgICAoMDw8KDI0LTE2KSl8KDB4MWY8PCgxOS0xNikpOworI2Vsc2UKKwl2b2ljZS0+QXR0cmlidXRlID0gMDsKKyNlbmRpZgorCisJc25kX3RyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyh0cmlkZW50LCB2b2ljZSk7CisKKwlpZiAoZXZvaWNlICE9IE5VTEwpIHsKKwkJZXZvaWNlLT5EZWx0YSA9IHZvaWNlLT5EZWx0YTsKKwkJZXZvaWNlLT5zcHVyaW91c190aHJlc2hvbGQgPSB2b2ljZS0+c3B1cmlvdXNfdGhyZXNob2xkOworCQlldm9pY2UtPkxCQSA9IHZvaWNlLT5MQkE7CisJCWV2b2ljZS0+Q1NPID0gMDsKKwkJZXZvaWNlLT5FU08gPSAocnVudGltZS0+cGVyaW9kX3NpemUgKiAyKSArIDQgLSAxOyAvKiBpbiBzYW1wbGVzICovCisJCWV2b2ljZS0+Q1RSTCA9IHZvaWNlLT5DVFJMOworCQlldm9pY2UtPkZNQyA9IDM7CisJCWV2b2ljZS0+R1ZTZWwgPSB0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4ID8gMCA6IDE7CisJCWV2b2ljZS0+RUMgPSAwOworCQlldm9pY2UtPkFscGhhID0gMDsKKwkJZXZvaWNlLT5GTVMgPSAwOworCQlldm9pY2UtPlZvbCA9IDB4M2ZmOwkJCS8qIG11dGUgKi8KKwkJZXZvaWNlLT5SVm9sID0gZXZvaWNlLT5DVm9sID0gMHg3ZjsJLyogbXV0ZSAqLworCQlldm9pY2UtPlBhbiA9IDB4N2Y7CQkJLyogbXV0ZSAqLworI2lmIDAKKwkJZXZvaWNlLT5BdHRyaWJ1dGUgPSAoMTw8KDMwLTE2KSl8KDI8PCgyNi0xNikpfAorCQkJCSAgICAoMDw8KDI0LTE2KSl8KDB4MWY8PCgxOS0xNikpOworI2Vsc2UKKwkJZXZvaWNlLT5BdHRyaWJ1dGUgPSAwOworI2VuZGlmCisJCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgZXZvaWNlKTsKKwkJZXZvaWNlLT5pc3luYzIgPSAxOworCQlldm9pY2UtPmlzeW5jX21hcmsgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJZXZvaWNlLT5FU08gPSAocnVudGltZS0+cGVyaW9kX3NpemUgKiAyKSAtIDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X2NhcHR1cmVfaHdfcGFyYW1zCisgIAorICAgRGVzY3JpcHRpb246IFNldCB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycyBmb3IgdGhlIGNhcHR1cmUgZGV2aWNlLgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCQlod19wYXJhbXMgIC0gaGFyZHdhcmUgcGFyYW1ldGVycworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfY2FwdHVyZV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF90cmlkZW50X2FsbG9jYXRlX3BjbV9tZW0oc3Vic3RyZWFtLCBod19wYXJhbXMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfY2FwdHVyZV9wcmVwYXJlCisgIAorICAgRGVzY3JpcHRpb246IFByZXBhcmUgY2FwdHVyZSBkZXZpY2UgZm9yIHBsYXliYWNrLgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlID0gKHNuZF90cmlkZW50X3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB2YWwsIEVTT19ieXRlczsKKworCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKworCS8vIEluaXRpbGl6ZSB0aGUgY2hhbm5lbCBhbmQgc2V0IGNoYW5uZWwgTW9kZQorCW91dGIoMCwgVFJJRF9SRUcodHJpZGVudCwgTEVHQUNZX0RNQVIxNSkpOworCisJLy8gU2V0IERNQSBjaGFubmVsIG9wZXJhdGlvbiBtb2RlIHJlZ2lzdGVyCisJb3V0YigweDU0LCBUUklEX1JFRyh0cmlkZW50LCBMRUdBQ1lfRE1BUjExKSk7CisKKwkvLyBTZXQgY2hhbm5lbCBidWZmZXIgQWRkcmVzcywgRE1BUjAgZXhwZWN0cyBjb250aWd1b3VzIFBDSSBtZW1vcnkgYXJlYQkKKwl2b2ljZS0+TEJBID0gcnVudGltZS0+ZG1hX2FkZHI7CisJb3V0bCh2b2ljZS0+TEJBLCBUUklEX1JFRyh0cmlkZW50LCBMRUdBQ1lfRE1BUjApKTsKKwlpZiAodm9pY2UtPm1lbWJsaykKKwkJdm9pY2UtPkxCQSA9IHZvaWNlLT5tZW1ibGstPm9mZnNldDsKKworCS8vIHNldCBFU08KKwlFU09fYnl0ZXMgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSAtIDE7CisJb3V0YigoRVNPX2J5dGVzICYgMHgwMGZmMDAwMCkgPj4gMTYsIFRSSURfUkVHKHRyaWRlbnQsIExFR0FDWV9ETUFSNikpOworCW91dHcoKEVTT19ieXRlcyAmIDB4MDAwMGZmZmYpLCBUUklEX1JFRyh0cmlkZW50LCBMRUdBQ1lfRE1BUjQpKTsKKwlFU09fYnl0ZXMrKzsKKworCS8vIFNldCBjaGFubmVsIHNhbXBsZSByYXRlLCA0LjEyIGZvcm1hdAorCXZhbCA9ICgoKHVuc2lnbmVkIGludCkgNDgwMDBMIDw8IDEyKSArIChydW50aW1lLT5yYXRlLzIpKSAvIHJ1bnRpbWUtPnJhdGU7CisJb3V0dyh2YWwsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TQkRFTFRBX0RFTFRBX1IpKTsKKworCS8vIFNldCBjaGFubmVsIGludGVycnVwdCBibGsgbGVuZ3RoCisJaWYgKHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYpIHsKKwkJdmFsID0gKHVuc2lnbmVkIHNob3J0KSAoKEVTT19ieXRlcyA+PiAxKSAtIDEpOworCX0gZWxzZSB7CisJCXZhbCA9ICh1bnNpZ25lZCBzaG9ydCkgKEVTT19ieXRlcyAtIDEpOworCX0KKworCW91dGwoKHZhbCA8PCAxNikgfCB2YWwsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TQkJMX1NCQ0wpKTsKKworCS8vIFJpZ2h0IG5vdywgc2V0IGZvcm1hdCBhbmQgc3RhcnQgdG8gcnVuIGNhcHR1cmVpbmcsIAorCS8vIGNvbnRpbnVvdXMgcnVuIGxvb3AgZW5hYmxlLgorCXRyaWRlbnQtPmJETUFTdGFydCA9IDB4MTk7CS8vIDAwMDEgMTAwMWIKKworCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQorCQl0cmlkZW50LT5iRE1BU3RhcnQgfD0gMHg4MDsKKwlpZiAoc25kX3BjbV9mb3JtYXRfc2lnbmVkKHJ1bnRpbWUtPmZvcm1hdCkpCisJCXRyaWRlbnQtPmJETUFTdGFydCB8PSAweDIwOworCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCXRyaWRlbnQtPmJETUFTdGFydCB8PSAweDQwOworCisJLy8gUHJlcGFyZSBjYXB0dXJlIGludHIgY2hhbm5lbAorCisJdm9pY2UtPkRlbHRhID0gc25kX3RyaWRlbnRfY29udmVydF9yYXRlKHJ1bnRpbWUtPnJhdGUpOworCXZvaWNlLT5zcHVyaW91c190aHJlc2hvbGQgPSBzbmRfdHJpZGVudF9zcHVyaW91c190aHJlc2hvbGQocnVudGltZS0+cmF0ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCXZvaWNlLT5pc3luYyA9IDE7CisJdm9pY2UtPmlzeW5jX21hcmsgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwl2b2ljZS0+aXN5bmNfbWF4ID0gcnVudGltZS0+YnVmZmVyX3NpemU7CisKKwkvLyBTZXQgdm9pY2UgcGFyYW1ldGVycworCXZvaWNlLT5DU08gPSAwOworCXZvaWNlLT5FU08gPSB2b2ljZS0+aXN5bmNfRVNPID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMikgKyA2IC0gMTsKKwl2b2ljZS0+Q1RSTCA9IHNuZF90cmlkZW50X2NvbnRyb2xfbW9kZShzdWJzdHJlYW0pOworCXZvaWNlLT5GTUMgPSAzOworCXZvaWNlLT5SVm9sID0gMHg3ZjsKKwl2b2ljZS0+Q1ZvbCA9IDB4N2Y7CisJdm9pY2UtPkdWU2VsID0gMTsKKwl2b2ljZS0+UGFuID0gMHg3ZjsJCS8qIG11dGUgKi8KKwl2b2ljZS0+Vm9sID0gMHgzZmY7CQkvKiBtdXRlICovCisJdm9pY2UtPkVDID0gMDsKKwl2b2ljZS0+QWxwaGEgPSAwOworCXZvaWNlLT5GTVMgPSAwOworCXZvaWNlLT5BdHRyaWJ1dGUgPSAwOworCisJc25kX3RyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyh0cmlkZW50LCB2b2ljZSk7CisKKwlzcGluX3VubG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NpNzAxOF9jYXB0dXJlX2h3X3BhcmFtcworICAKKyAgIERlc2NyaXB0aW9uOiBTZXQgdGhlIGhhcmR3YXJlIHBhcmFtZXRlcnMgZm9yIHRoZSBjYXB0dXJlIGRldmljZS4KKyAgCisgICBQYXJhbWV0ZXJzOiAgc3Vic3RyZWFtICAtIFBDTSBzdWJzdHJlYW0gY2xhc3MKKwkJaHdfcGFyYW1zICAtIGhhcmR3YXJlIHBhcmFtZXRlcnMKKyAgCisgICBSZXR1cm5zOiAgICAgRXJyb3Igc3RhdHVzCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3NpNzAxOF9jYXB0dXJlX2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCQkJc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc25kX3RyaWRlbnRfYWxsb2NhdGVfZXZvaWNlKHN1YnN0cmVhbSwgaHdfcGFyYW1zKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NpNzAxOF9jYXB0dXJlX2h3X2ZyZWUKKyAgCisgICBEZXNjcmlwdGlvbjogUmVsZWFzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2VzIGZvciB0aGUgY2FwdHVyZSBkZXZpY2UuCisgIAorICAgUGFyYW1ldGVyczogIHN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisgIAorICAgUmV0dXJuczogICAgIEVycm9yIHN0YXR1cworICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zaTcwMThfY2FwdHVyZV9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlID0gKHNuZF90cmlkZW50X3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKmV2b2ljZSA9IHZvaWNlID8gdm9pY2UtPmV4dHJhIDogTlVMTDsKKworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlpZiAoZXZvaWNlICE9IE5VTEwpIHsKKwkJc25kX3RyaWRlbnRfZnJlZV92b2ljZSh0cmlkZW50LCBldm9pY2UpOworCQl2b2ljZS0+ZXh0cmEgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NpNzAxOF9jYXB0dXJlX3ByZXBhcmUKKyAgCisgICBEZXNjcmlwdGlvbjogUHJlcGFyZSBjYXB0dXJlIGRldmljZSBmb3IgcGxheWJhY2suCisgIAorICAgUGFyYW1ldGVyczogIHN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisgIAorICAgUmV0dXJuczogICAgIEVycm9yIHN0YXR1cworICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zaTcwMThfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlID0gKHNuZF90cmlkZW50X3ZvaWNlX3QgKikgcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKmV2b2ljZSA9IHZvaWNlLT5leHRyYTsKKworCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKworCXZvaWNlLT5MQkEgPSBydW50aW1lLT5kbWFfYWRkcjsKKwl2b2ljZS0+RGVsdGEgPSBzbmRfdHJpZGVudF9jb252ZXJ0X2FkY19yYXRlKHJ1bnRpbWUtPnJhdGUpOworCXZvaWNlLT5zcHVyaW91c190aHJlc2hvbGQgPSBzbmRfdHJpZGVudF9zcHVyaW91c190aHJlc2hvbGQocnVudGltZS0+cmF0ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCisJLy8gU2V0IHZvaWNlIHBhcmFtZXRlcnMKKwl2b2ljZS0+Q1NPID0gMDsKKwl2b2ljZS0+RVNPID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSAxOwkJLyogaW4gc2FtcGxlcyAqLworCXZvaWNlLT5DVFJMID0gc25kX3RyaWRlbnRfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CisJdm9pY2UtPkZNQyA9IDA7CisJdm9pY2UtPlJWb2wgPSAwOworCXZvaWNlLT5DVm9sID0gMDsKKwl2b2ljZS0+R1ZTZWwgPSAxOworCXZvaWNlLT5QYW4gPSBUNERfREVGQVVMVF9QQ01fUEFOOworCXZvaWNlLT5Wb2wgPSAwOworCXZvaWNlLT5FQyA9IDA7CisJdm9pY2UtPkFscGhhID0gMDsKKwl2b2ljZS0+Rk1TID0gMDsKKworCXZvaWNlLT5BdHRyaWJ1dGUgPSAoMiA8PCAoMzAtMTYpKSB8CisJCQkgICAoMiA8PCAoMjYtMTYpKSB8CisJCQkgICAoMiA8PCAoMjQtMTYpKSB8CisJCQkgICAoMSA8PCAoMjMtMTYpKTsKKworCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgdm9pY2UpOworCisJaWYgKGV2b2ljZSAhPSBOVUxMKSB7CisJCWV2b2ljZS0+RGVsdGEgPSBzbmRfdHJpZGVudF9jb252ZXJ0X3JhdGUocnVudGltZS0+cmF0ZSk7CisJCWV2b2ljZS0+c3B1cmlvdXNfdGhyZXNob2xkID0gdm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZDsKKwkJZXZvaWNlLT5MQkEgPSB2b2ljZS0+TEJBOworCQlldm9pY2UtPkNTTyA9IDA7CisJCWV2b2ljZS0+RVNPID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMikgKyAyMCAtIDE7IC8qIGluIHNhbXBsZXMsIDIwIG1lYW5zIGNvcnJlY3Rpb24gKi8KKwkJZXZvaWNlLT5DVFJMID0gdm9pY2UtPkNUUkw7CisJCWV2b2ljZS0+Rk1DID0gMzsKKwkJZXZvaWNlLT5HVlNlbCA9IDA7CisJCWV2b2ljZS0+RUMgPSAwOworCQlldm9pY2UtPkFscGhhID0gMDsKKwkJZXZvaWNlLT5GTVMgPSAwOworCQlldm9pY2UtPlZvbCA9IDB4M2ZmOwkJCS8qIG11dGUgKi8KKwkJZXZvaWNlLT5SVm9sID0gZXZvaWNlLT5DVm9sID0gMHg3ZjsJLyogbXV0ZSAqLworCQlldm9pY2UtPlBhbiA9IDB4N2Y7CQkJLyogbXV0ZSAqLworCQlldm9pY2UtPkF0dHJpYnV0ZSA9IDA7CisJCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgZXZvaWNlKTsKKwkJZXZvaWNlLT5pc3luYzIgPSAxOworCQlldm9pY2UtPmlzeW5jX21hcmsgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJZXZvaWNlLT5FU08gPSAocnVudGltZS0+cGVyaW9kX3NpemUgKiAyKSAtIDE7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfZm9sZGJhY2tfcHJlcGFyZQorICAKKyAgIERlc2NyaXB0aW9uOiBQcmVwYXJlIGZvbGRiYWNrIGNhcHR1cmUgZGV2aWNlIGZvciBwbGF5YmFjay4KKyAgCisgICBQYXJhbWV0ZXJzOiAgc3Vic3RyZWFtICAtIFBDTSBzdWJzdHJlYW0gY2xhc3MKKyAgCisgICBSZXR1cm5zOiAgICAgRXJyb3Igc3RhdHVzCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2ZvbGRiYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2UgPSAoc25kX3RyaWRlbnRfdm9pY2VfdCAqKSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqZXZvaWNlID0gdm9pY2UtPmV4dHJhOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCisJLyogU2V0IGNoYW5uZWwgYnVmZmVyIEFkZHJlc3MgKi8KKwlpZiAodm9pY2UtPm1lbWJsaykKKwkJdm9pY2UtPkxCQSA9IHZvaWNlLT5tZW1ibGstPm9mZnNldDsKKwllbHNlCisJCXZvaWNlLT5MQkEgPSBydW50aW1lLT5kbWFfYWRkcjsKKworCS8qIHNldCB0YXJnZXQgRVNPIGZvciBjaGFubmVsICovCisJdm9pY2UtPkVTTyA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gMTsJLyogaW4gc2FtcGxlcyAqLworCisJLyogc2V0IHNhbXBsZSByYXRlICovCisJdm9pY2UtPkRlbHRhID0gMHgxMDAwOworCXZvaWNlLT5zcHVyaW91c190aHJlc2hvbGQgPSBzbmRfdHJpZGVudF9zcHVyaW91c190aHJlc2hvbGQoNDgwMDAsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKworCXZvaWNlLT5DU08gPSAwOworCXZvaWNlLT5DVFJMID0gc25kX3RyaWRlbnRfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CisJdm9pY2UtPkZNQyA9IDM7CisJdm9pY2UtPlJWb2wgPSAweDdmOworCXZvaWNlLT5DVm9sID0gMHg3ZjsKKwl2b2ljZS0+R1ZTZWwgPSAxOworCXZvaWNlLT5QYW4gPSAweDdmOwkvKiBtdXRlICovCisJdm9pY2UtPlZvbCA9IDB4M2ZmOwkvKiBtdXRlICovCisJdm9pY2UtPkVDID0gMDsKKwl2b2ljZS0+QWxwaGEgPSAwOworCXZvaWNlLT5GTVMgPSAwOworCXZvaWNlLT5BdHRyaWJ1dGUgPSAwOworCisJLyogc2V0IHVwIGNhcHR1cmUgY2hhbm5lbCAqLworCW91dGIoKCh2b2ljZS0+bnVtYmVyICYgMHgzZikgfCAweDgwKSwgVFJJRF9SRUcodHJpZGVudCwgVDREX1JDSSArIHZvaWNlLT5mb2xkYmFja19jaGFuKSk7CisKKwlzbmRfdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHRyaWRlbnQsIHZvaWNlKTsKKworCWlmIChldm9pY2UgIT0gTlVMTCkgeworCQlldm9pY2UtPkRlbHRhID0gdm9pY2UtPkRlbHRhOworCQlldm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZCA9IHZvaWNlLT5zcHVyaW91c190aHJlc2hvbGQ7CisJCWV2b2ljZS0+TEJBID0gdm9pY2UtPkxCQTsKKwkJZXZvaWNlLT5DU08gPSAwOworCQlldm9pY2UtPkVTTyA9IChydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIDIpICsgNCAtIDE7IC8qIGluIHNhbXBsZXMgKi8KKwkJZXZvaWNlLT5DVFJMID0gdm9pY2UtPkNUUkw7CisJCWV2b2ljZS0+Rk1DID0gMzsKKwkJZXZvaWNlLT5HVlNlbCA9IHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTggPyAwIDogMTsKKwkJZXZvaWNlLT5FQyA9IDA7CisJCWV2b2ljZS0+QWxwaGEgPSAwOworCQlldm9pY2UtPkZNUyA9IDA7CisJCWV2b2ljZS0+Vm9sID0gMHgzZmY7CQkJLyogbXV0ZSAqLworCQlldm9pY2UtPlJWb2wgPSBldm9pY2UtPkNWb2wgPSAweDdmOwkvKiBtdXRlICovCisJCWV2b2ljZS0+UGFuID0gMHg3ZjsJCQkvKiBtdXRlICovCisJCWV2b2ljZS0+QXR0cmlidXRlID0gMDsKKwkJc25kX3RyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyh0cmlkZW50LCBldm9pY2UpOworCQlldm9pY2UtPmlzeW5jMiA9IDE7CisJCWV2b2ljZS0+aXN5bmNfbWFyayA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCQlldm9pY2UtPkVTTyA9IChydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIDIpIC0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NwZGlmX2h3X3BhcmFtcworICAKKyAgIERlc2NyaXB0aW9uOiBTZXQgdGhlIGhhcmR3YXJlIHBhcmFtZXRlcnMgZm9yIHRoZSBzcGRpZiBkZXZpY2UuCisgIAorICAgUGFyYW1ldGVyczogIHN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisJCWh3X3BhcmFtcyAgLSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisgIAorICAgUmV0dXJuczogICAgIEVycm9yIHN0YXR1cworICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zcGRpZl9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgICAgICAgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IG9sZF9iaXRzID0gMCwgY2hhbmdlID0gMDsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3RyaWRlbnRfYWxsb2NhdGVfcGNtX21lbShzdWJzdHJlYW0sIGh3X3BhcmFtcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQllcnIgPSBzbmRfdHJpZGVudF9hbGxvY2F0ZV9ldm9pY2Uoc3Vic3RyZWFtLCBod19wYXJhbXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogcHJlcGFyZSBTUERJRiBjaGFubmVsICovCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCW9sZF9iaXRzID0gdHJpZGVudC0+c3BkaWZfcGNtX2JpdHM7CisJaWYgKG9sZF9iaXRzICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKQorCQl0cmlkZW50LT5zcGRpZl9wY21fYml0cyAmPSB+SUVDOTU4X0FFUzBfUFJPX0ZTOworCWVsc2UKKwkJdHJpZGVudC0+c3BkaWZfcGNtX2JpdHMgJj0gfihJRUM5NThfQUVTM19DT05fRlMgPDwgMjQpOworCWlmIChwYXJhbXNfcmF0ZShod19wYXJhbXMpID49IDQ4MDAwKSB7CisJCXRyaWRlbnQtPnNwZGlmX3BjbV9jdHJsID0gMHgzYzsJLy8gNDgwMDAgSHoKKwkJdHJpZGVudC0+c3BkaWZfcGNtX2JpdHMgfD0KKwkJCXRyaWRlbnQtPnNwZGlmX2JpdHMgJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwgPworCQkJCUlFQzk1OF9BRVMwX1BST19GU180ODAwMCA6CisJCQkJKElFQzk1OF9BRVMzX0NPTl9GU180ODAwMCA8PCAyNCk7CisJfQorCWVsc2UgaWYgKHBhcmFtc19yYXRlKGh3X3BhcmFtcykgPj0gNDQxMDApIHsKKwkJdHJpZGVudC0+c3BkaWZfcGNtX2N0cmwgPSAweDNlOwkvLyA0NDEwMCBIegorCQl0cmlkZW50LT5zcGRpZl9wY21fYml0cyB8PQorCQkJdHJpZGVudC0+c3BkaWZfYml0cyAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCA/CisJCQkJSUVDOTU4X0FFUzBfUFJPX0ZTXzQ0MTAwIDoKKwkJCQkoSUVDOTU4X0FFUzNfQ09OX0ZTXzQ0MTAwIDw8IDI0KTsKKwl9CisJZWxzZSB7CisJCXRyaWRlbnQtPnNwZGlmX3BjbV9jdHJsID0gMHgzZDsJLy8gMzIwMDAgSHoKKwkJdHJpZGVudC0+c3BkaWZfcGNtX2JpdHMgfD0KKwkJCXRyaWRlbnQtPnNwZGlmX2JpdHMgJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwgPworCQkJCUlFQzk1OF9BRVMwX1BST19GU18zMjAwMCA6CisJCQkJKElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMCA8PCAyNCk7CisJfQorCWNoYW5nZSA9IG9sZF9iaXRzICE9IHRyaWRlbnQtPnNwZGlmX3BjbV9iaXRzOworCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCisJaWYgKGNoYW5nZSkKKwkJc25kX2N0bF9ub3RpZnkodHJpZGVudC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZ0cmlkZW50LT5zcGRpZl9wY21fY3RsLT5pZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3NwZGlmX3ByZXBhcmUKKyAgCisgICBEZXNjcmlwdGlvbjogUHJlcGFyZSBTUERJRiBkZXZpY2UgZm9yIHBsYXliYWNrLgorICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICpldm9pY2UgPSB2b2ljZS0+ZXh0cmE7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKm1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCXVuc2lnbmVkIGludCBSRVNPLCBMQkFPOworCXVuc2lnbmVkIGludCB0ZW1wOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCisJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKworCQkvKiBzZXQgZGVsdGEgKHJhdGUpIHZhbHVlICovCisJCXZvaWNlLT5EZWx0YSA9IHNuZF90cmlkZW50X2NvbnZlcnRfcmF0ZShydW50aW1lLT5yYXRlKTsKKwkJdm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZCA9IHNuZF90cmlkZW50X3NwdXJpb3VzX3RocmVzaG9sZChydW50aW1lLT5yYXRlLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisKKwkJLyogc2V0IExvb3AgQmFjayBBZGRyZXNzICovCisJCUxCQU8gPSBydW50aW1lLT5kbWFfYWRkcjsKKwkJaWYgKHZvaWNlLT5tZW1ibGspCisJCQl2b2ljZS0+TEJBID0gdm9pY2UtPm1lbWJsay0+b2Zmc2V0OworCQllbHNlCisJCQl2b2ljZS0+TEJBID0gTEJBTzsKKworCQl2b2ljZS0+aXN5bmMgPSAxOworCQl2b2ljZS0+aXN5bmMzID0gMTsKKwkJdm9pY2UtPmlzeW5jX21hcmsgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJdm9pY2UtPmlzeW5jX21heCA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCisJCS8qIHNldCB0YXJnZXQgRVNPIGZvciBjaGFubmVsICovCisJCVJFU08gPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIDE7CisJCXZvaWNlLT5FU08gPSB2b2ljZS0+aXN5bmNfRVNPID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMikgKyA2IC0gMTsKKworCQkvKiBzZXQgY3RybCBtb2RlICovCisJCXZvaWNlLT5DVFJMID0gc25kX3RyaWRlbnRfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CisKKwkJdm9pY2UtPkZNQyA9IDM7CisJCXZvaWNlLT5SVm9sID0gMHg3ZjsKKwkJdm9pY2UtPkNWb2wgPSAweDdmOworCQl2b2ljZS0+R1ZTZWwgPSAxOworCQl2b2ljZS0+UGFuID0gMHg3ZjsKKwkJdm9pY2UtPlZvbCA9IDB4M2ZmOworCQl2b2ljZS0+RUMgPSAwOworCQl2b2ljZS0+Q1NPID0gMDsKKwkJdm9pY2UtPkFscGhhID0gMDsKKwkJdm9pY2UtPkZNUyA9IDA7CisJCXZvaWNlLT5BdHRyaWJ1dGUgPSAwOworCisJCS8qIHByZXBhcmUgc3Vycm9nYXRlIElSUSBjaGFubmVsICovCisJCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgdm9pY2UpOworCisJCW91dHcoKFJFU08gJiAweGZmZmYpLCBUUklEX1JFRyh0cmlkZW50LCBOWF9TUEVTTykpOworCQlvdXRiKChSRVNPID4+IDE2KSwgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BFU08gKyAyKSk7CisJCW91dGwoKExCQU8gJiAweGZmZmZmZmZjKSwgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BMQkEpKTsKKwkJb3V0dygodm9pY2UtPkNTTyAmIDB4ZmZmZiksIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTykpOworCQlvdXRiKCh2b2ljZS0+Q1NPID4+IDE2KSwgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDVFJMX1NQQ1NPICsgMikpOworCisJCS8qIHNldCBTUERJRiBzZXR0aW5nICovCisJCW91dGIodHJpZGVudC0+c3BkaWZfcGNtX2N0cmwsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTyArIDMpKTsKKwkJb3V0bCh0cmlkZW50LT5zcGRpZl9wY21fYml0cywgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDU1RBVFVTKSk7CisKKwl9IGVsc2UgewkvKiBTaVMgKi8KKwkKKwkJLyogc2V0IGRlbHRhIChyYXRlKSB2YWx1ZSAqLworCQl2b2ljZS0+RGVsdGEgPSAweDgwMDsKKwkJdm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZCA9IHNuZF90cmlkZW50X3NwdXJpb3VzX3RocmVzaG9sZCg0ODAwMCwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCisJCS8qIHNldCBMb29wIEJlZ2luIEFkZHJlc3MgKi8KKwkJaWYgKHZvaWNlLT5tZW1ibGspCisJCQl2b2ljZS0+TEJBID0gdm9pY2UtPm1lbWJsay0+b2Zmc2V0OworCQllbHNlCisJCQl2b2ljZS0+TEJBID0gcnVudGltZS0+ZG1hX2FkZHI7CisKKwkJdm9pY2UtPkNTTyA9IDA7CisJCXZvaWNlLT5FU08gPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIDE7CS8qIGluIHNhbXBsZXMgKi8KKwkJdm9pY2UtPkNUUkwgPSBzbmRfdHJpZGVudF9jb250cm9sX21vZGUoc3Vic3RyZWFtKTsKKwkJdm9pY2UtPkZNQyA9IDM7CisJCXZvaWNlLT5HVlNlbCA9IDE7CisJCXZvaWNlLT5FQyA9IDA7CisJCXZvaWNlLT5BbHBoYSA9IDA7CisJCXZvaWNlLT5GTVMgPSAwOworCQl2b2ljZS0+Vm9sID0gbWl4LT52b2w7CisJCXZvaWNlLT5SVm9sID0gbWl4LT5ydm9sOworCQl2b2ljZS0+Q1ZvbCA9IG1peC0+Y3ZvbDsKKwkJdm9pY2UtPlBhbiA9IG1peC0+cGFuOworCQl2b2ljZS0+QXR0cmlidXRlID0gKDE8PCgzMC0xNikpfCg3PDwoMjYtMTYpKXwKKwkJCQkgICAoMDw8KDI0LTE2KSl8KDA8PCgxOS0xNikpOworCisJCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgdm9pY2UpOworCisJCWlmIChldm9pY2UgIT0gTlVMTCkgeworCQkJZXZvaWNlLT5EZWx0YSA9IHZvaWNlLT5EZWx0YTsKKwkJCWV2b2ljZS0+c3B1cmlvdXNfdGhyZXNob2xkID0gdm9pY2UtPnNwdXJpb3VzX3RocmVzaG9sZDsKKwkJCWV2b2ljZS0+TEJBID0gdm9pY2UtPkxCQTsKKwkJCWV2b2ljZS0+Q1NPID0gMDsKKwkJCWV2b2ljZS0+RVNPID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMikgKyA0IC0gMTsgLyogaW4gc2FtcGxlcyAqLworCQkJZXZvaWNlLT5DVFJMID0gdm9pY2UtPkNUUkw7CisJCQlldm9pY2UtPkZNQyA9IDM7CisJCQlldm9pY2UtPkdWU2VsID0gdHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCA/IDAgOiAxOworCQkJZXZvaWNlLT5FQyA9IDA7CisJCQlldm9pY2UtPkFscGhhID0gMDsKKwkJCWV2b2ljZS0+Rk1TID0gMDsKKwkJCWV2b2ljZS0+Vm9sID0gMHgzZmY7CQkJLyogbXV0ZSAqLworCQkJZXZvaWNlLT5SVm9sID0gZXZvaWNlLT5DVm9sID0gMHg3ZjsJLyogbXV0ZSAqLworCQkJZXZvaWNlLT5QYW4gPSAweDdmOwkJCS8qIG11dGUgKi8KKwkJCWV2b2ljZS0+QXR0cmlidXRlID0gMDsKKwkJCXNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3ModHJpZGVudCwgZXZvaWNlKTsKKwkJCWV2b2ljZS0+aXN5bmMyID0gMTsKKwkJCWV2b2ljZS0+aXN5bmNfbWFyayA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCQkJZXZvaWNlLT5FU08gPSAocnVudGltZS0+cGVyaW9kX3NpemUgKiAyKSAtIDE7CisJCX0KKworCQlvdXRsKHRyaWRlbnQtPnNwZGlmX3BjbV9iaXRzLCBUUklEX1JFRyh0cmlkZW50LCBTSV9TUERJRl9DUykpOworCQl0ZW1wID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJCXRlbXAgJj0gfigxPDwxOSk7CisJCW91dGwodGVtcCwgVFJJRF9SRUcodHJpZGVudCwgVDREX0xGT19HQ19DSVIpKTsKKwkJdGVtcCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCXRlbXAgfD0gU1BESUZfRU47CisJCW91dGwodGVtcCwgVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF90cmlnZ2VyCisgIAorICAgRGVzY3JpcHRpb246IFN0YXJ0L3N0b3AgZGV2aWNlcworICAKKyAgIFBhcmFtZXRlcnM6ICBzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworICAgCQljbWQJLSB0cmlnZ2VyIGNvbW1hbmQgKFNUT1AsIEdPKQorICAKKyAgIFJldHVybnM6ICAgICBFcnJvciBzdGF0dXMKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkgICAgICAgaW50IGNtZCkKKwkJCQkgICAgCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzOworCXVuc2lnbmVkIGludCB3aGF0LCB3aGF0aSwgY2FwdHVyZV9mbGFnLCBzcGRpZl9mbGFnOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlLCAqZXZvaWNlOworCXVuc2lnbmVkIGludCB2YWwsIGdvOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJZ28gPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJZ28gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2hhdCA9IHdoYXRpID0gY2FwdHVyZV9mbGFnID0gc3BkaWZfZmxhZyA9IDA7CisJc3Bpbl9sb2NrKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVElNRVIpKSAmIDB4MDBmZmZmZmY7CisJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgeworCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJaWYgKCh0cmlkZW50X3QgKikgc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzKSA9PSB0cmlkZW50KSB7CisJCQl2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwkJCWV2b2ljZSA9IHZvaWNlLT5leHRyYTsKKwkJCXdoYXQgfD0gMSA8PCAodm9pY2UtPm51bWJlciAmIDB4MWYpOworCQkJaWYgKGV2b2ljZSA9PSBOVUxMKSB7CisJCQkJd2hhdGkgfD0gMSA8PCAodm9pY2UtPm51bWJlciAmIDB4MWYpOworCQkJfSBlbHNlIHsKKwkJCQl3aGF0IHw9IDEgPDwgKGV2b2ljZS0+bnVtYmVyICYgMHgxZik7CisJCQkJd2hhdGkgfD0gMSA8PCAoZXZvaWNlLT5udW1iZXIgJiAweDFmKTsKKwkJCQlpZiAoZ28pCisJCQkJCWV2b2ljZS0+c3RpbWVyID0gdmFsOworCQkJfQorCQkJaWYgKGdvKSB7CisJCQkJdm9pY2UtPnJ1bm5pbmcgPSAxOworCQkJCXZvaWNlLT5zdGltZXIgPSB2YWw7CisJCQl9IGVsc2UgeworCQkJCXZvaWNlLT5ydW5uaW5nID0gMDsKKwkJCX0KKwkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CisJCQlpZiAodm9pY2UtPmNhcHR1cmUpCisJCQkJY2FwdHVyZV9mbGFnID0gMTsKKwkJCWlmICh2b2ljZS0+c3BkaWYpCisJCQkJc3BkaWZfZmxhZyA9IDE7CisJCX0KKwl9CisJaWYgKHNwZGlmX2ZsYWcpIHsKKwkJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKwkJCW91dGwodHJpZGVudC0+c3BkaWZfcGNtX2JpdHMsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1NUQVRVUykpOworCQkJb3V0Yih0cmlkZW50LT5zcGRpZl9wY21fY3RybCwgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDVFJMX1NQQ1NPICsgMykpOworCQl9IGVsc2UgeworCQkJb3V0bCh0cmlkZW50LT5zcGRpZl9wY21fYml0cywgVFJJRF9SRUcodHJpZGVudCwgU0lfU1BESUZfQ1MpKTsKKwkJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkgfCBTUERJRl9FTjsKKwkJCW91dGwodmFsLCBUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCX0KKwl9CisJaWYgKCFnbykKKwkJb3V0bCh3aGF0LCBUUklEX1JFRyh0cmlkZW50LCBUNERfU1RPUF9CKSk7CisJdmFsID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9BSU5URU5fQikpOworCWlmIChnbykgeworCQl2YWwgfD0gd2hhdGk7CisJfSBlbHNlIHsKKwkJdmFsICY9IH53aGF0aTsKKwl9CisJb3V0bCh2YWwsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9BSU5URU5fQikpOworCWlmIChnbykgeworCQlvdXRsKHdoYXQsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVEFSVF9CKSk7CisKKwkJaWYgKGNhcHR1cmVfZmxhZyAmJiB0cmlkZW50LT5kZXZpY2UgIT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4KQorCQkJb3V0Yih0cmlkZW50LT5iRE1BU3RhcnQsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TQkNUUkxfU0JFMlJfU0JERCkpOworCX0gZWxzZSB7CisJCWlmIChjYXB0dXJlX2ZsYWcgJiYgdHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkKKwkJCW91dGIoMHgwMCwgVFJJRF9SRUcodHJpZGVudCwgVDREX1NCQ1RSTF9TQkUyUl9TQkREKSk7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZXR1cm4gdGhlIHBsYXliYWNrIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgCisgICBQYXJhbWV0ZXJzOglzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCisgICBSZXR1cm5zOiAgICAgcG9zaXRpb24gb2YgYnVmZmVyCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3RyaWRlbnRfcGxheWJhY2tfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3NvOworCisJaWYgKCF2b2ljZS0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJnRyaWRlbnQtPnJlZ19sb2NrKTsKKworCW91dGIodm9pY2UtPm51bWJlciwgVFJJRF9SRUcodHJpZGVudCwgVDREX0xGT19HQ19DSVIpKTsKKworCWlmICh0cmlkZW50LT5kZXZpY2UgIT0gVFJJREVOVF9ERVZJQ0VfSURfTlgpIHsKKwkJY3NvID0gaW53KFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0NTT19BTFBIQV9GTVMgKyAyKSk7CisJfSBlbHNlIHsJCS8vIElEXzREV0FWRV9OWAorCQljc28gPSAodW5zaWduZWQgaW50KSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfQ1NPKSkgJiAweDAwZmZmZmZmOworCX0KKworCXNwaW5fdW5sb2NrKCZ0cmlkZW50LT5yZWdfbG9jayk7CisKKwlpZiAoY3NvID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQljc28gPSAwOworCisJcmV0dXJuIGNzbzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X2NhcHR1cmVfcG9pbnRlcgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgcmV0dXJuIHRoZSBjYXB0dXJlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgCisgICBQYXJhbXRlcnM6ICAgcGNtMSAgICAtIFBDTSBkZXZpY2UgY2xhc3MKKworICAgUmV0dXJuczogICAgIHBvc2l0aW9uIG9mIGJ1ZmZlcgorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF90cmlkZW50X2NhcHR1cmVfcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJaWYgKCF2b2ljZS0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSBpbncoVFJJRF9SRUcodHJpZGVudCwgVDREX1NCQkxfU0JDTCkpOworCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCisJCXJlc3VsdCA+Pj0gMTsKKwlpZiAocmVzdWx0ID4gMCkKKwkJcmVzdWx0ID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSByZXN1bHQ7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfc3BkaWZfcG9pbnRlcgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgcmV0dXJuIHRoZSBTUERJRiBwbGF5YmFjayBwb3NpdGlvbgorICAgICAgICAgICAgICAgIAorICAgUGFyYW1ldGVyczoJc3Vic3RyZWFtICAtIFBDTSBzdWJzdHJlYW0gY2xhc3MKKworICAgUmV0dXJuczogICAgIHBvc2l0aW9uIG9mIGJ1ZmZlcgorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF90cmlkZW50X3NwZGlmX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2UgPSAoc25kX3RyaWRlbnRfdm9pY2VfdCAqKSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKworCWlmICghdm9pY2UtPnJ1bm5pbmcpCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTykpICYgMHgwMGZmZmZmZjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiAgUGxheWJhY2sgc3VwcG9ydCBkZXZpY2UgZGVzY3JpcHRpb24KKyAqLworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF90cmlkZW50X3BsYXliYWNrID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPQkJKFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSksCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDI1NioxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDI1NioxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisvKgorICogIENhcHR1cmUgc3VwcG9ydCBkZXZpY2UgZGVzY3JpcHRpb24KKyAqLworCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF90cmlkZW50X2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFKSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTQwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qCisgKiAgRm9sZGJhY2sgY2FwdHVyZSBzdXBwb3J0IGRldmljZSBkZXNjcmlwdGlvbgorICovCisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3RyaWRlbnRfZm9sZGJhY2sgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTIsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkucGVyaW9kc19taW4gPQkJMSwKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCisvKgorICogIFNQRElGIHBsYXliYWNrIHN1cHBvcnQgZGV2aWNlIGRlc2NyaXB0aW9uCisgKi8KKworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdHJpZGVudF9zcGRpZiA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQkoU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKKwkucmF0ZV9taW4gPQkJMzIwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3RyaWRlbnRfc3BkaWZfNzAxOCA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3BjbV9mcmVlX3N1YnN0cmVhbShzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl0cmlkZW50X3QgKnRyaWRlbnQ7CisKKwlpZiAodm9pY2UpIHsKKwkJdHJpZGVudCA9IHZvaWNlLT50cmlkZW50OworCQlzbmRfdHJpZGVudF9mcmVlX3ZvaWNlKHRyaWRlbnQsIHZvaWNlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZTsKKworCXZvaWNlID0gc25kX3RyaWRlbnRfYWxsb2Nfdm9pY2UodHJpZGVudCwgU05EUlZfVFJJREVOVF9WT0lDRV9UWVBFX1BDTSwgMCwgMCk7CisJaWYgKHZvaWNlID09IE5VTEwpCisJCXJldHVybiAtRUFHQUlOOworCXNuZF90cmlkZW50X3BjbV9taXhlcl9idWlsZCh0cmlkZW50LCB2b2ljZSwgc3Vic3RyZWFtKTsKKwl2b2ljZS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHZvaWNlOworCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF90cmlkZW50X3BjbV9mcmVlX3N1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF90cmlkZW50X3BsYXliYWNrOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgMCwgNjQqMTAyNCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9wbGF5YmFja19jbG9zZQorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCBjbG9zZSB0aGUgNERXYXZlIHBsYXliYWNrIGRldmljZS4gRm9yIG5vdyAKKyAgICAgICAgICAgICAgICB3ZSB3aWxsIHNpbXBseSBmcmVlIHRoZSBkbWEgdHJhbnNmZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgIAorICAgUGFyYW1ldGVyczoJc3Vic3RyZWFtICAtIFBDTSBzdWJzdHJlYW0gY2xhc3MKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBzbmRfdHJpZGVudF9wbGF5YmFja19jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZSA9IChzbmRfdHJpZGVudF92b2ljZV90ICopIHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXNuZF90cmlkZW50X3BjbV9taXhlcl9mcmVlKHRyaWRlbnQsIHZvaWNlLCBzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfc3BkaWZfb3BlbgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCBvcGVuIHRoZSA0RFdhdmUgU1BESUYgZGV2aWNlLgorCisgICBQYXJhbWV0ZXJzOglzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCisgICBSZXR1cm5zOiAgICAgc3RhdHVzICAtIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBmbGFnCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3NwZGlmX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2U7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJCisJdm9pY2UgPSBzbmRfdHJpZGVudF9hbGxvY192b2ljZSh0cmlkZW50LCBTTkRSVl9UUklERU5UX1ZPSUNFX1RZUEVfUENNLCAwLCAwKTsKKwlpZiAodm9pY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQUdBSU47CisJdm9pY2UtPnNwZGlmID0gMTsKKwl2b2ljZS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwl0cmlkZW50LT5zcGRpZl9wY21fYml0cyA9IHRyaWRlbnQtPnNwZGlmX2JpdHM7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB2b2ljZTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9wY21fZnJlZV9zdWJzdHJlYW07CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKwkJcnVudGltZS0+aHcgPSBzbmRfdHJpZGVudF9zcGRpZjsKKwl9IGVsc2UgeworCQlydW50aW1lLT5odyA9IHNuZF90cmlkZW50X3NwZGlmXzcwMTg7CisJfQorCisJdHJpZGVudC0+c3BkaWZfcGNtX2N0bC0+dmRbMF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJc25kX2N0bF9ub3RpZnkodHJpZGVudC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfAorCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywgJnRyaWRlbnQtPnNwZGlmX3BjbV9jdGwtPmlkKTsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCAwLCA2NCoxMDI0KTsKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfc3BkaWZfY2xvc2UKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgY2xvc2UgdGhlIDREV2F2ZSBTUERJRiBkZXZpY2UuCisgICAgICAgICAgICAgICAgCisgICBQYXJhbWV0ZXJzOglzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwlzcGluX2xvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJLy8gcmVzdG9yZSBkZWZhdWx0IFNQRElGIHNldHRpbmcKKwlpZiAodHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQlvdXRiKHRyaWRlbnQtPnNwZGlmX2N0cmwsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTyArIDMpKTsKKwkJb3V0bCh0cmlkZW50LT5zcGRpZl9iaXRzLCBUUklEX1JFRyh0cmlkZW50LCBOWF9TUENTVEFUVVMpKTsKKwl9IGVsc2UgeworCQlvdXRsKHRyaWRlbnQtPnNwZGlmX2JpdHMsIFRSSURfUkVHKHRyaWRlbnQsIFNJX1NQRElGX0NTKSk7CisJCXRlbXAgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCQlpZiAodHJpZGVudC0+c3BkaWZfY3RybCkgeworCQkJdGVtcCB8PSBTUERJRl9FTjsKKwkJfSBlbHNlIHsKKwkJCXRlbXAgJj0gflNQRElGX0VOOworCQl9CisJCW91dGwodGVtcCwgVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwl0cmlkZW50LT5zcGRpZl9wY21fY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCXNuZF9jdGxfbm90aWZ5KHRyaWRlbnQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKKwkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sICZ0cmlkZW50LT5zcGRpZl9wY21fY3RsLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9jYXB0dXJlX29wZW4KKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgb3BlbiB0aGUgNERXYXZlIGNhcHR1cmUgZGV2aWNlLgorCisgICBQYXJhbWV0ZXJzOglzdWJzdHJlYW0gIC0gUENNIHN1YnN0cmVhbSBjbGFzcworCisgICBSZXR1cm5zOiAgICAgc3RhdHVzICAtIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBmbGFnCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9jYXB0dXJlX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2U7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwl2b2ljZSA9IHNuZF90cmlkZW50X2FsbG9jX3ZvaWNlKHRyaWRlbnQsIFNORFJWX1RSSURFTlRfVk9JQ0VfVFlQRV9QQ00sIDAsIDApOworCWlmICh2b2ljZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVBR0FJTjsKKwl2b2ljZS0+Y2FwdHVyZSA9IDE7CisJdm9pY2UtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB2b2ljZTsKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9wY21fZnJlZV9zdWJzdHJlYW07CisJcnVudGltZS0+aHcgPSBzbmRfdHJpZGVudF9jYXB0dXJlOworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgMCwgNjQqMTAyNCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9jYXB0dXJlX2Nsb3NlCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGNsb3NlIHRoZSA0RFdhdmUgY2FwdHVyZSBkZXZpY2UuIEZvciBub3cgCisgICAgICAgICAgICAgICAgd2Ugd2lsbCBzaW1wbHkgZnJlZSB0aGUgZG1hIHRyYW5zZmVyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAKKyAgIFBhcmFtZXRlcnM6CXN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfY2FwdHVyZV9jbG9zZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BlbgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgd2lsbCBvcGVuIHRoZSA0RFdhdmUgZm9sZGJhY2sgY2FwdHVyZSBkZXZpY2UuCisKKyAgIFBhcmFtZXRlcnM6CXN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisKKyAgIFJldHVybnM6ICAgICBzdGF0dXMgIC0gc3VjY2VzcyBvciBmYWlsdXJlIGZsYWcKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2ZvbGRiYWNrX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2U7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwl2b2ljZSA9IHNuZF90cmlkZW50X2FsbG9jX3ZvaWNlKHRyaWRlbnQsIFNORFJWX1RSSURFTlRfVk9JQ0VfVFlQRV9QQ00sIDAsIDApOworCWlmICh2b2ljZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVBR0FJTjsKKwl2b2ljZS0+Zm9sZGJhY2tfY2hhbiA9IHN1YnN0cmVhbS0+bnVtYmVyOworCXZvaWNlLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gdm9pY2U7CisJcnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX3RyaWRlbnRfcGNtX2ZyZWVfc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX3RyaWRlbnRfZm9sZGJhY2s7CisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUsIDAsIDY0KjEwMjQpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfZm9sZGJhY2tfY2xvc2UKKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgY2xvc2UgdGhlIDREV2F2ZSBmb2xkYmFjayBjYXB0dXJlIGRldmljZS4gCisJCUZvciBub3cgd2Ugd2lsbCBzaW1wbHkgZnJlZSB0aGUgZG1hIHRyYW5zZmVyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAKKyAgIFBhcmFtZXRlcnM6CXN1YnN0cmVhbSAgLSBQQ00gc3Vic3RyZWFtIGNsYXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfZm9sZGJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2U7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdm9pY2UgPSAoc25kX3RyaWRlbnRfdm9pY2VfdCAqKSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCisJLyogc3RvcCBjYXB0dXJlIGNoYW5uZWwgKi8KKwlzcGluX2xvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJb3V0YigweDAwLCBUUklEX1JFRyh0cmlkZW50LCBUNERfUkNJICsgdm9pY2UtPmZvbGRiYWNrX2NoYW4pKTsKKwlzcGluX3VubG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFBDTSBvcGVyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF90cmlkZW50X3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdHJpZGVudF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF90cmlkZW50X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdHJpZGVudF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdHJpZGVudF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF90cmlkZW50X3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3RyaWRlbnRfbnhfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF90cmlkZW50X3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF90cmlkZW50X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF90cmlkZW50X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3RyaWRlbnRfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF90cmlkZW50X3BsYXliYWNrX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKK307CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF90cmlkZW50X2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF90cmlkZW50X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdHJpZGVudF9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdHJpZGVudF9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF90cmlkZW50X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdHJpZGVudF9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfdHJpZGVudF90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfY2FwdHVyZV9wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3RyaWRlbnRfc2k3MDE4X2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF90cmlkZW50X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdHJpZGVudF9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdHJpZGVudF9zaTcwMThfY2FwdHVyZV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdHJpZGVudF9zaTcwMThfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3RyaWRlbnRfc2k3MDE4X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF90cmlkZW50X3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF90cmlkZW50X2ZvbGRiYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX3RyaWRlbnRfZm9sZGJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF90cmlkZW50X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF90cmlkZW50X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdHJpZGVudF9mb2xkYmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3RyaWRlbnRfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF90cmlkZW50X3BsYXliYWNrX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdHJpZGVudF9ueF9mb2xkYmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdHJpZGVudF9mb2xkYmFja19jbG9zZSwKKwkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3RyaWRlbnRfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX3RyaWRlbnRfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF90cmlkZW50X2ZvbGRiYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfdHJpZGVudF90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3RyaWRlbnRfc3BkaWZfb3BzID0geworCS5vcGVuID0JCXNuZF90cmlkZW50X3NwZGlmX29wZW4sCisJLmNsb3NlID0Jc25kX3RyaWRlbnRfc3BkaWZfY2xvc2UsCisJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF90cmlkZW50X3NwZGlmX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF90cmlkZW50X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdHJpZGVudF9zcGRpZl9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3RyaWRlbnRfdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF90cmlkZW50X3NwZGlmX3BvaW50ZXIsCit9OworCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdHJpZGVudF9zcGRpZl83MDE4X29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdHJpZGVudF9zcGRpZl9vcGVuLAorCS5jbG9zZSA9CXNuZF90cmlkZW50X3NwZGlmX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdHJpZGVudF9zcGRpZl9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdHJpZGVudF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3RyaWRlbnRfc3BkaWZfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF90cmlkZW50X3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3BjbV9mcmVlCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZWxlYXNlIHRoZSA0RFdhdmUgcHJpdmF0ZSBkYXRhLgorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHByaXZhdGVfZGF0YSAtIHBvaW50ZXIgdG8gNERXYXZlIGRldmljZSBpbmZvLgorCisgICBSZXR1cm5zOiAgICAgTm9uZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCXRyaWRlbnQtPnBjbSA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X2ZvbGRiYWNrX3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCXRyaWRlbnQtPmZvbGRiYWNrID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfc3BkaWZfcGNtX2ZyZWUoc25kX3BjbV90ICpwY20pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gcGNtLT5wcml2YXRlX2RhdGE7CisJdHJpZGVudC0+c3BkaWYgPSBOVUxMOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfcGNtCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZWdpc3RlcnMgdGhlIDREV2F2ZSBkZXZpY2UgZm9yIFBDTSBzdXBwb3J0LgorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKworICAgUmV0dXJuczogICAgIE5vbmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBfX2RldmluaXQgc25kX3RyaWRlbnRfcGNtKHRyaWRlbnRfdCAqIHRyaWRlbnQsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWlmICgoZXJyID0gc25kX3BjbV9uZXcodHJpZGVudC0+Y2FyZCwgInRyaWRlbnRfZHhfbngiLCBkZXZpY2UsIHRyaWRlbnQtPkNoYW5QQ00sIDEsICZwY20pKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlwY20tPnByaXZhdGVfZGF0YSA9IHRyaWRlbnQ7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9wY21fZnJlZTsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3RyaWRlbnRfbnhfcGxheWJhY2tfb3BzKTsKKwl9IGVsc2UgeworCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3RyaWRlbnRfcGxheWJhY2tfb3BzKTsKKwl9CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCQkJdHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCA/CisJCQkmc25kX3RyaWRlbnRfY2FwdHVyZV9vcHMgOgorCQkJJnNuZF90cmlkZW50X3NpNzAxOF9jYXB0dXJlX29wcyk7CisKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+ZGV2X3N1YmNsYXNzID0gU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYOworCXN0cmNweShwY20tPm5hbWUsICJUcmlkZW50IDREV2F2ZSIpOworCXRyaWRlbnQtPnBjbSA9IHBjbTsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCisJCQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlcyhzdWJzdHJlYW0sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKKwkJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKKwkJCQkJCSAgICAgIDY0KjEwMjQsIDEyOCoxMDI0KTsKKwkJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtLAorCQkJCQkgICAgICBTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKKwkJCQkJICAgICAgNjQqMTAyNCwgMTI4KjEwMjQpOworCX0gZWxzZSB7CisJCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKHRyaWRlbnQtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KTsKKwl9CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9mb2xkYmFja19wY20KKyAgCisgICBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHJlZ2lzdGVycyB0aGUgNERXYXZlIGRldmljZSBmb3IgZm9sZGJhY2sgUENNIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgCisgICBQYXJhbXRlcnM6ICAgdHJpZGVudCAtIHBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBjbGFzcyBmb3IgNERXYXZlLgorCisgICBSZXR1cm5zOiAgICAgTm9uZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IF9fZGV2aW5pdCBzbmRfdHJpZGVudF9mb2xkYmFja19wY20odHJpZGVudF90ICogdHJpZGVudCwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpmb2xkYmFjazsKKwlpbnQgZXJyOworCWludCBudW1fY2hhbiA9IDM7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX05YKQorCQludW1fY2hhbiA9IDQ7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyh0cmlkZW50LT5jYXJkLCAidHJpZGVudF9keF9ueCIsIGRldmljZSwgMCwgbnVtX2NoYW4sICZmb2xkYmFjaykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWZvbGRiYWNrLT5wcml2YXRlX2RhdGEgPSB0cmlkZW50OworCWZvbGRiYWNrLT5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9mb2xkYmFja19wY21fZnJlZTsKKwlpZiAodHJpZGVudC0+dGxiLmVudHJpZXMpCisJCXNuZF9wY21fc2V0X29wcyhmb2xkYmFjaywgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3RyaWRlbnRfbnhfZm9sZGJhY2tfb3BzKTsKKwllbHNlCisJCXNuZF9wY21fc2V0X29wcyhmb2xkYmFjaywgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BzKTsKKwlmb2xkYmFjay0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KGZvbGRiYWNrLT5uYW1lLCAiVHJpZGVudCA0RFdhdmUiKTsKKwlzdWJzdHJlYW0gPSBmb2xkYmFjay0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbTsKKwlzdHJjcHkoc3Vic3RyZWFtLT5uYW1lLCAiRnJvbnQgTWl4ZXIiKTsKKwlzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQ7CisJc3RyY3B5KHN1YnN0cmVhbS0+bmFtZSwgIlJldmVyYiBNaXhlciIpOworCXN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dDsKKwlzdHJjcHkoc3Vic3RyZWFtLT5uYW1lLCAiQ2hvcnVzIE1peGVyIik7CisJaWYgKG51bV9jaGFuID09IDQpIHsKKwkJc3Vic3RyZWFtID0gc3Vic3RyZWFtLT5uZXh0OworCQlzdHJjcHkoc3Vic3RyZWFtLT5uYW1lLCAiU2Vjb25kIEFDJzk3IEFEQyIpOworCX0KKwl0cmlkZW50LT5mb2xkYmFjayA9IGZvbGRiYWNrOworCisJaWYgKHRyaWRlbnQtPnRsYi5lbnRyaWVzKQorCQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKGZvbGRiYWNrLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKHRyaWRlbnQtPnBjaSksIDAsIDEyOCoxMDI0KTsKKwllbHNlCisJCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwoZm9sZGJhY2ssIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gZm9sZGJhY2s7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9zcGRpZgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIHRoZSA0RFdhdmUtTlggZGV2aWNlIGZvciBTUERJRiBzdXBwb3J0LgorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS1OWC4KKworICAgUmV0dXJuczogICAgIE5vbmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBfX2RldmluaXQgc25kX3RyaWRlbnRfc3BkaWZfcGNtKHRyaWRlbnRfdCAqIHRyaWRlbnQsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqc3BkaWY7CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyh0cmlkZW50LT5jYXJkLCAidHJpZGVudF9keF9ueCBJRUM5NTgiLCBkZXZpY2UsIDEsIDAsICZzcGRpZikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNwZGlmLT5wcml2YXRlX2RhdGEgPSB0cmlkZW50OworCXNwZGlmLT5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9zcGRpZl9wY21fZnJlZTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQlzbmRfcGNtX3NldF9vcHMoc3BkaWYsIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfdHJpZGVudF9zcGRpZl9vcHMpOworCX0gZWxzZSB7CisJCXNuZF9wY21fc2V0X29wcyhzcGRpZiwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF90cmlkZW50X3NwZGlmXzcwMThfb3BzKTsKKwl9CisJc3BkaWYtPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShzcGRpZi0+bmFtZSwgIlRyaWRlbnQgNERXYXZlIElFQzk1OCIpOworCXRyaWRlbnQtPnNwZGlmID0gc3BkaWY7CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHNwZGlmLCBTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gc3BkaWY7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTWl4ZXIgcGFydAorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzbmRfdHJpZGVudF9zcGRpZl9jb250cm9sCisKKyAgICBEZXNjcmlwdGlvbjogZW5hYmxlL2Rpc2FibGUgUy9QRElGIG91dCBmcm9tIGFjOTcgbWl4ZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zcGRpZl9jb250cm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfY29udHJvbF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXZhbCA9IHRyaWRlbnQtPnNwZGlmX2N0cmw7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWwgPT0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfY29udHJvbF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCBjaGFuZ2U7CisKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/ICh1bnNpZ25lZCBjaGFyKSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA6IDB4MDA7CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCS8qIFMvUERJRiBDIENoYW5uZWwgYml0cyAwLTMxIDogNDhraHosIFNDTVMgZGlzYWJsZWQgKi8KKwljaGFuZ2UgPSB0cmlkZW50LT5zcGRpZl9jdHJsICE9IHZhbDsKKwl0cmlkZW50LT5zcGRpZl9jdHJsID0gdmFsOworCWlmICh0cmlkZW50LT5kZXZpY2UgIT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4KSB7CisJCWlmICgoaW5iKFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTyArIDMpKSAmIDB4MTApID09IDApIHsKKwkJCW91dGwodHJpZGVudC0+c3BkaWZfYml0cywgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDU1RBVFVTKSk7CisJCQlvdXRiKHRyaWRlbnQtPnNwZGlmX2N0cmwsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTyArIDMpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0cmlkZW50LT5zcGRpZiA9PSBOVUxMKSB7CisJCQl1bnNpZ25lZCBpbnQgdGVtcDsKKwkJCW91dGwodHJpZGVudC0+c3BkaWZfYml0cywgVFJJRF9SRUcodHJpZGVudCwgU0lfU1BESUZfQ1MpKTsKKwkJCXRlbXAgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpICYgflNQRElGX0VOOworCQkJaWYgKHZhbCkKKwkJCQl0ZW1wIHw9IFNQRElGX0VOOworCQkJb3V0bCh0ZW1wLCBUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9zcGRpZl9jb250cm9sIF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssU1dJVENIKSwKKwkuaW5mbyA9CQlzbmRfdHJpZGVudF9zcGRpZl9jb250cm9sX2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF9zcGRpZl9jb250cm9sX2dldCwKKwkucHV0ID0JCXNuZF90cmlkZW50X3NwZGlmX2NvbnRyb2xfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMHgyOCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc25kX3RyaWRlbnRfc3BkaWZfZGVmYXVsdAorCisgICAgRGVzY3JpcHRpb246IHB1dC9nZXQgdGhlIFMvUERJRiBkZWZhdWx0IHNldHRpbmdzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfZGVmYXVsdF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zcGRpZl9kZWZhdWx0X2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAodHJpZGVudC0+c3BkaWZfYml0cyA+PiAwKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAodHJpZGVudC0+c3BkaWZfYml0cyA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAodHJpZGVudC0+c3BkaWZfYml0cyA+PiAxNikgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gKHRyaWRlbnQtPnNwZGlmX2JpdHMgPj4gMjQpICYgMHhmZjsKKwlzcGluX3VubG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zcGRpZl9kZWZhdWx0X3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCkgfAorCSAgICAgICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA8PCAxNikgfAorCSAgICAgICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCWNoYW5nZSA9IHRyaWRlbnQtPnNwZGlmX2JpdHMgIT0gdmFsOworCXRyaWRlbnQtPnNwZGlmX2JpdHMgPSB2YWw7CisJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKwkJaWYgKChpbmIoVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDVFJMX1NQQ1NPICsgMykpICYgMHgxMCkgPT0gMCkKKwkJCW91dGwodHJpZGVudC0+c3BkaWZfYml0cywgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDU1RBVFVTKSk7CisJfSBlbHNlIHsKKwkJaWYgKHRyaWRlbnQtPnNwZGlmID09IE5VTEwpCisJCQlvdXRsKHRyaWRlbnQtPnNwZGlmX2JpdHMsIFRSSURfUkVHKHRyaWRlbnQsIFNJX1NQRElGX0NTKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3RyaWRlbnRfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKKwkuaW5mbyA9CQlzbmRfdHJpZGVudF9zcGRpZl9kZWZhdWx0X2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF9zcGRpZl9kZWZhdWx0X2dldCwKKwkucHV0ID0JCXNuZF90cmlkZW50X3NwZGlmX2RlZmF1bHRfcHV0Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHNuZF90cmlkZW50X3NwZGlmX21hc2sKKworICAgIERlc2NyaXB0aW9uOiBwdXQvZ2V0IHRoZSBTL1BESUYgbWFzaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3NwZGlmX21hc2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3BkaWZfbWFza19nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9zcGRpZl9tYXNrIF9fZGV2aW5pdGRhdGEgPQoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxNQVNLKSwKKwkuaW5mbyA9CQlzbmRfdHJpZGVudF9zcGRpZl9tYXNrX2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF9zcGRpZl9tYXNrX2dldCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc25kX3RyaWRlbnRfc3BkaWZfc3RyZWFtCisKKyAgICBEZXNjcmlwdGlvbjogcHV0L2dldCB0aGUgUy9QRElGIHN0cmVhbSBzZXR0aW5ncworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3NwZGlmX3N0cmVhbV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zcGRpZl9zdHJlYW1fZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gKHRyaWRlbnQtPnNwZGlmX3BjbV9iaXRzID4+IDApICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9ICh0cmlkZW50LT5zcGRpZl9wY21fYml0cyA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAodHJpZGVudC0+c3BkaWZfcGNtX2JpdHMgPj4gMTYpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9ICh0cmlkZW50LT5zcGRpZl9wY21fYml0cyA+PiAyNCkgJiAweGZmOworCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3NwZGlmX3N0cmVhbV9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCkgfAorCSAgICAgICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA8PCAxNikgfAorCSAgICAgICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCWNoYW5nZSA9IHRyaWRlbnQtPnNwZGlmX3BjbV9iaXRzICE9IHZhbDsKKwl0cmlkZW50LT5zcGRpZl9wY21fYml0cyA9IHZhbDsKKwlpZiAodHJpZGVudC0+c3BkaWYgIT0gTlVMTCkgeworCQlpZiAodHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQkJb3V0bCh0cmlkZW50LT5zcGRpZl9wY21fYml0cywgVFJJRF9SRUcodHJpZGVudCwgTlhfU1BDU1RBVFVTKSk7CisJCX0gZWxzZSB7CisJCQlvdXRsKHRyaWRlbnQtPnNwZGlmX2JpdHMsIFRSSURfUkVHKHRyaWRlbnQsIFNJX1NQRElGX0NTKSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9zcGRpZl9zdHJlYW0gX19kZXZpbml0ZGF0YSA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUENNX1NUUkVBTSksCisJLmluZm8gPQkJc25kX3RyaWRlbnRfc3BkaWZfc3RyZWFtX2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF9zcGRpZl9zdHJlYW1fZ2V0LAorCS5wdXQgPQkJc25kX3RyaWRlbnRfc3BkaWZfc3RyZWFtX3B1dAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzbmRfdHJpZGVudF9hYzk3X2NvbnRyb2wKKworICAgIERlc2NyaXB0aW9uOiBlbmFibGUvZGlzYWJsZSByZWFyIHBhdGggZm9yIGFjOTcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9hYzk3X2NvbnRyb2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9hYzk3X2NvbnRyb2xfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXZhbCA9IHRyaWRlbnQtPmFjOTdfY3RybCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh2YWwgJiAoMSA8PCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkpID8gMSA6IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfYWM5N19jb250cm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgY2hhbmdlID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwl2YWwgPSB0cmlkZW50LT5hYzk3X2N0cmwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CisJdmFsICY9IH4oMSA8PCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl2YWwgfD0gMSA8PCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwljaGFuZ2UgPSB2YWwgIT0gdHJpZGVudC0+YWM5N19jdHJsOworCXRyaWRlbnQtPmFjOTdfY3RybCA9IHZhbDsKKwlvdXRsKHRyaWRlbnQtPmFjOTdfY3RybCA9IHZhbCwgVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9hYzk3X3JlYXJfY29udHJvbCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIlJlYXIgUGF0aCIsCisJLmluZm8gPQkJc25kX3RyaWRlbnRfYWM5N19jb250cm9sX2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF9hYzk3X2NvbnRyb2xfZ2V0LAorCS5wdXQgPQkJc25kX3RyaWRlbnRfYWM5N19jb250cm9sX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IDQsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHNuZF90cmlkZW50X3ZvbF9jb250cm9sCisKKyAgICBEZXNjcmlwdGlvbjogd2F2ZSAmIG11c2ljIHZvbHVtZSBjb250cm9sCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfdm9sX2NvbnRyb2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMjU1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3ZvbF9jb250cm9sX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSAgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gdHJpZGVudC0+bXVzaWN2b2xfd2F2ZXZvbDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI1NSAtICgodmFsID4+IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSAmIDB4ZmYpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gMjU1IC0gKCh2YWwgPj4gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICsgOCkpICYgMHhmZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfdm9sX2NvbnRyb2xfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJdmFsID0gdHJpZGVudC0+bXVzaWN2b2xfd2F2ZXZvbDsKKwl2YWwgJj0gfigweGZmZmYgPDwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCXZhbCB8PSAoKDI1NSAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4ZmYpKSB8CisJICAgICAgICAoKDI1NSAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIDB4ZmYpKSA8PCA4KSkgPDwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJY2hhbmdlID0gdmFsICE9IHRyaWRlbnQtPm11c2ljdm9sX3dhdmV2b2w7CisJb3V0bCh0cmlkZW50LT5tdXNpY3ZvbF93YXZldm9sID0gdmFsLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOworCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3RyaWRlbnRfdm9sX211c2ljX2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgICJNdXNpYyBQbGF5YmFjayBWb2x1bWUiLAorCS5pbmZvID0JCXNuZF90cmlkZW50X3ZvbF9jb250cm9sX2luZm8sCisJLmdldCA9CQlzbmRfdHJpZGVudF92b2xfY29udHJvbF9nZXQsCisJLnB1dCA9CQlzbmRfdHJpZGVudF92b2xfY29udHJvbF9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAxNiwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3RyaWRlbnRfdm9sX3dhdmVfY29udHJvbCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIldhdmUgUGxheWJhY2sgVm9sdW1lIiwKKwkuaW5mbyA9CQlzbmRfdHJpZGVudF92b2xfY29udHJvbF9pbmZvLAorCS5nZXQgPQkJc25kX3RyaWRlbnRfdm9sX2NvbnRyb2xfZ2V0LAorCS5wdXQgPQkJc25kX3RyaWRlbnRfdm9sX2NvbnRyb2xfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc25kX3RyaWRlbnRfcGNtX3ZvbF9jb250cm9sCisKKyAgICBEZXNjcmlwdGlvbjogUENNIGZyb250IHZvbHVtZSBjb250cm9sCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX3ZvbF9jb250cm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI1NTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkKKwkJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTAyMzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9wY21fdm9sX2NvbnRyb2xfZ2V0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCSAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNuZF90cmlkZW50X3BjbV9taXhlcl90ICptaXggPSAmdHJpZGVudC0+cGNtX21peGVyW3NuZF9jdGxfZ2V0X2lvZmZudW0oa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpXTsKKworCWlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4KSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTAyMyAtIG1peC0+dm9sOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjU1IC0gKG1peC0+dm9sPj4yKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX3ZvbF9jb250cm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqbWl4ID0gJnRyaWRlbnQtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmbnVtKGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlID0gMDsKKworCWlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4KSB7CisJCXZhbCA9IDEwMjMgLSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxMDIzKTsKKwl9IGVsc2UgeworCQl2YWwgPSAoMjU1IC0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMjU1KSkgPDwgMjsKKwl9CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCWNoYW5nZSA9IHZhbCAhPSBtaXgtPnZvbDsKKwltaXgtPnZvbCA9IHZhbDsKKwlpZiAobWl4LT52b2ljZSAhPSBOVUxMKQorCQlzbmRfdHJpZGVudF93cml0ZV92b2xfcmVnKHRyaWRlbnQsIG1peC0+dm9pY2UsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9wY21fdm9sX2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgICJQQ00gRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuY291bnQgPQkzMiwKKwkuaW5mbyA9CQlzbmRfdHJpZGVudF9wY21fdm9sX2NvbnRyb2xfaW5mbywKKwkuZ2V0ID0JCXNuZF90cmlkZW50X3BjbV92b2xfY29udHJvbF9nZXQsCisJLnB1dCA9CQlzbmRfdHJpZGVudF9wY21fdm9sX2NvbnRyb2xfcHV0LAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzbmRfdHJpZGVudF9wY21fcGFuX2NvbnRyb2wKKworICAgIERlc2NyaXB0aW9uOiBQQ00gZnJvbnQgcGFuIGNvbnRyb2wKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9wY21fcGFuX2NvbnRyb2xfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTI3OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3BjbV9wYW5fY29udHJvbF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKm1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc25kX2N0bF9nZXRfaW9mZm51bShrY29udHJvbCwgJnVjb250cm9sLT5pZCldOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtaXgtPnBhbjsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweDQwKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKDB4M2YgLSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweDNmKSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gfD0gMHg0MDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX3Bhbl9jb250cm9sX3B1dChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqbWl4ID0gJnRyaWRlbnQtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmbnVtKGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweDQwKQorCQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4M2Y7CisJZWxzZQorCQl2YWwgPSAoMHgzZiAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4M2YpKSB8IDB4NDA7CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCWNoYW5nZSA9IHZhbCAhPSBtaXgtPnBhbjsKKwltaXgtPnBhbiA9IHZhbDsKKwlpZiAobWl4LT52b2ljZSAhPSBOVUxMKQorCQlzbmRfdHJpZGVudF93cml0ZV9wYW5fcmVnKHRyaWRlbnQsIG1peC0+dm9pY2UsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9wY21fcGFuX2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAgICAgICAgICJQQ00gUGFuIFBsYXliYWNrIENvbnRyb2wiLAorCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFLAorCS5jb3VudCA9CTMyLAorCS5pbmZvID0JCXNuZF90cmlkZW50X3BjbV9wYW5fY29udHJvbF9pbmZvLAorCS5nZXQgPQkJc25kX3RyaWRlbnRfcGNtX3Bhbl9jb250cm9sX2dldCwKKwkucHV0ID0JCXNuZF90cmlkZW50X3BjbV9wYW5fY29udHJvbF9wdXQsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHNuZF90cmlkZW50X3BjbV9ydm9sX2NvbnRyb2wKKworICAgIERlc2NyaXB0aW9uOiBQQ00gcmV2ZXJiIHZvbHVtZSBjb250cm9sCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbF9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqIHVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxMjc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbF9nZXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNuZF90cmlkZW50X3BjbV9taXhlcl90ICptaXggPSAmdHJpZGVudC0+cGNtX21peGVyW3NuZF9jdGxfZ2V0X2lvZmZudW0oa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpXTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTI3IC0gbWl4LT5ydm9sOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3BjbV9ydm9sX2NvbnRyb2xfcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCSAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqbWl4ID0gJnRyaWRlbnQtPnBjbV9taXhlcltzbmRfY3RsX2dldF9pb2ZmbnVtKGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKV07CisJdW5zaWduZWQgc2hvcnQgdmFsOworCWludCBjaGFuZ2UgPSAwOworCisJdmFsID0gMHg3ZiAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4N2YpOworCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwljaGFuZ2UgPSB2YWwgIT0gbWl4LT5ydm9sOworCW1peC0+cnZvbCA9IHZhbDsKKwlpZiAobWl4LT52b2ljZSAhPSBOVUxMKQorCQlzbmRfdHJpZGVudF93cml0ZV9ydm9sX3JlZyh0cmlkZW50LCBtaXgtPnZvaWNlLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbCBfX2RldmluaXRkYXRhID0KK3sKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIlBDTSBSZXZlcmIgUGxheWJhY2sgVm9sdW1lIiwKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuY291bnQgPSAJMzIsCisJLmluZm8gPQkJc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbF9pbmZvLAorCS5nZXQgPQkJc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbF9nZXQsCisJLnB1dCA9CQlzbmRfdHJpZGVudF9wY21fcnZvbF9jb250cm9sX3B1dCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc25kX3RyaWRlbnRfcGNtX2N2b2xfY29udHJvbAorCisgICAgRGVzY3JpcHRpb246IFBDTSBjaG9ydXMgdm9sdW1lIGNvbnRyb2wKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9wY21fY3ZvbF9jb250cm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDEyNzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9wY21fY3ZvbF9jb250cm9sX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQkgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKm1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc25kX2N0bF9nZXRfaW9mZm51bShrY29udHJvbCwgJnVjb250cm9sLT5pZCldOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxMjcgLSBtaXgtPmN2b2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfcGNtX2N2b2xfY29udHJvbF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXNuZF90cmlkZW50X3BjbV9taXhlcl90ICptaXggPSAmdHJpZGVudC0+cGNtX21peGVyW3NuZF9jdGxfZ2V0X2lvZmZudW0oa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpXTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJaW50IGNoYW5nZSA9IDA7CisKKwl2YWwgPSAweDdmIC0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMHg3Zik7CisJc3Bpbl9sb2NrX2lycSgmdHJpZGVudC0+cmVnX2xvY2spOworCWNoYW5nZSA9IHZhbCAhPSBtaXgtPmN2b2w7CisJbWl4LT5jdm9sID0gdmFsOworCWlmIChtaXgtPnZvaWNlICE9IE5VTEwpCisJCXNuZF90cmlkZW50X3dyaXRlX2N2b2xfcmVnKHRyaWRlbnQsIG1peC0+dm9pY2UsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmlkZW50LT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdHJpZGVudF9wY21fY3ZvbF9jb250cm9sIF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiUENNIENob3J1cyBQbGF5YmFjayBWb2x1bWUiLAorCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFLAorCS5jb3VudCA9CTMyLAorCS5pbmZvID0JCXNuZF90cmlkZW50X3BjbV9jdm9sX2NvbnRyb2xfaW5mbywKKwkuZ2V0ID0JCXNuZF90cmlkZW50X3BjbV9jdm9sX2NvbnRyb2xfZ2V0LAorCS5wdXQgPQkJc25kX3RyaWRlbnRfcGNtX2N2b2xfY29udHJvbF9wdXQsCit9OworCitzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9ub3RpZnlfcGNtX2NoYW5nZTEoc25kX2NhcmRfdCAqIGNhcmQsIHNuZF9rY29udHJvbF90ICprY3RsLCBpbnQgbnVtLCBpbnQgYWN0aXZhdGUpCit7CisJc25kX2N0bF9lbGVtX2lkX3QgaWQ7CisKKwlzbmRfcnVudGltZV9jaGVjayhrY3RsICE9IE5VTEwsIHJldHVybik7CisJaWYgKGFjdGl2YXRlKQorCQlrY3RsLT52ZFtudW1dLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCWVsc2UKKwkJa2N0bC0+dmRbbnVtXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCXNuZF9jdGxfbm90aWZ5KGNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKKwkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sCisJCSAgICAgICBzbmRfY3RsX2J1aWxkX2lvZmYoJmlkLCBrY3RsLCBudW0pKTsKK30KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfbm90aWZ5X3BjbV9jaGFuZ2UodHJpZGVudF90ICp0cmlkZW50LCBzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqdG1peCwgaW50IG51bSwgaW50IGFjdGl2YXRlKQoreworCXNuZF90cmlkZW50X25vdGlmeV9wY21fY2hhbmdlMSh0cmlkZW50LT5jYXJkLCB0cmlkZW50LT5jdGxfdm9sLCBudW0sIGFjdGl2YXRlKTsKKwlzbmRfdHJpZGVudF9ub3RpZnlfcGNtX2NoYW5nZTEodHJpZGVudC0+Y2FyZCwgdHJpZGVudC0+Y3RsX3BhbiwgbnVtLCBhY3RpdmF0ZSk7CisJc25kX3RyaWRlbnRfbm90aWZ5X3BjbV9jaGFuZ2UxKHRyaWRlbnQtPmNhcmQsIHRyaWRlbnQtPmN0bF9ydm9sLCBudW0sIGFjdGl2YXRlKTsKKwlzbmRfdHJpZGVudF9ub3RpZnlfcGNtX2NoYW5nZTEodHJpZGVudC0+Y2FyZCwgdHJpZGVudC0+Y3RsX2N2b2wsIG51bSwgYWN0aXZhdGUpOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3BjbV9taXhlcl9idWlsZCh0cmlkZW50X3QgKnRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKnRtaXg7CisKKwlzbmRfYXNzZXJ0KHRyaWRlbnQgIT0gTlVMTCAmJiB2b2ljZSAhPSBOVUxMICYmIHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJdG1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCXRtaXgtPnZvaWNlID0gdm9pY2U7CisJdG1peC0+dm9sID0gVDREX0RFRkFVTFRfUENNX1ZPTDsKKwl0bWl4LT5wYW4gPSBUNERfREVGQVVMVF9QQ01fUEFOOworCXRtaXgtPnJ2b2wgPSBUNERfREVGQVVMVF9QQ01fUlZPTDsKKwl0bWl4LT5jdm9sID0gVDREX0RFRkFVTFRfUENNX0NWT0w7CisJc25kX3RyaWRlbnRfbm90aWZ5X3BjbV9jaGFuZ2UodHJpZGVudCwgdG1peCwgc3Vic3RyZWFtLT5udW1iZXIsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3BjbV9taXhlcl9mcmVlKHRyaWRlbnRfdCAqdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2UsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqdG1peDsKKworCXNuZF9hc3NlcnQodHJpZGVudCAhPSBOVUxMICYmIHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJdG1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOworCXRtaXgtPnZvaWNlID0gTlVMTDsKKwlzbmRfdHJpZGVudF9ub3RpZnlfcGNtX2NoYW5nZSh0cmlkZW50LCB0bWl4LCBzdWJzdHJlYW0tPm51bWJlciwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9taXhlcgorICAKKyAgIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIHRoZSA0RFdhdmUgZGV2aWNlIGZvciBtaXhlciBzdXBwb3J0LgorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKworICAgUmV0dXJuczogICAgIE5vbmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF90cmlkZW50X21peGVyKHRyaWRlbnRfdCAqIHRyaWRlbnQsIGludCBwY21fc3BkaWZfZGV2aWNlKQoreworCWFjOTdfdGVtcGxhdGVfdCBfYWM5NzsKKwlzbmRfY2FyZF90ICogY2FyZCA9IHRyaWRlbnQtPmNhcmQ7CisJc25kX2tjb250cm9sX3QgKmtjdGw7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjdGw7CisJaW50IGlkeCwgZXJyLCByZXRyaWVzID0gMjsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSBzbmRfdHJpZGVudF9jb2RlY193cml0ZSwKKwkJLnJlYWQgPSBzbmRfdHJpZGVudF9jb2RlY19yZWFkLAorCX07CisKKwl1Y3RsID0ga2NhbGxvYygxLCBzaXplb2YoKnVjdGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVjdGwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlcnIgPSBzbmRfYWM5N19idXModHJpZGVudC0+Y2FyZCwgMCwgJm9wcywgTlVMTCwgJnRyaWRlbnQtPmFjOTdfYnVzKSkgPCAwKQorCQlnb3RvIF9fb3V0OworCisJbWVtc2V0KCZfYWM5NywgMCwgc2l6ZW9mKF9hYzk3KSk7CisJX2FjOTcucHJpdmF0ZV9kYXRhID0gdHJpZGVudDsKKwl0cmlkZW50LT5hYzk3X2RldGVjdCA9IDE7CisKKyAgICAgIF9fYWdhaW46CisJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcih0cmlkZW50LT5hYzk3X2J1cywgJl9hYzk3LCAmdHJpZGVudC0+YWM5NykpIDwgMCkgeworCQlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQkJaWYgKChlcnIgPSBzbmRfdHJpZGVudF9zaXNfcmVzZXQodHJpZGVudCkpIDwgMCkKKwkJCQlnb3RvIF9fb3V0OworCQkJaWYgKHJldHJpZXMtLSA+IDApCisJCQkJZ290byBfX2FnYWluOworCQkJZXJyID0gLUVJTzsKKwkJfQorCQlnb3RvIF9fb3V0OworCX0KKwkKKwkvKiBzZWNvbmRhcnkgY29kZWM/ICovCisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTggJiYKKwkgICAgKGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkgJiBTSV9BQzk3X1BSSU1BUllfUkVBRFkpICE9IDApIHsKKwkJX2FjOTcubnVtID0gMTsKKwkJZXJyID0gc25kX2FjOTdfbWl4ZXIodHJpZGVudC0+YWM5N19idXMsICZfYWM5NywgJnRyaWRlbnQtPmFjOTdfc2VjKTsKKwkJaWYgKGVyciA8IDApCisJCQlzbmRfcHJpbnRrKCJTSTcwMTg6IHRoZSBzZWNvbmRhcnkgY29kZWMgLSBpbnZhbGlkIGFjY2Vzc1xuIik7CisjaWYgMAkvLyBvbmx5IGZvciBteSB0ZXN0aW5nIHB1cnBvc2UgLS1qaworCQl7CisJCQlhYzk3X3QgKm1jOTc7CisJCQllcnIgPSBzbmRfYWM5N19tb2RlbSh0cmlkZW50LT5jYXJkLCAmX2FjOTcsICZtYzk3KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXNuZF9wcmludGsoInNuZF9hYzk3X21vZGVtIHJldHVybmVkIGVycm9yICVpXG4iLCBlcnIpOworCQl9CisjZW5kaWYKKwl9CisJCisJdHJpZGVudC0+YWM5N19kZXRlY3QgPSAwOworCisJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF92b2xfd2F2ZV9jb250cm9sLCB0cmlkZW50KSkpIDwgMCkKKwkJCWdvdG8gX19vdXQ7CisJCWtjdGwtPnB1dChrY3RsLCB1Y3RsKTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF92b2xfbXVzaWNfY29udHJvbCwgdHJpZGVudCkpKSA8IDApCisJCQlnb3RvIF9fb3V0OworCQlrY3RsLT5wdXQoa2N0bCwgdWN0bCk7CisJCW91dGwodHJpZGVudC0+bXVzaWN2b2xfd2F2ZXZvbCA9IDB4MDAwMDAwMDAsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CisJfSBlbHNlIHsKKwkJb3V0bCh0cmlkZW50LT5tdXNpY3ZvbF93YXZldm9sID0gMHhmZmZmMDAwMCwgVFJJRF9SRUcodHJpZGVudCwgVDREX01VU0lDVk9MX1dBVkVWT0wpKTsKKwl9CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykgeworCQlzbmRfdHJpZGVudF9wY21fbWl4ZXJfdCAqdG1peDsKKwkJCisJCXRtaXggPSAmdHJpZGVudC0+cGNtX21peGVyW2lkeF07CisJCXRtaXgtPnZvaWNlID0gTlVMTDsKKwl9CisJaWYgKCh0cmlkZW50LT5jdGxfdm9sID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF9wY21fdm9sX2NvbnRyb2wsIHRyaWRlbnQpKSA9PSBOVUxMKQorCQlnb3RvIF9fbm9tZW07CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCB0cmlkZW50LT5jdGxfdm9sKSkpCisJCWdvdG8gX19vdXQ7CisJCQorCWlmICgodHJpZGVudC0+Y3RsX3BhbiA9IHNuZF9jdGxfbmV3MSgmc25kX3RyaWRlbnRfcGNtX3Bhbl9jb250cm9sLCB0cmlkZW50KSkgPT0gTlVMTCkKKwkJZ290byBfX25vbWVtOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgdHJpZGVudC0+Y3RsX3BhbikpKQorCQlnb3RvIF9fb3V0OworCisJaWYgKCh0cmlkZW50LT5jdGxfcnZvbCA9IHNuZF9jdGxfbmV3MSgmc25kX3RyaWRlbnRfcGNtX3J2b2xfY29udHJvbCwgdHJpZGVudCkpID09IE5VTEwpCisJCWdvdG8gX19ub21lbTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHRyaWRlbnQtPmN0bF9ydm9sKSkpCisJCWdvdG8gX19vdXQ7CisKKwlpZiAoKHRyaWRlbnQtPmN0bF9jdm9sID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF9wY21fY3ZvbF9jb250cm9sLCB0cmlkZW50KSkgPT0gTlVMTCkKKwkJZ290byBfX25vbWVtOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgdHJpZGVudC0+Y3RsX2N2b2wpKSkKKwkJZ290byBfX291dDsKKworCWlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfTlgpIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF9hYzk3X3JlYXJfY29udHJvbCwgdHJpZGVudCkpKSA8IDApCisJCQlnb3RvIF9fb3V0OworCQlrY3RsLT5wdXQoa2N0bCwgdWN0bCk7CisJfQorCWlmICh0cmlkZW50LT5kZXZpY2UgPT0gVFJJREVOVF9ERVZJQ0VfSURfTlggfHwgdHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF90cmlkZW50X3NwZGlmX2NvbnRyb2wsIHRyaWRlbnQpOworCQlpZiAoa2N0bCA9PSBOVUxMKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBfX291dDsKKwkJfQorCQlpZiAodHJpZGVudC0+YWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikKKwkJCWtjdGwtPmlkLmluZGV4Kys7CisJCWlmICh0cmlkZW50LT5hYzk3X3NlYyAmJiAodHJpZGVudC0+YWM5N19zZWMtPmV4dF9pZCAmIEFDOTdfRUlfU1BESUYpKQorCQkJa2N0bC0+aWQuaW5kZXgrKzsKKwkJaWR4ID0ga2N0bC0+aWQuaW5kZXg7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKKwkJCWdvdG8gX19vdXQ7CisJCWtjdGwtPnB1dChrY3RsLCB1Y3RsKTsKKworCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfdHJpZGVudF9zcGRpZl9kZWZhdWx0LCB0cmlkZW50KTsKKwkJaWYgKGtjdGwgPT0gTlVMTCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gX19vdXQ7CisJCX0KKwkJa2N0bC0+aWQuaW5kZXggPSBpZHg7CisJCWtjdGwtPmlkLmRldmljZSA9IHBjbV9zcGRpZl9kZXZpY2U7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKKwkJCWdvdG8gX19vdXQ7CisKKwkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3RyaWRlbnRfc3BkaWZfbWFzaywgdHJpZGVudCk7CisJCWlmIChrY3RsID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIF9fb3V0OworCQl9CisJCWtjdGwtPmlkLmluZGV4ID0gaWR4OworCQlrY3RsLT5pZC5kZXZpY2UgPSBwY21fc3BkaWZfZGV2aWNlOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApCisJCQlnb3RvIF9fb3V0OworCisJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF90cmlkZW50X3NwZGlmX3N0cmVhbSwgdHJpZGVudCk7CisJCWlmIChrY3RsID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIF9fb3V0OworCQl9CisJCWtjdGwtPmlkLmluZGV4ID0gaWR4OworCQlrY3RsLT5pZC5kZXZpY2UgPSBwY21fc3BkaWZfZGV2aWNlOworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApCisJCQlnb3RvIF9fb3V0OworCQl0cmlkZW50LT5zcGRpZl9wY21fY3RsID0ga2N0bDsKKwl9CisKKwllcnIgPSAwOworCWdvdG8gX19vdXQ7CisKKyBfX25vbWVtOgorCWVyciA9IC1FTk9NRU07CisKKyBfX291dDoKKwlrZnJlZSh1Y3RsKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBnYW1lcG9ydCBpbnRlcmZhY2UKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX3RyaWRlbnRfZ2FtZXBvcnRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCXRyaWRlbnRfdCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOworCisJc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisJcmV0dXJuIGluYihUUklEX1JFRyhjaGlwLCBHQU1FUE9SVF9MRUdBQ1kpKTsKK30KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfZ2FtZXBvcnRfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQoreworCXRyaWRlbnRfdCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOworCisJc25kX2Fzc2VydChjaGlwLCByZXR1cm4pOworCW91dGIoMHhmZiwgVFJJRF9SRUcoY2hpcCwgR0FNRVBPUlRfTEVHQUNZKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfZ2FtZXBvcnRfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCit7CisJdHJpZGVudF90ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CisJaW50IGk7CisKKwlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybiAwKTsKKworCSpidXR0b25zID0gKH5pbmIoVFJJRF9SRUcoY2hpcCwgR0FNRVBPUlRfTEVHQUNZKSkgPj4gNCkgJiAweGY7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWF4ZXNbaV0gPSBpbncoVFJJRF9SRUcoY2hpcCwgR0FNRVBPUlRfQVhFUyArIGkgKiAyKSk7CisJCWlmIChheGVzW2ldID09IDB4ZmZmZikgYXhlc1tpXSA9IC0xOworCX0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2dhbWVwb3J0X29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCit7CisJdHJpZGVudF90ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CisKKwlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybiAwKTsKKworCXN3aXRjaCAobW9kZSkgeworCQljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgorCQkJb3V0YihHQU1FUE9SVF9NT0RFX0FEQywgVFJJRF9SRUcoY2hpcCwgR0FNRVBPUlRfR0NSKSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEgKyAyMCAqIEhaIC8gMTAwMCk7IC8qIDIwbXNlYyAqLworCQkJcmV0dXJuIDA7CisJCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CisJCQlvdXRiKDAsIFRSSURfUkVHKGNoaXAsIEdBTUVQT1JUX0dDUikpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJfQorfQorCitpbnQgX19kZXZpbml0IHNuZF90cmlkZW50X2NyZWF0ZV9nYW1lcG9ydCh0cmlkZW50X3QgKmNoaXApCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKworCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJUcmlkZW50IDREV2F2ZSIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJZ2FtZXBvcnRfc2V0X2Rldl9wYXJlbnQoZ3AsICZjaGlwLT5wY2ktPmRldik7CisKKwlnYW1lcG9ydF9zZXRfcG9ydF9kYXRhKGdwLCBjaGlwKTsKKwlncC0+ZnV6eiA9IDY0OworCWdwLT5yZWFkID0gc25kX3RyaWRlbnRfZ2FtZXBvcnRfcmVhZDsKKwlncC0+dHJpZ2dlciA9IHNuZF90cmlkZW50X2dhbWVwb3J0X3RyaWdnZXI7CisJZ3AtPmNvb2tlZF9yZWFkID0gc25kX3RyaWRlbnRfZ2FtZXBvcnRfY29va2VkX3JlYWQ7CisJZ3AtPm9wZW4gPSBzbmRfdHJpZGVudF9nYW1lcG9ydF9vcGVuOworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF90cmlkZW50X2ZyZWVfZ2FtZXBvcnQodHJpZGVudF90ICpjaGlwKQoreworCWlmIChjaGlwLT5nYW1lcG9ydCkgeworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoY2hpcC0+Z2FtZXBvcnQpOworCQljaGlwLT5nYW1lcG9ydCA9IE5VTEw7CisJfQorfQorI2Vsc2UKK2ludCBfX2RldmluaXQgc25kX3RyaWRlbnRfY3JlYXRlX2dhbWVwb3J0KHRyaWRlbnRfdCAqY2hpcCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNuZF90cmlkZW50X2ZyZWVfZ2FtZXBvcnQodHJpZGVudF90ICpjaGlwKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfR0FNRVBPUlQgKi8KKworLyoKKyAqIGRlbGF5IGZvciAxIHRpY2sKKyAqLworaW5saW5lIHN0YXRpYyB2b2lkIGRvX2RlbGF5KHRyaWRlbnRfdCAqY2hpcCkKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCgxKTsKK30KKworLyoKKyAqICBTaVMgcmVzZXQgcm91dGluZQorICovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc2lzX3Jlc2V0KHRyaWRlbnRfdCAqdHJpZGVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lOworCXVuc2lnbmVkIGludCBpOworCWludCByOworCisJciA9IHRyaWRlbnQtPmluX3N1c3BlbmQgPyAwIDogMjsJLyogY291bnQgb2YgcmV0cmllcyAqLworICAgICAgX19zaTcwMThfcmV0cnk6CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHRyaWRlbnQtPnBjaSwgMHg0NiwgMHgwNCk7CS8qIFNPRlRXQVJFIFJFU0VUICovCisJdWRlbGF5KDEwMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHRyaWRlbnQtPnBjaSwgMHg0NiwgMHgwMCk7CisJdWRlbGF5KDEwMCk7CisJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCisJb3V0YigweDAwLCBUUklEX1JFRyh0cmlkZW50LCBTSV9BQzk3X0dQSU8pKTsKKwkvKiBpbml0aWFsaXplIHNlcmlhbCBpbnRlcmZhY2UsIGZvcmNlIGNvbGQgcmVzZXQgKi8KKwlpID0gUENNT1VUfFNVUlJPVVR8Q0VOVEVST1VUfExGRU9VVHxTRUNPTkRBUllfSUR8Q09MRF9SRVNFVDsKKwlvdXRsKGksIFRSSURfUkVHKHRyaWRlbnQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKKwl1ZGVsYXkoMTAwMCk7CisJLyogcmVtb3ZlIGNvbGQgcmVzZXQgKi8KKwlpICY9IH5DT0xEX1JFU0VUOworCW91dGwoaSwgVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCXVkZWxheSgyMDAwKTsKKwkvKiB3YWl0LCB1bnRpbCB0aGUgY29kZWMgaXMgcmVhZHkgKi8KKwllbmRfdGltZSA9IChqaWZmaWVzICsgKEhaICogMykgLyA0KSArIDE7CisJZG8geworCQlpZiAoKGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkgJiBTSV9BQzk3X1BSSU1BUllfUkVBRFkpICE9IDApCisJCQlnb3RvIF9fc2k3MDE4X29rOworCQlkb19kZWxheSh0cmlkZW50KTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7CisJc25kX3ByaW50aygiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpKTsKKwlpZiAoci0tID4gMCkgeworCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJZG8geworCQkJZG9fZGVsYXkodHJpZGVudCk7CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwkJZ290byBfX3NpNzAxOF9yZXRyeTsKKwl9CisgICAgICBfX3NpNzAxOF9vazoKKwkvKiB3YWl0IGZvciB0aGUgc2Vjb25kIGNvZGVjICovCisJZG8geworCQlpZiAoKGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkgJiBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWSkgIT0gMCkKKwkJCWJyZWFrOworCQlkb19kZWxheSh0cmlkZW50KTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7CisJLyogZW5hYmxlIDY0IGNoYW5uZWwgbW9kZSAqLworCW91dGwoQkFOS19CX0VOLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOworCXJldHVybiAwOworfQorCisvKiAgCisgKiAgL3Byb2MgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfcHJvY19yZWFkKHNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCAKKwkJCQkgIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJY2hhciAqczsKKworCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6CisJCXMgPSAiU2lTIDcwMTggQXVkaW8iOworCQlicmVhazsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX0RYOgorCQlzID0gIlRyaWRlbnQgNERXYXZlIFBDSSBEWCI7CisJCWJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CisJCXMgPSAiVHJpZGVudCA0RFdhdmUgUENJIE5YIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICI/Pz8iOworCX0KKwlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuXG4iLCBzKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTcHVyaW91cyBJUlFzICAgIDogJWRcbiIsIHRyaWRlbnQtPnNwdXJpb3VzX2lycV9jb3VudCk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiU3B1cmlvdXMgSVJRIGRsdGE6ICVkXG4iLCB0cmlkZW50LT5zcHVyaW91c19pcnFfbWF4X2RlbHRhKTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX05YIHx8IHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBNaXhlciBPdXQgOiAlc1xuIiwgdHJpZGVudC0+c3BkaWZfY3RybCA9PSAweDI4ID8gIm9uIiA6ICJvZmYiKTsKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX05YKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJlYXIgU3BlYWtlcnMgICAgOiAlc1xuIiwgdHJpZGVudC0+YWM5N19jdHJsICYgMHgwMDAwMDAxMCA/ICJvbiIgOiAib2ZmIik7CisJCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQkJc25kX2lwcmludGYoYnVmZmVyLCJcblZpcnR1YWwgTWVtb3J5XG4iKTsKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1lbW9yeSBNYXhpbXVtIDogJWRcbiIsIHRyaWRlbnQtPnRsYi5tZW1oZHItPnNpemUpOworCQkJc25kX2lwcmludGYoYnVmZmVyLCAiTWVtb3J5IFVzZWQgICAgOiAlZFxuIiwgdHJpZGVudC0+dGxiLm1lbWhkci0+dXNlZCk7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJNZW1vcnkgRnJlZSAgICA6ICVkXG4iLCBzbmRfdXRpbF9tZW1fYXZhaWwodHJpZGVudC0+dGxiLm1lbWhkcikpOworCQl9CisJfQorI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUl9NT0RVTEUpKQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG5XYXZldGFibGUgU3ludGhcbiIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1lbW9yeSBNYXhpbXVtIDogJWRcbiIsIHRyaWRlbnQtPnN5bnRoLm1heF9zaXplKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJNZW1vcnkgVXNlZCAgICA6ICVkXG4iLCB0cmlkZW50LT5zeW50aC5jdXJyZW50X3NpemUpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk1lbW9yeSBGcmVlICAgIDogJWRcbiIsICh0cmlkZW50LT5zeW50aC5tYXhfc2l6ZS10cmlkZW50LT5zeW50aC5jdXJyZW50X3NpemUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3RyaWRlbnRfcHJvY19pbml0KHRyaWRlbnRfdCAqIHRyaWRlbnQpCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJY29uc3QgY2hhciAqcyA9ICJ0cmlkZW50IjsKKwkKKwlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkKKwkJcyA9ICJzaXM3MDE4IjsKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyh0cmlkZW50LT5jYXJkLCBzLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHRyaWRlbnQsIDEwMjQsIHNuZF90cmlkZW50X3Byb2NfcmVhZCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJdHJpZGVudF90ICp0cmlkZW50ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX3RyaWRlbnRfZnJlZSh0cmlkZW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNuZF90cmlkZW50X3RsYl9hbGxvYworICAKKyAgIERlc2NyaXB0aW9uOiBBbGxvY2F0ZSBhbmQgc2V0IHVwIHRoZSBUTEIgcGFnZSB0YWJsZSBvbiA0RCBOWC4KKwkJRWFjaCBlbnRyeSBoYXMgNCBieXRlcyAocGh5c2ljYWwgUENJIGFkZHJlc3MpLgorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgLSBwb2ludGVyIHRvIHRhcmdldCBkZXZpY2UgY2xhc3MgZm9yIDREV2F2ZS4KKworICAgUmV0dXJuczogICAgIDAgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3RyaWRlbnRfdGxiX2FsbG9jKHRyaWRlbnRfdCAqdHJpZGVudCkKK3sKKwlpbnQgaTsKKworCS8qIFRMQiBhcnJheSBtdXN0IGJlIGFsaWduZWQgdG8gMTZrQiAhISEgc28gd2UgYWxsb2NhdGUKKwkgICAzMmtCIHJlZ2lvbiBhbmQgY29ycmVjdCBvZmZzZXQgd2hlbiBuZWNlc3NhcnkgKi8KKworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YSh0cmlkZW50LT5wY2kpLAorCQkJCTIgKiBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQsICZ0cmlkZW50LT50bGIuYnVmZmVyKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIFRMQiBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdHJpZGVudC0+dGxiLmVudHJpZXMgPSAodW5zaWduZWQgaW50KikoKCh1bnNpZ25lZCBsb25nKXRyaWRlbnQtPnRsYi5idWZmZXIuYXJlYSArIFNORFJWX1RSSURFTlRfTUFYX1BBR0VTICogNCAtIDEpICYgfihTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQgLSAxKSk7CisJdHJpZGVudC0+dGxiLmVudHJpZXNfZG1hYWRkciA9ICh0cmlkZW50LT50bGIuYnVmZmVyLmFkZHIgKyBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQgLSAxKSAmIH4oU05EUlZfVFJJREVOVF9NQVhfUEFHRVMgKiA0IC0gMSk7CisJLyogYWxsb2NhdGUgc2hhZG93IFRMQiBwYWdlIHRhYmxlICh2aXJ0dWFsIGFkZHJlc3NlcykgKi8KKwl0cmlkZW50LT50bGIuc2hhZG93X2VudHJpZXMgPSAodW5zaWduZWQgbG9uZyAqKXZtYWxsb2MoU05EUlZfVFJJREVOVF9NQVhfUEFHRVMqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAodHJpZGVudC0+dGxiLnNoYWRvd19lbnRyaWVzID09IE5VTEwpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIHNoYWRvdyBUTEIgZW50cmllc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgc2lsZW50IHBhZ2UgYW5kIGluaXRpYWxpc2UgVExCIGVudHJpZXMgKi8KKwlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKKwkJCQlTTkRSVl9UUklERU5UX1BBR0VfU0laRSwgJnRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBzaWxlbnQgcGFnZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodHJpZGVudC0+dGxiLnNpbGVudF9wYWdlLmFyZWEsIDAsIFNORFJWX1RSSURFTlRfUEFHRV9TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgU05EUlZfVFJJREVOVF9NQVhfUEFHRVM7IGkrKykgeworCQl0cmlkZW50LT50bGIuZW50cmllc1tpXSA9IGNwdV90b19sZTMyKHRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hZGRyICYgfihTTkRSVl9UUklERU5UX1BBR0VfU0laRS0xKSk7CisJCXRyaWRlbnQtPnRsYi5zaGFkb3dfZW50cmllc1tpXSA9ICh1bnNpZ25lZCBsb25nKXRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hcmVhOworCX0KKworCS8qIHVzZSBlbXUgbWVtb3J5IGJsb2NrIG1hbmFnZXIgY29kZSB0byBtYW5hZ2UgdGxiIHBhZ2UgYWxsb2NhdGlvbiAqLworCXRyaWRlbnQtPnRsYi5tZW1oZHIgPSBzbmRfdXRpbF9tZW1oZHJfbmV3KFNORFJWX1RSSURFTlRfUEFHRV9TSVpFICogU05EUlZfVFJJREVOVF9NQVhfUEFHRVMpOworCWlmICh0cmlkZW50LT50bGIubWVtaGRyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJpZGVudC0+dGxiLm1lbWhkci0+YmxvY2tfZXh0cmFfc2l6ZSA9IHNpemVvZihzbmRfdHJpZGVudF9tZW1ibGtfYXJnX3QpOworCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGl6ZSA0RCBEWCBjaGlwCisgKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfc3RvcF9hbGxfdm9pY2VzKHRyaWRlbnRfdCAqdHJpZGVudCkKK3sKKwlvdXRsKDB4ZmZmZmZmZmYsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVE9QX0EpKTsKKwlvdXRsKDB4ZmZmZmZmZmYsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVE9QX0IpKTsKKwlvdXRsKDAsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9BSU5URU5fQSkpOworCW91dGwoMCwgVFJJRF9SRUcodHJpZGVudCwgVDREX0FJTlRFTl9CKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfNGRfZHhfaW5pdCh0cmlkZW50X3QgKnRyaWRlbnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaSA9IHRyaWRlbnQtPnBjaTsKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lOworCisJLyogcmVzZXQgdGhlIGxlZ2FjeSBjb25maWd1cmF0aW9uIGFuZCB3aG9sZSBhdWRpby93YXZldGFibGUgYmxvY2sgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaSwgMHg0MCwgMCk7CS8qIERETUEgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCAweDQ0LCAwKTsJLyogcG9ydHMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCAweDQ1LCAwKTsJLyogTGVnYWN5IERNQSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIDB4NDYsIDQpOyAvKiByZXNldCAqLworCXVkZWxheSgxMDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIDB4NDYsIDApOyAvKiByZWxlYXNlIHJlc2V0ICovCisJdWRlbGF5KDEwMCk7CisJCisJLyogd2FybSByZXNldCBvZiB0aGUgQUMnOTcgY29kZWMgKi8KKwlvdXRsKDB4MDAwMDAwMDEsIFRSSURfUkVHKHRyaWRlbnQsIERYX0FDUjJfQUM5N19DT01fU1RBVCkpOworCXVkZWxheSgxMDApOworCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcodHJpZGVudCwgRFhfQUNSMl9BQzk3X0NPTV9TVEFUKSk7CisJLyogREFDIG9uLCBkaXNhYmxlIFNCIElSUSBhbmQgdHJ5IHRvIGZvcmNlIEFEQyB2YWxpZCBzaWduYWwgKi8KKwl0cmlkZW50LT5hYzk3X2N0cmwgPSAweDAwMDAwMDRhOworCW91dGwodHJpZGVudC0+YWM5N19jdHJsLCBUUklEX1JFRyh0cmlkZW50LCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKKwkvKiB3YWl0LCB1bnRpbCB0aGUgY29kZWMgaXMgcmVhZHkgKi8KKwllbmRfdGltZSA9IChqaWZmaWVzICsgKEhaICogMykgLyA0KSArIDE7CisJZG8geworCQlpZiAoKGlubChUUklEX1JFRyh0cmlkZW50LCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKSAmIDB4MDAxMCkgIT0gMCkKKwkJCWdvdG8gX19keF9vazsKKwkJZG9fZGVsYXkodHJpZGVudCk7CisJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOworCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKKwlyZXR1cm4gLUVJTzsKKworIF9fZHhfb2s6CisJc25kX3RyaWRlbnRfc3RvcF9hbGxfdm9pY2VzKHRyaWRlbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIDREIE5YIGNoaXAKKyAqLworc3RhdGljIGludCBzbmRfdHJpZGVudF80ZF9ueF9pbml0KHRyaWRlbnRfdCAqdHJpZGVudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdHJpZGVudC0+cGNpOworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisKKwkvKiByZXNldCB0aGUgbGVnYWN5IGNvbmZpZ3VyYXRpb24gYW5kIHdob2xlIGF1ZGlvL3dhdmV0YWJsZSBibG9jayAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQwLCAwKTsJLyogRERNQSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIDB4NDQsIDApOwkvKiBwb3J0cyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIDB4NDUsIDApOwkvKiBMZWdhY3kgRE1BICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCAweDQ2LCAxKTsgLyogcmVzZXQgKi8KKwl1ZGVsYXkoMTAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCAweDQ2LCAwKTsgLyogcmVsZWFzZSByZXNldCAqLworCXVkZWxheSgxMDApOworCisJLyogd2FybSByZXNldCBvZiB0aGUgQUMnOTcgY29kZWMgKi8KKwlvdXRsKDB4MDAwMDAwMDEsIFRSSURfUkVHKHRyaWRlbnQsIE5YX0FDUjBfQUM5N19DT01fU1RBVCkpOworCXVkZWxheSgxMDApOworCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CisJLyogd2FpdCwgdW50aWwgdGhlIGNvZGVjIGlzIHJlYWR5ICovCisJZW5kX3RpbWUgPSAoamlmZmllcyArIChIWiAqIDMpIC8gNCkgKyAxOworCWRvIHsKKwkJaWYgKChpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkgJiAweDAwMDgpICE9IDApCisJCQlnb3RvIF9fbnhfb2s7CisJCWRvX2RlbGF5KHRyaWRlbnQpOworCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyByZWFkeSBlcnJvciBbMHgleF1cbiIsIGlubChUUklEX1JFRyh0cmlkZW50LCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKSk7CisJcmV0dXJuIC1FSU87CisKKyBfX254X29rOgorCS8qIERBQyBvbiAqLworCXRyaWRlbnQtPmFjOTdfY3RybCA9IDB4MDAwMDAwMDI7CisJb3V0bCh0cmlkZW50LT5hYzk3X2N0cmwsIFRSSURfUkVHKHRyaWRlbnQsIE5YX0FDUjBfQUM5N19DT01fU1RBVCkpOworCS8qIGRpc2FibGUgU0IgSVJRICovCisJb3V0bChOWF9TQl9JUlFfRElTQUJMRSwgVFJJRF9SRUcodHJpZGVudCwgVDREX01JU0NJTlQpKTsKKworCXNuZF90cmlkZW50X3N0b3BfYWxsX3ZvaWNlcyh0cmlkZW50KTsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcyAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGludCBpOworCQkvKiBlbmFibGUgdmlydHVhbCBhZGRyZXNzaW5nIHZpYSBUTEIgKi8KKwkJaSA9IHRyaWRlbnQtPnRsYi5lbnRyaWVzX2RtYWFkZHI7CisJCWkgfD0gMHgwMDAwMDAwMTsKKwkJb3V0bChpLCBUUklEX1JFRyh0cmlkZW50LCBOWF9UTEJDKSk7CisJfSBlbHNlIHsKKwkJb3V0bCgwLCBUUklEX1JFRyh0cmlkZW50LCBOWF9UTEJDKSk7CisJfQorCS8qIGluaXRpYWxpemUgUy9QRElGICovCisJb3V0bCh0cmlkZW50LT5zcGRpZl9iaXRzLCBUUklEX1JFRyh0cmlkZW50LCBOWF9TUENTVEFUVVMpKTsKKwlvdXRiKHRyaWRlbnQtPnNwZGlmX2N0cmwsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTyArIDMpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGl6ZSBzaXM3MDE4IGNoaXAKKyAqLworc3RhdGljIGludCBzbmRfdHJpZGVudF9zaXNfaW5pdCh0cmlkZW50X3QgKnRyaWRlbnQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3RyaWRlbnRfc2lzX3Jlc2V0KHRyaWRlbnQpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlzbmRfdHJpZGVudF9zdG9wX2FsbF92b2ljZXModHJpZGVudCk7CisKKwkvKiBpbml0aWFsaXplIFMvUERJRiAqLworCW91dGwodHJpZGVudC0+c3BkaWZfYml0cywgVFJJRF9SRUcodHJpZGVudCwgU0lfU1BESUZfQ1MpKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc25kX3RyaWRlbnRfY3JlYXRlCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGNyZWF0ZSB0aGUgZGV2aWNlIHNwZWNpZmljIGNsYXNzIGZvcgorICAgICAgICAgICAgICAgIHRoZSA0RFdhdmUgY2FyZC4gSXQgd2lsbCBhbHNvIHBlcmZvcm0gYmFzaWMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgCisgICBQYXJhbXRlcnM6ICAgY2FyZCAgLSB3aGljaCBjYXJkIHRvIGNyZWF0ZQorICAgICAgICAgICAgICAgIHBjaSAgIC0gaW50ZXJmYWNlIHRvIFBDSSBidXMgcmVzb3VyY2UgaW5mbworICAgICAgICAgICAgICAgIGRtYTFwdHIgLSBwbGF5YmFjayBkbWEgYnVmZmVyCisgICAgICAgICAgICAgICAgZG1hMnB0ciAtIGNhcHR1cmUgZG1hIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGlycXB0ciAgLSAgaW50ZXJydXB0IHJlc291cmNlIGluZm8KKworICAgUmV0dXJuczogICAgIDREV2F2ZSBkZXZpY2UgY2xhc3MgcHJpdmF0ZSBkYXRhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgX19kZXZpbml0IHNuZF90cmlkZW50X2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCSAgICAgICBpbnQgcGNtX3N0cmVhbXMsCisJCSAgICAgICBpbnQgcGNtX3NwZGlmX2RldmljZSwKKwkJICAgICAgIGludCBtYXhfd2F2ZXRhYmxlX3NpemUsCisJCSAgICAgICB0cmlkZW50X3QgKiogcnRyaWRlbnQpCit7CisJdHJpZGVudF90ICp0cmlkZW50OworCWludCBpLCBlcnI7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqdm9pY2U7CisJc25kX3RyaWRlbnRfcGNtX21peGVyX3QgKnRtaXg7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfdHJpZGVudF9kZXZfZnJlZSwKKwl9OworCisJKnJ0cmlkZW50ID0gTlVMTDsKKworCS8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMCBiaXRzICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCAweDNmZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgMHgzZmZmZmZmZikgPCAwKSB7CisJCXNuZF9wcmludGsoImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMwYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCQorCXRyaWRlbnQgPSBrY2FsbG9jKDEsIHNpemVvZigqdHJpZGVudCksIEdGUF9LRVJORUwpOworCWlmICh0cmlkZW50ID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0cmlkZW50LT5kZXZpY2UgPSAocGNpLT52ZW5kb3IgPDwgMTYpIHwgcGNpLT5kZXZpY2U7CisJdHJpZGVudC0+Y2FyZCA9IGNhcmQ7CisJdHJpZGVudC0+cGNpID0gcGNpOworCXNwaW5fbG9ja19pbml0KCZ0cmlkZW50LT5yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRyaWRlbnQtPmV2ZW50X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cmlkZW50LT52b2ljZV9hbGxvYyk7CisJaWYgKHBjbV9zdHJlYW1zIDwgMSkKKwkJcGNtX3N0cmVhbXMgPSAxOworCWlmIChwY21fc3RyZWFtcyA+IDMyKQorCQlwY21fc3RyZWFtcyA9IDMyOworCXRyaWRlbnQtPkNoYW5QQ00gPSBwY21fc3RyZWFtczsKKwlpZiAobWF4X3dhdmV0YWJsZV9zaXplIDwgMCApCisJCW1heF93YXZldGFibGVfc2l6ZSA9IDA7CisJdHJpZGVudC0+c3ludGgubWF4X3NpemUgPSBtYXhfd2F2ZXRhYmxlX3NpemUgKiAxMDI0OworCXRyaWRlbnQtPmlycSA9IC0xOworCisJdHJpZGVudC0+bWlkaV9wb3J0ID0gVFJJRF9SRUcodHJpZGVudCwgVDREX01QVTQwMV9CQVNFKTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIlRyaWRlbnQgQXVkaW8iKSkgPCAwKSB7CisJCWtmcmVlKHRyaWRlbnQpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdHJpZGVudC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgIlRyaWRlbnQgQXVkaW8iLCAodm9pZCAqKSB0cmlkZW50KSkgeworCQlzbmRfcHJpbnRrKCJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJc25kX3RyaWRlbnRfZnJlZSh0cmlkZW50KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJdHJpZGVudC0+aXJxID0gcGNpLT5pcnE7CisKKwkvKiBhbGxvY2F0ZSAxNmstYWxpZ25lZCBUTEIgZm9yIE5YIGNhcmRzICovCisJdHJpZGVudC0+dGxiLmVudHJpZXMgPSBOVUxMOworCXRyaWRlbnQtPnRsYi5idWZmZXIuYXJlYSA9IE5VTEw7CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlpZiAoKGVyciA9IHNuZF90cmlkZW50X3RsYl9hbGxvYyh0cmlkZW50KSkgPCAwKSB7CisJCQlzbmRfdHJpZGVudF9mcmVlKHRyaWRlbnQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXRyaWRlbnQtPnNwZGlmX2JpdHMgPSB0cmlkZW50LT5zcGRpZl9wY21fYml0cyA9IFNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRjsKKworCS8qIGluaXRpYWxpemUgY2hpcCAqLworCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKKwkJZXJyID0gc25kX3RyaWRlbnRfNGRfZHhfaW5pdCh0cmlkZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9OWDoKKwkJZXJyID0gc25kX3RyaWRlbnRfNGRfbnhfaW5pdCh0cmlkZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6CisJCWVyciA9IHNuZF90cmlkZW50X3Npc19pbml0KHRyaWRlbnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfQlVHKCk7CisJCWJyZWFrOworCX0KKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfdHJpZGVudF9mcmVlKHRyaWRlbnQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCB0cmlkZW50LCAmb3BzKSkgPCAwKSB7CisJCXNuZF90cmlkZW50X2ZyZWUodHJpZGVudCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfdHJpZGVudF9taXhlcih0cmlkZW50LCBwY21fc3BkaWZfZGV2aWNlKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCQorCS8qIGluaXRpYWxpc2Ugc3ludGggdm9pY2VzICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJdm9pY2UgPSAmdHJpZGVudC0+c3ludGgudm9pY2VzW2ldOworCQl2b2ljZS0+bnVtYmVyID0gaTsKKwkJdm9pY2UtPnRyaWRlbnQgPSB0cmlkZW50OworCX0KKwkvKiBpbml0aWFsaXplIHBjbSBtaXhlciBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJdG1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbaV07CisJCXRtaXgtPnZvbCA9IFQ0RF9ERUZBVUxUX1BDTV9WT0w7CisJCXRtaXgtPnBhbiA9IFQ0RF9ERUZBVUxUX1BDTV9QQU47CisJCXRtaXgtPnJ2b2wgPSBUNERfREVGQVVMVF9QQ01fUlZPTDsKKwkJdG1peC0+Y3ZvbCA9IFQ0RF9ERUZBVUxUX1BDTV9DVk9MOworCX0KKworCXNuZF90cmlkZW50X2VuYWJsZV9lc28odHJpZGVudCk7CisKKwkKKwlzbmRfY2FyZF9zZXRfcG1fY2FsbGJhY2soY2FyZCwgc25kX3RyaWRlbnRfc3VzcGVuZCwgc25kX3RyaWRlbnRfcmVzdW1lLCB0cmlkZW50KTsKKwlzbmRfdHJpZGVudF9wcm9jX2luaXQodHJpZGVudCk7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOworCSpydHJpZGVudCA9IHRyaWRlbnQ7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9mcmVlCisgIAorICAgRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGZyZWUgdGhlIGRldmljZSBzcGVjaWZpYyBjbGFzcyBmb3IKKyAgICAgICAgICAgICAgICB0aGUgNERXYXZlIGNhcmQuIAorICAgICAgICAgICAgICAgIAorICAgUGFyYW10ZXJzOiAgIHRyaWRlbnQgIC0gZGV2aWNlIHNwZWNpZmljIHByaXZhdGUgZGF0YSBmb3IgNERXYXZlIGNhcmQKKworICAgUmV0dXJuczogICAgIE5vbmUuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNuZF90cmlkZW50X2ZyZWUodHJpZGVudF90ICp0cmlkZW50KQoreworCXNuZF90cmlkZW50X2ZyZWVfZ2FtZXBvcnQodHJpZGVudCk7CisJc25kX3RyaWRlbnRfZGlzYWJsZV9lc28odHJpZGVudCk7CisJLy8gRGlzYWJsZSBTL1BESUYgb3V0CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkKKwkJb3V0YigweDAwLCBUUklEX1JFRyh0cmlkZW50LCBOWF9TUENUUkxfU1BDU08gKyAzKSk7CisJZWxzZSBpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkgeworCQlvdXRsKDAsIFRSSURfUkVHKHRyaWRlbnQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKKwl9CisJaWYgKHRyaWRlbnQtPnRsYi5idWZmZXIuYXJlYSkgeworCQlvdXRsKDAsIFRSSURfUkVHKHRyaWRlbnQsIE5YX1RMQkMpKTsKKwkJaWYgKHRyaWRlbnQtPnRsYi5tZW1oZHIpCisJCQlzbmRfdXRpbF9tZW1oZHJfZnJlZSh0cmlkZW50LT50bGIubWVtaGRyKTsKKwkJaWYgKHRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hcmVhKQorCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZ0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UpOworCQl2ZnJlZSh0cmlkZW50LT50bGIuc2hhZG93X2VudHJpZXMpOworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnRyaWRlbnQtPnRsYi5idWZmZXIpOworCX0KKwlpZiAodHJpZGVudC0+aXJxID49IDApCisJCWZyZWVfaXJxKHRyaWRlbnQtPmlycSwgKHZvaWQgKil0cmlkZW50KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHRyaWRlbnQtPnBjaSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHRyaWRlbnQtPnBjaSk7CisJa2ZyZWUodHJpZGVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9pbnRlcnJ1cHQKKyAgCisgICBEZXNjcmlwdGlvbjogSVNSIGZvciBUcmlkZW50IDREV2F2ZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAKKyAgIFBhcmFtdGVyczogICB0cmlkZW50ICAtIGRldmljZSBzcGVjaWZpYyBwcml2YXRlIGRhdGEgZm9yIDREV2F2ZSBjYXJkCisKKyAgIFByb2JsZW1zOiAgICBJdCBzZWVtcyB0aGF0IFRyaWRlbnQgY2hpcHMgZ2VuZXJhdGVzIGludGVycnVwdHMgbW9yZSB0aGFuCisgICAgICAgICAgICAgICAgb25lIHRpbWUgaW4gc3BlY2lhbCBjYXNlcy4gVGhlIHNwdXJpb3VzIGludGVycnVwdHMgYXJlCisgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgdmlhIHNhbXBsZSB0aW1lciAoVDREX1NUSU1FUikgYW5kIGNvbXB1dGluZworICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgZGVsdGEgdmFsdWUuIFRoZSBsaW1pdHMgYXJlIGRldGVjdGVkIHdpdGgKKyAgICAgICAgICAgICAgICB0aGUgbWV0aG9kIHRyeSAmIGZhaWwgc28gaXQgaXMgcG9zc2libGUgdGhhdCBpdCB3b24ndAorICAgICAgICAgICAgICAgIHdvcmsgb24gYWxsIGNvbXB1dGVycy4gW2phcm9zbGF2XQorCisgICBSZXR1cm5zOiAgICAgTm9uZS4KKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IGF1ZGlvX2ludCwgY2huX2ludCwgc3RpbWVyLCBjaGFubmVsLCBtYXNrLCB0bXA7CisJaW50IGRlbHRhOworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlOworCisJYXVkaW9faW50ID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9NSVNDSU5UKSk7CisJaWYgKChhdWRpb19pbnQgJiAoQUREUkVTU19JUlF8TVBVNDAxX0lSUSkpID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKwlpZiAoYXVkaW9faW50ICYgQUREUkVTU19JUlEpIHsKKwkJLy8gZ2V0IGludGVycnVwdCBzdGF0dXMgZm9yIGFsbCBjaGFubmVscworCQlzcGluX2xvY2soJnRyaWRlbnQtPnJlZ19sb2NrKTsKKwkJc3RpbWVyID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVElNRVIpKSAmIDB4MDBmZmZmZmY7CisJCWNobl9pbnQgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgVDREX0FJTlRfQSkpOworCQlpZiAoY2huX2ludCA9PSAwKQorCQkJZ290byBfX3NraXAxOworCQlvdXRsKGNobl9pbnQsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9BSU5UX0EpKTsJLyogYWNrICovCisJICAgICAgX19za2lwMToKKwkJY2huX2ludCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBUNERfQUlOVF9CKSk7CisJCWlmIChjaG5faW50ID09IDApCisJCQlnb3RvIF9fc2tpcDI7CisJCWZvciAoY2hhbm5lbCA9IDYzOyBjaGFubmVsID49IDMyOyBjaGFubmVsLS0pIHsKKwkJCW1hc2sgPSAxIDw8IChjaGFubmVsJjB4MWYpOworCQkJaWYgKChjaG5faW50ICYgbWFzaykgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXZvaWNlID0gJnRyaWRlbnQtPnN5bnRoLnZvaWNlc1tjaGFubmVsXTsKKwkJCWlmICghdm9pY2UtPnBjbSB8fCB2b2ljZS0+c3Vic3RyZWFtID09IE5VTEwpIHsKKwkJCQlvdXRsKG1hc2ssIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TVE9QX0IpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRlbHRhID0gKGludClzdGltZXIgLSAoaW50KXZvaWNlLT5zdGltZXI7CisJCQlpZiAoZGVsdGEgPCAwKQorCQkJCWRlbHRhID0gLWRlbHRhOworCQkJaWYgKCh1bnNpZ25lZCBpbnQpZGVsdGEgPCB2b2ljZS0+c3B1cmlvdXNfdGhyZXNob2xkKSB7CisJCQkJLyogZG8gc29tZSBzdGF0aXN0aWNzIGhlcmUgKi8KKwkJCQl0cmlkZW50LT5zcHVyaW91c19pcnFfY291bnQrKzsKKwkJCQlpZiAodHJpZGVudC0+c3B1cmlvdXNfaXJxX21heF9kZWx0YSA8ICh1bnNpZ25lZCBpbnQpZGVsdGEpCisJCQkJCXRyaWRlbnQtPnNwdXJpb3VzX2lycV9tYXhfZGVsdGEgPSBkZWx0YTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZvaWNlLT5zdGltZXIgPSBzdGltZXI7CisJCQlpZiAodm9pY2UtPmlzeW5jKSB7CisJCQkJaWYgKCF2b2ljZS0+aXN5bmMzKSB7CisJCQkJCXRtcCA9IGludyhUUklEX1JFRyh0cmlkZW50LCBUNERfU0JCTF9TQkNMKSk7CisJCQkJCWlmICh0cmlkZW50LT5iRE1BU3RhcnQgJiAweDQwKQorCQkJCQkJdG1wID4+PSAxOworCQkJCQlpZiAodG1wID4gMCkKKwkJCQkJCXRtcCA9IHZvaWNlLT5pc3luY19tYXggLSB0bXA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdG1wID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIE5YX1NQQ1RSTF9TUENTTykpICYgMHgwMGZmZmZmZjsKKwkJCQl9CisJCQkJaWYgKHRtcCA8IHZvaWNlLT5pc3luY19tYXJrKSB7CisJCQkJCWlmICh0bXAgPiAweDEwKQorCQkJCQkJdG1wID0gdm9pY2UtPmlzeW5jX0VTTyAtIDc7CisJCQkJCWVsc2UKKwkJCQkJCXRtcCA9IHZvaWNlLT5pc3luY19FU08gKyAyOworCQkJCQkvKiB1cGRhdGUgRVNPIGZvciBJUlEgdm9pY2UgdG8gcHJlc2VydmUgc3luYyAqLworCQkJCQlzbmRfdHJpZGVudF9zdG9wX3ZvaWNlKHRyaWRlbnQsIHZvaWNlLT5udW1iZXIpOworCQkJCQlzbmRfdHJpZGVudF93cml0ZV9lc29fcmVnKHRyaWRlbnQsIHZvaWNlLCB0bXApOworCQkJCQlzbmRfdHJpZGVudF9zdGFydF92b2ljZSh0cmlkZW50LCB2b2ljZS0+bnVtYmVyKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHZvaWNlLT5pc3luYzIpIHsKKwkJCQl2b2ljZS0+aXN5bmMyID0gMDsKKwkJCQkvKiB3cml0ZSBvcmlnaW5hbCBFU08gYW5kIHVwZGF0ZSBDU08gZm9yIElSUSB2b2ljZSB0byBwcmVzZXJ2ZSBzeW5jICovCisJCQkJc25kX3RyaWRlbnRfc3RvcF92b2ljZSh0cmlkZW50LCB2b2ljZS0+bnVtYmVyKTsKKwkJCQlzbmRfdHJpZGVudF93cml0ZV9jc29fcmVnKHRyaWRlbnQsIHZvaWNlLCB2b2ljZS0+aXN5bmNfbWFyayk7CisJCQkJc25kX3RyaWRlbnRfd3JpdGVfZXNvX3JlZyh0cmlkZW50LCB2b2ljZSwgdm9pY2UtPkVTTyk7CisJCQkJc25kX3RyaWRlbnRfc3RhcnRfdm9pY2UodHJpZGVudCwgdm9pY2UtPm51bWJlcik7CisJCQl9CisjaWYgMAorCQkJaWYgKHZvaWNlLT5leHRyYSkgeworCQkJCS8qIHVwZGF0ZSBDU08gZm9yIGV4dHJhIHZvaWNlIHRvIHByZXNlcnZlIHN5bmMgKi8KKwkJCQlzbmRfdHJpZGVudF9zdG9wX3ZvaWNlKHRyaWRlbnQsIHZvaWNlLT5leHRyYS0+bnVtYmVyKTsKKwkJCQlzbmRfdHJpZGVudF93cml0ZV9jc29fcmVnKHRyaWRlbnQsIHZvaWNlLT5leHRyYSwgMCk7CisJCQkJc25kX3RyaWRlbnRfc3RhcnRfdm9pY2UodHJpZGVudCwgdm9pY2UtPmV4dHJhLT5udW1iZXIpOworCQkJfQorI2VuZGlmCisJCQlzcGluX3VubG9jaygmdHJpZGVudC0+cmVnX2xvY2spOworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZCh2b2ljZS0+c3Vic3RyZWFtKTsKKwkJCXNwaW5fbG9jaygmdHJpZGVudC0+cmVnX2xvY2spOworCQl9CisJCW91dGwoY2huX2ludCwgVFJJRF9SRUcodHJpZGVudCwgVDREX0FJTlRfQikpOwkvKiBhY2sgKi8KKwkgICAgICBfX3NraXAyOgorCQlzcGluX3VubG9jaygmdHJpZGVudC0+cmVnX2xvY2spOworCX0KKwlpZiAoYXVkaW9faW50ICYgTVBVNDAxX0lSUSkgeworCQlpZiAodHJpZGVudC0+cm1pZGkpIHsKKwkJCXNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaXJxLCB0cmlkZW50LT5ybWlkaS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCWluYihUUklEX1JFRyh0cmlkZW50LCBUNERfTVBVUjApKTsKKwkJfQorCX0KKwkvLyBvdXRsKChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgVFJJRF9SRUcodHJpZGVudCwgVDREX01JU0NJTlQpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzbmRfdHJpZGVudF9hdHRhY2hfc3ludGhlc2l6ZXIKKyAgCisgICBEZXNjcmlwdGlvbjogQXR0YWNoIHN5bnRoZXNpemVyIGhvb2tzCisgICAgICAgICAgICAgICAgCisgICBQYXJhbXRlcnM6ICAgdHJpZGVudCAgLSBkZXZpY2Ugc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIGZvciA0RFdhdmUgY2FyZAorCisgICBSZXR1cm5zOiAgICAgTm9uZS4KKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgc25kX3RyaWRlbnRfYXR0YWNoX3N5bnRoZXNpemVyKHRyaWRlbnRfdCAqdHJpZGVudCkKK3sJCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NFUVVFTkNFUikgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkpCisJaWYgKHNuZF9zZXFfZGV2aWNlX25ldyh0cmlkZW50LT5jYXJkLCAxLCBTTkRSVl9TRVFfREVWX0lEX1RSSURFTlQsCisJCQkgICAgICAgc2l6ZW9mKHRyaWRlbnRfdCopLCAmdHJpZGVudC0+c2VxX2RldikgPj0gMCkgeworCQlzdHJjcHkodHJpZGVudC0+c2VxX2Rldi0+bmFtZSwgIjREV2F2ZSIpOworCQkqKHRyaWRlbnRfdCoqKVNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKHRyaWRlbnQtPnNlcV9kZXYpID0gdHJpZGVudDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc25kX3RyaWRlbnRfdm9pY2VfdCAqc25kX3RyaWRlbnRfYWxsb2Nfdm9pY2UodHJpZGVudF90ICogdHJpZGVudCwgaW50IHR5cGUsIGludCBjbGllbnQsIGludCBwb3J0KQoreworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnB2b2ljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwlpZiAodHlwZSA9PSBTTkRSVl9UUklERU5UX1ZPSUNFX1RZUEVfUENNKSB7CisJCWlkeCA9IHNuZF90cmlkZW50X2FsbG9jYXRlX3BjbV9jaGFubmVsKHRyaWRlbnQpOworCQlpZihpZHggPCAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmlkZW50LT52b2ljZV9hbGxvYywgZmxhZ3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcHZvaWNlID0gJnRyaWRlbnQtPnN5bnRoLnZvaWNlc1tpZHhdOworCQlwdm9pY2UtPnVzZSA9IDE7CisJCXB2b2ljZS0+cGNtID0gMTsKKwkJcHZvaWNlLT5jYXB0dXJlID0gMDsKKwkJcHZvaWNlLT5zcGRpZiA9IDA7CisJCXB2b2ljZS0+bWVtYmxrID0gTlVMTDsKKwkJcHZvaWNlLT5zdWJzdHJlYW0gPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmlkZW50LT52b2ljZV9hbGxvYywgZmxhZ3MpOworCQlyZXR1cm4gcHZvaWNlOworCX0KKwlpZiAodHlwZSA9PSBTTkRSVl9UUklERU5UX1ZPSUNFX1RZUEVfU1lOVEgpIHsKKwkJaWR4ID0gc25kX3RyaWRlbnRfYWxsb2NhdGVfc3ludGhfY2hhbm5lbCh0cmlkZW50KTsKKwkJaWYoaWR4IDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXB2b2ljZSA9ICZ0cmlkZW50LT5zeW50aC52b2ljZXNbaWR4XTsKKwkJcHZvaWNlLT51c2UgPSAxOworCQlwdm9pY2UtPnN5bnRoID0gMTsKKwkJcHZvaWNlLT5jbGllbnQgPSBjbGllbnQ7CisJCXB2b2ljZS0+cG9ydCA9IHBvcnQ7CisJCXB2b2ljZS0+bWVtYmxrID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwkJcmV0dXJuIHB2b2ljZTsKKwl9CisJaWYgKHR5cGUgPT0gU05EUlZfVFJJREVOVF9WT0lDRV9UWVBFX01JREkpIHsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzbmRfdHJpZGVudF9mcmVlX3ZvaWNlKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKnZvaWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAoKnByaXZhdGVfZnJlZSkoc25kX3RyaWRlbnRfdm9pY2VfdCAqKTsKKwl2b2lkICpwcml2YXRlX2RhdGE7CisKKwlpZiAodm9pY2UgPT0gTlVMTCB8fCAhdm9pY2UtPnVzZSkKKwkJcmV0dXJuOworCXNuZF90cmlkZW50X2NsZWFyX3ZvaWNlcyh0cmlkZW50LCB2b2ljZS0+bnVtYmVyLCB2b2ljZS0+bnVtYmVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+dm9pY2VfYWxsb2MsIGZsYWdzKTsKKwlwcml2YXRlX2ZyZWUgPSB2b2ljZS0+cHJpdmF0ZV9mcmVlOworCXByaXZhdGVfZGF0YSA9IHZvaWNlLT5wcml2YXRlX2RhdGE7CisJdm9pY2UtPnByaXZhdGVfZnJlZSA9IE5VTEw7CisJdm9pY2UtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJaWYgKHZvaWNlLT5wY20pCisJCXNuZF90cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWwodHJpZGVudCwgdm9pY2UtPm51bWJlcik7CisJaWYgKHZvaWNlLT5zeW50aCkKKwkJc25kX3RyaWRlbnRfZnJlZV9zeW50aF9jaGFubmVsKHRyaWRlbnQsIHZvaWNlLT5udW1iZXIpOworCXZvaWNlLT51c2UgPSB2b2ljZS0+cGNtID0gdm9pY2UtPnN5bnRoID0gdm9pY2UtPm1pZGkgPSAwOworCXZvaWNlLT5jYXB0dXJlID0gdm9pY2UtPnNwZGlmID0gMDsKKwl2b2ljZS0+c2FtcGxlX29wcyA9IE5VTEw7CisJdm9pY2UtPnN1YnN0cmVhbSA9IE5VTEw7CisJdm9pY2UtPmV4dHJhID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmlkZW50LT52b2ljZV9hbGxvYywgZmxhZ3MpOworCWlmIChwcml2YXRlX2ZyZWUpCisJCXByaXZhdGVfZnJlZSh2b2ljZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X2NsZWFyX3ZvaWNlcyh0cmlkZW50X3QgKiB0cmlkZW50LCB1bnNpZ25lZCBzaG9ydCB2X21pbiwgdW5zaWduZWQgc2hvcnQgdl9tYXgpCit7CisJdW5zaWduZWQgaW50IGksIHZhbCwgbWFza1syXSA9IHsgMCwgMCB9OworCisJc25kX2Fzc2VydCh2X21pbiA8PSA2MywgcmV0dXJuKTsKKwlzbmRfYXNzZXJ0KHZfbWF4IDw9IDYzLCByZXR1cm4pOworCWZvciAoaSA9IHZfbWluOyBpIDw9IHZfbWF4OyBpKyspCisJCW1hc2tbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxZik7CisJaWYgKG1hc2tbMF0pIHsKKwkJb3V0bChtYXNrWzBdLCBUUklEX1JFRyh0cmlkZW50LCBUNERfU1RPUF9BKSk7CisJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBUNERfQUlOVEVOX0EpKTsKKwkJb3V0bCh2YWwgJiB+bWFza1swXSwgVFJJRF9SRUcodHJpZGVudCwgVDREX0FJTlRFTl9BKSk7CisJfQorCWlmIChtYXNrWzFdKSB7CisJCW91dGwobWFza1sxXSwgVFJJRF9SRUcodHJpZGVudCwgVDREX1NUT1BfQikpOworCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgVDREX0FJTlRFTl9CKSk7CisJCW91dGwodmFsICYgfm1hc2tbMV0sIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9BSU5URU5fQikpOworCX0KK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzbmRfdHJpZGVudF9zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisKKwl0cmlkZW50LT5pbl9zdXNwZW5kID0gMTsKKwlzbmRfcGNtX3N1c3BlbmRfYWxsKHRyaWRlbnQtPnBjbSk7CisJaWYgKHRyaWRlbnQtPmZvbGRiYWNrKQorCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHRyaWRlbnQtPmZvbGRiYWNrKTsKKwlpZiAodHJpZGVudC0+c3BkaWYpCisJCXNuZF9wY21fc3VzcGVuZF9hbGwodHJpZGVudC0+c3BkaWYpOworCisJc25kX2FjOTdfc3VzcGVuZCh0cmlkZW50LT5hYzk3KTsKKwlpZiAodHJpZGVudC0+YWM5N19zZWMpCisJCXNuZF9hYzk3X3N1c3BlbmQodHJpZGVudC0+YWM5N19zZWMpOworCisJc3dpdGNoICh0cmlkZW50LT5kZXZpY2UpIHsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX0RYOgorCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CisJCWJyZWFrOwkJCS8qIFRPRE8gKi8KKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX1NJNzAxODoKKwkJYnJlYWs7CisJfQorCXBjaV9kaXNhYmxlX2RldmljZSh0cmlkZW50LT5wY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHRyaWRlbnQtPnBjaSk7CisJaWYgKHBjaV9zZXRfZG1hX21hc2sodHJpZGVudC0+cGNpLCAweDNmZmZmZmZmKSA8IDAgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHRyaWRlbnQtPnBjaSwgMHgzZmZmZmZmZikgPCAwKQorCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogY2FuJ3Qgc2V0IHRoZSBwcm9wZXIgRE1BIG1hc2tcbiIpOworCXBjaV9zZXRfbWFzdGVyKHRyaWRlbnQtPnBjaSk7IC8qIHRvIGJlIHN1cmUgKi8KKworCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKKwkJc25kX3RyaWRlbnRfNGRfZHhfaW5pdCh0cmlkZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9OWDoKKwkJc25kX3RyaWRlbnRfNGRfbnhfaW5pdCh0cmlkZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6CisJCXNuZF90cmlkZW50X3Npc19pbml0KHRyaWRlbnQpOworCQlicmVhazsKKwl9CisKKwlzbmRfYWM5N19yZXN1bWUodHJpZGVudC0+YWM5Nyk7CisJaWYgKHRyaWRlbnQtPmFjOTdfc2VjKQorCQlzbmRfYWM5N19yZXN1bWUodHJpZGVudC0+YWM5N19zZWMpOworCisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVycyAqLworCW91dGwodHJpZGVudC0+bXVzaWN2b2xfd2F2ZXZvbCwgVFJJRF9SRUcodHJpZGVudCwgVDREX01VU0lDVk9MX1dBVkVWT0wpKTsKKworCXNuZF90cmlkZW50X2VuYWJsZV9lc28odHJpZGVudCk7CisKKwl0cmlkZW50LT5pbl9zdXNwZW5kID0gMDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9hbGxvY192b2ljZSk7CitFWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X2ZyZWVfdm9pY2UpOworRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zdGFydF92b2ljZSk7CitFWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N0b3Bfdm9pY2UpOworRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKTsKKy8qIHRyaWRlbnRfbWVtb3J5LmMgc3ltYm9scyAqLworRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zeW50aF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N5bnRoX2ZyZWUpOworRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zeW50aF9jb3B5X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21lbW9yeS5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MyODI2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tZW1vcnkuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIGJ5IFNjb3R0IE1jTmFiIDxzZG1AZnJhY3RhbGdyYXBoaWNzLmNvbS5hdT4KKyAqCisgKiAgVHJpZGVudCA0RFdhdmUtTlggbWVtb3J5IHBhZ2UgYWxsb2NhdGlvbiAoVExCIGFyZWEpCisgKiAgVHJpZGVudCBjaGlwIGNhbiBoYW5kbGUgb25seSAxNk1CeXRlIG9mIHRoZSBtZW1vcnkgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC90cmlkZW50Lmg+CisKKy8qIHBhZ2UgYXJndW1lbnRzIG9mIHRoZXNlIHR3byBtYWNyb3MgYXJlIFRyaWRlbnQgcGFnZSAoNDA5NiBieXRlcyksIG5vdCBsaWtlCisgKiBhbGlnbmVkIHBhZ2VzIGluIG90aGVycworICovCisjZGVmaW5lIF9fc2V0X3RsYl9idXModHJpZGVudCxwYWdlLHB0cixhZGRyKSBcCisJZG8geyAodHJpZGVudCktPnRsYi5lbnRyaWVzW3BhZ2VdID0gY3B1X3RvX2xlMzIoKGFkZHIpICYgfihTTkRSVl9UUklERU5UX1BBR0VfU0laRS0xKSk7IFwKKwkgICAgICh0cmlkZW50KS0+dGxiLnNoYWRvd19lbnRyaWVzW3BhZ2VdID0gKHB0cik7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fdGxiX3RvX3B0cih0cmlkZW50LHBhZ2UpIFwKKwkodm9pZCopKCh0cmlkZW50KS0+dGxiLnNoYWRvd19lbnRyaWVzW3BhZ2VdKQorI2RlZmluZSBfX3RsYl90b19hZGRyKHRyaWRlbnQscGFnZSkgXAorCShkbWFfYWRkcl90KWxlMzJfdG9fY3B1KCh0cmlkZW50LT50bGIuZW50cmllc1twYWdlXSkgJiB+KFNORFJWX1RSSURFTlRfUEFHRV9TSVpFIC0gMSkpCisKKyNpZiBQQUdFX1NJWkUgPT0gNDA5NgorLyogcGFnZSBzaXplID09IFNORFJWX1RSSURFTlRfUEFHRV9TSVpFICovCisjZGVmaW5lIEFMSUdOX1BBR0VfU0laRQkJUEFHRV9TSVpFCS8qIG1pbmltdW0gcGFnZSBzaXplIGZvciBhbGxvY2F0aW9uICovCisjZGVmaW5lIE1BWF9BTElHTl9QQUdFUwkJU05EUlZfVFJJREVOVF9NQVhfUEFHRVMJLyogbWF4bWl1bSBhbGlnbmVkIHBhZ2VzICovCisvKiBmaWxsIFRMQiBlbnRyaWUocykgY29ycmVzcG9uZGluZyB0byBwYWdlIHdpdGggcHRyICovCisjZGVmaW5lIHNldF90bGJfYnVzKHRyaWRlbnQscGFnZSxwdHIsYWRkcikgX19zZXRfdGxiX2J1cyh0cmlkZW50LHBhZ2UscHRyLGFkZHIpCisvKiBmaWxsIFRMQiBlbnRyaWUocykgY29ycmVzcG9uZGluZyB0byBwYWdlIHdpdGggc2lsZW5jZSBwb2ludGVyICovCisjZGVmaW5lIHNldF9zaWxlbnRfdGxiKHRyaWRlbnQscGFnZSkJX19zZXRfdGxiX2J1cyh0cmlkZW50LCBwYWdlLCAodW5zaWduZWQgbG9uZyl0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYXJlYSwgdHJpZGVudC0+dGxiLnNpbGVudF9wYWdlLmFkZHIpCisvKiBnZXQgYWxpZ25lZCBwYWdlIGZyb20gb2Zmc2V0IGFkZHJlc3MgKi8KKyNkZWZpbmUgZ2V0X2FsaWduZWRfcGFnZShvZmZzZXQpCSgob2Zmc2V0KSA+PiAxMikKKy8qIGdldCBvZmZzZXQgYWRkcmVzcyBmcm9tIGFsaWduZWQgcGFnZSAqLworI2RlZmluZSBhbGlnbmVkX3BhZ2Vfb2Zmc2V0KHBhZ2UpCSgocGFnZSkgPDwgMTIpCisvKiBnZXQgYnVmZmVyIGFkZHJlc3MgZnJvbSBhbGlnbmVkIHBhZ2UgKi8KKyNkZWZpbmUgcGFnZV90b19wdHIodHJpZGVudCxwYWdlKQlfX3RsYl90b19wdHIodHJpZGVudCwgcGFnZSkKKy8qIGdldCBQQ0kgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIGFsaWduZWQgcGFnZSAqLworI2RlZmluZSBwYWdlX3RvX2FkZHIodHJpZGVudCxwYWdlKQlfX3RsYl90b19hZGRyKHRyaWRlbnQsIHBhZ2UpCisKKyNlbGlmIFBBR0VfU0laRSA9PSA4MTkyCisvKiBwYWdlIHNpemUgPT0gU05EUlZfVFJJREVOVF9QQUdFX1NJWkUgeCAyKi8KKyNkZWZpbmUgQUxJR05fUEFHRV9TSVpFCQlQQUdFX1NJWkUKKyNkZWZpbmUgTUFYX0FMSUdOX1BBR0VTCQkoU05EUlZfVFJJREVOVF9NQVhfUEFHRVMgLyAyKQorI2RlZmluZSBnZXRfYWxpZ25lZF9wYWdlKG9mZnNldCkJKChvZmZzZXQpID4+IDEzKQorI2RlZmluZSBhbGlnbmVkX3BhZ2Vfb2Zmc2V0KHBhZ2UpCSgocGFnZSkgPDwgMTMpCisjZGVmaW5lIHBhZ2VfdG9fcHRyKHRyaWRlbnQscGFnZSkJX190bGJfdG9fcHRyKHRyaWRlbnQsIChwYWdlKSA8PCAxKQorI2RlZmluZSBwYWdlX3RvX2FkZHIodHJpZGVudCxwYWdlKQlfX3RsYl90b19hZGRyKHRyaWRlbnQsIChwYWdlKSA8PCAxKQorCisvKiBmaWxsIFRMQiBlbnRyaWVzIC0tIHdlIG5lZWQgdG8gZmlsbCB0d28gZW50cmllcyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF90bGJfYnVzKHRyaWRlbnRfdCAqdHJpZGVudCwgaW50IHBhZ2UsIHVuc2lnbmVkIGxvbmcgcHRyLCBkbWFfYWRkcl90IGFkZHIpCit7CisJcGFnZSA8PD0gMTsKKwlfX3NldF90bGJfYnVzKHRyaWRlbnQsIHBhZ2UsIHB0ciwgYWRkcik7CisJX19zZXRfdGxiX2J1cyh0cmlkZW50LCBwYWdlKzEsIHB0ciArIFNORFJWX1RSSURFTlRfUEFHRV9TSVpFLCBhZGRyICsgU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9zaWxlbnRfdGxiKHRyaWRlbnRfdCAqdHJpZGVudCwgaW50IHBhZ2UpCit7CisJcGFnZSA8PD0gMTsKKwlfX3NldF90bGJfYnVzKHRyaWRlbnQsIHBhZ2UsICh1bnNpZ25lZCBsb25nKXRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hcmVhLCB0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYWRkcik7CisJX19zZXRfdGxiX2J1cyh0cmlkZW50LCBwYWdlKzEsICh1bnNpZ25lZCBsb25nKXRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hcmVhLCB0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYWRkcik7Cit9CisKKyNlbHNlCisvKiBhcmJpdHJhcnkgc2l6ZSAqLworI2RlZmluZSBVTklUX1BBR0VTCQkoUEFHRV9TSVpFIC8gU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpCisjZGVmaW5lIEFMSUdOX1BBR0VfU0laRQkJKFNORFJWX1RSSURFTlRfUEFHRV9TSVpFICogVU5JVF9QQUdFUykKKyNkZWZpbmUgTUFYX0FMSUdOX1BBR0VTCQkoU05EUlZfVFJJREVOVF9NQVhfUEFHRVMgLyBVTklUX1BBR0VTKQorLyogTm90ZTogaWYgYWxpZ25tZW50IGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG1heGltdW0gc2l6ZSwgdGhlIGxhc3QgZmV3IGJsb2NrcworICogYmVjb21lIHVudXNhYmxlLiAgVG8gdXNlIHN1Y2ggYmxvY2tzLCB5b3UnbGwgbmVlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkKKyAqIG9mIGFjY2Vzc2luZyBwYWdlIGluIHNldF90bGJfYnVzIGFuZCBzZXRfc2lsZW50X3RsYi4gIHNlYXJjaF9lbXB0eSgpCisgKiBzaG91bGQgYWxzbyBjaGVjayBpdCwgdG9vLgorICovCisjZGVmaW5lIGdldF9hbGlnbmVkX3BhZ2Uob2Zmc2V0KQkoKG9mZnNldCkgLyBBTElHTl9QQUdFX1NJWkUpCisjZGVmaW5lIGFsaWduZWRfcGFnZV9vZmZzZXQocGFnZSkJKChwYWdlKSAqIEFMSUdOX1BBR0VfU0laRSkKKyNkZWZpbmUgcGFnZV90b19wdHIodHJpZGVudCxwYWdlKQlfX3RsYl90b19wdHIodHJpZGVudCwgKHBhZ2UpICogVU5JVF9QQUdFUykKKyNkZWZpbmUgcGFnZV90b19hZGRyKHRyaWRlbnQscGFnZSkJX190bGJfdG9fYWRkcih0cmlkZW50LCAocGFnZSkgKiBVTklUX1BBR0VTKQorCisvKiBmaWxsIFRMQiBlbnRyaWVzIC0tIFVOSVRfUEFHRVMgZW50cmllcyBtdXN0IGJlIGZpbGxlZCAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF90bGJfYnVzKHRyaWRlbnRfdCAqdHJpZGVudCwgaW50IHBhZ2UsIHVuc2lnbmVkIGxvbmcgcHRyLCBkbWFfYWRkcl90IGFkZHIpCit7CisJaW50IGk7CisJcGFnZSAqPSBVTklUX1BBR0VTOworCWZvciAoaSA9IDA7IGkgPCBVTklUX1BBR0VTOyBpKyssIHBhZ2UrKykgeworCQlfX3NldF90bGJfYnVzKHRyaWRlbnQsIHBhZ2UsIHB0ciwgYWRkcik7CisJCXB0ciArPSBTTkRSVl9UUklERU5UX1BBR0VfU0laRTsKKwkJYWRkciArPSBTTkRSVl9UUklERU5UX1BBR0VfU0laRTsKKwl9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NpbGVudF90bGIodHJpZGVudF90ICp0cmlkZW50LCBpbnQgcGFnZSkKK3sKKwlpbnQgaTsKKwlwYWdlICo9IFVOSVRfUEFHRVM7CisJZm9yIChpID0gMDsgaSA8IFVOSVRfUEFHRVM7IGkrKywgcGFnZSsrKQorCQlfX3NldF90bGJfYnVzKHRyaWRlbnQsIHBhZ2UsICh1bnNpZ25lZCBsb25nKXRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZS5hcmVhLCB0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYWRkcik7Cit9CisKKyNlbmRpZiAvKiBQQUdFX1NJWkUgKi8KKworLyogY2FsY3VsYXRlIGJ1ZmZlciBwb2ludGVyIGZyb20gb2Zmc2V0IGFkZHJlc3MgKi8KK2lubGluZSBzdGF0aWMgdm9pZCAqb2Zmc2V0X3B0cih0cmlkZW50X3QgKnRyaWRlbnQsIGludCBvZmZzZXQpCit7CisJY2hhciAqcHRyOworCXB0ciA9IHBhZ2VfdG9fcHRyKHRyaWRlbnQsIGdldF9hbGlnbmVkX3BhZ2Uob2Zmc2V0KSk7CisJcHRyICs9IG9mZnNldCAlIEFMSUdOX1BBR0VfU0laRTsKKwlyZXR1cm4gKHZvaWQqKXB0cjsKK30KKworLyogZmlyc3QgYW5kIGxhc3QgKGFsaWduZWQpIHBhZ2VzIG9mIG1lbW9yeSBibG9jayAqLworI2RlZmluZSBmaXJzdHBnKGJsaykJKCgoc25kX3RyaWRlbnRfbWVtYmxrX2FyZ190KilzbmRfdXRpbF9tZW1ibGtfYXJncHRyKGJsaykpLT5maXJzdF9wYWdlKQorI2RlZmluZSBsYXN0cGcoYmxrKQkoKChzbmRfdHJpZGVudF9tZW1ibGtfYXJnX3QqKXNuZF91dGlsX21lbWJsa19hcmdwdHIoYmxrKSktPmxhc3RfcGFnZSkKKworLyoKKyAqIHNlYXJjaCBlbXB0eSBwYWdlcyB3aGljaCBtYXkgY29udGFpbiBnaXZlbiBzaXplCisgKi8KK3N0YXRpYyBzbmRfdXRpbF9tZW1ibGtfdCAqCitzZWFyY2hfZW1wdHkoc25kX3V0aWxfbWVtaGRyX3QgKmhkciwgaW50IHNpemUpCit7CisJc25kX3V0aWxfbWVtYmxrX3QgKmJsaywgKnByZXY7CisJaW50IHBhZ2UsIHBzaXplOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlwc2l6ZSA9IGdldF9hbGlnbmVkX3BhZ2Uoc2l6ZSArIEFMSUdOX1BBR0VfU0laRSAtMSk7CisJcHJldiA9IE5VTEw7CisJcGFnZSA9IDA7CisJbGlzdF9mb3JfZWFjaChwLCAmaGRyLT5ibG9jaykgeworCQlibGsgPSBsaXN0X2VudHJ5KHAsIHNuZF91dGlsX21lbWJsa190LCBsaXN0KTsKKwkJaWYgKHBhZ2UgKyBwc2l6ZSA8PSBmaXJzdHBnKGJsaykpCisJCQlnb3RvIF9fZm91bmRfcGFnZXM7CisJCXBhZ2UgPSBsYXN0cGcoYmxrKSArIDE7CisJfQorCWlmIChwYWdlICsgcHNpemUgPiBNQVhfQUxJR05fUEFHRVMpCisJCXJldHVybiBOVUxMOworCitfX2ZvdW5kX3BhZ2VzOgorCS8qIGNyZWF0ZSBhIG5ldyBtZW1vcnkgYmxvY2sgKi8KKwlibGsgPSBfX3NuZF91dGlsX21lbWJsa19uZXcoaGRyLCBwc2l6ZSAqIEFMSUdOX1BBR0VfU0laRSwgcC0+cHJldik7CisJaWYgKGJsayA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlibGstPm9mZnNldCA9IGFsaWduZWRfcGFnZV9vZmZzZXQocGFnZSk7IC8qIHNldCBhbGlnbmVkIG9mZnNldCAqLworCWZpcnN0cGcoYmxrKSA9IHBhZ2U7CisJbGFzdHBnKGJsaykgPSBwYWdlICsgcHNpemUgLSAxOworCXJldHVybiBibGs7Cit9CisKKworLyoKKyAqIGNoZWNrIGlmIHRoZSBnaXZlbiBwb2ludGVyIGlzIHZhbGlkIGZvciBwYWdlcworICovCitzdGF0aWMgaW50IGlzX3ZhbGlkX3BhZ2UodW5zaWduZWQgbG9uZyBwdHIpCit7CisJaWYgKHB0ciAmIH4weDNmZmZmZmZmVUwpIHsKKwkJc25kX3ByaW50aygibWF4IG1lbW9yeSBzaXplIGlzIDFHQiEhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwdHIgJiAoU05EUlZfVFJJREVOVF9QQUdFX1NJWkUtMSkpIHsKKwkJc25kX3ByaW50aygicGFnZSBpcyBub3QgYWxpZ25lZFxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHBhZ2UgYWxsb2NhdGlvbiBmb3IgRE1BIChTY2F0dGVyLUdhdGhlciB2ZXJzaW9uKQorICovCitzdGF0aWMgc25kX3V0aWxfbWVtYmxrX3QgKgorc25kX3RyaWRlbnRfYWxsb2Nfc2dfcGFnZXModHJpZGVudF90ICp0cmlkZW50LCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX3V0aWxfbWVtaGRyX3QgKmhkcjsKKwlzbmRfdXRpbF9tZW1ibGtfdCAqYmxrOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBpZHgsIHBhZ2U7CisJc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKKworCXNuZF9hc3NlcnQocnVudGltZS0+ZG1hX2J5dGVzID4gMCAmJiBydW50aW1lLT5kbWFfYnl0ZXMgPD0gU05EUlZfVFJJREVOVF9NQVhfUEFHRVMgKiBTTkRSVl9UUklERU5UX1BBR0VfU0laRSwgcmV0dXJuIE5VTEwpOworCWhkciA9IHRyaWRlbnQtPnRsYi5tZW1oZHI7CisJc25kX2Fzc2VydChoZHIgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOworCisJCisKKwlkb3duKCZoZHItPmJsb2NrX211dGV4KTsKKwlibGsgPSBzZWFyY2hfZW1wdHkoaGRyLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCWlmIChibGsgPT0gTlVMTCkgeworCQl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobGFzdHBnKGJsaykgLSBmaXJzdHBnKGJsaykgPj0gc2didWYtPnBhZ2VzKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgInBhZ2UgY2FsY3VsYXRpb24gZG9lc24ndCBtYXRjaDogYWxsb2NhdGVkIHBhZ2VzID0gJWQsIHRyaWRlbnQgPSAlZC8lZFxuIiwgc2didWYtPnBhZ2VzLCBmaXJzdHBnKGJsayksIGxhc3RwZyhibGspKTsKKwkJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIGJsayk7CisJCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQkJICAgCisJLyogc2V0IFRMQiBlbnRyaWVzICovCisJaWR4ID0gMDsKKwlmb3IgKHBhZ2UgPSBmaXJzdHBnKGJsayk7IHBhZ2UgPD0gbGFzdHBnKGJsayk7IHBhZ2UrKywgaWR4KyspIHsKKwkJZG1hX2FkZHJfdCBhZGRyID0gc2didWYtPnRhYmxlW2lkeF0uYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBwdHIgPSAodW5zaWduZWQgbG9uZylzZ2J1Zi0+dGFibGVbaWR4XS5idWY7CisJCWlmICghIGlzX3ZhbGlkX3BhZ2UoYWRkcikpIHsKKwkJCV9fc25kX3V0aWxfbWVtX2ZyZWUoaGRyLCBibGspOworCQkJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2V0X3RsYl9idXModHJpZGVudCwgcGFnZSwgcHRyLCBhZGRyKTsKKwl9CisJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCXJldHVybiBibGs7Cit9CisKKy8qCisgKiBwYWdlIGFsbG9jYXRpb24gZm9yIERNQSAoY29udGlndW91cyB2ZXJzaW9uKQorICovCitzdGF0aWMgc25kX3V0aWxfbWVtYmxrX3QgKgorc25kX3RyaWRlbnRfYWxsb2NfY29udF9wYWdlcyh0cmlkZW50X3QgKnRyaWRlbnQsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfdXRpbF9tZW1oZHJfdCAqaGRyOworCXNuZF91dGlsX21lbWJsa190ICpibGs7CisJaW50IHBhZ2U7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJZG1hX2FkZHJfdCBhZGRyOworCXVuc2lnbmVkIGxvbmcgcHRyOworCisJc25kX2Fzc2VydChydW50aW1lLT5kbWFfYnl0ZXM+IDAgJiYgcnVudGltZS0+ZG1hX2J5dGVzIDw9IFNORFJWX1RSSURFTlRfTUFYX1BBR0VTICogU05EUlZfVFJJREVOVF9QQUdFX1NJWkUsIHJldHVybiBOVUxMKTsKKwloZHIgPSB0cmlkZW50LT50bGIubWVtaGRyOworCXNuZF9hc3NlcnQoaGRyICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKworCWRvd24oJmhkci0+YmxvY2tfbXV0ZXgpOworCWJsayA9IHNlYXJjaF9lbXB0eShoZHIsIHJ1bnRpbWUtPmRtYV9ieXRlcyk7CisJaWYgKGJsayA9PSBOVUxMKSB7CisJCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQkJICAgCisJLyogc2V0IFRMQiBlbnRyaWVzICovCisJYWRkciA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKXJ1bnRpbWUtPmRtYV9hcmVhOworCWZvciAocGFnZSA9IGZpcnN0cGcoYmxrKTsgcGFnZSA8PSBsYXN0cGcoYmxrKTsgcGFnZSsrLAorCSAgICAgcHRyICs9IFNORFJWX1RSSURFTlRfUEFHRV9TSVpFLCBhZGRyICs9IFNORFJWX1RSSURFTlRfUEFHRV9TSVpFKSB7CisJCWlmICghIGlzX3ZhbGlkX3BhZ2UoYWRkcikpIHsKKwkJCV9fc25kX3V0aWxfbWVtX2ZyZWUoaGRyLCBibGspOworCQkJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2V0X3RsYl9idXModHJpZGVudCwgcGFnZSwgcHRyLCBhZGRyKTsKKwl9CisJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCXJldHVybiBibGs7Cit9CisKKy8qCisgKiBwYWdlIGFsbG9jYXRpb24gZm9yIERNQQorICovCitzbmRfdXRpbF9tZW1ibGtfdCAqCitzbmRfdHJpZGVudF9hbGxvY19wYWdlcyh0cmlkZW50X3QgKnRyaWRlbnQsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfYXNzZXJ0KHRyaWRlbnQgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOworCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKwlpZiAoc3Vic3RyZWFtLT5kbWFfYnVmZmVyLmRldi50eXBlID09IFNORFJWX0RNQV9UWVBFX0RFVl9TRykKKwkJcmV0dXJuIHNuZF90cmlkZW50X2FsbG9jX3NnX3BhZ2VzKHRyaWRlbnQsIHN1YnN0cmVhbSk7CisJZWxzZQorCQlyZXR1cm4gc25kX3RyaWRlbnRfYWxsb2NfY29udF9wYWdlcyh0cmlkZW50LCBzdWJzdHJlYW0pOworfQorCisKKy8qCisgKiByZWxlYXNlIERNQSBidWZmZXIgZnJvbSBwYWdlIHRhYmxlCisgKi8KK2ludCBzbmRfdHJpZGVudF9mcmVlX3BhZ2VzKHRyaWRlbnRfdCAqdHJpZGVudCwgc25kX3V0aWxfbWVtYmxrX3QgKmJsaykKK3sKKwlzbmRfdXRpbF9tZW1oZHJfdCAqaGRyOworCWludCBwYWdlOworCisJc25kX2Fzc2VydCh0cmlkZW50ICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfYXNzZXJ0KGJsayAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwloZHIgPSB0cmlkZW50LT50bGIubWVtaGRyOworCWRvd24oJmhkci0+YmxvY2tfbXV0ZXgpOworCS8qIHJlc2V0IFRMQiBlbnRyaWVzICovCisJZm9yIChwYWdlID0gZmlyc3RwZyhibGspOyBwYWdlIDw9IGxhc3RwZyhibGspOyBwYWdlKyspCisJCXNldF9zaWxlbnRfdGxiKHRyaWRlbnQsIHBhZ2UpOworCS8qIGZyZWUgbWVtb3J5IGJsb2NrICovCisJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIGJsayk7CisJdXAoJmhkci0+YmxvY2tfbXV0ZXgpOworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbWVtb3J5IGFsbG9jYXRpb24gdXNpbmcgbXVsdGlwbGUgcGFnZXMgKGZvciBzeW50aCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVW5saWtlIHRoZSBETUEgYWxsb2NhdGlvbiBhYm92ZSwgbm9uLWNvbnRpZ3VvdXMgcGFnZXMgYXJlCisgKiBhc3NpZ25lZCB0byBUTEIuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICovCitzdGF0aWMgaW50IHN5bnRoX2FsbG9jX3BhZ2VzKHRyaWRlbnRfdCAqaHcsIHNuZF91dGlsX21lbWJsa190ICpibGspOworc3RhdGljIGludCBzeW50aF9mcmVlX3BhZ2VzKHRyaWRlbnRfdCAqaHcsIHNuZF91dGlsX21lbWJsa190ICpibGspOworCisvKgorICogYWxsb2NhdGUgYSBzeW50aCBzYW1wbGUgYXJlYQorICovCitzbmRfdXRpbF9tZW1ibGtfdCAqCitzbmRfdHJpZGVudF9zeW50aF9hbGxvYyh0cmlkZW50X3QgKmh3LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzbmRfdXRpbF9tZW1ibGtfdCAqYmxrOworCXNuZF91dGlsX21lbWhkcl90ICpoZHIgPSBody0+dGxiLm1lbWhkcjsgCisKKwlkb3duKCZoZHItPmJsb2NrX211dGV4KTsKKwlibGsgPSBfX3NuZF91dGlsX21lbV9hbGxvYyhoZHIsIHNpemUpOworCWlmIChibGsgPT0gTlVMTCkgeworCQl1cCgmaGRyLT5ibG9ja19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3ludGhfYWxsb2NfcGFnZXMoaHcsIGJsaykpIHsKKwkJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIGJsayk7CisJCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwlyZXR1cm4gYmxrOworfQorCisKKy8qCisgKiBmcmVlIGEgc3ludGggc2FtcGxlIGFyZWEKKyAqLworaW50CitzbmRfdHJpZGVudF9zeW50aF9mcmVlKHRyaWRlbnRfdCAqaHcsIHNuZF91dGlsX21lbWJsa190ICpibGspCit7CisJc25kX3V0aWxfbWVtaGRyX3QgKmhkciA9IGh3LT50bGIubWVtaGRyOyAKKworCWRvd24oJmhkci0+YmxvY2tfbXV0ZXgpOworCXN5bnRoX2ZyZWVfcGFnZXMoaHcsIGJsayk7CisJIF9fc25kX3V0aWxfbWVtX2ZyZWUoaGRyLCBibGspOworCXVwKCZoZHItPmJsb2NrX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcmVzZXQgVExCIGVudHJ5IGFuZCBmcmVlIGtlcm5lbCBwYWdlCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX3RsYih0cmlkZW50X3QgKnRyaWRlbnQsIGludCBwYWdlKQoreworCXZvaWQgKnB0ciA9IHBhZ2VfdG9fcHRyKHRyaWRlbnQsIHBhZ2UpOworCWRtYV9hZGRyX3QgYWRkciA9IHBhZ2VfdG9fYWRkcih0cmlkZW50LCBwYWdlKTsKKwlzZXRfc2lsZW50X3RsYih0cmlkZW50LCBwYWdlKTsKKwlpZiAocHRyKSB7CisJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWFiOworCQlkbWFiLmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOworCQlkbWFiLmRldi5kZXYgPSBzbmRfZG1hX3BjaV9kYXRhKHRyaWRlbnQtPnBjaSk7CisJCWRtYWIuYXJlYSA9IHB0cjsKKwkJZG1hYi5hZGRyID0gYWRkcjsKKwkJZG1hYi5ieXRlcyA9IEFMSUdOX1BBR0VfU0laRTsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZkbWFiKTsKKwl9Cit9CisKKy8qIGNoZWNrIG5ldyBhbGxvY2F0aW9uIHJhbmdlICovCitzdGF0aWMgdm9pZCBnZXRfc2luZ2xlX3BhZ2VfcmFuZ2Uoc25kX3V0aWxfbWVtaGRyX3QgKmhkciwgc25kX3V0aWxfbWVtYmxrX3QgKmJsaywgaW50ICpmaXJzdF9wYWdlX3JldCwgaW50ICpsYXN0X3BhZ2VfcmV0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc25kX3V0aWxfbWVtYmxrX3QgKnE7CisJaW50IGZpcnN0X3BhZ2UsIGxhc3RfcGFnZTsKKwlmaXJzdF9wYWdlID0gZmlyc3RwZyhibGspOworCWlmICgocCA9IGJsay0+bGlzdC5wcmV2KSAhPSAmaGRyLT5ibG9jaykgeworCQlxID0gbGlzdF9lbnRyeShwLCBzbmRfdXRpbF9tZW1ibGtfdCwgbGlzdCk7CisJCWlmIChsYXN0cGcocSkgPT0gZmlyc3RfcGFnZSkKKwkJCWZpcnN0X3BhZ2UrKzsgIC8qIGZpcnN0IHBhZ2Ugd2FzIGFscmVhZHkgYWxsb2NhdGVkICovCisJfQorCWxhc3RfcGFnZSA9IGxhc3RwZyhibGspOworCWlmICgocCA9IGJsay0+bGlzdC5uZXh0KSAhPSAmaGRyLT5ibG9jaykgeworCQlxID0gbGlzdF9lbnRyeShwLCBzbmRfdXRpbF9tZW1ibGtfdCwgbGlzdCk7CisJCWlmIChmaXJzdHBnKHEpID09IGxhc3RfcGFnZSkKKwkJCWxhc3RfcGFnZS0tOyAvKiBsYXN0IHBhZ2Ugd2FzIGFscmVhZHkgYWxsb2NhdGVkICovCisJfQorCSpmaXJzdF9wYWdlX3JldCA9IGZpcnN0X3BhZ2U7CisJKmxhc3RfcGFnZV9yZXQgPSBsYXN0X3BhZ2U7Cit9CisKKy8qCisgKiBhbGxvY2F0ZSBrZXJuZWwgcGFnZXMgYW5kIGFzc2lnbiB0aGVtIHRvIFRMQgorICovCitzdGF0aWMgaW50IHN5bnRoX2FsbG9jX3BhZ2VzKHRyaWRlbnRfdCAqaHcsIHNuZF91dGlsX21lbWJsa190ICpibGspCit7CisJaW50IHBhZ2UsIGZpcnN0X3BhZ2UsIGxhc3RfcGFnZTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hYjsKKworCWZpcnN0cGcoYmxrKSA9IGdldF9hbGlnbmVkX3BhZ2UoYmxrLT5vZmZzZXQpOworCWxhc3RwZyhibGspID0gZ2V0X2FsaWduZWRfcGFnZShibGstPm9mZnNldCArIGJsay0+c2l6ZSAtIDEpOworCWdldF9zaW5nbGVfcGFnZV9yYW5nZShody0+dGxiLm1lbWhkciwgYmxrLCAmZmlyc3RfcGFnZSwgJmxhc3RfcGFnZSk7CisKKwkvKiBhbGxvY2F0ZSBhIGtlcm5lbCBwYWdlIGZvciBlYWNoIFRyaWRlbnQgcGFnZSAtCisJICogZm9ydHVuYXRlbHkgVHJpZGVudCBwYWdlIHNpemUgYW5kIGtlcm5lbCBQQUdFX1NJWkUgaXMgaWRlbnRpY2FsIQorCSAqLworCWZvciAocGFnZSA9IGZpcnN0X3BhZ2U7IHBhZ2UgPD0gbGFzdF9wYWdlOyBwYWdlKyspIHsKKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGh3LT5wY2kpLAorCQkJCQlBTElHTl9QQUdFX1NJWkUsICZkbWFiKSA8IDApCisJCQlnb3RvIF9fZmFpbDsKKwkJaWYgKCEgaXNfdmFsaWRfcGFnZShkbWFiLmFkZHIpKSB7CisJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmRtYWIpOworCQkJZ290byBfX2ZhaWw7CisJCX0KKwkJc2V0X3RsYl9idXMoaHcsIHBhZ2UsICh1bnNpZ25lZCBsb25nKWRtYWIuYXJlYSwgZG1hYi5hZGRyKTsKKwl9CisJcmV0dXJuIDA7CisKK19fZmFpbDoKKwkvKiByZWxlYXNlIGFsbG9jYXRlZCBwYWdlcyAqLworCWxhc3RfcGFnZSA9IHBhZ2UgLSAxOworCWZvciAocGFnZSA9IGZpcnN0X3BhZ2U7IHBhZ2UgPD0gbGFzdF9wYWdlOyBwYWdlKyspCisJCWNsZWFyX3RsYihodywgcGFnZSk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIGZyZWUgcGFnZXMKKyAqLworc3RhdGljIGludCBzeW50aF9mcmVlX3BhZ2VzKHRyaWRlbnRfdCAqdHJpZGVudCwgc25kX3V0aWxfbWVtYmxrX3QgKmJsaykKK3sKKwlpbnQgcGFnZSwgZmlyc3RfcGFnZSwgbGFzdF9wYWdlOworCisJZ2V0X3NpbmdsZV9wYWdlX3JhbmdlKHRyaWRlbnQtPnRsYi5tZW1oZHIsIGJsaywgJmZpcnN0X3BhZ2UsICZsYXN0X3BhZ2UpOworCWZvciAocGFnZSA9IGZpcnN0X3BhZ2U7IHBhZ2UgPD0gbGFzdF9wYWdlOyBwYWdlKyspCisJCWNsZWFyX3RsYih0cmlkZW50LCBwYWdlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY29weV9mcm9tX3VzZXIoYmxrICsgb2Zmc2V0LCBkYXRhLCBzaXplKQorICovCitpbnQgc25kX3RyaWRlbnRfc3ludGhfY29weV9mcm9tX3VzZXIodHJpZGVudF90ICp0cmlkZW50LCBzbmRfdXRpbF9tZW1ibGtfdCAqYmxrLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHBhZ2UsIG5leHRvZnMsIGVuZF9vZmZzZXQsIHRlbXAsIHRlbXAxOworCisJb2Zmc2V0ICs9IGJsay0+b2Zmc2V0OworCWVuZF9vZmZzZXQgPSBvZmZzZXQgKyBzaXplOworCXBhZ2UgPSBnZXRfYWxpZ25lZF9wYWdlKG9mZnNldCkgKyAxOworCWRvIHsKKwkJbmV4dG9mcyA9IGFsaWduZWRfcGFnZV9vZmZzZXQocGFnZSk7CisJCXRlbXAgPSBuZXh0b2ZzIC0gb2Zmc2V0OworCQl0ZW1wMSA9IGVuZF9vZmZzZXQgLSBvZmZzZXQ7CisJCWlmICh0ZW1wMSA8IHRlbXApCisJCQl0ZW1wID0gdGVtcDE7CisJCWlmIChjb3B5X2Zyb21fdXNlcihvZmZzZXRfcHRyKHRyaWRlbnQsIG9mZnNldCksIGRhdGEsIHRlbXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW9mZnNldCA9IG5leHRvZnM7CisJCWRhdGEgKz0gdGVtcDsKKwkJcGFnZSsrOworCX0gd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X3N5bnRoLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X3N5bnRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YTcxOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfc3ludGguYwpAQCAtMCwwICsxLDEwMzEgQEAKKy8qCisgKiAgUm91dGluZXMgZm9yIFRyaWRlbnQgNERXYXZlIE5YL0RYIHNvdW5kY2FyZHMgLSBTeW50aGVzaXplcgorICogIENvcHlyaWdodCAoYykgYnkgU2NvdHQgTWNOYWIgPGplZGlAdGFydGFydXMudXdhLmVkdS5hdT4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvdHJpZGVudC5oPgorI2luY2x1ZGUgPHNvdW5kL3NlcV9kZXZpY2UuaD4KKworTU9EVUxFX0FVVEhPUigiU2NvdHQgTWNOYWIgPGplZGlAdGFydGFydXMudXdhLmVkdS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm91dGluZXMgZm9yIFRyaWRlbnQgNERXYXZlIE5YL0RYIHNvdW5kY2FyZHMgLSBTeW50aGVzaXplciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBsaW5lYXIgdG8gbG9nIHBhbiBjb252ZXJzaW9uIHRhYmxlICg0LjIgY2hhbm5lbCBhdHRlbnVhdGlvbiBmb3JtYXQpICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBhbl90YWJsZVs2M10gPSB7CisJNzk1OSwgNzczMywgNzUxNCwgNzMwMSwgNzA5MywgNjg5MiwgNjY5NywgNjUwNywgCisJNjMyMiwgNjE0MywgNTk2OCwgNTc5OSwgNTYzNCwgNTQ3NSwgNTMxOSwgNTE2OCwgCisJNTAyMiwgNDg3OSwgNDc0MSwgNDYwNiwgNDQ3NSwgNDM0OSwgNDIyNSwgNDEwNSwgCisJMzk4OSwgMzg3NiwgMzc2NiwgMzY1OSwgMzU1NSwgMzQ1NCwgMzM1NiwgMzI2MSwgCisJMzE2OCwgMzA3OCwgMjk5MSwgMjkwNiwgMjgyNCwgMjc0NCwgMjY2NiwgMjU5MCwgCisJMjUxNywgMjQ0NSwgMjM3NiwgMjMwOCwgMjI0MywgMjE3OSwgMjExNywgMjA1NywgCisJMTk5OSwgMTk0MiwgMTg4NywgMTgzMywgMTc4MSwgMTczMSwgMTY4MiwgMTYzNCwgCisJMTU4OCwgMTU0MywgMTQ5OSwgMTQ1NiwgMTQxNSwgMTM3NSwgMTMzNgorfTsKKworI2RlZmluZSBMT0dfVEFCTEVfU0laRSAzODYKKworLyogTGluZWFyIGhhbGYtYXR0ZW51YXRpb24gdG8gbG9nIGNvbnZlcnNpb24gdGFibGUgaW4gdGhlIGZvcm1hdDoKKyAqICAge2xpbmVhciB2b2x1bWUsIGxvZ2FyaXRobWljIGF0dGVudWF0aW9uIGVxdWl2YWxlbnR9LCAuLi4KKyAqCisgKiBQcm92aWRlcyBjb252ZXJzaW9uIGZyb20gYSBsaW5lYXIgaGFsZi12b2x1bWUgdmFsdWUgaW4gdGhlIHJhbmdlCisgKiBbMCw4MTkyXSB0byBhIGxvZ2FyaXRobWljIGF0dGVudWF0aW9uIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDYuMDJkQi4KKyAqIEhhbHZpbmcgdGhlIGxpbmVhciB2b2x1bWUgaXMgZXF1aXZhbGVudCB0byBhbiBhZGRpdGlvbmFsIDZkQiBvZiAKKyAqIGxvZ2FyaXRobWljIGF0dGVudWF0aW9uLiBUaGUgYWxnb3JpdGhtIHVzZWQgaW4gbG9nX2Zyb21fbGluZWFyKCkKKyAqIHRoZXJlZm9yZSB1c2VzIHRoaXMgdGFibGUgYXMgZm9sbG93czoKKyAqIAorICogLSBsb29wIGFuZCBmb3IgZXZlcnkgdGltZSB0aGUgdm9sdW1lIGlzIGxlc3MgdGhhbiBoYWxmIHRoZSBtYXhpbXVtIAorICogICB2b2x1bWUgKDE2Mzg0KSwgYWRkIGFub3RoZXIgNmRCIGFuZCBoYWx2ZSB0aGUgbWF4aW11bSB2YWx1ZSB1c2VkCisgKiAgIGZvciB0aGlzIGNvbXBhcmlzb24uCisgKiAtIHdoZW4gdGhlIHZvbHVtZSBpcyBncmVhdGVyIHRoYW4gaGFsZiB0aGUgbWF4aW11bSB2b2x1bWUsIHRha2UKKyAqICAgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHZvbHVtZSB0byBoYWxmIHZvbHVtZSAoaW4gdGhlIHJhbmdlIFswLDgxOTJdKQorICogICBhbmQgbG9vayB1cCB0aGUgbG9nX3RhYmxlW10gdG8gZmluZCB0aGUgbmVhcmVzdCBlbnRyeS4KKyAqIC0gdGFrZSB0aGUgbG9nYXJpdGhpYyBjb21wb25lbnQgb2YgdGhpcyBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSAKKyAqICAgcmVzdWx0aW5nIGF0dGVudWF0aW9uLgorICoKKyAqIFRodXMgdGhpcyByb3V0aW5lIHByb3ZpZGVzIGEgbGluZWFyLT5sb2cgY29udmVyc2lvbiBmb3IgYSByYW5nZSBvZgorICogWzAsMTYzODRdIHVzaW5nIG9ubHkgMzg2IHRhYmxlIGVudHJpZXMKKyAqCisgKiBOb3RlOiBhbHRob3VnaCB0aGlzIHRhYmxlIHN0b3JlcyBsb2cgYXR0ZW51YXRpb24gaW4gOC44IGZvcm1hdCwgdmFsdWVzCisgKiB3ZXJlIG9ubHkgY2FsY3VsYXRlZCBmb3IgNiBiaXRzIGZyYWN0aW9uYWwgcHJlY2lzaW9uLCBzaW5jZSB0aGF0IGlzCisgKiB0aGUgbW9zdCBwcmVjaXNpb24gb2ZmZXJlZCBieSB0aGUgdHJpZGVudCBoYXJkd2FyZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbG9nX3RhYmxlW0xPR19UQUJMRV9TSVpFKjJdID0KK3sKKwk0LCAweDA2MDQsIDE5LCAweDA2MDAsIDM0LCAweDA1ZmMsIAorCTQ5LCAweDA1ZjgsIDYzLCAweDA1ZjQsIDc4LCAweDA1ZjAsIDkzLCAweDA1ZWMsIDEwOCwgMHgwNWU4LCAKKwkxMjMsIDB4MDVlNCwgMTM4LCAweDA1ZTAsIDE1MywgMHgwNWRjLCAxNjgsIDB4MDVkOCwgMTgzLCAweDA1ZDQsIAorCTE5OCwgMHgwNWQwLCAyMTMsIDB4MDVjYywgMjI4LCAweDA1YzgsIDI0NCwgMHgwNWM0LCAyNTksIDB4MDVjMCwgCisJMjc0LCAweDA1YmMsIDI4OSwgMHgwNWI4LCAzMDQsIDB4MDViNCwgMzIwLCAweDA1YjAsIDMzNSwgMHgwNWFjLCAKKwkzNTAsIDB4MDVhOCwgMzY2LCAweDA1YTQsIDM4MSwgMHgwNWEwLCAzOTcsIDB4MDU5YywgNDEyLCAweDA1OTgsIAorCTQyOCwgMHgwNTk0LCA0NDMsIDB4MDU5MCwgNDU5LCAweDA1OGMsIDQ3NCwgMHgwNTg4LCA0OTAsIDB4MDU4NCwgCisJNTA2LCAweDA1ODAsIDUyMSwgMHgwNTdjLCA1MzcsIDB4MDU3OCwgNTUzLCAweDA1NzQsIDU2OCwgMHgwNTcwLCAKKwk1ODQsIDB4MDU2YywgNjAwLCAweDA1NjgsIDYxNiwgMHgwNTY0LCA2MzIsIDB4MDU2MCwgNjQ3LCAweDA1NWMsIAorCTY2MywgMHgwNTU4LCA2NzksIDB4MDU1NCwgNjk1LCAweDA1NTAsIDcxMSwgMHgwNTRjLCA3MjcsIDB4MDU0OCwgCisJNzQzLCAweDA1NDQsIDc1OSwgMHgwNTQwLCA3NzYsIDB4MDUzYywgNzkyLCAweDA1MzgsIDgwOCwgMHgwNTM0LCAKKwk4MjQsIDB4MDUzMCwgODQwLCAweDA1MmMsIDg1NywgMHgwNTI4LCA4NzMsIDB4MDUyNCwgODg5LCAweDA1MjAsIAorCTkwNiwgMHgwNTFjLCA5MjIsIDB4MDUxOCwgOTM4LCAweDA1MTQsIDk1NSwgMHgwNTEwLCA5NzEsIDB4MDUwYywgCisJOTg4LCAweDA1MDgsIDEwMDQsIDB4MDUwNCwgMTAyMSwgMHgwNTAwLCAxMDM3LCAweDA0ZmMsIDEwNTQsIDB4MDRmOCwgCisJMTA3MSwgMHgwNGY0LCAxMDg3LCAweDA0ZjAsIDExMDQsIDB4MDRlYywgMTEyMSwgMHgwNGU4LCAxMTM4LCAweDA0ZTQsIAorCTExNTQsIDB4MDRlMCwgMTE3MSwgMHgwNGRjLCAxMTg4LCAweDA0ZDgsIDEyMDUsIDB4MDRkNCwgMTIyMiwgMHgwNGQwLCAKKwkxMjM5LCAweDA0Y2MsIDEyNTYsIDB4MDRjOCwgMTI3MywgMHgwNGM0LCAxMjkwLCAweDA0YzAsIDEzMDcsIDB4MDRiYywgCisJMTMyNCwgMHgwNGI4LCAxMzQxLCAweDA0YjQsIDEzNTgsIDB4MDRiMCwgMTM3NiwgMHgwNGFjLCAxMzkzLCAweDA0YTgsIAorCTE0MTAsIDB4MDRhNCwgMTQyNywgMHgwNGEwLCAxNDQ1LCAweDA0OWMsIDE0NjIsIDB4MDQ5OCwgMTQ3OSwgMHgwNDk0LCAKKwkxNDk3LCAweDA0OTAsIDE1MTQsIDB4MDQ4YywgMTUzMiwgMHgwNDg4LCAxNTQ5LCAweDA0ODQsIDE1NjcsIDB4MDQ4MCwgCisJMTU4NCwgMHgwNDdjLCAxNjAyLCAweDA0NzgsIDE2MjAsIDB4MDQ3NCwgMTYzNywgMHgwNDcwLCAxNjU1LCAweDA0NmMsIAorCTE2NzMsIDB4MDQ2OCwgMTY5MCwgMHgwNDY0LCAxNzA4LCAweDA0NjAsIDE3MjYsIDB4MDQ1YywgMTc0NCwgMHgwNDU4LCAKKwkxNzYyLCAweDA0NTQsIDE3ODAsIDB4MDQ1MCwgMTc5OCwgMHgwNDRjLCAxODE2LCAweDA0NDgsIDE4MzQsIDB4MDQ0NCwgCisJMTg1MiwgMHgwNDQwLCAxODcwLCAweDA0M2MsIDE4ODgsIDB4MDQzOCwgMTkwNiwgMHgwNDM0LCAxOTI0LCAweDA0MzAsIAorCTE5NDMsIDB4MDQyYywgMTk2MSwgMHgwNDI4LCAxOTc5LCAweDA0MjQsIDE5OTcsIDB4MDQyMCwgMjAxNiwgMHgwNDFjLCAKKwkyMDM0LCAweDA0MTgsIDIwNTMsIDB4MDQxNCwgMjA3MSwgMHgwNDEwLCAyMDg5LCAweDA0MGMsIDIxMDgsIDB4MDQwOCwgCisJMjEyNywgMHgwNDA0LCAyMTQ1LCAweDA0MDAsIDIxNjQsIDB4MDNmYywgMjE4MiwgMHgwM2Y4LCAyMjAxLCAweDAzZjQsIAorCTIyMjAsIDB4MDNmMCwgMjIzOSwgMHgwM2VjLCAyMjU3LCAweDAzZTgsIDIyNzYsIDB4MDNlNCwgMjI5NSwgMHgwM2UwLCAKKwkyMzE0LCAweDAzZGMsIDIzMzMsIDB4MDNkOCwgMjM1MiwgMHgwM2Q0LCAyMzcxLCAweDAzZDAsIDIzOTAsIDB4MDNjYywgCisJMjQwOSwgMHgwM2M4LCAyNDI4LCAweDAzYzQsIDI0NDcsIDB4MDNjMCwgMjQ2NiwgMHgwM2JjLCAyNDg1LCAweDAzYjgsIAorCTI1MDUsIDB4MDNiNCwgMjUyNCwgMHgwM2IwLCAyNTQzLCAweDAzYWMsIDI1NjIsIDB4MDNhOCwgMjU4MiwgMHgwM2E0LCAKKwkyNjAxLCAweDAzYTAsIDI2MjEsIDB4MDM5YywgMjY0MCwgMHgwMzk4LCAyNjYwLCAweDAzOTQsIDI2NzksIDB4MDM5MCwgCisJMjY5OSwgMHgwMzhjLCAyNzE4LCAweDAzODgsIDI3MzgsIDB4MDM4NCwgMjc1OCwgMHgwMzgwLCAyNzc3LCAweDAzN2MsIAorCTI3OTcsIDB4MDM3OCwgMjgxNywgMHgwMzc0LCAyODM3LCAweDAzNzAsIDI4NTcsIDB4MDM2YywgMjg3NiwgMHgwMzY4LCAKKwkyODk2LCAweDAzNjQsIDI5MTYsIDB4MDM2MCwgMjkzNiwgMHgwMzVjLCAyOTU2LCAweDAzNTgsIDI5NzYsIDB4MDM1NCwgCisJMjk5NywgMHgwMzUwLCAzMDE3LCAweDAzNGMsIDMwMzcsIDB4MDM0OCwgMzA1NywgMHgwMzQ0LCAzMDc3LCAweDAzNDAsIAorCTMwOTgsIDB4MDMzYywgMzExOCwgMHgwMzM4LCAzMTM4LCAweDAzMzQsIDMxNTksIDB4MDMzMCwgMzE3OSwgMHgwMzJjLCAKKwkzMjAwLCAweDAzMjgsIDMyMjAsIDB4MDMyNCwgMzI0MSwgMHgwMzIwLCAzMjYxLCAweDAzMWMsIDMyODIsIDB4MDMxOCwgCisJMzMwMywgMHgwMzE0LCAzMzIzLCAweDAzMTAsIDMzNDQsIDB4MDMwYywgMzM2NSwgMHgwMzA4LCAzMzg2LCAweDAzMDQsIAorCTM0MDYsIDB4MDMwMCwgMzQyNywgMHgwMmZjLCAzNDQ4LCAweDAyZjgsIDM0NjksIDB4MDJmNCwgMzQ5MCwgMHgwMmYwLCAKKwkzNTExLCAweDAyZWMsIDM1MzIsIDB4MDJlOCwgMzU1MywgMHgwMmU0LCAzNTc1LCAweDAyZTAsIDM1OTYsIDB4MDJkYywgCisJMzYxNywgMHgwMmQ4LCAzNjM4LCAweDAyZDQsIDM2NjAsIDB4MDJkMCwgMzY4MSwgMHgwMmNjLCAzNzAyLCAweDAyYzgsIAorCTM3MjQsIDB4MDJjNCwgMzc0NSwgMHgwMmMwLCAzNzY3LCAweDAyYmMsIDM3ODgsIDB4MDJiOCwgMzgxMCwgMHgwMmI0LCAKKwkzODMxLCAweDAyYjAsIDM4NTMsIDB4MDJhYywgMzg3NSwgMHgwMmE4LCAzODk2LCAweDAyYTQsIDM5MTgsIDB4MDJhMCwgCisJMzk0MCwgMHgwMjljLCAzOTYyLCAweDAyOTgsIDM5ODQsIDB4MDI5NCwgNDAwNiwgMHgwMjkwLCA0MDI4LCAweDAyOGMsIAorCTQwNTAsIDB4MDI4OCwgNDA3MiwgMHgwMjg0LCA0MDk0LCAweDAyODAsIDQxMTYsIDB4MDI3YywgNDEzOCwgMHgwMjc4LCAKKwk0MTYwLCAweDAyNzQsIDQxODIsIDB4MDI3MCwgNDIwNSwgMHgwMjZjLCA0MjI3LCAweDAyNjgsIDQyNDksIDB4MDI2NCwgCisJNDI3MiwgMHgwMjYwLCA0Mjk0LCAweDAyNWMsIDQzMTcsIDB4MDI1OCwgNDMzOSwgMHgwMjU0LCA0MzYyLCAweDAyNTAsIAorCTQzODQsIDB4MDI0YywgNDQwNywgMHgwMjQ4LCA0NDMwLCAweDAyNDQsIDQ0NTMsIDB4MDI0MCwgNDQ3NSwgMHgwMjNjLCAKKwk0NDk4LCAweDAyMzgsIDQ1MjEsIDB4MDIzNCwgNDU0NCwgMHgwMjMwLCA0NTY3LCAweDAyMmMsIDQ1OTAsIDB4MDIyOCwgCisJNDYxMywgMHgwMjI0LCA0NjM2LCAweDAyMjAsIDQ2NTksIDB4MDIxYywgNDY4MiwgMHgwMjE4LCA0NzA1LCAweDAyMTQsIAorCTQ3MjgsIDB4MDIxMCwgNDc1MiwgMHgwMjBjLCA0Nzc1LCAweDAyMDgsIDQ3OTgsIDB4MDIwNCwgNDgyMiwgMHgwMjAwLCAKKwk0ODQ1LCAweDAxZmMsIDQ4NjksIDB4MDFmOCwgNDg5MiwgMHgwMWY0LCA0OTE2LCAweDAxZjAsIDQ5MzksIDB4MDFlYywgCisJNDk2MywgMHgwMWU4LCA0OTg3LCAweDAxZTQsIDUwMTAsIDB4MDFlMCwgNTAzNCwgMHgwMWRjLCA1MDU4LCAweDAxZDgsIAorCTUwODIsIDB4MDFkNCwgNTEwNiwgMHgwMWQwLCA1MTMwLCAweDAxY2MsIDUxNTQsIDB4MDFjOCwgNTE3OCwgMHgwMWM0LCAKKwk1MjAyLCAweDAxYzAsIDUyMjYsIDB4MDFiYywgNTI1MCwgMHgwMWI4LCA1Mjc0LCAweDAxYjQsIDUyOTksIDB4MDFiMCwgCisJNTMyMywgMHgwMWFjLCA1MzQ3LCAweDAxYTgsIDUzNzIsIDB4MDFhNCwgNTM5NiwgMHgwMWEwLCA1NDIwLCAweDAxOWMsIAorCTU0NDUsIDB4MDE5OCwgNTQ2OSwgMHgwMTk0LCA1NDk0LCAweDAxOTAsIDU1MTksIDB4MDE4YywgNTU0MywgMHgwMTg4LCAKKwk1NTY4LCAweDAxODQsIDU1OTMsIDB4MDE4MCwgNTYxOCwgMHgwMTdjLCA1NjQzLCAweDAxNzgsIDU2NjgsIDB4MDE3NCwgCisJNTY5MiwgMHgwMTcwLCA1NzE3LCAweDAxNmMsIDU3NDMsIDB4MDE2OCwgNTc2OCwgMHgwMTY0LCA1NzkzLCAweDAxNjAsIAorCTU4MTgsIDB4MDE1YywgNTg0MywgMHgwMTU4LCA1ODY4LCAweDAxNTQsIDU4OTQsIDB4MDE1MCwgNTkxOSwgMHgwMTRjLCAKKwk1OTQ1LCAweDAxNDgsIDU5NzAsIDB4MDE0NCwgNTk5NSwgMHgwMTQwLCA2MDIxLCAweDAxM2MsIDYwNDcsIDB4MDEzOCwgCisJNjA3MiwgMHgwMTM0LCA2MDk4LCAweDAxMzAsIDYxMjQsIDB4MDEyYywgNjE0OSwgMHgwMTI4LCA2MTc1LCAweDAxMjQsIAorCTYyMDEsIDB4MDEyMCwgNjIyNywgMHgwMTFjLCA2MjUzLCAweDAxMTgsIDYyNzksIDB4MDExNCwgNjMwNSwgMHgwMTEwLCAKKwk2MzMxLCAweDAxMGMsIDYzNTcsIDB4MDEwOCwgNjM4NCwgMHgwMTA0LCA2NDEwLCAweDAxMDAsIDY0MzYsIDB4MDBmYywgCisJNjQ2MiwgMHgwMGY4LCA2NDg5LCAweDAwZjQsIDY1MTUsIDB4MDBmMCwgNjU0MiwgMHgwMGVjLCA2NTY4LCAweDAwZTgsIAorCTY1OTUsIDB4MDBlNCwgNjYyMSwgMHgwMGUwLCA2NjQ4LCAweDAwZGMsIDY2NzUsIDB4MDBkOCwgNjcwMiwgMHgwMGQ0LCAKKwk2NzI4LCAweDAwZDAsIDY3NTUsIDB4MDBjYywgNjc4MiwgMHgwMGM4LCA2ODA5LCAweDAwYzQsIDY4MzYsIDB4MDBjMCwgCisJNjg2MywgMHgwMGJjLCA2ODkwLCAweDAwYjgsIDY5MTcsIDB4MDBiNCwgNjk0NSwgMHgwMGIwLCA2OTcyLCAweDAwYWMsIAorCTY5OTksIDB4MDBhOCwgNzAyNywgMHgwMGE0LCA3MDU0LCAweDAwYTAsIDcwODEsIDB4MDA5YywgNzEwOSwgMHgwMDk4LCAKKwk3MTM2LCAweDAwOTQsIDcxNjQsIDB4MDA5MCwgNzE5MiwgMHgwMDhjLCA3MjE5LCAweDAwODgsIDcyNDcsIDB4MDA4NCwgCisJNzI3NSwgMHgwMDgwLCA3MzAzLCAweDAwN2MsIDczMzEsIDB4MDA3OCwgNzM1OSwgMHgwMDc0LCA3Mzg3LCAweDAwNzAsIAorCTc0MTUsIDB4MDA2YywgNzQ0MywgMHgwMDY4LCA3NDcxLCAweDAwNjQsIDc0OTksIDB4MDA2MCwgNzUyNywgMHgwMDVjLCAKKwk3NTU2LCAweDAwNTgsIDc1ODQsIDB4MDA1NCwgNzYxMywgMHgwMDUwLCA3NjQxLCAweDAwNGMsIDc2NjksIDB4MDA0OCwgCisJNzY5OCwgMHgwMDQ0LCA3NzI3LCAweDAwNDAsIDc3NTUsIDB4MDAzYywgNzc4NCwgMHgwMDM4LCA3ODEzLCAweDAwMzQsIAorCTc4NDIsIDB4MDAzMCwgNzg3MCwgMHgwMDJjLCA3ODk5LCAweDAwMjgsIDc5MjgsIDB4MDAyNCwgNzk1NywgMHgwMDIwLCAKKwk3OTg2LCAweDAwMWMsIDgwMTYsIDB4MDAxOCwgODA0NSwgMHgwMDE0LCA4MDc0LCAweDAwMTAsIDgxMDMsIDB4MDAwYywgCisJODEzMywgMHgwMDA4LCA4MTYyLCAweDAwMDQsIDgxOTIsIDB4MDAwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGxvb2t1cF92b2x1bWVfdGFibGUoIHVuc2lnbmVkIHNob3J0IHZhbHVlICkKK3sKKwkvKiBUaGlzIGNvZGUgaXMgYW4gb3B0aW1pc2VkIHZlcnNpb24gb2Y6CisJICogICBpbnQgaSA9IDA7CisJICogICB3aGlsZSggdm9sdW1lX3RhYmxlW2kqMl0gPCB2YWx1ZSApCisJICogICAgICAgaSsrOworCSAqICAgcmV0dXJuIHZvbHVtZV90YWJsZVtpKjIrMV07CisJICovCisJdW5zaWduZWQgc2hvcnQgKnB0ciA9IGxvZ190YWJsZTsKKwl3aGlsZSggKnB0ciA8IHZhbHVlICkKKwkJcHRyICs9IDI7CisJcmV0dXJuICoocHRyKzEpOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSA4LjggZml4ZWQgcG9pbnQgbG9nYXJpdGhtaWMgYXR0ZW51YXRpb24KKyAqIHZhbHVlIGZyb20gYSBsaW5lYXIgdm9sdW1lIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDE2Mzg0ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbG9nX2Zyb21fbGluZWFyKCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSApCit7CisJaWYgKHZhbHVlID49IDE2Mzg0KQorCQlyZXR1cm4gMHgwMDAwOworCWlmICh2YWx1ZSkgeworCQl1bnNpZ25lZCBzaG9ydCByZXN1bHQgPSAwOworCQlpbnQgdiwgYzsKKwkJZm9yKCBjID0gMCwgdiA9IDgxOTI7IGMgPCAxNDsgYysrLCB2ID4+PSAxICkgeworCQkJaWYoIHZhbHVlID49IHYgKSB7CisJCQkJcmVzdWx0ICs9IGxvb2t1cF92b2x1bWVfdGFibGUoICh2YWx1ZSAtIHYpIDw8IGMgKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzdWx0ICs9IDB4MDYwNTsJLyogNi4wMjA1IChyZXN1bHQgb2YgLTIwKmxvZzEwKDAuNSkpICovCisJCX0KKwl9CisJcmV0dXJuIDB4ZmZmZjsKK30KKworLyoKKyAqIFNhbXBsZSBoYW5kbGluZyBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIHZvaWQgc2FtcGxlX3N0YXJ0KHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgc25kX3NlcV9wb3NpdGlvbl90IHBvc2l0aW9uKTsKK3N0YXRpYyB2b2lkIHNhbXBsZV9zdG9wKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgc25kX3NlcV9zdG9wX21vZGVfdCBtb2RlKTsKK3N0YXRpYyB2b2lkIHNhbXBsZV9mcmVxKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgc25kX3NlcV9mcmVxdWVuY3lfdCBmcmVxKTsKK3N0YXRpYyB2b2lkIHNhbXBsZV92b2x1bWUodHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCBzbmRfc2VxX2V2X3ZvbHVtZV90ICogdm9sdW1lKTsKK3N0YXRpYyB2b2lkIHNhbXBsZV9sb29wKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgc25kX3NlcV9ldl9sb29wX3QgKiBsb29wKTsKK3N0YXRpYyB2b2lkIHNhbXBsZV9wb3ModHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCBzbmRfc2VxX3Bvc2l0aW9uX3QgcG9zaXRpb24pOworc3RhdGljIHZvaWQgc2FtcGxlX3ByaXZhdGUxKHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSwgdW5zaWduZWQgY2hhciAqZGF0YSk7CisKK3N0YXRpYyBzbmRfdHJpZGVudF9zYW1wbGVfb3BzX3Qgc2FtcGxlX29wcyA9Cit7CisJc2FtcGxlX3N0YXJ0LAorCXNhbXBsZV9zdG9wLAorCXNhbXBsZV9mcmVxLAorCXNhbXBsZV92b2x1bWUsCisJc2FtcGxlX2xvb3AsCisJc2FtcGxlX3BvcywKKwlzYW1wbGVfcHJpdmF0ZTEKK307CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3NpbXBsZV9pbml0KHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2b2ljZSkKK3sKKwkvL3ZvaWNlLT5oYW5kbGVyX3dhdmUgPSBpbnRlcnJ1cHRfd2F2ZTsKKwkvL3ZvaWNlLT5oYW5kbGVyX3ZvbHVtZSA9IGludGVycnVwdF92b2x1bWU7CisJLy92b2ljZS0+aGFuZGxlcl9lZmZlY3QgPSBpbnRlcnJ1cHRfZWZmZWN0OworCS8vdm9pY2UtPnZvbHVtZV9jaGFuZ2UgPSBOVUxMOworCXZvaWNlLT5zYW1wbGVfb3BzID0gJnNhbXBsZV9vcHM7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXBsZV9zdGFydCh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHNuZF9zZXFfcG9zaXRpb25fdCBwb3NpdGlvbikKK3sKKwlzaW1wbGVfaW5zdHJ1bWVudF90ICpzaW1wbGU7CisJc25kX3NlcV9raW5zdHJfdCAqaW5zdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbG9vcF9zdGFydCwgbG9vcF9lbmQsIHNhbXBsZV9zdGFydCwgc2FtcGxlX2VuZCwgc3RhcnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSAwOworCisJaW5zdHIgPSBzbmRfc2VxX2luc3RyX2ZpbmQodHJpZGVudC0+c3ludGguaWxpc3QsICZ2b2ljZS0+aW5zdHIsIDAsIDEpOworCWlmIChpbnN0ciA9PSBOVUxMKQorCQlyZXR1cm47CisJdm9pY2UtPmluc3RyID0gaW5zdHItPmluc3RyOwkvKiBjb3B5IElEIHRvIHNwZWVkdXAgYWxpYXNlcyAqLworCXNpbXBsZSA9IEtJTlNUUl9EQVRBKGluc3RyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTgpCisJCXZvaWNlLT5HVlNlbCA9IDE7CS8qIHJvdXRlIHRvIFdhdmUgdm9sdW1lICovCisKKwl2b2ljZS0+Q1RSTCA9IDA7CisJdm9pY2UtPkFscGhhID0gMDsKKwl2b2ljZS0+Rk1TID0gMDsKKworCWxvb3Bfc3RhcnQgPSBzaW1wbGUtPmxvb3Bfc3RhcnQgPj4gNDsKKwlsb29wX2VuZCA9IHNpbXBsZS0+bG9vcF9lbmQgPj4gNDsKKwlzYW1wbGVfc3RhcnQgPSAoc2ltcGxlLT5zdGFydCArIHBvc2l0aW9uKSA+PiA0OworCWlmKCBzYW1wbGVfc3RhcnQgPj0gc2ltcGxlLT5zaXplICkKKwkJc2FtcGxlX3N0YXJ0ID0gc2ltcGxlLT5zdGFydCA+PiA0OworCXNhbXBsZV9lbmQgPSBzaW1wbGUtPnNpemU7CisJc3RhcnRfb2Zmc2V0ID0gcG9zaXRpb24gPj4gNDsKKworCWlmIChzaW1wbGUtPmZvcm1hdCAmIFNJTVBMRV9XQVZFXzE2QklUKSB7CisJCXZvaWNlLT5DVFJMIHw9IDg7CisJCXNoaWZ0Kys7CisJfQorCWlmIChzaW1wbGUtPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1NURVJFTykgeworCQl2b2ljZS0+Q1RSTCB8PSA0OworCQlzaGlmdCsrOworCX0KKwlpZiAoIShzaW1wbGUtPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1VOU0lHTkVEKSkKKwkJdm9pY2UtPkNUUkwgfD0gMjsKKworCXZvaWNlLT5MQkEgPSBzaW1wbGUtPmFkZHJlc3MubWVtb3J5OworCisJaWYgKHNpbXBsZS0+Zm9ybWF0ICYgU0lNUExFX1dBVkVfTE9PUCkgeworCQl2b2ljZS0+Q1RSTCB8PSAxOworCQl2b2ljZS0+TEJBICs9IGxvb3Bfc3RhcnQgPDwgc2hpZnQ7CisJCWlmKCBzdGFydF9vZmZzZXQgPj0gbG9vcF9zdGFydCApIHsKKwkJCXZvaWNlLT5DU08gPSBzdGFydF9vZmZzZXQgLSBsb29wX3N0YXJ0OworCQkJdm9pY2UtPm5lZ0NTTyA9IDA7CisJCX0gZWxzZSB7CisJCQl2b2ljZS0+Q1NPID0gbG9vcF9zdGFydCAtIHN0YXJ0X29mZnNldDsKKwkJCXZvaWNlLT5uZWdDU08gPSAxOworCQl9CisJCXZvaWNlLT5FU08gPSBsb29wX2VuZCAtIGxvb3Bfc3RhcnQgLSAxOworCX0gZWxzZSB7CisJCXZvaWNlLT5MQkEgKz0gc3RhcnRfb2Zmc2V0IDw8IHNoaWZ0OworCQl2b2ljZS0+Q1NPID0gc2FtcGxlX3N0YXJ0OworCQl2b2ljZS0+RVNPID0gc2FtcGxlX2VuZCAtIDE7CisJCXZvaWNlLT5uZWdDU08gPSAwOworCX0KKworCWlmICh2b2ljZS0+ZmxhZ3MgJiBTTkRSVl9UUklERU5UX1ZGTEdfUlVOTklORykgeworCQlzbmRfdHJpZGVudF9zdG9wX3ZvaWNlKHRyaWRlbnQsIHZvaWNlLT5udW1iZXIpOworCQl2b2ljZS0+ZmxhZ3MgJj0gflNORFJWX1RSSURFTlRfVkZMR19SVU5OSU5HOworCX0KKworCS8qIHNldCBDU08gc2lnbiAqLworCXZhbHVlID0gaW5sKFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TSUdOX0NTT19BKSk7CisJaWYoIHZvaWNlLT5uZWdDU08gKSB7CisJCXZhbHVlIHw9IDEgPDwgKHZvaWNlLT5udW1iZXImMzEpOworCX0gZWxzZSB7CisJCXZhbHVlICY9IH4oMSA8PCAodm9pY2UtPm51bWJlciYzMSkpOworCX0KKwlvdXRsKHZhbHVlLFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9TSUdOX0NTT19BKSk7CisKKwl2b2ljZS0+QXR0cmlidXRlID0gMDsJCisJc25kX3RyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyh0cmlkZW50LCB2b2ljZSk7CisJc25kX3RyaWRlbnRfc3RhcnRfdm9pY2UodHJpZGVudCwgdm9pY2UtPm51bWJlcik7CisJdm9pY2UtPmZsYWdzIHw9IFNORFJWX1RSSURFTlRfVkZMR19SVU5OSU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX3NlcV9pbnN0cl9mcmVlX3VzZSh0cmlkZW50LT5zeW50aC5pbGlzdCwgaW5zdHIpOworfQorCitzdGF0aWMgdm9pZCBzYW1wbGVfc3RvcCh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHNuZF9zZXFfc3RvcF9tb2RlX3QgbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEodm9pY2UtPmZsYWdzICYgU05EUlZfVFJJREVOVF9WRkxHX1JVTk5JTkcpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwlkZWZhdWx0OgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc25kX3RyaWRlbnRfc3RvcF92b2ljZSh0cmlkZW50LCB2b2ljZS0+bnVtYmVyKTsKKwkJdm9pY2UtPmZsYWdzICY9IH5TTkRSVl9UUklERU5UX1ZGTEdfUlVOTklORzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTEVfU1RPUF9MT09QOgkvKiBkaXNhYmxlIGxvb3Agb25seSAqLworCQl2b2ljZS0+Q1RSTCAmPSB+MTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJCW91dGIoKHVuc2lnbmVkIGNoYXIpIHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJCW91dHcoKCgodm9pY2UtPkNUUkwgPDwgMTIpIHwgKHZvaWNlLT5FQyAmIDB4MGZmZikpICYgMHhmZmZmKSwgQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYW1wbGVfZnJlcSh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHNuZF9zZXFfZnJlcXVlbmN5X3QgZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWZyZXEgPj49IDQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoZnJlcSA9PSA0NDEwMCkKKwkJdm9pY2UtPkRlbHRhID0gMHhlYjM7CisJZWxzZSBpZiAoZnJlcSA9PSA4MDAwKQorCQl2b2ljZS0+RGVsdGEgPSAweDJhYjsKKwllbHNlIGlmIChmcmVxID09IDQ4MDAwKQorCQl2b2ljZS0+RGVsdGEgPSAweDEwMDA7CisJZWxzZQorCQl2b2ljZS0+RGVsdGEgPSAoKChmcmVxIDw8IDEyKSArIGZyZXEpIC8gNDgwMDApICYgMHgwMDAwZmZmZjsKKworCW91dGIoKHVuc2lnbmVkIGNoYXIpIHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSB2b2ljZS0+RGVsdGEsIFRSSURfUkVHKHRyaWRlbnQsIENIX05YX0RFTFRBX0NTTyArIDMpKTsKKwkJb3V0YigodW5zaWduZWQgY2hhcikgKHZvaWNlLT5EZWx0YSA+PiA4KSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPICsgMykpOworCX0gZWxzZSB7CisJCW91dHcoKHVuc2lnbmVkIHNob3J0KSB2b2ljZS0+RGVsdGEsIFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0VTT19ERUxUQSkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXBsZV92b2x1bWUodHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCBzbmRfc2VxX2V2X3ZvbHVtZV90ICogdm9sdW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgdmFsdWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl2b2ljZS0+R1ZTZWwgPSAwOwkvKiB1c2UgZ2xvYmFsIG11c2ljIHZvbHVtZSAqLworCXZvaWNlLT5GTUMgPSAweDAzOwkvKiBmaXhtZTogY2FuIHdlIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBGTUM/ICovCisJaWYgKHZvbHVtZS0+dm9sdW1lID49IDApIHsKKwkJdm9sdW1lLT52b2x1bWUgJj0gMHgzZmZmOworCQkvKiBsaW5lYXIgdm9sdW1lIC0+IGxvZ2FyaXRobWljIGF0dGVudWF0aW9uIGNvbnZlcnNpb24KKwkJICogdXNlcyBFQyByZWdpc3RlciBmb3IgZ3JlYXRlciByZXNvbHV0aW9uICg2LjYgYml0cykgdGhhbiBWb2wgcmVnaXN0ZXIgKDUuMyBiaXRzKQorCQkgKiBWb2wgcmVnaXN0ZXIgdXNlZCB3aGVuIGFkZGl0aW9uYWwgYXR0ZW51YXRpb24gaXMgcmVxdWlyZWQgKi8KKwkJdm9pY2UtPlJWb2wgPSAwOworCQl2b2ljZS0+Q1ZvbCA9IDA7CisJCXZhbHVlID0gbG9nX2Zyb21fbGluZWFyKCB2b2x1bWUtPnZvbHVtZSApOworCQl2b2ljZS0+Vm9sID0gMDsKKwkJdm9pY2UtPkVDID0gKHZhbHVlICYgMHgzZmZmKSA+PiAyOworCQlpZiAodmFsdWUgPiAweDNmZmYpIHsKKwkJCXZvaWNlLT5FQyB8PSAweGZjMDsKKwkJCWlmICh2YWx1ZSA8IDB4NWYwMCApCisJCQkJdm9pY2UtPlZvbCA9ICgodmFsdWUgPj4gOCkgLSAweDNmKSA8PCA1OworCQkJZWxzZSB7CisJCQkJdm9pY2UtPlZvbCA9IDB4M2ZmOworCQkJCXZvaWNlLT5FQyA9IDB4ZmZmOworCQkJfQorCQl9CisJfQorCWlmICh2b2x1bWUtPmxyID49IDApIHsKKwkJdm9sdW1lLT5sciAmPSAweDNmZmY7CisJCS8qIGFwcHJveGltYXRlIGxpbmVhciBwYW4gYnkgYXR0ZW51YXRpbmcgY2hhbm5lbHMgKi8KKwkJaWYgKHZvbHVtZS0+bHIgPj0gMHgyMDAwKSB7CS8qIGF0dGVudWF0ZSBsZWZ0IChwYW4gcmlnaHQpICovCisJCQl2YWx1ZSA9IDB4M2ZmZiAtIHZvbHVtZS0+bHI7CisJCQlmb3IgKHZvaWNlLT5QYW4gPSAwOyB2b2ljZS0+UGFuIDwgNjM7IHZvaWNlLT5QYW4rKyApIAorCQkJCWlmICh2YWx1ZSA+PSBwYW5fdGFibGVbdm9pY2UtPlBhbl0gKQorCQkJCQlicmVhazsKKwkJfSBlbHNlIHsJCQkvKiBhdHRlbnVhdGUgcmlnaHQgKHBhbiBsZWZ0KSAqLworCQkJZm9yICh2b2ljZS0+UGFuID0gMDsgdm9pY2UtPlBhbiA8IDYzOyB2b2ljZS0+UGFuKysgKSAKKwkJCQlpZiAoKHVuc2lnbmVkIGludCl2b2x1bWUtPmxyID49IHBhbl90YWJsZVt2b2ljZS0+UGFuXSApCisJCQkJCWJyZWFrOworCQkJdm9pY2UtPlBhbiB8PSAweDQwOworCQl9CisJfQorCW91dGIoKHVuc2lnbmVkIGNoYXIpIHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJb3V0bCgodm9pY2UtPkdWU2VsIDw8IDMxKSB8ICgodm9pY2UtPlBhbiAmIDB4MDAwMDAwN2YpIDw8IDI0KSB8CisJCSAoKHZvaWNlLT5Wb2wgJiAweDAwMDAwMGZmKSA8PCAxNikgfCAoKHZvaWNlLT5DVFJMICYgMHgwMDAwMDAwZikgPDwgMTIpIHwKKwkJICh2b2ljZS0+RUMgJiAweDAwMDAwZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDKSk7CisJdmFsdWUgPSAoKHZvaWNlLT5GTUMgJiAweDAzKSA8PCAxNCkgfCAoKHZvaWNlLT5SVm9sICYgMHg3ZikgPDwgNykgfCAodm9pY2UtPkNWb2wgJiAweDdmKTsKKwlvdXR3KHZhbHVlLCBUUklEX1JFRyh0cmlkZW50LCBDSF9EWF9GTUNfUlZPTF9DVk9MKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2FtcGxlX2xvb3AodHJpZGVudF90ICogdHJpZGVudCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHZvaWNlLCBzbmRfc2VxX2V2X2xvb3BfdCAqIGxvb3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaW1wbGVfaW5zdHJ1bWVudF90ICpzaW1wbGU7CisJc25kX3NlcV9raW5zdHJfdCAqaW5zdHI7CisJdW5zaWduZWQgaW50IGxvb3Bfc3RhcnQsIGxvb3BfZW5kOworCisJaW5zdHIgPSBzbmRfc2VxX2luc3RyX2ZpbmQodHJpZGVudC0+c3ludGguaWxpc3QsICZ2b2ljZS0+aW5zdHIsIDAsIDEpOworCWlmIChpbnN0ciA9PSBOVUxMKQorCQlyZXR1cm47CisJdm9pY2UtPmluc3RyID0gaW5zdHItPmluc3RyOwkvKiBjb3B5IElEIHRvIHNwZWVkdXAgYWxpYXNlcyAqLworCXNpbXBsZSA9IEtJTlNUUl9EQVRBKGluc3RyKTsKKworCWxvb3Bfc3RhcnQgPSBsb29wLT5zdGFydCA+PiA0OworCWxvb3BfZW5kID0gbG9vcC0+ZW5kID4+IDQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXZvaWNlLT5MQkEgPSBzaW1wbGUtPmFkZHJlc3MubWVtb3J5ICsgbG9vcF9zdGFydDsKKwl2b2ljZS0+Q1NPID0gMDsKKwl2b2ljZS0+RVNPID0gbG9vcF9lbmQgLSBsb29wX3N0YXJ0IC0gMTsKKworCW91dGIoKHVuc2lnbmVkIGNoYXIpIHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJb3V0Yigodm9pY2UtPkxCQSA+PiAxNiksIFRSSURfUkVHKHRyaWRlbnQsIENIX0xCQSArIDIpKTsKKwlvdXR3KCh2b2ljZS0+TEJBICYgMHhmZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfTEJBKSk7CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlvdXRiKCh2b2ljZS0+RVNPID4+IDE2KSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPICsgMikpOworCQlvdXR3KCh2b2ljZS0+RVNPICYgMHhmZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPKSk7CisJCW91dGIoKHZvaWNlLT5DU08gPj4gMTYpLCBUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08gKyAyKSk7CisJCW91dHcoKHZvaWNlLT5DU08gJiAweGZmZmYpLCBUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08pKTsKKwl9IGVsc2UgeworCQlvdXR3KCh2b2ljZS0+RVNPICYgMHhmZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfRVNPX0RFTFRBICsgMikpOworCQlvdXR3KCh2b2ljZS0+Q1NPICYgMHhmZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF9zZXFfaW5zdHJfZnJlZV91c2UodHJpZGVudC0+c3ludGguaWxpc3QsIGluc3RyKTsKK30KKworc3RhdGljIHZvaWQgc2FtcGxlX3Bvcyh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHNuZF9zZXFfcG9zaXRpb25fdCBwb3NpdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNpbXBsZV9pbnN0cnVtZW50X3QgKnNpbXBsZTsKKwlzbmRfc2VxX2tpbnN0cl90ICppbnN0cjsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwlpbnN0ciA9IHNuZF9zZXFfaW5zdHJfZmluZCh0cmlkZW50LT5zeW50aC5pbGlzdCwgJnZvaWNlLT5pbnN0ciwgMCwgMSk7CisJaWYgKGluc3RyID09IE5VTEwpCisJCXJldHVybjsKKwl2b2ljZS0+aW5zdHIgPSBpbnN0ci0+aW5zdHI7CS8qIGNvcHkgSUQgdG8gc3BlZWR1cCBhbGlhc2VzICovCisJc2ltcGxlID0gS0lOU1RSX0RBVEEoaW5zdHIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlpZiAoc2ltcGxlLT5mb3JtYXQgJiBTSU1QTEVfV0FWRV9MT09QKSB7CisJCWlmKCBwb3NpdGlvbiA+PSBzaW1wbGUtPmxvb3Bfc3RhcnQgKSB7CisJCQl2b2ljZS0+Q1NPID0gKHBvc2l0aW9uIC0gc2ltcGxlLT5sb29wX3N0YXJ0KSA+PiA0OworCQkJdm9pY2UtPm5lZ0NTTyA9IDA7CisJCX0gZWxzZSB7CisJCQl2b2ljZS0+Q1NPID0gKHNpbXBsZS0+bG9vcF9zdGFydCAtIHBvc2l0aW9uKSA+PiA0OworCQkJdm9pY2UtPm5lZ0NTTyA9IDE7CisJCX0KKwl9IGVsc2UgeworCQl2b2ljZS0+Q1NPID0gcG9zaXRpb24gPj4gNDsKKwkJdm9pY2UtPm5lZ0NTTyA9IDA7CisJfQorCisJLyogc2V0IENTTyBzaWduICovCisJdmFsdWUgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgVDREX1NJR05fQ1NPX0EpKTsKKwlpZiggdm9pY2UtPm5lZ0NTTyApIHsKKwkJdmFsdWUgfD0gMSA8PCAodm9pY2UtPm51bWJlciYzMSk7CisJfSBlbHNlIHsKKwkJdmFsdWUgJj0gfigxIDw8ICh2b2ljZS0+bnVtYmVyJjMxKSk7CisJfQorCW91dGwodmFsdWUsVFJJRF9SRUcodHJpZGVudCwgVDREX1NJR05fQ1NPX0EpKTsKKwkKKworCW91dGIoKHVuc2lnbmVkIGNoYXIpIHZvaWNlLT5udW1iZXIsIFRSSURfUkVHKHRyaWRlbnQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJaWYgKHRyaWRlbnQtPmRldmljZSA9PSBUUklERU5UX0RFVklDRV9JRF9OWCkgeworCQlvdXR3KCh2b2ljZS0+Q1NPICYgMHhmZmZmKSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfQ1NPKSk7CisJCW91dGIoKHZvaWNlLT5DU08gPj4gMTYpLCBUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08gKyAyKSk7CisJfSBlbHNlIHsKKwkJb3V0dygodm9pY2UtPkNTTyAmIDB4ZmZmZiksIFRSSURfUkVHKHRyaWRlbnQsIENIX0RYX0NTT19BTFBIQV9GTVMpICsgMik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfc2VxX2luc3RyX2ZyZWVfdXNlKHRyaWRlbnQtPnN5bnRoLmlsaXN0LCBpbnN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXBsZV9wcml2YXRlMSh0cmlkZW50X3QgKiB0cmlkZW50LCBzbmRfdHJpZGVudF92b2ljZV90ICogdm9pY2UsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7Cit9CisKKy8qCisgKiBNZW1vcnkgbWFuYWdlbWVudCAvIHNhbXBsZSBsb2FkaW5nCisgKi8KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zaW1wbGVfcHV0X3NhbXBsZSh2b2lkICpwcml2YXRlX2RhdGEsIHNpbXBsZV9pbnN0cnVtZW50X3QgKiBpbnN0ciwKKwkJCQkJIGNoYXIgX191c2VyICpkYXRhLCBsb25nIGxlbiwgaW50IGF0b21pYykKK3sKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBwcml2YXRlX2RhdGE7CisJaW50IHNpemUgPSBpbnN0ci0+c2l6ZTsKKwlpbnQgc2hpZnQgPSAwOworCisJaWYgKGluc3RyLT5mb3JtYXQgJiBTSU1QTEVfV0FWRV9CQUNLV0FSRCB8fAorCSAgICBpbnN0ci0+Zm9ybWF0ICYgU0lNUExFX1dBVkVfQklESVIgfHwKKwkgICAgaW5zdHItPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1VMQVcpIAorCQlyZXR1cm4gLUVJTlZBTDsJLyogbm90IHN1cHBvcnRlZCAqLworCisJaWYgKGluc3RyLT5mb3JtYXQgJiBTSU1QTEVfV0FWRV8xNkJJVCkKKwkJc2hpZnQrKzsKKwlpZiAoaW5zdHItPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1NURVJFTykKKwkJc2hpZnQrKzsKKwlzaXplIDw8PSBzaGlmdDsKKworCWlmICh0cmlkZW50LT5zeW50aC5jdXJyZW50X3NpemUgKyBzaXplID4gdHJpZGVudC0+c3ludGgubWF4X3NpemUpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGEsIHNpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlzbmRfdXRpbF9tZW1ibGtfdCAqbWVtYmxrOworCQltZW1ibGsgPSBzbmRfdHJpZGVudF9zeW50aF9hbGxvYyh0cmlkZW50LCBzaXplKTsgCisJCWlmIChtZW1ibGsgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoc25kX3RyaWRlbnRfc3ludGhfY29weV9mcm9tX3VzZXIodHJpZGVudCwgbWVtYmxrLCAwLCBkYXRhLCBzaXplKSApIHsKKwkJCXNuZF90cmlkZW50X3N5bnRoX2ZyZWUodHJpZGVudCwgbWVtYmxrKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWluc3RyLT5hZGRyZXNzLnB0ciA9ICh1bnNpZ25lZCBjaGFyKiltZW1ibGs7CisJCWluc3RyLT5hZGRyZXNzLm1lbW9yeSA9IG1lbWJsay0+b2Zmc2V0OworCX0gZWxzZSB7CisJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWFiOworCQlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKKwkJCQkJc2l6ZSwgJmRtYWIpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFiLmFyZWEsIGRhdGEsIHNpemUpKSB7CisJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmRtYWIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaW5zdHItPmFkZHJlc3MucHRyID0gZG1hYi5hcmVhOworCQlpbnN0ci0+YWRkcmVzcy5tZW1vcnkgPSBkbWFiLmFkZHI7CisJfQorCisJdHJpZGVudC0+c3ludGguY3VycmVudF9zaXplICs9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc2ltcGxlX2dldF9zYW1wbGUodm9pZCAqcHJpdmF0ZV9kYXRhLCBzaW1wbGVfaW5zdHJ1bWVudF90ICogaW5zdHIsCisJCQkJCSBjaGFyIF9fdXNlciAqZGF0YSwgbG9uZyBsZW4sIGludCBhdG9taWMpCit7CisJLy90cmlkZW50X3QgKnRyaWRlbnQgPSBwcml2YXRlX2RhdGE7CisJaW50IHNpemUgPSBpbnN0ci0+c2l6ZTsKKwlpbnQgc2hpZnQgPSAwOworCisJaWYgKGluc3RyLT5mb3JtYXQgJiBTSU1QTEVfV0FWRV8xNkJJVCkKKwkJc2hpZnQrKzsKKwlpZiAoaW5zdHItPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1NURVJFTykKKwkJc2hpZnQrKzsKKwlzaXplIDw8PSBzaGlmdDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YSwgc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogRklYTUU6IG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc2ltcGxlX3JlbW92ZV9zYW1wbGUodm9pZCAqcHJpdmF0ZV9kYXRhLCBzaW1wbGVfaW5zdHJ1bWVudF90ICogaW5zdHIsCisJCQkJCSAgICBpbnQgYXRvbWljKQoreworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHByaXZhdGVfZGF0YTsKKwlpbnQgc2l6ZSA9IGluc3RyLT5zaXplOworCisJaWYgKGluc3RyLT5mb3JtYXQgJiBTSU1QTEVfV0FWRV8xNkJJVCkKKwkJc2l6ZSA8PD0gMTsKKwlpZiAoaW5zdHItPmZvcm1hdCAmIFNJTVBMRV9XQVZFX1NURVJFTykKKwkJc2l6ZSA8PD0gMTsKKworCWlmICh0cmlkZW50LT50bGIuZW50cmllcykgeworCQlzbmRfdXRpbF9tZW1ibGtfdCAqbWVtYmxrID0gKHNuZF91dGlsX21lbWJsa190KilpbnN0ci0+YWRkcmVzcy5wdHI7CisJCWlmIChtZW1ibGspCisJCQlzbmRfdHJpZGVudF9zeW50aF9mcmVlKHRyaWRlbnQsIG1lbWJsayk7CisJCWVsc2UKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWFiOworCQlkbWFiLmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOworCQlkbWFiLmRldi5kZXYgPSBzbmRfZG1hX3BjaV9kYXRhKHRyaWRlbnQtPnBjaSk7CisJCWRtYWIuYXJlYSA9IGluc3RyLT5hZGRyZXNzLnB0cjsKKwkJZG1hYi5hZGRyID0gaW5zdHItPmFkZHJlc3MubWVtb3J5OworCQlkbWFiLmJ5dGVzID0gc2l6ZTsKKwkJc25kX2RtYV9mcmVlX3BhZ2VzKCZkbWFiKTsKKwl9CisKKwl0cmlkZW50LT5zeW50aC5jdXJyZW50X3NpemUgLT0gc2l6ZTsKKwlpZiAodHJpZGVudC0+c3ludGguY3VycmVudF9zaXplIDwgMCkJLyogc2hvdWxkbid0IG5lZWQgdGhpcyBjaGVjay4uLiAqLworCQl0cmlkZW50LT5zeW50aC5jdXJyZW50X3NpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbGVjdF9pbnN0cnVtZW50KHRyaWRlbnRfdCAqIHRyaWRlbnQsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2KQoreworCXNuZF9zZXFfa2luc3RyX3QgKmluc3RyOworCWluc3RyID0gc25kX3NlcV9pbnN0cl9maW5kKHRyaWRlbnQtPnN5bnRoLmlsaXN0LCAmdi0+aW5zdHIsIDAsIDEpOworCWlmIChpbnN0ciAhPSBOVUxMKSB7CisJCWlmIChpbnN0ci0+b3BzKSB7CisJCQlpZiAoIXN0cmNtcChpbnN0ci0+b3BzLT5pbnN0cl90eXBlLCBTTkRSVl9TRVFfSU5TVFJfSURfU0lNUExFKSkKKwkJCQlzbmRfdHJpZGVudF9zaW1wbGVfaW5pdCh2KTsKKwkJfQorCQlzbmRfc2VxX2luc3RyX2ZyZWVfdXNlKHRyaWRlbnQtPnN5bnRoLmlsaXN0LCBpbnN0cik7CisJfQorfQorCisvKgorCisgKi8KKworc3RhdGljIHZvaWQgZXZlbnRfc2FtcGxlKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfc3RvcCkKKwkJdi0+c2FtcGxlX29wcy0+c2FtcGxlX3N0b3AocC0+dHJpZGVudCwgdiwgU0FNUExFX1NUT1BfSU1NRURJQVRFTFkpOworCXYtPmluc3RyLnN0ZCA9IGV2LT5kYXRhLnNhbXBsZS5wYXJhbS5zYW1wbGUuc3RkOworCWlmICh2LT5pbnN0ci5zdGQgJiAweGZmMDAwMDAwKSB7CS8qIHByaXZhdGUgaW5zdHJ1bWVudCAqLworCQl2LT5pbnN0ci5zdGQgJj0gMHgwMGZmZmZmZjsKKwkJdi0+aW5zdHIuc3RkIHw9ICh1bnNpZ25lZCBpbnQpZXYtPnNvdXJjZS5jbGllbnQgPDwgMjQ7CisJfQorCXYtPmluc3RyLmJhbmsgPSBldi0+ZGF0YS5zYW1wbGUucGFyYW0uc2FtcGxlLmJhbms7CisJdi0+aW5zdHIucHJnID0gZXYtPmRhdGEuc2FtcGxlLnBhcmFtLnNhbXBsZS5wcmc7CisJc2VsZWN0X2luc3RydW1lbnQocC0+dHJpZGVudCwgdik7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X2NsdXN0ZXIoc25kX3NlcV9ldmVudF90ICogZXYsIHNuZF90cmlkZW50X3BvcnRfdCAqIHAsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2KQoreworCWlmICh2LT5zYW1wbGVfb3BzICYmIHYtPnNhbXBsZV9vcHMtPnNhbXBsZV9zdG9wKQorCQl2LT5zYW1wbGVfb3BzLT5zYW1wbGVfc3RvcChwLT50cmlkZW50LCB2LCBTQU1QTEVfU1RPUF9JTU1FRElBVEVMWSk7CisJdi0+aW5zdHIuY2x1c3RlciA9IGV2LT5kYXRhLnNhbXBsZS5wYXJhbS5jbHVzdGVyLmNsdXN0ZXI7CisJc2VsZWN0X2luc3RydW1lbnQocC0+dHJpZGVudCwgdik7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X3N0YXJ0KHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfc3RhcnQpCisJCXYtPnNhbXBsZV9vcHMtPnNhbXBsZV9zdGFydChwLT50cmlkZW50LCB2LCBldi0+ZGF0YS5zYW1wbGUucGFyYW0ucG9zaXRpb24pOworfQorCitzdGF0aWMgdm9pZCBldmVudF9zdG9wKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfc3RvcCkKKwkJdi0+c2FtcGxlX29wcy0+c2FtcGxlX3N0b3AocC0+dHJpZGVudCwgdiwgZXYtPmRhdGEuc2FtcGxlLnBhcmFtLnN0b3BfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X2ZyZXEoc25kX3NlcV9ldmVudF90ICogZXYsIHNuZF90cmlkZW50X3BvcnRfdCAqIHAsIHNuZF90cmlkZW50X3ZvaWNlX3QgKiB2KQoreworCWlmICh2LT5zYW1wbGVfb3BzICYmIHYtPnNhbXBsZV9vcHMtPnNhbXBsZV9mcmVxKQorCQl2LT5zYW1wbGVfb3BzLT5zYW1wbGVfZnJlcShwLT50cmlkZW50LCB2LCBldi0+ZGF0YS5zYW1wbGUucGFyYW0uZnJlcXVlbmN5KTsKK30KKworc3RhdGljIHZvaWQgZXZlbnRfdm9sdW1lKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfdm9sdW1lKQorCQl2LT5zYW1wbGVfb3BzLT5zYW1wbGVfdm9sdW1lKHAtPnRyaWRlbnQsIHYsICZldi0+ZGF0YS5zYW1wbGUucGFyYW0udm9sdW1lKTsKK30KKworc3RhdGljIHZvaWQgZXZlbnRfbG9vcChzbmRfc2VxX2V2ZW50X3QgKiBldiwgc25kX3RyaWRlbnRfcG9ydF90ICogcCwgc25kX3RyaWRlbnRfdm9pY2VfdCAqIHYpCit7CisJaWYgKHYtPnNhbXBsZV9vcHMgJiYgdi0+c2FtcGxlX29wcy0+c2FtcGxlX2xvb3ApCisJCXYtPnNhbXBsZV9vcHMtPnNhbXBsZV9sb29wKHAtPnRyaWRlbnQsIHYsICZldi0+ZGF0YS5zYW1wbGUucGFyYW0ubG9vcCk7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X3Bvc2l0aW9uKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfcG9zKQorCQl2LT5zYW1wbGVfb3BzLT5zYW1wbGVfcG9zKHAtPnRyaWRlbnQsIHYsIGV2LT5kYXRhLnNhbXBsZS5wYXJhbS5wb3NpdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X3ByaXZhdGUxKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdikKK3sKKwlpZiAodi0+c2FtcGxlX29wcyAmJiB2LT5zYW1wbGVfb3BzLT5zYW1wbGVfcHJpdmF0ZTEpCisJCXYtPnNhbXBsZV9vcHMtPnNhbXBsZV9wcml2YXRlMShwLT50cmlkZW50LCB2LCAodW5zaWduZWQgY2hhciAqKSAmZXYtPmRhdGEuc2FtcGxlLnBhcmFtLnJhdzgpOworfQorCit0eXBlZGVmIHZvaWQgKHRyaWRlbnRfc2FtcGxlX2V2ZW50X2hhbmRsZXJfdCkgKHNuZF9zZXFfZXZlbnRfdCAqIGV2LCBzbmRfdHJpZGVudF9wb3J0X3QgKiBwLCBzbmRfdHJpZGVudF92b2ljZV90ICogdik7CisKK3N0YXRpYyB0cmlkZW50X3NhbXBsZV9ldmVudF9oYW5kbGVyX3QgKnRyaWRlbnRfc2FtcGxlX2V2ZW50X2hhbmRsZXJzWzldID0KK3sKKwlldmVudF9zYW1wbGUsCisJZXZlbnRfY2x1c3RlciwKKwlldmVudF9zdGFydCwKKwlldmVudF9zdG9wLAorCWV2ZW50X2ZyZXEsCisJZXZlbnRfdm9sdW1lLAorCWV2ZW50X2xvb3AsCisJZXZlbnRfcG9zaXRpb24sCisJZXZlbnRfcHJpdmF0ZTEKK307CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3NhbXBsZV9ldmVudChzbmRfc2VxX2V2ZW50X3QgKiBldiwgc25kX3RyaWRlbnRfcG9ydF90ICogcCkKK3sKKwlpbnQgaWR4LCB2b2ljZTsKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBwLT50cmlkZW50OworCXNuZF90cmlkZW50X3ZvaWNlX3QgKnY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlkeCA9IGV2LT50eXBlIC0gU05EUlZfU0VRX0VWRU5UX1NBTVBMRTsKKwlpZiAoaWR4IDwgMCB8fCBpZHggPiA4KQorCQlyZXR1cm47CisJZm9yICh2b2ljZSA9IDA7IHZvaWNlIDwgNjQ7IHZvaWNlKyspIHsKKwkJdiA9ICZ0cmlkZW50LT5zeW50aC52b2ljZXNbdm9pY2VdOworCQlpZiAodi0+dXNlICYmIHYtPmNsaWVudCA9PSBldi0+c291cmNlLmNsaWVudCAmJgorCQkgICAgdi0+cG9ydCA9PSBldi0+c291cmNlLnBvcnQgJiYKKwkJICAgIHYtPmluZGV4ID09IGV2LT5kYXRhLnNhbXBsZS5jaGFubmVsKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQkJdHJpZGVudF9zYW1wbGVfZXZlbnRfaGFuZGxlcnNbaWR4XSAoZXYsIHAsIHYpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKgorCisgKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfc3ludGhfZnJlZV92b2ljZXModHJpZGVudF90ICogdHJpZGVudCwgaW50IGNsaWVudCwgaW50IHBvcnQpCit7CisJaW50IGlkeDsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgMzI7IGlkeCsrKSB7CisJCXZvaWNlID0gJnRyaWRlbnQtPnN5bnRoLnZvaWNlc1tpZHhdOworCQlpZiAodm9pY2UtPnVzZSAmJiB2b2ljZS0+Y2xpZW50ID09IGNsaWVudCAmJiB2b2ljZS0+cG9ydCA9PSBwb3J0KQorCQkJc25kX3RyaWRlbnRfZnJlZV92b2ljZSh0cmlkZW50LCB2b2ljZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF90cmlkZW50X3N5bnRoX3VzZSh2b2lkICpwcml2YXRlX2RhdGEsIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqIGluZm8pCit7CisJc25kX3RyaWRlbnRfcG9ydF90ICpwb3J0ID0gKHNuZF90cmlkZW50X3BvcnRfdCAqKSBwcml2YXRlX2RhdGE7CisJdHJpZGVudF90ICp0cmlkZW50ID0gcG9ydC0+dHJpZGVudDsKKwlzbmRfdHJpZGVudF92b2ljZV90ICp2b2ljZTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5mby0+dm9pY2VzID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgaW5mby0+dm9pY2VzOyBpZHgrKykgeworCQl2b2ljZSA9IHNuZF90cmlkZW50X2FsbG9jX3ZvaWNlKHRyaWRlbnQsIFNORFJWX1RSSURFTlRfVk9JQ0VfVFlQRV9TWU5USCwgaW5mby0+c2VuZGVyLmNsaWVudCwgaW5mby0+c2VuZGVyLnBvcnQpOworCQlpZiAodm9pY2UgPT0gTlVMTCkgeworCQkJc25kX3RyaWRlbnRfc3ludGhfZnJlZV92b2ljZXModHJpZGVudCwgaW5mby0+c2VuZGVyLmNsaWVudCwgaW5mby0+c2VuZGVyLnBvcnQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJpZGVudC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJdm9pY2UtPmluZGV4ID0gaWR4OworCQl2b2ljZS0+Vm9sID0gMHgzZmY7CisJCXZvaWNlLT5FQyA9IDB4MGZmZjsKKwl9CisjaWYgMAorCWZvciAoaWR4ID0gMDsgaWR4IDwgaW5mby0+bWlkaV92b2ljZXM7IGlkeCsrKSB7CisJCXBvcnQtPm1pZGlfaGFzX3ZvaWNlcyA9IDE7CisJCXZvaWNlID0gc25kX3RyaWRlbnRfYWxsb2Nfdm9pY2UodHJpZGVudCwgU05EUlZfVFJJREVOVF9WT0lDRV9UWVBFX01JREksIGluZm8tPnNlbmRlci5jbGllbnQsIGluZm8tPnNlbmRlci5wb3J0KTsKKwkJaWYgKHZvaWNlID09IE5VTEwpIHsKKwkJCXNuZF90cmlkZW50X3N5bnRoX2ZyZWVfdm9pY2VzKHRyaWRlbnQsIGluZm8tPnNlbmRlci5jbGllbnQsIGluZm8tPnNlbmRlci5wb3J0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXZvaWNlLT5Wb2wgPSAweDNmZjsKKwkJdm9pY2UtPkVDID0gMHgwZmZmOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3ludGhfdW51c2Uodm9pZCAqcHJpdmF0ZV9kYXRhLCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKiBpbmZvKQoreworCXNuZF90cmlkZW50X3BvcnRfdCAqcG9ydCA9IChzbmRfdHJpZGVudF9wb3J0X3QgKikgcHJpdmF0ZV9kYXRhOworCXRyaWRlbnRfdCAqdHJpZGVudCA9IHBvcnQtPnRyaWRlbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF90cmlkZW50X3N5bnRoX2ZyZWVfdm9pY2VzKHRyaWRlbnQsIGluZm8tPnNlbmRlci5jbGllbnQsIGluZm8tPnNlbmRlci5wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmlkZW50LT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorCisgKi8KKworc3RhdGljIHZvaWQgc25kX3RyaWRlbnRfc3ludGhfZnJlZV9wcml2YXRlX2luc3RydW1lbnRzKHNuZF90cmlkZW50X3BvcnRfdCAqIHAsIGludCBjbGllbnQpCit7CisJc25kX3NlcV9pbnN0cl9oZWFkZXJfdCBpZnJlZTsKKworCW1lbXNldCgmaWZyZWUsIDAsIHNpemVvZihpZnJlZSkpOworCWlmcmVlLmNtZCA9IFNORFJWX1NFUV9JTlNUUl9GUkVFX0NNRF9QUklWQVRFOworCXNuZF9zZXFfaW5zdHJfbGlzdF9mcmVlX2NvbmQocC0+dHJpZGVudC0+c3ludGguaWxpc3QsICZpZnJlZSwgY2xpZW50LCAwKTsKK30KKworc3RhdGljIGludCBzbmRfdHJpZGVudF9zeW50aF9ldmVudF9pbnB1dChzbmRfc2VxX2V2ZW50X3QgKiBldiwgaW50IGRpcmVjdCwgdm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgYXRvbWljLCBpbnQgaG9wKQoreworCXNuZF90cmlkZW50X3BvcnRfdCAqcCA9IChzbmRfdHJpZGVudF9wb3J0X3QgKikgcHJpdmF0ZV9kYXRhOworCisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGV2LT50eXBlID49IFNORFJWX1NFUV9FVkVOVF9TQU1QTEUgJiYKKwkgICAgZXYtPnR5cGUgPD0gU05EUlZfU0VRX0VWRU5UX1NBTVBMRV9QUklWQVRFMSkgeworCQlzbmRfdHJpZGVudF9zYW1wbGVfZXZlbnQoZXYsIHApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGV2LT5zb3VyY2UuY2xpZW50ID09IFNORFJWX1NFUV9DTElFTlRfU1lTVEVNICYmCisJICAgIGV2LT5zb3VyY2UucG9ydCA9PSBTTkRSVl9TRVFfUE9SVF9TWVNURU1fQU5OT1VOQ0UpIHsKKwkJaWYgKGV2LT50eXBlID09IFNORFJWX1NFUV9FVkVOVF9DTElFTlRfRVhJVCkgeworCQkJc25kX3RyaWRlbnRfc3ludGhfZnJlZV9wcml2YXRlX2luc3RydW1lbnRzKHAsIGV2LT5kYXRhLmFkZHIuY2xpZW50KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChkaXJlY3QpIHsKKwkJaWYgKGV2LT50eXBlID49IFNORFJWX1NFUV9FVkVOVF9JTlNUUl9CRUdJTikgeworCQkJc25kX3NlcV9pbnN0cl9ldmVudCgmcC0+dHJpZGVudC0+c3ludGguc2ltcGxlX29wcy5rb3BzLAorCQkJCQkgICAgcC0+dHJpZGVudC0+c3ludGguaWxpc3QsIGV2LAorCQkJCQkgICAgcC0+dHJpZGVudC0+c3ludGguc2VxX2NsaWVudCwgYXRvbWljLCBob3ApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3N5bnRoX2luc3RyX25vdGlmeSh2b2lkICpwcml2YXRlX2RhdGEsCisJCQkJCSAgIHNuZF9zZXFfa2luc3RyX3QgKiBpbnN0ciwKKwkJCQkJICAgaW50IHdoYXQpCit7CisJaW50IGlkeDsKKwl0cmlkZW50X3QgKnRyaWRlbnQgPSBwcml2YXRlX2RhdGE7CisJc25kX3RyaWRlbnRfdm9pY2VfdCAqcHZvaWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJpZGVudC0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgNjQ7IGlkeCsrKSB7CisJCXB2b2ljZSA9ICZ0cmlkZW50LT5zeW50aC52b2ljZXNbaWR4XTsKKwkJaWYgKHB2b2ljZS0+dXNlICYmICFtZW1jbXAoJnB2b2ljZS0+aW5zdHIsICZpbnN0ci0+aW5zdHIsIHNpemVvZihwdm9pY2UtPmluc3RyKSkpIHsKKwkJCWlmIChwdm9pY2UtPnNhbXBsZV9vcHMgJiYgcHZvaWNlLT5zYW1wbGVfb3BzLT5zYW1wbGVfc3RvcCkgeworCQkJCXB2b2ljZS0+c2FtcGxlX29wcy0+c2FtcGxlX3N0b3AodHJpZGVudCwgcHZvaWNlLCBTQU1QTEVfU1RPUF9JTU1FRElBVEVMWSk7CisJCQl9IGVsc2UgeworCQkJCXNuZF90cmlkZW50X3N0b3Bfdm9pY2UodHJpZGVudCwgcHZvaWNlLT5udW1iZXIpOworCQkJCXB2b2ljZS0+ZmxhZ3MgJj0gflNORFJWX1RSSURFTlRfVkZMR19SVU5OSU5HOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyaWRlbnQtPmV2ZW50X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKworICovCisKK3N0YXRpYyB2b2lkIHNuZF90cmlkZW50X3N5bnRoX2ZyZWVfcG9ydCh2b2lkICpwcml2YXRlX2RhdGEpCit7CisJc25kX3RyaWRlbnRfcG9ydF90ICpwID0gKHNuZF90cmlkZW50X3BvcnRfdCAqKSBwcml2YXRlX2RhdGE7CisKKwlpZiAocCkKKwkJc25kX21pZGlfY2hhbm5lbF9mcmVlX3NldChwLT5jaHNldCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3ludGhfY3JlYXRlX3BvcnQodHJpZGVudF90ICogdHJpZGVudCwgaW50IGlkeCkKK3sKKwlzbmRfdHJpZGVudF9wb3J0X3QgKnA7CisJc25kX3NlcV9wb3J0X2NhbGxiYWNrX3QgY2FsbGJhY2tzOworCWNoYXIgbmFtZVszMl07CisJY2hhciAqc3RyOworCWludCByZXN1bHQ7CisKKwlwID0gJnRyaWRlbnQtPnN5bnRoLnNlcV9wb3J0c1tpZHhdOworCXAtPmNoc2V0ID0gc25kX21pZGlfY2hhbm5lbF9hbGxvY19zZXQoMTYpOworCWlmIChwLT5jaHNldCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwLT5jaHNldC0+cHJpdmF0ZV9kYXRhID0gcDsKKwlwLT50cmlkZW50ID0gdHJpZGVudDsKKwlwLT5jbGllbnQgPSB0cmlkZW50LT5zeW50aC5zZXFfY2xpZW50OworCisJbWVtc2V0KCZjYWxsYmFja3MsIDAsIHNpemVvZihjYWxsYmFja3MpKTsKKwljYWxsYmFja3Mub3duZXIgPSBUSElTX01PRFVMRTsKKwljYWxsYmFja3MudXNlID0gc25kX3RyaWRlbnRfc3ludGhfdXNlOworCWNhbGxiYWNrcy51bnVzZSA9IHNuZF90cmlkZW50X3N5bnRoX3VudXNlOworCWNhbGxiYWNrcy5ldmVudF9pbnB1dCA9IHNuZF90cmlkZW50X3N5bnRoX2V2ZW50X2lucHV0OworCWNhbGxiYWNrcy5wcml2YXRlX2ZyZWUgPSBzbmRfdHJpZGVudF9zeW50aF9mcmVlX3BvcnQ7CisJY2FsbGJhY2tzLnByaXZhdGVfZGF0YSA9IHA7CisKKwlzdHIgPSAiPz8/IjsKKwlzd2l0Y2ggKHRyaWRlbnQtPmRldmljZSkgeworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfRFg6CXN0ciA9ICJUcmlkZW50IDREV2F2ZS1EWCI7IGJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfTlg6CXN0ciA9ICJUcmlkZW50IDREV2F2ZS1OWCI7IGJyZWFrOworCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4OglzdHIgPSAiU2lTIDcwMTgiOyBicmVhazsKKwl9CisJc3ByaW50ZihuYW1lLCAiJXMgcG9ydCAlaSIsIHN0ciwgaWR4KTsKKwlwLT5jaHNldC0+cG9ydCA9IHNuZF9zZXFfZXZlbnRfcG9ydF9hdHRhY2godHJpZGVudC0+c3ludGguc2VxX2NsaWVudCwKKwkJCQkJCSAgICZjYWxsYmFja3MsCisJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9DQVBfV1JJVEUgfCBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19XUklURSwKKwkJCQkJCSAgIFNORFJWX1NFUV9QT1JUX1RZUEVfRElSRUNUX1NBTVBMRSB8CisJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRILAorCQkJCQkJICAgMTYsIDAsCisJCQkJCQkgICBuYW1lKTsKKwlpZiAocC0+Y2hzZXQtPnBvcnQgPCAwKSB7CisJCXJlc3VsdCA9IHAtPmNoc2V0LT5wb3J0OworCQlzbmRfdHJpZGVudF9zeW50aF9mcmVlX3BvcnQocCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCXAtPnBvcnQgPSBwLT5jaHNldC0+cG9ydDsKKwlyZXR1cm4gMDsKK30KKworLyoKKworICovCisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3ludGhfbmV3X2RldmljZShzbmRfc2VxX2RldmljZV90ICpkZXYpCit7CisJdHJpZGVudF90ICp0cmlkZW50OworCWludCBjbGllbnQsIGk7CisJc25kX3NlcV9jbGllbnRfY2FsbGJhY2tfdCBjYWxsYmFja3M7CisJc25kX3NlcV9jbGllbnRfaW5mb190IGNpbmZvOworCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCBzdWI7CisJc25kX3NpbXBsZV9vcHNfdCAqc2ltcGxlb3BzOworCWNoYXIgKnN0cjsKKworCXRyaWRlbnQgPSAqKHRyaWRlbnRfdCAqKilTTkRSVl9TRVFfREVWSUNFX0FSR1BUUihkZXYpOworCWlmICh0cmlkZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdHJpZGVudC0+c3ludGguc2VxX2NsaWVudCA9IC0xOworCisJLyogYWxsb2NhdGUgbmV3IGNsaWVudCAqLworCW1lbXNldCgmY2FsbGJhY2tzLCAwLCBzaXplb2YoY2FsbGJhY2tzKSk7CisJY2FsbGJhY2tzLnByaXZhdGVfZGF0YSA9IHRyaWRlbnQ7CisJY2FsbGJhY2tzLmFsbG93X291dHB1dCA9IGNhbGxiYWNrcy5hbGxvd19pbnB1dCA9IDE7CisJY2xpZW50ID0gdHJpZGVudC0+c3ludGguc2VxX2NsaWVudCA9CisJICAgIHNuZF9zZXFfY3JlYXRlX2tlcm5lbF9jbGllbnQodHJpZGVudC0+Y2FyZCwgMSwgJmNhbGxiYWNrcyk7CisJaWYgKGNsaWVudCA8IDApCisJCXJldHVybiBjbGllbnQ7CisKKwkvKiBjaGFuZ2UgbmFtZSBvZiBjbGllbnQgKi8KKwltZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKKwljaW5mby5jbGllbnQgPSBjbGllbnQ7CisJY2luZm8udHlwZSA9IEtFUk5FTF9DTElFTlQ7CisJc3RyID0gIj8/PyI7CisJc3dpdGNoICh0cmlkZW50LT5kZXZpY2UpIHsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX0RYOglzdHIgPSAiVHJpZGVudCA0RFdhdmUtRFgiOyBicmVhazsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX05YOglzdHIgPSAiVHJpZGVudCA0RFdhdmUtTlgiOyBicmVhazsKKwljYXNlIFRSSURFTlRfREVWSUNFX0lEX1NJNzAxODoJc3RyID0gIlNpUyA3MDE4IjsgYnJlYWs7CisJfQorCXNwcmludGYoY2luZm8ubmFtZSwgc3RyKTsKKwlzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKGNsaWVudCwgU05EUlZfU0VRX0lPQ1RMX1NFVF9DTElFTlRfSU5GTywgJmNpbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXNuZF90cmlkZW50X3N5bnRoX2NyZWF0ZV9wb3J0KHRyaWRlbnQsIGkpOworCisJdHJpZGVudC0+c3ludGguaWxpc3QgPSBzbmRfc2VxX2luc3RyX2xpc3RfbmV3KCk7CisJaWYgKHRyaWRlbnQtPnN5bnRoLmlsaXN0ID09IE5VTEwpIHsKKwkJc25kX3NlcV9kZWxldGVfa2VybmVsX2NsaWVudChjbGllbnQpOworCQl0cmlkZW50LT5zeW50aC5zZXFfY2xpZW50ID0gLTE7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0cmlkZW50LT5zeW50aC5pbGlzdC0+ZmxhZ3MgPSBTTkRSVl9TRVFfSU5TVFJfRkxHX0RJUkVDVDsKKworCXNpbXBsZW9wcyA9ICZ0cmlkZW50LT5zeW50aC5zaW1wbGVfb3BzOworCXNuZF9zZXFfc2ltcGxlX2luaXQoc2ltcGxlb3BzLCB0cmlkZW50LCBOVUxMKTsKKwlzaW1wbGVvcHMtPnB1dF9zYW1wbGUgPSBzbmRfdHJpZGVudF9zaW1wbGVfcHV0X3NhbXBsZTsKKwlzaW1wbGVvcHMtPmdldF9zYW1wbGUgPSBzbmRfdHJpZGVudF9zaW1wbGVfZ2V0X3NhbXBsZTsKKwlzaW1wbGVvcHMtPnJlbW92ZV9zYW1wbGUgPSBzbmRfdHJpZGVudF9zaW1wbGVfcmVtb3ZlX3NhbXBsZTsKKwlzaW1wbGVvcHMtPm5vdGlmeSA9IHNuZF90cmlkZW50X3N5bnRoX2luc3RyX25vdGlmeTsKKworCW1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7CisJc3ViLnNlbmRlci5jbGllbnQgPSBTTkRSVl9TRVFfQ0xJRU5UX1NZU1RFTTsKKwlzdWIuc2VuZGVyLnBvcnQgPSBTTkRSVl9TRVFfUE9SVF9TWVNURU1fQU5OT1VOQ0U7CisJc3ViLmRlc3QuY2xpZW50ID0gY2xpZW50OworCXN1Yi5kZXN0LnBvcnQgPSAwOworCXNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwoY2xpZW50LCBTTkRSVl9TRVFfSU9DVExfU1VCU0NSSUJFX1BPUlQsICZzdWIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RyaWRlbnRfc3ludGhfZGVsZXRlX2RldmljZShzbmRfc2VxX2RldmljZV90ICpkZXYpCit7CisJdHJpZGVudF90ICp0cmlkZW50OworCisJdHJpZGVudCA9ICoodHJpZGVudF90ICoqKVNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKGRldik7CisJaWYgKHRyaWRlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHJpZGVudC0+c3ludGguc2VxX2NsaWVudCA+PSAwKSB7CisJCXNuZF9zZXFfZGVsZXRlX2tlcm5lbF9jbGllbnQodHJpZGVudC0+c3ludGguc2VxX2NsaWVudCk7CisJCXRyaWRlbnQtPnN5bnRoLnNlcV9jbGllbnQgPSAtMTsKKwl9CisJaWYgKHRyaWRlbnQtPnN5bnRoLmlsaXN0KQorCQlzbmRfc2VxX2luc3RyX2xpc3RfZnJlZSgmdHJpZGVudC0+c3ludGguaWxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX3RyaWRlbnRfc3ludGhfaW5pdCh2b2lkKQoreworCXN0YXRpYyBzbmRfc2VxX2Rldl9vcHNfdCBvcHMgPQorCXsKKwkJc25kX3RyaWRlbnRfc3ludGhfbmV3X2RldmljZSwKKwkJc25kX3RyaWRlbnRfc3ludGhfZGVsZXRlX2RldmljZQorCX07CisKKwlyZXR1cm4gc25kX3NlcV9kZXZpY2VfcmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfVFJJREVOVCwgJm9wcywKKwkJCQkJICAgICAgc2l6ZW9mKHRyaWRlbnRfdCopKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfdHJpZGVudF9zeW50aF9leGl0KHZvaWQpCit7CisJc25kX3NlcV9kZXZpY2VfdW5yZWdpc3Rlcl9kcml2ZXIoU05EUlZfU0VRX0RFVl9JRF9UUklERU5UKTsKK30KKworbW9kdWxlX2luaXQoYWxzYV90cmlkZW50X3N5bnRoX2luaXQpCittb2R1bGVfZXhpdChhbHNhX3RyaWRlbnRfc3ludGhfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4LmMgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2U4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCkBAIC0wLDAgKzEsMjM0NiBAQAorLyoKKyAqICAgQUxTQSBkcml2ZXIgZm9yIFZJQSBWVDgyeHggKFNvdXRoIEJyaWRnZSkKKyAqCisgKiAgIFZUODJDNjg2QS9CL0MsIFZUODIzM0EvQywgVlQ4MjM1CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCSAgICAgICAgICAgICAgICAgICBUamVlcmQuTXVsZGVyIDxUamVlcmQuTXVsZGVyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKgorICogQ2hhbmdlczoKKyAqCisgKiBEZWMuIDE5LCAyMDAyCVRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCS0gdXNlIHRoZSBEU1ggY2hhbm5lbHMgZm9yIHRoZSBmaXJzdCBwY20gcGxheWJhY2suCisgKgkgIChvbiBWSUE4MjMzLCA4MjMzQyBhbmQgODIzNSBvbmx5KQorICoJICB0aGlzIHdpbGwgYWxsb3cgeW91IHBsYXkgc2ltdWx0YW5lb3VzbHkgdXAgdG8gNCBzdHJlYW1zLgorICoJICBtdWx0aS1jaGFubmVsIHBsYXliYWNrIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWNvbmQgZGV2aWNlCisgKgkgIG9uIHRoZXNlIGNoaXBzLgorICoJLSBzdXBwb3J0IHRoZSBzZWNvbmRhcnkgY2FwdHVyZSAob24gVklBODIzMy9DLDgyMzUpCisgKgktIFNQRElGIHN1cHBvcnQKKyAqCSAgdGhlIERTWDMgY2hhbm5lbCBjYW4gYmUgdXNlZCBmb3IgU1BESUYgb3V0cHV0LgorICoJICBvbiBWSUE4MjMzQSwgdGhpcyBjaGFubmVsIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWNvbmQgcGNtCisgKgkgIHBsYXliYWNrLgorICoJICB0aGUgY2FyZCBjb25maWcgb2YgYWxzYS1saWIgd2lsbCBhc3NpZ24gdGhlIGNvcnJlY3QKKyAqCSAgZGV2aWNlIGZvciBhcHBsaWNhdGlvbnMuCisgKgktIGNsZWFuIHVwIHRoZSBjb2RlLCBzZXBhcmF0ZSBsb3ctbGV2ZWwgaW5pdGlhbGl6YXRpb24KKyAqCSAgcm91dGluZXMgZm9yIGVhY2ggY2hpcHNldC4KKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaWYgMAorI2RlZmluZSBQT0lOVEVSX0RFQlVHCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgVlQ4Mnh4IGF1ZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tWSUEsVlQ4MkM2ODZBL0IvQyxwY2l9LHtWSUEsVlQ4MjMzQS9DLDgyMzV9fSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCitzdGF0aWMgbG9uZyBtcHVfcG9ydFtTTkRSVl9DQVJEU107CisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworc3RhdGljIGludCBqb3lzdGlja1tTTkRSVl9DQVJEU107CisjZW5kaWYKK3N0YXRpYyBpbnQgYWM5N19jbG9ja1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDQ4MDAwfTsKK3N0YXRpYyBjaGFyICphYzk3X3F1aXJrW1NORFJWX0NBUkRTXTsKK3N0YXRpYyBpbnQgZHhzX3N1cHBvcnRbU05EUlZfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIFZJQSA4Mnh4IGJyaWRnZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgVklBIDgyeHggYnJpZGdlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBhdWRpbyBwYXJ0IG9mIFZJQSA4Mnh4IGJyaWRnZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShtcHVfcG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdV9wb3J0LCAiTVBVLTQwMSBwb3J0LiAoVlQ4MkM2ODZ4IG9ubHkpIik7CisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworbW9kdWxlX3BhcmFtX2FycmF5KGpveXN0aWNrLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moam95c3RpY2ssICJFbmFibGUgam95c3RpY2suIChWVDgyQzY4Nnggb25seSkiKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtX2FycmF5KGFjOTdfY2xvY2ssIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjOTdfY2xvY2ssICJBQyc5NyBjb2RlYyBjbG9jayAoZGVmYXVsdCA0ODAwMEh6KS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShhYzk3X3F1aXJrLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjOTdfcXVpcmssICJBQyc5NyB3b3JrYXJvdW5kIGZvciBzdHJhbmdlIGhhcmR3YXJlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGR4c19zdXBwb3J0LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkeHNfc3VwcG9ydCwgIlN1cHBvcnQgZm9yIERYUyBjaGFubmVscyAoMCA9IGF1dG8sIDEgPSBlbmFibGUsIDIgPSBkaXNhYmxlLCAzID0gNDhrIG9ubHksIDQgPSBubyBWUkEpIik7CisKKworLyogcGNpIGlkcyAqLworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNQkweDMwNTgKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZJQV84MjMzXzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzM181CTB4MzA1OQorI2VuZGlmCisKKy8qIHJldmlzaW9uIG51bWJlcnMgZm9yIHZpYTY4NiAqLworI2RlZmluZSBWSUFfUkVWXzY4Nl9BCQkweDEwCisjZGVmaW5lIFZJQV9SRVZfNjg2X0IJCTB4MTEKKyNkZWZpbmUgVklBX1JFVl82ODZfQwkJMHgxMgorI2RlZmluZSBWSUFfUkVWXzY4Nl9ECQkweDEzCisjZGVmaW5lIFZJQV9SRVZfNjg2X0UJCTB4MTQKKyNkZWZpbmUgVklBX1JFVl82ODZfSAkJMHgyMAorCisvKiByZXZpc2lvbiBudW1iZXJzIGZvciB2aWE4MjMzICovCisjZGVmaW5lIFZJQV9SRVZfUFJFXzgyMzMJMHgxMAkvKiBub3QgaW4gbWFya2V0ICovCisjZGVmaW5lIFZJQV9SRVZfODIzM0MJCTB4MjAJLyogMiByZWMsIDQgcGIsIDEgbXVsdGktcGIgKi8KKyNkZWZpbmUgVklBX1JFVl84MjMzCQkweDMwCS8qIDIgcmVjLCA0IHBiLCAxIG11bHRpLXBiLCBzcGRpZiAqLworI2RlZmluZSBWSUFfUkVWXzgyMzNBCQkweDQwCS8qIDEgcmVjLCAxIG11bHRpLXBiLCBzcGRmICovCisjZGVmaW5lIFZJQV9SRVZfODIzNQkJMHg1MAkvKiAyIHJlYywgNCBwYiwgMSBtdWx0aS1wYiwgc3BkaWYgKi8KKyNkZWZpbmUgVklBX1JFVl84MjM3CQkweDYwCisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgVklBUkVHKHZpYSwgeCkgKCh2aWEpLT5wb3J0ICsgVklBX1JFR18jI3gpCisjZGVmaW5lIFZJQURFVl9SRUcodmlhZGV2LCB4KSAoKHZpYWRldiktPnBvcnQgKyBWSUFfUkVHXyMjeCkKKworLyogY29tbW9uIG9mZnNldHMgKi8KKyNkZWZpbmUgVklBX1JFR19PRkZTRVRfU1RBVFVTCQkweDAwCS8qIGJ5dGUgLSBjaGFubmVsIHN0YXR1cyAqLworI2RlZmluZSAgIFZJQV9SRUdfU1RBVF9BQ1RJVkUJCTB4ODAJLyogUk8gKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NUQVRfUEFVU0VECQkweDQwCS8qIFJPICovCisjZGVmaW5lICAgVklBX1JFR19TVEFUX1RSSUdHRVJfUVVFVUVECTB4MDgJLyogUk8gKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NUQVRfU1RPUFBFRAkJMHgwNAkvKiBSV0MgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NUQVRfRU9MCQkweDAyCS8qIFJXQyAqLworI2RlZmluZSAgIFZJQV9SRUdfU1RBVF9GTEFHCQkweDAxCS8qIFJXQyAqLworI2RlZmluZSBWSUFfUkVHX09GRlNFVF9DT05UUk9MCQkweDAxCS8qIGJ5dGUgLSBjaGFubmVsIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfU1RBUlQJCTB4ODAJLyogV08gKi8KKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfVEVSTUlOQVRFCTB4NDAJLyogV08gKi8KKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfQVVUT1NUQVJUCTB4MjAKKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfUEFVU0UJCTB4MDgJLyogUlcgKi8KKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfSU5UX1NUT1AJCTB4MDQJCQorI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9JTlRfRU9MCQkweDAyCisjZGVmaW5lICAgVklBX1JFR19DVFJMX0lOVF9GTEFHCQkweDAxCisjZGVmaW5lICAgVklBX1JFR19DVFJMX1JFU0VUCQkweDAxCS8qIFJXIC0gcHJvYmFibHkgcmVzZXQ/IHVuZG9jdW1lbnRlZCAqLworI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9JTlQgKFZJQV9SRUdfQ1RSTF9JTlRfRkxBRyB8IFZJQV9SRUdfQ1RSTF9JTlRfRU9MIHwgVklBX1JFR19DVFJMX0FVVE9TVEFSVCkKKyNkZWZpbmUgVklBX1JFR19PRkZTRVRfVFlQRQkJMHgwMgkvKiBieXRlIC0gY2hhbm5lbCB0eXBlICg2ODYgb25seSkgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfQVVUT1NUQVJUCTB4ODAJLyogUlcgLSBhdXRvc3RhcnQgYXQgRU9MICovCisjZGVmaW5lICAgVklBX1JFR19UWVBFXzE2QklUCQkweDIwCS8qIFJXICovCisjZGVmaW5lICAgVklBX1JFR19UWVBFX1NURVJFTwkJMHgxMAkvKiBSVyAqLworI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9JTlRfTExJTkUJMHgwMAorI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9JTlRfTFNBTVBMRQkweDA0CisjZGVmaW5lICAgVklBX1JFR19UWVBFX0lOVF9MRVNTT05FCTB4MDgKKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfSU5UX01BU0sJCTB4MGMKKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfSU5UX0VPTAkJMHgwMgorI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9JTlRfRkxBRwkJMHgwMQorI2RlZmluZSBWSUFfUkVHX09GRlNFVF9UQUJMRV9QVFIJMHgwNAkvKiBkd29yZCAtIGNoYW5uZWwgdGFibGUgcG9pbnRlciAqLworI2RlZmluZSBWSUFfUkVHX09GRlNFVF9DVVJSX1BUUgkJMHgwNAkvKiBkd29yZCAtIGNoYW5uZWwgY3VycmVudCBwb2ludGVyICovCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX1NUT1BfSURYCQkweDA4CS8qIGR3b3JkIC0gc3RvcCBpbmRleCwgY2hhbm5lbCB0eXBlLCBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSAgIFZJQTgyMzNfUkVHX1RZUEVfMTZCSVQJMHgwMDIwMDAwMAkvKiBSVyAqLworI2RlZmluZSAgIFZJQTgyMzNfUkVHX1RZUEVfU1RFUkVPCTB4MDAxMDAwMDAJLyogUlcgKi8KKyNkZWZpbmUgVklBX1JFR19PRkZTRVRfQ1VSUl9DT1VOVAkweDBjCS8qIGR3b3JkIC0gY2hhbm5lbCBjdXJyZW50IGNvdW50ICgyNCBiaXQpICovCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX0NVUlJfSU5ERVgJMHgwZgkvKiBieXRlIC0gY2hhbm5lbCBjdXJyZW50IGluZGV4IChmb3IgdmlhODIzMyBvbmx5KSAqLworCisjZGVmaW5lIERFRklORV9WSUFfUkVHU0VUKG5hbWUsdmFsKSBcCitlbnVtIHtcCisJVklBX1JFR18jI25hbWUjI19TVEFUVVMJCT0gKHZhbCksXAorCVZJQV9SRUdfIyNuYW1lIyNfQ09OVFJPTAk9ICh2YWwpICsgMHgwMSxcCisJVklBX1JFR18jI25hbWUjI19UWVBFCQk9ICh2YWwpICsgMHgwMixcCisJVklBX1JFR18jI25hbWUjI19UQUJMRV9QVFIJPSAodmFsKSArIDB4MDQsXAorCVZJQV9SRUdfIyNuYW1lIyNfQ1VSUl9QVFIJPSAodmFsKSArIDB4MDQsXAorCVZJQV9SRUdfIyNuYW1lIyNfU1RPUF9JRFgJPSAodmFsKSArIDB4MDgsXAorCVZJQV9SRUdfIyNuYW1lIyNfQ1VSUl9DT1VOVAk9ICh2YWwpICsgMHgwYyxcCit9CisKKy8qIHBsYXliYWNrIGJsb2NrICovCitERUZJTkVfVklBX1JFR1NFVChQTEFZQkFDSywgMHgwMCk7CitERUZJTkVfVklBX1JFR1NFVChDQVBUVVJFLCAweDEwKTsKK0RFRklORV9WSUFfUkVHU0VUKEZNLCAweDIwKTsKKworLyogQUMnOTcgKi8KKyNkZWZpbmUgVklBX1JFR19BQzk3CQkJMHg4MAkvKiBkd29yZCAqLworI2RlZmluZSAgIFZJQV9SRUdfQUM5N19DT0RFQ19JRF9NQVNLCSgzPDwzMCkKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0hJRlQJMzAKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfQ09ERUNfSURfUFJJTUFSWQkweDAwCisjZGVmaW5lICAgVklBX1JFR19BQzk3X0NPREVDX0lEX1NFQ09OREFSWSAweDAxCisjZGVmaW5lICAgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRAkoMTw8MjcpCisjZGVmaW5lICAgVklBX1JFR19BQzk3X1BSSU1BUllfVkFMSUQJKDE8PDI1KQorI2RlZmluZSAgIFZJQV9SRUdfQUM5N19CVVNZCQkoMTw8MjQpCisjZGVmaW5lICAgVklBX1JFR19BQzk3X1JFQUQJCSgxPDwyMykKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfQ01EX1NISUZUCTE2CisjZGVmaW5lICAgVklBX1JFR19BQzk3X0NNRF9NQVNLCQkweDdlCisjZGVmaW5lICAgVklBX1JFR19BQzk3X0RBVEFfU0hJRlQJMAorI2RlZmluZSAgIFZJQV9SRUdfQUM5N19EQVRBX01BU0sJMHhmZmZmCisKKyNkZWZpbmUgVklBX1JFR19TR0RfU0hBRE9XCQkweDg0CS8qIGR3b3JkICovCisvKiB2aWE2ODYgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX0ZMQUcJKDE8PDApCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9DUF9GTEFHCSgxPDwxKQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfRk1fRkxBRwkoMTw8MikKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX0VPTAkoMTw8NCkKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0NQX0VPTAkoMTw8NSkKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0ZNX0VPTAkoMTw8NikKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX1NUT1AJKDE8PDgpCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9DUF9TVE9QCSgxPDw5KQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfRk1fU1RPUAkoMTw8MTApCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9QQl9BQ1RJVkUJKDE8PDEyKQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfQ1BfQUNUSVZFCSgxPDwxMykKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0ZNX0FDVElWRQkoMTw8MTQpCisvKiB2aWE4MjMzICovCisjZGVmaW5lICAgVklBODIzM19SRUdfU0dEX1NUQVRfRkxBRwkoMTw8MCkKKyNkZWZpbmUgICBWSUE4MjMzX1JFR19TR0RfU1RBVF9FT0wJKDE8PDEpCisjZGVmaW5lICAgVklBODIzM19SRUdfU0dEX1NUQVRfU1RPUAkoMTw8MikKKyNkZWZpbmUgICBWSUE4MjMzX1JFR19TR0RfU1RBVF9BQ1RJVkUJKDE8PDMpCisjZGVmaW5lIFZJQTgyMzNfSU5UUl9NQVNLKGNoYW4pICgoVklBODIzM19SRUdfU0dEX1NUQVRfRkxBR3xWSUE4MjMzX1JFR19TR0RfU1RBVF9FT0wpIDw8ICgoY2hhbikgKiA0KSkKKyNkZWZpbmUgICBWSUE4MjMzX1JFR19TR0RfQ0hBTl9TRFgJMAorI2RlZmluZSAgIFZJQTgyMzNfUkVHX1NHRF9DSEFOX01VTFRJCTQKKyNkZWZpbmUgICBWSUE4MjMzX1JFR19TR0RfQ0hBTl9SRUMJNgorI2RlZmluZSAgIFZJQTgyMzNfUkVHX1NHRF9DSEFOX1JFQzEJNworCisjZGVmaW5lIFZJQV9SRUdfR1BJX1NUQVRVUwkJMHg4OAorI2RlZmluZSBWSUFfUkVHX0dQSV9JTlRSCQkweDhjCisKKy8qIG11bHRpLWNoYW5uZWwgYW5kIGNhcHR1cmUgcmVnaXN0ZXJzIGZvciB2aWE4MjMzICovCitERUZJTkVfVklBX1JFR1NFVChNVUxUUExBWSwgMHg0MCk7CitERUZJTkVfVklBX1JFR1NFVChDQVBUVVJFXzgyMzMsIDB4NjApOworCisvKiB2aWE4MjMzLXNwZWNpZmljIHJlZ2lzdGVycyAqLworI2RlZmluZSBWSUFfUkVHX09GU19QTEFZQkFDS19WT0xVTUVfTAkweDAyCS8qIGJ5dGUgKi8KKyNkZWZpbmUgVklBX1JFR19PRlNfUExBWUJBQ0tfVk9MVU1FX1IJMHgwMwkvKiBieXRlICovCisjZGVmaW5lIFZJQV9SRUdfT0ZTX01VTFRQTEFZX0ZPUk1BVAkweDAyCS8qIGJ5dGUgLSBmb3JtYXQgYW5kIGNoYW5uZWxzICovCisjZGVmaW5lICAgVklBX1JFR19NVUxUUExBWV9GTVRfOEJJVAkweDAwCisjZGVmaW5lICAgVklBX1JFR19NVUxUUExBWV9GTVRfMTZCSVQJMHg4MAorI2RlZmluZSAgIFZJQV9SRUdfTVVMVFBMQVlfRk1UX0NIX01BU0sJMHg3MAkvKiAjIGNoYW5uZWxzIDw8IDQgKHZhbGlkID0gMSwyLDQsNikgKi8KKyNkZWZpbmUgVklBX1JFR19PRlNfQ0FQVFVSRV9GSUZPCTB4MDIJLyogYnl0ZSAtIGJpdCA2ID0gZmlmbyAgZW5hYmxlICovCisjZGVmaW5lICAgVklBX1JFR19DQVBUVVJFX0ZJRk9fRU5BQkxFCTB4NDAKKworI2RlZmluZSBWSUFfRFhTX01BWF9WT0xVTUUJCTMxCS8qIG1heC4gdm9sdW1lIChhdHRlbnVhdGlvbikgb2YgcmVnIDB4MzIvMzMgKi8KKworI2RlZmluZSBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTAkJMHg2MwkvKiBieXRlIC0gaW5wdXQgc2VsZWN0ICovCisjZGVmaW5lICAgVklBX1JFR19DQVBUVVJFX0NIQU5ORUxfTUlDCTB4NAorI2RlZmluZSAgIFZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMX0xJTkUJMAorI2RlZmluZSAgIFZJQV9SRUdfQ0FQVFVSRV9TRUxFQ1RfQ09ERUMJMHgwMwkvKiByZWNvcmRpbmcgc291cmNlIGNvZGVjICgwID0gcHJpbWFyeSkgKi8KKworI2RlZmluZSBWSUFfVEJMX0JJVF9GTEFHCTB4NDAwMDAwMDAKKyNkZWZpbmUgVklBX1RCTF9CSVRfRU9MCQkweDgwMDAwMDAwCisKKy8qIHBjaSBzcGFjZSAqLworI2RlZmluZSBWSUFfQUNMSU5LX1NUQVQJCTB4NDAKKyNkZWZpbmUgIFZJQV9BQ0xJTktfQzExX1JFQURZCTB4MjAKKyNkZWZpbmUgIFZJQV9BQ0xJTktfQzEwX1JFQURZCTB4MTAKKyNkZWZpbmUgIFZJQV9BQ0xJTktfQzAxX1JFQURZCTB4MDQgLyogc2Vjb25kYXJ5IGNvZGVjIHJlYWR5ICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0xPV1BPV0VSCTB4MDIgLyogbG93LXBvd2VyIHN0YXRlICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0MwMF9SRUFEWQkweDAxIC8qIHByaW1hcnkgY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgVklBX0FDTElOS19DVFJMCQkweDQxCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfRU5BQkxFCTB4ODAgLyogMDogZGlzYWJsZSwgMTogZW5hYmxlICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfUkVTRVQJMHg0MCAvKiAwOiBhc3NlcnQsIDE6IGRlLWFzc2VydCAqLworI2RlZmluZSAgVklBX0FDTElOS19DVFJMX1NZTkMJMHgyMCAvKiAwOiByZWxlYXNlIFNZTkMsIDE6IGZvcmNlIFNZTkMgaGkgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9TRE8JMHgxMCAvKiAwOiByZWxlYXNlIFNETywgMTogZm9yY2UgU0RPIGhpICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfVlJBCTB4MDggLyogMDogZGlzYWJsZSBWUkEsIDE6IGVuYWJsZSBWUkEgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9QQ00JMHgwNCAvKiAwOiBkaXNhYmxlIFBDTSwgMTogZW5hYmxlIFBDTSAqLworI2RlZmluZSAgVklBX0FDTElOS19DVFJMX0ZNCTB4MDIgLyogdmlhNjg2IG9ubHkgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9TQgkweDAxIC8qIHZpYTY4NiBvbmx5ICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfSU5JVAkoVklBX0FDTElOS19DVFJMX0VOQUJMRXxcCisJCQkJIFZJQV9BQ0xJTktfQ1RSTF9SRVNFVHxcCisJCQkJIFZJQV9BQ0xJTktfQ1RSTF9QQ018XAorCQkJCSBWSUFfQUNMSU5LX0NUUkxfVlJBKQorI2RlZmluZSBWSUFfRlVOQ19FTkFCTEUJCTB4NDIKKyNkZWZpbmUgIFZJQV9GVU5DX01JRElfUE5QCTB4ODAgLyogRklYTUU6IGl0J3MgMHg0MCBpbiB0aGUgZGF0YXNoZWV0ISAqLworI2RlZmluZSAgVklBX0ZVTkNfTUlESV9JUlFNQVNLCTB4NDAgLyogRklYTUU6IG5vdCBkb2N1bWVudGVkISAqLworI2RlZmluZSAgVklBX0ZVTkNfUlgyQ19XUklURQkweDIwCisjZGVmaW5lICBWSUFfRlVOQ19TQl9GSUZPX0VNUFRZCTB4MTAKKyNkZWZpbmUgIFZJQV9GVU5DX0VOQUJMRV9HQU1FCTB4MDgKKyNkZWZpbmUgIFZJQV9GVU5DX0VOQUJMRV9GTQkweDA0CisjZGVmaW5lICBWSUFfRlVOQ19FTkFCTEVfTUlESQkweDAyCisjZGVmaW5lICBWSUFfRlVOQ19FTkFCTEVfU0IJMHgwMQorI2RlZmluZSBWSUFfUE5QX0NPTlRST0wJCTB4NDMKKyNkZWZpbmUgVklBX0ZNX05NSV9DVFJMCQkweDQ4CisjZGVmaW5lIFZJQTgyMzNfVk9MQ0hHX0NUUkwJMHg0OAorI2RlZmluZSBWSUE4MjMzX1NQRElGX0NUUkwJMHg0OQorI2RlZmluZSAgVklBODIzM19TUERJRl9EWDMJMHgwOAorI2RlZmluZSAgVklBODIzM19TUERJRl9TTE9UX01BU0sJMHgwMworI2RlZmluZSAgVklBODIzM19TUERJRl9TTE9UXzEwMTEJMHgwMAorI2RlZmluZSAgVklBODIzM19TUERJRl9TTE9UXzM0CQkweDAxCisjZGVmaW5lICBWSUE4MjMzX1NQRElGX1NMT1RfNzgJCTB4MDIKKyNkZWZpbmUgIFZJQTgyMzNfU1BESUZfU0xPVF82OQkJMHgwMworCisvKgorICovCisKKyNkZWZpbmUgVklBX0RYU19BVVRPCTAKKyNkZWZpbmUgVklBX0RYU19FTkFCTEUJMQorI2RlZmluZSBWSUFfRFhTX0RJU0FCTEUJMgorI2RlZmluZSBWSUFfRFhTXzQ4SwkzCisjZGVmaW5lIFZJQV9EWFNfTk9fVlJBCTQKKworCisvKgorICovCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfdmlhODJ4eCB2aWE4Mnh4X3Q7Cit0eXBlZGVmIHN0cnVjdCB2aWFfZGV2IHZpYWRldl90OworCisvKgorICogcGNtIHN0cmVhbQorICovCisKK3N0cnVjdCBzbmRfdmlhX3NnX3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworfSA7CisKKyNkZWZpbmUgVklBX1RBQkxFX1NJWkUJMjU1CisKK3N0cnVjdCB2aWFfZGV2IHsKKwl1bnNpZ25lZCBpbnQgcmVnX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJaW50IGRpcmVjdGlvbjsJLyogcGxheWJhY2sgPSAwLCBjYXB0dXJlID0gMSAqLworICAgICAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisJaW50IHJ1bm5pbmc7CisJdW5zaWduZWQgaW50IHRibF9lbnRyaWVzOyAvKiAjIGRlc2NyaXB0b3JzICovCisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHRhYmxlOworCXN0cnVjdCBzbmRfdmlhX3NnX3RhYmxlICppZHhfdGFibGU7CisJLyogZm9yIHJlY292ZXJ5IGZyb20gdGhlIHVuZXhwZWN0ZWQgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBsYXN0cG9zOworCXVuc2lnbmVkIGludCBmcmFnc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTI7Cit9OworCisKK2VudW0geyBUWVBFX0NBUkRfVklBNjg2ID0gMSwgVFlQRV9DQVJEX1ZJQTgyMzMgfTsKK2VudW0geyBUWVBFX1ZJQTY4NiwgVFlQRV9WSUE4MjMzLCBUWVBFX1ZJQTgyMzNBIH07CisKKyNkZWZpbmUgVklBX01BWF9ERVZTCTcJLyogNCBwbGF5YmFjaywgMSBtdWx0aSwgMiBjYXB0dXJlICovCisKK3N0cnVjdCB2aWFfcmF0ZV9sb2NrIHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IHJhdGU7CisJaW50IHVzZWQ7Cit9OworCitzdHJ1Y3QgX3NuZF92aWE4Mnh4IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBwb3J0OworCXN0cnVjdCByZXNvdXJjZSAqbXB1X3JlczsKKwlpbnQgY2hpcF90eXBlOworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247CisKKwl1bnNpZ25lZCBjaGFyIG9sZF9sZWdhY3k7CisJdW5zaWduZWQgY2hhciBvbGRfbGVnYWN5X2NmZzsKKyNpZmRlZiBDT05GSUdfUE0KKwl1bnNpZ25lZCBjaGFyIGxlZ2FjeV9zYXZlZDsKKwl1bnNpZ25lZCBjaGFyIGxlZ2FjeV9jZmdfc2F2ZWQ7CisJdW5zaWduZWQgY2hhciBzcGRpZl9jdHJsX3NhdmVkOworCXVuc2lnbmVkIGNoYXIgY2FwdHVyZV9zcmNfc2F2ZWRbMl07CisJdW5zaWduZWQgaW50IG1wdV9wb3J0X3NhdmVkOworI2VuZGlmCisKKwl1bnNpZ25lZCBjaGFyIHBsYXliYWNrX3ZvbHVtZVsyXTsgLyogZm9yIFZJQTgyMzMvQy84MjM1OyBkZWZhdWx0ID0gMCAqLworCisJdW5zaWduZWQgaW50IGludHJfbWFzazsgLyogU0dEX1NIQURPVyBtYXNrIHRvIGNoZWNrIGludGVycnVwdHMgKi8KKworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJc25kX2NhcmRfdCAqY2FyZDsKKworCXVuc2lnbmVkIGludCBudW1fZGV2czsKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfZGV2bm8sIG11bHRpX2Rldm5vLCBjYXB0dXJlX2Rldm5vOworCXZpYWRldl90IGRldnNbVklBX01BWF9ERVZTXTsKKwlzdHJ1Y3QgdmlhX3JhdGVfbG9jayByYXRlc1syXTsgLyogcGxheWJhY2sgYW5kIGNhcHR1cmUgKi8KKwl1bnNpZ25lZCBpbnQgZHhzX2ZpeGVkOiAxOwkvKiBEWFMgY2hhbm5lbCBhY2NlcHRzIG9ubHkgNDhrSHogKi8KKwl1bnNpZ25lZCBpbnQgbm9fdnJhOiAxOwkJLyogbm8gbmVlZCB0byBzZXQgVlJBIG9uIERYUyBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCBzcGRpZl9vbjogMTsJLyogb25seSBzcGRpZiByYXRlcyB3b3JrIHRvIGV4dGVybmFsIERBQ3MgKi8KKworCXNuZF9wY21fdCAqcGNtc1syXTsKKwlzbmRfcmF3bWlkaV90ICpybWlkaTsKKworCWFjOTdfYnVzX3QgKmFjOTdfYnVzOworCWFjOTdfdCAqYWM5NzsKKwl1bnNpZ25lZCBpbnQgYWM5N19jbG9jazsKKwl1bnNpZ25lZCBpbnQgYWM5N19zZWNvbmRhcnk7CS8qIHNlY29uZGFyeSBBQyc5NyBjb2RlYyBpcyBwcmVzZW50ICovCisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXNuZF9pbmZvX2VudHJ5X3QgKnByb2NfZW50cnk7CisKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF92aWE4Mnh4X2lkc1tdID0geworCXsgMHgxMTA2LCAweDMwNTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEVfQ0FSRF9WSUE2ODYsIH0sCS8qIDY4NkEgKi8KKwl7IDB4MTEwNiwgMHgzMDU5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBFX0NBUkRfVklBODIzMywgfSwJLyogVlQ4MjMzICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX3ZpYTgyeHhfaWRzKTsKKworLyoKKyAqLworCisvKgorICogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgYnVmZmVycworICogcGVyaW9kcyA9IG51bWJlciBvZiBwZXJpb2RzCisgKiBmcmFnc2l6ZSA9IHBlcmlvZCBzaXplIGluIGJ5dGVzCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfdmlhX3RhYmxlKHZpYWRldl90ICpkZXYsIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSwKKwkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkgICB1bnNpZ25lZCBpbnQgcGVyaW9kcywgdW5zaWduZWQgaW50IGZyYWdzaXplKQoreworCXVuc2lnbmVkIGludCBpLCBpZHgsIG9mcywgcmVzdDsKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKKworCWlmIChkZXYtPnRhYmxlLmFyZWEgPT0gTlVMTCkgeworCQkvKiB0aGUgc3RhcnQgb2YgZWFjaCBsaXN0cyBtdXN0IGJlIGFsaWduZWQgdG8gOCBieXRlcywKKwkJICogYnV0IHRoZSBrZXJuZWwgcGFnZXMgYXJlIG11Y2ggYmlnZ2VyLCBzbyB3ZSBkb24ndCBjYXJlCisJCSAqLworCQlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJUEFHRV9BTElHTihWSUFfVEFCTEVfU0laRSAqIDIgKiA4KSwKKwkJCQkJJmRldi0+dGFibGUpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoISBkZXYtPmlkeF90YWJsZSkgeworCQlkZXYtPmlkeF90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKCpkZXYtPmlkeF90YWJsZSkgKiBWSUFfVEFCTEVfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmICghIGRldi0+aWR4X3RhYmxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZmlsbCB0aGUgZW50cmllcyAqLworCWlkeCA9IDA7CisJb2ZzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcGVyaW9kczsgaSsrKSB7CisJCXJlc3QgPSBmcmFnc2l6ZTsKKwkJLyogZmlsbCBkZXNjcmlwdG9ycyBmb3IgYSBwZXJpb2QuCisJCSAqIGEgcGVyaW9kIGNhbiBiZSBzcGxpdCB0byBzZXZlcmFsIGRlc2NyaXB0b3JzIGlmIGl0J3MKKwkJICogb3ZlciBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJZG8geworCQkJdW5zaWduZWQgaW50IHI7CisJCQl1bnNpZ25lZCBpbnQgZmxhZzsKKworCQkJaWYgKGlkeCA+PSBWSUFfVEFCTEVfU0laRSkgeworCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IHRvbyBtdWNoIHRhYmxlIHNpemUhXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCSgodTMyICopZGV2LT50YWJsZS5hcmVhKVtpZHggPDwgMV0gPSBjcHVfdG9fbGUzMigodTMyKXNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsIG9mcykpOworCQkJciA9IFBBR0VfU0laRSAtIChvZnMgJSBQQUdFX1NJWkUpOworCQkJaWYgKHJlc3QgPCByKQorCQkJCXIgPSByZXN0OworCQkJcmVzdCAtPSByOworCQkJaWYgKCEgcmVzdCkgeworCQkJCWlmIChpID09IHBlcmlvZHMgLSAxKQorCQkJCQlmbGFnID0gVklBX1RCTF9CSVRfRU9MOyAvKiBidWZmZXIgYm91bmRhcnkgKi8KKwkJCQllbHNlCisJCQkJCWZsYWcgPSBWSUFfVEJMX0JJVF9GTEFHOyAvKiBwZXJpb2QgYm91bmRhcnkgKi8KKwkJCX0gZWxzZQorCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCisJCQkvLyBwcmludGsoInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAocmVzdCAlZClcbiIsIGlkeCwgb2ZzLCByLCByZXN0KTsKKwkJCSgodTMyICopZGV2LT50YWJsZS5hcmVhKVsoaWR4PDwxKSArIDFdID0gY3B1X3RvX2xlMzIociB8IGZsYWcpOworCQkJZGV2LT5pZHhfdGFibGVbaWR4XS5vZmZzZXQgPSBvZnM7CisJCQlkZXYtPmlkeF90YWJsZVtpZHhdLnNpemUgPSByOworCQkJb2ZzICs9IHI7CisJCQlpZHgrKzsKKwkJfSB3aGlsZSAocmVzdCA+IDApOworCX0KKwlkZXYtPnRibF9lbnRyaWVzID0gaWR4OworCWRldi0+YnVmc2l6ZSA9IHBlcmlvZHMgKiBmcmFnc2l6ZTsKKwlkZXYtPmJ1ZnNpemUyID0gZGV2LT5idWZzaXplIC8gMjsKKwlkZXYtPmZyYWdzaXplID0gZnJhZ3NpemU7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjbGVhbl92aWFfdGFibGUodmlhZGV2X3QgKmRldiwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpZiAoZGV2LT50YWJsZS5hcmVhKSB7CisJCXNuZF9kbWFfZnJlZV9wYWdlcygmZGV2LT50YWJsZSk7CisJCWRldi0+dGFibGUuYXJlYSA9IE5VTEw7CisJfQorCWlmIChkZXYtPmlkeF90YWJsZSkgeworCQlrZnJlZShkZXYtPmlkeF90YWJsZSk7CisJCWRldi0+aWR4X3RhYmxlID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3ZpYTgyeHhfY29kZWNfeHJlYWQodmlhODJ4eF90ICpjaGlwKQoreworCXJldHVybiBpbmwoVklBUkVHKGNoaXAsIEFDOTcpKTsKK30KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfdmlhODJ4eF9jb2RlY194d3JpdGUodmlhODJ4eF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW91dGwodmFsLCBWSUFSRUcoY2hpcCwgQUM5NykpOworfQorIAorc3RhdGljIGludCBzbmRfdmlhODJ4eF9jb2RlY19yZWFkeSh2aWE4Mnh4X3QgKmNoaXAsIGludCBzZWNvbmRhcnkpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwOwkvKiAxbXMgKi8KKwl1bnNpZ25lZCBpbnQgdmFsOworCQorCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKCEoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKSkKKwkJCXJldHVybiB2YWwgJiAweGZmZmY7CisJfQorCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKKwlyZXR1cm4gLUVJTzsKK30KKyAKK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfY29kZWNfdmFsaWQodmlhODJ4eF90ICpjaGlwLCBpbnQgc2Vjb25kYXJ5KQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsJLyogMW1zICovCisJdW5zaWduZWQgaW50IHZhbCwgdmFsMTsKKwl1bnNpZ25lZCBpbnQgc3RhdCA9ICFzZWNvbmRhcnkgPyBWSUFfUkVHX0FDOTdfUFJJTUFSWV9WQUxJRCA6CisJCQkJCSBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEOworCQorCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApOworCQl2YWwxID0gdmFsICYgKFZJQV9SRUdfQUM5N19CVVNZIHwgc3RhdCk7CisJCWlmICh2YWwxID09IHN0YXQpCisJCQlyZXR1cm4gdmFsICYgMHhmZmZmOworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiAtRUlPOworfQorIAorc3RhdGljIHZvaWQgc25kX3ZpYTgyeHhfY29kZWNfd2FpdChhYzk3X3QgKmFjOTcpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisJZXJyID0gc25kX3ZpYTgyeHhfY29kZWNfcmVhZHkoY2hpcCwgYWM5Ny0+bnVtKTsKKwkvKiBoZXJlIHdlIG5lZWQgdG8gd2FpdCBmYWlybHkgZm9yIGxvbmcgdGltZS4uICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovMik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB4dmFsOworCQorCXh2YWwgPSAhYWM5Ny0+bnVtID8gVklBX1JFR19BQzk3X0NPREVDX0lEX1BSSU1BUlkgOiBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0VDT05EQVJZOworCXh2YWwgPDw9IFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TSElGVDsKKwl4dmFsIHw9IHJlZyA8PCBWSUFfUkVHX0FDOTdfQ01EX1NISUZUOworCXh2YWwgfD0gdmFsIDw8IFZJQV9SRUdfQUM5N19EQVRBX1NISUZUOworCXNuZF92aWE4Mnh4X2NvZGVjX3h3cml0ZShjaGlwLCB4dmFsKTsKKwlzbmRfdmlhODJ4eF9jb2RlY19yZWFkeShjaGlwLCBhYzk3LT5udW0pOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX3ZpYTgyeHhfY29kZWNfcmVhZChhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHh2YWwsIHZhbCA9IDB4ZmZmZjsKKwlpbnQgYWdhaW4gPSAwOworCisJeHZhbCA9IGFjOTctPm51bSA8PCBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0hJRlQ7CisJeHZhbCB8PSBhYzk3LT5udW0gPyBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEIDogVklBX1JFR19BQzk3X1BSSU1BUllfVkFMSUQ7CisJeHZhbCB8PSBWSUFfUkVHX0FDOTdfUkVBRDsKKwl4dmFsIHw9IChyZWcgJiAweDdmKSA8PCBWSUFfUkVHX0FDOTdfQ01EX1NISUZUOworICAgICAgCXdoaWxlICgxKSB7CisgICAgICAJCWlmIChhZ2FpbisrID4gMykgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZDogY29kZWMgJWkgaXMgbm90IHZhbGlkIFsweCV4XVxuIiwgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CisJCSAgICAgIAlyZXR1cm4gMHhmZmZmOworCQl9CisJCXNuZF92aWE4Mnh4X2NvZGVjX3h3cml0ZShjaGlwLCB4dmFsKTsKKwkJdWRlbGF5ICgyMCk7CisJCWlmIChzbmRfdmlhODJ4eF9jb2RlY192YWxpZChjaGlwLCBhYzk3LT5udW0pID49IDApIHsKKwkJCXVkZWxheSgyNSk7CisJCQl2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB2YWwgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQodmlhODJ4eF90ICpjaGlwLCB2aWFkZXZfdCAqdmlhZGV2KQoreworCW91dGIoVklBX1JFR19DVFJMX1BBVVNFIHwgVklBX1JFR19DVFJMX1RFUk1JTkFURSB8IFZJQV9SRUdfQ1RSTF9SRVNFVCwKKwkgICAgIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfQ09OVFJPTCkpOworCWluYihWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NPTlRST0wpKTsKKwl1ZGVsYXkoNTApOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW91dGIoMHgwMCwgVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9DT05UUk9MKSk7CisJLyogY2xlYXIgaW50ZXJydXB0cyAqLworCW91dGIoMHgwMywgVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9TVEFUVVMpKTsKKwlvdXRiKDB4MDAsIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfVFlQRSkpOyAvKiBmb3IgdmlhNjg2ICovCisJLy8gb3V0bCgwLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NVUlJfUFRSKSk7CisJdmlhZGV2LT5sYXN0cG9zID0gMDsKK30KKworCisvKgorICogIEludGVycnVwdCBoYW5kbGVyCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHNuZF92aWE4Mnh4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCisJc3RhdHVzID0gaW5sKFZJQVJFRyhjaGlwLCBTR0RfU0hBRE9XKSk7CisJaWYgKCEgKHN0YXR1cyAmIGNoaXAtPmludHJfbWFzaykpIHsKKwkJaWYgKGNoaXAtPnJtaWRpKQorCQkJLyogY2hlY2sgbXB1NDAxIGludGVycnVwdCAqLworCQkJcmV0dXJuIHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaXJxLCBjaGlwLT5ybWlkaS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIGNoZWNrIHN0YXR1cyBmb3IgZWFjaCBzdHJlYW0gKi8KKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykgeworCQl2aWFkZXZfdCAqdmlhZGV2ID0gJmNoaXAtPmRldnNbaV07CisJCXVuc2lnbmVkIGNoYXIgY19zdGF0dXMgPSBpbmIoVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9TVEFUVVMpKTsKKwkJY19zdGF0dXMgJj0gKFZJQV9SRUdfU1RBVF9FT0x8VklBX1JFR19TVEFUX0ZMQUd8VklBX1JFR19TVEFUX1NUT1BQRUQpOworCQlpZiAoISBjX3N0YXR1cykKKwkJCWNvbnRpbnVlOworCQlpZiAodmlhZGV2LT5zdWJzdHJlYW0gJiYgdmlhZGV2LT5ydW5uaW5nKSB7CisJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZCh2aWFkZXYtPnN1YnN0cmVhbSk7CisJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJfQorCQlvdXRiKGNfc3RhdHVzLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1NUQVRVUykpOyAvKiBhY2sgKi8KKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgUENNIGNhbGxiYWNrcworICovCisKKy8qCisgKiB0cmlnZ2VyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGNtX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJaWYgKGNoaXAtPmNoaXBfdHlwZSAhPSBUWVBFX1ZJQTY4NikKKwkJdmFsID0gVklBX1JFR19DVFJMX0lOVDsKKwllbHNlCisJCXZhbCA9IDA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQl2YWwgfD0gVklBX1JFR19DVFJMX1NUQVJUOworCQl2aWFkZXYtPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXZhbCA9IFZJQV9SRUdfQ1RSTF9URVJNSU5BVEU7CisJCXZpYWRldi0+cnVubmluZyA9IDA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJdmFsIHw9IFZJQV9SRUdfQ1RSTF9QQVVTRTsKKwkJdmlhZGV2LT5ydW5uaW5nID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQl2aWFkZXYtPnJ1bm5pbmcgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJb3V0Yih2YWwsIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfQ09OVFJPTCkpOworCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCB2aWFkZXYpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrcworICovCisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIGxpbmVhciBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gc2ctYnVmZmVyIGluZGV4IGFuZCB0aGUgcmVzdCBjb3VudAorICovCisKKyNkZWZpbmUgY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LHBvcykgXAorCSgocG9zKSA8IHZpYWRldi0+bGFzdHBvcyAmJiAoKHBvcykgPj0gdmlhZGV2LT5idWZzaXplMiB8fCB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHZpYWRldl90ICp2aWFkZXYsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgYmFzZSwgcmVzOworCisJc2l6ZSA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZTsKKwliYXNlID0gdmlhZGV2LT5pZHhfdGFibGVbaWR4XS5vZmZzZXQ7CisJcmVzID0gYmFzZSArIHNpemUgLSBjb3VudDsKKworCS8qIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiAqLworCWlmIChzaXplIDwgY291bnQpIHsKKwkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKHNpemUgPSAlZCwgY291bnQgPSAlZClcbiIsIChpbnQpc2l6ZSwgKGludCljb3VudCk7CisJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKKwl9IGVsc2UgeworCQlpZiAoISBjb3VudCkgeworCQkJLyogU29tZSBtb2JvcyByZXBvcnQgY291bnQgPSAwIG9uIHRoZSBETUEgYm91bmRhcnksCisJCQkgKiBpLmUuIGNvdW50ID0gc2l6ZSBpbmRlZWQuCisJCQkgKiBMZXQncyBjaGVjayB3aGV0aGVyIHRoaXMgc3RlcCBpcyBhYm92ZSB0aGUgZXhwZWN0ZWQgc2l6ZS4KKwkJCSAqLworCQkJaW50IGRlbHRhID0gcmVzIC0gdmlhZGV2LT5sYXN0cG9zOworCQkJaWYgKGRlbHRhIDwgMCkKKwkJCQlkZWx0YSArPSB2aWFkZXYtPmJ1ZnNpemU7CisJCQlpZiAoKHVuc2lnbmVkIGludClkZWx0YSA+IHZpYWRldi0+ZnJhZ3NpemUpCisJCQkJcmVzID0gYmFzZTsKKwkJfQorCQlpZiAoY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LCByZXMpKSB7CisjaWZkZWYgUE9JTlRFUl9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgYnVmc2l6ZTIgPSAweCV4LCBvZmZzaXplID0gMHgleCwgc2l6ZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwgaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLCB2aWFkZXYtPmxhc3Rwb3MsIHZpYWRldi0+YnVmc2l6ZTIsIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0LCB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLnNpemUsIGNvdW50KTsKKyNlbmRpZgorCQkJLyogY291bnQgcmVnaXN0ZXIgcmV0dXJucyBmdWxsIHNpemUgd2hlbiBlbmQgb2YgYnVmZmVyIGlzIHJlYWNoZWQgKi8KKwkJCXJlcyA9IGJhc2UgKyBzaXplOworCQkJaWYgKGNoZWNrX2ludmFsaWRfcG9zKHZpYWRldiwgcmVzKSkgeworCQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyICgyKSwgdXNpbmcgbGFzdCB2YWxpZCBwb2ludGVyXG4iKTsKKwkJCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CisJCQl9CisJCX0KKwl9CisJdmlhZGV2LT5sYXN0cG9zID0gcmVzOyAvKiByZW1lbWJlciB0aGUgbGFzdCBwb3NpdGlvbiAqLworCWlmIChyZXMgPj0gdmlhZGV2LT5idWZzaXplKQorCQlyZXMgLT0gdmlhZGV2LT5idWZzaXplOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBnZXQgdGhlIGN1cnJlbnQgcG9pbnRlciBvbiB2aWE2ODYKKyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF92aWE2ODZfcGNtX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCwgcHRyLCBjb3VudCwgcmVzOworCisJc25kX2Fzc2VydCh2aWFkZXYtPnRibF9lbnRyaWVzLCByZXR1cm4gMCk7CisJaWYgKCEoaW5iKFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfU1RBVFVTKSkgJiBWSUFfUkVHX1NUQVRfQUNUSVZFKSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwljb3VudCA9IGlubChWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NVUlJfQ09VTlQpKSAmIDB4ZmZmZmZmOworCS8qIFRoZSB2aWE2ODZhIGRvZXMgbm90IGhhdmUgdGhlIGN1cnJlbnQgaW5kZXggcmVnaXN0ZXIsCisJICogc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGluZGV4IGZyb20gQ1VSUl9QVFIuCisJICovCisJcHRyID0gaW5sKFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfQ1VSUl9QVFIpKTsKKwlpZiAocHRyIDw9ICh1bnNpZ25lZCBpbnQpdmlhZGV2LT50YWJsZS5hZGRyKQorCQlpZHggPSAwOworCWVsc2UgLyogQ1VSUl9QVFIgaG9sZHMgdGhlIGFkZHJlc3MgKyA4ICovCisJCWlkeCA9ICgocHRyIC0gKHVuc2lnbmVkIGludCl2aWFkZXYtPnRhYmxlLmFkZHIpIC8gOCAtIDEpICUgdmlhZGV2LT50YmxfZW50cmllczsKKwlyZXMgPSBjYWxjX2xpbmVhcl9wb3ModmlhZGV2LCBpZHgsIGNvdW50KTsKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlcyk7Cit9CisKKy8qCisgKiBnZXQgdGhlIGN1cnJlbnQgcG9pbnRlciBvbiB2aWE4MjN4CisgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdmlhODIzM19wY21fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAodmlhZGV2X3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBjb3VudCwgcmVzOworCWludCB0aW1lb3V0ID0gNTAwMDsKKwkKKwlzbmRfYXNzZXJ0KHZpYWRldi0+dGJsX2VudHJpZXMsIHJldHVybiAwKTsKKwlpZiAoIShpbmIoVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9TVEFUVVMpKSAmIFZJQV9SRUdfU1RBVF9BQ1RJVkUpKQorCQlyZXR1cm4gMDsKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlkbyB7CisJCWNvdW50ID0gaW5sKFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfQ1VSUl9DT1VOVCkpOworCQkvKiBzb21lIG1vYm9zIHJlYWQgMCBjb3VudCAqLworCQlpZiAoKGNvdW50ICYgMHhmZmZmZmYpIHx8ICEgdmlhZGV2LT5ydW5uaW5nKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS10aW1lb3V0KTsKKwlpZiAoISB0aW1lb3V0KQorCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJ6ZXJvIHBvc2l0aW9uIGlzIHJlYWRcbiIpOworCWlkeCA9IGNvdW50ID4+IDI0OworCWlmIChpZHggPj0gdmlhZGV2LT50YmxfZW50cmllcykgeworI2lmZGVmIFBPSU5URVJfREVCVUcKKwkJcHJpbnRrKCJmYWlsOiBpbnZhbGlkIGlkeCA9ICVpLyVpXG4iLCBpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMpOworI2VuZGlmCisJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKKwl9IGVsc2UgeworCQljb3VudCAmPSAweGZmZmZmZjsKKwkJcmVzID0gY2FsY19saW5lYXJfcG9zKHZpYWRldiwgaWR4LCBjb3VudCk7CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcmVzKTsKK30KKworCisvKgorICogaHdfcGFyYW1zIGNhbGxiYWNrOgorICogYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgYnVpbGQgdXAgdGhlIGJ1ZmZlciBkZXNjcmlwdGlvbiB0YWJsZQorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYnVpbGRfdmlhX3RhYmxlKHZpYWRldiwgc3Vic3RyZWFtLCBjaGlwLT5wY2ksCisJCQkgICAgICBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpLAorCQkJICAgICAgcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKgorICogaHdfZnJlZSBjYWxsYmFjazoKKyAqIGNsZWFuIHVwIHRoZSBidWZmZXIgZGVzY3JpcHRpb24gdGFibGUgYW5kIHJlbGVhc2UgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJY2xlYW5fdmlhX3RhYmxlKHZpYWRldiwgc3Vic3RyZWFtLCBjaGlwLT5wY2kpOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogc2V0IHVwIHRoZSB0YWJsZSBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X3NldF90YWJsZV9wdHIodmlhODJ4eF90ICpjaGlwLCB2aWFkZXZfdCAqdmlhZGV2KQoreworCXNuZF92aWE4Mnh4X2NvZGVjX3JlYWR5KGNoaXAsIDApOworCW91dGwoKHUzMil2aWFkZXYtPnRhYmxlLmFkZHIsIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfVEFCTEVfUFRSKSk7CisJdWRlbGF5KDIwKTsKKwlzbmRfdmlhODJ4eF9jb2RlY19yZWFkeShjaGlwLCAwKTsKK30KKworLyoKKyAqIHByZXBhcmUgY2FsbGJhY2sgZm9yIHBsYXliYWNrIGFuZCBjYXB0dXJlIG9uIHZpYTY4NgorICovCitzdGF0aWMgdm9pZCB2aWE2ODZfc2V0dXBfZm9ybWF0KHZpYTgyeHhfdCAqY2hpcCwgdmlhZGV2X3QgKnZpYWRldiwgc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUpCit7CisJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCB2aWFkZXYpOworCS8qIHRoaXMgbXVzdCBiZSBzZXQgYWZ0ZXIgY2hhbm5lbF9yZXNldCAqLworCXNuZF92aWE4Mnh4X3NldF90YWJsZV9wdHIoY2hpcCwgdmlhZGV2KTsKKwlvdXRiKFZJQV9SRUdfVFlQRV9BVVRPU1RBUlQgfAorCSAgICAgKHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSA/IFZJQV9SRUdfVFlQRV8xNkJJVCA6IDApIHwKKwkgICAgIChydW50aW1lLT5jaGFubmVscyA+IDEgPyBWSUFfUkVHX1RZUEVfU1RFUkVPIDogMCkgfAorCSAgICAgKCh2aWFkZXYtPnJlZ19vZmZzZXQgJiAweDEwKSA9PSAwID8gVklBX1JFR19UWVBFX0lOVF9MU0FNUExFIDogMCkgfAorCSAgICAgVklBX1JFR19UWVBFX0lOVF9FT0wgfAorCSAgICAgVklBX1JFR19UWVBFX0lOVF9GTEFHLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1RZUEUpKTsKK30KKworc3RhdGljIGludCBzbmRfdmlhNjg2X3BsYXliYWNrX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlzbmRfYWM5N19zZXRfcmF0ZShjaGlwLT5hYzk3LCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgcnVudGltZS0+cmF0ZSk7CisJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19TUERJRiwgcnVudGltZS0+cmF0ZSk7CisJdmlhNjg2X3NldHVwX2Zvcm1hdChjaGlwLCB2aWFkZXYsIHJ1bnRpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92aWE2ODZfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19QQ01fTFJfQURDX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXZpYTY4Nl9zZXR1cF9mb3JtYXQoY2hpcCwgdmlhZGV2LCBydW50aW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvY2sgdGhlIGN1cnJlbnQgcmF0ZQorICovCitzdGF0aWMgaW50IHZpYV9sb2NrX3JhdGUoc3RydWN0IHZpYV9yYXRlX2xvY2sgKnJlYywgaW50IHJhdGUpCit7CisJaW50IGNoYW5nZWQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmcmVjLT5sb2NrKTsKKwlpZiAocmVjLT5yYXRlICE9IHJhdGUpIHsKKwkJaWYgKHJlYy0+cmF0ZSAmJiByZWMtPnVzZWQgPiAxKSAvKiBhbHJlYWR5IHNldCAqLworCQkJY2hhbmdlZCA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJcmVjLT5yYXRlID0gcmF0ZTsKKwkJCWNoYW5nZWQgPSAxOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcmVjLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworLyoKKyAqIHByZXBhcmUgY2FsbGJhY2sgZm9yIERTWCBwbGF5YmFjayBvbiB2aWE4MjN4CisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyMzNfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAodmlhZGV2X3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgcmF0ZV9jaGFuZ2VkOworCXUzMiByYml0czsKKworCWlmICgocmF0ZV9jaGFuZ2VkID0gdmlhX2xvY2tfcmF0ZSgmY2hpcC0+cmF0ZXNbMF0sIHJ1bnRpbWUtPnJhdGUpKSA8IDApCisJCXJldHVybiByYXRlX2NoYW5nZWQ7CisJaWYgKHJhdGVfY2hhbmdlZCkgeworCQlzbmRfYWM5N19zZXRfcmF0ZShjaGlwLT5hYzk3LCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwKKwkJCQkgIGNoaXAtPm5vX3ZyYSA/IDQ4MDAwIDogcnVudGltZS0+cmF0ZSk7CisJCXNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTcsIEFDOTdfU1BESUYsIHJ1bnRpbWUtPnJhdGUpOworCX0KKwlpZiAocnVudGltZS0+cmF0ZSA9PSA0ODAwMCkKKwkJcmJpdHMgPSAweGZmZmZmOworCWVsc2UKKwkJcmJpdHMgPSAoMHgxMDAwMDAgLyA0ODAwMCkgKiBydW50aW1lLT5yYXRlICsgKCgweDEwMDAwMCAlIDQ4MDAwKSAqIHJ1bnRpbWUtPnJhdGUpIC8gNDgwMDA7CisJc25kX2Fzc2VydCgocmJpdHMgJiB+MHhmZmZmZikgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQoY2hpcCwgdmlhZGV2KTsKKwlzbmRfdmlhODJ4eF9zZXRfdGFibGVfcHRyKGNoaXAsIHZpYWRldik7CisJb3V0YihjaGlwLT5wbGF5YmFja192b2x1bWVbMF0sIFZJQURFVl9SRUcodmlhZGV2LCBPRlNfUExBWUJBQ0tfVk9MVU1FX0wpKTsKKwlvdXRiKGNoaXAtPnBsYXliYWNrX3ZvbHVtZVsxXSwgVklBREVWX1JFRyh2aWFkZXYsIE9GU19QTEFZQkFDS19WT0xVTUVfUikpOworCW91dGwoKHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSA/IFZJQTgyMzNfUkVHX1RZUEVfMTZCSVQgOiAwKSB8IC8qIGZvcm1hdCAqLworCSAgICAgKHJ1bnRpbWUtPmNoYW5uZWxzID4gMSA/IFZJQTgyMzNfUkVHX1RZUEVfU1RFUkVPIDogMCkgfCAvKiBzdGVyZW8gKi8KKwkgICAgIHJiaXRzIHwgLyogcmF0ZSAqLworCSAgICAgMHhmZjAwMDAwMCwgICAgLyogU1RPUCBpbmRleCBpcyBuZXZlciByZWFjaGVkICovCisJICAgICBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1NUT1BfSURYKSk7CisJdWRlbGF5KDIwKTsKKwlzbmRfdmlhODJ4eF9jb2RlY19yZWFkeShjaGlwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByZXBhcmUgY2FsbGJhY2sgZm9yIG11bHRpLWNoYW5uZWwgcGxheWJhY2sgb24gdmlhODIzeAorICovCitzdGF0aWMgaW50IHNuZF92aWE4MjMzX211bHRpX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IHNsb3RzOworCWludCBmbXQ7CisKKwlpZiAodmlhX2xvY2tfcmF0ZSgmY2hpcC0+cmF0ZXNbMF0sIHJ1bnRpbWUtPnJhdGUpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTcsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTcsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgcnVudGltZS0+cmF0ZSk7CisJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19TUERJRiwgcnVudGltZS0+cmF0ZSk7CisJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCB2aWFkZXYpOworCXNuZF92aWE4Mnh4X3NldF90YWJsZV9wdHIoY2hpcCwgdmlhZGV2KTsKKworCWZtdCA9IChydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpID8gVklBX1JFR19NVUxUUExBWV9GTVRfMTZCSVQgOiBWSUFfUkVHX01VTFRQTEFZX0ZNVF84QklUOworCWZtdCB8PSBydW50aW1lLT5jaGFubmVscyA8PCA0OworCW91dGIoZm10LCBWSUFERVZfUkVHKHZpYWRldiwgT0ZTX01VTFRQTEFZX0ZPUk1BVCkpOworI2lmIDAKKwlpZiAoY2hpcC0+cmV2aXNpb24gPT0gVklBX1JFVl84MjMzQSkKKwkJc2xvdHMgPSAwOworCWVsc2UKKyNlbmRpZgorCXsKKwkJLyogc2V0IHNhbXBsZSBudW1iZXIgdG8gc2xvdCAzLCA0LCA3LCA4LCA2LCA5IChmb3IgVklBODIzMy9DLDgyMzUpICovCisJCS8qIGNvcnJlc3BvbmRpbmcgdG8gRkwsIEZSLCBSTCwgUlIsIEMsIExGRSA/PyAqLworCQlzd2l0Y2ggKHJ1bnRpbWUtPmNoYW5uZWxzKSB7CisJCWNhc2UgMTogc2xvdHMgPSAoMTw8MCkgfCAoMTw8NCk7IGJyZWFrOworCQljYXNlIDI6IHNsb3RzID0gKDE8PDApIHwgKDI8PDQpOyBicmVhazsKKwkJY2FzZSAzOiBzbG90cyA9ICgxPDwwKSB8ICgyPDw0KSB8ICg1PDw4KTsgYnJlYWs7CisJCWNhc2UgNDogc2xvdHMgPSAoMTw8MCkgfCAoMjw8NCkgfCAoMzw8OCkgfCAoNDw8MTIpOyBicmVhazsKKwkJY2FzZSA1OiBzbG90cyA9ICgxPDwwKSB8ICgyPDw0KSB8ICgzPDw4KSB8ICg0PDwxMikgfCAoNTw8MTYpOyBicmVhazsKKwkJY2FzZSA2OiBzbG90cyA9ICgxPDwwKSB8ICgyPDw0KSB8ICgzPDw4KSB8ICg0PDwxMikgfCAoNTw8MTYpIHwgKDY8PDIwKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHNsb3RzID0gMDsgYnJlYWs7CisJCX0KKwl9CisJLyogU1RPUCBpbmRleCBpcyBuZXZlciByZWFjaGVkICovCisJb3V0bCgweGZmMDAwMDAwIHwgc2xvdHMsIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfU1RPUF9JRFgpKTsKKwl1ZGVsYXkoMjApOworCXNuZF92aWE4Mnh4X2NvZGVjX3JlYWR5KGNoaXAsIDApOworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSBjYWxsYmFjayBmb3IgY2FwdHVyZSBvbiB2aWE4MjN4CisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyMzNfY2FwdHVyZV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKHZpYV9sb2NrX3JhdGUoJmNoaXAtPnJhdGVzWzFdLCBydW50aW1lLT5yYXRlKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTcsIEFDOTdfUENNX0xSX0FEQ19SQVRFLCBydW50aW1lLT5yYXRlKTsKKwlzbmRfdmlhODJ4eF9jaGFubmVsX3Jlc2V0KGNoaXAsIHZpYWRldik7CisJc25kX3ZpYTgyeHhfc2V0X3RhYmxlX3B0cihjaGlwLCB2aWFkZXYpOworCW91dGIoVklBX1JFR19DQVBUVVJFX0ZJRk9fRU5BQkxFLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZTX0NBUFRVUkVfRklGTykpOworCW91dGwoKHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSA/IFZJQTgyMzNfUkVHX1RZUEVfMTZCSVQgOiAwKSB8CisJICAgICAocnVudGltZS0+Y2hhbm5lbHMgPiAxID8gVklBODIzM19SRUdfVFlQRV9TVEVSRU8gOiAwKSB8CisJICAgICAweGZmMDAwMDAwLCAgICAvKiBTVE9QIGluZGV4IGlzIG5ldmVyIHJlYWNoZWQgKi8KKwkgICAgIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfU1RPUF9JRFgpKTsKKwl1ZGVsYXkoMjApOworCXNuZF92aWE4Mnh4X2NvZGVjX3JlYWR5KGNoaXAsIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBwY20gaGFyZHdhcmUgZGVmaW5pdGlvbiwgaWRlbnRpY2FsIGZvciBib3RoIHBsYXliYWNrIGFuZCBjYXB0dXJlCisgKi8KK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3ZpYTgyeHhfaHcgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWluID0JCTQ4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJVklBX1RBQkxFX1NJWkUgLyAyLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKworLyoKKyAqIG9wZW4gY2FsbGJhY2sgc2tlbGV0b24KKyAqLworc3RhdGljIGludCBzbmRfdmlhODJ4eF9wY21fb3Blbih2aWE4Mnh4X3QgKmNoaXAsIHZpYWRldl90ICp2aWFkZXYsIHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKwlzdHJ1Y3QgdmlhX3JhdGVfbG9jayAqcmF0ZXA7CisKKwlydW50aW1lLT5odyA9IHNuZF92aWE4Mnh4X2h3OworCQorCS8qIHNldCB0aGUgaHcgcmF0ZSBjb25kaXRpb24gKi8KKwlyYXRlcCA9ICZjaGlwLT5yYXRlc1t2aWFkZXYtPmRpcmVjdGlvbl07CisJc3Bpbl9sb2NrX2lycSgmcmF0ZXAtPmxvY2spOworCXJhdGVwLT51c2VkKys7CisJaWYgKGNoaXAtPnNwZGlmX29uICYmIHZpYWRldi0+cmVnX29mZnNldCA9PSAweDMwKSB7CisJCS8qIERYUyMzIGFuZCBzcGRpZiBpcyBvbiAqLworCQlydW50aW1lLT5ody5yYXRlcyA9IGNoaXAtPmFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZdOworCQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCX0gZWxzZSBpZiAoY2hpcC0+ZHhzX2ZpeGVkICYmIHZpYWRldi0+cmVnX29mZnNldCA8IDB4NDApIHsKKwkJLyogZml4ZWQgRFhTIHBsYXliYWNrIHJhdGUgKi8KKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IDQ4MDAwOworCX0gZWxzZSBpZiAoISByYXRlcC0+cmF0ZSkgeworCQlpbnQgaWR4ID0gdmlhZGV2LT5kaXJlY3Rpb24gPyBBQzk3X1JBVEVTX0FEQyA6IEFDOTdfUkFURVNfRlJPTlRfREFDOworCQlydW50aW1lLT5ody5yYXRlcyA9IGNoaXAtPmFjOTctPnJhdGVzW2lkeF07CisJCXNuZF9wY21fbGltaXRfaHdfcmF0ZXMocnVudGltZSk7CisJfSBlbHNlIHsKKwkJLyogYSBmaXhlZCByYXRlICovCisJCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVDsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPSBydW50aW1lLT5ody5yYXRlX21pbiA9IHJhdGVwLT5yYXRlOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJhdGVwLT5sb2NrKTsKKworCS8qIHdlIG1heSByZW1vdmUgZm9sbG93aW5nIGNvbnN0YWludCB3aGVuIHdlIG1vZGlmeSB0YWJsZSBlbnRyaWVzCisJICAgaW4gaW50ZXJydXB0ICovCisJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHZpYWRldjsKKwl2aWFkZXYtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBvcGVuIGNhbGxiYWNrIGZvciBwbGF5YmFjayBvbiB2aWE2ODYgYW5kIHZpYTgyM3ggRFNYCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gJmNoaXAtPmRldnNbY2hpcC0+cGxheWJhY2tfZGV2bm8gKyBzdWJzdHJlYW0tPm51bWJlcl07CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX3ZpYTgyeHhfcGNtX29wZW4oY2hpcCwgdmlhZGV2LCBzdWJzdHJlYW0pKSA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvcGVuIGNhbGxiYWNrIGZvciBwbGF5YmFjayBvbiB2aWE4MjN4IG11bHRpLWNoYW5uZWwKKyAqLworc3RhdGljIGludCBzbmRfdmlhODIzM19tdWx0aV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAmY2hpcC0+ZGV2c1tjaGlwLT5tdWx0aV9kZXZub107CisJaW50IGVycjsKKwkvKiBjaGFubmVscyBjb25zdHJhaW50IGZvciBWSUE4MjMzQQorCSAqIDMgYW5kIDUgY2hhbm5lbHMgYXJlIG5vdCBzdXBwb3J0ZWQKKwkgKi8KKwlzdGF0aWMgdW5zaWduZWQgaW50IGNoYW5uZWxzW10gPSB7CisJCTEsIDIsIDQsIDYKKwl9OworCXN0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX2NoYW5uZWxzID0geworCQkuY291bnQgPSBBUlJBWV9TSVpFKGNoYW5uZWxzKSwKKwkJLmxpc3QgPSBjaGFubmVscywKKwkJLm1hc2sgPSAwLAorCX07CisKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X3BjbV9vcGVuKGNoaXAsIHZpYWRldiwgc3Vic3RyZWFtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN1YnN0cmVhbS0+cnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gNjsKKwlpZiAoY2hpcC0+cmV2aXNpb24gPT0gVklBX1JFVl84MjMzQSkKKwkJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsICZod19jb25zdHJhaW50c19jaGFubmVscyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvcGVuIGNhbGxiYWNrIGZvciBjYXB0dXJlIG9uIHZpYTY4NiBhbmQgdmlhODIzeAorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gJmNoaXAtPmRldnNbY2hpcC0+Y2FwdHVyZV9kZXZubyArIHN1YnN0cmVhbS0+cGNtLT5kZXZpY2VdOworCisJcmV0dXJuIHNuZF92aWE4Mnh4X3BjbV9vcGVuKGNoaXAsIHZpYWRldiwgc3Vic3RyZWFtKTsKK30KKworLyoKKyAqIGNsb3NlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGNtX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAodmlhZGV2X3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlhX3JhdGVfbG9jayAqcmF0ZXA7CisKKwkvKiByZWxlYXNlIHRoZSByYXRlIGxvY2sgKi8KKwlyYXRlcCA9ICZjaGlwLT5yYXRlc1t2aWFkZXYtPmRpcmVjdGlvbl07CisJc3Bpbl9sb2NrX2lycSgmcmF0ZXAtPmxvY2spOworCXJhdGVwLT51c2VkLS07CisJaWYgKCEgcmF0ZXAtPnVzZWQpCisJCXJhdGVwLT5yYXRlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJhdGVwLT5sb2NrKTsKKworCXZpYWRldi0+c3Vic3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCisvKiB2aWE2ODYgcGxheWJhY2sgY2FsbGJhY2tzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdmlhNjg2X3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfdmlhODJ4eF9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3ZpYTgyeHhfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX3ZpYTgyeHhfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF92aWE2ODZfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92aWE4Mnh4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3ZpYTY4Nl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworLyogdmlhNjg2IGNhcHR1cmUgY2FsbGJhY2tzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdmlhNjg2X2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92aWE4Mnh4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3ZpYTY4Nl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworLyogdmlhODIzeCBEU1ggcGxheWJhY2sgY2FsbGJhY2tzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdmlhODIzM19wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdmlhODIzM19wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3ZpYTgyeHhfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfdmlhODIzM19wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworLyogdmlhODIzeCBtdWx0aS1jaGFubmVsIHBsYXliYWNrIGNhbGxiYWNrcyAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3ZpYTgyMzNfbXVsdGlfb3BzID0geworCS5vcGVuID0JCXNuZF92aWE4MjMzX211bHRpX29wZW4sCisJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfdmlhODJ4eF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfdmlhODJ4eF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3ZpYTgyMzNfbXVsdGlfcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92aWE4Mnh4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3ZpYTgyMzNfcGNtX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKK307CisKKy8qIHZpYTgyM3ggY2FwdHVyZSBjYWxsYmFja3MgKi8KK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF92aWE4MjMzX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdmlhODIzM19jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfdmlhODJ4eF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF92aWE4MjMzX3BjbV9wb2ludGVyLAorCS5wYWdlID0JCXNuZF9wY21fc2didWZfb3BzX3BhZ2UsCit9OworCisKK3N0YXRpYyB2b2lkIGluaXRfdmlhZGV2KHZpYTgyeHhfdCAqY2hpcCwgaW50IGlkeCwgdW5zaWduZWQgaW50IHJlZ19vZmZzZXQsIGludCBkaXJlY3Rpb24pCit7CisJY2hpcC0+ZGV2c1tpZHhdLnJlZ19vZmZzZXQgPSByZWdfb2Zmc2V0OworCWNoaXAtPmRldnNbaWR4XS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJY2hpcC0+ZGV2c1tpZHhdLnBvcnQgPSBjaGlwLT5wb3J0ICsgcmVnX29mZnNldDsKK30KKworLyoKKyAqIGNyZWF0ZSBwY20gaW5zdGFuY2VzIGZvciBWSUE4MjMzLCA4MjMzQyBhbmQgODIzNSAobm90IDgyMzNBKQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdmlhODIzM19wY21fbmV3KHZpYTgyeHhfdCAqY2hpcCkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgaSwgZXJyOworCisJY2hpcC0+cGxheWJhY2tfZGV2bm8gPSAwOwkvKiB4IDQgKi8KKwljaGlwLT5tdWx0aV9kZXZubyA9IDQ7CQkvKiB4IDEgKi8KKwljaGlwLT5jYXB0dXJlX2Rldm5vID0gNTsJLyogeCAyICovCisJY2hpcC0+bnVtX2RldnMgPSA3OworCWNoaXAtPmludHJfbWFzayA9IDB4MzMwMzMzMzM7IC8qIEZMQUd8RU9MIGZvciByZWMwLTEsIG1jLCBzZHgwLTMgKi8KKworCS8qIFBDTSAjMDogIDQgRFNYIHBsYXliYWNrcyBhbmQgMSBjYXB0dXJlICovCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgY2hpcC0+Y2FyZC0+c2hvcnRuYW1lLCAwLCA0LCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3ZpYTgyMzNfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfdmlhODIzM19jYXB0dXJlX29wcyk7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXN0cmNweShwY20tPm5hbWUsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSk7CisJY2hpcC0+cGNtc1swXSA9IHBjbTsKKwkvKiBzZXQgdXAgcGxheWJhY2tzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaW5pdF92aWFkZXYoY2hpcCwgaSwgMHgxMCAqIGksIDApOworCS8qIGNhcHR1cmUgKi8KKwlpbml0X3ZpYWRldihjaGlwLCBjaGlwLT5jYXB0dXJlX2Rldm5vLCBWSUFfUkVHX0NBUFRVUkVfODIzM19TVEFUVVMsIDEpOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogUENNICMxOiAgbXVsdGktY2hhbm5lbCBwbGF5YmFjayBhbmQgMm5kIGNhcHR1cmUgKi8KKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUsIDEsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfdmlhODIzM19tdWx0aV9vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF92aWE4MjMzX2NhcHR1cmVfb3BzKTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJc3RyY3B5KHBjbS0+bmFtZSwgY2hpcC0+Y2FyZC0+c2hvcnRuYW1lKTsKKwljaGlwLT5wY21zWzFdID0gcGNtOworCS8qIHNldCB1cCBwbGF5YmFjayAqLworCWluaXRfdmlhZGV2KGNoaXAsIGNoaXAtPm11bHRpX2Rldm5vLCBWSUFfUkVHX01VTFRQTEFZX1NUQVRVUywgMCk7CisJLyogc2V0IHVwIGNhcHR1cmUgKi8KKwlpbml0X3ZpYWRldihjaGlwLCBjaGlwLT5jYXB0dXJlX2Rldm5vICsgMSwgVklBX1JFR19DQVBUVVJFXzgyMzNfU1RBVFVTICsgMHgxMCwgMSk7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCQkgICAgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjcmVhdGUgcGNtIGluc3RhbmNlcyBmb3IgVklBODIzM0EKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZpYTgyMzNhX3BjbV9uZXcodmlhODJ4eF90ICpjaGlwKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwljaGlwLT5tdWx0aV9kZXZubyA9IDA7CisJY2hpcC0+cGxheWJhY2tfZGV2bm8gPSAxOworCWNoaXAtPmNhcHR1cmVfZGV2bm8gPSAyOworCWNoaXAtPm51bV9kZXZzID0gMzsKKwljaGlwLT5pbnRyX21hc2sgPSAweDAzMDMzMDAwOyAvKiBGTEFHfEVPTCBmb3IgcmVjMCwgbWMsIHNkeDMgKi8KKworCS8qIFBDTSAjMDogIG11bHRpLWNoYW5uZWwgcGxheWJhY2sgYW5kIGNhcHR1cmUgKi8KKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUsIDAsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfdmlhODIzM19tdWx0aV9vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF92aWE4MjMzX2NhcHR1cmVfb3BzKTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJc3RyY3B5KHBjbS0+bmFtZSwgY2hpcC0+Y2FyZC0+c2hvcnRuYW1lKTsKKwljaGlwLT5wY21zWzBdID0gcGNtOworCS8qIHNldCB1cCBwbGF5YmFjayAqLworCWluaXRfdmlhZGV2KGNoaXAsIGNoaXAtPm11bHRpX2Rldm5vLCBWSUFfUkVHX01VTFRQTEFZX1NUQVRVUywgMCk7CisJLyogY2FwdHVyZSAqLworCWluaXRfdmlhZGV2KGNoaXAsIGNoaXAtPmNhcHR1cmVfZGV2bm8sIFZJQV9SRUdfQ0FQVFVSRV84MjMzX1NUQVRVUywgMSk7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCQkJIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBTUERJRiBzdXBwb3J0ZWQ/ICovCisJaWYgKCEgYWM5N19jYW5fc3BkaWYoY2hpcC0+YWM5NykpCisJCXJldHVybiAwOworCisJLyogUENNICMxOiAgRFhTMyBwbGF5YmFjayAoZm9yIHNwZGlmKSAqLworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSwgMSwgMSwgMCwgJnBjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF92aWE4MjMzX3BsYXliYWNrX29wcyk7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXN0cmNweShwY20tPm5hbWUsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSk7CisJY2hpcC0+cGNtc1sxXSA9IHBjbTsKKwkvKiBzZXQgdXAgcGxheWJhY2sgKi8KKwlpbml0X3ZpYWRldihjaGlwLCBjaGlwLT5wbGF5YmFja19kZXZubywgMHgzMCwgMCk7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCQkJIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgMTI4KjEwMjQpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZSBhIHBjbSBpbnN0YW5jZSBmb3IgdmlhNjg2YS9iCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE2ODZfcGNtX25ldyh2aWE4Mnh4X3QgKmNoaXApCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWNoaXAtPnBsYXliYWNrX2Rldm5vID0gMDsKKwljaGlwLT5jYXB0dXJlX2Rldm5vID0gMTsKKwljaGlwLT5udW1fZGV2cyA9IDI7CisJY2hpcC0+aW50cl9tYXNrID0gMHg3NzsgLyogRkxBRyB8IEVPTCBmb3IgUEIsIENQLCBGTSAqLworCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgY2hpcC0+Y2FyZC0+c2hvcnRuYW1lLCAwLCAxLCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF92aWE2ODZfY2FwdHVyZV9vcHMpOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlzdHJjcHkocGNtLT5uYW1lLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUpOworCWNoaXAtPnBjbXNbMF0gPSBwY207CisJaW5pdF92aWFkZXYoY2hpcCwgMCwgVklBX1JFR19QTEFZQkFDS19TVEFUVVMsIDApOworCWluaXRfdmlhZGV2KGNoaXAsIDEsIFZJQV9SRUdfQ0FQVFVSRV9TVEFUVVMsIDEpOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBNaXhlciBwYXJ0CisgKi8KKworc3RhdGljIGludCBzbmRfdmlhODIzM19jYXB0dXJlX3NvdXJjZV9pbmZvKHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX2luZm9fdCAqdWluZm8pCit7CisJLyogZm9ybWVybHkgdGhleSB3ZXJlICJMaW5lIiBhbmQgIk1pYyIsIGJ1dCBpdCBsb29rcyBsaWtlIHRoYXQgdGhleQorCSAqIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgcGh5c2ljYWwgY29ubmVjdGlvbnMuLi4KKwkgKi8KKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7CisJCSJJbnB1dDEiLCAiSW5wdXQyIgorCX07CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gMikKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdmlhODIzM19jYXB0dXJlX3NvdXJjZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGxvbmcgcG9ydCA9IGNoaXAtPnBvcnQgKyAoa2NvbnRyb2wtPmlkLmluZGV4ID8gKFZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMICsgMHgxMCkgOiBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTCk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGluYihwb3J0KSAmIFZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMX01JQyA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92aWE4MjMzX2NhcHR1cmVfc291cmNlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gY2hpcC0+cG9ydCArIChrY29udHJvbC0+aWQuaW5kZXggPyAoVklBX1JFR19DQVBUVVJFX0NIQU5ORUwgKyAweDEwKSA6IFZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMKTsKKwl1OCB2YWwsIG92YWw7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJb3ZhbCA9IGluYihwb3J0KTsKKwl2YWwgPSBvdmFsICYgflZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMX01JQzsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKKwkJdmFsIHw9IFZJQV9SRUdfQ0FQVFVSRV9DSEFOTkVMX01JQzsKKwlpZiAodmFsICE9IG92YWwpCisJCW91dGIodmFsLCBwb3J0KTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gdmFsICE9IG92YWw7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3ZpYTgyMzNfY2FwdHVyZV9zb3VyY2UgX19kZXZpbml0ZGF0YSA9IHsKKwkubmFtZSA9ICJJbnB1dCBTb3VyY2UgU2VsZWN0IiwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaW5mbyA9IHNuZF92aWE4MjMzX2NhcHR1cmVfc291cmNlX2luZm8sCisJLmdldCA9IHNuZF92aWE4MjMzX2NhcHR1cmVfc291cmNlX2dldCwKKwkucHV0ID0gc25kX3ZpYTgyMzNfY2FwdHVyZV9zb3VyY2VfcHV0LAorfTsKKworc3RhdGljIGludCBzbmRfdmlhODIzM19keHMzX3NwZGlmX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdmlhODIzM19keHMzX3NwZGlmX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggdmFsOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUE4MjMzX1NQRElGX0NUUkwsICZ2YWwpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHZhbCAmIFZJQTgyMzNfU1BESUZfRFgzKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92aWE4MjMzX2R4czNfc3BkaWZfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1OCB2YWwsIG92YWw7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQTgyMzNfU1BESUZfQ1RSTCwgJm92YWwpOworCXZhbCA9IG92YWwgJiB+VklBODIzM19TUERJRl9EWDM7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl2YWwgfD0gVklBODIzM19TUERJRl9EWDM7CisJLyogc2F2ZSB0aGUgc3BkaWYgZmxhZyBmb3IgcmF0ZSBmaWx0ZXJpbmcgKi8KKwljaGlwLT5zcGRpZl9vbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CisJaWYgKHZhbCAhPSBvdmFsKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQTgyMzNfU1BESUZfQ1RSTCwgdmFsKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF92aWE4MjMzX2R4czNfc3BkaWZfY29udHJvbCBfX2RldmluaXRkYXRhID0geworCS5uYW1lID0gIklFQzk1OCBPdXRwdXQgU3dpdGNoIiwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaW5mbyA9IHNuZF92aWE4MjMzX2R4czNfc3BkaWZfaW5mbywKKwkuZ2V0ID0gc25kX3ZpYTgyMzNfZHhzM19zcGRpZl9nZXQsCisJLnB1dCA9IHNuZF92aWE4MjMzX2R4czNfc3BkaWZfcHV0LAorfTsKKworc3RhdGljIGludCBzbmRfdmlhODIzM19keHNfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gVklBX0RYU19NQVhfVk9MVU1FOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92aWE4MjMzX2R4c192b2x1bWVfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IFZJQV9EWFNfTUFYX1ZPTFVNRSAtIGNoaXAtPnBsYXliYWNrX3ZvbHVtZVswXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IFZJQV9EWFNfTUFYX1ZPTFVNRSAtIGNoaXAtPnBsYXliYWNrX3ZvbHVtZVsxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdmlhODIzM19keHNfdm9sdW1lX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGlkeDsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgaSwgY2hhbmdlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCWlmICh2YWwgPiBWSUFfRFhTX01BWF9WT0xVTUUpCisJCQl2YWwgPSBWSUFfRFhTX01BWF9WT0xVTUU7CisJCXZhbCA9IFZJQV9EWFNfTUFYX1ZPTFVNRSAtIHZhbDsKKwkJaWYgKHZhbCAhPSBjaGlwLT5wbGF5YmFja192b2x1bWVbaV0pIHsKKwkJCWNoYW5nZSA9IDE7CisJCQljaGlwLT5wbGF5YmFja192b2x1bWVbaV0gPSB2YWw7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKSB7CisJCQkJdW5zaWduZWQgbG9uZyBwb3J0ID0gY2hpcC0+cG9ydCArIDB4MTAgKiBpZHg7CisJCQkJb3V0Yih2YWwsIHBvcnQgKyBWSUFfUkVHX09GU19QTEFZQkFDS19WT0xVTUVfTCArIGkpOworCQkJfQorCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3ZpYTgyMzNfZHhzX3ZvbHVtZV9jb250cm9sIF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUgPSAiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmluZm8gPSBzbmRfdmlhODIzM19keHNfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF92aWE4MjMzX2R4c192b2x1bWVfZ2V0LAorCS5wdXQgPSBzbmRfdmlhODIzM19keHNfdm9sdW1lX3B1dCwKK307CisKKy8qCisgKi8KKworc3RhdGljIHZvaWQgc25kX3ZpYTgyeHhfbWl4ZXJfZnJlZV9hYzk3X2J1cyhhYzk3X2J1c190ICpidXMpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+YWM5N19idXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzbmRfdmlhODJ4eF9taXhlcl9mcmVlX2FjOTcoYWM5N190ICphYzk3KQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKKwljaGlwLT5hYzk3ID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CisJeworCQkudmVuZG9yID0gMHgxMTA2LAorCQkuZGV2aWNlID0gMHg0MTYxLAorCQkuY29kZWNfaWQgPSAweDU2NDk0MTYxLCAvKiBWVDE2MTJBICovCisJCS5uYW1lID0gIlNvbHRlayBTTC03NURSVjUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9OT05FCisJfSwKKwl7CS8qIEZJWE1FOiB3aGljaCBjb2RlYz8gKi8KKwkJLnZlbmRvciA9IDB4MTEwNiwKKwkJLmRldmljZSA9IDB4NDE2MSwKKwkJLm5hbWUgPSAiQVNSb2NrIEs3VlQyIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDE5LAorCQkuZGV2aWNlID0gMHgwYTgxLAorCQkubmFtZSA9ICJFQ1MgSzdWVEEzIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDE5LAorCQkuZGV2aWNlID0gMHgwYTg1LAorCQkubmFtZSA9ICJFQ1MgTDdWTU0yIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxODQ5LAorCQkuZGV2aWNlID0gMHgzMDU5LAorCQkubmFtZSA9ICJBU1JvY2sgSzdWTTIiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCS8qIFZUMTYxNiAqLworCX0sCisJeworCQkudmVuZG9yID0gMHgxNGNkLAorCQkuZGV2aWNlID0gMHg3MDAyLAorCQkubmFtZSA9ICJVbmtub3duIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfQUxDX0pBQ0sKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTA3MSwKKwkJLmRldmljZSA9IDB4ODU5MCwKKwkJLm5hbWUgPSAiTWl0YWMgTW9ibyIsCisJCS50eXBlID0gQUM5N19UVU5FX0FMQ19KQUNLCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDE2MWYsCisJCS5kZXZpY2UgPSAweDIwMmIsCisJCS5uYW1lID0gIkFyaW1hIE5vdGVib29rIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWSwKKwl9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdmlhODJ4eF9taXhlcl9uZXcodmlhODJ4eF90ICpjaGlwLCBjb25zdCBjaGFyICpxdWlya19vdmVycmlkZSkKK3sKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwlpbnQgZXJyOworCXN0YXRpYyBhYzk3X2J1c19vcHNfdCBvcHMgPSB7CisJCS53cml0ZSA9IHNuZF92aWE4Mnh4X2NvZGVjX3dyaXRlLAorCQkucmVhZCA9IHNuZF92aWE4Mnh4X2NvZGVjX3JlYWQsCisJCS53YWl0ID0gc25kX3ZpYTgyeHhfY29kZWNfd2FpdCwKKwl9OworCisJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2hpcC0+Y2FyZCwgMCwgJm9wcywgY2hpcCwgJmNoaXAtPmFjOTdfYnVzKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWNoaXAtPmFjOTdfYnVzLT5wcml2YXRlX2ZyZWUgPSBzbmRfdmlhODJ4eF9taXhlcl9mcmVlX2FjOTdfYnVzOworCWNoaXAtPmFjOTdfYnVzLT5jbG9jayA9IGNoaXAtPmFjOTdfY2xvY2s7CisJY2hpcC0+YWM5N19idXMtPnNoYXJlZF90eXBlID0gQUM5N19TSEFSRURfVFlQRV9WSUE7CisKKwltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CisJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOworCWFjOTcucHJpdmF0ZV9mcmVlID0gc25kX3ZpYTgyeHhfbWl4ZXJfZnJlZV9hYzk3OworCWFjOTcucGNpID0gY2hpcC0+cGNpOworCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNuZF9hYzk3X3R1bmVfaGFyZHdhcmUoY2hpcC0+YWM5NywgYWM5N19xdWlya3MsIHF1aXJrX292ZXJyaWRlKTsKKworCWlmIChjaGlwLT5jaGlwX3R5cGUgIT0gVFlQRV9WSUE2ODYpIHsKKwkJLyogdXNlIHNsb3QgMTAvMTEgKi8KKwkJc25kX2FjOTdfdXBkYXRlX2JpdHMoY2hpcC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIDB4MDMgPDwgNCwgMHgwMyA8PCA0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKKyNkZWZpbmUgSk9ZU1RJQ0tfQUREUgkweDIwMAorc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZpYTY4Nl9jcmVhdGVfZ2FtZXBvcnQodmlhODJ4eF90ICpjaGlwLCBpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpsZWdhY3kpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwlpZiAoIWpveXN0aWNrW2Rldl0pCisJCXJldHVybiAtRU5PREVWOworCisJciA9IHJlcXVlc3RfcmVnaW9uKEpPWVNUSUNLX0FERFIsIDgsICJWSUE2ODYgZ2FtZXBvcnQiKTsKKwlpZiAoIXIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlhODJ4eDogY2Fubm90IHJlc2VydmUgam95c3RpY2sgcG9ydCAweCUjeFxuIiwgSk9ZU1RJQ0tfQUREUik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidmlhODJ4eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3Jlc291cmNlKHIpOworCQlrZnJlZV9ub2NoZWNrKHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIlZJQTY4NiBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJZ2FtZXBvcnRfc2V0X2Rldl9wYXJlbnQoZ3AsICZjaGlwLT5wY2ktPmRldik7CisJZ3AtPmlvID0gSk9ZU1RJQ0tfQUREUjsKKwlnYW1lcG9ydF9zZXRfcG9ydF9kYXRhKGdwLCByKTsKKworCS8qIEVuYWJsZSBsZWdhY3kgam95c3RpY2sgcG9ydCAqLworCSpsZWdhY3kgfD0gVklBX0ZVTkNfRU5BQkxFX0dBTUU7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0ZVTkNfRU5BQkxFLCAqbGVnYWN5KTsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoY2hpcC0+Z2FtZXBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE2ODZfZnJlZV9nYW1lcG9ydCh2aWE4Mnh4X3QgKmNoaXApCit7CisJaWYgKGNoaXAtPmdhbWVwb3J0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoY2hpcC0+Z2FtZXBvcnQpOworCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjaGlwLT5nYW1lcG9ydCk7CisJCWNoaXAtPmdhbWVwb3J0ID0gTlVMTDsKKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25kX3ZpYTY4Nl9jcmVhdGVfZ2FtZXBvcnQodmlhODJ4eF90ICpjaGlwLCBpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpsZWdhY3kpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3ZpYTY4Nl9mcmVlX2dhbWVwb3J0KHZpYTgyeHhfdCAqY2hpcCkgeyB9CisjZW5kaWYKKworCisvKgorICoKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdmlhODIzM19pbml0X21pc2ModmlhODJ4eF90ICpjaGlwLCBpbnQgZGV2KQoreworCWludCBpLCBlcnIsIGNhcHM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwljYXBzID0gY2hpcC0+Y2hpcF90eXBlID09IFRZUEVfVklBODIzM0EgPyAxIDogMjsKKwlmb3IgKGkgPSAwOyBpIDwgY2FwczsgaSsrKSB7CisJCXNuZF92aWE4MjMzX2NhcHR1cmVfc291cmNlLmluZGV4ID0gaTsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdmlhODIzM19jYXB0dXJlX3NvdXJjZSwgY2hpcCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChhYzk3X2Nhbl9zcGRpZihjaGlwLT5hYzk3KSkgeworCQllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF92aWE4MjMzX2R4czNfc3BkaWZfY29udHJvbCwgY2hpcCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChjaGlwLT5jaGlwX3R5cGUgIT0gVFlQRV9WSUE4MjMzQSkgeworCQkvKiB3aGVuIG5vIGgvdyBQQ00gdm9sdW1lIGNvbnRyb2wgaXMgZm91bmQsIHVzZSBEWFMgdm9sdW1lIGNvbnRyb2wKKwkJICogYXMgdGhlIFBDTSB2b2wgY29udHJvbAorCQkgKi8KKwkJc25kX2N0bF9lbGVtX2lkX3Qgc2lkOworCQltZW1zZXQoJnNpZCwgMCwgc2l6ZW9mKHNpZCkpOworCQlzdHJjcHkoc2lkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIik7CisJCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCQlpZiAoISBzbmRfY3RsX2ZpbmRfaWQoY2hpcC0+Y2FyZCwgJnNpZCkpIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3ZpYTgyMzNfZHhzX3ZvbHVtZV9jb250cm9sLCBjaGlwKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogc2VsZWN0IHNwZGlmIGRhdGEgc2xvdCAxMC8xMSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBODIzM19TUERJRl9DVFJMLCAmdmFsKTsKKwl2YWwgPSAodmFsICYgflZJQTgyMzNfU1BESUZfU0xPVF9NQVNLKSB8IFZJQTgyMzNfU1BESUZfU0xPVF8xMDExOworCXZhbCAmPSB+VklBODIzM19TUERJRl9EWDM7IC8qIFNQRElGIG9mZiBhcyBkZWZhdWx0ICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBODIzM19TUERJRl9DVFJMLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE2ODZfaW5pdF9taXNjKHZpYTgyeHhfdCAqY2hpcCwgaW50IGRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGxlZ2FjeSwgbGVnYWN5X2NmZzsKKwlpbnQgcmV2X2ggPSAwOworCisJbGVnYWN5ID0gY2hpcC0+b2xkX2xlZ2FjeTsKKwlsZWdhY3lfY2ZnID0gY2hpcC0+b2xkX2xlZ2FjeV9jZmc7CisJbGVnYWN5IHw9IFZJQV9GVU5DX01JRElfSVJRTUFTSzsJLyogRklYTUU6IGNvcnJlY3Q/IChkaXNhYmxlIE1JREkpICovCisJbGVnYWN5ICY9IH5WSUFfRlVOQ19FTkFCTEVfR0FNRTsJLyogZGlzYWJsZSBqb3lzdGljayAqLworCWlmIChjaGlwLT5yZXZpc2lvbiA+PSBWSUFfUkVWXzY4Nl9IKSB7CisJCXJldl9oID0gMTsKKwkJaWYgKG1wdV9wb3J0W2Rldl0gPj0gMHgyMDApIHsJLyogZm9yY2UgTUlESSAqLworCQkJbXB1X3BvcnRbZGV2XSAmPSAweGZmZmM7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNoaXAtPnBjaSwgMHgxOCwgbXB1X3BvcnRbZGV2XSB8IDB4MDEpOworI2lmZGVmIENPTkZJR19QTQorCQkJY2hpcC0+bXB1X3BvcnRfc2F2ZWQgPSBtcHVfcG9ydFtkZXZdOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQltcHVfcG9ydFtkZXZdID0gcGNpX3Jlc291cmNlX3N0YXJ0KGNoaXAtPnBjaSwgMik7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKG1wdV9wb3J0W2Rldl0pIHsJLyogZm9yY2UgTUlESSAqLworCQljYXNlIDB4MzAwOgorCQljYXNlIDB4MzEwOgorCQljYXNlIDB4MzIwOgorCQljYXNlIDB4MzMwOgorCQkJbGVnYWN5X2NmZyAmPSB+KDMgPDwgMik7CisJCQlsZWdhY3lfY2ZnIHw9IChtcHVfcG9ydFtkZXZdICYgMHgwMDMwKSA+PiAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CQkJLyogbm8sIHVzZSBCSU9TIHNldHRpbmdzICovCisJCQlpZiAobGVnYWN5ICYgVklBX0ZVTkNfRU5BQkxFX01JREkpCisJCQkJbXB1X3BvcnRbZGV2XSA9IDB4MzAwICsgKChsZWdhY3lfY2ZnICYgMHgwMDBjKSA8PCAyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChtcHVfcG9ydFtkZXZdID49IDB4MjAwICYmCisJICAgIChjaGlwLT5tcHVfcmVzID0gcmVxdWVzdF9yZWdpb24obXB1X3BvcnRbZGV2XSwgMiwgIlZJQTgyeHggTVBVNDAxIikpICE9IE5VTEwpIHsKKwkJaWYgKHJldl9oKQorCQkJbGVnYWN5IHw9IFZJQV9GVU5DX01JRElfUE5QOwkvKiBlbmFibGUgUENJIEkvTyAyICovCisJCWxlZ2FjeSB8PSBWSUFfRlVOQ19FTkFCTEVfTUlESTsKKwl9IGVsc2UgeworCQlpZiAocmV2X2gpCisJCQlsZWdhY3kgJj0gflZJQV9GVU5DX01JRElfUE5QOwkvKiBkaXNhYmxlIFBDSSBJL08gMiAqLworCQlsZWdhY3kgJj0gflZJQV9GVU5DX0VOQUJMRV9NSURJOworCQltcHVfcG9ydFtkZXZdID0gMDsKKwl9CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfRlVOQ19FTkFCTEUsIGxlZ2FjeSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX1BOUF9DT05UUk9MLCBsZWdhY3lfY2ZnKTsKKwlpZiAoY2hpcC0+bXB1X3JlcykgeworCQlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjaGlwLT5jYXJkLCAwLCBNUFU0MDFfSFdfVklBNjg2QSwKKwkJCQkJbXB1X3BvcnRbZGV2XSwgMSwKKwkJCQkJY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMSBhdCAweCVseCwgc2tpcHBpbmdcbiIsIG1wdV9wb3J0W2Rldl0pOworCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19FTkFCTEVfTUlESTsKKwkJfSBlbHNlIHsKKwkJCWxlZ2FjeSAmPSB+VklBX0ZVTkNfTUlESV9JUlFNQVNLOwkvKiBlbmFibGUgTUlESSBpbnRlcnJ1cHQgKi8KKwkJfQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfRlVOQ19FTkFCTEUsIGxlZ2FjeSk7CisJfQorCisJc25kX3ZpYTY4Nl9jcmVhdGVfZ2FtZXBvcnQoY2hpcCwgZGV2LCAmbGVnYWN5KTsKKworI2lmZGVmIENPTkZJR19QTQorCWNoaXAtPmxlZ2FjeV9zYXZlZCA9IGxlZ2FjeTsKKwljaGlwLT5sZWdhY3lfY2ZnX3NhdmVkID0gbGVnYWN5X2NmZzsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHByb2MgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X3Byb2NfcmVhZChzbmRfaW5mb19lbnRyeV90ICplbnRyeSwgc25kX2luZm9fYnVmZmVyX3QgKmJ1ZmZlcikKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWludCBpOworCQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiVzXG5cbiIsIGNoaXAtPmNhcmQtPmxvbmduYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHhhMDsgaSArPSA0KSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMng6ICUwOHhcbiIsIGksIGlubChjaGlwLT5wb3J0ICsgaSkpOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF92aWE4Mnh4X3Byb2NfaW5pdCh2aWE4Mnh4X3QgKmNoaXApCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisKKwlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAidmlhODJ4eCIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX3ZpYTgyeHhfcHJvY19yZWFkKTsKK30KKworLyoKKyAqCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZpYTgyeHhfY2hpcF9pbml0KHZpYTgyeHhfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBtYXhfY291bnQ7CisJdW5zaWduZWQgY2hhciBwdmFsOworCisjaWYgMCAvKiBicm9rZW4gb24gSzdNPyAqLworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gVFlQRV9WSUE2ODYpCisJCS8qIGRpc2FibGUgYWxsIGxlZ2FjeSBwb3J0cyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfRlVOQ19FTkFCTEUsIDApOworI2VuZGlmCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfQUNMSU5LX1NUQVQsICZwdmFsKTsKKwlpZiAoISAocHZhbCAmIFZJQV9BQ0xJTktfQzAwX1JFQURZKSkgeyAvKiBjb2RlYyBub3QgcmVhZHk/ICovCisJCS8qIGRlYXNzZXJ0IEFDTGluayByZXNldCwgZm9yY2UgU1lOQyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfQUNMSU5LX0NUUkwsCisJCQkJICAgICAgVklBX0FDTElOS19DVFJMX0VOQUJMRSB8CisJCQkJICAgICAgVklBX0FDTElOS19DVFJMX1JFU0VUIHwKKwkJCQkgICAgICBWSUFfQUNMSU5LX0NUUkxfU1lOQyk7CisJCXVkZWxheSgxMDApOworI2lmIDEgLyogRklYTUU6IHNob3VsZCB3ZSBkbyBmdWxsIHJlc2V0IGhlcmUgZm9yIGFsbCBjaGlwIG1vZGVscz8gKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0FDTElOS19DVFJMLCAweDAwKTsKKwkJdWRlbGF5KDEwMCk7CisjZWxzZQorCQkvKiBkZWFzc2VydCBBQ0xpbmsgcmVzZXQsIGZvcmNlIFNZTkMgKHdhcm0gQUMnOTcgcmVzZXQpICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfQ1RSTCwKKwkJCQkgICAgICBWSUFfQUNMSU5LX0NUUkxfUkVTRVR8VklBX0FDTElOS19DVFJMX1NZTkMpOworCQl1ZGVsYXkoMik7CisjZW5kaWYKKwkJLyogQUNMaW5rIG9uLCBkZWFzc2VydCBBQ0xpbmsgcmVzZXQsIFZTUiwgU0dEIGRhdGEgb3V0ICovCisJCS8qIG5vdGUgLSBGTSBkYXRhIG91dCBoYXMgdHJvdWJsZSB3aXRoIG5vbiBWUkEgY29kZWNzICEhICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfQ1RSTCwgVklBX0FDTElOS19DVFJMX0lOSVQpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJCisJLyogTWFrZSBzdXJlIFZSQSBpcyBlbmFibGVkLCBpbiBjYXNlIHdlIGRpZG4ndCBkbyBhCisJICogY29tcGxldGUgY29kZWMgcmVzZXQsIGFib3ZlICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfQUNMSU5LX0NUUkwsICZwdmFsKTsKKwlpZiAoKHB2YWwgJiBWSUFfQUNMSU5LX0NUUkxfSU5JVCkgIT0gVklBX0FDTElOS19DVFJMX0lOSVQpIHsKKwkJLyogQUNMaW5rIG9uLCBkZWFzc2VydCBBQ0xpbmsgcmVzZXQsIFZTUiwgU0dEIGRhdGEgb3V0ICovCisJCS8qIG5vdGUgLSBGTSBkYXRhIG91dCBoYXMgdHJvdWJsZSB3aXRoIG5vbiBWUkEgY29kZWNzICEhICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfQ1RSTCwgVklBX0FDTElOS19DVFJMX0lOSVQpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwkvKiB3YWl0IHVudGlsIGNvZGVjIHJlYWR5ICovCisJbWF4X2NvdW50ID0gKCgzICogSFopIC8gNCkgKyAxOworCWRvIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfQUNMSU5LX1NUQVQsICZwdmFsKTsKKwkJaWYgKHB2YWwgJiBWSUFfQUNMSU5LX0MwMF9SRUFEWSkgLyogcHJpbWFyeSBjb2RlYyByZWFkeSAqLworCQkJYnJlYWs7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlICgtLW1heF9jb3VudCA+IDApOworCisJaWYgKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkKKwkJc25kX3ByaW50aygiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKKworI2lmIDAgLyogRklYTUU6IHdlIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjb2RlYyB5ZXQgc28gc2tpcCB0aGUgZGV0ZWN0aW9uIG5vdy4uICovCisJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKKwkJCQkgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRCB8CisJCQkJIChWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0VDT05EQVJZIDw8IFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TSElGVCkpOworCW1heF9jb3VudCA9ICgoMyAqIEhaKSAvIDQpICsgMTsKKwlzbmRfdmlhODJ4eF9jb2RlY194d3JpdGUoY2hpcCwgVklBX1JFR19BQzk3X1JFQUQgfAorCQkJCSBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEIHwKKwkJCQkgKFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TRUNPTkRBUlkgPDwgVklBX1JFR19BQzk3X0NPREVDX0lEX1NISUZUKSk7CisJZG8geworCQlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19TRUNPTkRBUllfVkFMSUQpIHsKKwkJCWNoaXAtPmFjOTdfc2Vjb25kYXJ5ID0gMTsKKwkJCWdvdG8gX19hYzk3X29rMjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKC0tbWF4X2NvdW50ID4gMCk7CisJLyogVGhpcyBpcyBvaywgdGhlIG1vc3Qgb2YgbW90aGVyYm9hcmRzIGhhdmUgb25seSBvbmUgY29kZWMgKi8KKworICAgICAgX19hYzk3X29rMjoKKyNlbmRpZgorCisJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBUWVBFX1ZJQTY4NikgeworCQkvKiByb3V0ZSBGTSB0cmFwIHRvIElSUSwgZGlzYWJsZSBGTSB0cmFwICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9GTV9OTUlfQ1RSTCwgMCk7CisJCS8qIGRpc2FibGUgYWxsIEdQSSBpbnRlcnJ1cHRzICovCisJCW91dGwoMCwgVklBUkVHKGNoaXAsIEdQSV9JTlRSKSk7CisJfQorCisJaWYgKGNoaXAtPmNoaXBfdHlwZSAhPSBUWVBFX1ZJQTY4NikgeworCQkvKiBXb3JrYXJvdW5kIGZvciBBd2FyZCBCSU9TIGJ1ZzoKKwkJICogRFhTIGNoYW5uZWxzIGRvbid0IHdvcmsgcHJvcGVybHkgd2l0aCBWUkEgaWYgTUM5NyBpcyBkaXNhYmxlZC4KKwkJICovCisJCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJCXBjaSA9IHBjaV9maW5kX2RldmljZSgweDExMDYsIDB4MzA2OCwgTlVMTCk7IC8qIE1DOTcgKi8KKwkJaWYgKHBjaSkgeworCQkJdW5zaWduZWQgY2hhciBkYXRhOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCAweDQ0LCAmZGF0YSk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCAweDQ0LCBkYXRhIHwgMHg0MCk7CisJCX0KKwl9CisKKwlpZiAoY2hpcC0+Y2hpcF90eXBlICE9IFRZUEVfVklBODIzM0EpIHsKKwkJaW50IGksIGlkeDsKKwkJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykgeworCQkJdW5zaWduZWQgbG9uZyBwb3J0ID0gY2hpcC0+cG9ydCArIDB4MTAgKiBpZHg7CisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJCW91dGIoY2hpcC0+cGxheWJhY2tfdm9sdW1lW2ldLCBwb3J0ICsgVklBX1JFR19PRlNfUExBWUJBQ0tfVk9MVU1FX0wgKyBpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X3N1c3BlbmQoc25kX2NhcmRfdCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmIChjaGlwLT5wY21zW2ldKQorCQkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21zW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKworCS8qIHNhdmUgbWlzYyB2YWx1ZXMgKi8KKwlpZiAoY2hpcC0+Y2hpcF90eXBlICE9IFRZUEVfVklBNjg2KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBODIzM19TUERJRl9DVFJMLCAmY2hpcC0+c3BkaWZfY3RybF9zYXZlZCk7CisJCWNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzBdID0gaW5iKGNoaXAtPnBvcnQgKyBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTCk7CisJCWNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzFdID0gaW5iKGNoaXAtPnBvcnQgKyBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTCArIDB4MTApOworCX0KKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoY2hpcC0+cGNpLCAzKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdmlhODJ4eF9yZXN1bWUoc25kX2NhcmRfdCAqY2FyZCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlwY2lfZW5hYmxlX2RldmljZShjaGlwLT5wY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoY2hpcC0+cGNpLCAwKTsKKworCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKKworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gVFlQRV9WSUE2ODYpIHsKKwkJaWYgKGNoaXAtPm1wdV9wb3J0X3NhdmVkKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjaGlwLT5wY2ksIDB4MTgsIGNoaXAtPm1wdV9wb3J0X3NhdmVkIHwgMHgwMSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9GVU5DX0VOQUJMRSwgY2hpcC0+bGVnYWN5X3NhdmVkKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX1BOUF9DT05UUk9MLCBjaGlwLT5sZWdhY3lfY2ZnX3NhdmVkKTsKKwl9IGVsc2UgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUE4MjMzX1NQRElGX0NUUkwsIGNoaXAtPnNwZGlmX2N0cmxfc2F2ZWQpOworCQlvdXRiKGNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzBdLCBjaGlwLT5wb3J0ICsgVklBX1JFR19DQVBUVVJFX0NIQU5ORUwpOworCQlvdXRiKGNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzFdLCBjaGlwLT5wb3J0ICsgVklBX1JFR19DQVBUVVJFX0NIQU5ORUwgKyAweDEwKTsKKwl9CisKKwlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBzbmRfdmlhODJ4eF9mcmVlKHZpYTgyeHhfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjaGlwLT5pcnEgPCAwKQorCQlnb3RvIF9fZW5kX2h3OworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fZGV2czsgaSsrKQorCQlzbmRfdmlhODJ4eF9jaGFubmVsX3Jlc2V0KGNoaXAsICZjaGlwLT5kZXZzW2ldKTsKKwlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKKyAgICAgIF9fZW5kX2h3OgorCWlmIChjaGlwLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOworCWlmIChjaGlwLT5tcHVfcmVzKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoY2hpcC0+bXB1X3Jlcyk7CisJCWtmcmVlX25vY2hlY2soY2hpcC0+bXB1X3Jlcyk7CisJfQorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKKworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gVFlQRV9WSUE2ODYpIHsKKwkJc25kX3ZpYTY4Nl9mcmVlX2dhbWVwb3J0KGNoaXApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfRlVOQ19FTkFCTEUsIGNoaXAtPm9sZF9sZWdhY3kpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfUE5QX0NPTlRST0wsIGNoaXAtPm9sZF9sZWdhY3lfY2ZnKTsKKwl9CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJdmlhODJ4eF90ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlyZXR1cm4gc25kX3ZpYTgyeHhfZnJlZShjaGlwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZpYTgyeHhfY3JlYXRlKHNuZF9jYXJkX3QgKiBjYXJkLAorCQkJCQlzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCQlpbnQgY2hpcF90eXBlLAorCQkJCQlpbnQgcmV2aXNpb24sCisJCQkJCXVuc2lnbmVkIGludCBhYzk3X2Nsb2NrLAorCQkJCQl2aWE4Mnh4X3QgKiogcl92aWEpCit7CisJdmlhODJ4eF90ICpjaGlwOworCWludCBlcnI7CisgICAgICAgIHN0YXRpYyBzbmRfZGV2aWNlX29wc190IG9wcyA9IHsKKwkJLmRldl9mcmVlID0Jc25kX3ZpYTgyeHhfZGV2X2ZyZWUsCisgICAgICAgIH07CisKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICgoY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoaXAtPmNoaXBfdHlwZSA9IGNoaXBfdHlwZTsKKwljaGlwLT5yZXZpc2lvbiA9IHJldmlzaW9uOworCisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmF0ZXNbMF0ubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJhdGVzWzFdLmxvY2spOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgVklBX0ZVTkNfRU5BQkxFLCAmY2hpcC0+b2xkX2xlZ2FjeSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBWSUFfUE5QX0NPTlRST0wsICZjaGlwLT5vbGRfbGVnYWN5X2NmZyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0ZVTkNfRU5BQkxFLAorCQkJICAgICAgY2hpcC0+b2xkX2xlZ2FjeSAmIH4oVklBX0ZVTkNfRU5BQkxFX1NCfFZJQV9GVU5DX0VOQUJMRV9GTSkpOworCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgY2FyZC0+ZHJpdmVyKSkgPCAwKSB7CisJCWtmcmVlKGNoaXApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3ZpYTgyeHhfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsCisJCQljYXJkLT5kcml2ZXIsICh2b2lkICopY2hpcCkpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworCWlmIChhYzk3X2Nsb2NrID49IDgwMDAgJiYgYWM5N19jbG9jayA8PSA0ODAwMCkKKwkJY2hpcC0+YWM5N19jbG9jayA9IGFjOTdfY2xvY2s7CisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKSkgPCAwKSB7CisJCXNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKKwkJc25kX3ZpYTgyeHhfZnJlZShjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBUaGUgODIzMyBhYzk3IGNvbnRyb2xsZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtYXN0ZXIgYml0CisJICogaW4gdGhlIHBjaSBjb21tYW5kIHJlZ2lzdGVyLiBJTUhPIHRoaXMgaXMgYSB2aW9sYXRpb24gb2YgdGhlIFBDSSBzcGVjLgorCSAqIFdlIGNhbGwgcGNpX3NldF9tYXN0ZXIgaGVyZSBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQuICovCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyX3ZpYSA9IGNoaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2aWE4MjN4X2luZm8geworCWludCByZXZpc2lvbjsKKwljaGFyICpuYW1lOworCWludCB0eXBlOworfTsKK3N0YXRpYyBzdHJ1Y3QgdmlhODIzeF9pbmZvIHZpYTgyM3hfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCXsgVklBX1JFVl9QUkVfODIzMywgIlZJQSA4MjMzLVByZSIsIFRZUEVfVklBODIzMyB9LAorCXsgVklBX1JFVl84MjMzQywgIlZJQSA4MjMzQyIsIFRZUEVfVklBODIzMyB9LAorCXsgVklBX1JFVl84MjMzLCAiVklBIDgyMzMiLCBUWVBFX1ZJQTgyMzMgfSwKKwl7IFZJQV9SRVZfODIzM0EsICJWSUEgODIzM0EiLCBUWVBFX1ZJQTgyMzNBIH0sCisJeyBWSUFfUkVWXzgyMzUsICJWSUEgODIzNSIsIFRZUEVfVklBODIzMyB9LAorCXsgVklBX1JFVl84MjM3LCAiVklBIDgyMzciLCBUWVBFX1ZJQTgyMzMgfSwKK307CisKKy8qCisgKiBhdXRvIGRldGVjdGlvbiBvZiBEWFMgY2hhbm5lbCBzdXBwb3J0cy4KKyAqLworc3RydWN0IGR4c193aGl0ZWxpc3QgeworCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7IAorCXVuc2lnbmVkIHNob3J0IG1hc2s7IAorCXNob3J0IGFjdGlvbjsJLyogbmV3IGR4c19zdXBwb3J0IHZhbHVlICovCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19keHNfbGlzdChzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXN0YXRpYyBzdHJ1Y3QgZHhzX3doaXRlbGlzdCB3aGl0ZWxpc3RbXSA9IHsKKwkJeyAudmVuZG9yID0gMHgxMDA1LCAuZGV2aWNlID0gMHg0NzEwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogQXZhbmNlIExvZ2ljIE1vYm8gKi8KKwkJeyAudmVuZG9yID0gMHgxMDE5LCAuZGV2aWNlID0gMHgwOTk2LCAuYWN0aW9uID0gVklBX0RYU180OEsgfSwKKwkJeyAudmVuZG9yID0gMHgxMDE5LCAuZGV2aWNlID0gMHgwYTgxLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogRUNTIEs3VlRBMyB2OC4wICovCisJCXsgLnZlbmRvciA9IDB4MTAxOSwgLmRldmljZSA9IDB4MGE4NSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEVDUyBMN1ZNTTIgKi8KKwkJeyAudmVuZG9yID0gMHgxMDI1LCAuZGV2aWNlID0gMHgwMDMzLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQWNlciBJbnNwaXJlIDEzNTNMTSAqLworCQl7IC52ZW5kb3IgPSAweDEwNDMsIC5kZXZpY2UgPSAweDgwOTUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBU1VTIEE3VjhYIChGSVhNRTogcG9zc2libHkgVklBX0RYU19FTkFCTEU/KSovCisJCXsgLnZlbmRvciA9IDB4MTA0MywgLmRldmljZSA9IDB4ODBhMSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWOC1YICovCisJCXsgLnZlbmRvciA9IDB4MTA0MywgLmRldmljZSA9IDB4ODBiMCwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWNjAwICYgSzhWKi8gCisJCXsgLnZlbmRvciA9IDB4MTA3MSwgLmRldmljZSA9IDB4ODM3NSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIFZvYmlzL1lha3Vtby9NaXRhYyBub3RlYm9vayAqLworCQl7IC52ZW5kb3IgPSAweDEwY2YsIC5kZXZpY2UgPSAweDExOGUsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBGU0MgbGFwdG9wICovCisJCXsgLnZlbmRvciA9IDB4MTEwNiwgLmRldmljZSA9IDB4NDE2MSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTUm9jayBLN1ZUMiAqLworCQl7IC52ZW5kb3IgPSAweDExMDYsIC5kZXZpY2UgPSAweDQ1NTIsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBRREkgS3Vkb3ogN1gvNjAwLTZBTCAqLworCQl7IC52ZW5kb3IgPSAweDExMDYsIC5kZXZpY2UgPSAweGFhMDEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBFUElBIE1JSSAqLworCQl7IC52ZW5kb3IgPSAweDEyOTcsIC5kZXZpY2UgPSAweGEyMzIsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBTaHV0dGxlID8/ICovCisJCXsgLnZlbmRvciA9IDB4MTI5NywgLmRldmljZSA9IDB4YzE2MCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIFNodXR0bGUgU0s0MUcgKi8KKwkJeyAudmVuZG9yID0gMHgxNDU4LCAuZGV2aWNlID0gMHhhMDAyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogR2lnYWJ5dGUgR0EtN1ZBWFAgKi8KKwkJeyAudmVuZG9yID0gMHgxNDYyLCAuZGV2aWNlID0gMHgzODAwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEtUMjY2ICovCisJCXsgLnZlbmRvciA9IDB4MTQ2MiwgLmRldmljZSA9IDB4NTkwMSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIE1TSSBLVDYgRGVsdGEtU1IgKi8KKwkJeyAudmVuZG9yID0gMHgxNDYyLCAuZGV2aWNlID0gMHg3MDIzLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogTVNJIEs4VCBOZW8yLUZJICovCisJCXsgLnZlbmRvciA9IDB4MTQ2MiwgLmRldmljZSA9IDB4NzEyMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIE1TSSBLVDRWICovCisJCXsgLnZlbmRvciA9IDB4MTQ3YiwgLmRldmljZSA9IDB4MTQwMSwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgS0Q3KC1SQUlEKSAqLworCQl7IC52ZW5kb3IgPSAweDE0N2IsIC5kZXZpY2UgPSAweDE0MTEsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBBQklUIFZBLTIwICovCisJCXsgLnZlbmRvciA9IDB4MTQ3YiwgLmRldmljZSA9IDB4MTQxMywgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgS1Y4IFBybyAqLworCQl7IC52ZW5kb3IgPSAweDE0N2IsIC5kZXZpY2UgPSAweDE0MTUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBYml0IEFWOCAqLworCQl7IC52ZW5kb3IgPSAweDE0ZmYsIC5kZXZpY2UgPSAweDA0MDMsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBUd2luaGVhZCBtb2JvICovCisJCXsgLnZlbmRvciA9IDB4MTU4NCwgLmRldmljZSA9IDB4ODEyMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEdlcmljb20vVGFyZ2EvVm9iaXMvVW5pd2lsbCBsYXB0b3AgKi8KKwkJeyAudmVuZG9yID0gMHgxNTg0LCAuZGV2aWNlID0gMHg4MTIzLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogVW5pd2lsbCAoVGFyZ2EgVmlzaW9uYXJ5IFhQLTIxMCkgKi8KKwkJeyAudmVuZG9yID0gMHgxNjFmLCAuZGV2aWNlID0gMHgyMDJiLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQW1pcmEgTm90ZSBib29rICovCisJCXsgLnZlbmRvciA9IDB4MTYxZiwgLmRldmljZSA9IDB4MjAzMiwgLmFjdGlvbiA9IFZJQV9EWFNfNDhLIH0sIC8qIG02ODB4IG1hY2hpbmVzICovCisJCXsgLnZlbmRvciA9IDB4MTYzMSwgLmRldmljZSA9IDB4ZTAwNCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEVhc3kgTm90ZSAzMTc0LCBQYWNrYXJkIEJlbGwgKi8KKwkJeyAudmVuZG9yID0gMHgxNjk1LCAuZGV2aWNlID0gMHgzMDA1LCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogRVBvWCBFUC04SzlBICovCisJCXsgLnZlbmRvciA9IDB4MTg0OSwgLmRldmljZSA9IDB4MzA1OSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTUm9jayBLN1ZNMiAqLworCQl7IH0gLyogdGVybWluYXRvciAqLworCX07CisJc3RydWN0IGR4c193aGl0ZWxpc3QgKnc7CisJdW5zaWduZWQgc2hvcnQgc3Vic3lzdGVtX3ZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBzdWJzeXN0ZW1fZGV2aWNlOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOworCisJZm9yICh3ID0gd2hpdGVsaXN0OyB3LT52ZW5kb3I7IHcrKykgeworCQlpZiAody0+dmVuZG9yICE9IHN1YnN5c3RlbV92ZW5kb3IpCisJCQljb250aW51ZTsKKwkJaWYgKHctPm1hc2spIHsKKwkJCWlmICgody0+bWFzayAmIHN1YnN5c3RlbV9kZXZpY2UpID09IHctPmRldmljZSkKKwkJCQlyZXR1cm4gdy0+YWN0aW9uOworCQl9IGVsc2UgeworCQkJaWYgKHN1YnN5c3RlbV9kZXZpY2UgPT0gdy0+ZGV2aWNlKQorCQkJCXJldHVybiB3LT5hY3Rpb247CisJCX0KKwl9CisKKwkvKgorCSAqIG5vdCBkZXRlY3RlZCwgdHJ5IDQ4ayByYXRlIG9ubHkgdG8gYmUgc3VyZS4KKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJ2aWE4Mnh4OiBBc3N1bWluZyBEWFMgY2hhbm5lbHMgd2l0aCA0OGsgZml4ZWQgc2FtcGxlIHJhdGUuXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBQbGVhc2UgdHJ5IGR4c19zdXBwb3J0PTEgb3IgZHhzX3N1cHBvcnQ9NCBvcHRpb25cbiIpOworCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgIGFuZCByZXBvcnQgaWYgaXQgd29ya3Mgb24geW91ciBtYWNoaW5lLlxuIik7CisJcmV0dXJuIFZJQV9EWFNfNDhLOworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ZpYTgyeHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCXZpYTgyeHhfdCAqY2hpcDsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCWludCBjaGlwX3R5cGUgPSAwLCBjYXJkX3R5cGU7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZW5hYmxlW2Rldl0pIHsKKwkJZGV2Kys7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FyZF90eXBlID0gcGNpX2lkLT5kcml2ZXJfZGF0YTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKwlzd2l0Y2ggKGNhcmRfdHlwZSkgeworCWNhc2UgVFlQRV9DQVJEX1ZJQTY4NjoKKwkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlZJQTY4NkEiKTsKKwkJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJWSUEgODJDNjg2QS9CIHJldiV4IiwgcmV2aXNpb24pOworCQljaGlwX3R5cGUgPSBUWVBFX1ZJQTY4NjsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX0NBUkRfVklBODIzMzoKKwkJY2hpcF90eXBlID0gVFlQRV9WSUE4MjMzOworCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlZJQSA4MjN4IHJldiV4IiwgcmV2aXNpb24pOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aWE4MjN4X2NhcmRzKTsgaSsrKSB7CisJCQlpZiAocmV2aXNpb24gPT0gdmlhODIzeF9jYXJkc1tpXS5yZXZpc2lvbikgeworCQkJCWNoaXBfdHlwZSA9IHZpYTgyM3hfY2FyZHNbaV0udHlwZTsKKwkJCQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCB2aWE4MjN4X2NhcmRzW2ldLm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChjaGlwX3R5cGUgIT0gVFlQRV9WSUE4MjMzQSkgeworCQkJaWYgKGR4c19zdXBwb3J0W2Rldl0gPT0gVklBX0RYU19BVVRPKQorCQkJCWR4c19zdXBwb3J0W2Rldl0gPSBjaGVja19keHNfbGlzdChwY2kpOworCQkJLyogZm9yY2UgdG8gdXNlIFZJQTgyMzMgb3IgODIzM0EgbW9kZWwgYWNjb3JkaW5nIHRvCisJCQkgKiBkeHNfc3VwcG9ydCBtb2R1bGUgb3B0aW9uCisJCQkgKi8KKwkJCWlmIChkeHNfc3VwcG9ydFtkZXZdID09IFZJQV9EWFNfRElTQUJMRSkKKwkJCQljaGlwX3R5cGUgPSBUWVBFX1ZJQTgyMzNBOworCQkJZWxzZQorCQkJCWNoaXBfdHlwZSA9IFRZUEVfVklBODIzMzsKKwkJfQorCQlpZiAoY2hpcF90eXBlID09IFRZUEVfVklBODIzM0EpCisJCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiVklBODIzM0EiKTsKKwkJZWxzZSBpZiAocmV2aXNpb24gPj0gVklBX1JFVl84MjM3KQorCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlZJQTgyMzciKTsgLyogbm8gc2xvZyBhc3NpZ25tZW50ICovCisJCWVsc2UKKwkJCXN0cmNweShjYXJkLT5kcml2ZXIsICJWSUE4MjMzIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIF9fZXJyb3I7CisJfQorCQkKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X2NyZWF0ZShjYXJkLCBwY2ksIGNoaXBfdHlwZSwgcmV2aXNpb24sIGFjOTdfY2xvY2tbZGV2XSwgJmNoaXApKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X21peGVyX25ldyhjaGlwLCBhYzk3X3F1aXJrW2Rldl0pKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKworCWlmIChjaGlwX3R5cGUgPT0gVFlQRV9WSUE2ODYpIHsKKwkJaWYgKChlcnIgPSBzbmRfdmlhNjg2X3BjbV9uZXcoY2hpcCkpIDwgMCB8fAorCQkgICAgKGVyciA9IHNuZF92aWE2ODZfaW5pdF9taXNjKGNoaXAsIGRldikpIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwl9IGVsc2UgeworCQlpZiAoY2hpcF90eXBlID09IFRZUEVfVklBODIzM0EpIHsKKwkJCWlmICgoZXJyID0gc25kX3ZpYTgyMzNhX3BjbV9uZXcoY2hpcCkpIDwgMCkKKwkJCQlnb3RvIF9fZXJyb3I7CisJCQkvLyBjaGlwLT5keHNfZml4ZWQgPSAxOyAvKiBGSVhNRTogdXNlIDQ4ayBmb3IgRFhTICMzPyAqLworCQl9IGVsc2UgeworCQkJaWYgKChlcnIgPSBzbmRfdmlhODIzM19wY21fbmV3KGNoaXApKSA8IDApCisJCQkJZ290byBfX2Vycm9yOworCQkJaWYgKGR4c19zdXBwb3J0W2Rldl0gPT0gVklBX0RYU180OEspCisJCQkJY2hpcC0+ZHhzX2ZpeGVkID0gMTsKKwkJCWVsc2UgaWYgKGR4c19zdXBwb3J0W2Rldl0gPT0gVklBX0RYU19OT19WUkEpCisJCQkJY2hpcC0+bm9fdnJhID0gMTsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF92aWE4MjMzX2luaXRfbWlzYyhjaGlwLCBkZXYpKSA8IDApCisJCQlnb3RvIF9fZXJyb3I7CisJfQorCisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIHNuZF92aWE4Mnh4X3N1c3BlbmQsIHNuZF92aWE4Mnh4X3Jlc3VtZSwgY2hpcCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CisKKwlzbnByaW50ZihjYXJkLT5sb25nbmFtZSwgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSwKKwkJICIlcyB3aXRoICVzIGF0ICUjbHgsIGlycSAlZCIsIGNhcmQtPnNob3J0bmFtZSwKKwkJIHNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKGNoaXAtPmFjOTcpLCBjaGlwLT5wb3J0LCBjaGlwLT5pcnEpOworCisJc25kX3ZpYTgyeHhfcHJvY19pbml0KGNoaXApOworCisJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworCisgX19lcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfdmlhODJ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJWSUEgODJ4eCBBdWRpbyIsCisJLmlkX3RhYmxlID0gc25kX3ZpYTgyeHhfaWRzLAorCS5wcm9iZSA9IHNuZF92aWE4Mnh4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfdmlhODJ4eF9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfdmlhODJ4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF92aWE4Mnh4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfY2FyZF92aWE4Mnh4X2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfdmlhODJ4eF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1YzZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTAsMCArMSwxMjQ1IEBACisvKgorICogICBBTFNBIG1vZGVtIGRyaXZlciBmb3IgVklBIFZUODJ4eCAoU291dGggQnJpZGdlKQorICoKKyAqICAgVlQ4MkM2ODZBL0IvQywgVlQ4MjMzQS9DLCBWVDgyMzUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICoJICAgICAgICAgICAgICAgICAgIFRqZWVyZC5NdWxkZXIgPFRqZWVyZC5NdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAyIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiBDaGFuZ2VzOgorICoKKyAqIFNlcC4gMiwgIDIwMDQgIFNhc2hhIEtoYXB5b3Jza3kgPHNhc2hha0BzbWxpbmsuY29tPgorICogICAgICBNb2RpZmllZCBmcm9tIG9yaWdpbmFsIGF1ZGlvIGRyaXZlciAndmlhODJ4eC5jJyB0byBzdXBwb3J0IEFDOTcKKyAqICAgICAgbW9kZW1zLgorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaWYgMAorI2RlZmluZSBQT0lOVEVSX0RFQlVHCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgVlQ4Mnh4IG1vZGVtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tWSUEsVlQ4MkM2ODZBL0IvQyBtb2RlbSxwY2l9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gLTJ9OyAvKiBFeGNsdWRlIHRoZSBmaXJzdCBjYXJkICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBhYzk3X2Nsb2NrW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNDgwMDB9OworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIFZJQSA4Mnh4IGJyaWRnZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgVklBIDgyeHggYnJpZGdlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBtb2RlbSBwYXJ0IG9mIFZJQSA4Mnh4IGJyaWRnZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShhYzk3X2Nsb2NrLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhYzk3X2Nsb2NrLCAiQUMnOTcgY29kZWMgY2xvY2sgKGRlZmF1bHQgNDgwMDBIeikuIik7CisKKworLyoKKyAqICBEaXJlY3QgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBWSUFSRUcodmlhLCB4KSAoKHZpYSktPnBvcnQgKyBWSUFfUkVHXyMjeCkKKyNkZWZpbmUgVklBREVWX1JFRyh2aWFkZXYsIHgpICgodmlhZGV2KS0+cG9ydCArIFZJQV9SRUdfIyN4KQorCisvKiBjb21tb24gb2Zmc2V0cyAqLworI2RlZmluZSBWSUFfUkVHX09GRlNFVF9TVEFUVVMJCTB4MDAJLyogYnl0ZSAtIGNoYW5uZWwgc3RhdHVzICovCisjZGVmaW5lICAgVklBX1JFR19TVEFUX0FDVElWRQkJMHg4MAkvKiBSTyAqLworI2RlZmluZSAgIFZJQV9SRUdfU1RBVF9QQVVTRUQJCTB4NDAJLyogUk8gKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NUQVRfVFJJR0dFUl9RVUVVRUQJMHgwOAkvKiBSTyAqLworI2RlZmluZSAgIFZJQV9SRUdfU1RBVF9TVE9QUEVECQkweDA0CS8qIFJXQyAqLworI2RlZmluZSAgIFZJQV9SRUdfU1RBVF9FT0wJCTB4MDIJLyogUldDICovCisjZGVmaW5lICAgVklBX1JFR19TVEFUX0ZMQUcJCTB4MDEJLyogUldDICovCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX0NPTlRST0wJCTB4MDEJLyogYnl0ZSAtIGNoYW5uZWwgY29udHJvbCAqLworI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9TVEFSVAkJMHg4MAkvKiBXTyAqLworI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9URVJNSU5BVEUJMHg0MAkvKiBXTyAqLworI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9BVVRPU1RBUlQJMHgyMAorI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9QQVVTRQkJMHgwOAkvKiBSVyAqLworI2RlZmluZSAgIFZJQV9SRUdfQ1RSTF9JTlRfU1RPUAkJMHgwNAkJCisjZGVmaW5lICAgVklBX1JFR19DVFJMX0lOVF9FT0wJCTB4MDIKKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfSU5UX0ZMQUcJCTB4MDEKKyNkZWZpbmUgICBWSUFfUkVHX0NUUkxfUkVTRVQJCTB4MDEJLyogUlcgLSBwcm9iYWJseSByZXNldD8gdW5kb2N1bWVudGVkICovCisjZGVmaW5lICAgVklBX1JFR19DVFJMX0lOVCAoVklBX1JFR19DVFJMX0lOVF9GTEFHIHwgVklBX1JFR19DVFJMX0lOVF9FT0wgfCBWSUFfUkVHX0NUUkxfQVVUT1NUQVJUKQorI2RlZmluZSBWSUFfUkVHX09GRlNFVF9UWVBFCQkweDAyCS8qIGJ5dGUgLSBjaGFubmVsIHR5cGUgKDY4NiBvbmx5KSAqLworI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9BVVRPU1RBUlQJMHg4MAkvKiBSVyAtIGF1dG9zdGFydCBhdCBFT0wgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfMTZCSVQJCTB4MjAJLyogUlcgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfU1RFUkVPCQkweDEwCS8qIFJXICovCisjZGVmaW5lICAgVklBX1JFR19UWVBFX0lOVF9MTElORQkweDAwCisjZGVmaW5lICAgVklBX1JFR19UWVBFX0lOVF9MU0FNUExFCTB4MDQKKyNkZWZpbmUgICBWSUFfUkVHX1RZUEVfSU5UX0xFU1NPTkUJMHgwOAorI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9JTlRfTUFTSwkJMHgwYworI2RlZmluZSAgIFZJQV9SRUdfVFlQRV9JTlRfRU9MCQkweDAyCisjZGVmaW5lICAgVklBX1JFR19UWVBFX0lOVF9GTEFHCQkweDAxCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX1RBQkxFX1BUUgkweDA0CS8qIGR3b3JkIC0gY2hhbm5lbCB0YWJsZSBwb2ludGVyICovCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX0NVUlJfUFRSCQkweDA0CS8qIGR3b3JkIC0gY2hhbm5lbCBjdXJyZW50IHBvaW50ZXIgKi8KKyNkZWZpbmUgVklBX1JFR19PRkZTRVRfU1RPUF9JRFgJCTB4MDgJLyogZHdvcmQgLSBzdG9wIGluZGV4LCBjaGFubmVsIHR5cGUsIHNhbXBsZSByYXRlICovCisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUX0NVUlJfQ09VTlQJMHgwYwkvKiBkd29yZCAtIGNoYW5uZWwgY3VycmVudCBjb3VudCAoMjQgYml0KSAqLworI2RlZmluZSBWSUFfUkVHX09GRlNFVF9DVVJSX0lOREVYCTB4MGYJLyogYnl0ZSAtIGNoYW5uZWwgY3VycmVudCBpbmRleCAoZm9yIHZpYTgyMzMgb25seSkgKi8KKworI2RlZmluZSBERUZJTkVfVklBX1JFR1NFVChuYW1lLHZhbCkgXAorZW51bSB7XAorCVZJQV9SRUdfIyNuYW1lIyNfU1RBVFVTCQk9ICh2YWwpLFwKKwlWSUFfUkVHXyMjbmFtZSMjX0NPTlRST0wJPSAodmFsKSArIDB4MDEsXAorCVZJQV9SRUdfIyNuYW1lIyNfVFlQRQkJPSAodmFsKSArIDB4MDIsXAorCVZJQV9SRUdfIyNuYW1lIyNfVEFCTEVfUFRSCT0gKHZhbCkgKyAweDA0LFwKKwlWSUFfUkVHXyMjbmFtZSMjX0NVUlJfUFRSCT0gKHZhbCkgKyAweDA0LFwKKwlWSUFfUkVHXyMjbmFtZSMjX1NUT1BfSURYCT0gKHZhbCkgKyAweDA4LFwKKwlWSUFfUkVHXyMjbmFtZSMjX0NVUlJfQ09VTlQJPSAodmFsKSArIDB4MGMsXAorfQorCisvKiBtb2RlbSBibG9jayAqLworREVGSU5FX1ZJQV9SRUdTRVQoTU8sIDB4NDApOworREVGSU5FX1ZJQV9SRUdTRVQoTUksIDB4NTApOworCisvKiBBQyc5NyAqLworI2RlZmluZSBWSUFfUkVHX0FDOTcJCQkweDgwCS8qIGR3b3JkICovCisjZGVmaW5lICAgVklBX1JFR19BQzk3X0NPREVDX0lEX01BU0sJKDM8PDMwKQorI2RlZmluZSAgIFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TSElGVAkzMAorI2RlZmluZSAgIFZJQV9SRUdfQUM5N19DT0RFQ19JRF9QUklNQVJZCTB4MDAKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0VDT05EQVJZIDB4MDEKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElECSgxPDwyNykKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfUFJJTUFSWV9WQUxJRAkoMTw8MjUpCisjZGVmaW5lICAgVklBX1JFR19BQzk3X0JVU1kJCSgxPDwyNCkKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfUkVBRAkJKDE8PDIzKQorI2RlZmluZSAgIFZJQV9SRUdfQUM5N19DTURfU0hJRlQJMTYKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfQ01EX01BU0sJCTB4N2UKKyNkZWZpbmUgICBWSUFfUkVHX0FDOTdfREFUQV9TSElGVAkwCisjZGVmaW5lICAgVklBX1JFR19BQzk3X0RBVEFfTUFTSwkweGZmZmYKKworI2RlZmluZSBWSUFfUkVHX1NHRF9TSEFET1cJCTB4ODQJLyogZHdvcmQgKi8KKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX0ZMQUcJKDE8PDApCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9DUF9GTEFHCSgxPDwxKQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfRk1fRkxBRwkoMTw8MikKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX0VPTAkoMTw8NCkKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0NQX0VPTAkoMTw8NSkKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0ZNX0VPTAkoMTw8NikKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX1BCX1NUT1AJKDE8PDgpCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9DUF9TVE9QCSgxPDw5KQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfRk1fU1RPUAkoMTw8MTApCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9QQl9BQ1RJVkUJKDE8PDEyKQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfQ1BfQUNUSVZFCSgxPDwxMykKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX0ZNX0FDVElWRQkoMTw8MTQpCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9NUl9GTEFHICAgICAgKDE8PDE2KQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfTVdfRkxBRyAgICAgICgxPDwxNykKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX01SX0VPTCAgICAgICAoMTw8MjApCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9NV19FT0wgICAgICAgKDE8PDIxKQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfTVJfU1RPUCAgICAgICgxPDwyNCkKKyNkZWZpbmUgICBWSUFfUkVHX1NHRF9TVEFUX01XX1NUT1AgICAgICAoMTw8MjUpCisjZGVmaW5lICAgVklBX1JFR19TR0RfU1RBVF9NUl9BQ1RJVkUgICAgKDE8PDI4KQorI2RlZmluZSAgIFZJQV9SRUdfU0dEX1NUQVRfTVdfQUNUSVZFICAgICgxPDwyOSkKKworI2RlZmluZSBWSUFfUkVHX0dQSV9TVEFUVVMJCTB4ODgKKyNkZWZpbmUgVklBX1JFR19HUElfSU5UUgkJMHg4YworCisjZGVmaW5lIFZJQV9UQkxfQklUX0ZMQUcJMHg0MDAwMDAwMAorI2RlZmluZSBWSUFfVEJMX0JJVF9FT0wJCTB4ODAwMDAwMDAKKworLyogcGNpIHNwYWNlICovCisjZGVmaW5lIFZJQV9BQ0xJTktfU1RBVAkJMHg0MAorI2RlZmluZSAgVklBX0FDTElOS19DMTFfUkVBRFkJMHgyMAorI2RlZmluZSAgVklBX0FDTElOS19DMTBfUkVBRFkJMHgxMAorI2RlZmluZSAgVklBX0FDTElOS19DMDFfUkVBRFkJMHgwNCAvKiBzZWNvbmRhcnkgY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfTE9XUE9XRVIJMHgwMiAvKiBsb3ctcG93ZXIgc3RhdGUgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQzAwX1JFQURZCTB4MDEgLyogcHJpbWFyeSBjb2RlYyByZWFkeSAqLworI2RlZmluZSBWSUFfQUNMSU5LX0NUUkwJCTB4NDEKKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9FTkFCTEUJMHg4MCAvKiAwOiBkaXNhYmxlLCAxOiBlbmFibGUgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9SRVNFVAkweDQwIC8qIDA6IGFzc2VydCwgMTogZGUtYXNzZXJ0ICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfU1lOQwkweDIwIC8qIDA6IHJlbGVhc2UgU1lOQywgMTogZm9yY2UgU1lOQyBoaSAqLworI2RlZmluZSAgVklBX0FDTElOS19DVFJMX1NETwkweDEwIC8qIDA6IHJlbGVhc2UgU0RPLCAxOiBmb3JjZSBTRE8gaGkgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9WUkEJMHgwOCAvKiAwOiBkaXNhYmxlIFZSQSwgMTogZW5hYmxlIFZSQSAqLworI2RlZmluZSAgVklBX0FDTElOS19DVFJMX1BDTQkweDA0IC8qIDA6IGRpc2FibGUgUENNLCAxOiBlbmFibGUgUENNICovCisjZGVmaW5lICBWSUFfQUNMSU5LX0NUUkxfRk0JMHgwMiAvKiB2aWE2ODYgb25seSAqLworI2RlZmluZSAgVklBX0FDTElOS19DVFJMX1NCCTB4MDEgLyogdmlhNjg2IG9ubHkgKi8KKyNkZWZpbmUgIFZJQV9BQ0xJTktfQ1RSTF9JTklUCShWSUFfQUNMSU5LX0NUUkxfRU5BQkxFfFwKKwkJCQkgVklBX0FDTElOS19DVFJMX1JFU0VUfFwKKwkJCQkgVklBX0FDTElOS19DVFJMX1BDTSkKKyNkZWZpbmUgVklBX0ZVTkNfRU5BQkxFCQkweDQyCisjZGVmaW5lICBWSUFfRlVOQ19NSURJX1BOUAkweDgwIC8qIEZJWE1FOiBpdCdzIDB4NDAgaW4gdGhlIGRhdGFzaGVldCEgKi8KKyNkZWZpbmUgIFZJQV9GVU5DX01JRElfSVJRTUFTSwkweDQwIC8qIEZJWE1FOiBub3QgZG9jdW1lbnRlZCEgKi8KKyNkZWZpbmUgIFZJQV9GVU5DX1JYMkNfV1JJVEUJMHgyMAorI2RlZmluZSAgVklBX0ZVTkNfU0JfRklGT19FTVBUWQkweDEwCisjZGVmaW5lICBWSUFfRlVOQ19FTkFCTEVfR0FNRQkweDA4CisjZGVmaW5lICBWSUFfRlVOQ19FTkFCTEVfRk0JMHgwNAorI2RlZmluZSAgVklBX0ZVTkNfRU5BQkxFX01JREkJMHgwMgorI2RlZmluZSAgVklBX0ZVTkNfRU5BQkxFX1NCCTB4MDEKKyNkZWZpbmUgVklBX1BOUF9DT05UUk9MCQkweDQzCisjZGVmaW5lIFZJQV9NQzk3X0NUUkwJCTB4NDQKKyNkZWZpbmUgIFZJQV9NQzk3X0NUUkxfRU5BQkxFICAgMHg4MAorI2RlZmluZSAgVklBX01DOTdfQ1RSTF9TRUNPTkRBUlkgMHg0MAorI2RlZmluZSAgVklBX01DOTdfQ1RSTF9JTklUICAgICAoVklBX01DOTdfQ1RSTF9FTkFCTEV8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklBX01DOTdfQ1RSTF9TRUNPTkRBUlkpCisKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF92aWE4Mnh4X21vZGVtIHZpYTgyeHhfdDsKK3R5cGVkZWYgc3RydWN0IHZpYV9kZXYgdmlhZGV2X3Q7CisKKy8qCisgKiBwY20gc3RyZWFtCisgKi8KKworc3RydWN0IHNuZF92aWFfc2dfdGFibGUgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7Cit9IDsKKworI2RlZmluZSBWSUFfVEFCTEVfU0laRQkyNTUKKworc3RydWN0IHZpYV9kZXYgeworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwlpbnQgZGlyZWN0aW9uOwkvKiBwbGF5YmFjayA9IDAsIGNhcHR1cmUgPSAxICovCisgICAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKKwlpbnQgcnVubmluZzsKKwl1bnNpZ25lZCBpbnQgdGJsX2VudHJpZXM7IC8qICMgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgdGFibGU7CisJc3RydWN0IHNuZF92aWFfc2dfdGFibGUgKmlkeF90YWJsZTsKKwkvKiBmb3IgcmVjb3ZlcnkgZnJvbSB0aGUgdW5leHBlY3RlZCBwb2ludGVyICovCisJdW5zaWduZWQgaW50IGxhc3Rwb3M7CisJdW5zaWduZWQgaW50IGJ1ZnNpemU7CisJdW5zaWduZWQgaW50IGJ1ZnNpemUyOworfTsKKworZW51bSB7IFRZUEVfQ0FSRF9WSUE4MlhYX01PREVNID0gMSB9OworCisjZGVmaW5lIFZJQV9NQVhfTU9ERU1fREVWUwkyCisKK3N0cnVjdCBfc25kX3ZpYTgyeHhfbW9kZW0geworCWludCBpcnE7CisKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisKKwl1bnNpZ25lZCBpbnQgaW50cl9tYXNrOyAvKiBTR0RfU0hBRE9XIG1hc2sgdG8gY2hlY2sgaW50ZXJydXB0cyAqLworCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzbmRfY2FyZF90ICpjYXJkOworCisJdW5zaWduZWQgaW50IG51bV9kZXZzOworCXVuc2lnbmVkIGludCBwbGF5YmFja19kZXZubywgY2FwdHVyZV9kZXZubzsKKwl2aWFkZXZfdCBkZXZzW1ZJQV9NQVhfTU9ERU1fREVWU107CisKKwlzbmRfcGNtX3QgKnBjbXNbMl07CisKKwlhYzk3X2J1c190ICphYzk3X2J1czsKKwlhYzk3X3QgKmFjOTc7CisJdW5zaWduZWQgaW50IGFjOTdfY2xvY2s7CisJdW5zaWduZWQgaW50IGFjOTdfc2Vjb25kYXJ5OwkvKiBzZWNvbmRhcnkgQUMnOTcgY29kZWMgaXMgcHJlc2VudCAqLworCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzbmRfaW5mb19lbnRyeV90ICpwcm9jX2VudHJ5OworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF92aWE4Mnh4X21vZGVtX2lkc1tdID0geworCXsgMHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEVfQ0FSRF9WSUE4MlhYX01PREVNLCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF92aWE4Mnh4X21vZGVtX2lkcyk7CisKKy8qCisgKi8KKworLyoKKyAqIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIGJ1ZmZlcnMKKyAqIHBlcmlvZHMgPSBudW1iZXIgb2YgcGVyaW9kcworICogZnJhZ3NpemUgPSBwZXJpb2Qgc2l6ZSBpbiBieXRlcworICovCitzdGF0aWMgaW50IGJ1aWxkX3ZpYV90YWJsZSh2aWFkZXZfdCAqZGV2LCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJICAgdW5zaWduZWQgaW50IHBlcmlvZHMsIHVuc2lnbmVkIGludCBmcmFnc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4LCBvZnMsIHJlc3Q7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1ZiA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7CisKKwlpZiAoZGV2LT50YWJsZS5hcmVhID09IE5VTEwpIHsKKwkJLyogdGhlIHN0YXJ0IG9mIGVhY2ggbGlzdHMgbXVzdCBiZSBhbGlnbmVkIHRvIDggYnl0ZXMsCisJCSAqIGJ1dCB0aGUga2VybmVsIHBhZ2VzIGFyZSBtdWNoIGJpZ2dlciwgc28gd2UgZG9uJ3QgY2FyZQorCQkgKi8KKwkJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCVBBR0VfQUxJR04oVklBX1RBQkxFX1NJWkUgKiAyICogOCksCisJCQkJCSZkZXYtPnRhYmxlKSA8IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKCEgZGV2LT5pZHhfdGFibGUpIHsKKwkJZGV2LT5pZHhfdGFibGUgPSBrbWFsbG9jKHNpemVvZigqZGV2LT5pZHhfdGFibGUpICogVklBX1RBQkxFX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoISBkZXYtPmlkeF90YWJsZSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZpbGwgdGhlIGVudHJpZXMgKi8KKwlpZHggPSAwOworCW9mcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgeworCQlyZXN0ID0gZnJhZ3NpemU7CisJCS8qIGZpbGwgZGVzY3JpcHRvcnMgZm9yIGEgcGVyaW9kLgorCQkgKiBhIHBlcmlvZCBjYW4gYmUgc3BsaXQgdG8gc2V2ZXJhbCBkZXNjcmlwdG9ycyBpZiBpdCdzCisJCSAqIG92ZXIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCWRvIHsKKwkJCXVuc2lnbmVkIGludCByOworCQkJdW5zaWduZWQgaW50IGZsYWc7CisKKwkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbaWR4IDw8IDFdID0gY3B1X3RvX2xlMzIoKHUzMilzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHNnYnVmLCBvZnMpKTsKKwkJCXIgPSBQQUdFX1NJWkUgLSAob2ZzICUgUEFHRV9TSVpFKTsKKwkJCWlmIChyZXN0IDwgcikKKwkJCQlyID0gcmVzdDsKKwkJCXJlc3QgLT0gcjsKKwkJCWlmICghIHJlc3QpIHsKKwkJCQlpZiAoaSA9PSBwZXJpb2RzIC0gMSkKKwkJCQkJZmxhZyA9IFZJQV9UQkxfQklUX0VPTDsgLyogYnVmZmVyIGJvdW5kYXJ5ICovCisJCQkJZWxzZQorCQkJCQlmbGFnID0gVklBX1RCTF9CSVRfRkxBRzsgLyogcGVyaW9kIGJvdW5kYXJ5ICovCisJCQl9IGVsc2UKKwkJCQlmbGFnID0gMDsgLyogcGVyaW9kIGNvbnRpbnVlcyB0byB0aGUgbmV4dCAqLworCQkJLy8gcHJpbnRrKCJ2aWE6IHRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLCBpZHgsIG9mcywgciwgcmVzdCk7CisJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKKwkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOworCQkJZGV2LT5pZHhfdGFibGVbaWR4XS5zaXplID0gcjsKKwkJCW9mcyArPSByOworCQkJaWR4Kys7CisJCX0gd2hpbGUgKHJlc3QgPiAwKTsKKwl9CisJZGV2LT50YmxfZW50cmllcyA9IGlkeDsKKwlkZXYtPmJ1ZnNpemUgPSBwZXJpb2RzICogZnJhZ3NpemU7CisJZGV2LT5idWZzaXplMiA9IGRldi0+YnVmc2l6ZSAvIDI7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjbGVhbl92aWFfdGFibGUodmlhZGV2X3QgKmRldiwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpZiAoZGV2LT50YWJsZS5hcmVhKSB7CisJCXNuZF9kbWFfZnJlZV9wYWdlcygmZGV2LT50YWJsZSk7CisJCWRldi0+dGFibGUuYXJlYSA9IE5VTEw7CisJfQorCWlmIChkZXYtPmlkeF90YWJsZSkgeworCQlrZnJlZShkZXYtPmlkeF90YWJsZSk7CisJCWRldi0+aWR4X3RhYmxlID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQmFzaWMgSS9PCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3ZpYTgyeHhfY29kZWNfeHJlYWQodmlhODJ4eF90ICpjaGlwKQoreworCXJldHVybiBpbmwoVklBUkVHKGNoaXAsIEFDOTcpKTsKK30KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfdmlhODJ4eF9jb2RlY194d3JpdGUodmlhODJ4eF90ICpjaGlwLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW91dGwodmFsLCBWSUFSRUcoY2hpcCwgQUM5NykpOworfQorIAorc3RhdGljIGludCBzbmRfdmlhODJ4eF9jb2RlY19yZWFkeSh2aWE4Mnh4X3QgKmNoaXAsIGludCBzZWNvbmRhcnkpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwOwkvKiAxbXMgKi8KKwl1bnNpZ25lZCBpbnQgdmFsOworCQorCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKCEoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKSkKKwkJCXJldHVybiB2YWwgJiAweGZmZmY7CisJfQorCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKKwlyZXR1cm4gLUVJTzsKK30KKyAKK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfY29kZWNfdmFsaWQodmlhODJ4eF90ICpjaGlwLCBpbnQgc2Vjb25kYXJ5KQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsJLyogMW1zICovCisJdW5zaWduZWQgaW50IHZhbCwgdmFsMTsKKwl1bnNpZ25lZCBpbnQgc3RhdCA9ICFzZWNvbmRhcnkgPyBWSUFfUkVHX0FDOTdfUFJJTUFSWV9WQUxJRCA6CisJCQkJCSBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEOworCQorCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApOworCQl2YWwxID0gdmFsICYgKFZJQV9SRUdfQUM5N19CVVNZIHwgc3RhdCk7CisJCWlmICh2YWwxID09IHN0YXQpCisJCQlyZXR1cm4gdmFsICYgMHhmZmZmOworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiAtRUlPOworfQorIAorc3RhdGljIHZvaWQgc25kX3ZpYTgyeHhfY29kZWNfd2FpdChhYzk3X3QgKmFjOTcpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisJZXJyID0gc25kX3ZpYTgyeHhfY29kZWNfcmVhZHkoY2hpcCwgYWM5Ny0+bnVtKTsKKwkvKiBoZXJlIHdlIG5lZWQgdG8gd2FpdCBmYWlybHkgZm9yIGxvbmcgdGltZS4uICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovMik7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X2NvZGVjX3dyaXRlKGFjOTdfdCAqYWM5NywKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB4dmFsOworCQorCXh2YWwgPSAhYWM5Ny0+bnVtID8gVklBX1JFR19BQzk3X0NPREVDX0lEX1BSSU1BUlkgOiBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0VDT05EQVJZOworCXh2YWwgPDw9IFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TSElGVDsKKwl4dmFsIHw9IHJlZyA8PCBWSUFfUkVHX0FDOTdfQ01EX1NISUZUOworCXh2YWwgfD0gdmFsIDw8IFZJQV9SRUdfQUM5N19EQVRBX1NISUZUOworCXNuZF92aWE4Mnh4X2NvZGVjX3h3cml0ZShjaGlwLCB4dmFsKTsKKwlzbmRfdmlhODJ4eF9jb2RlY19yZWFkeShjaGlwLCBhYzk3LT5udW0pOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX3ZpYTgyeHhfY29kZWNfcmVhZChhYzk3X3QgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHh2YWwsIHZhbCA9IDB4ZmZmZjsKKwlpbnQgYWdhaW4gPSAwOworCisJeHZhbCA9IGFjOTctPm51bSA8PCBWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0hJRlQ7CisJeHZhbCB8PSBhYzk3LT5udW0gPyBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEIDogVklBX1JFR19BQzk3X1BSSU1BUllfVkFMSUQ7CisJeHZhbCB8PSBWSUFfUkVHX0FDOTdfUkVBRDsKKwl4dmFsIHw9IChyZWcgJiAweDdmKSA8PCBWSUFfUkVHX0FDOTdfQ01EX1NISUZUOworICAgICAgCXdoaWxlICgxKSB7CisgICAgICAJCWlmIChhZ2FpbisrID4gMykgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZDogY29kZWMgJWkgaXMgbm90IHZhbGlkIFsweCV4XVxuIiwgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CisJCSAgICAgIAlyZXR1cm4gMHhmZmZmOworCQl9CisJCXNuZF92aWE4Mnh4X2NvZGVjX3h3cml0ZShjaGlwLCB4dmFsKTsKKwkJdWRlbGF5ICgyMCk7CisJCWlmIChzbmRfdmlhODJ4eF9jb2RlY192YWxpZChjaGlwLCBhYzk3LT5udW0pID49IDApIHsKKwkJCXVkZWxheSgyNSk7CisJCQl2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB2YWwgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQodmlhODJ4eF90ICpjaGlwLCB2aWFkZXZfdCAqdmlhZGV2KQoreworCW91dGIoVklBX1JFR19DVFJMX1BBVVNFIHwgVklBX1JFR19DVFJMX1RFUk1JTkFURSB8IFZJQV9SRUdfQ1RSTF9SRVNFVCwKKwkgICAgIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfQ09OVFJPTCkpOworCWluYihWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NPTlRST0wpKTsKKwl1ZGVsYXkoNTApOworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW91dGIoMHgwMCwgVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9DT05UUk9MKSk7CisJLyogY2xlYXIgaW50ZXJydXB0cyAqLworCW91dGIoMHgwMywgVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9TVEFUVVMpKTsKKwlvdXRiKDB4MDAsIFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfVFlQRSkpOyAvKiBmb3IgdmlhNjg2ICovCisJLy8gb3V0bCgwLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NVUlJfUFRSKSk7CisJdmlhZGV2LT5sYXN0cG9zID0gMDsKK30KKworCisvKgorICogIEludGVycnVwdCBoYW5kbGVyCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHNuZF92aWE4Mnh4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCisJc3RhdHVzID0gaW5sKFZJQVJFRyhjaGlwLCBTR0RfU0hBRE9XKSk7CisJaWYgKCEgKHN0YXR1cyAmIGNoaXAtPmludHJfbWFzaykpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKy8vIF9za2lwX3NnZDoKKworCS8qIGNoZWNrIHN0YXR1cyBmb3IgZWFjaCBzdHJlYW0gKi8KKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykgeworCQl2aWFkZXZfdCAqdmlhZGV2ID0gJmNoaXAtPmRldnNbaV07CisJCXVuc2lnbmVkIGNoYXIgY19zdGF0dXMgPSBpbmIoVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9TVEFUVVMpKTsKKwkJY19zdGF0dXMgJj0gKFZJQV9SRUdfU1RBVF9FT0x8VklBX1JFR19TVEFUX0ZMQUd8VklBX1JFR19TVEFUX1NUT1BQRUQpOworCQlpZiAoISBjX3N0YXR1cykKKwkJCWNvbnRpbnVlOworCQlpZiAodmlhZGV2LT5zdWJzdHJlYW0gJiYgdmlhZGV2LT5ydW5uaW5nKSB7CisJCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZCh2aWFkZXYtPnN1YnN0cmVhbSk7CisJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJfQorCQlvdXRiKGNfc3RhdHVzLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1NUQVRVUykpOyAvKiBhY2sgKi8KKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgUENNIGNhbGxiYWNrcworICovCisKKy8qCisgKiB0cmlnZ2VyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGNtX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJdmFsIHw9IFZJQV9SRUdfQ1RSTF9TVEFSVDsKKwkJdmlhZGV2LT5ydW5uaW5nID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQl2YWwgPSBWSUFfUkVHX0NUUkxfVEVSTUlOQVRFOworCQl2aWFkZXYtPnJ1bm5pbmcgPSAwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXZhbCB8PSBWSUFfUkVHX0NUUkxfUEFVU0U7CisJCXZpYWRldi0+cnVubmluZyA9IDA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJdmlhZGV2LT5ydW5uaW5nID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW91dGIodmFsLCBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NPTlRST0wpKTsKKwlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUT1ApCisJCXNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQoY2hpcCwgdmlhZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdmlhODJ4eF9tb2RlbV9wY21fdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXZhbCA9IHNuZF9hYzk3X3JlYWQoY2hpcC0+YWM5NywgQUM5N19HUElPX1NUQVRVUyk7CisJCW91dGwodmFsfEFDOTdfR1BJT19MSU5FMV9PSCwgVklBUkVHKGNoaXAsIEdQSV9TVEFUVVMpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQl2YWwgPSBzbmRfYWM5N19yZWFkKGNoaXAtPmFjOTcsIEFDOTdfR1BJT19TVEFUVVMpOworCQlvdXRsKHZhbCZ+QUM5N19HUElPX0xJTkUxX09ILCBWSUFSRUcoY2hpcCwgR1BJX1NUQVRVUykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHNuZF92aWE4Mnh4X3BjbV90cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsKK30KKworLyoKKyAqIHBvaW50ZXIgY2FsbGJhY2tzCisgKi8KKworLyoKKyAqIGNhbGN1bGF0ZSB0aGUgbGluZWFyIHBvc2l0aW9uIGF0IHRoZSBnaXZlbiBzZy1idWZmZXIgaW5kZXggYW5kIHRoZSByZXN0IGNvdW50CisgKi8KKworI2RlZmluZSBjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYscG9zKSBcCisJKChwb3MpIDwgdmlhZGV2LT5sYXN0cG9zICYmICgocG9zKSA+PSB2aWFkZXYtPmJ1ZnNpemUyIHx8IHZpYWRldi0+bGFzdHBvcyA8IHZpYWRldi0+YnVmc2l6ZTIpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX2xpbmVhcl9wb3ModmlhZGV2X3QgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBzaXplLCByZXM7CisKKwlzaXplID0gdmlhZGV2LT5pZHhfdGFibGVbaWR4XS5zaXplOworCXJlcyA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ICsgc2l6ZSAtIGNvdW50OworCisJLyogY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uICovCisJaWYgKHNpemUgPCBjb3VudCkgeworCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwgKGludClzaXplLCAoaW50KWNvdW50KTsKKwkJcmVzID0gdmlhZGV2LT5sYXN0cG9zOworCX0gZWxzZSBpZiAoY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LCByZXMpKSB7CisjaWZkZWYgUE9JTlRFUl9ERUJVRworCQlwcmludGsoImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgYnVmc2l6ZTIgPSAweCV4LCBvZmZzaXplID0gMHgleCwgc2l6ZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwgaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLCB2aWFkZXYtPmxhc3Rwb3MsIHZpYWRldi0+YnVmc2l6ZTIsIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0LCB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLnNpemUsIGNvdW50KTsKKyNlbmRpZgorCQlpZiAoY291bnQgJiYgc2l6ZSA8IGNvdW50KSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciwgdXNpbmcgbGFzdCB2YWxpZCBwb2ludGVyXG4iKTsKKwkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKKwkJfSBlbHNlIHsKKwkJCWlmICghIGNvdW50KQorCQkJCS8qIGJvZ3VzIGNvdW50IDAgb24gdGhlIERNQSBib3VuZGFyeT8gKi8KKwkJCQlyZXMgPSB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLm9mZnNldDsKKwkJCWVsc2UKKwkJCQkvKiBjb3VudCByZWdpc3RlciByZXR1cm5zIGZ1bGwgc2l6ZSB3aGVuIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZCAqLworCQkJCXJlcyA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ICsgc2l6ZTsKKwkJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKKwkJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQkJcmVzID0gdmlhZGV2LT5sYXN0cG9zOworCQkJfQorCQl9CisJfQorCXZpYWRldi0+bGFzdHBvcyA9IHJlczsgLyogcmVtZW1iZXIgdGhlIGxhc3QgcG9zaXRpb24gKi8KKwlpZiAocmVzID49IHZpYWRldi0+YnVmc2l6ZSkKKwkJcmVzIC09IHZpYWRldi0+YnVmc2l6ZTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogZ2V0IHRoZSBjdXJyZW50IHBvaW50ZXIgb24gdmlhNjg2CisgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdmlhNjg2X3BjbV9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdmlhZGV2X3QgKnZpYWRldiA9ICh2aWFkZXZfdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpZHgsIHB0ciwgY291bnQsIHJlczsKKworCXNuZF9hc3NlcnQodmlhZGV2LT50YmxfZW50cmllcywgcmV0dXJuIDApOworCWlmICghKGluYihWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1NUQVRVUykpICYgVklBX1JFR19TVEFUX0FDVElWRSkpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJY291bnQgPSBpbmwoVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9DVVJSX0NPVU5UKSkgJiAweGZmZmZmZjsKKwkvKiBUaGUgdmlhNjg2YSBkb2VzIG5vdCBoYXZlIHRoZSBjdXJyZW50IGluZGV4IHJlZ2lzdGVyLAorCSAqIHNvIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBpbmRleCBmcm9tIENVUlJfUFRSLgorCSAqLworCXB0ciA9IGlubChWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX0NVUlJfUFRSKSk7CisJaWYgKHB0ciA8PSAodW5zaWduZWQgaW50KXZpYWRldi0+dGFibGUuYWRkcikKKwkJaWR4ID0gMDsKKwllbHNlIC8qIENVUlJfUFRSIGhvbGRzIHRoZSBhZGRyZXNzICsgOCAqLworCQlpZHggPSAoKHB0ciAtICh1bnNpZ25lZCBpbnQpdmlhZGV2LT50YWJsZS5hZGRyKSAvIDggLSAxKSAlIHZpYWRldi0+dGJsX2VudHJpZXM7CisJcmVzID0gY2FsY19saW5lYXJfcG9zKHZpYWRldiwgaWR4LCBjb3VudCk7CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCByZXMpOworfQorCisvKgorICogaHdfcGFyYW1zIGNhbGxiYWNrOgorICogYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgYnVpbGQgdXAgdGhlIGJ1ZmZlciBkZXNjcmlwdGlvbiB0YWJsZQorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2h3X3BhcmFtcyhzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSBzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYnVpbGRfdmlhX3RhYmxlKHZpYWRldiwgc3Vic3RyZWFtLCBjaGlwLT5wY2ksCisJCQkgICAgICBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpLAorCQkJICAgICAgcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNuZF9hYzk3X3dyaXRlKGNoaXAtPmFjOTcsIEFDOTdfTElORTFfUkFURSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSk7CisJc25kX2FjOTdfd3JpdGUoY2hpcC0+YWM5NywgQUM5N19MSU5FMV9MRVZFTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGh3X2ZyZWUgY2FsbGJhY2s6CisgKiBjbGVhbiB1cCB0aGUgYnVmZmVyIGRlc2NyaXB0aW9uIHRhYmxlIGFuZCByZWxlYXNlIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBzbmRfdmlhODJ4eF9od19mcmVlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAodmlhZGV2X3QgKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWNsZWFuX3ZpYV90YWJsZSh2aWFkZXYsIHN1YnN0cmVhbSwgY2hpcC0+cGNpKTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHNldCB1cCB0aGUgdGFibGUgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBzbmRfdmlhODJ4eF9zZXRfdGFibGVfcHRyKHZpYTgyeHhfdCAqY2hpcCwgdmlhZGV2X3QgKnZpYWRldikKK3sKKwlzbmRfdmlhODJ4eF9jb2RlY19yZWFkeShjaGlwLCBjaGlwLT5hYzk3X3NlY29uZGFyeSk7CisJb3V0bCgodTMyKXZpYWRldi0+dGFibGUuYWRkciwgVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9UQUJMRV9QVFIpKTsKKwl1ZGVsYXkoMjApOworCXNuZF92aWE4Mnh4X2NvZGVjX3JlYWR5KGNoaXAsIGNoaXAtPmFjOTdfc2Vjb25kYXJ5KTsKK30KKworLyoKKyAqIHByZXBhcmUgY2FsbGJhY2sgZm9yIHBsYXliYWNrIGFuZCBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGNtX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlzbmRfdmlhODJ4eF9jaGFubmVsX3Jlc2V0KGNoaXAsIHZpYWRldik7CisJLyogdGhpcyBtdXN0IGJlIHNldCBhZnRlciBjaGFubmVsX3Jlc2V0ICovCisJc25kX3ZpYTgyeHhfc2V0X3RhYmxlX3B0cihjaGlwLCB2aWFkZXYpOworCW91dGIoVklBX1JFR19UWVBFX0FVVE9TVEFSVHxWSUFfUkVHX1RZUEVfSU5UX0VPTHxWSUFfUkVHX1RZUEVfSU5UX0ZMQUcsCisJICAgICBWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1RZUEUpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBjbSBoYXJkd2FyZSBkZWZpbml0aW9uLCBpZGVudGljYWwgZm9yIGJvdGggcGxheWJhY2sgYW5kIGNhcHR1cmUKKyAqLworc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdmlhODJ4eF9odyA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSksCisJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQkxNjAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkxLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kc19taW4gPQkJMiwKKwkucGVyaW9kc19tYXggPQkJVklBX1RBQkxFX1NJWkUgLyAyLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKworLyoKKyAqIG9wZW4gY2FsbGJhY2sgc2tlbGV0b24KKyAqLworc3RhdGljIGludCBzbmRfdmlhODJ4eF9tb2RlbV9wY21fb3Blbih2aWE4Mnh4X3QgKmNoaXAsIHZpYWRldl90ICp2aWFkZXYsIHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0geyA4MDAwLCAgOTYwMCwgMTIwMDAsIDE2MDAwIH07CisgICAgICAgIHN0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzID0geworICAgICAgICAgICAgICAgIC5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXMpLAorICAgICAgICAgICAgICAgIC5saXN0ID0gcmF0ZXMsCisgICAgICAgICAgICAgICAgLm1hc2sgPSAwLAorICAgICAgICB9OworCisJcnVudGltZS0+aHcgPSBzbmRfdmlhODJ4eF9odzsKKwkKKyAgICAgICAgaWYgKChlcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmh3X2NvbnN0cmFpbnRzX3JhdGVzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKwkvKiB3ZSBtYXkgcmVtb3ZlIGZvbGxvd2luZyBjb25zdGFpbnQgd2hlbiB3ZSBtb2RpZnkgdGFibGUgZW50cmllcworCSAgIGluIGludGVycnVwdCAqLworCWlmICgoZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB2aWFkZXY7CisJdmlhZGV2LT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogb3BlbiBjYWxsYmFjayBmb3IgcGxheWJhY2sKKyAqLworc3RhdGljIGludCBzbmRfdmlhODJ4eF9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAmY2hpcC0+ZGV2c1tjaGlwLT5wbGF5YmFja19kZXZubyArIHN1YnN0cmVhbS0+bnVtYmVyXTsKKworCXJldHVybiBzbmRfdmlhODJ4eF9tb2RlbV9wY21fb3BlbihjaGlwLCB2aWFkZXYsIHN1YnN0cmVhbSk7Cit9CisKKy8qCisgKiBvcGVuIGNhbGxiYWNrIGZvciBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfY2FwdHVyZV9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJdmlhODJ4eF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXZpYWRldl90ICp2aWFkZXYgPSAmY2hpcC0+ZGV2c1tjaGlwLT5jYXB0dXJlX2Rldm5vICsgc3Vic3RyZWFtLT5wY20tPmRldmljZV07CisKKwlyZXR1cm4gc25kX3ZpYTgyeHhfbW9kZW1fcGNtX29wZW4oY2hpcCwgdmlhZGV2LCBzdWJzdHJlYW0pOworfQorCisvKgorICogY2xvc2UgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfdmlhODJ4eF9wY21fY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl2aWFkZXZfdCAqdmlhZGV2ID0gKHZpYWRldl90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwl2aWFkZXYtPnN1YnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKworLyogdmlhNjg2IHBsYXliYWNrIGNhbGxiYWNrcyAqLworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdmlhODJ4eF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92aWE4Mnh4X21vZGVtX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3ZpYTY4Nl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworLyogdmlhNjg2IGNhcHR1cmUgY2FsbGJhY2tzICovCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdmlhODJ4eF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF92aWE4Mnh4X21vZGVtX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3ZpYTY4Nl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAorfTsKKworCitzdGF0aWMgdm9pZCBpbml0X3ZpYWRldih2aWE4Mnh4X3QgKmNoaXAsIGludCBpZHgsIHVuc2lnbmVkIGludCByZWdfb2Zmc2V0LCBpbnQgZGlyZWN0aW9uKQoreworCWNoaXAtPmRldnNbaWR4XS5yZWdfb2Zmc2V0ID0gcmVnX29mZnNldDsKKwljaGlwLT5kZXZzW2lkeF0uZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCWNoaXAtPmRldnNbaWR4XS5wb3J0ID0gY2hpcC0+cG9ydCArIHJlZ19vZmZzZXQ7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBwY20gaW5zdGFuY2UgZm9yIHZpYTY4NmEvYgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdmlhNjg2X3BjbV9uZXcodmlhODJ4eF90ICpjaGlwKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwljaGlwLT5wbGF5YmFja19kZXZubyA9IDA7CisJY2hpcC0+Y2FwdHVyZV9kZXZubyA9IDE7CisJY2hpcC0+bnVtX2RldnMgPSAyOworCWNoaXAtPmludHJfbWFzayA9IDB4MzMwMDAwOyAvKiBGTEFHUyB8IEVPTCBmb3IgTVIsIE1XICovCisKKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjaGlwLT5jYXJkLT5zaG9ydG5hbWUsIDAsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfdmlhNjg2X3BsYXliYWNrX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3ZpYTY4Nl9jYXB0dXJlX29wcyk7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXN0cmNweShwY20tPm5hbWUsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSk7CisJY2hpcC0+cGNtc1swXSA9IHBjbTsKKwlpbml0X3ZpYWRldihjaGlwLCAwLCBWSUFfUkVHX01PX1NUQVRVUywgMCk7CisJaW5pdF92aWFkZXYoY2hpcCwgMSwgVklBX1JFR19NSV9TVEFUVVMsIDEpOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBNaXhlciBwYXJ0CisgKi8KKworCitzdGF0aWMgdm9pZCBzbmRfdmlhODJ4eF9taXhlcl9mcmVlX2FjOTdfYnVzKGFjOTdfYnVzX3QgKmJ1cykKK3sKKwl2aWE4Mnh4X3QgKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwljaGlwLT5hYzk3X2J1cyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF92aWE4Mnh4X21peGVyX2ZyZWVfYWM5NyhhYzk3X3QgKmFjOTcpCit7CisJdmlhODJ4eF90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPmFjOTcgPSBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE4Mnh4X21peGVyX25ldyh2aWE4Mnh4X3QgKmNoaXApCit7CisJYWM5N190ZW1wbGF0ZV90IGFjOTc7CisJaW50IGVycjsKKwlzdGF0aWMgYWM5N19idXNfb3BzX3Qgb3BzID0geworCQkud3JpdGUgPSBzbmRfdmlhODJ4eF9jb2RlY193cml0ZSwKKwkJLnJlYWQgPSBzbmRfdmlhODJ4eF9jb2RlY19yZWFkLAorCQkud2FpdCA9IHNuZF92aWE4Mnh4X2NvZGVjX3dhaXQsCisJfTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIGNoaXAsICZjaGlwLT5hYzk3X2J1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljaGlwLT5hYzk3X2J1cy0+cHJpdmF0ZV9mcmVlID0gc25kX3ZpYTgyeHhfbWl4ZXJfZnJlZV9hYzk3X2J1czsKKwljaGlwLT5hYzk3X2J1cy0+Y2xvY2sgPSBjaGlwLT5hYzk3X2Nsb2NrOworCWNoaXAtPmFjOTdfYnVzLT5zaGFyZWRfdHlwZSA9IEFDOTdfU0hBUkVEX1RZUEVfVklBOworCisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF92aWE4Mnh4X21peGVyX2ZyZWVfYWM5NzsKKwlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKKwlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU87CisJYWM5Ny5udW0gPSBjaGlwLT5hYzk3X3NlY29uZGFyeTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBwcm9jIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBzbmRfdmlhODJ4eF9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICpidWZmZXIpCit7CisJdmlhODJ4eF90ICpjaGlwID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKwkKKwlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuXG4iLCBjaGlwLT5jYXJkLT5sb25nbmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDB4YTA7IGkgKz0gNCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJ4OiAlMDh4XG4iLCBpLCBpbmwoY2hpcC0+cG9ydCArIGkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfdmlhODJ4eF9wcm9jX2luaXQodmlhODJ4eF90ICpjaGlwKQoreworCXNuZF9pbmZvX2VudHJ5X3QgKmVudHJ5OworCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgInZpYTgyeHgiLCAmZW50cnkpKQorCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHNuZF92aWE4Mnh4X3Byb2NfcmVhZCk7Cit9CisKKy8qCisgKgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE4Mnh4X2NoaXBfaW5pdCh2aWE4Mnh4X3QgKmNoaXApCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgbWF4X2NvdW50OworCXVuc2lnbmVkIGNoYXIgcHZhbDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX01DOTdfQ1RSTCwgJnB2YWwpOworCWlmKChwdmFsICYgVklBX01DOTdfQ1RSTF9JTklUKSAhPSBWSUFfTUM5N19DVFJMX0lOSVQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgMHg0NCwgcHZhbHxWSUFfTUM5N19DVFJMX0lOSVQpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfU1RBVCwgJnB2YWwpOworCWlmICghIChwdmFsICYgVklBX0FDTElOS19DMDBfUkVBRFkpKSB7IC8qIGNvZGVjIG5vdCByZWFkeT8gKi8KKwkJLyogZGVhc3NlcnQgQUNMaW5rIHJlc2V0LCBmb3JjZSBTWU5DICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfQ1RSTCwKKwkJCQkgICAgICBWSUFfQUNMSU5LX0NUUkxfRU5BQkxFIHwKKwkJCQkgICAgICBWSUFfQUNMSU5LX0NUUkxfUkVTRVQgfAorCQkJCSAgICAgIFZJQV9BQ0xJTktfQ1RSTF9TWU5DKTsKKwkJdWRlbGF5KDEwMCk7CisjaWYgMSAvKiBGSVhNRTogc2hvdWxkIHdlIGRvIGZ1bGwgcmVzZXQgaGVyZSBmb3IgYWxsIGNoaXAgbW9kZWxzPyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfQUNMSU5LX0NUUkwsIDB4MDApOworCQl1ZGVsYXkoMTAwKTsKKyNlbHNlCisJCS8qIGRlYXNzZXJ0IEFDTGluayByZXNldCwgZm9yY2UgU1lOQyAod2FybSBBQyc5NyByZXNldCkgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0FDTElOS19DVFJMLAorCQkJCSAgICAgIFZJQV9BQ0xJTktfQ1RSTF9SRVNFVHxWSUFfQUNMSU5LX0NUUkxfU1lOQyk7CisJCXVkZWxheSgyKTsKKyNlbmRpZgorCQkvKiBBQ0xpbmsgb24sIGRlYXNzZXJ0IEFDTGluayByZXNldCwgVlNSLCBTR0QgZGF0YSBvdXQgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0FDTElOS19DVFJMLCBWSUFfQUNMSU5LX0NUUkxfSU5JVCk7CisJCXVkZWxheSgxMDApOworCX0KKwkKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfQ1RSTCwgJnB2YWwpOworCWlmICgocHZhbCAmIFZJQV9BQ0xJTktfQ1RSTF9JTklUKSAhPSBWSUFfQUNMSU5LX0NUUkxfSU5JVCkgeworCQkvKiBBQ0xpbmsgb24sIGRlYXNzZXJ0IEFDTGluayByZXNldCwgVlNSLCBTR0QgZGF0YSBvdXQgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgVklBX0FDTElOS19DVFJMLCBWSUFfQUNMSU5LX0NUUkxfSU5JVCk7CisJCXVkZWxheSgxMDApOworCX0KKworCS8qIHdhaXQgdW50aWwgY29kZWMgcmVhZHkgKi8KKwltYXhfY291bnQgPSAoKDMgKiBIWikgLyA0KSArIDE7CisJZG8geworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9BQ0xJTktfU1RBVCwgJnB2YWwpOworCQlpZiAocHZhbCAmIFZJQV9BQ0xJTktfQzAwX1JFQURZKSAvKiBwcmltYXJ5IGNvZGVjIHJlYWR5ICovCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKC0tbWF4X2NvdW50ID4gMCk7CisKKwlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKQorCQlzbmRfcHJpbnRrKCJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOworCisJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKKwkJCQkgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRCB8CisJCQkJIChWSUFfUkVHX0FDOTdfQ09ERUNfSURfU0VDT05EQVJZIDw8IFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TSElGVCkpOworCW1heF9jb3VudCA9ICgoMyAqIEhaKSAvIDQpICsgMTsKKwlzbmRfdmlhODJ4eF9jb2RlY194d3JpdGUoY2hpcCwgVklBX1JFR19BQzk3X1JFQUQgfAorCQkJCSBWSUFfUkVHX0FDOTdfU0VDT05EQVJZX1ZBTElEIHwKKwkJCQkgKFZJQV9SRUdfQUM5N19DT0RFQ19JRF9TRUNPTkRBUlkgPDwgVklBX1JFR19BQzk3X0NPREVDX0lEX1NISUZUKSk7CisJZG8geworCQlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19TRUNPTkRBUllfVkFMSUQpIHsKKwkJCWNoaXAtPmFjOTdfc2Vjb25kYXJ5ID0gMTsKKwkJCWdvdG8gX19hYzk3X29rMjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0gd2hpbGUgKC0tbWF4X2NvdW50ID4gMCk7CisJLyogVGhpcyBpcyBvaywgdGhlIG1vc3Qgb2YgbW90aGVyYm9hcmRzIGhhdmUgb25seSBvbmUgY29kZWMgKi8KKworICAgICAgX19hYzk3X29rMjoKKworCS8qIHJvdXRlIEZNIHRyYXAgdG8gSVJRLCBkaXNhYmxlIEZNIHRyYXAgKi8KKwkvLyBwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfRk1fTk1JX0NUUkwsIDApOworCS8qIGRpc2FibGUgYWxsIEdQSSBpbnRlcnJ1cHRzICovCisJb3V0bCgwLCBWSUFSRUcoY2hpcCwgR1BJX0lOVFIpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcG93ZXIgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X3N1c3BlbmQoc25kX2NhcmRfdCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmIChjaGlwLT5wY21zW2ldKQorCQkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21zW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMyk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcmVzdW1lKHNuZF9jYXJkX3QgKmNhcmQpCit7CisJdmlhODJ4eF90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCWludCBpOworCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMCk7CisJcGNpX3NldF9tYXN0ZXIoY2hpcC0+cGNpKTsKKworCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKKworCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3KTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fZGV2czsgaSsrKQorCQlzbmRfdmlhODJ4eF9jaGFubmVsX3Jlc2V0KGNoaXAsICZjaGlwLT5kZXZzW2ldKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2ZyZWUodmlhODJ4eF90ICpjaGlwKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGNoaXAtPmlycSA8IDApCisJCWdvdG8gX19lbmRfaHc7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9kZXZzOyBpKyspCisJCXNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQoY2hpcCwgJmNoaXAtPmRldnNbaV0pOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworICAgICAgX19lbmRfaHc6CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopY2hpcCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOworCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF92aWE4Mnh4X2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCXZpYTgyeHhfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE4Mnh4X2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQkJc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJaW50IGNoaXBfdHlwZSwKKwkJCQkJaW50IHJldmlzaW9uLAorCQkJCQl1bnNpZ25lZCBpbnQgYWM5N19jbG9jaywKKwkJCQkJdmlhODJ4eF90ICoqIHJfdmlhKQoreworCXZpYTgyeHhfdCAqY2hpcDsKKwlpbnQgZXJyOworICAgICAgICBzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF92aWE4Mnh4X2Rldl9mcmVlLAorICAgICAgICB9OworCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoKGNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIGNhcmQtPmRyaXZlcikpIDwgMCkgeworCQlrZnJlZShjaGlwKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiBlcnI7CisJfQorCWNoaXAtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92aWE4Mnh4X2ludGVycnVwdCwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJY2FyZC0+ZHJpdmVyLCAodm9pZCAqKWNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfdmlhODJ4eF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKwlpZiAoYWM5N19jbG9jayA+PSA4MDAwICYmIGFjOTdfY2xvY2sgPD0gNDgwMDApCisJCWNoaXAtPmFjOTdfY2xvY2sgPSBhYzk3X2Nsb2NrOworCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOworCisJaWYgKChlcnIgPSBzbmRfdmlhODJ4eF9jaGlwX2luaXQoY2hpcCkpIDwgMCkgeworCQlzbmRfdmlhODJ4eF9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCXNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogVGhlIDgyMzMgYWM5NyBjb250cm9sbGVyIGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWFzdGVyIGJpdAorCSAqIGluIHRoZSBwY2kgY29tbWFuZCByZWdpc3Rlci4gSU1ITyB0aGlzIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBQQ0kgc3BlYy4KKwkgKiBXZSBjYWxsIHBjaV9zZXRfbWFzdGVyIGhlcmUgYmVjYXVzZSBpdCBkb2VzIG5vdCBodXJ0LiAqLworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcl92aWEgPSBjaGlwOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92aWE4Mnh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RhdGljIGludCBkZXY7CisJc25kX2NhcmRfdCAqY2FyZDsKKwl2aWE4Mnh4X3QgKmNoaXA7CisJdW5zaWduZWQgY2hhciByZXZpc2lvbjsKKwlpbnQgY2hpcF90eXBlID0gMCwgY2FyZF90eXBlOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhcmRfdHlwZSA9IHBjaV9pZC0+ZHJpdmVyX2RhdGE7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfUkVWSVNJT05fSUQsICZyZXZpc2lvbik7CisJc3dpdGNoIChjYXJkX3R5cGUpIHsKKwljYXNlIFRZUEVfQ0FSRF9WSUE4MlhYX01PREVNOgorCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiVklBODJYWC1NT0RFTSIpOworCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlZJQSA4MlhYIG1vZGVtIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIF9fZXJyb3I7CisJfQorCQkKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X2NyZWF0ZShjYXJkLCBwY2ksIGNoaXBfdHlwZSwgcmV2aXNpb24sIGFjOTdfY2xvY2tbZGV2XSwgJmNoaXApKSA8IDApCisJCWdvdG8gX19lcnJvcjsKKwlpZiAoKGVyciA9IHNuZF92aWE4Mnh4X21peGVyX25ldyhjaGlwKSkgPCAwKQorCQlnb3RvIF9fZXJyb3I7CisKKwlpZiAoKGVyciA9IHNuZF92aWE2ODZfcGNtX25ldyhjaGlwKSkgPCAwICkKKwkJZ290byBfX2Vycm9yOworCisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIHNuZF92aWE4Mnh4X3N1c3BlbmQsIHNuZF92aWE4Mnh4X3Jlc3VtZSwgY2hpcCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX2RldnM7IGkrKykKKwkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CisKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlZCIsCisJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+cG9ydCwgY2hpcC0+aXJxKTsKKworCXNuZF92aWE4Mnh4X3Byb2NfaW5pdChjaGlwKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKKworIF9fZXJyb3I6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3ZpYTgyeHhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc25kX2NhcmRfZnJlZShwY2lfZ2V0X2RydmRhdGEocGNpKSk7CisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiVklBIDgyeHggTW9kZW0iLAorCS5pZF90YWJsZSA9IHNuZF92aWE4Mnh4X21vZGVtX2lkcywKKwkucHJvYmUgPSBzbmRfdmlhODJ4eF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX3ZpYTgyeHhfcmVtb3ZlKSwKKwlTTkRfUENJX1BNX0NBTExCQUNLUworfTsKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX3ZpYTgyeHhfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfdmlhODJ4eF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfdmlhODJ4eF9pbml0KQorbW9kdWxlX2V4aXQoYWxzYV9jYXJkX3ZpYTgyeHhfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi9NYWtlZmlsZSBiL3NvdW5kL3BjaS92eDIyMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThjOGJmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3Z4MjIyL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgQUxTQQorIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorIworCitzbmQtdngyMjItb2JqcyA6PSB2eDIyMi5vIHZ4MjIyX29wcy5vCisKK29iai0kKENPTkZJR19TTkRfVlgyMjIpICs9IHNuZC12eDIyMi5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYyBiL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIERyaXZlciBmb3IgRGlnaWdyYW0gVlgyMjIgVjIvTWljIFBDSSBzb3VuZGNhcmRzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgInZ4MjIyLmgiCisKKyNkZWZpbmUgQ0FSRF9OQU1FICJWWDIyMiIKKworTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEaWdpZ3JhbSBWWDIyMiBWMi9NaWMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0RpZ2lncmFtLCIgQ0FSRF9OQU1FICJ9fSIpOworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgbWljW1NORFJWX0NBUkRTXTsgLyogbWljcm9waG9uZSAqLworc3RhdGljIGludCBpYmxbU05EUlZfQ0FSRFNdOyAvKiBtaWNyb3Bob25lICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgRGlnaWdyYW0gIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIERpZ2lncmFtICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZSwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSBEaWdpZ3JhbSAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShtaWMsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtaWMsICJFbmFibGUgTWljcm9waG9uZS4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpYmwsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlibCwgIkNhcHR1cmUgSUJMIHNpemUuIik7CisKKy8qCisgKi8KKworZW51bSB7CisJVlhfUENJX1ZYMjIyX09MRCwKKwlWWF9QQ0lfVlgyMjJfTkVXCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3Z4MjIyX2lkc1tdID0geworCXsgMHgxMGI1LCAweDkwNTAsIDB4MTM2OSwgUENJX0FOWV9JRCwgMCwgMCwgVlhfUENJX1ZYMjIyX09MRCwgfSwgICAvKiBQTFggKi8KKwl7IDB4MTBiNSwgMHg5MDMwLCAweDEzNjksIFBDSV9BTllfSUQsIDAsIDAsIFZYX1BDSV9WWDIyMl9ORVcsIH0sICAgLyogUExYICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX3Z4MjIyX2lkcyk7CisKKworLyoKKyAqLworCitzdGF0aWMgc3RydWN0IHNuZF92eF9oYXJkd2FyZSB2eDIyMl9vbGRfaHcgPSB7CisKKwkubmFtZSA9ICJWWDIyMi9PbGQiLAorCS50eXBlID0gVlhfVFlQRV9CT0FSRCwKKwkvKiBodyBzcGVjcyAqLworCS5udW1fY29kZWNzID0gMSwKKwkubnVtX2lucyA9IDEsCisJLm51bV9vdXRzID0gMSwKKwkub3V0cHV0X2xldmVsX21heCA9IFZYX0FOQUxPR19PVVRfTEVWRUxfTUFYLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfdnhfaGFyZHdhcmUgdngyMjJfdjJfaHcgPSB7CisKKwkubmFtZSA9ICJWWDIyMi92MiIsCisJLnR5cGUgPSBWWF9UWVBFX1YyLAorCS8qIGh3IHNwZWNzICovCisJLm51bV9jb2RlY3MgPSAxLAorCS5udW1faW5zID0gMSwKKwkubnVtX291dHMgPSAxLAorCS5vdXRwdXRfbGV2ZWxfbWF4ID0gVlgyX0FLTV9MRVZFTF9NQVgsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF92eF9oYXJkd2FyZSB2eDIyMl9taWNfaHcgPSB7CisKKwkubmFtZSA9ICJWWDIyMi9NaWMiLAorCS50eXBlID0gVlhfVFlQRV9NSUMsCisJLyogaHcgc3BlY3MgKi8KKwkubnVtX2NvZGVjcyA9IDEsCisJLm51bV9pbnMgPSAxLAorCS5udW1fb3V0cyA9IDEsCisJLm91dHB1dF9sZXZlbF9tYXggPSBWWDJfQUtNX0xFVkVMX01BWCwKK307CisKKworLyoKKyAqLworc3RhdGljIGludCBzbmRfdngyMjJfZnJlZSh2eF9jb3JlX3QgKmNoaXApCit7CisJc3RydWN0IHNuZF92eDIyMiAqdnggPSAoc3RydWN0IHNuZF92eDIyMiAqKWNoaXA7CisKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQqKWNoaXApOworCWlmICh2eC0+cG9ydFswXSkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyh2eC0+cGNpKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UodngtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3Z4MjIyX2Rldl9mcmVlKHNuZF9kZXZpY2VfdCAqZGV2aWNlKQoreworCXZ4X2NvcmVfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF92eDIyMl9mcmVlKGNoaXApOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92eDIyMl9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3Z4X2hhcmR3YXJlICpodywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3Z4MjIyICoqcmNoaXApCit7CisJdnhfY29yZV90ICpjaGlwOworCXN0cnVjdCBzbmRfdngyMjIgKnZ4OworCWludCBpLCBlcnI7CisJc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfdngyMjJfZGV2X2ZyZWUsCisJfTsKKwlzdHJ1Y3Qgc25kX3Z4X29wcyAqdnhfb3BzOworCisJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCisJdnhfb3BzID0gaHctPnR5cGUgPT0gVlhfVFlQRV9CT0FSRCA/ICZ2eDIyMl9vbGRfb3BzIDogJnZ4MjIyX29wczsKKwljaGlwID0gc25kX3Z4X2NyZWF0ZShjYXJkLCBodywgdnhfb3BzLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF92eDIyMikgLSBzaXplb2YodnhfY29yZV90KSk7CisJaWYgKCEgY2hpcCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZ4ID0gKHN0cnVjdCBzbmRfdngyMjIgKiljaGlwOworCXZ4LT5wY2kgPSBwY2k7CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCBDQVJEX05BTUUpKSA8IDApIHsKKwkJc25kX3Z4MjIyX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXZ4LT5wb3J0W2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgaSArIDEpOworCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdnhfaXJxX2hhbmRsZXIsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwKKwkJCUNBUkRfTkFNRSwgKHZvaWQgKikgY2hpcCkpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCXNuZF92eDIyMl9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5pcnEgPSBwY2ktPmlycTsKKworCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CisJCXNuZF92eDIyMl9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKworCSpyY2hpcCA9IHZ4OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92eDIyMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCXN0cnVjdCBzbmRfdnhfaGFyZHdhcmUgKmh3OworCXN0cnVjdCBzbmRfdngyMjIgKnZ4OworCWludCBlcnI7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSB7CisJCWRldisrOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoKGludClwY2lfaWQtPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBWWF9QQ0lfVlgyMjJfT0xEOgorCQlodyA9ICZ2eDIyMl9vbGRfaHc7CisJCWJyZWFrOworCWNhc2UgVlhfUENJX1ZYMjIyX05FVzoKKwlkZWZhdWx0OgorCQlpZiAobWljW2Rldl0pCisJCQlodyA9ICZ2eDIyMl9taWNfaHc7CisJCWVsc2UKKwkJCWh3ID0gJnZ4MjIyX3YyX2h3OworCQlicmVhazsKKwl9CisJaWYgKChlcnIgPSBzbmRfdngyMjJfY3JlYXRlKGNhcmQsIHBjaSwgaHcsICZ2eCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwl2eC0+Y29yZS5pYmwuc2l6ZSA9IGlibFtkZXZdOworCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4ICYgMHglbHgsIGlycSAlaSIsCisJCWNhcmQtPnNob3J0bmFtZSwgdngtPnBvcnRbMF0sIHZ4LT5wb3J0WzFdLCB2eC0+Y29yZS5pcnEpOworCXNuZF9wcmludGRkKCIlcyBhdCAweCVseCAmIDB4JWx4LCBpcnEgJWlcbiIsCisJCSAgICBjYXJkLT5zaG9ydG5hbWUsIHZ4LT5wb3J0WzBdLCB2eC0+cG9ydFsxXSwgdngtPmNvcmUuaXJxKTsKKworI2lmZGVmIFNORF9WWF9GV19MT0FERVIKKwl2eC0+Y29yZS5kZXYgPSAmcGNpLT5kZXY7CisjZW5kaWYKKworCWlmICgoZXJyID0gc25kX3Z4X3NldHVwX2Zpcm13YXJlKCZ2eC0+Y29yZSkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOworCWRldisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX3Z4MjIyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXNuZF9jYXJkX2ZyZWUocGNpX2dldF9kcnZkYXRhKHBjaSkpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gIkRpZ2lncmFtIFZYMjIyIiwKKwkuaWRfdGFibGUgPSBzbmRfdngyMjJfaWRzLAorCS5wcm9iZSA9IHNuZF92eDIyMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX3Z4MjIyX3JlbW92ZSksCisJU05EX1BDSV9QTV9DQUxMQkFDS1MKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF92eDIyMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF92eDIyMl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfdngyMjJfaW5pdCkKK21vZHVsZV9leGl0KGFsc2FfY2FyZF92eDIyMl9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmggYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ3OGFlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBEcml2ZXIgZm9yIERpZ2lncmFtIFZYMjIyIFBDSSBzb3VuZGNhcmRzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX1ZYMjIyX0gKKyNkZWZpbmUgX19WWDIyMl9ICisKKyNpbmNsdWRlIDxzb3VuZC92eF9jb3JlLmg+CisKK3N0cnVjdCBzbmRfdngyMjIgeworCisJdnhfY29yZV90IGNvcmU7CisKKwkvKiBoL3cgY29uZmlnOyBmb3IgUExYIGFuZCBmb3IgRFNQICovCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwl1bnNpZ25lZCBsb25nIHBvcnRbMl07CisKKwl1bnNpZ25lZCBpbnQgcmVnQ0RTUDsJLyogY3VycmVudCBDRFNQIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IHJlZ0NGRzsJLyogY3VycmVudCBDRkcgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVnU0VMTUlDOwkvKiBjdXJyZW50IFNFTE1JQyByZWcuIChmb3IgVlgyMjIgTWljKSAqLworCisJaW50IGlucHV0X2xldmVsWzJdOwkvKiBpbnB1dCBsZXZlbCBmb3IgdngyMjIgbWljICovCisJaW50IG1pY19sZXZlbDsJCS8qIG1pYyBsZXZlbCBmb3IgdngyMjIgbWljICovCit9OworCisvKiB3ZSB1c2UgYSBsb29rdXAgdGFibGUgd2l0aCAxNDggdmFsdWVzLCBzZWUgdnhfbWl4ZXIuYyAqLworI2RlZmluZSBWWDJfQUtNX0xFVkVMX01BWAkweDkzCisKK2V4dGVybiBzdHJ1Y3Qgc25kX3Z4X29wcyB2eDIyMl9vcHM7CitleHRlcm4gc3RydWN0IHNuZF92eF9vcHMgdngyMjJfb2xkX29wczsKKworLyogT2Zmc2V0IG9mIHJlZ2lzdGVycyB3aXRoIGJhc2UgZXF1YWwgdG8gcG9ydERTUC4gKi8KKyNkZWZpbmUgVlhfUkVTRVRfRE1BX1JFR0lTVEVSX09GRlNFVCAgICAweDAwMDAwMDA4CisKKy8qIENvbnN0YW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgSU5UQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBWWF9JTlRDU1JfVkFMVUUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVlhfUENJX0lOVEVSUlVQVF9NQVNLICAgICAgICAgICAweDAwMDAwMDQwCisKKy8qIENvbnN0YW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgQ0RTUCByZWdpc3RlciAoMHgyMCkuICovCisjZGVmaW5lIFZYX0NEU1BfVEVTVDFfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBWWF9DRFNQX1RPUjFfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVlhfQ0RTUF9UT1IyX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFZYX0NEU1BfUkVTRVJWRUQwXzBfTUFTSyAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBWWF9DRFNQX0NPREVDX1JFU0VUX01BU0sgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVlhfQ0RTUF9WQUxJRF9JUlFfTUFTSyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFZYX0NEU1BfVEVTVDBfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBWWF9DRFNQX0RTUF9SRVNFVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBWWF9DRFNQX0dQSU9fT1VUX01BU0sgICAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgVlhfR1BJT19PVVRfQklUX09GRlNFVCAgICAgICAgICA1ICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtIG91dHB1dCB0byBiaXQgMCBhbmQgMQorCisvKiBDb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIENGRyByZWdpc3RlciAoMHgyNCkuICovCisjZGVmaW5lIFZYX0NGR19TWU5DRFNQX01BU0sgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBWWF9DRkdfUkVTRVJWRUQwXzBfTUFTSyAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVlhfQ0ZHX1JFU0VSVkVEMV8wX01BU0sgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFZYX0NGR19SRVNFUlZFRDJfMF9NQVNLICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBWWF9DRkdfREFUQUlOX1NFTF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDggICAgIC8vIDAgKGFuYSksIDEgKFVFUikKKyNkZWZpbmUgVlhfQ0ZHX1JFU0VSVkVEM18wX01BU0sgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFZYX0NGR19SRVNFUlZFRDRfMF9NQVNLICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBWWF9DRkdfQ0xPQ0tJTl9TRUxfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8vIDAgKGludGVybmFsKSwgMSAoQUVTL0VCVSkKKworLyogQ29uc3RhbnRzIHVzZWQgdG8gYWNjZXNzIHRoZSBTVEFUVVMgcmVnaXN0ZXIgKDB4MzApLiAqLworI2RlZmluZSBWWF9TVEFUVVNfREFUQV9YSUNPUl9NQVNLICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgVlhfU1RBVFVTX1ZBTF9URVNUMV9NQVNLICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSyAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBWWF9TVEFUVVNfUkVTRVJWRUQwX01BU0sgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgVlhfU1RBVFVTX1ZBTF9UT1IxX01BU0sgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFZYX1NUQVRVU19WQUxfVE9SMF9NQVNLICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBWWF9TVEFUVVNfTEVWRUxfSU5fTUFTSyAgICAgICAgIDB4MDAwMDAwMDIgICAgLy8gNiBkQnUgKDApLCAyMiBkQnUgKDEpCisjZGVmaW5lIFZYX1NUQVRVU19NRU1JUlFfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIFZYX1NUQVRVU19HUElPX0lOX01BU0sgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSBWWF9HUElPX0lOX0JJVF9PRkZTRVQgICAgICAgICAgIDAgICAgICAgICAgICAgLy8gbGVhdmUgaW5wdXQgYXMgYml0IDIgYW5kIDMKKworLyogQ29uc3RhbnRzIHVzZWQgdG8gYWNjZXNzIHRoZSBNSUNSTyBJTlBVVCBTRUxFQ1QgcmVnaXN0ZXIgKDB4NDApLiAqLworI2RlZmluZSBNSUNST19TRUxFQ1RfSU5QVVRfTk9STSAgICAgICAgMHgwMAorI2RlZmluZSBNSUNST19TRUxFQ1RfSU5QVVRfTVVURSAgICAgICAgMHgwMQorI2RlZmluZSBNSUNST19TRUxFQ1RfSU5QVVRfTElNSVQgICAgICAgMHgwMgorI2RlZmluZSBNSUNST19TRUxFQ1RfSU5QVVRfTUFTSyAgICAgICAgMHgwMworCisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9HXzAgICAgICAweDAwCisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9HXzEgICAgICAweDA0CisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9HXzIgICAgICAweDA4CisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9HXzMgICAgICAweDBDCisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9NQVNLICAgICAweDBDCisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9PRkZTRVQgICAyCisKKyNkZWZpbmUgTUlDUk9fU0VMRUNUX1JBSVNFX0NPTVBSICAgICAgIDB4MTAKKworI2RlZmluZSBNSUNST19TRUxFQ1RfTk9JU0VfVF81MkRCICAgICAgMHgwMAorI2RlZmluZSBNSUNST19TRUxFQ1RfTk9JU0VfVF80MkRCICAgICAgMHgyMAorI2RlZmluZSBNSUNST19TRUxFQ1RfTk9JU0VfVF8zMkRCICAgICAgMHg0MAorI2RlZmluZSBNSUNST19TRUxFQ1RfTk9JU0VfVF9NQVNLICAgICAgMHg2MAorCisjZGVmaW5lIE1JQ1JPX1NFTEVDVF9QSEFOVE9NX0FMSU0gICAgICAweDgwCisKKworI2VuZGlmIC8qIF9fVlgyMjJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2U5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKQEAgLTAsMCArMSwxMDA0IEBACisvKgorICogRHJpdmVyIGZvciBEaWdpZ3JhbSBWWDIyMiBWMi9NaWMgc291bmRjYXJkcworICoKKyAqIFZYMjIyLXNwZWNpZmljIGxvdy1sZXZlbCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBieSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJ2eDIyMi5oIgorCisKK3N0YXRpYyBpbnQgdngyX3JlZ19vZmZzZXRbVlhfUkVHX01BWF0gPSB7CisJW1ZYX0lDUl0gICAgPSAweDAwLAorCVtWWF9DVlJdICAgID0gMHgwNCwKKwlbVlhfSVNSXSAgICA9IDB4MDgsCisJW1ZYX0lWUl0gICAgPSAweDBjLAorCVtWWF9SWEhdICAgID0gMHgxNCwKKwlbVlhfUlhNXSAgICA9IDB4MTgsCisJW1ZYX1JYTF0gICAgPSAweDFjLAorCVtWWF9ETUFdICAgID0gMHgxMCwKKwlbVlhfQ0RTUF0gICA9IDB4MjAsCisJW1ZYX0NGR10gICAgPSAweDI0LAorCVtWWF9SVUVSXSAgID0gMHgyOCwKKwlbVlhfREFUQV0gICA9IDB4MmMsCisJW1ZYX1NUQVRVU10gPSAweDMwLAorCVtWWF9MT0ZSRVFdID0gMHgzNCwKKwlbVlhfSElGUkVRXSA9IDB4MzgsCisJW1ZYX0NTVUVSXSAgPSAweDNjLAorCVtWWF9TRUxNSUNdID0gMHg0MCwKKwlbVlhfQ09NUE9UXSA9IDB4NDQsIC8vIFdyaXRlOiBQT1RFTlRJT01FVEVSIDsgUmVhZDogQ09NUFJFU1NJT04gTEVWRUwgYWN0aXZhdGUKKwlbVlhfU0NPTVBSXSA9IDB4NDgsIC8vIFJlYWQ6IENPTVBSRVNTSU9OIFRIUkVTSE9MRCBhY3RpdmF0ZQorCVtWWF9HTElNSVRdID0gMHg0YywgLy8gUmVhZDogTEVWRUwgTElNSVRBVElPTiBhY3RpdmF0ZQorCVtWWF9JTlRDU1JdID0gMHg0YywgLy8gVlhfSU5UQ1NSX1JFR0lTVEVSX09GRlNFVAorCVtWWF9DTlRSTF0gID0gMHg1MCwJCS8vIFZYX0NOVFJMX1JFR0lTVEVSX09GRlNFVAorCVtWWF9HUElPQ10gID0gMHg1NCwJCS8vIFZYX0dQSU9DIChuZXcgd2l0aCBQTFg5MDMwKQorfTsKKworc3RhdGljIGludCB2eDJfcmVnX2luZGV4W1ZYX1JFR19NQVhdID0geworCVtWWF9JQ1JdCT0gMSwKKwlbVlhfQ1ZSXQk9IDEsCisJW1ZYX0lTUl0JPSAxLAorCVtWWF9JVlJdCT0gMSwKKwlbVlhfUlhIXQk9IDEsCisJW1ZYX1JYTV0JPSAxLAorCVtWWF9SWExdCT0gMSwKKwlbVlhfRE1BXQk9IDEsCisJW1ZYX0NEU1BdCT0gMSwKKwlbVlhfQ0ZHXQk9IDEsCisJW1ZYX1JVRVJdCT0gMSwKKwlbVlhfREFUQV0JPSAxLAorCVtWWF9TVEFUVVNdCT0gMSwKKwlbVlhfTE9GUkVRXQk9IDEsCisJW1ZYX0hJRlJFUV0JPSAxLAorCVtWWF9DU1VFUl0JPSAxLAorCVtWWF9TRUxNSUNdCT0gMSwKKwlbVlhfQ09NUE9UXQk9IDEsCisJW1ZYX1NDT01QUl0JPSAxLAorCVtWWF9HTElNSVRdCT0gMSwKKwlbVlhfSU5UQ1NSXQk9IDAsCS8qIG9uIHRoZSBQTFggKi8KKwlbVlhfQ05UUkxdCT0gMCwJLyogb24gdGhlIFBMWCAqLworCVtWWF9HUElPQ10JPSAwLAkvKiBvbiB0aGUgUExYICovCit9OworCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGxvbmcgdngyX3JlZ19hZGRyKHZ4X2NvcmVfdCAqX2NoaXAsIGludCByZWcpCit7CisJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CisJcmV0dXJuIGNoaXAtPnBvcnRbdngyX3JlZ19pbmRleFtyZWddXSArIHZ4Ml9yZWdfb2Zmc2V0W3JlZ107Cit9CisKKy8qKgorICogc25kX3Z4X2luYiAtIHJlYWQgYSBieXRlIGZyb20gdGhlIHJlZ2lzdGVyCisgKiBAb2Zmc2V0OiByZWdpc3RlciBlbnVtCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHZ4Ml9pbmIodnhfY29yZV90ICpjaGlwLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpbmIodngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOworfQorCisvKioKKyAqIHNuZF92eF9vdXRiIC0gd3JpdGUgYSBieXRlIG9uIHRoZSByZWdpc3RlcgorICogQG9mZnNldDogdGhlIHJlZ2lzdGVyIG9mZnNldAorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKi8KK3N0YXRpYyB2b2lkIHZ4Ml9vdXRiKHZ4X2NvcmVfdCAqY2hpcCwgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0Yih2YWwsIHZ4Ml9yZWdfYWRkcihjaGlwLCBvZmZzZXQpKTsKKwkvL3ByaW50aygib3V0YjogJXggLT4gJXhcbiIsIHZhbCwgdngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOworfQorCisvKioKKyAqIHNuZF92eF9pbmwgLSByZWFkIGEgMzJiaXQgd29yZCBmcm9tIHRoZSByZWdpc3RlcgorICogQG9mZnNldDogcmVnaXN0ZXIgZW51bQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZ4Ml9pbmwodnhfY29yZV90ICpjaGlwLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpbmwodngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOworfQorCisvKioKKyAqIHNuZF92eF9vdXRsIC0gd3JpdGUgYSAzMmJpdCB3b3JkIG9uIHRoZSByZWdpc3RlcgorICogQG9mZnNldDogdGhlIHJlZ2lzdGVyIGVudW0KKyAqIEB2YWw6IHRoZSB2YWx1ZSB0byB3cml0ZQorICovCitzdGF0aWMgdm9pZCB2eDJfb3V0bCh2eF9jb3JlX3QgKmNoaXAsIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpCit7CisJLy8gcHJpbnRrKCJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJb3V0bCh2YWwsIHZ4Ml9yZWdfYWRkcihjaGlwLCBvZmZzZXQpKTsKK30KKworLyoKKyAqIHJlZGVmaW5lIG1hY3JvcyB0byBjYWxsIGRpcmVjdGx5CisgKi8KKyN1bmRlZiB2eF9pbmIKKyNkZWZpbmUgdnhfaW5iKGNoaXAscmVnKQl2eDJfaW5iKCh2eF9jb3JlX3QqKShjaGlwKSwgVlhfIyNyZWcpCisjdW5kZWYgdnhfb3V0YgorI2RlZmluZSB2eF9vdXRiKGNoaXAscmVnLHZhbCkJdngyX291dGIoKHZ4X2NvcmVfdCopKGNoaXApLCBWWF8jI3JlZywgdmFsKQorI3VuZGVmIHZ4X2lubAorI2RlZmluZSB2eF9pbmwoY2hpcCxyZWcpCXZ4Ml9pbmwoKHZ4X2NvcmVfdCopKGNoaXApLCBWWF8jI3JlZykKKyN1bmRlZiB2eF9vdXRsCisjZGVmaW5lIHZ4X291dGwoY2hpcCxyZWcsdmFsKQl2eDJfb3V0bCgodnhfY29yZV90KikoY2hpcCksIFZYXyMjcmVnLCB2YWwpCisKKworLyoKKyAqIHZ4X3Jlc2V0X2RzcCAtIHJlc2V0IHRoZSBEU1AKKyAqLworCisjZGVmaW5lIFhYX0RTUF9SRVNFVF9XQUlUX1RJTUUJCTIJLyogbXMgKi8KKworc3RhdGljIHZvaWQgdngyX3Jlc2V0X2RzcCh2eF9jb3JlX3QgKl9jaGlwKQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCisJLyogc2V0IHRoZSByZXNldCBkc3AgYml0IHRvIDAgKi8KKwl2eF9vdXRsKGNoaXAsIENEU1AsIGNoaXAtPnJlZ0NEU1AgJiB+VlhfQ0RTUF9EU1BfUkVTRVRfTUFTSyk7CisKKwlzbmRfdnhfZGVsYXkoX2NoaXAsIFhYX0RTUF9SRVNFVF9XQUlUX1RJTUUpOworCisJY2hpcC0+cmVnQ0RTUCB8PSBWWF9DRFNQX0RTUF9SRVNFVF9NQVNLOworCS8qIHNldCB0aGUgcmVzZXQgZHNwIGJpdCB0byAxICovCisJdnhfb3V0bChjaGlwLCBDRFNQLCBjaGlwLT5yZWdDRFNQKTsKK30KKworCitzdGF0aWMgaW50IHZ4Ml90ZXN0X3hpbGlueCh2eF9jb3JlX3QgKl9jaGlwKQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCXVuc2lnbmVkIGludCBkYXRhOworCisJc25kX3ByaW50ZGQoInRlc3RpbmcgeGlsaW54Li4uXG4iKTsKKwkvKiBUaGlzIHRlc3QgdXNlcyBzZXZlcmFsIHdyaXRlL3JlYWQgc2VxdWVuY2VzIG9uIFRFU1QwIGFuZCBURVNUMSBiaXRzCisJICogdG8gZmlndXJlIG91dCB3aGV2ZXIgb3Igbm90IHRoZSB4aWxpbnggd2FzIGNvcnJlY3RseSBsb2FkZWQKKwkgKi8KKworCS8qIFdlIHdyaXRlIDEgb24gQ0RTUC5URVNUMC4gV2Ugc2hvdWxkIGdldCAwIG9uIFNUQVRVUy5URVNUMC4gKi8KKwl2eF9vdXRsKGNoaXAsIENEU1AsIGNoaXAtPnJlZ0NEU1AgfCBWWF9DRFNQX1RFU1QwX01BU0spOworCXZ4X2lubChjaGlwLCBJU1IpOworCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKKwlpZiAoKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QwX01BU0spID09IFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykgeworCQlzbmRfcHJpbnRkZCgiYmFkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFdlIHdyaXRlIDAgb24gQ0RTUC5URVNUMC4gV2Ugc2hvdWxkIGdldCAxIG9uIFNUQVRVUy5URVNUMC4gKi8KKwl2eF9vdXRsKGNoaXAsIENEU1AsIGNoaXAtPnJlZ0NEU1AgJiB+VlhfQ0RTUF9URVNUMF9NQVNLKTsKKwl2eF9pbmwoY2hpcCwgSVNSKTsKKwlkYXRhID0gdnhfaW5sKGNoaXAsIFNUQVRVUyk7CisJaWYgKCEgKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QwX01BU0spKSB7CisJCXNuZF9wcmludGRkKCJiYWQhICMyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKF9jaGlwLT50eXBlID09IFZYX1RZUEVfQk9BUkQpIHsKKwkJLyogbm90IGltcGxlbWVudGVkIG9uIFZYXzJfQk9BUkRTICovCisJCS8qIFdlIHdyaXRlIDEgb24gQ0RTUC5URVNUMS4gV2Ugc2hvdWxkIGdldCAwIG9uIFNUQVRVUy5URVNUMS4gKi8KKwkJdnhfb3V0bChjaGlwLCBDRFNQLCBjaGlwLT5yZWdDRFNQIHwgVlhfQ0RTUF9URVNUMV9NQVNLKTsKKwkJdnhfaW5sKGNoaXAsIElTUik7CisJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKKwkJaWYgKChkYXRhICYgVlhfU1RBVFVTX1ZBTF9URVNUMV9NQVNLKSA9PSBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spIHsKKwkJCXNuZF9wcmludGRkKCJiYWQhICMzXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJLyogV2Ugd3JpdGUgMCBvbiBDRFNQLlRFU1QxLiBXZSBzaG91bGQgZ2V0IDEgb24gU1RBVFVTLlRFU1QxLiAqLworCQl2eF9vdXRsKGNoaXAsIENEU1AsIGNoaXAtPnJlZ0NEU1AgJiB+VlhfQ0RTUF9URVNUMV9NQVNLKTsKKwkJdnhfaW5sKGNoaXAsIElTUik7CisJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKKwkJaWYgKCEgKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spKSB7CisJCQlzbmRfcHJpbnRkZCgiYmFkISAjNFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwlzbmRfcHJpbnRkZCgib2ssIHhpbGlueCBmaW5lLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB2eF9zZXR1cF9wc2V1ZG9fZG1hIC0gc2V0IHVwIHRoZSBwc2V1ZG8gZG1hIHJlYWQvd3JpdGUgbW9kZS4KKyAqIEBkb193cml0ZTogMCA9IHJlYWQsIDEgPSBzZXQgdXAgZm9yIERNQSB3cml0ZQorICovCitzdGF0aWMgdm9pZCB2eDJfc2V0dXBfcHNldWRvX2RtYSh2eF9jb3JlX3QgKmNoaXAsIGludCBkb193cml0ZSkKK3sKKwkvKiBJbnRlcnJ1cHQgbW9kZSBhbmQgSFJFUSBwaW4gZW5hYmxlZCBmb3IgaG9zdCB0cmFuc21pdCBkYXRhIHRyYW5zZmVycworCSAqIChpbiBjYXNlIG9mIHRoZSB1c2Ugb2YgdGhlIHBzZXVkby1kbWEgZmFjaWxpdHkpLgorCSAqLworCXZ4X291dGwoY2hpcCwgSUNSLCBkb193cml0ZSA/IElDUl9UUkVRIDogSUNSX1JSRVEpOworCisJLyogUmVzZXQgdGhlIHBzZXVkby1kbWEgcmVnaXN0ZXIgKGluIGNhc2Ugb2YgdGhlIHVzZSBvZiB0aGUKKwkgKiBwc2V1ZG8tZG1hIGZhY2lsaXR5KS4KKwkgKi8KKwl2eF9vdXRsKGNoaXAsIFJFU0VUX0RNQSwgMCk7Cit9CisKKy8qCisgKiB2eF9yZWxlYXNlX3BzZXVkb19kbWEgLSBkaXNhYmxlIHRoZSBwc2V1ZG8tRE1BIG1vZGUKKyAqLworaW5saW5lIHN0YXRpYyB2b2lkIHZ4Ml9yZWxlYXNlX3BzZXVkb19kbWEodnhfY29yZV90ICpjaGlwKQoreworCS8qIEhSRVEgcGluIGRpc2FibGVkLiAqLworCXZ4X291dGwoY2hpcCwgSUNSLCAwKTsKK30KKworCisKKy8qIHBzZXVkby1kbWEgd3JpdGUgKi8KK3N0YXRpYyB2b2lkIHZ4Ml9kbWFfd3JpdGUodnhfY29yZV90ICpjaGlwLCBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSwKKwkJCSAgdnhfcGlwZV90ICpwaXBlLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gdngyX3JlZ19hZGRyKGNoaXAsIFZYX0RNQSk7CisJaW50IG9mZnNldCA9IHBpcGUtPmh3X3B0cjsKKwl1MzIgKmFkZHIgPSAodTMyICopKHJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0KTsKKworCXNuZF9hc3NlcnQoY291bnQgJSA0ID09IDAsIHJldHVybik7CisKKwl2eDJfc2V0dXBfcHNldWRvX2RtYShjaGlwLCAxKTsKKworCS8qIFRyYW5zZmVyIHVzaW5nIHBzZXVkby1kbWEuCisJICovCisJaWYgKG9mZnNldCArIGNvdW50ID4gcGlwZS0+YnVmZmVyX2J5dGVzKSB7CisJCWludCBsZW5ndGggPSBwaXBlLT5idWZmZXJfYnl0ZXMgLSBvZmZzZXQ7CisJCWNvdW50IC09IGxlbmd0aDsKKwkJbGVuZ3RoID4+PSAyOyAvKiBpbiAzMmJpdCB3b3JkcyAqLworCQkvKiBUcmFuc2ZlciB1c2luZyBwc2V1ZG8tZG1hLiAqLworCQl3aGlsZSAobGVuZ3RoLS0gPiAwKSB7CisJCQlvdXRsKGNwdV90b19sZTMyKCphZGRyKSwgcG9ydCk7CisJCQlhZGRyKys7CisJCX0KKwkJYWRkciA9ICh1MzIgKilydW50aW1lLT5kbWFfYXJlYTsKKwkJcGlwZS0+aHdfcHRyID0gMDsKKwl9CisJcGlwZS0+aHdfcHRyICs9IGNvdW50OworCWNvdW50ID4+PSAyOyAvKiBpbiAzMmJpdCB3b3JkcyAqLworCS8qIFRyYW5zZmVyIHVzaW5nIHBzZXVkby1kbWEuICovCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW91dGwoY3B1X3RvX2xlMzIoKmFkZHIpLCBwb3J0KTsKKwkJYWRkcisrOworCX0KKworCXZ4Ml9yZWxlYXNlX3BzZXVkb19kbWEoY2hpcCk7Cit9CisKKworLyogcHNldWRvIGRtYSByZWFkICovCitzdGF0aWMgdm9pZCB2eDJfZG1hX3JlYWQodnhfY29yZV90ICpjaGlwLCBzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSwKKwkJCSB2eF9waXBlX3QgKnBpcGUsIGludCBjb3VudCkKK3sKKwlpbnQgb2Zmc2V0ID0gcGlwZS0+aHdfcHRyOworCXUzMiAqYWRkciA9ICh1MzIgKikocnVudGltZS0+ZG1hX2FyZWEgKyBvZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgcG9ydCA9IHZ4Ml9yZWdfYWRkcihjaGlwLCBWWF9ETUEpOworCisJc25kX2Fzc2VydChjb3VudCAlIDQgPT0gMCwgcmV0dXJuKTsKKworCXZ4Ml9zZXR1cF9wc2V1ZG9fZG1hKGNoaXAsIDApOworCS8qIFRyYW5zZmVyIHVzaW5nIHBzZXVkby1kbWEuCisJICovCisJaWYgKG9mZnNldCArIGNvdW50ID4gcGlwZS0+YnVmZmVyX2J5dGVzKSB7CisJCWludCBsZW5ndGggPSBwaXBlLT5idWZmZXJfYnl0ZXMgLSBvZmZzZXQ7CisJCWNvdW50IC09IGxlbmd0aDsKKwkJbGVuZ3RoID4+PSAyOyAvKiBpbiAzMmJpdCB3b3JkcyAqLworCQkvKiBUcmFuc2ZlciB1c2luZyBwc2V1ZG8tZG1hLiAqLworCQl3aGlsZSAobGVuZ3RoLS0gPiAwKQorCQkJKmFkZHIrKyA9IGxlMzJfdG9fY3B1KGlubChwb3J0KSk7CisJCWFkZHIgPSAodTMyICopcnVudGltZS0+ZG1hX2FyZWE7CisJCXBpcGUtPmh3X3B0ciA9IDA7CisJfQorCXBpcGUtPmh3X3B0ciArPSBjb3VudDsKKwljb3VudCA+Pj0gMjsgLyogaW4gMzJiaXQgd29yZHMgKi8KKwkvKiBUcmFuc2ZlciB1c2luZyBwc2V1ZG8tZG1hLiAqLworCXdoaWxlIChjb3VudC0tID4gMCkKKwkJKmFkZHIrKyA9IGxlMzJfdG9fY3B1KGlubChwb3J0KSk7CisKKwl2eDJfcmVsZWFzZV9wc2V1ZG9fZG1hKGNoaXApOworfQorCisjZGVmaW5lIFZYX1hJTElOWF9SRVNFVF9NQVNLICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFZYX1VTRVJCSVQwX01BU0sgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFZYX1VTRVJCSVQxX01BU0sgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFZYX0NOVFJMX1JFR0lTVEVSX1ZBTFVFICAgICAweDAwMTcyMDEyCisKKy8qCisgKiB0cmFuc2ZlciBjb3VudHMgYml0cyB0byBQTFgKKyAqLworc3RhdGljIGludCBwdXRfeGlsaW54X2RhdGEodnhfY29yZV90ICpjaGlwLCB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IGNvdW50cywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJLyogc2V0IHRoZSBjbG9jayBiaXQgdG8gMC4gKi8KKwkJdmFsID0gVlhfQ05UUkxfUkVHSVNURVJfVkFMVUUgJiB+VlhfVVNFUkJJVDBfTUFTSzsKKwkJdngyX291dGwoY2hpcCwgcG9ydCwgdmFsKTsKKwkJdngyX2lubChjaGlwLCBwb3J0KTsKKwkJdWRlbGF5KDEpOworCisJCWlmIChkYXRhICYgKDEgPDwgaSkpCisJCQl2YWwgfD0gVlhfVVNFUkJJVDFfTUFTSzsKKwkJZWxzZQorCQkJdmFsICY9IH5WWF9VU0VSQklUMV9NQVNLOworCQl2eDJfb3V0bChjaGlwLCBwb3J0LCB2YWwpOworCQl2eDJfaW5sKGNoaXAsIHBvcnQpOworCisJCS8qIHNldCB0aGUgY2xvY2sgYml0IHRvIDEuICovCisJCXZhbCB8PSBWWF9VU0VSQklUMF9NQVNLOworCQl2eDJfb3V0bChjaGlwLCBwb3J0LCB2YWwpOworCQl2eDJfaW5sKGNoaXAsIHBvcnQpOworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogbG9hZCB0aGUgeGlsaW54IGltYWdlCisgKi8KK3N0YXRpYyBpbnQgdngyX2xvYWRfeGlsaW54X2JpbmFyeSh2eF9jb3JlX3QgKmNoaXAsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqeGlsaW54KQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBwb3J0OworCXVuc2lnbmVkIGNoYXIgKmltYWdlOworCisJLyogWElMSU5YIHJlc2V0ICh3YWl0IGF0IGxlYXN0IDEgbWlsaXNlY29uZCBiZXR3ZWVuIHJlc2V0IG9uIGFuZCBvZmYpLiAqLworCXZ4X291dGwoY2hpcCwgQ05UUkwsIFZYX0NOVFJMX1JFR0lTVEVSX1ZBTFVFIHwgVlhfWElMSU5YX1JFU0VUX01BU0spOworCXZ4X2lubChjaGlwLCBDTlRSTCk7CisJc25kX3Z4X2RlbGF5KGNoaXAsIDEwKTsKKwl2eF9vdXRsKGNoaXAsIENOVFJMLCBWWF9DTlRSTF9SRUdJU1RFUl9WQUxVRSk7CisJdnhfaW5sKGNoaXAsIENOVFJMKTsKKwlzbmRfdnhfZGVsYXkoY2hpcCwgMTApOworCisJaWYgKGNoaXAtPnR5cGUgPT0gVlhfVFlQRV9CT0FSRCkKKwkJcG9ydCA9IFZYX0NOVFJMOworCWVsc2UKKwkJcG9ydCA9IFZYX0dQSU9DOyAvKiBWWDIyMiBWMiBhbmQgVlgyMjJfTUlDX0JPQVJEIHdpdGggbmV3IFBMWDkwMzAgdXNlIHRoaXMgcmVnaXN0ZXIgKi8KKworCWltYWdlID0geGlsaW54LT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCB4aWxpbngtPnNpemU7IGkrKywgaW1hZ2UrKykgeworCQlpZiAocHV0X3hpbGlueF9kYXRhKGNoaXAsIHBvcnQsIDgsICppbWFnZSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIGRvbid0IHRha2UgdG9vIG11Y2ggdGltZSBpbiB0aGlzIGxvb3AuLi4gKi8KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXB1dF94aWxpbnhfZGF0YShjaGlwLCBwb3J0LCA0LCAweGZmKTsgLyogZW5kIHNpZ25hdHVyZSAqLworCisJc25kX3Z4X2RlbGF5KGNoaXAsIDIwMCk7CisKKwkvKiB0ZXN0IGFmdGVyIGxvYWRpbmcgKGlzIGJ1Z2d5IHdpdGggVlgyMjIpICovCisJaWYgKGNoaXAtPnR5cGUgIT0gVlhfVFlQRV9CT0FSRCkgeworCQkvKiBUZXN0IGlmIGxvYWQgc3VjY2Vzc2Z1bDogdGVzdCBiaXQgOCBvZiByZWdpc3RlciBHUElPQyAoVlgyMjI6IHVzZSBDTlRSTCkgISAqLworCQlpID0gdnhfaW5sKGNoaXAsIEdQSU9DKTsKKwkJaWYgKGkgJiAweDAxMDApCisJCQlyZXR1cm4gMDsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidngyMjI6IHhpbGlueCB0ZXN0IGZhaWxlZCBhZnRlciBsb2FkLCBHUElPQz0weCV4XG4iLCBpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwkKKy8qCisgKiBsb2FkIHRoZSBib290L2RzcCBpbWFnZXMKKyAqLworc3RhdGljIGludCB2eDJfbG9hZF9kc3AodnhfY29yZV90ICp2eCwgaW50IGluZGV4LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcCkKK3sKKwlpbnQgZXJyOworCisJc3dpdGNoIChpbmRleCkgeworCWNhc2UgMToKKwkJLyogeGlsaW54IGltYWdlICovCisJCWlmICgoZXJyID0gdngyX2xvYWRfeGlsaW54X2JpbmFyeSh2eCwgZHNwKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSB2eDJfdGVzdF94aWxpbngodngpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gMDsKKwljYXNlIDI6CisJCS8qIERTUCBib290ICovCisJCXJldHVybiBzbmRfdnhfZHNwX2Jvb3QodngsIGRzcCk7CisJY2FzZSAzOgorCQkvKiBEU1AgaW1hZ2UgKi8KKwkJcmV0dXJuIHNuZF92eF9kc3BfbG9hZCh2eCwgZHNwKTsKKwlkZWZhdWx0OgorCQlzbmRfQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCisvKgorICogdnhfdGVzdF9hbmRfYWNrIC0gdGVzdCBhbmQgYWNrbm93bGVkZ2UgaW50ZXJydXB0CisgKgorICogY2FsbGVkIGZyb20gaXJxIGhhbmRlciwgdG9vCisgKgorICogc3BpbmxvY2sgaGVsZCEKKyAqLworc3RhdGljIGludCB2eDJfdGVzdF9hbmRfYWNrKHZ4X2NvcmVfdCAqY2hpcCkKK3sKKwkvKiBub3QgYm9vdGVkIHlldD8gKi8KKwlpZiAoISAoY2hpcC0+Y2hpcF9zdGF0dXMgJiBWWF9TVEFUX1hJTElOWF9MT0FERUQpKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCEgKHZ4X2lubChjaGlwLCBTVEFUVVMpICYgVlhfU1RBVFVTX01FTUlSUV9NQVNLKSkKKwkJcmV0dXJuIC1FSU87CisJCisJLyogb2ssIGludGVycnVwdHMgZ2VuZXJhdGVkLCBub3cgYWNrIGl0ICovCisJLyogc2V0IEFDUVVJVCBiaXQgdXAgYW5kIGRvd24gKi8KKwl2eF9vdXRsKGNoaXAsIFNUQVRVUywgMCk7CisJLyogdXNlbGVzcyByZWFkIGp1c3QgdG8gc3BlbmQgc29tZSB0aW1lIGFuZCBtYWludGFpbgorCSAqIHRoZSBBQ1FVSVQgc2lnbmFsIHVwIGZvciBhIHdoaWxlICggYSBidXMgY3ljbGUgKQorCSAqLworCXZ4X2lubChjaGlwLCBTVEFUVVMpOworCS8qIGFjayAqLworCXZ4X291dGwoY2hpcCwgU1RBVFVTLCBWWF9TVEFUVVNfTUVNSVJRX01BU0spOworCS8qIHVzZWxlc3MgcmVhZCBqdXN0IHRvIHNwZW5kIHNvbWUgdGltZSBhbmQgbWFpbnRhaW4KKwkgKiB0aGUgQUNRVUlUIHNpZ25hbCB1cCBmb3IgYSB3aGlsZSAoIGEgYnVzIGN5Y2xlICkgKi8KKwl2eF9pbmwoY2hpcCwgU1RBVFVTKTsKKwkvKiBjbGVhciAqLworCXZ4X291dGwoY2hpcCwgU1RBVFVTLCAwKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiB2eF92YWxpZGF0ZV9pcnEgLSBlbmFibGUvZGlzYWJsZSBJUlEKKyAqLworc3RhdGljIHZvaWQgdngyX3ZhbGlkYXRlX2lycSh2eF9jb3JlX3QgKl9jaGlwLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGJpdCB0byAxIGluIENEU1AgcmVnaXN0ZXIgKi8KKwlpZiAoZW5hYmxlKSB7CisJCS8qIFNldCB0aGUgUENJIGludGVycnVwdCBlbmFibGUgYml0IHRvIDEuKi8KKwkJdnhfb3V0bChjaGlwLCBJTlRDU1IsIFZYX0lOVENTUl9WQUxVRXxWWF9QQ0lfSU5URVJSVVBUX01BU0spOworCQljaGlwLT5yZWdDRFNQIHw9IFZYX0NEU1BfVkFMSURfSVJRX01BU0s7CisJfSBlbHNlIHsKKwkJLyogU2V0IHRoZSBQQ0kgaW50ZXJydXB0IGVuYWJsZSBiaXQgdG8gMC4gKi8KKwkJdnhfb3V0bChjaGlwLCBJTlRDU1IsIFZYX0lOVENTUl9WQUxVRSZ+VlhfUENJX0lOVEVSUlVQVF9NQVNLKTsKKwkJY2hpcC0+cmVnQ0RTUCAmPSB+VlhfQ0RTUF9WQUxJRF9JUlFfTUFTSzsKKwl9CisJdnhfb3V0bChjaGlwLCBDRFNQLCBjaGlwLT5yZWdDRFNQKTsKK30KKworCisvKgorICogd3JpdGUgYW4gQUtNIGNvZGVjIGRhdGEgKDI0Yml0KQorICovCitzdGF0aWMgdm9pZCB2eDJfd3JpdGVfY29kZWNfcmVnKHZ4X2NvcmVfdCAqY2hpcCwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwl2eF9pbmwoY2hpcCwgSElGUkVRKTsKKworCS8qIFdlIGhhdmUgdG8gc2VuZCAyNCBiaXRzICgzIHggOCBiaXRzKS4gU3RhcnQgd2l0aCBtb3N0IHNpZ25pZi4gQml0ICovCisJZm9yIChpID0gMDsgaSA8IDI0OyBpKyssIGRhdGEgPDw9IDEpCisJCXZ4X291dGwoY2hpcCwgREFUQSwgKChkYXRhICYgMHg4MDAwMDApID8gVlhfREFUQV9DT0RFQ19NQVNLIDogMCkpOworCS8qIFRlcm1pbmF0ZSBhY2Nlc3MgdG8gY29kZWMgcmVnaXN0ZXJzICovCisJdnhfaW5sKGNoaXAsIFJVRVIpOworfQorCisKKyNkZWZpbmUgQUtNX0NPREVDX1BPV0VSX0NPTlRST0xfQ01EIDB4QTAwNworI2RlZmluZSBBS01fQ09ERUNfUkVTRVRfT05fQ01EICAgICAgMHhBMTAwCisjZGVmaW5lIEFLTV9DT0RFQ19SRVNFVF9PRkZfQ01EICAgICAweEExMDMKKyNkZWZpbmUgQUtNX0NPREVDX0NMT0NLX0ZPUk1BVF9DTUQgIDB4QTI0MAorI2RlZmluZSBBS01fQ09ERUNfTVVURV9DTUQgICAgICAgICAgMHhBMzhECisjZGVmaW5lIEFLTV9DT0RFQ19VTk1VVEVfQ01EICAgICAgICAweEEzMEQKKyNkZWZpbmUgQUtNX0NPREVDX0xFRlRfTEVWRUxfQ01EICAgIDB4QTQwMAorI2RlZmluZSBBS01fQ09ERUNfUklHSFRfTEVWRUxfQ01EICAgMHhBNTAwCisKK3N0YXRpYyBjb25zdCB1OCB2eDJfYWttX2dhaW5zX2x1dFtWWDJfQUtNX0xFVkVMX01BWCsxXSA9IHsKKyAgICAweDdmLCAgICAgICAvLyBbMDAwXSA9ICArMC4wMDAgZEIgIC0+ICBBS00oMHg3ZikgPSAgKzAuMDAwIGRCICBlcnJvcigrMC4wMDAgZEIpCisgICAgMHg3ZCwgICAgICAgLy8gWzAwMV0gPSAgLTAuNTAwIGRCICAtPiAgQUtNKDB4N2QpID0gIC0wLjU3MiBkQiAgZXJyb3IoLTAuMDcyIGRCKQorICAgIDB4N2MsICAgICAgIC8vIFswMDJdID0gIC0xLjAwMCBkQiAgLT4gIEFLTSgweDdjKSA9ICAtMC44NzMgZEIgIGVycm9yKCswLjEyNyBkQikKKyAgICAweDdhLCAgICAgICAvLyBbMDAzXSA9ICAtMS41MDAgZEIgIC0+ICBBS00oMHg3YSkgPSAgLTEuNTA4IGRCICBlcnJvcigtMC4wMDggZEIpCisgICAgMHg3OSwgICAgICAgLy8gWzAwNF0gPSAgLTIuMDAwIGRCICAtPiAgQUtNKDB4NzkpID0gIC0xLjg0NCBkQiAgZXJyb3IoKzAuMTU2IGRCKQorICAgIDB4NzcsICAgICAgIC8vIFswMDVdID0gIC0yLjUwMCBkQiAgLT4gIEFLTSgweDc3KSA9ICAtMi41NTcgZEIgIGVycm9yKC0wLjA1NyBkQikKKyAgICAweDc2LCAgICAgICAvLyBbMDA2XSA9ICAtMy4wMDAgZEIgIC0+ICBBS00oMHg3NikgPSAgLTIuOTM3IGRCICBlcnJvcigrMC4wNjMgZEIpCisgICAgMHg3NSwgICAgICAgLy8gWzAwN10gPSAgLTMuNTAwIGRCICAtPiAgQUtNKDB4NzUpID0gIC0zLjMzNCBkQiAgZXJyb3IoKzAuMTY2IGRCKQorICAgIDB4NzMsICAgICAgIC8vIFswMDhdID0gIC00LjAwMCBkQiAgLT4gIEFLTSgweDczKSA9ICAtNC4xODggZEIgIGVycm9yKC0wLjE4OCBkQikKKyAgICAweDcyLCAgICAgICAvLyBbMDA5XSA9ICAtNC41MDAgZEIgIC0+ICBBS00oMHg3MikgPSAgLTQuNjQ4IGRCICBlcnJvcigtMC4xNDggZEIpCisgICAgMHg3MSwgICAgICAgLy8gWzAxMF0gPSAgLTUuMDAwIGRCICAtPiAgQUtNKDB4NzEpID0gIC01LjEzNCBkQiAgZXJyb3IoLTAuMTM0IGRCKQorICAgIDB4NzAsICAgICAgIC8vIFswMTFdID0gIC01LjUwMCBkQiAgLT4gIEFLTSgweDcwKSA9ICAtNS42NDkgZEIgIGVycm9yKC0wLjE0OSBkQikKKyAgICAweDZmLCAgICAgICAvLyBbMDEyXSA9ICAtNi4wMDAgZEIgIC0+ICBBS00oMHg2ZikgPSAgLTYuMDU2IGRCICBlcnJvcigtMC4wNTYgZEIpCisgICAgMHg2ZCwgICAgICAgLy8gWzAxM10gPSAgLTYuNTAwIGRCICAtPiAgQUtNKDB4NmQpID0gIC02LjYzMSBkQiAgZXJyb3IoLTAuMTMxIGRCKQorICAgIDB4NmMsICAgICAgIC8vIFswMTRdID0gIC03LjAwMCBkQiAgLT4gIEFLTSgweDZjKSA9ICAtNi45MzMgZEIgIGVycm9yKCswLjA2NyBkQikKKyAgICAweDZhLCAgICAgICAvLyBbMDE1XSA9ICAtNy41MDAgZEIgIC0+ICBBS00oMHg2YSkgPSAgLTcuNTcxIGRCICBlcnJvcigtMC4wNzEgZEIpCisgICAgMHg2OSwgICAgICAgLy8gWzAxNl0gPSAgLTguMDAwIGRCICAtPiAgQUtNKDB4NjkpID0gIC03LjkwOSBkQiAgZXJyb3IoKzAuMDkxIGRCKQorICAgIDB4NjcsICAgICAgIC8vIFswMTddID0gIC04LjUwMCBkQiAgLT4gIEFLTSgweDY3KSA9ICAtOC42MjYgZEIgIGVycm9yKC0wLjEyNiBkQikKKyAgICAweDY2LCAgICAgICAvLyBbMDE4XSA9ICAtOS4wMDAgZEIgIC0+ICBBS00oMHg2NikgPSAgLTkuMDA4IGRCICBlcnJvcigtMC4wMDggZEIpCisgICAgMHg2NSwgICAgICAgLy8gWzAxOV0gPSAgLTkuNTAwIGRCICAtPiAgQUtNKDB4NjUpID0gIC05LjQwNyBkQiAgZXJyb3IoKzAuMDkzIGRCKQorICAgIDB4NjQsICAgICAgIC8vIFswMjBdID0gLTEwLjAwMCBkQiAgLT4gIEFLTSgweDY0KSA9ICAtOS44MjYgZEIgIGVycm9yKCswLjE3NCBkQikKKyAgICAweDYyLCAgICAgICAvLyBbMDIxXSA9IC0xMC41MDAgZEIgIC0+ICBBS00oMHg2MikgPSAtMTAuNzMwIGRCICBlcnJvcigtMC4yMzAgZEIpCisgICAgMHg2MSwgICAgICAgLy8gWzAyMl0gPSAtMTEuMDAwIGRCICAtPiAgQUtNKDB4NjEpID0gLTExLjIxOSBkQiAgZXJyb3IoLTAuMjE5IGRCKQorICAgIDB4NjAsICAgICAgIC8vIFswMjNdID0gLTExLjUwMCBkQiAgLT4gIEFLTSgweDYwKSA9IC0xMS43MzggZEIgIGVycm9yKC0wLjIzOCBkQikKKyAgICAweDVmLCAgICAgICAvLyBbMDI0XSA9IC0xMi4wMDAgZEIgIC0+ICBBS00oMHg1ZikgPSAtMTIuMTQ5IGRCICBlcnJvcigtMC4xNDkgZEIpCisgICAgMHg1ZSwgICAgICAgLy8gWzAyNV0gPSAtMTIuNTAwIGRCICAtPiAgQUtNKDB4NWUpID0gLTEyLjQzNCBkQiAgZXJyb3IoKzAuMDY2IGRCKQorICAgIDB4NWMsICAgICAgIC8vIFswMjZdID0gLTEzLjAwMCBkQiAgLT4gIEFLTSgweDVjKSA9IC0xMy4wMzMgZEIgIGVycm9yKC0wLjAzMyBkQikKKyAgICAweDViLCAgICAgICAvLyBbMDI3XSA9IC0xMy41MDAgZEIgIC0+ICBBS00oMHg1YikgPSAtMTMuMzUwIGRCICBlcnJvcigrMC4xNTAgZEIpCisgICAgMHg1OSwgICAgICAgLy8gWzAyOF0gPSAtMTQuMDAwIGRCICAtPiAgQUtNKDB4NTkpID0gLTE0LjAxOCBkQiAgZXJyb3IoLTAuMDE4IGRCKQorICAgIDB4NTgsICAgICAgIC8vIFswMjldID0gLTE0LjUwMCBkQiAgLT4gIEFLTSgweDU4KSA9IC0xNC4zNzMgZEIgIGVycm9yKCswLjEyNyBkQikKKyAgICAweDU2LCAgICAgICAvLyBbMDMwXSA9IC0xNS4wMDAgZEIgIC0+ICBBS00oMHg1NikgPSAtMTUuMTMwIGRCICBlcnJvcigtMC4xMzAgZEIpCisgICAgMHg1NSwgICAgICAgLy8gWzAzMV0gPSAtMTUuNTAwIGRCICAtPiAgQUtNKDB4NTUpID0gLTE1LjUzNCBkQiAgZXJyb3IoLTAuMDM0IGRCKQorICAgIDB4NTQsICAgICAgIC8vIFswMzJdID0gLTE2LjAwMCBkQiAgLT4gIEFLTSgweDU0KSA9IC0xNS45NTggZEIgIGVycm9yKCswLjA0MiBkQikKKyAgICAweDUzLCAgICAgICAvLyBbMDMzXSA9IC0xNi41MDAgZEIgIC0+ICBBS00oMHg1MykgPSAtMTYuNDA0IGRCICBlcnJvcigrMC4wOTYgZEIpCisgICAgMHg1MiwgICAgICAgLy8gWzAzNF0gPSAtMTcuMDAwIGRCICAtPiAgQUtNKDB4NTIpID0gLTE2Ljg3NCBkQiAgZXJyb3IoKzAuMTI2IGRCKQorICAgIDB4NTEsICAgICAgIC8vIFswMzVdID0gLTE3LjUwMCBkQiAgLT4gIEFLTSgweDUxKSA9IC0xNy4zNzEgZEIgIGVycm9yKCswLjEyOSBkQikKKyAgICAweDUwLCAgICAgICAvLyBbMDM2XSA9IC0xOC4wMDAgZEIgIC0+ICBBS00oMHg1MCkgPSAtMTcuODk4IGRCICBlcnJvcigrMC4xMDIgZEIpCisgICAgMHg0ZSwgICAgICAgLy8gWzAzN10gPSAtMTguNTAwIGRCICAtPiAgQUtNKDB4NGUpID0gLTE4LjYwNSBkQiAgZXJyb3IoLTAuMTA1IGRCKQorICAgIDB4NGQsICAgICAgIC8vIFswMzhdID0gLTE5LjAwMCBkQiAgLT4gIEFLTSgweDRkKSA9IC0xOC45MDUgZEIgIGVycm9yKCswLjA5NSBkQikKKyAgICAweDRiLCAgICAgICAvLyBbMDM5XSA9IC0xOS41MDAgZEIgIC0+ICBBS00oMHg0YikgPSAtMTkuNTM4IGRCICBlcnJvcigtMC4wMzggZEIpCisgICAgMHg0YSwgICAgICAgLy8gWzA0MF0gPSAtMjAuMDAwIGRCICAtPiAgQUtNKDB4NGEpID0gLTE5Ljg3MiBkQiAgZXJyb3IoKzAuMTI4IGRCKQorICAgIDB4NDgsICAgICAgIC8vIFswNDFdID0gLTIwLjUwMCBkQiAgLT4gIEFLTSgweDQ4KSA9IC0yMC41ODMgZEIgIGVycm9yKC0wLjA4MyBkQikKKyAgICAweDQ3LCAgICAgICAvLyBbMDQyXSA9IC0yMS4wMDAgZEIgIC0+ICBBS00oMHg0NykgPSAtMjAuOTYxIGRCICBlcnJvcigrMC4wMzkgZEIpCisgICAgMHg0NiwgICAgICAgLy8gWzA0M10gPSAtMjEuNTAwIGRCICAtPiAgQUtNKDB4NDYpID0gLTIxLjM1NiBkQiAgZXJyb3IoKzAuMTQ0IGRCKQorICAgIDB4NDQsICAgICAgIC8vIFswNDRdID0gLTIyLjAwMCBkQiAgLT4gIEFLTSgweDQ0KSA9IC0yMi4yMDYgZEIgIGVycm9yKC0wLjIwNiBkQikKKyAgICAweDQzLCAgICAgICAvLyBbMDQ1XSA9IC0yMi41MDAgZEIgIC0+ICBBS00oMHg0MykgPSAtMjIuNjY0IGRCICBlcnJvcigtMC4xNjQgZEIpCisgICAgMHg0MiwgICAgICAgLy8gWzA0Nl0gPSAtMjMuMDAwIGRCICAtPiAgQUtNKDB4NDIpID0gLTIzLjE0NyBkQiAgZXJyb3IoLTAuMTQ3IGRCKQorICAgIDB4NDEsICAgICAgIC8vIFswNDddID0gLTIzLjUwMCBkQiAgLT4gIEFLTSgweDQxKSA9IC0yMy42NTkgZEIgIGVycm9yKC0wLjE1OSBkQikKKyAgICAweDQwLCAgICAgICAvLyBbMDQ4XSA9IC0yNC4wMDAgZEIgIC0+ICBBS00oMHg0MCkgPSAtMjQuMjAzIGRCICBlcnJvcigtMC4yMDMgZEIpCisgICAgMHgzZiwgICAgICAgLy8gWzA0OV0gPSAtMjQuNTAwIGRCICAtPiAgQUtNKDB4M2YpID0gLTI0LjYzNSBkQiAgZXJyb3IoLTAuMTM1IGRCKQorICAgIDB4M2UsICAgICAgIC8vIFswNTBdID0gLTI1LjAwMCBkQiAgLT4gIEFLTSgweDNlKSA9IC0yNC45MzUgZEIgIGVycm9yKCswLjA2NSBkQikKKyAgICAweDNjLCAgICAgICAvLyBbMDUxXSA9IC0yNS41MDAgZEIgIC0+ICBBS00oMHgzYykgPSAtMjUuNTY5IGRCICBlcnJvcigtMC4wNjkgZEIpCisgICAgMHgzYiwgICAgICAgLy8gWzA1Ml0gPSAtMjYuMDAwIGRCICAtPiAgQUtNKDB4M2IpID0gLTI1LjkwNCBkQiAgZXJyb3IoKzAuMDk2IGRCKQorICAgIDB4MzksICAgICAgIC8vIFswNTNdID0gLTI2LjUwMCBkQiAgLT4gIEFLTSgweDM5KSA9IC0yNi42MTUgZEIgIGVycm9yKC0wLjExNSBkQikKKyAgICAweDM4LCAgICAgICAvLyBbMDU0XSA9IC0yNy4wMDAgZEIgIC0+ICBBS00oMHgzOCkgPSAtMjYuOTk0IGRCICBlcnJvcigrMC4wMDYgZEIpCisgICAgMHgzNywgICAgICAgLy8gWzA1NV0gPSAtMjcuNTAwIGRCICAtPiAgQUtNKDB4MzcpID0gLTI3LjM5MCBkQiAgZXJyb3IoKzAuMTEwIGRCKQorICAgIDB4MzYsICAgICAgIC8vIFswNTZdID0gLTI4LjAwMCBkQiAgLT4gIEFLTSgweDM2KSA9IC0yNy44MDQgZEIgIGVycm9yKCswLjE5NiBkQikKKyAgICAweDM0LCAgICAgICAvLyBbMDU3XSA9IC0yOC41MDAgZEIgIC0+ICBBS00oMHgzNCkgPSAtMjguNjk5IGRCICBlcnJvcigtMC4xOTkgZEIpCisgICAgMHgzMywgICAgICAgLy8gWzA1OF0gPSAtMjkuMDAwIGRCICAtPiAgQUtNKDB4MzMpID0gLTI5LjE4MyBkQiAgZXJyb3IoLTAuMTgzIGRCKQorICAgIDB4MzIsICAgICAgIC8vIFswNTldID0gLTI5LjUwMCBkQiAgLT4gIEFLTSgweDMyKSA9IC0yOS42OTYgZEIgIGVycm9yKC0wLjE5NiBkQikKKyAgICAweDMxLCAgICAgICAvLyBbMDYwXSA9IC0zMC4wMDAgZEIgIC0+ICBBS00oMHgzMSkgPSAtMzAuMjQxIGRCICBlcnJvcigtMC4yNDEgZEIpCisgICAgMHgzMSwgICAgICAgLy8gWzA2MV0gPSAtMzAuNTAwIGRCICAtPiAgQUtNKDB4MzEpID0gLTMwLjI0MSBkQiAgZXJyb3IoKzAuMjU5IGRCKQorICAgIDB4MzAsICAgICAgIC8vIFswNjJdID0gLTMxLjAwMCBkQiAgLT4gIEFLTSgweDMwKSA9IC0zMC44MjMgZEIgIGVycm9yKCswLjE3NyBkQikKKyAgICAweDJlLCAgICAgICAvLyBbMDYzXSA9IC0zMS41MDAgZEIgIC0+ICBBS00oMHgyZSkgPSAtMzEuNjEwIGRCICBlcnJvcigtMC4xMTAgZEIpCisgICAgMHgyZCwgICAgICAgLy8gWzA2NF0gPSAtMzIuMDAwIGRCICAtPiAgQUtNKDB4MmQpID0gLTMxLjk0NSBkQiAgZXJyb3IoKzAuMDU1IGRCKQorICAgIDB4MmIsICAgICAgIC8vIFswNjVdID0gLTMyLjUwMCBkQiAgLT4gIEFLTSgweDJiKSA9IC0zMi42NTkgZEIgIGVycm9yKC0wLjE1OSBkQikKKyAgICAweDJhLCAgICAgICAvLyBbMDY2XSA9IC0zMy4wMDAgZEIgIC0+ICBBS00oMHgyYSkgPSAtMzMuMDM4IGRCICBlcnJvcigtMC4wMzggZEIpCisgICAgMHgyOSwgICAgICAgLy8gWzA2N10gPSAtMzMuNTAwIGRCICAtPiAgQUtNKDB4MjkpID0gLTMzLjQzNSBkQiAgZXJyb3IoKzAuMDY1IGRCKQorICAgIDB4MjgsICAgICAgIC8vIFswNjhdID0gLTM0LjAwMCBkQiAgLT4gIEFLTSgweDI4KSA9IC0zMy44NTIgZEIgIGVycm9yKCswLjE0OCBkQikKKyAgICAweDI3LCAgICAgICAvLyBbMDY5XSA9IC0zNC41MDAgZEIgIC0+ICBBS00oMHgyNykgPSAtMzQuMjg5IGRCICBlcnJvcigrMC4yMTEgZEIpCisgICAgMHgyNSwgICAgICAgLy8gWzA3MF0gPSAtMzUuMDAwIGRCICAtPiAgQUtNKDB4MjUpID0gLTM1LjIzNSBkQiAgZXJyb3IoLTAuMjM1IGRCKQorICAgIDB4MjQsICAgICAgIC8vIFswNzFdID0gLTM1LjUwMCBkQiAgLT4gIEFLTSgweDI0KSA9IC0zNS43NTAgZEIgIGVycm9yKC0wLjI1MCBkQikKKyAgICAweDI0LCAgICAgICAvLyBbMDcyXSA9IC0zNi4wMDAgZEIgIC0+ICBBS00oMHgyNCkgPSAtMzUuNzUwIGRCICBlcnJvcigrMC4yNTAgZEIpCisgICAgMHgyMywgICAgICAgLy8gWzA3M10gPSAtMzYuNTAwIGRCICAtPiAgQUtNKDB4MjMpID0gLTM2LjI5NyBkQiAgZXJyb3IoKzAuMjAzIGRCKQorICAgIDB4MjIsICAgICAgIC8vIFswNzRdID0gLTM3LjAwMCBkQiAgLT4gIEFLTSgweDIyKSA9IC0zNi44ODEgZEIgIGVycm9yKCswLjExOSBkQikKKyAgICAweDIxLCAgICAgICAvLyBbMDc1XSA9IC0zNy41MDAgZEIgIC0+ICBBS00oMHgyMSkgPSAtMzcuNTA4IGRCICBlcnJvcigtMC4wMDggZEIpCisgICAgMHgyMCwgICAgICAgLy8gWzA3Nl0gPSAtMzguMDAwIGRCICAtPiAgQUtNKDB4MjApID0gLTM4LjE4MyBkQiAgZXJyb3IoLTAuMTgzIGRCKQorICAgIDB4MWYsICAgICAgIC8vIFswNzddID0gLTM4LjUwMCBkQiAgLT4gIEFLTSgweDFmKSA9IC0zOC43MjYgZEIgIGVycm9yKC0wLjIyNiBkQikKKyAgICAweDFlLCAgICAgICAvLyBbMDc4XSA9IC0zOS4wMDAgZEIgIC0+ICBBS00oMHgxZSkgPSAtMzkuMTA4IGRCICBlcnJvcigtMC4xMDggZEIpCisgICAgMHgxZCwgICAgICAgLy8gWzA3OV0gPSAtMzkuNTAwIGRCICAtPiAgQUtNKDB4MWQpID0gLTM5LjUwNyBkQiAgZXJyb3IoLTAuMDA3IGRCKQorICAgIDB4MWMsICAgICAgIC8vIFswODBdID0gLTQwLjAwMCBkQiAgLT4gIEFLTSgweDFjKSA9IC0zOS45MjYgZEIgIGVycm9yKCswLjA3NCBkQikKKyAgICAweDFiLCAgICAgICAvLyBbMDgxXSA9IC00MC41MDAgZEIgIC0+ICBBS00oMHgxYikgPSAtNDAuMzY2IGRCICBlcnJvcigrMC4xMzQgZEIpCisgICAgMHgxYSwgICAgICAgLy8gWzA4Ml0gPSAtNDEuMDAwIGRCICAtPiAgQUtNKDB4MWEpID0gLTQwLjgyOSBkQiAgZXJyb3IoKzAuMTcxIGRCKQorICAgIDB4MTksICAgICAgIC8vIFswODNdID0gLTQxLjUwMCBkQiAgLT4gIEFLTSgweDE5KSA9IC00MS4zMTggZEIgIGVycm9yKCswLjE4MiBkQikKKyAgICAweDE4LCAgICAgICAvLyBbMDg0XSA9IC00Mi4wMDAgZEIgIC0+ICBBS00oMHgxOCkgPSAtNDEuODM3IGRCICBlcnJvcigrMC4xNjMgZEIpCisgICAgMHgxNywgICAgICAgLy8gWzA4NV0gPSAtNDIuNTAwIGRCICAtPiAgQUtNKDB4MTcpID0gLTQyLjM4OSBkQiAgZXJyb3IoKzAuMTExIGRCKQorICAgIDB4MTYsICAgICAgIC8vIFswODZdID0gLTQzLjAwMCBkQiAgLT4gIEFLTSgweDE2KSA9IC00Mi45NzggZEIgIGVycm9yKCswLjAyMiBkQikKKyAgICAweDE1LCAgICAgICAvLyBbMDg3XSA9IC00My41MDAgZEIgIC0+ICBBS00oMHgxNSkgPSAtNDMuNjEwIGRCICBlcnJvcigtMC4xMTAgZEIpCisgICAgMHgxNCwgICAgICAgLy8gWzA4OF0gPSAtNDQuMDAwIGRCICAtPiAgQUtNKDB4MTQpID0gLTQ0LjI5MSBkQiAgZXJyb3IoLTAuMjkxIGRCKQorICAgIDB4MTQsICAgICAgIC8vIFswODldID0gLTQ0LjUwMCBkQiAgLT4gIEFLTSgweDE0KSA9IC00NC4yOTEgZEIgIGVycm9yKCswLjIwOSBkQikKKyAgICAweDEzLCAgICAgICAvLyBbMDkwXSA9IC00NS4wMDAgZEIgIC0+ICBBS00oMHgxMykgPSAtNDUuMDMxIGRCICBlcnJvcigtMC4wMzEgZEIpCisgICAgMHgxMiwgICAgICAgLy8gWzA5MV0gPSAtNDUuNTAwIGRCICAtPiAgQUtNKDB4MTIpID0gLTQ1Ljg0MCBkQiAgZXJyb3IoLTAuMzQwIGRCKQorICAgIDB4MTIsICAgICAgIC8vIFswOTJdID0gLTQ2LjAwMCBkQiAgLT4gIEFLTSgweDEyKSA9IC00NS44NDAgZEIgIGVycm9yKCswLjE2MCBkQikKKyAgICAweDExLCAgICAgICAvLyBbMDkzXSA9IC00Ni41MDAgZEIgIC0+ICBBS00oMHgxMSkgPSAtNDYuNzMxIGRCICBlcnJvcigtMC4yMzEgZEIpCisgICAgMHgxMSwgICAgICAgLy8gWzA5NF0gPSAtNDcuMDAwIGRCICAtPiAgQUtNKDB4MTEpID0gLTQ2LjczMSBkQiAgZXJyb3IoKzAuMjY5IGRCKQorICAgIDB4MTAsICAgICAgIC8vIFswOTVdID0gLTQ3LjUwMCBkQiAgLT4gIEFLTSgweDEwKSA9IC00Ny43MjUgZEIgIGVycm9yKC0wLjIyNSBkQikKKyAgICAweDEwLCAgICAgICAvLyBbMDk2XSA9IC00OC4wMDAgZEIgIC0+ICBBS00oMHgxMCkgPSAtNDcuNzI1IGRCICBlcnJvcigrMC4yNzUgZEIpCisgICAgMHgwZiwgICAgICAgLy8gWzA5N10gPSAtNDguNTAwIGRCICAtPiAgQUtNKDB4MGYpID0gLTQ4LjU1MyBkQiAgZXJyb3IoLTAuMDUzIGRCKQorICAgIDB4MGUsICAgICAgIC8vIFswOThdID0gLTQ5LjAwMCBkQiAgLT4gIEFLTSgweDBlKSA9IC00OS4xNTIgZEIgIGVycm9yKC0wLjE1MiBkQikKKyAgICAweDBkLCAgICAgICAvLyBbMDk5XSA9IC00OS41MDAgZEIgIC0+ICBBS00oMHgwZCkgPSAtNDkuNzk2IGRCICBlcnJvcigtMC4yOTYgZEIpCisgICAgMHgwZCwgICAgICAgLy8gWzEwMF0gPSAtNTAuMDAwIGRCICAtPiAgQUtNKDB4MGQpID0gLTQ5Ljc5NiBkQiAgZXJyb3IoKzAuMjA0IGRCKQorICAgIDB4MGMsICAgICAgIC8vIFsxMDFdID0gLTUwLjUwMCBkQiAgLT4gIEFLTSgweDBjKSA9IC01MC40OTEgZEIgIGVycm9yKCswLjAwOSBkQikKKyAgICAweDBiLCAgICAgICAvLyBbMTAyXSA9IC01MS4wMDAgZEIgIC0+ICBBS00oMHgwYikgPSAtNTEuMjQ3IGRCICBlcnJvcigtMC4yNDcgZEIpCisgICAgMHgwYiwgICAgICAgLy8gWzEwM10gPSAtNTEuNTAwIGRCICAtPiAgQUtNKDB4MGIpID0gLTUxLjI0NyBkQiAgZXJyb3IoKzAuMjUzIGRCKQorICAgIDB4MGEsICAgICAgIC8vIFsxMDRdID0gLTUyLjAwMCBkQiAgLT4gIEFLTSgweDBhKSA9IC01Mi4wNzUgZEIgIGVycm9yKC0wLjA3NSBkQikKKyAgICAweDBhLCAgICAgICAvLyBbMTA1XSA9IC01Mi41MDAgZEIgIC0+ICBBS00oMHgwYSkgPSAtNTIuMDc1IGRCICBlcnJvcigrMC40MjUgZEIpCisgICAgMHgwOSwgICAgICAgLy8gWzEwNl0gPSAtNTMuMDAwIGRCICAtPiAgQUtNKDB4MDkpID0gLTUyLjk5MCBkQiAgZXJyb3IoKzAuMDEwIGRCKQorICAgIDB4MDksICAgICAgIC8vIFsxMDddID0gLTUzLjUwMCBkQiAgLT4gIEFLTSgweDA5KSA9IC01Mi45OTAgZEIgIGVycm9yKCswLjUxMCBkQikKKyAgICAweDA4LCAgICAgICAvLyBbMTA4XSA9IC01NC4wMDAgZEIgIC0+ICBBS00oMHgwOCkgPSAtNTQuMDEzIGRCICBlcnJvcigtMC4wMTMgZEIpCisgICAgMHgwOCwgICAgICAgLy8gWzEwOV0gPSAtNTQuNTAwIGRCICAtPiAgQUtNKDB4MDgpID0gLTU0LjAxMyBkQiAgZXJyb3IoKzAuNDg3IGRCKQorICAgIDB4MDcsICAgICAgIC8vIFsxMTBdID0gLTU1LjAwMCBkQiAgLT4gIEFLTSgweDA3KSA9IC01NS4xNzMgZEIgIGVycm9yKC0wLjE3MyBkQikKKyAgICAweDA3LCAgICAgICAvLyBbMTExXSA9IC01NS41MDAgZEIgIC0+ICBBS00oMHgwNykgPSAtNTUuMTczIGRCICBlcnJvcigrMC4zMjcgZEIpCisgICAgMHgwNiwgICAgICAgLy8gWzExMl0gPSAtNTYuMDAwIGRCICAtPiAgQUtNKDB4MDYpID0gLTU2LjUxMiBkQiAgZXJyb3IoLTAuNTEyIGRCKQorICAgIDB4MDYsICAgICAgIC8vIFsxMTNdID0gLTU2LjUwMCBkQiAgLT4gIEFLTSgweDA2KSA9IC01Ni41MTIgZEIgIGVycm9yKC0wLjAxMiBkQikKKyAgICAweDA2LCAgICAgICAvLyBbMTE0XSA9IC01Ny4wMDAgZEIgIC0+ICBBS00oMHgwNikgPSAtNTYuNTEyIGRCICBlcnJvcigrMC40ODggZEIpCisgICAgMHgwNSwgICAgICAgLy8gWzExNV0gPSAtNTcuNTAwIGRCICAtPiAgQUtNKDB4MDUpID0gLTU4LjA5NSBkQiAgZXJyb3IoLTAuNTk1IGRCKQorICAgIDB4MDUsICAgICAgIC8vIFsxMTZdID0gLTU4LjAwMCBkQiAgLT4gIEFLTSgweDA1KSA9IC01OC4wOTUgZEIgIGVycm9yKC0wLjA5NSBkQikKKyAgICAweDA1LCAgICAgICAvLyBbMTE3XSA9IC01OC41MDAgZEIgIC0+ICBBS00oMHgwNSkgPSAtNTguMDk1IGRCICBlcnJvcigrMC40MDUgZEIpCisgICAgMHgwNSwgICAgICAgLy8gWzExOF0gPSAtNTkuMDAwIGRCICAtPiAgQUtNKDB4MDUpID0gLTU4LjA5NSBkQiAgZXJyb3IoKzAuOTA1IGRCKQorICAgIDB4MDQsICAgICAgIC8vIFsxMTldID0gLTU5LjUwMCBkQiAgLT4gIEFLTSgweDA0KSA9IC02MC4wMzQgZEIgIGVycm9yKC0wLjUzNCBkQikKKyAgICAweDA0LCAgICAgICAvLyBbMTIwXSA9IC02MC4wMDAgZEIgIC0+ICBBS00oMHgwNCkgPSAtNjAuMDM0IGRCICBlcnJvcigtMC4wMzQgZEIpCisgICAgMHgwNCwgICAgICAgLy8gWzEyMV0gPSAtNjAuNTAwIGRCICAtPiAgQUtNKDB4MDQpID0gLTYwLjAzNCBkQiAgZXJyb3IoKzAuNDY2IGRCKQorICAgIDB4MDQsICAgICAgIC8vIFsxMjJdID0gLTYxLjAwMCBkQiAgLT4gIEFLTSgweDA0KSA9IC02MC4wMzQgZEIgIGVycm9yKCswLjk2NiBkQikKKyAgICAweDAzLCAgICAgICAvLyBbMTIzXSA9IC02MS41MDAgZEIgIC0+ICBBS00oMHgwMykgPSAtNjIuNTMyIGRCICBlcnJvcigtMS4wMzIgZEIpCisgICAgMHgwMywgICAgICAgLy8gWzEyNF0gPSAtNjIuMDAwIGRCICAtPiAgQUtNKDB4MDMpID0gLTYyLjUzMiBkQiAgZXJyb3IoLTAuNTMyIGRCKQorICAgIDB4MDMsICAgICAgIC8vIFsxMjVdID0gLTYyLjUwMCBkQiAgLT4gIEFLTSgweDAzKSA9IC02Mi41MzIgZEIgIGVycm9yKC0wLjAzMiBkQikKKyAgICAweDAzLCAgICAgICAvLyBbMTI2XSA9IC02My4wMDAgZEIgIC0+ICBBS00oMHgwMykgPSAtNjIuNTMyIGRCICBlcnJvcigrMC40NjggZEIpCisgICAgMHgwMywgICAgICAgLy8gWzEyN10gPSAtNjMuNTAwIGRCICAtPiAgQUtNKDB4MDMpID0gLTYyLjUzMiBkQiAgZXJyb3IoKzAuOTY4IGRCKQorICAgIDB4MDMsICAgICAgIC8vIFsxMjhdID0gLTY0LjAwMCBkQiAgLT4gIEFLTSgweDAzKSA9IC02Mi41MzIgZEIgIGVycm9yKCsxLjQ2OCBkQikKKyAgICAweDAyLCAgICAgICAvLyBbMTI5XSA9IC02NC41MDAgZEIgIC0+ICBBS00oMHgwMikgPSAtNjYuMDU0IGRCICBlcnJvcigtMS41NTQgZEIpCisgICAgMHgwMiwgICAgICAgLy8gWzEzMF0gPSAtNjUuMDAwIGRCICAtPiAgQUtNKDB4MDIpID0gLTY2LjA1NCBkQiAgZXJyb3IoLTEuMDU0IGRCKQorICAgIDB4MDIsICAgICAgIC8vIFsxMzFdID0gLTY1LjUwMCBkQiAgLT4gIEFLTSgweDAyKSA9IC02Ni4wNTQgZEIgIGVycm9yKC0wLjU1NCBkQikKKyAgICAweDAyLCAgICAgICAvLyBbMTMyXSA9IC02Ni4wMDAgZEIgIC0+ICBBS00oMHgwMikgPSAtNjYuMDU0IGRCICBlcnJvcigtMC4wNTQgZEIpCisgICAgMHgwMiwgICAgICAgLy8gWzEzM10gPSAtNjYuNTAwIGRCICAtPiAgQUtNKDB4MDIpID0gLTY2LjA1NCBkQiAgZXJyb3IoKzAuNDQ2IGRCKQorICAgIDB4MDIsICAgICAgIC8vIFsxMzRdID0gLTY3LjAwMCBkQiAgLT4gIEFLTSgweDAyKSA9IC02Ni4wNTQgZEIgIGVycm9yKCswLjk0NiBkQikKKyAgICAweDAyLCAgICAgICAvLyBbMTM1XSA9IC02Ny41MDAgZEIgIC0+ICBBS00oMHgwMikgPSAtNjYuMDU0IGRCICBlcnJvcigrMS40NDYgZEIpCisgICAgMHgwMiwgICAgICAgLy8gWzEzNl0gPSAtNjguMDAwIGRCICAtPiAgQUtNKDB4MDIpID0gLTY2LjA1NCBkQiAgZXJyb3IoKzEuOTQ2IGRCKQorICAgIDB4MDIsICAgICAgIC8vIFsxMzddID0gLTY4LjUwMCBkQiAgLT4gIEFLTSgweDAyKSA9IC02Ni4wNTQgZEIgIGVycm9yKCsyLjQ0NiBkQikKKyAgICAweDAyLCAgICAgICAvLyBbMTM4XSA9IC02OS4wMDAgZEIgIC0+ICBBS00oMHgwMikgPSAtNjYuMDU0IGRCICBlcnJvcigrMi45NDYgZEIpCisgICAgMHgwMSwgICAgICAgLy8gWzEzOV0gPSAtNjkuNTAwIGRCICAtPiAgQUtNKDB4MDEpID0gLTcyLjA3NSBkQiAgZXJyb3IoLTIuNTc1IGRCKQorICAgIDB4MDEsICAgICAgIC8vIFsxNDBdID0gLTcwLjAwMCBkQiAgLT4gIEFLTSgweDAxKSA9IC03Mi4wNzUgZEIgIGVycm9yKC0yLjA3NSBkQikKKyAgICAweDAxLCAgICAgICAvLyBbMTQxXSA9IC03MC41MDAgZEIgIC0+ICBBS00oMHgwMSkgPSAtNzIuMDc1IGRCICBlcnJvcigtMS41NzUgZEIpCisgICAgMHgwMSwgICAgICAgLy8gWzE0Ml0gPSAtNzEuMDAwIGRCICAtPiAgQUtNKDB4MDEpID0gLTcyLjA3NSBkQiAgZXJyb3IoLTEuMDc1IGRCKQorICAgIDB4MDEsICAgICAgIC8vIFsxNDNdID0gLTcxLjUwMCBkQiAgLT4gIEFLTSgweDAxKSA9IC03Mi4wNzUgZEIgIGVycm9yKC0wLjU3NSBkQikKKyAgICAweDAxLCAgICAgICAvLyBbMTQ0XSA9IC03Mi4wMDAgZEIgIC0+ICBBS00oMHgwMSkgPSAtNzIuMDc1IGRCICBlcnJvcigtMC4wNzUgZEIpCisgICAgMHgwMSwgICAgICAgLy8gWzE0NV0gPSAtNzIuNTAwIGRCICAtPiAgQUtNKDB4MDEpID0gLTcyLjA3NSBkQiAgZXJyb3IoKzAuNDI1IGRCKQorICAgIDB4MDEsICAgICAgIC8vIFsxNDZdID0gLTczLjAwMCBkQiAgLT4gIEFLTSgweDAxKSA9IC03Mi4wNzUgZEIgIGVycm9yKCswLjkyNSBkQikKKyAgICAweDAwfTsgICAgICAvLyBbMTQ3XSA9IC03My41MDAgZEIgIC0+ICBBS00oMHgwMCkgPSAgbXV0ZSAgICAgICBlcnJvcigraW5maW5pKQorCisvKgorICogcHNldWRvLWNvZGVjIHdyaXRlIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIHZ4Ml93cml0ZV9ha20odnhfY29yZV90ICpjaGlwLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHJlZyA9PSBYWF9DT0RFQ19EQUNfQ09OVFJPTF9SRUdJU1RFUikgeworCQl2eDJfd3JpdGVfY29kZWNfcmVnKGNoaXAsIGRhdGEgPyBBS01fQ09ERUNfTVVURV9DTUQgOiBBS01fQ09ERUNfVU5NVVRFX0NNRCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBgZGF0YScgaXMgYSB2YWx1ZSBiZXR3ZWVuIDB4MCBhbmQgVlgyX0FLTV9MRVZFTF9NQVggPSAweDA5MywgaW4gdGhlIGNhc2Ugb2YgdGhlIEFLTSBjb2RlY3MsIHdlIG5lZWQKKwkgICBhIGxvb2sgdXAgdGFibGUsIGFzIHRoZXJlIGlzIG5vIGxpbmVhciBtYXRjaGluZyBiZXR3ZWVuIHRoZSBkcml2ZXIgY29kZWMgdmFsdWVzCisJICAgYW5kIHRoZSByZWFsIGRCdSB2YWx1ZQorCSovCisJc25kX2Fzc2VydChkYXRhIDwgc2l6ZW9mKHZ4Ml9ha21fZ2FpbnNfbHV0KSwgcmV0dXJuKTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBYWF9DT0RFQ19MRVZFTF9MRUZUX1JFR0lTVEVSOgorCQl2YWwgPSBBS01fQ09ERUNfTEVGVF9MRVZFTF9DTUQ7CisJCWJyZWFrOworCWNhc2UgWFhfQ09ERUNfTEVWRUxfUklHSFRfUkVHSVNURVI6CisJCXZhbCA9IEFLTV9DT0RFQ19SSUdIVF9MRVZFTF9DTUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNuZF9CVUcoKTsKKwkJcmV0dXJuOworCX0KKwl2YWwgfD0gdngyX2FrbV9nYWluc19sdXRbZGF0YV07CisKKwl2eDJfd3JpdGVfY29kZWNfcmVnKGNoaXAsIHZhbCk7Cit9CisKKworLyoKKyAqIHdyaXRlIGNvZGVjIGJpdCBmb3Igb2xkIFZYMjIyIGJvYXJkCisgKi8KK3N0YXRpYyB2b2lkIHZ4Ml9vbGRfd3JpdGVfY29kZWNfYml0KHZ4X2NvcmVfdCAqY2hpcCwgaW50IGNvZGVjLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlpbnQgaTsKKworCS8qIGFjdGl2YXRlIGFjY2VzcyB0byBjb2RlYyByZWdpc3RlcnMgKi8KKwl2eF9pbmwoY2hpcCwgSElGUkVRKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrLCBkYXRhIDw8PSAxKQorCQl2eF9vdXRsKGNoaXAsIERBVEEsICgoZGF0YSAmIDB4ODAwMDAwKSA/IFZYX0RBVEFfQ09ERUNfTUFTSyA6IDApKTsKKworCS8qIFRlcm1pbmF0ZSBhY2Nlc3MgdG8gY29kZWMgcmVnaXN0ZXJzICovCisJdnhfaW5sKGNoaXAsIFJVRVIpOworfQorCisKKy8qCisgKiByZXNldCBjb2RlYyBiaXQKKyAqLworc3RhdGljIHZvaWQgdngyX3Jlc2V0X2NvZGVjKHZ4X2NvcmVfdCAqX2NoaXApCit7CisJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CisKKwkvKiBTZXQgdGhlIHJlc2V0IENPREVDIGJpdCB0byAwLiAqLworCXZ4X291dGwoY2hpcCwgQ0RTUCwgY2hpcC0+cmVnQ0RTUCAmfiBWWF9DRFNQX0NPREVDX1JFU0VUX01BU0spOworCXZ4X2lubChjaGlwLCBDRFNQKTsKKwlzbmRfdnhfZGVsYXkoX2NoaXAsIDEwKTsKKwkvKiBTZXQgdGhlIHJlc2V0IENPREVDIGJpdCB0byAxLiAqLworCWNoaXAtPnJlZ0NEU1AgfD0gVlhfQ0RTUF9DT0RFQ19SRVNFVF9NQVNLOworCXZ4X291dGwoY2hpcCwgQ0RTUCwgY2hpcC0+cmVnQ0RTUCk7CisJdnhfaW5sKGNoaXAsIENEU1ApOworCWlmIChfY2hpcC0+dHlwZSA9PSBWWF9UWVBFX0JPQVJEKSB7CisJCXNuZF92eF9kZWxheShfY2hpcCwgMSk7CisJCXJldHVybjsKKwl9CisKKwlzbmRfdnhfZGVsYXkoX2NoaXAsIDUpOyAgLyogYWRkaXRpb25uZWwgd2FpdCB0aW1lIGZvciBBS00ncyAqLworCisJdngyX3dyaXRlX2NvZGVjX3JlZyhfY2hpcCwgQUtNX0NPREVDX1BPV0VSX0NPTlRST0xfQ01EKTsgLyogREFDIHBvd2VyIHVwLCBBREMgcG93ZXIgdXAsIFZyZWYgcG93ZXIgZG93biAqLworCQorCXZ4Ml93cml0ZV9jb2RlY19yZWcoX2NoaXAsIEFLTV9DT0RFQ19DTE9DS19GT1JNQVRfQ01EKTsgLyogZGVmYXVsdCAqLworCXZ4Ml93cml0ZV9jb2RlY19yZWcoX2NoaXAsIEFLTV9DT0RFQ19NVVRFX0NNRCk7IC8qIE11dGUgPSBPTiAsRGVlbXBoYXNpcyA9IE9GRiAqLworCXZ4Ml93cml0ZV9jb2RlY19yZWcoX2NoaXAsIEFLTV9DT0RFQ19SRVNFVF9PRkZfQ01EKTsgLyogREFDIGFuZCBBREMgbm9ybWFsIG9wZXJhdGlvbiAqLworCisJaWYgKF9jaGlwLT50eXBlID09IFZYX1RZUEVfTUlDKSB7CisJCS8qIHNldCB1cCB0aGUgbWljcm8gaW5wdXQgc2VsZWN0b3IgKi8KKwkJY2hpcC0+cmVnU0VMTUlDID0gIE1JQ1JPX1NFTEVDVF9JTlBVVF9OT1JNIHwKKwkJCU1JQ1JPX1NFTEVDVF9QUkVBTVBMSV9HXzAgfAorCQkJTUlDUk9fU0VMRUNUX05PSVNFX1RfNTJEQjsKKworCQkvKiByZXNldCBwaGFudG9tIHBvd2VyIHN1cHBseSAqLworCQljaGlwLT5yZWdTRUxNSUMgJj0gfk1JQ1JPX1NFTEVDVF9QSEFOVE9NX0FMSU07CisKKwkJdnhfb3V0bChfY2hpcCwgU0VMTUlDLCBjaGlwLT5yZWdTRUxNSUMpOworCX0KK30KKworCisvKgorICogY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2UKKyAqLworc3RhdGljIHZvaWQgdngyX2NoYW5nZV9hdWRpb19zb3VyY2UodnhfY29yZV90ICpfY2hpcCwgaW50IHNyYykKK3sKKwlzdHJ1Y3Qgc25kX3Z4MjIyICpjaGlwID0gKHN0cnVjdCBzbmRfdngyMjIgKilfY2hpcDsKKworCXN3aXRjaCAoc3JjKSB7CisJY2FzZSBWWF9BVURJT19TUkNfRElHSVRBTDoKKwkJY2hpcC0+cmVnQ0ZHIHw9IFZYX0NGR19EQVRBSU5fU0VMX01BU0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNoaXAtPnJlZ0NGRyAmPSB+VlhfQ0ZHX0RBVEFJTl9TRUxfTUFTSzsKKwkJYnJlYWs7CisJfQorCXZ4X291dGwoY2hpcCwgQ0ZHLCBjaGlwLT5yZWdDRkcpOworfQorCisKKy8qCisgKiBzZXQgdGhlIGNsb2NrIHNvdXJjZQorICovCitzdGF0aWMgdm9pZCB2eDJfc2V0X2Nsb2NrX3NvdXJjZSh2eF9jb3JlX3QgKl9jaGlwLCBpbnQgc291cmNlKQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCisJaWYgKHNvdXJjZSA9PSBJTlRFUk5BTF9RVUFSVFopCisJCWNoaXAtPnJlZ0NGRyAmPSB+VlhfQ0ZHX0NMT0NLSU5fU0VMX01BU0s7CisJZWxzZQorCQljaGlwLT5yZWdDRkcgfD0gVlhfQ0ZHX0NMT0NLSU5fU0VMX01BU0s7CisJdnhfb3V0bChjaGlwLCBDRkcsIGNoaXAtPnJlZ0NGRyk7Cit9CisKKy8qCisgKiByZXNldCB0aGUgYm9hcmQKKyAqLworc3RhdGljIHZvaWQgdngyX3Jlc2V0X2JvYXJkKHZ4X2NvcmVfdCAqX2NoaXAsIGludCBjb2xkX3Jlc2V0KQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCisJLyogaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCisJY2hpcC0+cmVnQ0RTUCA9IFZYX0NEU1BfQ09ERUNfUkVTRVRfTUFTSyB8IFZYX0NEU1BfRFNQX1JFU0VUX01BU0sgOworCWNoaXAtPnJlZ0NGRyA9IDA7Cit9CisKKworCisvKgorICogaW5wdXQgbGV2ZWwgY29udHJvbHMgZm9yIFZYMjIyIE1pYworICovCisKKy8qIE1pY3JvIGxldmVsIGlzIHNwZWNpZmllZCB0byBiZSBhZGp1c3RhYmxlIGZyb20gLTk2ZEIgdG8gNjMgZEIgKGJvYXJkIGNvZGVkIDB4MDAgLi4uIDMxOCksCisgKiAzMTggPSAyMTAgKyAzNiArIDM2ICsgMzYgICAoMjEwID0gKzlkQiB2YXJpYWJsZSkgKDMgKiAzNiA9IDMgc3RlcHMgb2YgMThkQiBwcmUgYW1wbGkpCisgKiBhcyB3ZSB3aWxsIG11dGUgaWYgbGVzcyB0aGFuIC0xMTBkQiwgc28gbGV0J3Mgc2ltcGx5IHVzZSBsaW5lIGlucHV0IGNvZGVkIGxldmVscyBhbmQgYWRkIGNvbnN0YW50IG9mZnNldCAhCisgKi8KKyNkZWZpbmUgVjJfTUlDUk9fTEVWRUxfUkFOR0UgICAgICAgICgzMTggLSAyNTUpCisKK3N0YXRpYyB2b2lkIHZ4Ml9zZXRfaW5wdXRfbGV2ZWwoc3RydWN0IHNuZF92eDIyMiAqY2hpcCkKK3sKKwlpbnQgaSwgbWljbGV2ZWwsIHByZWFtcDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCW1pY2xldmVsID0gY2hpcC0+bWljX2xldmVsOworCW1pY2xldmVsICs9IFYyX01JQ1JPX0xFVkVMX1JBTkdFOyAvKiBhZGQgMzE4IC0gMHhmZiAqLworCXByZWFtcCA9IDA7CisgICAgICAgIHdoaWxlIChtaWNsZXZlbCA+IDIxMCkgeyAvKiBsaW1pdGF0aW9uIHRvICs5ZEIgb2YgMzMxMCByZWFsIGdhaW4gKi8KKwkJcHJlYW1wKys7CS8qIHJhaXNlIHByZSBhbXBsaSArIDE4ZEIgKi8KKwkJbWljbGV2ZWwgLT0gKDE4ICogMik7ICAgLyogbG93ZXIgbGV2ZWwgMTggZEIgKCoyIGJlY2F1c2Ugb2YgMC41IGRCIHN0ZXBzICEpICovCisgICAgICAgIH0KKwlzbmRfYXNzZXJ0KHByZWFtcCA8IDQsIHJldHVybik7CisKKwkvKiBzZXQgcHJlLWFtcCBsZXZlbCAqLworCWNoaXAtPnJlZ1NFTE1JQyAmPSB+TUlDUk9fU0VMRUNUX1BSRUFNUExJX01BU0s7CisJY2hpcC0+cmVnU0VMTUlDIHw9IChwcmVhbXAgPDwgTUlDUk9fU0VMRUNUX1BSRUFNUExJX09GRlNFVCkgJiBNSUNST19TRUxFQ1RfUFJFQU1QTElfTUFTSzsKKwl2eF9vdXRsKGNoaXAsIFNFTE1JQywgY2hpcC0+cmVnU0VMTUlDKTsKKworCWRhdGEgPSAodW5zaWduZWQgaW50KW1pY2xldmVsIDw8IDE2IHwKKwkJKHVuc2lnbmVkIGludCljaGlwLT5pbnB1dF9sZXZlbFsxXSA8PCA4IHwKKwkJKHVuc2lnbmVkIGludCljaGlwLT5pbnB1dF9sZXZlbFswXTsKKwl2eF9pbmwoY2hpcCwgREFUQSk7IC8qIEFjdGl2YXRlIGlucHV0IGxldmVsIHByb2dyYW1taW5nICovCisKKwkvKiBXZSBoYXZlIHRvIHNlbmQgMzIgYml0cyAoNCB4IDggYml0cykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgZGF0YSA8PD0gMSkKKwkJdnhfb3V0bChjaGlwLCBEQVRBLCAoKGRhdGEgJiAweDgwMDAwMDAwKSA/IFZYX0RBVEFfQ09ERUNfTUFTSyA6IDApKTsKKworCXZ4X2lubChjaGlwLCBSVUVSKTsgLyogVGVybWluYXRlIGlucHV0IGxldmVsIHByb2dyYW1taW5nICovCit9CisKKworI2RlZmluZSBNSUNfTEVWRUxfTUFYCTB4ZmYKKworLyoKKyAqIGNvbnRyb2xzIEFQSSBmb3IgaW5wdXQgbGV2ZWxzCisgKi8KKworLyogaW5wdXQgbGV2ZWxzICovCitzdGF0aWMgaW50IHZ4X2lucHV0X2xldmVsX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gTUlDX0xFVkVMX01BWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2eF9pbnB1dF9sZXZlbF9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJdnhfY29yZV90ICpfY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3Z4MjIyICpjaGlwID0gKHN0cnVjdCBzbmRfdngyMjIgKilfY2hpcDsKKwlkb3duKCZfY2hpcC0+bWl4ZXJfbXV0ZXgpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hpcC0+aW5wdXRfbGV2ZWxbMF07CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjaGlwLT5pbnB1dF9sZXZlbFsxXTsKKwl1cCgmX2NoaXAtPm1peGVyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2eF9pbnB1dF9sZXZlbF9wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJdnhfY29yZV90ICpfY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3Z4MjIyICpjaGlwID0gKHN0cnVjdCBzbmRfdngyMjIgKilfY2hpcDsKKwlkb3duKCZfY2hpcC0+bWl4ZXJfbXV0ZXgpOworCWlmIChjaGlwLT5pbnB1dF9sZXZlbFswXSAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSB8fAorCSAgICBjaGlwLT5pbnB1dF9sZXZlbFsxXSAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgeworCQljaGlwLT5pbnB1dF9sZXZlbFswXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQljaGlwLT5pbnB1dF9sZXZlbFsxXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQl2eDJfc2V0X2lucHV0X2xldmVsKGNoaXApOworCQl1cCgmX2NoaXAtPm1peGVyX211dGV4KTsKKwkJcmV0dXJuIDE7CisJfQorCXVwKCZfY2hpcC0+bWl4ZXJfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKiBtaWMgbGV2ZWwgKi8KK3N0YXRpYyBpbnQgdnhfbWljX2xldmVsX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gTUlDX0xFVkVMX01BWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2eF9taWNfbGV2ZWxfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnVjb250cm9sKQoreworCXZ4X2NvcmVfdCAqX2NoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5taWNfbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnhfbWljX2xldmVsX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl2eF9jb3JlX3QgKl9jaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCWRvd24oJl9jaGlwLT5taXhlcl9tdXRleCk7CisJaWYgKGNoaXAtPm1pY19sZXZlbCAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQljaGlwLT5taWNfbGV2ZWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJdngyX3NldF9pbnB1dF9sZXZlbChjaGlwKTsKKwkJdXAoJl9jaGlwLT5taXhlcl9tdXRleCk7CisJCXJldHVybiAxOworCX0KKwl1cCgmX2NoaXAtPm1peGVyX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCB2eF9jb250cm9sX2lucHV0X2xldmVsID0geworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCSJDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPQkJdnhfaW5wdXRfbGV2ZWxfaW5mbywKKwkuZ2V0ID0JCXZ4X2lucHV0X2xldmVsX2dldCwKKwkucHV0ID0JCXZ4X2lucHV0X2xldmVsX3B1dCwKK307CisKK3N0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgdnhfY29udHJvbF9taWNfbGV2ZWwgPSB7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPQkJIk1pYyBDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPQkJdnhfbWljX2xldmVsX2luZm8sCisJLmdldCA9CQl2eF9taWNfbGV2ZWxfZ2V0LAorCS5wdXQgPQkJdnhfbWljX2xldmVsX3B1dCwKK307CisKKy8qCisgKiBGSVhNRTogY29tcHJlc3Nvci9saW1pdGVyIGltcGxlbWVudGF0aW9uIGlzIG1pc3NpbmcgeWV0Li4uCisgKi8KKworc3RhdGljIGludCB2eDJfYWRkX21pY19jb250cm9scyh2eF9jb3JlX3QgKl9jaGlwKQoreworCXN0cnVjdCBzbmRfdngyMjIgKmNoaXAgPSAoc3RydWN0IHNuZF92eDIyMiAqKV9jaGlwOworCWludCBlcnI7CisKKwlpZiAoX2NoaXAtPnR5cGUgIT0gVlhfVFlQRV9NSUMpCisJCXJldHVybiAwOworCisJLyogbXV0ZSBpbnB1dCBsZXZlbHMgKi8KKwljaGlwLT5pbnB1dF9sZXZlbFswXSA9IGNoaXAtPmlucHV0X2xldmVsWzFdID0gMDsKKwljaGlwLT5taWNfbGV2ZWwgPSAwOworCXZ4Ml9zZXRfaW5wdXRfbGV2ZWwoY2hpcCk7CisKKwkvKiBjb250cm9scyAqLworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoX2NoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmdnhfY29udHJvbF9pbnB1dF9sZXZlbCwgY2hpcCkpKSA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChfY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ2eF9jb250cm9sX21pY19sZXZlbCwgY2hpcCkpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogY2FsbGJhY2tzCisgKi8KK3N0cnVjdCBzbmRfdnhfb3BzIHZ4MjIyX29wcyA9IHsKKwkuaW44ID0gdngyX2luYiwKKwkuaW4zMiA9IHZ4Ml9pbmwsCisJLm91dDggPSB2eDJfb3V0YiwKKwkub3V0MzIgPSB2eDJfb3V0bCwKKwkudGVzdF9hbmRfYWNrID0gdngyX3Rlc3RfYW5kX2FjaywKKwkudmFsaWRhdGVfaXJxID0gdngyX3ZhbGlkYXRlX2lycSwKKwkuYWttX3dyaXRlID0gdngyX3dyaXRlX2FrbSwKKwkucmVzZXRfY29kZWMgPSB2eDJfcmVzZXRfY29kZWMsCisJLmNoYW5nZV9hdWRpb19zb3VyY2UgPSB2eDJfY2hhbmdlX2F1ZGlvX3NvdXJjZSwKKwkuc2V0X2Nsb2NrX3NvdXJjZSA9IHZ4Ml9zZXRfY2xvY2tfc291cmNlLAorCS5sb2FkX2RzcCA9IHZ4Ml9sb2FkX2RzcCwKKwkucmVzZXRfZHNwID0gdngyX3Jlc2V0X2RzcCwKKwkucmVzZXRfYm9hcmQgPSB2eDJfcmVzZXRfYm9hcmQsCisJLmRtYV93cml0ZSA9IHZ4Ml9kbWFfd3JpdGUsCisJLmRtYV9yZWFkID0gdngyX2RtYV9yZWFkLAorCS5hZGRfY29udHJvbHMgPSB2eDJfYWRkX21pY19jb250cm9scywKK307CisKKy8qIGZvciBvbGQgVlgyMjIgYm9hcmQgKi8KK3N0cnVjdCBzbmRfdnhfb3BzIHZ4MjIyX29sZF9vcHMgPSB7CisJLmluOCA9IHZ4Ml9pbmIsCisJLmluMzIgPSB2eDJfaW5sLAorCS5vdXQ4ID0gdngyX291dGIsCisJLm91dDMyID0gdngyX291dGwsCisJLnRlc3RfYW5kX2FjayA9IHZ4Ml90ZXN0X2FuZF9hY2ssCisJLnZhbGlkYXRlX2lycSA9IHZ4Ml92YWxpZGF0ZV9pcnEsCisJLndyaXRlX2NvZGVjID0gdngyX29sZF93cml0ZV9jb2RlY19iaXQsCisJLnJlc2V0X2NvZGVjID0gdngyX3Jlc2V0X2NvZGVjLAorCS5jaGFuZ2VfYXVkaW9fc291cmNlID0gdngyX2NoYW5nZV9hdWRpb19zb3VyY2UsCisJLnNldF9jbG9ja19zb3VyY2UgPSB2eDJfc2V0X2Nsb2NrX3NvdXJjZSwKKwkubG9hZF9kc3AgPSB2eDJfbG9hZF9kc3AsCisJLnJlc2V0X2RzcCA9IHZ4Ml9yZXNldF9kc3AsCisJLnJlc2V0X2JvYXJkID0gdngyX3Jlc2V0X2JvYXJkLAorCS5kbWFfd3JpdGUgPSB2eDJfZG1hX3dyaXRlLAorCS5kbWFfcmVhZCA9IHZ4Ml9kbWFfcmVhZCwKK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kvTWFrZWZpbGUgYi9zb3VuZC9wY2kveW1mcGNpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTBjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kveW1mcGNpL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIworIyBNYWtlZmlsZSBmb3IgQUxTQQorIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorIworCitzbmQteW1mcGNpLW9ianMgOj0geW1mcGNpLm8geW1mcGNpX21haW4ubworCisjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CitvYmotJChDT05GSUdfU05EX1lNRlBDSSkgKz0gc25kLXltZnBjaS5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNlZjIyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqICBUaGUgZHJpdmVyIGZvciB0aGUgWWFtYWhhJ3MgRFMxL0RTMUUgY2FyZHMKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC95bWZwY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KKyNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIllhbWFoYSBEUy1YRyBQQ0kiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1lhbWFoYSxZTUY3MjR9LCIKKwkJIntZYW1haGEsWU1GNzI0Rn0sIgorCQkie1lhbWFoYSxZTUY3NDB9LCIKKwkJIntZYW1haGEsWU1GNzQwQ30sIgorCQkie1lhbWFoYSxZTUY3NDR9LCIKKwkJIntZYW1haGEsWU1GNzU0fX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCitzdGF0aWMgbG9uZyBmbV9wb3J0W1NORFJWX0NBUkRTXTsKK3N0YXRpYyBsb25nIG1wdV9wb3J0W1NORFJWX0NBUkRTXTsKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCitzdGF0aWMgbG9uZyBqb3lzdGlja19wb3J0W1NORFJWX0NBUkRTXTsKKyNlbmRpZgorc3RhdGljIGludCByZWFyX3N3aXRjaFtTTkRSVl9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgdGhlIFlhbWFoYSBEUy1YRyBQQ0kgc291bmRjYXJkLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciB0aGUgWWFtYWhhIERTLVhHIFBDSSBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIFlhbWFoYSBEUy1YRyBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobXB1X3BvcnQsIGxvbmcsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgUG9ydC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShmbV9wb3J0LCBsb25nLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm1fcG9ydCwgIkZNIE9QTC0zIFBvcnQuIik7CisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworbW9kdWxlX3BhcmFtX2FycmF5KGpveXN0aWNrX3BvcnQsIGxvbmcsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhqb3lzdGlja19wb3J0LCAiSm95c3RpY2sgcG9ydCBhZGRyZXNzIik7CisjZW5kaWYKK21vZHVsZV9wYXJhbV9hcnJheShyZWFyX3N3aXRjaCwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlYXJfc3dpdGNoLCAiRW5hYmxlIHNoYXJlZCByZWFyL2xpbmUtaW4gc3dpdGNoIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfeW1mcGNpX2lkc1tdID0geworICAgICAgICB7IDB4MTA3MywgMHgwMDA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LCAgIC8qIFlNRjcyNCAqLworICAgICAgICB7IDB4MTA3MywgMHgwMDBkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwLCB9LCAgIC8qIFlNRjcyNEYgKi8KKyAgICAgICAgeyAweDEwNzMsIDB4MDAwYSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwgICAvKiBZTUY3NDAgKi8KKyAgICAgICAgeyAweDEwNzMsIDB4MDAwYywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwgICAvKiBZTUY3NDBDICovCisgICAgICAgIHsgMHgxMDczLCAweDAwMTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sICAgLyogWU1GNzQ0ICovCisgICAgICAgIHsgMHgxMDczLCAweDAwMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sICAgLyogWU1GNzU0ICovCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX3ltZnBjaV9pZHMpOworCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ltZnBjaV9jcmVhdGVfZ2FtZXBvcnQoeW1mcGNpX3QgKmNoaXAsIGludCBkZXYsCisJCQkJCQlpbnQgbGVnYWN5X2N0cmwsIGludCBsZWdhY3lfY3RybDIpCit7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBOVUxMOworCWludCBpb19wb3J0ID0gam95c3RpY2tfcG9ydFtkZXZdOworCisJaWYgKCFpb19wb3J0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChjaGlwLT5wY2ktPmRldmljZSA+PSAweDAwMTApIHsgLyogWU1GIDc0NC83NTQgKi8KKworCQlpZiAoaW9fcG9ydCA9PSAxKSB7CisJCQkvKiBhdXRvLWRldGVjdCAqLworCQkJaWYgKCEoaW9fcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChjaGlwLT5wY2ksIDIpKSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpb19wb3J0ID09IDEpIHsKKwkJCS8qIGF1dG8tZGV0ZWN0ICovCisJCQlmb3IgKGlvX3BvcnQgPSAweDIwMTsgaW9fcG9ydCA8PSAweDIwNTsgaW9fcG9ydCsrKSB7CisJCQkJaWYgKGlvX3BvcnQgPT0gMHgyMDMpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgociA9IHJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDEsICJZTUZQQ0kgZ2FtZXBvcnQiKSkgIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogbm8gZ2FtZXBvcnQgcG9ydHMgYXZhaWxhYmxlXG4iKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJCXN3aXRjaCAoaW9fcG9ydCkgeworCQljYXNlIDB4MjAxOiBsZWdhY3lfY3RybDIgfD0gMCA8PCA2OyBicmVhazsKKwkJY2FzZSAweDIwMjogbGVnYWN5X2N0cmwyIHw9IDEgPDwgNjsgYnJlYWs7CisJCWNhc2UgMHgyMDQ6IGxlZ2FjeV9jdHJsMiB8PSAyIDw8IDY7IGJyZWFrOworCQljYXNlIDB4MjA1OiBsZWdhY3lfY3RybDIgfD0gMyA8PCA2OyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4IiwgaW9fcG9ydCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghciAmJiAhKHIgPSByZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAxLCAiWU1GUENJIGdhbWVwb3J0IikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBqb3lzdGljayBwb3J0ICUjeCBpcyBpbiB1c2UuXG4iLCBpb19wb3J0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwkJa2ZyZWVfbm9jaGVjayhyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIllhbWFoYSBZTUYgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCWdhbWVwb3J0X3NldF9kZXZfcGFyZW50KGdwLCAmY2hpcC0+cGNpLT5kZXYpOworCWdwLT5pbyA9IGlvX3BvcnQ7CisJZ2FtZXBvcnRfc2V0X3BvcnRfZGF0YShncCwgcik7CisKKwlpZiAoY2hpcC0+cGNpLT5kZXZpY2UgPj0gMHgwMDEwKSAvKiBZTUYgNzQ0Lzc1NCAqLworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBQQ0lSX0RTWEdfSk9ZQkFTRSwgaW9fcG9ydCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBQQ0lSX0RTWEdfTEVHQUNZLCBsZWdhY3lfY3RybCB8IFlNRlBDSV9MRUdBQ1lfSlBFTik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgUENJUl9EU1hHX0VMRUdBQ1ksIGxlZ2FjeV9jdHJsMik7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGNoaXAtPmdhbWVwb3J0KTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNuZF95bWZwY2lfZnJlZV9nYW1lcG9ydCh5bWZwY2lfdCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Z2FtZXBvcnQpIHsKKwkJc3RydWN0IHJlc291cmNlICpyID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShjaGlwLT5nYW1lcG9ydCk7CisKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNoaXAtPmdhbWVwb3J0KTsKKwkJY2hpcC0+Z2FtZXBvcnQgPSBOVUxMOworCisJCXJlbGVhc2VfcmVzb3VyY2Uocik7CisJCWtmcmVlX25vY2hlY2socik7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF95bWZwY2lfY3JlYXRlX2dhbWVwb3J0KHltZnBjaV90ICpjaGlwLCBpbnQgZGV2LCBpbnQgbCwgaW50IGwyKSB7IHJldHVybiAtRU5PU1lTOyB9Cit2b2lkIHNuZF95bWZwY2lfZnJlZV9nYW1lcG9ydCh5bWZwY2lfdCAqY2hpcCkgeyB9CisjZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2FyZF95bWZwY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdGF0aWMgaW50IGRldjsKKwlzbmRfY2FyZF90ICpjYXJkOworCXN0cnVjdCByZXNvdXJjZSAqZm1fcmVzID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1wdV9yZXMgPSBOVUxMOworCXltZnBjaV90ICpjaGlwOworCW9wbDNfdCAqb3BsMzsKKwljaGFyICpzdHI7CisJaW50IGVycjsKKwl1MTYgbGVnYWN5X2N0cmwsIGxlZ2FjeV9jdHJsMiwgb2xkX2xlZ2FjeV9jdHJsOworCisJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFlbmFibGVbZGV2XSkgeworCQlkZXYrKzsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKGNhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHBjaV9pZC0+ZGV2aWNlKSB7CisJY2FzZSAweDAwMDQ6IHN0ciA9ICJZTUY3MjQiOyBicmVhazsKKwljYXNlIDB4MDAwZDogc3RyID0gIllNRjcyNEYiOyBicmVhazsKKwljYXNlIDB4MDAwYTogc3RyID0gIllNRjc0MCI7IGJyZWFrOworCWNhc2UgMHgwMDBjOiBzdHIgPSAiWU1GNzQwQyI7IGJyZWFrOworCWNhc2UgMHgwMDEwOiBzdHIgPSAiWU1GNzQ0IjsgYnJlYWs7CisJY2FzZSAweDAwMTI6IHN0ciA9ICJZTUY3NTQiOyBicmVhazsKKwlkZWZhdWx0OiBzdHIgPSAiPz8/IjsgYnJlYWs7CisJfQorCisJbGVnYWN5X2N0cmwgPSAwOworCWxlZ2FjeV9jdHJsMiA9IDB4MDgwMDsJLyogU0JFTiA9IDAsIFNNT0QgPSAwMSwgTEFEID0gMCAqLworCisJaWYgKHBjaV9pZC0+ZGV2aWNlID49IDB4MDAxMCkgeyAvKiBZTUYgNzQ0Lzc1NCAqLworCQlpZiAoZm1fcG9ydFtkZXZdID09IDEpIHsKKwkJCS8qIGF1dG8tZGV0ZWN0ICovCisJCQlmbV9wb3J0W2Rldl0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwkJfQorCQlpZiAoZm1fcG9ydFtkZXZdID4gMCAmJgorCQkgICAgKGZtX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGZtX3BvcnRbZGV2XSwgNCwgIllNRlBDSSBPUEwzIikpICE9IE5VTEwpIHsKKwkJCWxlZ2FjeV9jdHJsIHw9IFlNRlBDSV9MRUdBQ1lfRk1FTjsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYR19GTUJBU0UsIGZtX3BvcnRbZGV2XSk7CisJCX0KKwkJaWYgKG1wdV9wb3J0W2Rldl0gPT0gMSkgeworCQkJLyogYXV0by1kZXRlY3QgKi8KKwkJCW1wdV9wb3J0W2Rldl0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKSArIDB4MjA7CisJCX0KKwkJaWYgKG1wdV9wb3J0W2Rldl0gPiAwICYmCisJCSAgICAobXB1X3JlcyA9IHJlcXVlc3RfcmVnaW9uKG1wdV9wb3J0W2Rldl0sIDIsICJZTUZQQ0kgTVBVNDAxIikpICE9IE5VTEwpIHsKKwkJCWxlZ2FjeV9jdHJsIHw9IFlNRlBDSV9MRUdBQ1lfTUVOOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX01QVTQwMUJBU0UsIG1wdV9wb3J0W2Rldl0pOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmbV9wb3J0W2Rldl0pIHsKKwkJY2FzZSAweDM4ODogbGVnYWN5X2N0cmwyIHw9IDA7IGJyZWFrOworCQljYXNlIDB4Mzk4OiBsZWdhY3lfY3RybDIgfD0gMTsgYnJlYWs7CisJCWNhc2UgMHgzYTA6IGxlZ2FjeV9jdHJsMiB8PSAyOyBicmVhazsKKwkJY2FzZSAweDNhODogbGVnYWN5X2N0cmwyIHw9IDM7IGJyZWFrOworCQlkZWZhdWx0OiBmbV9wb3J0W2Rldl0gPSAwOyBicmVhazsKKwkJfQorCQlpZiAoZm1fcG9ydFtkZXZdID4gMCAmJgorCQkgICAgKGZtX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGZtX3BvcnRbZGV2XSwgNCwgIllNRlBDSSBPUEwzIikpICE9IE5VTEwpIHsKKwkJCWxlZ2FjeV9jdHJsIHw9IFlNRlBDSV9MRUdBQ1lfRk1FTjsKKwkJfSBlbHNlIHsKKwkJCWxlZ2FjeV9jdHJsMiAmPSB+WU1GUENJX0xFR0FDWTJfRk1JTzsKKwkJCWZtX3BvcnRbZGV2XSA9IDA7CisJCX0KKwkJc3dpdGNoIChtcHVfcG9ydFtkZXZdKSB7CisJCWNhc2UgMHgzMzA6IGxlZ2FjeV9jdHJsMiB8PSAwIDw8IDQ7IGJyZWFrOworCQljYXNlIDB4MzAwOiBsZWdhY3lfY3RybDIgfD0gMSA8PCA0OyBicmVhazsKKwkJY2FzZSAweDMzMjogbGVnYWN5X2N0cmwyIHw9IDIgPDwgNDsgYnJlYWs7CisJCWNhc2UgMHgzMzQ6IGxlZ2FjeV9jdHJsMiB8PSAzIDw8IDQ7IGJyZWFrOworCQlkZWZhdWx0OiBtcHVfcG9ydFtkZXZdID0gMDsgYnJlYWs7CisJCX0KKwkJaWYgKG1wdV9wb3J0W2Rldl0gPiAwICYmCisJCSAgICAobXB1X3JlcyA9IHJlcXVlc3RfcmVnaW9uKG1wdV9wb3J0W2Rldl0sIDIsICJZTUZQQ0kgTVBVNDAxIikpICE9IE5VTEwpIHsKKwkJCWxlZ2FjeV9jdHJsIHw9IFlNRlBDSV9MRUdBQ1lfTUVOOworCQl9IGVsc2UgeworCQkJbGVnYWN5X2N0cmwyICY9IH5ZTUZQQ0lfTEVHQUNZMl9NUFVJTzsKKwkJCW1wdV9wb3J0W2Rldl0gPSAwOworCQl9CisJfQorCWlmIChtcHVfcmVzKSB7CisJCWxlZ2FjeV9jdHJsIHw9IFlNRlBDSV9MRUdBQ1lfTUlFTjsKKwkJbGVnYWN5X2N0cmwyIHw9IFlNRlBDSV9MRUdBQ1kyX0lNT0Q7CisJfQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgJm9sZF9sZWdhY3lfY3RybCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYR19FTEVHQUNZLCBsZWdhY3lfY3RybDIpOworCWlmICgoZXJyID0gc25kX3ltZnBjaV9jcmVhdGUoY2FyZCwgcGNpLAorCQkJCSAgICAgb2xkX2xlZ2FjeV9jdHJsLAorCQkJIAkgICAgICZjaGlwKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCWlmIChtcHVfcmVzKSB7CisJCQlyZWxlYXNlX3Jlc291cmNlKG1wdV9yZXMpOworCQkJa2ZyZWVfbm9jaGVjayhtcHVfcmVzKTsKKwkJfQorCQlpZiAoZm1fcmVzKSB7CisJCQlyZWxlYXNlX3Jlc291cmNlKGZtX3Jlcyk7CisJCQlrZnJlZV9ub2NoZWNrKGZtX3Jlcyk7CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+Zm1fcmVzID0gZm1fcmVzOworCWNoaXAtPm1wdV9yZXMgPSBtcHVfcmVzOworCXN0cmNweShjYXJkLT5kcml2ZXIsIHN0cik7CisJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJZYW1haGEgRFMtWEcgKCVzKSIsIHN0cik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsCisJCWNoaXAtPnJlZ19hcmVhX3BoeXMsCisJCWNoaXAtPmlycSk7CisJaWYgKChlcnIgPSBzbmRfeW1mcGNpX3BjbShjaGlwLCAwLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX3ltZnBjaV9wY21fc3BkaWYoY2hpcCwgMSwgTlVMTCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF95bWZwY2lfcGNtXzRjaChjaGlwLCAyLCBOVUxMKSkgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgoZXJyID0gc25kX3ltZnBjaV9wY20yKGNoaXAsIDMsIE5VTEwpKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfeW1mcGNpX21peGVyKGNoaXAsIHJlYXJfc3dpdGNoW2Rldl0pKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfeW1mcGNpX3RpbWVyKGNoaXAsIDApKSA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGNoaXAtPm1wdV9yZXMpIHsKKwkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19ZTUZQQ0ksCisJCQkJCSAgICAgICBtcHVfcG9ydFtkZXZdLCAxLAorCQkJCQkgICAgICAgcGNpLT5pcnEsIDAsICZjaGlwLT5yYXdtaWRpKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ5bWZwY2k6IGNhbm5vdCBpbml0aWFsaXplIE1QVTQwMSBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIG1wdV9wb3J0W2Rldl0pOworCQkJbGVnYWN5X2N0cmwgJj0gfllNRlBDSV9MRUdBQ1lfTUlFTjsgLyogZGlzYWJsZSBNUFU0MDEgaXJxICovCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lSX0RTWEdfTEVHQUNZLCBsZWdhY3lfY3RybCk7CisJCX0KKwl9CisJaWYgKGNoaXAtPmZtX3JlcykgeworCQlpZiAoKGVyciA9IHNuZF9vcGwzX2NyZWF0ZShjYXJkLAorCQkJCQkgICBmbV9wb3J0W2Rldl0sCisJCQkJCSAgIGZtX3BvcnRbZGV2XSArIDIsCisJCQkJCSAgIE9QTDNfSFdfT1BMMywgMSwgJm9wbDMpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgRk0gT1BMMyBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIGZtX3BvcnRbZGV2XSk7CisJCQlsZWdhY3lfY3RybCAmPSB+WU1GUENJX0xFR0FDWV9GTUVOOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOworCQl9IGVsc2UgaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMSwgTlVMTCkpIDwgMCkgeworCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJCXNuZF9wcmludGsoImNhbm5vdCBjcmVhdGUgb3BsMyBod2RlcFxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJc25kX3ltZnBjaV9jcmVhdGVfZ2FtZXBvcnQoY2hpcCwgZGV2LCBsZWdhY3lfY3RybCwgbGVnYWN5X2N0cmwyKTsKKworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKKwlkZXYrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9jYXJkX3ltZnBjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJZYW1haGEgRFMtWEcgUENJIiwKKwkuaWRfdGFibGUgPSBzbmRfeW1mcGNpX2lkcywKKwkucHJvYmUgPSBzbmRfY2FyZF95bWZwY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX3ltZnBjaV9yZW1vdmUpLAorCVNORF9QQ0lfUE1fQ0FMTEJBQ0tTCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfeW1mcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX3ltZnBjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHNhX2NhcmRfeW1mcGNpX2luaXQpCittb2R1bGVfZXhpdChhbHNhX2NhcmRfeW1mcGNpX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9pbWFnZS5oIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA3NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfaW1hZ2UuaApAQCAtMCwwICsxLDE1NjUgQEAKKyNpZm5kZWYgX0hXTUNPREVfCisjZGVmaW5lIF9IV01DT0RFXworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBEc3BJbnN0W1lEU1hHX0RTUExFTkdUSCAvIDRdID0geworCTB4MDAwMDAwODEsIDB4MDAwMDAxYTQsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMmYsCisJMHgwMDA4MDI1MywgMHgwMTgwMDMxNywgMHgwMDAwNDA3YiwgMHgwMDAwODQzZiwKKwkweDAwMDE0ODNjLCAweDAwMDE5NDNjLCAweDAwMDVkODNjLCAweDAwMDAxYzNjLAorCTB4MDAwMGMwN2IsIDB4MDAwNTBjM2YsIDB4MDEyMTUwM2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgQ250cmxJbnN0W1lEU1hHX0NUUkxMRU5HVEggLyA0XSA9IHsKKwkweDAwMDAwNywgMHgyNDAwMDcsIDB4MEMwMDA3LCAweDFDMDAwNywKKwkweDA2MDAwNywgMHg3MDAwMDIsIDB4MDAwMDIwLCAweDAzMDA0MCwKKwkweDAwNzEwNCwgMHgwMDQyODYsIDB4MDMwMDQwLCAweDAwMEYwRCwKKwkweDAwMDgxMCwgMHgyMDA0M0EsIDB4MDAwMjgyLCAweDAwMDIwRCwKKwkweDAwMDgxMCwgMHgyMDA0M0EsIDB4MDAxMjgyLCAweDIwMEU4MiwKKwkweDAwMUE4MiwgMHgwMzJEMEQsIDB4MDAwODEwLCAweDEwMDQzQSwKKwkweDAyRDM4RCwgMHgwMDA4MTAsIDB4MTgwNDNBLCAweDAwMDEwRCwKKwkweDAyMDAxNSwgMHgwMDAwRkQsIDB4MDAwMDIwLCAweDAzODg2MCwKKwkweDAzOTA2MCwgMHgwMzgwNjAsIDB4MDM4MDQwLCAweDAzODA0MCwKKwkweDAzODA0MCwgMHgwMTgwNDAsIDB4MDAwQTdELCAweDAzODA0MCwKKwkweDAzODA0MCwgMHgwMTgwNDAsIDB4MjAwNDAyLCAweDAwMDg4MiwKKwkweDA4MDAxQSwgMHgwMDA5MDQsIDB4MDE1OTg2LCAweDAwMDAwNywKKwkweDI2MDAwNywgMHgwMDAwMDcsIDB4MDAwMDA3LCAweDAxOEEwNiwKKwkweDAwMDAwNywgMHgwMzBDOEQsIDB4MDAwODEwLCAweDE4MDQzQSwKKwkweDI2MDAwNywgMHgwMDA4N0QsIDB4MDE4MDQyLCAweDAwMTYwQSwKKwkweDA0QTIwNiwgMHgwMDAwMDcsIDB4MDAyMThELCAweDAwMDgxMCwKKwkweDA4MDQzQSwgMHgyMUMyMDYsIDB4MDAwMDA3LCAweDAwMDdGRCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDAyOTM4NiwKKwkweDAwMDE5NSwgMHgwOTBEMDQsIDB4MDAwMDA3LCAweDAwMDgyMCwKKwkweDAwMDBGNSwgMHgwMDBCN0QsIDB4MDFGMDYwLCAweDAwMDBGRCwKKwkweDAzMjIwNiwgMHgwMTgwNDAsIDB4MDAwQTdELCAweDAzODA0MiwKKwkweDEzODA0QSwgMHgxODAwMEEsIDB4MDAxODIwLCAweDA1OTA2MCwKKwkweDA1ODg2MCwgMHgwMTgwNDAsIDB4MDAwMEZELCAweDAxODA0MiwKKwkweDcwMDAwQSwgMHgwMDAxMTUsIDB4MDcxMTQ0LCAweDAzMjM4NiwKKwkweDAzMDAwMCwgMHgwMDcwMjAsIDB4MDM0QTA2LCAweDAxODA0MCwKKwkweDAwMzQ4RCwgMHgwMDA4MTAsIDB4MDgwNDNBLCAweDIxRUEwNiwKKwkweDAwMDAwNywgMHgwMkQzOEQsIDB4MDAwODEwLCAweDE4MDQzQSwKKwkweDAxODIwNiwgMHgwMDAwMDcsIDB4MjQwMDA3LCAweDAwMEY4RCwKKwkweDAwMDgxMCwgMHgwMDE2M0EsIDB4MDAyNDAyLCAweDAwNUMwMiwKKwkweDAwMjhGRCwgMHgwMDAwMjAsIDB4MDE4MDQwLCAweDA4MDAwRCwKKwkweDAwMDgxNSwgMHg1MTA5ODQsIDB4MDAwMDA3LCAweDAwMDA0RCwKKwkweDAwMEU1RCwgMHgwMDBFMDIsIDB4MDA0MThELCAweDAwMDgxMCwKKwkweDA4MDQzQSwgMHgyQzhBMDYsIDB4MDAwMDA3LCAweDAwMDA4RCwKKwkweDAwMDkyNCwgMHgwMDBGMDIsIDB4MDA0NThELCAweDAwMDgxMCwKKwkweDA4MDQzQSwgMHgyQzhBMDYsIDB4MDAwMDA3LCAweDAwMzg3RCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAxMDE1LCAweDAxMDk4NCwKKwkweDAxODM4NiwgMHgwMDAwMDcsIDB4MDFBQTA2LCAweDAwMDAwNywKKwkweDAwMDhGRCwgMHgwMTgwNDIsIDB4MTgwMDBBLCAweDAwMTkwNCwKKwkweDIxODA4NiwgMHgyODAwMDcsIDB4MDAxODEwLCAweDI4MDQzQSwKKwkweDI4MEMwMiwgMHgwMDAwMEQsIDB4MDAwODEwLCAweDI4MTQzQSwKKwkweDA4ODA4RCwgMHgwMDA4MjAsIDB4MDAwMkZELCAweDAxODA0MCwKKwkweDIwMDAwNywgMHgwMDAyMEQsIDB4MTg5OTA0LCAweDAwMDAwNywKKwkweDAwNDAyRCwgMHgwMDAwQkQsIDB4MDAwMkZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MDU1QTg2LCAweDAwMDAwNywKKwkweDAwMDEwMCwgMHgwMDBBMjAsIDB4MDAwNDdELCAweDAxODA0MCwKKwkweDAxODA0MiwgMHgyMDAwMEEsIDB4MDAzMDE1LCAweDAxMjE0NCwKKwkweDAzNDk4NiwgMHgwMDAwMDcsIDB4MDAyMTA0LCAweDAzNDk4NiwKKwkweDAwMDAwNywgMHgwMDBGOEQsIDB4MDAwODEwLCAweDI4MEMzQSwKKwkweDAyMzk0NCwgMHgwNkM5ODYsIDB4MDAwMDA3LCAweDAwMTgxMCwKKwkweDI4MDQzQSwgMHgwODgxMEQsIDB4MDAwODIwLCAweDAwMDJGRCwKKwkweDAxODA0MCwgMHgyMDAwMDcsIDB4MDAyODEwLCAweDc4MDAzQSwKKwkweDAwNjg4RCwgMHgwMDA4MTAsIDB4MDgwNDNBLCAweDI4OEEwNiwKKwkweDAwMDAwNywgMHgwMDQwMEQsIDB4MDAxMDE1LCAweDE4OTkwNCwKKwkweDI5MjkwNCwgMHgzOTM5MDQsIDB4MDAwMDA3LCAweDA2MDIwNiwKKwkweDAwMDAwNywgMHgwMDA0RjUsIDB4MDAwMDdELCAweDAwMDAyMCwKKwkweDAwMDA4RCwgMHgwMTA4NjAsIDB4MDE4MDQwLCAweDAwMDQ3RCwKKwkweDAzODA0MiwgMHgyMTgwNEEsIDB4MTgwMDBBLCAweDAyMTk0NCwKKwkweDIxNTg4NiwgMHgwMDAwMDcsIDB4MDA0MDc1LCAweDcxRjEwNCwKKwkweDAwMDAwNywgMHgwMTAwNDIsIDB4MjgwMDBBLCAweDAwMjkwNCwKKwkweDIxMjA4NiwgMHgwMDAwMDcsIDB4MDAzQzBELCAweDMwQTkwNCwKKwkweDAwMDAwNywgMHgwMDA3N0QsIDB4MDE4MDQyLCAweDA4MDAwQSwKKwkweDAwMDkwNCwgMHgwN0RBODYsIDB4MDAwNTdELCAweDAwMjgyMCwKKwkweDAzQjA2MCwgMHgwN0YyMDYsIDB4MDE4MDQwLCAweDAwMzAyMCwKKwkweDAzQTg2MCwgMHgwMTgwNDAsIDB4MDAwMkZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MDdGQTg2LCAweDAwMDAwNywKKwkweDAwMDU3RCwgMHgwMTgwNDIsIDB4MjgwNDBBLCAweDAwMEU4RCwKKwkweDAwMDgxMCwgMHgyODBDM0EsIDB4MDAwMDBELCAweDAwMDgxMCwKKwkweDI4MTQzQSwgMHgwOTAwMEQsIDB4MDAwODIwLCAweDAwMDJGRCwKKwkweDAxODA0MCwgMHgyMDAwMDcsIDB4MDAzREZELCAweDAwMDAyMCwKKwkweDAxODA0MCwgMHgwMDEwN0QsIDB4MDA4RDhELCAweDAwMDgxMCwKKwkweDA4MDQzQSwgMHgyODhBMDYsIDB4MDAwMDA3LCAweDAwMDgxNSwKKwkweDA4MDAxQSwgMHgwMTA5ODQsIDB4MDk1MTg2LCAweDAwMTM3RCwKKwkweDIwMDUwMCwgMHgyODBGMjAsIDB4MzM4RjYwLCAweDNCOEY2MCwKKwkweDQzOEY2MCwgMHg0QjhGNjAsIDB4NTM4RjYwLCAweDVCOEY2MCwKKwkweDAzOEE2MCwgMHgwMTgwNDAsIDB4MDA3RkJELCAweDM4M0RDNCwKKwkweDAwMDAwNywgMHgwMDFBN0QsIDB4MDAxMzc1LCAweDAxODA0MiwKKwkweDA5MDA0QSwgMHgxMDAwMEEsIDB4MEI4RDA0LCAweDEzOTUwNCwKKwkweDAwMDAwNywgMHgwMDA4MjAsIDB4MDE5MDYwLCAweDAwMTEwNCwKKwkweDIxMjA4NiwgMHgwMTAwNDAsIDB4MDAxN0ZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjEyMjg2LCAweDAwMDAwNywKKwkweDAwMTk3RCwgMHgwMzgwNDIsIDB4MDk4MDRBLCAweDEwMDAwQSwKKwkweDAwMDkyNCwgMHgwMDE2NjQsIDB4MDAxMUZELCAweDAzODA0MiwKKwkweDJCODA0QSwgMHgxOTgwNEEsIDB4MDAwMDhELCAweDIxODk0NCwKKwkweDAwMDAwNywgMHgwMDIyNDQsIDB4MEFFMTg2LCAweDAwMDAwNywKKwkweDAwMUE2NCwgMHgwMDJBMjQsIDB4MDAxOTdELCAweDA4MDEwMiwKKwkweDEwMDEyMiwgMHgwMDA4MjAsIDB4MDM5MDYwLCAweDAxODA0MCwKKwkweDAwM0RGRCwgMHgwMDAwOEQsIDB4MDAwODIwLCAweDAxODA0MCwKKwkweDAwMTM3NSwgMHgwMDFBN0QsIDB4MDEwMDQyLCAweDA5ODA0QSwKKwkweDEwMDAwQSwgMHgwMDAyMUQsIDB4MDE4OUU0LCAweDI5OTJFNCwKKwkweDMwOTE0NCwgMHgwMDAwMDcsIDB4MDAwNjBELCAweDAwMEExNSwKKwkweDAwMEMxRCwgMHgwMDEwMjUsIDB4MDBBOUU0LCAweDAxMkJFNCwKKwkweDAwMDQ2NCwgMHgwMUIzRTQsIDB4MDIzMkU0LCAweDAwMDQ2NCwKKwkweDAwMDQ2NCwgMHgwMDA0NjQsIDB4MDAwNDY0LCAweDAwMDQwRCwKKwkweDA4QjFDNCwgMHgwMDAwMDcsIDB4MDAwODIwLCAweDAwMEJGNSwKKwkweDAzMDA0MCwgMHgwMDE5N0QsIDB4MDM4MDQyLCAweDA5ODA0QSwKKwkweDAwMEEyNCwgMHgwODAwMEEsIDB4MDgwRTY0LCAweDAwMDAwNywKKwkweDEwMDEyMiwgMHgwMDA4MjAsIDB4MDMxMDYwLCAweDAxMDA0MCwKKwkweDAwNjRBQywgMHgwMDAyN0QsIDB4MDAwMDIwLCAweDAxODA0MCwKKwkweDAwMTA3RCwgMHgwMTgwNDIsIDB4MDAxMUZELCAweDNCODA0QSwKKwkweDA5ODA0QSwgMHgyMDAwMEEsIDB4MDAwMDk1LCAweDFBMTE0NCwKKwkweDAwQTE0NCwgMHgwRDIwODYsIDB4MDAwNDBELCAweDAwQjk4NCwKKwkweDBEMjE4NiwgMHgwMDE4RkQsIDB4MDE4MDQyLCAweDAwMTBGRCwKKwkweDA5ODA0QSwgMHgyODAwMEEsIDB4MDAwMDk1LCAweDAxMDkyNCwKKwkweDAwMkE2NCwgMHgwRDExODYsIDB4MDAwMDA3LCAweDAwMjkwNCwKKwkweDBEMjI4NiwgMHgwMDAwMDcsIDB4MEQyQTA2LCAweDA4MDAwMiwKKwkweDAwMDA4RCwgMHgwMDM4N0QsIDB4MDAwODIwLCAweDAxODA0MCwKKwkweDAwMTI3RCwgMHgwMTgwNDIsIDB4MTAwMDBBLCAweDAwMzkwNCwKKwkweDBERDE4NiwgMHgwMDA4MEQsIDB4N0ZGRkI1LCAweDAwQjk4NCwKKwkweDBEQTE4NiwgMHgwMDAwMjUsIDB4MEU3QTA2LCAweDAwMDAyRCwKKwkweDAwMDAxNSwgMHgwMDA4MkQsIDB4MDJDNzhELCAweDAwMDgyMCwKKwkweDBFQzIwNiwgMHgwMDAwMEQsIDB4N0Y4MDM1LCAweDAwQjk4NCwKKwkweDBFNzE4NiwgMHg0MDAwMjUsIDB4MDAwMDhELCAweDExMDk0NCwKKwkweDAwMDAwNywgMHgwMDAxOEQsIDB4MTA5NTA0LCAweDAwMDAwNywKKwkweDAwOTE2NCwgMHgwMDA0MjQsIDB4MDAwNDI0LCAweDAwMDQyNCwKKwkweDEwMDEwMiwgMHgyODAwMDIsIDB4MDJDNjhELCAweDAwMDgyMCwKKwkweDBFQzIwNiwgMHgwMDAxOEQsIDB4MDAwNDJELCAweDAwMDA4RCwKKwkweDEwOTUwNCwgMHgwMDAwMDcsIDB4MDAwMjBELCAweDEwOTE4NCwKKwkweDAwMDAwNywgMHgwMkM3MEQsIDB4MDAwODIwLCAweDAwMDA4RCwKKwkweDAwMzhGRCwgMHgwMTgwNDAsIDB4MDAzQkZELCAweDAwMTAyMCwKKwkweDAzQTg2MCwgMHgwMDA4MTUsIDB4MzEzMTg0LCAweDIxMjE4NCwKKwkweDAwMDAwNywgMHgwM0IwNjAsIDB4MDNBMDYwLCAweDAxODA0MCwKKwkweDAwMjJGRCwgMHgwMDAwOTUsIDB4MDEwOTI0LCAweDAwMDQyNCwKKwkweDAwMDQyNCwgMHgwMDEyNjQsIDB4MTAwMTAyLCAweDAwMDgyMCwKKwkweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAxOTI0LCAweDAwRkI4RCwKKwkweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLCAweDAzODA0MiwKKwkweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLCAweDAwMDQyNCwKKwkweDAwMDQyNCwgMHgwMDExN0QsIDB4MDE4MDQyLCAweDA4MDAwQSwKKwkweDAwMEEyNCwgMHgyODA1MDIsIDB4MjgwQzAyLCAweDA5ODAwRCwKKwkweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLCAweDIwMDAwNywKKwkweDAwMjJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDA5NSwKKwkweDI4MERDNCwgMHgwMTE5MjQsIDB4MDAxOTdELCAweDAxODA0MiwKKwkweDAwMTFGRCwgMHgwOTgwNEEsIDB4MTAwMDBBLCAweDAwMDBCNSwKKwkweDExMzE0NCwgMHgwQThEMDQsIDB4MDAwMDA3LCAweDA4MEE0NCwKKwkweDEyOTUwNCwgMHgwMDAwMDcsIDB4MDAyM0ZELCAweDAwMTAyMCwKKwkweDAzODA0MCwgMHgxMDEyNDQsIDB4MDAwMDA3LCAweDAwMDgyMCwKKwkweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAwMkZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MTBGQTg2LCAweDAwMDAwNywKKwkweDAwM0JGRCwgMHgwMDAxMDAsIDB4MDAwQTEwLCAweDBCODA3QSwKKwkweDEzODA0QSwgMHgwOTA5ODQsIDB4MDAwMDA3LCAweDAwMDA5NSwKKwkweDAxM0QwNCwgMHgxMTgwODYsIDB4MTAwMDBBLCAweDEwMDAwMiwKKwkweDA5MDk4NCwgMHgwMDAwMDcsIDB4MDM4MDQyLCAweDExODA0QSwKKwkweDA5MEQwNCwgMHgwMDAwMDcsIDB4MTAwMDBBLCAweDA5MEQ4NCwKKwkweDAwMDAwNywgMHgwMDI1N0QsIDB4MDAwODIwLCAweDAxODA0MCwKKwkweDAwMDEwRCwgMHgwMDA4MTAsIDB4MjgxNDNBLCAweDAwMTI3RCwKKwkweDAxODA0MiwgMHgyMDAwMEEsIDB4MDAxOTdELCAweDAxODA0MiwKKwkweDAwMTE3RCwgMHgzMTgwNEEsIDB4MTAwMDBBLCAweDAwMzEyNCwKKwkweDAxMjgwRCwgMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwKKwkweDAzODA0MiwgMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwKKwkweDMwMDEwMiwgMHgwMDMxMjQsIDB4MDAwNDI0LCAweDAwMDQyNCwKKwkweDAwMTIyNCwgMHgyODA1MDIsIDB4MDAxQTRDLCAweDEzMDE4NiwKKwkweDcwMDAwMiwgMHgwMDAwMkQsIDB4MDMwMDAwLCAweDAwMzg3RCwKKwkweDAxODA0MiwgMHgxMDAwMEEsIDB4MTMyQTA2LCAweDAwMjEyNCwKKwkweDAwMDBBRCwgMHgxMDAwMDIsIDB4MDAwMTBELCAweDAwMDkyNCwKKwkweDAwNkIyNCwgMHgwMTM2OEQsIDB4MDAzOTdELCAweDAwMDgyMCwKKwkweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLCAweDAwMDYwNiwKKwkweDA4MDQwQSwgMHgwMDMyNjQsIDB4MDAwMDhELCAweDAwMEEyNCwKKwkweDAwMTAyMCwgMHgwMDIyN0QsIDB4MDE4MDQwLCAweDAxM0MwRCwKKwkweDAwMDgxMCwgMHgwODA0M0EsIDB4MjlEMjA2LCAweDAwMDAwNywKKwkweDAwMjgyMCwgMHgwMDIwN0QsIDB4MDE4MDQwLCAweDAwMTE3RCwKKwkweDAzODA0MiwgMHgxMzgwNEEsIDB4MzM4MDBBLCAweDAwMzg3RCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDE2M0E4NiwKKwkweDAwMDAwNywgMHgwMDAwOEQsIDB4MDMwOTY0LCAweDAxNDc4RCwKKwkweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLCAweDAzODA0MiwKKwkweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLCAweDM4MDEwMiwKKwkweDAwMDQyNCwgMHgwMDA0MjQsIDB4MDAxMjI0LCAweDAwMDJGRCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDE0QTI4NiwKKwkweDAwMDAwNywgMHgyODA1MDIsIDB4MDAxQTRDLCAweDE2Mzk4NiwKKwkweDAwMDAwNywgMHgwMzIxNjQsIDB4MDA2MzJDLCAweDAwM0RGRCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwMDk1LCAweDA5MDkwNCwKKwkweDAwMDAwNywgMHgwMDA4MjAsIDB4MDAxQTRDLCAweDE1NjE4NiwKKwkweDAxODA0MCwgMHgwMzAwMDAsIDB4MTU3QTA2LCAweDAwMjEyNCwKKwkweDAwMDEwRCwgMHgwMDA5MjQsIDB4MDA2QjI0LCAweDAxNUI4RCwKKwkweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLCAweDAzODA0MiwKKwkweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLCAweDAwM0E2NCwKKwkweDAwMDA5NSwgMHgwMDEyMjQsIDB4MDAwMkZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MTVEQTg2LCAweDAwMDAwNywKKwkweDAxNjI4RCwgMHgwMDA4MTAsIDB4MDgwNDNBLCAweDI5RDIwNiwKKwkweDAwMDAwNywgMHgxNEQyMDYsIDB4MDAwMDA3LCAweDAwNzAyMCwKKwkweDA4MDEwQSwgMHgxMDAxMkEsIDB4MDAyMEZELCAweDAzODg2MCwKKwkweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAyMjdELCAweDAxODA0MiwKKwkweDAwM0RGRCwgMHgwODAwMEEsIDB4MzE4NDRBLCAweDAwMDkwNCwKKwkweDE2RDg4NiwgMHgxODAwOEIsIDB4MDAwMDhELCAweDE4OTkwNCwKKwkweDAwMzEyQywgMHgxN0FBMDYsIDB4MDAwMDA3LCAweDAwMzI0QywKKwkweDE3MzM4NiwgMHgwMDAwMDcsIDB4MDAxOTA0LCAweDE3MzA4NiwKKwkweDAwMDAwNywgMHgwMDAwOTUsIDB4MTk5MTQ0LCAweDAwMjIyQywKKwkweDAwMzEyNCwgMHgwMDYzNkMsIDB4MDAwRTNELCAweDAwMTM3NSwKKwkweDAwMEJGRCwgMHgwMTAwNDIsIDB4MDk4MDRBLCAweDEwMDAwQSwKKwkweDAzOEFFQywgMHgwMzkzRUMsIDB4MDAyMjRDLCAweDE3QTk4NiwKKwkweDAwMDAwNywgMHgwMDAwOEQsIDB4MTg5OTA0LCAweDAwMjI2QywKKwkweDAwMzIyQywgMHgzMDA1MEEsIDB4MzAxREFCLCAweDAwMjA4MywKKwkweDAwMThGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAxODkyNCwKKwkweDMwMDUwMiwgMHgwMDEwODMsIDB4MDAxODc1LCAweDAxMDA0MiwKKwkweDEwMDAwQSwgMHgwMDAwOEQsIDB4MDEwOTI0LCAweDAwMTM3NSwKKwkweDMzMDU0MiwgMHgzMzBDQ0IsIDB4MzMyQ0NCLCAweDMzMzRDQiwKKwkweDMzM0NDQiwgMHgzMzQ0Q0IsIDB4MzM0Q0NCLCAweDMzNTRDQiwKKwkweDMwNUM4QiwgMHgwMDYwODMsIDB4MDAwMkY1LCAweDAxMDA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MTg3QTg2LCAweDAwMDAwNywKKwkweDAwMUUyRCwgMHgwMDA1RkQsIDB4MDE4MDQyLCAweDA4MDAwQSwKKwkweDAyODkyNCwgMHgyODA1MDIsIDB4MDAwNjBELCAweDAwMDgxMCwKKwkweDI4MEMzQSwgMHgwMDAwOEQsIDB4MDAwODEwLCAweDI4MTQzQSwKKwkweDBBODA4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwKKwkweDIyMDAwNywgMHgwMDEyNzUsIDB4MDMwMDQyLCAweDIxMDA0QSwKKwkweDAwMDA4RCwgMHgxQTA5NDQsIDB4MDAwMDA3LCAweDAxOTgwRCwKKwkweDAwMDgxMCwgMHgwODA0M0EsIDB4MkIyMjA2LCAweDAwMDAwNywKKwkweDAwMDFGNSwgMHgwMzAwNDIsIDB4MEQwMDRBLCAweDEwMDAwQSwKKwkweDA4OTE0NCwgMHgwMDAwMDcsIDB4MDAwODIwLCAweDAxMDA0MCwKKwkweDAwMjVGNSwgMHgwQTMxNDQsIDB4MDAwMDA3LCAweDAwMDgyMCwKKwkweDAzMjg2MCwgMHgwMzAwNDAsIDB4MDAyMTdELCAweDAzODA0MiwKKwkweDBCODA0QSwgMHgxMDAwMEEsIDB4MDAwODIwLCAweDAzMTA2MCwKKwkweDAzMDA0MCwgMHgwMDAwOEQsIDB4MDAwMTI0LCAweDAwMDEyQywKKwkweDAwMEU2NCwgMHgwMDFBNjQsIDB4MDA2MzZDLCAweDA4MDEwQSwKKwkweDEwMDEyQSwgMHgwMDA4MjAsIDB4MDMxMDYwLCAweDAzMDA0MCwKKwkweDAwMjBGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMjI3RCwKKwkweDAxODA0MiwgMHgxMDAwMEEsIDB4MDAwODIwLCAweDAzMTA2MCwKKwkweDAzMDA0MCwgMHgwMDE5N0QsIDB4MDE4MDQyLCAweDA4MDAwQSwKKwkweDAwMjJGRCwgMHgwMzgwNDIsIDB4MTAwMDBBLCAweDAwMDgyMCwKKwkweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDkwRDA0LCAweDAwMDAwNywKKwkweDAwMDgyMCwgMHgwMzAwNDAsIDB4MDM4MDQyLCAweDBCODA0QSwKKwkweDEwMDAwQSwgMHgwMDA4MjAsIDB4MDMxMDYwLCAweDAzMDA0MCwKKwkweDAzODA0MiwgMHgxMzgwNEEsIDB4MTk4MDRBLCAweDExMEQwNCwKKwkweDE5OEQwNCwgMHgwMDAwMDcsIDB4MDgwMDBBLCAweDAwMTAyMCwKKwkweDAzMTg2MCwgMHgwMzA4NjAsIDB4MDMwMDQwLCAweDAwMDA4RCwKKwkweDBCMDk0NCwgMHgwMDAwMDcsIDB4MDAwODIwLCAweDAxMDA0MCwKKwkweDAwMDVGNSwgMHgwMzAwNDIsIDB4MDgwMDBBLCAweDAwMDgyMCwKKwkweDAxMDA0MCwgMHgwMDAwRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwKKwkweDAwMDkwNCwgMHgxQzYwODYsIDB4MDAxRTc1LCAweDAzMDA0MiwKKwkweDAxMDQ0QSwgMHgwMDBDMEEsIDB4MUM3MjA2LCAweDAwMDAwNywKKwkweDAwMDQwMiwgMHgwMDBDMDIsIDB4MDAxNzdELCAweDAwMUFGNSwKKwkweDAxODA0MiwgMHgwMzE0NEEsIDB4MDMxQzRBLCAweDAzMjQ0QSwKKwkweDAzMkM0QSwgMHgwMzM0NEEsIDB4MDMzQzRBLCAweDAzNDQ0QSwKKwkweDAwNEMwQSwgMHgwMDA0M0QsIDB4MDAxM0Y1LCAweDAwMUFGRCwKKwkweDAzMDA0MiwgMHgwQjAwNEEsIDB4MUI4MDRBLCAweDEzODA0QSwKKwkweDIwMDAwQSwgMHgwODkxNDQsIDB4MTlBMTQ0LCAweDAzODlFNCwKKwkweDAzOTlFQywgMHgwMDU1MDIsIDB4MDA1RDBBLCAweDAzMDA0MiwKKwkweDBCMDA0QSwgMHgxQjgwNEEsIDB4MTM4MDRBLCAweDIwMDAwQSwKKwkweDA4OTE0NCwgMHgxOUExNDQsIDB4MDM4OUU0LCAweDAzOTlFQywKKwkweDAwNjUwMiwgMHgwMDZEMEEsIDB4MDMwMDQyLCAweDBCMDA0QSwKKwkweDE5MDA0QSwgMHgyQjgwNEEsIDB4MTM4MDRBLCAweDIxODA0QSwKKwkweDMwMDAwQSwgMHgwODkxNDQsIDB4MTlBMTQ0LCAweDJBQjE0NCwKKwkweDAzODlFNCwgMHgwMzk5RUMsIDB4MDA3NTAyLCAweDAwN0QwQSwKKwkweDAzQTlFNCwgMHgwMDA3MDIsIDB4MDAxMDdELCAweDAwMDQxNSwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDEwOUU0LCAweDAwMEYwMiwKKwkweDAwMkFGNSwgMHgwMDE5RkQsIDB4MDEwMDQyLCAweDA5ODA0QSwKKwkweDEwMDAwQSwgMHgwMDA5MzQsIDB4MDAxNjc0LCAweDAwMjlGNSwKKwkweDAxMDA0MiwgMHgxMDAwMEEsIDB4MDA5MTdDLCAweDAwMjA3NSwKKwkweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDFFRDI4NiwKKwkweDAwMjZGNSwgMHgwMDI3RjUsIDB4MDMwMDQyLCAweDA5MDA0QSwKKwkweDEwMDAwQSwgMHgwMDBBM0MsIDB4MDAxNjdDLCAweDAwMUE3NSwKKwkweDAwMEJGRCwgMHgwMTAwNDIsIDB4NTE4MDRBLCAweDQ4MDAwQSwKKwkweDE2MDAwNywgMHgwMDEwNzUsIDB4MDEwMDQyLCAweDI4MkMwQSwKKwkweDI4MUQxMiwgMHgyODI1MTIsIDB4MDAxRjMyLCAweDFFMDAwNywKKwkweDBFMDAwNywgMHgwMDE5NzUsIDB4MDEwMDQyLCAweDAwMkRGNSwKKwkweDBEMDA0QSwgMHgxMDAwMEEsIDB4MDA5MTQ0LCAweDFGQjI4NiwKKwkweDAxMDA0MiwgMHgyODM0MEEsIDB4MDAwRTVELCAweDAwMDA4RCwKKwkweDAwMDM3NSwgMHgwMDA4MjAsIDB4MDEwMDQwLCAweDA1RDJGNCwKKwkweDU0RDEwNCwgMHgwMDczNUMsIDB4MjA1Mzg2LCAweDAwMDAwNywKKwkweDBDMDAwNywgMHgwODAwMDcsIDB4MEEwMDA3LCAweDAyMDQwRCwKKwkweDAwMDgxMCwgMHgwODA0M0EsIDB4MzMyMjA2LCAweDAwMDAwNywKKwkweDIwNUEwNiwgMHgwMDAwMDcsIDB4MDgwMDA3LCAweDAwMjI3NSwKKwkweDAxMDA0MiwgMHgyMDAwMEEsIDB4MDAyMTA0LCAweDIxMjA4NiwKKwkweDAwMUUyRCwgMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwKKwkweDAwMDkwNCwgMHgyMDkyODYsIDB4MDAwMDA3LCAweDAwMjAxMCwKKwkweDMwMDQzQSwgMHgwMDA1N0QsIDB4MDE4MEMzLCAweDA4MDAwQSwKKwkweDAyODkyNCwgMHgyODA1MDIsIDB4MjgwQzAyLCAweDBBODEwRCwKKwkweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLCAweDIyMDAwNywKKwkweDAwMDRGRCwgMHgwMTgwNDIsIDB4NzAwMDBBLCAweDAzMDAwMCwKKwkweDAwNzAyMCwgMHgwNkZBMDYsIDB4MDE4MDQwLCAweDAyMTgwRCwKKwkweDAwMDgxMCwgMHgwODA0M0EsIDB4MkIyMjA2LCAweDAwMDAwNywKKwkweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwKKwkweDIxOEE4NiwgMHgwMDAwMDcsIDB4MDFGMjA2LCAweDAwMDAwNywKKwkweDAwMDg3NSwgMHgwMDA5RkQsIDB4MDAwMTBELCAweDIyMEEwNiwKKwkweDAwMDI5NSwgMHgwMDBCNzUsIDB4MDAwOTdELCAweDAwMDAwRCwKKwkweDAwMDUxNSwgMHgwMTAwNDIsIDB4MTgwMDBBLCAweDAwMTkwNCwKKwkweDI4Nzg4NiwgMHgwMDA2RjUsIDB4MDAxMDIwLCAweDAxMDA0MCwKKwkweDAwMDRGNSwgMHgwMDA4MjAsIDB4MDEwMDQwLCAweDAwMDc3NSwKKwkweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLCAweDAwMTEyNCwKKwkweDAwMDkwNCwgMHgyMkJBODYsIDB4MDAwODE1LCAweDA4MDEwMiwKKwkweDEwMTIwNCwgMHgyMkRBMDYsIDB4MDAwNTc1LCAweDA4MTIwNCwKKwkweDAwMDAwNywgMHgxMDAxMDIsIDB4MDAwNTc1LCAweDAwMDQyNSwKKwkweDAyMTEyNCwgMHgxMDAxMDIsIDB4MDAwODIwLCAweDAzMTA2MCwKKwkweDAxMDA0MCwgMHgwMDE5MjQsIDB4Mjg3ODg2LCAweDAwMDA4RCwKKwkweDAwMDQ2NCwgMHgwMDlEMDQsIDB4Mjc4ODg2LCAweDE4MDEwMiwKKwkweDAwMDU3NSwgMHgwMTAwNDIsIDB4MjgwNDBBLCAweDAwMDE4RCwKKwkweDAwMDkyNCwgMHgyODBEMDIsIDB4MDAwMDBELCAweDAwMDkyNCwKKwkweDI4MTUwMiwgMHgxMDAwMEQsIDB4MDAwODIwLCAweDAwMDJGNSwKKwkweDAxMDA0MCwgMHgyMDAwMDcsIDB4MDAxMTc1LCAweDAwMDJGRCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDIzQzI4NiwKKwkweDAwMDAwNywgMHgwMDAxMDAsIDB4MDgwQjIwLCAweDEzMEI2MCwKKwkweDFCMEI2MCwgMHgwMzBBNjAsIDB4MDEwMDQwLCAweDA1MDA0MiwKKwkweDNEMDA0QSwgMHgzNTAwNEEsIDB4MkQwMDRBLCAweDIwMDAwQSwKKwkweDAwMDZGNSwgMHgwMTAwNDIsIDB4MjgxNDBBLCAweDAwMDRGNSwKKwkweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwMzE1LCAweDAxMEQwNCwKKwkweDI0Q0E4NiwgMHgwMDQwMTUsIDB4MDAwMDk1LCAweDAxMEQwNCwKKwkweDI0Qjg4NiwgMHgxMDAwMjIsIDB4MTAwMDJBLCAweDI0RTIwNiwKKwkweDAwMDAwNywgMHgzMzMxMDQsIDB4MkFBOTA0LCAweDAwMDAwNywKKwkweDAzMjEyNCwgMHgyODA1MDIsIDB4MDAxMTI0LCAweDAwMDQyNCwKKwkweDAwMDQyNCwgMHgwMDMyMjQsIDB4MDAyOTJDLCAweDAwNjM2QywKKwkweDI1RjM4NiwgMHgwMDAwMDcsIDB4MDJCMTY0LCAweDAwMDQ2NCwKKwkweDAwMDQ2NCwgMHgwMDAwOEQsIDB4MDAwQTY0LCAweDI4MEQwMiwKKwkweDEwMDA4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwKKwkweDIyMDAwNywgMHgwMDAwOEQsIDB4MzhCOTA0LCAweDAwMDAwNywKKwkweDAzMjk2QywgMHgzMDAxMEEsIDB4MDAwMkY1LCAweDAxMDA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjVCQTg2LCAweDAwMDAwNywKKwkweDAyMzEyQywgMHgyODA1MEEsIDB4MDAwMDhELCAweDAxMDk2QywKKwkweDI4MEQwQSwgMHgxMDAxMEQsIDB4MDAwODIwLCAweDAwMDJGNSwKKwkweDAxMDA0MCwgMHgyMjAwMDcsIDB4MDAxMTI0LCAweDAwMDQyNCwKKwkweDAwMDQyNCwgMHgwMDMyMjQsIDB4MzAwMTAyLCAweDAzMjk0NCwKKwkweDI2N0E4NiwgMHgwMDAwMDcsIDB4MzAwMDAyLCAweDAwMDRGNSwKKwkweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwMzE1LCAweDAxMEQwNCwKKwkweDI2QzA4NiwgMHgwMDMxMjQsIDB4MDAwNDY0LCAweDMwMDEwMiwKKwkweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwKKwkweDI2Q0E4NiwgMHgwMDAwMDcsIDB4MDAzMTI0LCAweDMwMDUwMiwKKwkweDAwMzkyNCwgMHgzMDA1ODMsIDB4MDAwODgzLCAweDAwMDVGNSwKKwkweDAxMDA0MiwgMHgyODA0MEEsIDB4MDAwMDhELCAweDAwODEyNCwKKwkweDI4MEQwMiwgMHgwMDAwOEQsIDB4MDA4MTI0LCAweDI4MTUwMiwKKwkweDEwMDE4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwKKwkweDIyMDAwNywgMHgwMDEwMjUsIDB4MDAwNTc1LCAweDAzMDA0MiwKKwkweDA5MDA0QSwgMHgxMDAwMEEsIDB4MEEwOTA0LCAweDEyMTEwNCwKKwkweDAwMDAwNywgMHgwMDEwMjAsIDB4MDUwODYwLCAweDA1MDA0MCwKKwkweDAwMDZGRCwgMHgwMTgwNDIsIDB4MDkwMDRBLCAweDEwMDAwQSwKKwkweDAwMDBBNSwgMHgwQTA5MDQsIDB4MTIxMTA0LCAweDAwMDAwNywKKwkweDAwMDgyMCwgMHgwMTkwNjAsIDB4MDEwMDQwLCAweDAwMDJGNSwKKwkweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDI4NDI4NiwKKwkweDAwMDAwNywgMHgyMzBBMDYsIDB4MDAwMDA3LCAweDAwMDYwNiwKKwkweDAwMDAwNywgMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwKKwkweDAwMDkwNCwgMHgyODkyODYsIDB4MDAwMDA3LCAweDAwMDEwMCwKKwkweDA4MEIyMCwgMHgxMzhCNjAsIDB4MUI4QjYwLCAweDIzOEI2MCwKKwkweDJCOEI2MCwgMHgzMzhCNjAsIDB4M0I4QjYwLCAweDQzOEI2MCwKKwkweDRCOEI2MCwgMHg1MzhCNjAsIDB4NUI4QjYwLCAweDYzOEI2MCwKKwkweDZCOEI2MCwgMHg3MzhCNjAsIDB4N0I4QjYwLCAweDAzOEY2MCwKKwkweDBCOEY2MCwgMHgxMzhGNjAsIDB4MUI4RjYwLCAweDIzOEY2MCwKKwkweDJCOEY2MCwgMHgzMzhGNjAsIDB4M0I4RjYwLCAweDQzOEY2MCwKKwkweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLCAweDYzOEY2MCwKKwkweDZCOEY2MCwgMHg3MzhGNjAsIDB4N0I4RjYwLCAweDAzOEE2MCwKKwkweDAwMDYwNiwgMHgwMTgwNDAsIDB4MDAwMDhELCAweDAwMEE2NCwKKwkweDI4MEQwMiwgMHgwMDBBMjQsIDB4MDAwMjdELCAweDAxODA0MiwKKwkweDEwMDAwQSwgMHgwMDEyMjQsIDB4MDAwM0ZELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkE4Mjg2LCAweDAwMDAwNywKKwkweDAwMDE4RCwgMHgwMDBBMjQsIDB4MDAwNDY0LCAweDAwMDQ2NCwKKwkweDA4MDEwMiwgMHgwMDA5MjQsIDB4MDAwNDI0LCAweDAwMDQyNCwKKwkweDEwMDEwMiwgMHgwMjAwMEQsIDB4MDA5MTQ0LCAweDJBRDk4NiwKKwkweDAwMDAwNywgMHgwMDAxRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwKKwkweDAwMEE0NCwgMHgyQUJCODYsIDB4MDE4MDQyLCAweDBBMDAwRCwKKwkweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLCAweDIwMDAwNywKKwkweDAwMDI3RCwgMHgwMDEwMjAsIDB4MDAwNjA2LCAweDAxODA0MCwKKwkweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwKKwkweDJCMkE4NiwgMHgwMDAwMDcsIDB4MDAwMzdELCAweDAxODA0MiwKKwkweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkI1QTg2LCAweDAwMDAwNywKKwkweDAwMDA3NSwgMHgwMDJFN0QsIDB4MDEwMDQyLCAweDBCODA0QSwKKwkweDAwMDAyMCwgMHgwMDA5MDQsIDB4MDAwNjg2LCAweDAxMDA0MCwKKwkweDMxODQ0QSwgMHgzMDA0OEIsIDB4MDAwODgzLCAweDAwMDA4RCwKKwkweDAwMDgxMCwgMHgyODE0M0EsIDB4MDAwMDhELCAweDAwMDgxMCwKKwkweDI4MEMzQSwgMHgwMDA2NzUsIDB4MDEwMDQyLCAweDA4MDAwQSwKKwkweDAwMzgxNSwgMHgwMTA5MjQsIDB4MjgwNTAyLCAweDBCMDAwRCwKKwkweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLCAweDAwMDYwNiwKKwkweDIyMDAwNywgMHgwMDA0NjQsIDB4MDAwNDY0LCAweDAwMDYwNiwKKwkweDAwMDAwNywgMHgwMDAxMzQsIDB4MDA3RjhELCAweDAwMDkzQywKKwkweDI4MUQxMiwgMHgyODI1MTIsIDB4MDAxRjMyLCAweDBFMDAwNywKKwkweDAwMDEwRCwgMHgwMDAzN0QsIDB4MDAwODIwLCAweDAxODA0MCwKKwkweDA1RDJGNCwgMHgwMDAwMDcsIDB4MDgwMDA3LCAweDAwMDM3RCwKKwkweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LCAweDJEMDI4NiwKKwkweDAwMDAwNywgMHgwMDA2MDYsIDB4MDAwMDA3LCAweDAwMDAwNywKKwkweDAwMDAxMiwgMHgxMDAwMDcsIDB4MzIwMDA3LCAweDYwMDAwNywKKwkweDEwMDA4MCwgMHg0ODAwMUEsIDB4MDA0OTA0LCAweDJENjE4NiwKKwkweDAwMDAwNywgMHgwMDEyMTAsIDB4NTgwMDNBLCAweDAwMDE0NSwKKwkweDVDNUQwNCwgMHgwMDAwMDcsIDB4MDAwMDgwLCAweDQ4MDAxQSwKKwkweDAwNDkwNCwgMHgyREIxODYsIDB4MDAwMDA3LCAweDAwMTIxMCwKKwkweDUwMDAzQSwgMHgwMDU5MDQsIDB4MkUwODg2LCAweDAwMDA0NSwKKwkweDAwMDBDNSwgMHg3RkZGRjUsIDB4N0ZGRjdELCAweDA3RDUyNCwKKwkweDAwNDIyNCwgMHg1MDAxMDIsIDB4MjAwNTAyLCAweDAwMDA4MiwKKwkweDQwMDAxQSwgMHgwMDQxMDQsIDB4MkUzOTg2LCAweDAwMDAwNywKKwkweDAwMzg2NSwgMHg0MDAwMUEsIDB4MDA0MDIwLCAweDAwMTA0RCwKKwkweDA0QzE4NCwgMHgzMDFCODYsIDB4MDAwMDQwLCAweDA0MDAwNywKKwkweDAwMDE2NSwgMHgwMDAxNDUsIDB4MDA0MDIwLCAweDAwMDA0MCwKKwkweDAwMDc2NSwgMHgwODAwODAsIDB4NDAwMDFBLCAweDAwNDEwNCwKKwkweDJFQzk4NiwgMHgwMDAwMDcsIDB4MDAxMjEwLCAweDQwMDAzQSwKKwkweDAwNDEwNCwgMHgyRjIyODYsIDB4MDAwMDRELCAweDAwMDBDRCwKKwkweDAwNDgxMCwgMHgyMDA0M0EsIDB4MDAwODgyLCAweDQwMDAxQSwKKwkweDAwNDEwNCwgMHgyRjMxODYsIDB4MDAwMDA3LCAweDAwNDgyMCwKKwkweDAwNTkwNCwgMHgzMDA4ODYsIDB4MDAwMDQwLCAweDAwMDdFNSwKKwkweDIwMDQ4MCwgMHgyODE2QTAsIDB4MzIxNkUwLCAweDNBMTZFMCwKKwkweDQyMTZFMCwgMHgwMjEyNjAsIDB4MDAwMDQwLCAweDAwMDAzMiwKKwkweDQwMDA3NSwgMHgwMDAwN0QsIDB4MDdENTc0LCAweDIwMDUxMiwKKwkweDAwMDA4MiwgMHg0MDAwMUEsIDB4MDA0MTA0LCAweDJGRTE4NiwKKwkweDAwMDAwNywgMHgwMzcyMDYsIDB4NjQwMDA3LCAweDA2MDAwNywKKwkweDAwMDBFNSwgMHgwMDAwMjAsIDB4MDAwMDQwLCAweDAwMEE2NSwKKwkweDAwMDAyMCwgMHgwMjAwNDAsIDB4MDIwMDQwLCAweDAwMDA0MCwKKwkweDAwMDE2NSwgMHgwMDAwNDIsIDB4NzAwMDBBLCAweDAwNzEwNCwKKwkweDMwQTI4NiwgMHgwMDAwMDcsIDB4MDE4MjA2LCAweDY0MDAwNywKKwkweDA1MDAwMCwgMHgwMDcwMjAsIDB4MDAwMDQwLCAweDAzNzIwNiwKKwkweDY0MDAwNywgMHgwMDAwMDcsIDB4MDAzMDZELCAweDAyODg2MCwKKwkweDAyOTA2MCwgMHgwODAwMEEsIDB4MDI4ODYwLCAweDAwODA0MCwKKwkweDEwMDAxMiwgMHgwMDEwMEQsIDB4MDA5MTg0LCAweDMxNDE4NiwKKwkweDAwMEUwRCwgMHgwMDkxODQsIDB4MzI1MTg2LCAweDAwMDAwNywKKwkweDMwMDAwNywgMHgwMDEwMjAsIDB4MDAzQjZELCAweDAwODA0MCwKKwkweDAwMDA4MCwgMHgwODAwMUEsIDB4MDAwOTA0LCAweDMxNjE4NiwKKwkweDAwMDAwNywgMHgwMDEyMjAsIDB4MDAwREVELCAweDAwODA0MCwKKwkweDAwODA0MiwgMHgxMDAwMEEsIDB4NDAwMDBELCAweDEwOTU0NCwKKwkweDAwMDAwNywgMHgwMDEwMjAsIDB4MDAwREVELCAweDAwODA0MCwKKwkweDAwODA0MiwgMHgyMDA0MEEsIDB4MDAwMDgyLCAweDA4MDAxQSwKKwkweDAwMDkwNCwgMHgzMUYxODYsIDB4MDAwMDA3LCAweDAwM0I2RCwKKwkweDAwODA0MiwgMHgwODAwMEEsIDB4MDAwRTE1LCAweDAxMDk4NCwKKwkweDMyOUI4NiwgMHg2MDAwMDcsIDB4MDgwMDFBLCAweDAwMEMxNSwKKwkweDAxMDk4NCwgMHgzMjgzODYsIDB4MDAwMDIwLCAweDFBMDAwNywKKwkweDAwMDJFRCwgMHgwMDgwNDAsIDB4NjIwMDA3LCAweDAwMzA2RCwKKwkweDAyODA0MiwgMHgwQTgwNEEsIDB4MDAwODIwLCAweDBBODA0QSwKKwkweDAwMDYwNiwgMHgxMDgwNEEsIDB4MDAwMDA3LCAweDI4MjUxMiwKKwkweDAwMUYzMiwgMHgwNUQyRjQsIDB4NTREMTA0LCAweDAwNzM1QywKKwkweDAwMDc4NiwgMHgwMDAwMDcsIDB4MEMwMDA3LCAweDBBMDAwNywKKwkweDFDMDAwNywgMHgwMDM0NjUsIDB4MDIwMDQwLCAweDAwNDgyMCwKKwkweDAyNTA2MCwgMHg0MDAwMEEsIDB4MDI0MDYwLCAweDAwMDA0MCwKKwkweDQ1NDk0NCwgMHgwMDAwMDcsIDB4MDA0MDIwLCAweDAwM0FFNSwKKwkweDAwMDA0MCwgMHgwMDI4RTUsIDB4MDAwMDQyLCAweDQ4MDAwQSwKKwkweDAwNDkwNCwgMHgzODY4ODYsIDB4MDAyQzY1LCAweDAwMDA0MiwKKwkweDQwMDAwQSwgMHgwMDAwRDUsIDB4NDU0MTA0LCAweDAwMDAwNywKKwkweDAwMDY1NSwgMHgwNTQ1MDQsIDB4MzRGMjg2LCAweDAwMDFENSwKKwkweDA1NDUwNCwgMHgzNEYwODYsIDB4MDAyQjY1LCAweDAwMDA0MiwKKwkweDAwM0FFNSwgMHg1MDAwNEEsIDB4NDAwMDBBLCAweDQ1QzNENCwKKwkweDAwMDAwNywgMHg0NTQ1MDQsIDB4MDAwMDA3LCAweDAwMDBDRCwKKwkweDQ0NDk0NCwgMHgwMDAwMDcsIDB4NDU0NTA0LCAweDAwMDAwNywKKwkweDAwMDE0RCwgMHg1NTQ5NDQsIDB4MDAwMDA3LCAweDA0NTE0NCwKKwkweDM0RTk4NiwgMHgwMDJDNjUsIDB4MDAwMDQyLCAweDQ4MDAwQSwKKwkweDRDRDEwNCwgMHgwMDAwMDcsIDB4MDRDMTQ0LCAweDM0RjM4NiwKKwkweDAwMDAwNywgMHgxNjAwMDcsIDB4MDAyQ0U1LCAweDA0MDA0MiwKKwkweDQwMDAwQSwgMHgwMDQwMjAsIDB4MDAwMDQwLCAweDAwMjk2NSwKKwkweDAwMDA0MiwgMHg0MDAwMEEsIDB4MDA0MTA0LCAweDM1NjA4NiwKKwkweDAwMDAwNywgMHgwMDI0MDIsIDB4MzZBMjA2LCAweDAwNUMwMiwKKwkweDAwMjVFNSwgMHgwMDAwNDIsIDB4NDAwMDBBLCAweDAwNDI3NCwKKwkweDAwMkFFNSwgMHgwMDAwNDIsIDB4NDAwMDBBLCAweDAwNDI3NCwKKwkweDUwMDExMiwgMHgwMDI5RTUsIDB4MDAwMDQyLCAweDQwMDAwQSwKKwkweDAwNDIzNCwgMHg0NTQxMDQsIDB4MDAwMDA3LCAweDAwNDAyMCwKKwkweDAwMDA0MCwgMHgwMDNFRTUsIDB4MDAwMDIwLCAweDAwMDA0MCwKKwkweDAwMkRFNSwgMHg0MDAxNTIsIDB4NTAwMDBBLCAweDA0NTE0NCwKKwkweDM2NEE4NiwgMHgwMDAwQzUsIDB4MDAzRUU1LCAweDAwNDAyMCwKKwkweDAwMDA0MCwgMHgwMDJCRTUsIDB4MDAwMDQyLCAweDQwMDAwQSwKKwkweDQwNDI1NCwgMHgwMDAwMDcsIDB4MDAyQUU1LCAweDAwNDAyMCwKKwkweDAwMDA0MCwgMHg1MDAxMzIsIDB4MDQwMTM0LCAweDAwNTY3NCwKKwkweDAwMjlFNSwgMHgwMjAwNDIsIDB4NDIwMDBBLCAweDAwMDA0MiwKKwkweDUwMDAwQSwgMHgwNTQxN0MsIDB4MDAyOEU1LCAweDAwMDA0MiwKKwkweDQ4MDAwQSwgMHgwMDAwQzUsIDB4NENDMTQ0LCAweDM3MTA4NiwKKwkweDAwMjZFNSwgMHgwMDI3RTUsIDB4MDIwMDQyLCAweDQwMDA0QSwKKwkweDUwMDAwQSwgMHgwMDQyM0MsIDB4MDA1NjdDLCAweDAwMjhFNSwKKwkweDAwNDgyMCwgMHgwMDAwNDAsIDB4MjgxRDEyLCAweDI4MjUxMiwKKwkweDAwMUY3MiwgMHgwMDI5NjUsIDB4MDAwMDQyLCAweDQwMDAwQSwKKwkweDAwNDEwNCwgMHgzN0FBODYsIDB4MEUwMDA3LCAweDE2MDAwNywKKwkweDFFMDAwNywgMHgwMDNFRTUsIDB4MDAwMDQyLCAweDQwMDAwQSwKKwkweDAwNDEwNCwgMHgzN0U4ODYsIDB4MDAyRDY1LCAweDAwMDA0MiwKKwkweDI4MzQwQSwgMHgwMDM0NjUsIDB4MDIwMDQyLCAweDQyMDA0QSwKKwkweDAwNDAyMCwgMHg0QTAwNEEsIDB4NTAwMDRBLCAweDA1RDJGNCwKKwkweDU0RDEwNCwgMHgwMDczNUMsIDB4Mzg1MTg2LCAweDAwMDAwNywKKwkweDAwMDYwNiwgMHgwODAwMDcsIDB4MEMwMDA3LCAweDA4MDAwNywKKwkweDBBMDAwNywgMHgwMDAxRTUsIDB4MDIwMDQ1LCAweDAwNDAyMCwKKwkweDAwMDA2MCwgMHgwMDAzNjUsIDB4MDAwMDQwLCAweDAwMkU2NSwKKwkweDAwMUEyMCwgMHgwQTFBNjAsIDB4MDAwMDQwLCAweDAwMzQ2NSwKKwkweDAyMDA0MiwgMHg0MjAwNEEsIDB4MDA0MDIwLCAweDRBMDA0QSwKKwkweDAwMDYwNiwgMHg1MDAwNEEsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwKKwkweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEUy0xRSBDb250cm9sbGVyIEluc3RydWN0aW9uUkFNIENvZGUKKy8vCTE5OTkvMDYvMjEKKy8vCUJ1ZjQ0MSBzbG90IGlzIEVuYWJsZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMDQvMDkgIGNyZWF0CisvLyAwNC8xMiAgc3RvcCBuaXNlIGZpeAorLy8gMDYvMjEgIFdvcmtpbmdPZmYgdGltbWluZworc3RhdGljIHVuc2lnbmVkIGxvbmcgQ250cmxJbnN0MUVbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0geworCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwQzAwMDcsIDB4MUMwMDA3LAorCTB4MDYwMDA3LCAweDcwMDAwMiwgMHgwMDAwMjAsIDB4MDMwMDQwLAorCTB4MDA3MTA0LCAweDAwNDI4NiwgMHgwMzAwNDAsIDB4MDAwRjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDAyODIsIDB4MDAwMjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDEyODIsIDB4MjAwRTgyLAorCTB4MDA4MDBELCAweDAwMDgxMCwgMHgyMDA0M0EsIDB4MDAxQTgyLAorCTB4MDM0NjBELCAweDAwMDgxMCwgMHgxMDA0M0EsIDB4MDJFQzBELAorCTB4MDAwODEwLCAweDE4MDQzQSwgMHgwMDAxMEQsIDB4MDIwMDE1LAorCTB4MDAwMEZELCAweDAwMDAyMCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDM4MDYwLCAweDAzODA0MCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDIwMDQwMiwgMHgwMDA4ODIsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDAxNzE4NiwgMHgwMDAwMDcsIDB4MjYwMDA3LAorCTB4NDAwMDA3LCAweDAwMDAwNywgMHgwMzI1OEQsIDB4MDAwODEwLAorCTB4MTgwNDNBLCAweDI2MDAwNywgMHgyODQ0MDIsIDB4MDAwODdELAorCTB4MDE4MDQyLCAweDAwMTYwQSwgMHgwNUEyMDYsIDB4MDAwMDA3LAorCTB4NDQwMDA3LCAweDAwMjMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MjJGQTA2LCAweDAwMDAwNywgMHgwMDA3RkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwMkFCODYsIDB4MDAwMTk1LAorCTB4MDkwRDA0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDAwMEY1LAorCTB4MDAwQjdELCAweDAxRjA2MCwgMHgwMDAwRkQsIDB4MDMzQTA2LAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDIsIDB4MTM4MDRBLAorCTB4MTgwMDBBLCAweDAwMTgyMCwgMHgwNTkwNjAsIDB4MDU4ODYwLAorCTB4MDE4MDQwLCAweDAwMDBGRCwgMHgwMTgwNDIsIDB4NzAwMDBBLAorCTB4MDAwMTE1LCAweDA3MTE0NCwgMHgwMzNCODYsIDB4MDMwMDAwLAorCTB4MDA3MDIwLCAweDAzNjIwNiwgMHgwMTgwNDAsIDB4MDAzNjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyMzIyMDYsIDB4MDAwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDE5QTA2LAorCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwMDBGOEQsIDB4MDAwODEwLAorCTB4MDAxNjNBLCAweDAwMjQwMiwgMHgwMDVDMDIsIDB4MDAyOEZELAorCTB4MDAwMDIwLCAweDAxODA0MCwgMHgwODAwMEQsIDB4MDAwODE1LAorCTB4NTEwOTg0LCAweDAwMDAwNywgMHgwMDAwNEQsIDB4MDAwRTVELAorCTB4MDAwRTAyLCAweDAwNDMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHgwMDAwOEQsIDB4MDAwOTI0LAorCTB4MDAwRjAyLCAweDAwNDcwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHg0ODA0ODAsIDB4MDAxMjEwLAorCTB4MjgwNDNBLCAweDAwNzc4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwNjhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4Mjg0NDAyLAorCTB4MDMyNThELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDdGRjhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjYwMDA3LAorCTB4MjAwMDA3LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA1MTI4NiwgMHgwMDAwMDcsIDB4MjQwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDAzODdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDEwMTUsIDB4MDEwOTg0LAorCTB4MDE5Qjg2LCAweDAwMDAwNywgMHgwMUIyMDYsIDB4MDAwMDA3LAorCTB4MDAwOEZELCAweDAxODA0MiwgMHgxODAwMEEsIDB4MDAxOTA0LAorCTB4MjJCODg2LCAweDI4MDAwNywgMHgwMDE4MTAsIDB4MjgwNDNBLAorCTB4MjgwQzAyLCAweDAwMDAwRCwgMHgwMDA4MTAsIDB4MjgxNDNBLAorCTB4MDg4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDIwRCwgMHgxODk5MDQsIDB4MDAwMDA3LAorCTB4MDA0MDJELCAweDAwMDBCRCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwNjVBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDAwMEEyMCwgMHgwMDA0N0QsIDB4MDE4MDQwLAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMDMwMTUsIDB4MDEyMTQ0LAorCTB4MDM2MTg2LCAweDAwMDAwNywgMHgwMDIxMDQsIDB4MDM2MTg2LAorCTB4MDAwMDA3LCAweDAwMEY4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDIzOTQ0LCAweDA3Qzk4NiwgMHgwMDAwMDcsIDB4MDAxODEwLAorCTB4MjgwNDNBLCAweDA4ODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDI4MTAsIDB4NzgwMDNBLAorCTB4MDA3ODhELCAweDAwMDgxMCwgMHgwODA0M0EsIDB4MkExMjA2LAorCTB4MDAwMDA3LCAweDAwNDAwRCwgMHgwMDEwMTUsIDB4MTg5OTA0LAorCTB4MjkyOTA0LCAweDM5MzkwNCwgMHgwMDAwMDcsIDB4MDcwMjA2LAorCTB4MDAwMDA3LCAweDAwMDRGNSwgMHgwMDAwN0QsIDB4MDAwMDIwLAorCTB4MDAwMDhELCAweDAxMDg2MCwgMHgwMTgwNDAsIDB4MDAwNDdELAorCTB4MDM4MDQyLCAweDIxODA0QSwgMHgxODAwMEEsIDB4MDIxOTQ0LAorCTB4MjI5MDg2LCAweDAwMDAwNywgMHgwMDQwNzUsIDB4NzFGMTA0LAorCTB4MDAwMDA3LCAweDAxMDA0MiwgMHgyODAwMEEsIDB4MDAyOTA0LAorCTB4MjI1ODg2LCAweDAwMDAwNywgMHgwMDNDMEQsIDB4MzBBOTA0LAorCTB4MDAwMDA3LCAweDAwMDc3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA4REE4NiwgMHgwMDA1N0QsIDB4MDAyODIwLAorCTB4MDNCMDYwLCAweDA4RjIwNiwgMHgwMTgwNDAsIDB4MDAzMDIwLAorCTB4MDNBODYwLCAweDAxODA0MCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwOEZBODYsIDB4MDAwMDA3LAorCTB4MDAwNTdELCAweDAxODA0MiwgMHgyODA0MEEsIDB4MDAwRThELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDAwMEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDA5MDAwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDNERkQsIDB4MDAwMDIwLAorCTB4MDE4MDQwLCAweDAwMTA3RCwgMHgwMDlEOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJBMTIwNiwgMHgwMDAwMDcsIDB4MDAwODE1LAorCTB4MDgwMDFBLCAweDAxMDk4NCwgMHgwQTUxODYsIDB4MDAxMzdELAorCTB4MjAwNTAwLCAweDI4MEYyMCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4MDM4QTYwLCAweDAxODA0MCwgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDIxNSwgMHgwMTA5ODQsIDB4M0E4MTg2LAorCTB4MDAwMDA3LCAweDAwN0ZCRCwgMHgzODNEQzQsIDB4MDAwMDA3LAorCTB4MDAxQTdELCAweDAwMTM3NSwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDBCOEQwNCwgMHgxMzk1MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAxOTA2MCwgMHgwMDExMDQsIDB4MjI1ODg2LAorCTB4MDEwMDQwLCAweDAwMTdGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDIyNUE4NiwgMHgwMDAwMDcsIDB4MDAxOTdELAorCTB4MDM4MDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDAwOTI0LAorCTB4MDAxNjY0LCAweDAwMTFGRCwgMHgwMzgwNDIsIDB4MkI4MDRBLAorCTB4MTk4MDRBLCAweDAwMDA4RCwgMHgyMTg5NDQsIDB4MDAwMDA3LAorCTB4MDAyMjQ0LCAweDBDMTk4NiwgMHgwMDAwMDcsIDB4MDAxQTY0LAorCTB4MDAyQTI0LCAweDAwMTk3RCwgMHgwODAxMDIsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAzREZELAorCTB4MDAwMDhELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMzc1LAorCTB4MDAxQTdELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwMjFELCAweDAxODlFNCwgMHgyOTkyRTQsIDB4MzA5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDYwRCwgMHgwMDBBMTUsIDB4MDAwQzFELAorCTB4MDAxMDI1LCAweDAwQTlFNCwgMHgwMTJCRTQsIDB4MDAwNDY0LAorCTB4MDFCM0U0LCAweDAyMzJFNCwgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA0MEQsIDB4MDhCMUM0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMDBCRjUsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAzODA0MiwgMHgwOTgwNEEsIDB4MDAwQTI0LAorCTB4MDgwMDBBLCAweDA4MEU2NCwgMHgwMDAwMDcsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMTAwNDAsIDB4MDA2NEFDLAorCTB4MDAwMjdELCAweDAwMDAyMCwgMHgwMTgwNDAsIDB4MDAxMDdELAorCTB4MDE4MDQyLCAweDAwMTFGRCwgMHgzQjgwNEEsIDB4MDk4MDRBLAorCTB4MjAwMDBBLCAweDAwMDA5NSwgMHgxQTExNDQsIDB4MDBBMTQ0LAorCTB4MEU1ODg2LCAweDAwMDQwRCwgMHgwMEI5ODQsIDB4MEU1OTg2LAorCTB4MDAxOEZELCAweDAxODA0MiwgMHgwMDEwRkQsIDB4MDk4MDRBLAorCTB4MjgwMDBBLCAweDAwMDA5NSwgMHgwMTA5MjQsIDB4MDAyQTY0LAorCTB4MEU0OTg2LCAweDAwMDAwNywgMHgwMDI5MDQsIDB4MEU1QTg2LAorCTB4MDAwMDA3LCAweDBFNjIwNiwgMHgwODAwMDIsIDB4MDAwMDhELAorCTB4MDAzODdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDM5MDQsIDB4MEYwOTg2LAorCTB4MDAwODBELCAweDdGRkZCNSwgMHgwMEI5ODQsIDB4MEVEOTg2LAorCTB4MDAwMDI1LCAweDBGQjIwNiwgMHgwMDAwMkQsIDB4MDAwMDE1LAorCTB4MDAwODJELCAweDAyRTAwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMDBELCAweDdGODAzNSwgMHgwMEI5ODQsIDB4MEZBOTg2LAorCTB4NDAwMDI1LCAweDAwMDA4RCwgMHgxMTA5NDQsIDB4MDAwMDA3LAorCTB4MDAwMThELCAweDEwOTUwNCwgMHgwMDAwMDcsIDB4MDA5MTY0LAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MTAwMTAyLAorCTB4MjgwMDAyLCAweDAyREYwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMThELCAweDAwMDQyRCwgMHgwMDAwOEQsIDB4MTA5NTA0LAorCTB4MDAwMDA3LCAweDAwMDIwRCwgMHgxMDkxODQsIDB4MDAwMDA3LAorCTB4MDJERjhELCAweDAwMDgyMCwgMHgwMDAwOEQsIDB4MDAzOEZELAorCTB4MDE4MDQwLCAweDAwM0JGRCwgMHgwMDEwMjAsIDB4MDNBODYwLAorCTB4MDAwODE1LCAweDMxMzE4NCwgMHgyMTIxODQsIDB4MDAwMDA3LAorCTB4MDNCMDYwLCAweDAzQTA2MCwgMHgwMTgwNDAsIDB4MDAyMkZELAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMjY0LCAweDEwMDEwMiwgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMTkyNCwgMHgwMTBGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwQTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwOTgwMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsIDB4MDAyMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDAwOTUsIDB4MjgwREM0LAorCTB4MDExOTI0LCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMUZELAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDAwQjUsIDB4MTEzMTQ0LAorCTB4MEE4RDA0LCAweDAwMDAwNywgMHgwODBBNDQsIDB4MTI5NTA0LAorCTB4MDAwMDA3LCAweDAwMjNGRCwgMHgwMDEwMjAsIDB4MDM4MDQwLAorCTB4MTAxMjQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDEyMzI4NiwgMHgwMDAwMDcsIDB4MDAzQkZELAorCTB4MDAwMTAwLCAweDAwMEExMCwgMHgwQjgwN0EsIDB4MTM4MDRBLAorCTB4MDkwOTg0LCAweDAwMDAwNywgMHgwMDAwOTUsIDB4MDEzRDA0LAorCTB4MTJCODg2LCAweDEwMDAwQSwgMHgxMDAwMDIsIDB4MDkwOTg0LAorCTB4MDAwMDA3LCAweDAzODA0MiwgMHgxMTgwNEEsIDB4MDkwRDA0LAorCTB4MDAwMDA3LCAweDEwMDAwQSwgMHgwOTBEODQsIDB4MDAwMDA3LAorCTB4MDAyNTdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAwMTBELAorCTB4MDAwODEwLCAweDI4MTQzQSwgMHgwMDEyN0QsIDB4MDE4MDQyLAorCTB4MjAwMDBBLCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMTdELAorCTB4MzE4MDRBLCAweDEwMDAwQSwgMHgwMDMxMjQsIDB4MDEzQjhELAorCTB4MDAzOTdELCAweDAwMDgyMCwgMHgwNTgwNDAsIDB4MDM4MDQyLAorCTB4MDk4NDRBLCAweDAwMDYwNiwgMHgwODA0MEEsIDB4MzAwMTAyLAorCTB4MDAzMTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MDAxMjI0LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNDM5ODYsIDB4NzAwMDAyLAorCTB4MDAwMDJELCAweDAzMDAwMCwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDE0NjIwNiwgMHgwMDIxMjQsIDB4MDAwMEFELAorCTB4MTAwMDAyLCAweDAwMDEwRCwgMHgwMDA5MjQsIDB4MDA2QjI0LAorCTB4MDE0QTBELCAweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLAorCTB4MDM4MDQyLCAweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLAorCTB4MDAzMjY0LCAweDAwMDA4RCwgMHgwMDBBMjQsIDB4MDAxMDIwLAorCTB4MDAyMjdELCAweDAxODA0MCwgMHgwMTRGOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJCNUEwNiwgMHgwMDAwMDcsIDB4MDAyODIwLAorCTB4MDAyMDdELCAweDAxODA0MCwgMHgwMDExN0QsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDMzODAwQSwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNzcyODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDAzMDk2NCwgMHgwMTVCMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgzODAxMDIsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMTIyNCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNURBODYsIDB4MDAwMDA3LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNzcxODYsIDB4MDAwMDA3LAorCTB4MDMyMTY0LCAweDAwNjMyQywgMHgwMDNERkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDA5NSwgMHgwOTA5MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAwMUE0QywgMHgxNjk5ODYsIDB4MDE4MDQwLAorCTB4MDMwMDAwLCAweDE2QjIwNiwgMHgwMDIxMjQsIDB4MDAwMTBELAorCTB4MDAwOTI0LCAweDAwNkIyNCwgMHgwMTZGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDNBNjQsIDB4MDAwMDk1LAorCTB4MDAxMjI0LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE3MTI4NiwgMHgwMDAwMDcsIDB4MDE3NjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyQjVBMDYsIDB4MDAwMDA3LAorCTB4MTYwQTA2LCAweDAwMDAwNywgMHgwMDcwMjAsIDB4MDgwMTBBLAorCTB4MTAwMTJBLCAweDAwMjBGRCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMjI3RCwgMHgwMTgwNDIsIDB4MDAzREZELAorCTB4MDgwMDBBLCAweDMxODQ0QSwgMHgwMDA5MDQsIDB4MTgxMDg2LAorCTB4MTgwMDhCLCAweDAwMDA4RCwgMHgxODk5MDQsIDB4MDAzMTJDLAorCTB4MThFMjA2LCAweDAwMDAwNywgMHgwMDMyNEMsIDB4MTg2Qjg2LAorCTB4MDAwMDA3LCAweDAwMTkwNCwgMHgxODY4ODYsIDB4MDAwMDA3LAorCTB4MDAwMDk1LCAweDE5OTE0NCwgMHgwMDIyMkMsIDB4MDAzMTI0LAorCTB4MDA2MzZDLCAweDAwMEUzRCwgMHgwMDEzNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDM4QUVDLAorCTB4MDM5M0VDLCAweDAwMjI0QywgMHgxOEUxODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDE4OTkwNCwgMHgwMDIyNkMsIDB4MDAzMjJDLAorCTB4MzAwNTBBLCAweDMwMURBQiwgMHgwMDIwODMsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMTg5MjQsIDB4MzAwNTAyLAorCTB4MDAxMDgzLCAweDAwMTg3NSwgMHgwMTAwNDIsIDB4MTAwMDBBLAorCTB4MDAwMDhELCAweDAxMDkyNCwgMHgwMDEzNzUsIDB4MzMwNTQyLAorCTB4MzMwQ0NCLCAweDMzMkNDQiwgMHgzMzM0Q0IsIDB4MzMzQ0NCLAorCTB4MzM0NENCLCAweDMzNENDQiwgMHgzMzU0Q0IsIDB4MzA1QzhCLAorCTB4MDA2MDgzLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE5QjI4NiwgMHgwMDAwMDcsIDB4MDAxRTJELAorCTB4MDAwNUZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDAwMDYwRCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MEE4MDhELAorCTB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsIDB4MjIwMDA3LAorCTB4MDAxMjc1LCAweDAzMDA0MiwgMHgyMTAwNEEsIDB4MDAwMDhELAorCTB4MUEwOTQ0LCAweDAwMDAwNywgMHgwMUFCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMUY1LAorCTB4MDMwMDQyLCAweDBEMDA0QSwgMHgxMDAwMEEsIDB4MDg5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAyNUY1LAorCTB4MEEzMTQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDMyODYwLAorCTB4MDMwMDQwLCAweDAwMjE3RCwgMHgwMzgwNDIsIDB4MEI4MDRBLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAwMDhELCAweDAwMDEyNCwgMHgwMDAxMkMsIDB4MDAwRTY0LAorCTB4MDAxQTY0LCAweDAwNjM2QywgMHgwODAxMEEsIDB4MTAwMTJBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDAyMEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDIyN0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAyMkZELAorCTB4MDM4MDQyLCAweDEwMDAwQSwgMHgwMDA4MjAsIDB4MDMxMDYwLAorCTB4MDMwMDQwLCAweDA5MEQwNCwgMHgwMDAwMDcsIDB4MDAwODIwLAorCTB4MDMwMDQwLCAweDAzODA0MiwgMHgwQjgwNEEsIDB4MTAwMDBBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDE5ODA0QSwgMHgxMTBEMDQsIDB4MTk4RDA0LAorCTB4MDAwMDA3LCAweDA4MDAwQSwgMHgwMDEwMjAsIDB4MDMxODYwLAorCTB4MDMwODYwLCAweDAzMDA0MCwgMHgwMDAwOEQsIDB4MEIwOTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAwNUY1LAorCTB4MDMwMDQyLCAweDA4MDAwQSwgMHgwMDA4MjAsIDB4MDEwMDQwLAorCTB4MDAwMEY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MUQ5ODg2LCAweDAwMUU3NSwgMHgwMzAwNDIsIDB4MDEwNDRBLAorCTB4MDAwQzBBLCAweDFEQUEwNiwgMHgwMDAwMDcsIDB4MDAwNDAyLAorCTB4MDAwQzAyLCAweDAwMTc3RCwgMHgwMDFBRjUsIDB4MDE4MDQyLAorCTB4MDMxNDRBLCAweDAzMUM0QSwgMHgwMzI0NEEsIDB4MDMyQzRBLAorCTB4MDMzNDRBLCAweDAzM0M0QSwgMHgwMzQ0NEEsIDB4MDA0QzBBLAorCTB4MDAwNDNELCAweDAwMTNGNSwgMHgwMDFBRkQsIDB4MDMwMDQyLAorCTB4MEIwMDRBLCAweDFCODA0QSwgMHgxMzgwNEEsIDB4MjAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgwMzg5RTQsIDB4MDM5OUVDLAorCTB4MDA1NTAyLCAweDAwNUQwQSwgMHgwMzAwNDIsIDB4MEIwMDRBLAorCTB4MUI4MDRBLCAweDEzODA0QSwgMHgyMDAwMEEsIDB4MDg5MTQ0LAorCTB4MTlBMTQ0LCAweDAzODlFNCwgMHgwMzk5RUMsIDB4MDA2NTAyLAorCTB4MDA2RDBBLCAweDAzMDA0MiwgMHgwQjAwNEEsIDB4MTkwMDRBLAorCTB4MkI4MDRBLCAweDEzODA0QSwgMHgyMTgwNEEsIDB4MzAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgyQUIxNDQsIDB4MDM4OUU0LAorCTB4MDM5OUVDLCAweDAwNzUwMiwgMHgwMDdEMEEsIDB4MDNBOUU0LAorCTB4MDAwNzAyLCAweDAwMTA3RCwgMHgwMDA0MTUsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAxMDlFNCwgMHgwMDBGMDIsIDB4MDAyQUY1LAorCTB4MDAxOUZELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwOTM0LCAweDAwMTY3NCwgMHgwMDI5RjUsIDB4MDEwMDQyLAorCTB4MTAwMDBBLCAweDAwOTE3QywgMHgwMDIwNzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyMDBBODYsIDB4MDAyNkY1LAorCTB4MDAyN0Y1LCAweDAzMDA0MiwgMHgwOTAwNEEsIDB4MTAwMDBBLAorCTB4MDAwQTNDLCAweDAwMTY3QywgMHgwMDFBNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDUxODA0QSwgMHg0ODAwMEEsIDB4MTYwMDA3LAorCTB4MDAxMDc1LCAweDAxMDA0MiwgMHgyODJDMEEsIDB4MjgxRDEyLAorCTB4MjgyNTEyLCAweDAwMUYzMiwgMHgxRTAwMDcsIDB4MEUwMDA3LAorCTB4MDAxOTc1LCAweDAxMDA0MiwgMHgwMDJERjUsIDB4MEQwMDRBLAorCTB4MTAwMDBBLCAweDAwOTE0NCwgMHgyMEVBODYsIDB4MDEwMDQyLAorCTB4MjgzNDBBLCAweDAwMEU1RCwgMHgwMDAwOEQsIDB4MDAwMzc1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwNUQyRjQsIDB4NTREMTA0LAorCTB4MDA3MzVDLCAweDIxOEI4NiwgMHgwMDAwMDcsIDB4MEMwMDA3LAorCTB4MDgwMDA3LCAweDBBMDAwNywgMHgwMjE3OEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDM0QjIwNiwgMHgwMDAwMDcsIDB4MjE5MjA2LAorCTB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDIyNzUsIDB4MDEwMDQyLAorCTB4MjAwMDBBLCAweDAwMjEwNCwgMHgyMjU4ODYsIDB4MDAxRTJELAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjFDQTg2LCAweDAwMDAwNywgMHgwMDIwMTAsIDB4MzAwNDNBLAorCTB4MDAwNTdELCAweDAxODBDMywgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwQTgxMEQsIDB4MDAwODIwLAorCTB4MDAwMkY1LCAweDAxMDA0MCwgMHgyMjAwMDcsIDB4MDAwNEZELAorCTB4MDE4MDQyLCAweDcwMDAwQSwgMHgwMzAwMDAsIDB4MDA3MDIwLAorCTB4MDdGQTA2LCAweDAxODA0MCwgMHgwMjJCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjJDMjg2LAorCTB4MDAwMDA3LCAweDAyMDIwNiwgMHgwMDAwMDcsIDB4MDAwODc1LAorCTB4MDAwOUZELCAweDAwMDEwRCwgMHgyMzQyMDYsIDB4MDAwMjk1LAorCTB4MDAwQjc1LCAweDAwMDk3RCwgMHgwMDAwMEQsIDB4MDAwNTE1LAorCTB4MDEwMDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsIDB4MkEwMDg2LAorCTB4MDAwNkY1LCAweDAwMTAyMCwgMHgwMTAwNDAsIDB4MDAwNEY1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwMDA3NzUsIDB4MDEwMDQyLAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDExMjQsIDB4MDAwOTA0LAorCTB4MjNGMjg2LCAweDAwMDgxNSwgMHgwODAxMDIsIDB4MTAxMjA0LAorCTB4MjQxMjA2LCAweDAwMDU3NSwgMHgwODEyMDQsIDB4MDAwMDA3LAorCTB4MTAwMTAyLCAweDAwMDU3NSwgMHgwMDA0MjUsIDB4MDIxMTI0LAorCTB4MTAwMTAyLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDEwMDQwLAorCTB4MDAxOTI0LCAweDJBMDA4NiwgMHgwMDAwOEQsIDB4MDAwNDY0LAorCTB4MDA5RDA0LCAweDI5MTA4NiwgMHgxODAxMDIsIDB4MDAwNTc1LAorCTB4MDEwMDQyLCAweDI4MDQwQSwgMHgwMDAxOEQsIDB4MDAwOTI0LAorCTB4MjgwRDAyLCAweDAwMDAwRCwgMHgwMDA5MjQsIDB4MjgxNTAyLAorCTB4MTAwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MjAwMDA3LCAweDAwMTE3NSwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyNEZBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzBCNjAsIDB4MUIwQjYwLAorCTB4MDMwQTYwLCAweDAxMDA0MCwgMHgwNTAwNDIsIDB4M0QwMDRBLAorCTB4MzUwMDRBLCAweDJEMDA0QSwgMHgyMDAwMEEsIDB4MDAwNkY1LAorCTB4MDEwMDQyLCAweDI4MTQwQSwgMHgwMDA0RjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsIDB4MjYwMjg2LAorCTB4MDA0MDE1LCAweDAwMDA5NSwgMHgwMTBEMDQsIDB4MjVGMDg2LAorCTB4MTAwMDIyLCAweDEwMDAyQSwgMHgyNjFBMDYsIDB4MDAwMDA3LAorCTB4MzMzMTA0LCAweDJBQTkwNCwgMHgwMDAwMDcsIDB4MDMyMTI0LAorCTB4MjgwNTAyLCAweDI4NDQwMiwgMHgwMDExMjQsIDB4NDAwMTAyLAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDMyMjQsIDB4MDAyOTJDLAorCTB4MDA2MzZDLCAweDI3NzM4NiwgMHgwMDAwMDcsIDB4MDJCMTY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDAwOEQsIDB4MDAwQTY0LAorCTB4MjgwRDAyLCAweDEwMDA4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDAwOEQsIDB4MzhCOTA0LAorCTB4MDAwMDA3LCAweDAzMjk2QywgMHgzMDAxMEEsIDB4MDAwMkY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjcwMjg2LAorCTB4MDAwMDA3LCAweDAwMjEyQywgMHgyODA1MEEsIDB4MDAzMTZDLAorCTB4MDAwNDZDLCAweDAwMDQ2QywgMHgyODQ1MEEsIDB4MDAxMTI0LAorCTB4MDA2QjY0LCAweDEwMDEwMiwgMHgwMDAwOEQsIDB4MDEwOTZDLAorCTB4MjgwRDBBLCAweDEwMDEwRCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDQxMjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMzIyNCwgMHgzMDAxMDIsIDB4MDMyOTQ0LAorCTB4MjdGQTg2LCAweDAwMDAwNywgMHgzMDAwMDIsIDB4MDAwNEY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDAzMTUsIDB4MDEwRDA0LAorCTB4Mjg0MDg2LCAweDAwMzEyNCwgMHgwMDA0NjQsIDB4MzAwMTAyLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4Mjg0QTg2LCAweDAwMDAwNywgMHgyODQ0MDIsIDB4MDAzMTI0LAorCTB4MzAwNTAyLCAweDAwMzkyNCwgMHgzMDA1ODMsIDB4MDAwODgzLAorCTB4MDAwNUY1LCAweDAxMDA0MiwgMHgyODA0MEEsIDB4MDAwMDhELAorCTB4MDA4MTI0LCAweDI4MEQwMiwgMHgwMDAwOEQsIDB4MDA4MTI0LAorCTB4MjgxNTAyLCAweDEwMDE4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDEwMjUsIDB4MDAwNTc1LAorCTB4MDMwMDQyLCAweDA5MDA0QSwgMHgxMDAwMEEsIDB4MEEwOTA0LAorCTB4MTIxMTA0LCAweDAwMDAwNywgMHgwMDEwMjAsIDB4MDUwODYwLAorCTB4MDUwMDQwLCAweDAwMDZGRCwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDAwMDBBNSwgMHgwQTA5MDQsIDB4MTIxMTA0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTkwNjAsIDB4MDEwMDQwLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjlDQTg2LCAweDAwMDAwNywgMHgyNDQyMDYsIDB4MDAwMDA3LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAyRjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyQTFBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzhCNjAsIDB4MUI4QjYwLAorCTB4MjM4QjYwLCAweDJCOEI2MCwgMHgzMzhCNjAsIDB4M0I4QjYwLAorCTB4NDM4QjYwLCAweDRCOEI2MCwgMHg1MzhCNjAsIDB4NUI4QjYwLAorCTB4NjM4QjYwLCAweDZCOEI2MCwgMHg3MzhCNjAsIDB4N0I4QjYwLAorCTB4MDM4RjYwLCAweDBCOEY2MCwgMHgxMzhGNjAsIDB4MUI4RjYwLAorCTB4MjM4RjYwLCAweDJCOEY2MCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4NjM4RjYwLCAweDZCOEY2MCwgMHg3MzhGNjAsIDB4N0I4RjYwLAorCTB4MDM4QTYwLCAweDAwMDYwNiwgMHgwMTgwNDAsIDB4MDAwMDhELAorCTB4MDAwQTY0LCAweDI4MEQwMiwgMHgwMDBBMjQsIDB4MDAwMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDEyMjQsIDB4MDAwM0ZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkMwQTg2LAorCTB4MDAwMDA3LCAweDAwMDE4RCwgMHgwMDBBMjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDA4MDEwMiwgMHgwMDA5MjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDEwMDEwMiwgMHgwMjAwMEQsIDB4MDA5MTQ0LAorCTB4MkM2MTg2LCAweDAwMDAwNywgMHgwMDAxRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMEE0NCwgMHgyQzQzODYsIDB4MDE4MDQyLAorCTB4MEEwMDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDI3RCwgMHgwMDEwMjAsIDB4MDAwNjA2LAorCTB4MDE4MDQwLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDJDQjI4NiwgMHgwMDAwMDcsIDB4MDAwMzdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkNFMjg2LAorCTB4MDAwMDA3LCAweDAwMDA3NSwgMHgwMDJFN0QsIDB4MDEwMDQyLAorCTB4MEI4MDRBLCAweDAwMDAyMCwgMHgwMDA5MDQsIDB4MDAwNjg2LAorCTB4MDEwMDQwLCAweDMxODQ0QSwgMHgzMDA0OEIsIDB4MDAwODgzLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MDAwMDhELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDA2NzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMzgxNSwgMHgwMTA5MjQsIDB4MjgwNTAyLAorCTB4MEIwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MDAwNjA2LCAweDIyMDAwNywgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAxMzQsIDB4MDA3RjhELAorCTB4MDAwOTNDLCAweDI4MUQxMiwgMHgyODI1MTIsIDB4MDAxRjMyLAorCTB4MEUwMDA3LCAweDAwMDEwRCwgMHgwMDAzN0QsIDB4MDAwODIwLAorCTB4MDE4MDQwLCAweDA1RDJGNCwgMHgwMDAwMDcsIDB4MDgwMDA3LAorCTB4MDAwMzdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MkU4QTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDAwMDA3LAorCTB4MDAwMDA3LCAweDAwMDAxMiwgMHgxMDAwMDcsIDB4MzIwMDA3LAorCTB4NjAwMDA3LCAweDQ2MDAwNywgMHgxMDAwODAsIDB4NDgwMDFBLAorCTB4MDA0OTA0LCAweDJFRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjEwLAorCTB4NTgwMDNBLCAweDAwMDE0NSwgMHg1QzVEMDQsIDB4MDAwMDA3LAorCTB4MDAwMDgwLCAweDQ4MDAxQSwgMHgwMDQ5MDQsIDB4MkY0MTg2LAorCTB4MDAwMDA3LCAweDAwMTIxMCwgMHg1MDAwM0EsIDB4MDA1OTA0LAorCTB4MkY5ODg2LCAweDAwMDA0NSwgMHgwMDAwQzUsIDB4N0ZGRkY1LAorCTB4N0ZGRjdELCAweDA3RDUyNCwgMHgwMDQyMjQsIDB4NTAwMTAyLAorCTB4MjAwNTAyLCAweDAwMDA4MiwgMHg0MDAwMUEsIDB4MDA0MTA0LAorCTB4MkZDOTg2LCAweDAwMDAwNywgMHgwMDM4NjUsIDB4NDAwMDFBLAorCTB4MDA0MDIwLCAweDAwMTA0RCwgMHgwNEMxODQsIDB4MzFBQjg2LAorCTB4MDAwMDQwLCAweDA0MDAwNywgMHgwMDAxNjUsIDB4MDAwMTQ1LAorCTB4MDA0MDIwLCAweDAwMDA0MCwgMHgwMDA3NjUsIDB4MDgwMDgwLAorCTB4NDAwMDFBLCAweDAwNDEwNCwgMHgzMDU5ODYsIDB4MDAwMDA3LAorCTB4MDAxMjEwLCAweDQwMDAzQSwgMHgwMDQxMDQsIDB4MzBCMjg2LAorCTB4MDAwMDRELCAweDAwMDBDRCwgMHgwMDQ4MTAsIDB4MjAwNDNBLAorCTB4MDAwODgyLCAweDQwMDAxQSwgMHgwMDQxMDQsIDB4MzBDMTg2LAorCTB4MDAwMDA3LCAweDAwNDgyMCwgMHgwMDU5MDQsIDB4MzE5ODg2LAorCTB4MDAwMDQwLCAweDAwMDdFNSwgMHgyMDA0ODAsIDB4MjgxNkEwLAorCTB4MzIxNkUwLCAweDNBMTZFMCwgMHg0MjE2RTAsIDB4MDIxMjYwLAorCTB4MDAwMDQwLCAweDAwMDAzMiwgMHg0MDAwNzUsIDB4MDAwMDdELAorCTB4MDdENTc0LCAweDIwMDUxMiwgMHgwMDAwODIsIDB4NDAwMDFBLAorCTB4MDA0MTA0LCAweDMxNzE4NiwgMHgwMDAwMDcsIDB4MDM4QTA2LAorCTB4NjQwMDA3LCAweDAwMDBFNSwgMHgwMDAwMjAsIDB4MDAwMDQwLAorCTB4MDAwQTY1LCAweDAwMDAyMCwgMHgwMjAwNDAsIDB4MDIwMDQwLAorCTB4MDAwMDQwLCAweDAwMDE2NSwgMHgwMDAwNDIsIDB4NzAwMDBBLAorCTB4MDA3MTA0LCAweDMyMzI4NiwgMHgwMDAwMDcsIDB4MDYwMDA3LAorCTB4MDE5QTA2LCAweDY0MDAwNywgMHgwNTAwMDAsIDB4MDA3MDIwLAorCTB4MDAwMDQwLCAweDAzOEEwNiwgMHg2NDAwMDcsIDB4MDAwMDA3LAorCTB4MDAzMDZELCAweDAyODg2MCwgMHgwMjkwNjAsIDB4MDgwMDBBLAorCTB4MDI4ODYwLCAweDAwODA0MCwgMHgxMDAwMTIsIDB4MDAxMDBELAorCTB4MDA5MTg0LCAweDMyRDE4NiwgMHgwMDBFMEQsIDB4MDA5MTg0LAorCTB4MzNFMTg2LCAweDAwMDAwNywgMHgzMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAzQjZELCAweDAwODA0MCwgMHgwMDAwODAsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDMyRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MTAwMDBBLAorCTB4NDAwMDBELCAweDEwOTU0NCwgMHgwMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MjAwNDBBLAorCTB4MDAwMDgyLCAweDA4MDAxQSwgMHgwMDA5MDQsIDB4MzM4MTg2LAorCTB4MDAwMDA3LCAweDAwM0I2RCwgMHgwMDgwNDIsIDB4MDgwMDBBLAorCTB4MDAwRTE1LCAweDAxMDk4NCwgMHgzNDJCODYsIDB4NjAwMDA3LAorCTB4MDgwMDFBLCAweDAwMEMxNSwgMHgwMTA5ODQsIDB4MzQxMzg2LAorCTB4MDAwMDIwLCAweDFBMDAwNywgMHgwMDAyRUQsIDB4MDA4MDQwLAorCTB4NjIwMDA3LCAweDAwMzA2RCwgMHgwMjgwNDIsIDB4MEE4MDRBLAorCTB4MDAwODIwLCAweDBBODA0QSwgMHgwMDA2MDYsIDB4MTA4MDRBLAorCTB4MDAwMDA3LCAweDI4MjUxMiwgMHgwMDFGMzIsIDB4MDVEMkY0LAorCTB4NTREMTA0LCAweDAwNzM1QywgMHgwMDA3ODYsIDB4MDAwMDA3LAorCTB4MEMwMDA3LCAweDBBMDAwNywgMHgxQzAwMDcsIDB4MDAzNDY1LAorCTB4MDIwMDQwLCAweDAwNDgyMCwgMHgwMjUwNjAsIDB4NDAwMDBBLAorCTB4MDI0MDYwLCAweDAwMDA0MCwgMHg0NTQ5NDQsIDB4MDAwMDA3LAorCTB4MDA0MDIwLCAweDAwM0FFNSwgMHgwMDAwNDAsIDB4MDAyOEU1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHgwMDQ5MDQsIDB4MzlGODg2LAorCTB4MDAyQzY1LCAweDAwMDA0MiwgMHg0MDAwMEEsIDB4MDAwMEQ1LAorCTB4NDU0MTA0LCAweDAwMDAwNywgMHgwMDA2NTUsIDB4MDU0NTA0LAorCTB4MzY4Mjg2LCAweDAwMDFENSwgMHgwNTQ1MDQsIDB4MzY4MDg2LAorCTB4MDAyQjY1LCAweDAwMDA0MiwgMHgwMDNBRTUsIDB4NTAwMDRBLAorCTB4NDAwMDBBLCAweDQ1QzNENCwgMHgwMDAwMDcsIDB4NDU0NTA0LAorCTB4MDAwMDA3LCAweDAwMDBDRCwgMHg0NDQ5NDQsIDB4MDAwMDA3LAorCTB4NDU0NTA0LCAweDAwMDAwNywgMHgwMDAxNEQsIDB4NTU0OTQ0LAorCTB4MDAwMDA3LCAweDA0NTE0NCwgMHgzNjc5ODYsIDB4MDAyQzY1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHg0Q0QxMDQsIDB4MDAwMDA3LAorCTB4MDRDMTQ0LCAweDM2ODM4NiwgMHgwMDAwMDcsIDB4MTYwMDA3LAorCTB4MDAyQ0U1LCAweDA0MDA0MiwgMHg0MDAwMEEsIDB4MDA0MDIwLAorCTB4MDAwMDQwLCAweDAwMjk2NSwgMHgwMDAwNDIsIDB4NDAwMDBBLAorCTB4MDA0MTA0LCAweDM2RjA4NiwgMHgwMDAwMDcsIDB4MDAyNDAyLAorCTB4MzgzMjA2LCAweDAwNUMwMiwgMHgwMDI1RTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHgwMDJBRTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHg1MDAxMTIsIDB4MDAyOUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyMzQsIDB4NDU0MTA0LAorCTB4MDAwMDA3LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAzRUU1LAorCTB4MDAwMDIwLCAweDAwMDA0MCwgMHgwMDJERTUsIDB4NDAwMTUyLAorCTB4NTAwMDBBLCAweDA0NTE0NCwgMHgzN0RBODYsIDB4MDAwMEM1LAorCTB4MDAzRUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAyQkU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHg0MDQyNTQsIDB4MDAwMDA3LAorCTB4MDAyQUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4NTAwMTMyLAorCTB4MDQwMTM0LCAweDAwNTY3NCwgMHgwMDI5RTUsIDB4MDIwMDQyLAorCTB4NDIwMDBBLCAweDAwMDA0MiwgMHg1MDAwMEEsIDB4MDU0MTdDLAorCTB4MDAyOEU1LCAweDAwMDA0MiwgMHg0ODAwMEEsIDB4MDAwMEM1LAorCTB4NENDMTQ0LCAweDM4QTA4NiwgMHgwMDI2RTUsIDB4MDAyN0U1LAorCTB4MDIwMDQyLCAweDQwMDA0QSwgMHg1MDAwMEEsIDB4MDA0MjNDLAorCTB4MDA1NjdDLCAweDAwMjhFNSwgMHgwMDQ4MjAsIDB4MDAwMDQwLAorCTB4MjgxRDEyLCAweDI4MjUxMiwgMHgwMDFGNzIsIDB4MDAyOTY1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4MzkzQTg2LAorCTB4MEUwMDA3LCAweDE2MDAwNywgMHgxRTAwMDcsIDB4MDAzRUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4Mzk3ODg2LAorCTB4MDAyRDY1LCAweDAwMDA0MiwgMHgyODM0MEEsIDB4MDAzNDY1LAorCTB4MDIwMDQyLCAweDQyMDA0QSwgMHgwMDQwMjAsIDB4NEEwMDRBLAorCTB4NTAwMDRBLCAweDA1RDJGNCwgMHg1NEQxMDQsIDB4MDA3MzVDLAorCTB4MzlFMTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDgwMDA3LAorCTB4MEMwMDA3LCAweDA4MDAwNywgMHgwQTAwMDcsIDB4MDAwMUU1LAorCTB4MDIwMDQ1LCAweDAwNDAyMCwgMHgwMDAwNjAsIDB4MDAwMzY1LAorCTB4MDAwMDQwLCAweDAwMkU2NSwgMHgwMDFBMjAsIDB4MEExQTYwLAorCTB4MDAwMDQwLCAweDAwMzQ2NSwgMHgwMjAwNDIsIDB4NDIwMDRBLAorCTB4MDA0MDIwLCAweDRBMDA0QSwgMHgwMDA2MDYsIDB4NTAwMDRBLAorCTB4MDAxN0ZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjI1QTg2LCAweDAwMDAwNywgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDAxMUZELCAweDMzODA0QSwgMHgxOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMDk1LCAweDJBMTE0NCwgMHgwMUExNDQsIDB4M0I5MDg2LAorCTB4MDAwNDBELCAweDAwQjE4NCwgMHgzQjkxODYsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDAwMTBGRCwgMHgwOTgwNEEsIDB4MzgwMDBBLAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDNBNjQsIDB4M0I4MTg2LAorCTB4MDAwMDA3LCAweDAwMzkwNCwgMHgzQjkyODYsIDB4MDAwMDA3LAorCTB4M0I5QTA2LCAweDAwMDAwRCwgMHgwMDAwOEQsIDB4MDAwODIwLAorCTB4MDAzODdELCAweDAxODA0MCwgMHg3MDAwMDIsIDB4MDAxMTdELAorCTB4MDE4MDQyLCAweDAwMTk3RCwgMHgyOTgwNEEsIDB4MzAwMDBBLAorCTB4MzgwMDAyLCAweDAwMzEyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAyQTI0LCAweDI4MDUwMiwgMHgwMDA2OEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDAwNzUwRCwgMHgwMEIxMjQsIDB4MDAyMjY0LAorCTB4M0QwMzg2LCAweDI4NDQwMiwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MEI4MDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwNzU4RCwgMHgwMEIxMjQsIDB4MTAwMTAyLAorCTB4MDEyMTQ0LCAweDNFNDk4NiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAzODdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0U0ODg2LCAweDAzMDAwMCwgMHgzRTRBMDYsIDB4MDAwMEJELAorCTB4MDAwMDhELCAweDAyMzE2NCwgMHgwMDBBNjQsIDB4MjgwRDAyLAorCTB4MEI4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMzg3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDNFMzI4NiwgMHgwMzAwMDAsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4M0Q4Mjg2LAorCTB4MDAwMDA3LCAweDAwMjgxMCwgMHgyODA0M0EsIDB4MDA3NTBELAorCTB4MDMwOTI0LCAweDAwMjI2NCwgMHgyODBEMDIsIDB4MDIzMTZDLAorCTB4Mjg0NTBBLCAweDBCODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDAwOEQsIDB4MDAwQTI0LAorCTB4M0U0QTA2LCAweDEwMDEwMiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAwMEJELCAweDAwMzgxMCwgMHgzMDA0M0EsIDB4MDAxODdELAorCTB4MDE4MDQyLCAweDAwMThGRCwgMHgwOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMEFELCAweDAyODkyNCwgMHgwNzIxMkMsIDB4MDAxMDEwLAorCTB4MzAwNTgzLCAweDMwMEQ4QiwgMHgzMDE0QkIsIDB4MzAxQzgzLAorCTB4MDAyMDgzLCAweDAwMTM3RCwgMHgwMzgwNDIsIDB4MzM4NDRBLAorCTB4MzNBQ0NCLCAweDMzQjRDQiwgMHgzM0JDQ0IsIDB4MzNDNENCLAorCTB4MzNDQ0NCLCAweDMzRDRDQiwgMHgzMDVDOEIsIDB4MDA2MDgzLAorCTB4MDAxRTBELCAweDAwMDVGRCwgMHgwMTgwNDIsIDB4MjAwMDBBLAorCTB4MDIwOTI0LCAweDAwMDY4RCwgMHgwMEE5NkMsIDB4MDAwMDlELAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0Y2QTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwRDBBLAorCTB4Mjg0NDAyLCAweDAwMTgxMCwgMHgyODE0M0EsIDB4MEMwMDhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjIwMDA3LAorCTB4MDAzOTA0LCAweDIyNTg4NiwgMHgwMDFFMEQsIDB4MDAwNTdELAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMjA5MjQsIDB4MDAwMEE1LAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4NDAyQTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwQzAyLAorCTB4MDAyMDEwLCAweDI4MTQzQSwgMHgwQzAxMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMjVBMDYsIDB4MjIwMDA3LAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwCit9OworCisjZW5kaWYJLy9fSFdNQ09ERV8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWYxNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCkBAIC0wLDAgKzEsMjI3MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBZTUY3MjQvNzQwLzc0NC83NTQgY2hpcHMKKyAqCisgKiAgQlVHUzoKKyAqICAgIC0tCisgKgorICogIFRPRE86CisgKiAgICAtLQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgorI2luY2x1ZGUgPHNvdW5kL3ltZnBjaS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqICBjb25zdGFudHMKKyAqLworCisvKgorICogIGNvbW1vbiBJL08gcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX2lycV93YWl0KHltZnBjaV90ICpjaGlwKTsKKworc3RhdGljIGlubGluZSB1OCBzbmRfeW1mcGNpX3JlYWRiKHltZnBjaV90ICpjaGlwLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiByZWFkYihjaGlwLT5yZWdfYXJlYV92aXJ0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF95bWZwY2lfd3JpdGViKHltZnBjaV90ICpjaGlwLCB1MzIgb2Zmc2V0LCB1OCB2YWwpCit7CisJd3JpdGViKHZhbCwgY2hpcC0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNuZF95bWZwY2lfcmVhZHcoeW1mcGNpX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWR3KGNoaXAtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3ltZnBjaV93cml0ZXcoeW1mcGNpX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgY2hpcC0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNuZF95bWZwY2lfcmVhZGwoeW1mcGNpX3QgKmNoaXAsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGNoaXAtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3ltZnBjaV93cml0ZWwoeW1mcGNpX3QgKmNoaXAsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgY2hpcC0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9jb2RlY19yZWFkeSh5bWZwY2lfdCAqY2hpcCwgaW50IHNlY29uZGFyeSkKK3sKKwlzaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1MzIgcmVnID0gc2Vjb25kYXJ5ID8gWURTWEdSX1NFQ1NUQVRVU0FEUiA6IFlEU1hHUl9QUklTVEFUVVNBRFI7CisJCisJZW5kX3RpbWUgPSAoamlmZmllcyArICgoMyAqIEhaKSAvIDQpKSArIDE7CisJZG8geworCQlpZiAoKHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgcmVnKSAmIDB4ODAwMCkgPT0gMCkKKwkJCXJldHVybiAwOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZSAoZW5kX3RpbWUgLSAoc2lnbmVkIGxvbmcpamlmZmllcyA+PSAwKTsKKwlzbmRfcHJpbnRrKCJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgc2Vjb25kYXJ5LCBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIHJlZykpOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfY29kZWNfd3JpdGUoYWM5N190ICphYzk3LCB1MTYgcmVnLCB1MTYgdmFsKQoreworCXltZnBjaV90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCXUzMiBjbWQ7CisJCisJc25kX3ltZnBjaV9jb2RlY19yZWFkeShjaGlwLCAwKTsKKwljbWQgPSAoKFlEU1hHX0FDOTdXUklURUNNRCB8IHJlZykgPDwgMTYpIHwgdmFsOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9BQzk3Q01EREFUQSwgY21kKTsKK30KKworc3RhdGljIHUxNiBzbmRfeW1mcGNpX2NvZGVjX3JlYWQoYWM5N190ICphYzk3LCB1MTYgcmVnKQoreworCXltZnBjaV90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHNuZF95bWZwY2lfY29kZWNfcmVhZHkoY2hpcCwgMCkpCisJCXJldHVybiB+MDsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfQUM5N0NNREFEUiwgWURTWEdfQUM5N1JFQURDTUQgfCByZWcpOworCWlmIChzbmRfeW1mcGNpX2NvZGVjX3JlYWR5KGNoaXAsIDApKQorCQlyZXR1cm4gfjA7CisJaWYgKGNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDQgJiYgY2hpcC0+cmV2IDwgMikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDYwMDsgaSsrKQorCQkJc25kX3ltZnBjaV9yZWFkdyhjaGlwLCBZRFNYR1JfUFJJU1RBVFVTREFUQSk7CisJfQorCXJldHVybiBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9QUklTVEFUVVNEQVRBKTsKK30KKworLyoKKyAqICBNaXNjIHJvdXRpbmVzCisgKi8KKworc3RhdGljIHUzMiBzbmRfeW1mcGNpX2NhbGNfZGVsdGEodTMyIHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA4MDAwOglyZXR1cm4gMHgwMmFhYWIwMDsKKwljYXNlIDExMDI1OglyZXR1cm4gMHgwM2FjY2QwMDsKKwljYXNlIDE2MDAwOglyZXR1cm4gMHgwNTU1NTUwMDsKKwljYXNlIDIyMDUwOglyZXR1cm4gMHgwNzU5OWEwMDsKKwljYXNlIDMyMDAwOglyZXR1cm4gMHgwYWFhYWIwMDsKKwljYXNlIDQ0MTAwOglyZXR1cm4gMHgwZWIzMzMwMDsKKwlkZWZhdWx0OglyZXR1cm4gKChyYXRlIDw8IDE2KSAvIDM3NSkgPDwgNTsKKwl9Cit9CisKK3N0YXRpYyB1MzIgZGVmX3JhdGVbOF0gPSB7CisJMTAwLCAyMDAwLCA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAzMjAwMCwgNDgwMDAKK307CisKK3N0YXRpYyB1MzIgc25kX3ltZnBjaV9jYWxjX2xwZksodTMyIHJhdGUpCit7CisJdTMyIGk7CisJc3RhdGljIHUzMiB2YWxbOF0gPSB7CisJCTB4MDA1NzAwMDAsIDB4MDZBQTAwMDAsIDB4MThCMjAwMDAsIDB4MjA5MzAwMDAsCisJCTB4MkI5QTAwMDAsIDB4MzVBMTAwMDAsIDB4M0VBQTAwMDAsIDB4NDAwMDAwMDAKKwl9OworCQorCWlmIChyYXRlID09IDQ0MTAwKQorCQlyZXR1cm4gMHg0MDAwMDAwMDsJLyogRklYTUU6IFdoYXQncyB0aGUgcmlnaHQgdmFsdWU/ICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKHJhdGUgPD0gZGVmX3JhdGVbaV0pCisJCQlyZXR1cm4gdmFsW2ldOworCXJldHVybiB2YWxbMF07Cit9CisKK3N0YXRpYyB1MzIgc25kX3ltZnBjaV9jYWxjX2xwZlEodTMyIHJhdGUpCit7CisJdTMyIGk7CisJc3RhdGljIHUzMiB2YWxbOF0gPSB7CisJCTB4MzUyODAwMDAsIDB4MzRBNzAwMDAsIDB4MzIwMjAwMDAsIDB4MzE3NzAwMDAsCisJCTB4MzEzOTAwMDAsIDB4MzFDOTAwMDAsIDB4MzNEMDAwMDAsIDB4NDAwMDAwMDAKKwl9OworCQorCWlmIChyYXRlID09IDQ0MTAwKQorCQlyZXR1cm4gMHgzNzBBMDAwMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlpZiAocmF0ZSA8PSBkZWZfcmF0ZVtpXSkKKwkJCXJldHVybiB2YWxbaV07CisJcmV0dXJuIHZhbFswXTsKK30KKworLyoKKyAqICBIYXJkd2FyZSBzdGFydCBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9od19zdGFydCh5bWZwY2lfdCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKGNoaXAtPnN0YXJ0X2NvdW50KysgPiAwKQorCQlnb3RvIF9fZW5kOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NT0RFLAorCQkJICBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9NT0RFKSB8IDMpOworCWNoaXAtPmFjdGl2ZV9iYW5rID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfQ1RSTFNFTEVDVCkgJiAxOworICAgICAgX19lbmQ6CisgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9od19zdG9wKHltZnBjaV90ICpjaGlwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyB0aW1lb3V0ID0gMTAwMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICgtLWNoaXAtPnN0YXJ0X2NvdW50ID4gMCkKKwkJZ290byBfX2VuZDsKKwlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTU9ERSwKKwkJCSAgc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTU9ERSkgJiB+Myk7CisJd2hpbGUgKHRpbWVvdXQtLSA+IDApIHsKKwkJaWYgKChzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9TVEFUVVMpICYgMikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmNoaXAtPmludGVycnVwdF9zbGVlcF9jb3VudCkpIHsKKwkJYXRvbWljX3NldCgmY2hpcC0+aW50ZXJydXB0X3NsZWVwX2NvdW50LCAwKTsKKwkJd2FrZV91cCgmY2hpcC0+aW50ZXJydXB0X3NsZWVwKTsKKwl9CisgICAgICBfX2VuZDoKKyAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogIFBsYXliYWNrIHZvaWNlIG1hbmFnZW1lbnQKKyAqLworCitzdGF0aWMgaW50IHZvaWNlX2FsbG9jKHltZnBjaV90ICpjaGlwLCB5bWZwY2lfdm9pY2VfdHlwZV90IHR5cGUsIGludCBwYWlyLCB5bWZwY2lfdm9pY2VfdCAqKnJ2b2ljZSkKK3sKKwl5bWZwY2lfdm9pY2VfdCAqdm9pY2UsICp2b2ljZTI7CisJaW50IGlkeDsKKwkKKwkqcnZvaWNlID0gTlVMTDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsgaWR4ICs9IHBhaXIgPyAyIDogMSkgeworCQl2b2ljZSA9ICZjaGlwLT52b2ljZXNbaWR4XTsKKwkJdm9pY2UyID0gcGFpciA/ICZjaGlwLT52b2ljZXNbaWR4KzFdIDogTlVMTDsKKwkJaWYgKHZvaWNlLT51c2UgfHwgKHZvaWNlMiAmJiB2b2ljZTItPnVzZSkpCisJCQljb250aW51ZTsKKwkJdm9pY2UtPnVzZSA9IDE7CisJCWlmICh2b2ljZTIpCisJCQl2b2ljZTItPnVzZSA9IDE7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFlNRlBDSV9QQ006CisJCQl2b2ljZS0+cGNtID0gMTsKKwkJCWlmICh2b2ljZTIpCisJCQkJdm9pY2UyLT5wY20gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgWU1GUENJX1NZTlRIOgorCQkJdm9pY2UtPnN5bnRoID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFlNRlBDSV9NSURJOgorCQkJdm9pY2UtPm1pZGkgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJc25kX3ltZnBjaV9od19zdGFydChjaGlwKTsKKwkJaWYgKHZvaWNlMikKKwkJCXNuZF95bWZwY2lfaHdfc3RhcnQoY2hpcCk7CisJCSpydm9pY2UgPSB2b2ljZTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfdm9pY2VfYWxsb2MoeW1mcGNpX3QgKmNoaXAsIHltZnBjaV92b2ljZV90eXBlX3QgdHlwZSwgaW50IHBhaXIsIHltZnBjaV92b2ljZV90ICoqcnZvaWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdDsKKwkKKwlzbmRfYXNzZXJ0KHJ2b2ljZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJc25kX2Fzc2VydCghcGFpciB8fCB0eXBlID09IFlNRlBDSV9QQ00sIHJldHVybiAtRUlOVkFMKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWZvciAoOzspIHsKKwkJcmVzdWx0ID0gdm9pY2VfYWxsb2MoY2hpcCwgdHlwZSwgcGFpciwgcnZvaWNlKTsKKwkJaWYgKHJlc3VsdCA9PSAwIHx8IHR5cGUgIT0gWU1GUENJX1BDTSkKKwkJCWJyZWFrOworCQkvKiBUT0RPOiBzeW50aC9taWRpIHZvaWNlIGRlYWxsb2NhdGlvbiAqLworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwkKKwlyZXR1cm4gcmVzdWx0OwkJCit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV92b2ljZV9mcmVlKHltZnBjaV90ICpjaGlwLCB5bWZwY2lfdm9pY2VfdCAqcHZvaWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCXNuZF95bWZwY2lfaHdfc3RvcChjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gMDsKKwlwdm9pY2UtPnlwY20gPSBOVUxMOworCXB2b2ljZS0+aW50ZXJydXB0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUENNIHBhcnQKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX3BjbV9pbnRlcnJ1cHQoeW1mcGNpX3QgKmNoaXAsIHltZnBjaV92b2ljZV90ICp2b2ljZSkKK3sKKwl5bWZwY2lfcGNtX3QgKnlwY207CisJdTMyIHBvcywgZGVsdGE7CisJCisJaWYgKCh5cGNtID0gdm9pY2UtPnlwY20pID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoeXBjbS0+c3Vic3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoeXBjbS0+cnVubmluZykgeworCQlwb3MgPSBsZTMyX3RvX2NwdSh2b2ljZS0+YmFua1tjaGlwLT5hY3RpdmVfYmFua10uc3RhcnQpOworCQlpZiAocG9zIDwgeXBjbS0+bGFzdF9wb3MpCisJCQlkZWx0YSA9IHBvcyArICh5cGNtLT5idWZmZXJfc2l6ZSAtIHlwY20tPmxhc3RfcG9zKTsKKwkJZWxzZQorCQkJZGVsdGEgPSBwb3MgLSB5cGNtLT5sYXN0X3BvczsKKwkJeXBjbS0+cGVyaW9kX3BvcyArPSBkZWx0YTsKKwkJeXBjbS0+bGFzdF9wb3MgPSBwb3M7CisJCWlmICh5cGNtLT5wZXJpb2RfcG9zID49IHlwY20tPnBlcmlvZF9zaXplKSB7CisJCQkvLyBwcmludGsoImRvbmUgLSBhY3RpdmVfYmFuayA9IDB4JXgsIHN0YXJ0ID0gMHgleFxuIiwgY2hpcC0+YWN0aXZlX2JhbmssIHZvaWNlLT5iYW5rW2NoaXAtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CisJCQl5cGNtLT5wZXJpb2RfcG9zICU9IHlwY20tPnBlcmlvZF9zaXplOworCQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoeXBjbS0+c3Vic3RyZWFtKTsKKwkJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfcGNtX2NhcHR1cmVfaW50ZXJydXB0KHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJeW1mcGNpX3QgKmNoaXAgPSB5cGNtLT5jaGlwOworCXUzMiBwb3MsIGRlbHRhOworCQorCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmICh5cGNtLT5ydW5uaW5nKSB7CisJCXBvcyA9IGxlMzJfdG9fY3B1KGNoaXAtPmJhbmtfY2FwdHVyZVt5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyXVtjaGlwLT5hY3RpdmVfYmFua10tPnN0YXJ0KSA+PiB5cGNtLT5zaGlmdDsKKwkJaWYgKHBvcyA8IHlwY20tPmxhc3RfcG9zKQorCQkJZGVsdGEgPSBwb3MgKyAoeXBjbS0+YnVmZmVyX3NpemUgLSB5cGNtLT5sYXN0X3Bvcyk7CisJCWVsc2UKKwkJCWRlbHRhID0gcG9zIC0geXBjbS0+bGFzdF9wb3M7CisJCXlwY20tPnBlcmlvZF9wb3MgKz0gZGVsdGE7CisJCXlwY20tPmxhc3RfcG9zID0gcG9zOworCQlpZiAoeXBjbS0+cGVyaW9kX3BvcyA+PSB5cGNtLT5wZXJpb2Rfc2l6ZSkgeworCQkJeXBjbS0+cGVyaW9kX3BvcyAlPSB5cGNtLT5wZXJpb2Rfc2l6ZTsKKwkJCS8vIHByaW50aygiZG9uZSAtIGFjdGl2ZV9iYW5rID0gMHgleCwgc3RhcnQgPSAweCV4XG4iLCBjaGlwLT5hY3RpdmVfYmFuaywgdm9pY2UtPmJhbmtbY2hpcC0+YWN0aXZlX2JhbmtdLnN0YXJ0KTsKKwkJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfdHJpZ2dlcihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSAgICAgICBpbnQgY21kKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXltZnBjaV9wY21fdCAqeXBjbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXN1bHQgPSAwOworCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKHlwY20tPnZvaWNlc1swXSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gX191bmxvY2s7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWNoaXAtPmN0cmxfcGxheWJhY2tbeXBjbS0+dm9pY2VzWzBdLT5udW1iZXIgKyAxXSA9IGNwdV90b19sZTMyKHlwY20tPnZvaWNlc1swXS0+YmFua19hZGRyKTsKKwkJaWYgKHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMKQorCQkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gY3B1X3RvX2xlMzIoeXBjbS0+dm9pY2VzWzFdLT5iYW5rX2FkZHIpOworCQl5cGNtLT5ydW5uaW5nID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCWNoaXAtPmN0cmxfcGxheWJhY2tbeXBjbS0+dm9pY2VzWzBdLT5udW1iZXIgKyAxXSA9IDA7CisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCkKKwkJCWNoaXAtPmN0cmxfcGxheWJhY2tbeXBjbS0+dm9pY2VzWzFdLT5udW1iZXIgKyAxXSA9IDA7CisJCXlwY20tPnJ1bm5pbmcgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisgICAgICBfX3VubG9jazoKKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CitzdGF0aWMgaW50IHNuZF95bWZwY2lfY2FwdHVyZV90cmlnZ2VyKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0sCisJCQkJICAgICAgaW50IGNtZCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1MzIgdG1wOworCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJdG1wID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTUFQT0ZSRUMpIHwgKDEgPDwgeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlcik7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NQVBPRlJFQywgdG1wKTsKKwkJeXBjbS0+cnVubmluZyA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQl0bXAgPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9NQVBPRlJFQykgJiB+KDEgPDwgeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlcik7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NQVBPRlJFQywgdG1wKTsKKwkJeXBjbS0+cnVubmluZyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wY21fdm9pY2VfYWxsb2MoeW1mcGNpX3BjbV90ICp5cGNtLCBpbnQgdm9pY2VzKQoreworCWludCBlcnI7CisKKwlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwgJiYgdm9pY2VzIDwgMikgeworCQlzbmRfeW1mcGNpX3ZvaWNlX2ZyZWUoeXBjbS0+Y2hpcCwgeXBjbS0+dm9pY2VzWzFdKTsKKwkJeXBjbS0+dm9pY2VzWzFdID0gTlVMTDsKKwl9CisJaWYgKHZvaWNlcyA9PSAxICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA9PSAyICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA+IDEpIHsKKwkJaWYgKHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSA9PSBOVUxMKSB7CisJCQlzbmRfeW1mcGNpX3ZvaWNlX2ZyZWUoeXBjbS0+Y2hpcCwgeXBjbS0+dm9pY2VzWzBdKTsKKwkJCXlwY20tPnZvaWNlc1swXSA9IE5VTEw7CisJCX0JCQorCX0KKwllcnIgPSBzbmRfeW1mcGNpX3ZvaWNlX2FsbG9jKHlwY20tPmNoaXAsIFlNRlBDSV9QQ00sIHZvaWNlcyA+IDEsICZ5cGNtLT52b2ljZXNbMF0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXlwY20tPnZvaWNlc1swXS0+eXBjbSA9IHlwY207CisJeXBjbS0+dm9pY2VzWzBdLT5pbnRlcnJ1cHQgPSBzbmRfeW1mcGNpX3BjbV9pbnRlcnJ1cHQ7CisJaWYgKHZvaWNlcyA+IDEpIHsKKwkJeXBjbS0+dm9pY2VzWzFdID0gJnlwY20tPmNoaXAtPnZvaWNlc1t5cGNtLT52b2ljZXNbMF0tPm51bWJlciArIDFdOworCQl5cGNtLT52b2ljZXNbMV0tPnlwY20gPSB5cGNtOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9wY21faW5pdF92b2ljZSh5bWZwY2lfdm9pY2VfdCAqdm9pY2UsIGludCBzdGVyZW8sCisJCQkJICAgICAgaW50IHJhdGUsIGludCB3XzE2LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGVuZCwKKwkJCQkgICAgICBpbnQgb3V0cHV0X2Zyb250LCBpbnQgb3V0cHV0X3JlYXIpCit7CisJdTMyIGZvcm1hdDsKKwl1MzIgZGVsdGEgPSBzbmRfeW1mcGNpX2NhbGNfZGVsdGEocmF0ZSk7CisJdTMyIGxwZlEgPSBzbmRfeW1mcGNpX2NhbGNfbHBmUShyYXRlKTsKKwl1MzIgbHBmSyA9IHNuZF95bWZwY2lfY2FsY19scGZLKHJhdGUpOworCXNuZF95bWZwY2lfcGxheWJhY2tfYmFua190ICpiYW5rOworCXVuc2lnbmVkIGludCBuYmFuazsKKworCXNuZF9hc3NlcnQodm9pY2UgIT0gTlVMTCwgcmV0dXJuKTsKKwlmb3JtYXQgPSAoc3RlcmVvID8gMHgwMDAxMDAwMCA6IDApIHwgKHdfMTYgPyAwIDogMHg4MDAwMDAwMCk7CisJZm9yIChuYmFuayA9IDA7IG5iYW5rIDwgMjsgbmJhbmsrKykgeworCQliYW5rID0gJnZvaWNlLT5iYW5rW25iYW5rXTsKKwkJYmFuay0+Zm9ybWF0ID0gY3B1X3RvX2xlMzIoZm9ybWF0KTsKKwkJYmFuay0+bG9vcF9kZWZhdWx0ID0gMDsKKwkJYmFuay0+YmFzZSA9IGNwdV90b19sZTMyKGFkZHIpOworCQliYW5rLT5sb29wX3N0YXJ0ID0gMDsKKwkJYmFuay0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMihlbmQpOworCQliYW5rLT5sb29wX2ZyYWMgPSAwOworCQliYW5rLT5lZ19nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOworCQliYW5rLT5scGZRID0gY3B1X3RvX2xlMzIobHBmUSk7CisJCWJhbmstPnN0YXR1cyA9IDA7CisJCWJhbmstPm51bV9vZl9mcmFtZXMgPSAwOworCQliYW5rLT5sb29wX2NvdW50ID0gMDsKKwkJYmFuay0+c3RhcnQgPSAwOworCQliYW5rLT5zdGFydF9mcmFjID0gMDsKKwkJYmFuay0+ZGVsdGEgPQorCQliYW5rLT5kZWx0YV9lbmQgPSBjcHVfdG9fbGUzMihkZWx0YSk7CisJCWJhbmstPmxwZksgPQorCQliYW5rLT5scGZLX2VuZCA9IGNwdV90b19sZTMyKGxwZkspOworCQliYW5rLT5lZ19nYWluID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJCWJhbmstPmxwZkQxID0KKwkJYmFuay0+bHBmRDIgPSAwOworCisJCWJhbmstPmxlZnRfZ2FpbiA9IAorCQliYW5rLT5yaWdodF9nYWluID0KKwkJYmFuay0+bGVmdF9nYWluX2VuZCA9CisJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0KKwkJYmFuay0+ZWZmMV9nYWluID0KKwkJYmFuay0+ZWZmMl9nYWluID0KKwkJYmFuay0+ZWZmM19nYWluID0KKwkJYmFuay0+ZWZmMV9nYWluX2VuZCA9CisJCWJhbmstPmVmZjJfZ2Fpbl9lbmQgPQorCQliYW5rLT5lZmYzX2dhaW5fZW5kID0gMDsKKworCQlpZiAoIXN0ZXJlbykgeworCQkJaWYgKG91dHB1dF9mcm9udCkgeworCQkJCWJhbmstPmxlZnRfZ2FpbiA9IAorCQkJCWJhbmstPnJpZ2h0X2dhaW4gPQorCQkJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPQorCQkJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJCQl9CisJCQlpZiAob3V0cHV0X3JlYXIpIHsKKwkJCQliYW5rLT5lZmYyX2dhaW4gPQorCQkJCWJhbmstPmVmZjJfZ2Fpbl9lbmQgPQorCQkJCWJhbmstPmVmZjNfZ2FpbiA9CisJCQkJYmFuay0+ZWZmM19nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG91dHB1dF9mcm9udCkgeworCQkJCWlmICgodm9pY2UtPm51bWJlciAmIDEpID09IDApIHsKKwkJCQkJYmFuay0+bGVmdF9nYWluID0KKwkJCQkJYmFuay0+bGVmdF9nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOworCQkJCX0gZWxzZSB7CisJCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkJYmFuay0+cmlnaHRfZ2FpbiA9CisJCQkJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJCQkJfQorCQkJfQorCQkJaWYgKG91dHB1dF9yZWFyKSB7CisJCQkJaWYgKCh2b2ljZS0+bnVtYmVyICYgMSkgPT0gMCkgeworCQkJCQliYW5rLT5lZmYzX2dhaW4gPQorCQkJCQliYW5rLT5lZmYzX2dhaW5fZW5kID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmFuay0+Zm9ybWF0IHw9IGNwdV90b19sZTMyKDEpOworCQkJCQliYW5rLT5lZmYyX2dhaW4gPQorCQkJCQliYW5rLT5lZmYyX2dhaW5fZW5kID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfeW1mcGNpX2FjM19pbml0KHltZnBjaV90ICpjaGlwKQoreworCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCTQwOTYsICZjaGlwLT5hYzNfdG1wX2Jhc2UpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwLT5iYW5rX2VmZmVjdFszXVswXS0+YmFzZSA9CisJY2hpcC0+YmFua19lZmZlY3RbM11bMV0tPmJhc2UgPSBjcHVfdG9fbGUzMihjaGlwLT5hYzNfdG1wX2Jhc2UuYWRkcik7CisJY2hpcC0+YmFua19lZmZlY3RbM11bMF0tPmxvb3BfZW5kID0KKwljaGlwLT5iYW5rX2VmZmVjdFszXVsxXS0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMigxMDI0KTsKKwljaGlwLT5iYW5rX2VmZmVjdFs0XVswXS0+YmFzZSA9CisJY2hpcC0+YmFua19lZmZlY3RbNF1bMV0tPmJhc2UgPSBjcHVfdG9fbGUzMihjaGlwLT5hYzNfdG1wX2Jhc2UuYWRkciArIDIwNDgpOworCWNoaXAtPmJhbmtfZWZmZWN0WzRdWzBdLT5sb29wX2VuZCA9CisJY2hpcC0+YmFua19lZmZlY3RbNF1bMV0tPmxvb3BfZW5kID0gY3B1X3RvX2xlMzIoMTAyNCk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX01BUE9GRUZGRUNULAorCQkJICBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9NQVBPRkVGRkVDVCkgfCAzIDw8IDMpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfYWMzX2RvbmUoeW1mcGNpX3QgKmNoaXApCit7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NQVBPRkVGRkVDVCwKKwkJCSAgc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTUFQT0ZFRkZFQ1QpICYgfigzIDw8IDMpKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkvLyBzbmRfeW1mcGNpX2lycV93YWl0KGNoaXApOworCWlmIChjaGlwLT5hYzNfdG1wX2Jhc2UuYXJlYSkgeworCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmFjM190bXBfYmFzZSk7CisJCWNoaXAtPmFjM190bXBfYmFzZS5hcmVhID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wbGF5YmFja19od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJIHNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJeW1mcGNpX3BjbV90ICp5cGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVyciA9IHNuZF95bWZwY2lfcGNtX3ZvaWNlX2FsbG9jKHlwY20sIHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXltZnBjaV9wY21fdCAqeXBjbTsKKwkKKwlpZiAocnVudGltZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCXlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwkvKiB3YWl0LCB1bnRpbCB0aGUgUENJIG9wZXJhdGlvbnMgYXJlIG5vdCBmaW5pc2hlZCAqLworCXNuZF95bWZwY2lfaXJxX3dhaXQoY2hpcCk7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCWlmICh5cGNtLT52b2ljZXNbMV0pIHsKKwkJc25kX3ltZnBjaV92b2ljZV9mcmVlKGNoaXAsIHlwY20tPnZvaWNlc1sxXSk7CisJCXlwY20tPnZvaWNlc1sxXSA9IE5VTEw7CisJfQorCWlmICh5cGNtLT52b2ljZXNbMF0pIHsKKwkJc25kX3ltZnBjaV92b2ljZV9mcmVlKGNoaXAsIHlwY20tPnZvaWNlc1swXSk7CisJCXlwY20tPnZvaWNlc1swXSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCS8vIHltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXltZnBjaV9wY21fdCAqeXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbnZvaWNlOworCisJeXBjbS0+cGVyaW9kX3NpemUgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwl5cGNtLT5idWZmZXJfc2l6ZSA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCXlwY20tPnBlcmlvZF9wb3MgPSAwOworCXlwY20tPmxhc3RfcG9zID0gMDsKKwlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IHJ1bnRpbWUtPmNoYW5uZWxzOyBudm9pY2UrKykKKwkJc25kX3ltZnBjaV9wY21faW5pdF92b2ljZSh5cGNtLT52b2ljZXNbbnZvaWNlXSwKKwkJCQkJICBydW50aW1lLT5jaGFubmVscyA9PSAyLAorCQkJCQkgIHJ1bnRpbWUtPnJhdGUsCisJCQkJCSAgc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNiwKKwkJCQkJICBydW50aW1lLT5kbWFfYWRkciwKKwkJCQkJICB5cGNtLT5idWZmZXJfc2l6ZSwKKwkJCQkJICB5cGNtLT5vdXRwdXRfZnJvbnQsCisJCQkJCSAgeXBjbS0+b3V0cHV0X3JlYXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfY2FwdHVyZV9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkJc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2NhcHR1cmVfaHdfZnJlZShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJLyogd2FpdCwgdW50aWwgdGhlIFBDSSBvcGVyYXRpb25zIGFyZSBub3QgZmluaXNoZWQgKi8KKwlzbmRfeW1mcGNpX2lycV93YWl0KGNoaXApOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9jYXB0dXJlX3ByZXBhcmUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc25kX3ltZnBjaV9jYXB0dXJlX2JhbmtfdCAqIGJhbms7CisJaW50IG5iYW5rOworCXUzMiByYXRlLCBmb3JtYXQ7CisKKwl5cGNtLT5wZXJpb2Rfc2l6ZSA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCXlwY20tPmJ1ZmZlcl9zaXplID0gcnVudGltZS0+YnVmZmVyX3NpemU7CisJeXBjbS0+cGVyaW9kX3BvcyA9IDA7CisJeXBjbS0+bGFzdF9wb3MgPSAwOworCXlwY20tPnNoaWZ0ID0gMDsKKwlyYXRlID0gKCg0ODAwMCAqIDQwOTYpIC8gcnVudGltZS0+cmF0ZSkgLSAxOworCWZvcm1hdCA9IDA7CisJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDIpIHsKKwkJZm9ybWF0IHw9IDI7CisJCXlwY20tPnNoaWZ0Kys7CisJfQorCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDgpCisJCWZvcm1hdCB8PSAxOworCWVsc2UKKwkJeXBjbS0+c2hpZnQrKzsKKwlzd2l0Y2ggKHlwY20tPmNhcHR1cmVfYmFua19udW1iZXIpIHsKKwljYXNlIDA6CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9SRUNGT1JNQVQsIGZvcm1hdCk7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9SRUNTTE9UU1IsIHJhdGUpOworCQlicmVhazsKKwljYXNlIDE6CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9BRENGT1JNQVQsIGZvcm1hdCk7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9BRENTTE9UU1IsIHJhdGUpOworCQlicmVhazsKKwl9CisJZm9yIChuYmFuayA9IDA7IG5iYW5rIDwgMjsgbmJhbmsrKykgeworCQliYW5rID0gY2hpcC0+YmFua19jYXB0dXJlW3lwY20tPmNhcHR1cmVfYmFua19udW1iZXJdW25iYW5rXTsKKwkJYmFuay0+YmFzZSA9IGNwdV90b19sZTMyKHJ1bnRpbWUtPmRtYV9hZGRyKTsKKwkJYmFuay0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMih5cGNtLT5idWZmZXJfc2l6ZSA8PCB5cGNtLT5zaGlmdCk7CisJCWJhbmstPnN0YXJ0ID0gMDsKKwkJYmFuay0+bnVtX29mX2xvb3BzID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfeW1mcGNpX3BsYXliYWNrX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJeW1mcGNpX3ZvaWNlX3QgKnZvaWNlID0geXBjbS0+dm9pY2VzWzBdOworCisJaWYgKCEoeXBjbS0+cnVubmluZyAmJiB2b2ljZSkpCisJCXJldHVybiAwOworCXJldHVybiBsZTMyX3RvX2NwdSh2b2ljZS0+YmFua1tjaGlwLT5hY3RpdmVfYmFua10uc3RhcnQpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3ltZnBjaV9jYXB0dXJlX3BvaW50ZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXlwY20tPnJ1bm5pbmcpCisJCXJldHVybiAwOworCXJldHVybiBsZTMyX3RvX2NwdShjaGlwLT5iYW5rX2NhcHR1cmVbeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlcl1bY2hpcC0+YWN0aXZlX2JhbmtdLT5zdGFydCkgPj4geXBjbS0+c2hpZnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfaXJxX3dhaXQoeW1mcGNpX3QgKmNoaXApCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IGxvb3BzID0gNDsKKworCXdoaWxlIChsb29wcy0tID4gMCkgeworCQlpZiAoKHNuZF95bWZwY2lfcmVhZGwoY2hpcCwgWURTWEdSX01PREUpICYgMykgPT0gMCkKKwkJIAljb250aW51ZTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+aW50ZXJydXB0X3NsZWVwLCAmd2FpdCk7CisJCWF0b21pY19pbmMoJmNoaXAtPmludGVycnVwdF9zbGVlcF9jb3VudCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWi8yMCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT5pbnRlcnJ1cHRfc2xlZXAsICZ3YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbmRfeW1mcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXltZnBjaV90ICpjaGlwID0gZGV2X2lkOworCXUzMiBzdGF0dXMsIG52b2ljZSwgbW9kZTsKKwl5bWZwY2lfdm9pY2VfdCAqdm9pY2U7CisKKwlzdGF0dXMgPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9TVEFUVVMpOworCWlmIChzdGF0dXMgJiAweDgwMDAwMDAwKSB7CisJCWNoaXAtPmFjdGl2ZV9iYW5rID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfQ1RSTFNFTEVDVCkgJiAxOworCQlzcGluX2xvY2soJmNoaXAtPnZvaWNlX2xvY2spOworCQlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCXZvaWNlID0gJmNoaXAtPnZvaWNlc1tudm9pY2VdOworCQkJaWYgKHZvaWNlLT5pbnRlcnJ1cHQpCisJCQkJdm9pY2UtPmludGVycnVwdChjaGlwLCB2b2ljZSk7CisJCX0KKwkJZm9yIChudm9pY2UgPSAwOyBudm9pY2UgPCBZRFNYR19DQVBUVVJFX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCWlmIChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbVtudm9pY2VdKQorCQkJCXNuZF95bWZwY2lfcGNtX2NhcHR1cmVfaW50ZXJydXB0KGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtW252b2ljZV0pOworCQl9CisjaWYgMAorCQlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IFlEU1hHX0VGRkVDVF9WT0lDRVM7IG52b2ljZSsrKSB7CisJCQlpZiAoY2hpcC0+ZWZmZWN0X3N1YnN0cmVhbVtudm9pY2VdKQorCQkJCXNuZF95bWZwY2lfcGNtX2VmZmVjdF9pbnRlcnJ1cHQoY2hpcC0+ZWZmZWN0X3N1YnN0cmVhbVtudm9pY2VdKTsKKwkJfQorI2VuZGlmCisJCXNwaW5fdW5sb2NrKCZjaGlwLT52b2ljZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9TVEFUVVMsIDB4ODAwMDAwMDApOworCQltb2RlID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTU9ERSkgfCAyOworCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTU9ERSwgbW9kZSk7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZjaGlwLT5pbnRlcnJ1cHRfc2xlZXBfY291bnQpKSB7CisJCQlhdG9taWNfc2V0KCZjaGlwLT5pbnRlcnJ1cHRfc2xlZXBfY291bnQsIDApOworCQkJd2FrZV91cCgmY2hpcC0+aW50ZXJydXB0X3NsZWVwKTsKKwkJfQorCX0KKworCXN0YXR1cyA9IHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgWURTWEdSX0lOVEZMQUcpOworCWlmIChzdGF0dXMgJiAxKSB7CisJCWlmIChjaGlwLT50aW1lcikKKwkJCXNuZF90aW1lcl9pbnRlcnJ1cHQoY2hpcC0+dGltZXIsIGNoaXAtPnRpbWVyLT5zdGlja3MpOworCX0KKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfSU5URkxBRywgc3RhdHVzKTsKKworCWlmIChjaGlwLT5yYXdtaWRpKQorCQlzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KGlycSwgY2hpcC0+cmF3bWlkaS0+cHJpdmF0ZV9kYXRhLCByZWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3ltZnBjaV9wbGF5YmFjayA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IAorCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkyNTYgKiAxMDI0LCAvKiBGSVhNRTogZW5vdWdoPyAqLworCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkyNTYgKiAxMDI0LCAvKiBGSVhNRTogZW5vdWdoPyAqLworCS5wZXJpb2RzX21pbiA9CQkzLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3Qgc25kX3ltZnBjaV9jYXB0dXJlID0KK3sKKwkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk4MDAwLAorCS5yYXRlX21heCA9CQk0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTEsCisJLmNoYW5uZWxzX21heCA9CQkyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JMjU2ICogMTAyNCwgLyogRklYTUU6IGVub3VnaD8gKi8KKwkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMjU2ICogMTAyNCwgLyogRklYTUU6IGVub3VnaD8gKi8KKwkucGVyaW9kc19taW4gPQkJMywKKwkucGVyaW9kc19tYXggPQkJMTAyNCwKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX3BjbV9mcmVlX3N1YnN0cmVhbShzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCisJa2ZyZWUoeXBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wbGF5YmFja19vcGVuXzEoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY207CisKKwl5cGNtID0ga2NhbGxvYygxLCBzaXplb2YoKnlwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoeXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl5cGNtLT5jaGlwID0gY2hpcDsKKwl5cGNtLT50eXBlID0gUExBWUJBQ0tfVk9JQ0U7CisJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPmh3ID0gc25kX3ltZnBjaV9wbGF5YmFjazsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOworCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOworCS8qIEZJWE1FPyBUcnVlIHZhbHVlIGlzIDI1Ni80OCA9IDUuMzMzMzMgbXMgKi8KKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRSwgNTMzMywgVUlOVF9NQVgpOworCXJldHVybiAwOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgeW1mcGNpX29wZW5fZXh0ZW5zaW9uKHltZnBjaV90ICpjaGlwKQoreworCWlmICghIGNoaXAtPnJlYXJfb3BlbmVkKSB7CisJCWlmICghIGNoaXAtPnNwZGlmX29wZW5lZCkgLyogc2V0IEFDMyAqLworCQkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX01PREUsCisJCQkJCSAgc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTU9ERSkgfCAoMSA8PCAzMCkpOworCQkvKiBlbmFibGUgc2Vjb25kIGNvZGVjICg0Q0hFTikgKi8KKwkJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NFQ0NPTkZJRywKKwkJCQkgIChzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9TRUNDT05GSUcpICYgfjB4MDMzMCkgfCAweDAwMTApOworCX0KK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIHltZnBjaV9jbG9zZV9leHRlbnNpb24oeW1mcGNpX3QgKmNoaXApCit7CisJaWYgKCEgY2hpcC0+cmVhcl9vcGVuZWQpIHsKKwkJaWYgKCEgY2hpcC0+c3BkaWZfb3BlbmVkKQorCQkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX01PREUsCisJCQkJCSAgc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTU9ERSkgJiB+KDEgPDwgMzApKTsKKwkJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NFQ0NPTkZJRywKKwkJCQkgIChzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9TRUNDT05GSUcpICYgfjB4MDMzMCkgJiB+MHgwMDEwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wbGF5YmFja19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJeW1mcGNpX3BjbV90ICp5cGNtOworCWludCBlcnI7CisJCisJaWYgKChlcnIgPSBzbmRfeW1mcGNpX3BsYXliYWNrX29wZW5fMShzdWJzdHJlYW0pKSA8IDApCisJCXJldHVybiBlcnI7CisJeXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl5cGNtLT5vdXRwdXRfZnJvbnQgPSAxOworCXlwY20tPm91dHB1dF9yZWFyID0gY2hpcC0+bW9kZV9kdXA0Y2ggPyAxIDogMDsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKHlwY20tPm91dHB1dF9yZWFyKSB7CisJCXltZnBjaV9vcGVuX2V4dGVuc2lvbihjaGlwKTsKKwkJY2hpcC0+cmVhcl9vcGVuZWQrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wbGF5YmFja19zcGRpZl9vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJeW1mcGNpX3BjbV90ICp5cGNtOworCWludCBlcnI7CisJCisJaWYgKChlcnIgPSBzbmRfeW1mcGNpX3BsYXliYWNrX29wZW5fMShzdWJzdHJlYW0pKSA8IDApCisJCXJldHVybiBlcnI7CisJeXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl5cGNtLT5vdXRwdXRfZnJvbnQgPSAwOworCXlwY20tPm91dHB1dF9yZWFyID0gMTsKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NQRElGT1VUQ1RSTCwKKwkJCSAgc25kX3ltZnBjaV9yZWFkdyhjaGlwLCBZRFNYR1JfU1BESUZPVVRDVFJMKSB8IDIpOworCXltZnBjaV9vcGVuX2V4dGVuc2lvbihjaGlwKTsKKwljaGlwLT5zcGRpZl9wY21fYml0cyA9IGNoaXAtPnNwZGlmX2JpdHM7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NQRElGT1VUU1RBVFVTLCBjaGlwLT5zcGRpZl9wY21fYml0cyk7CisJY2hpcC0+c3BkaWZfb3BlbmVkKys7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwljaGlwLT5zcGRpZl9wY21fY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmY2hpcC0+c3BkaWZfcGNtX2N0bC0+aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wZW4oc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl5bWZwY2lfcGNtX3QgKnlwY207CisJaW50IGVycjsKKwkKKwlpZiAoKGVyciA9IHNuZF95bWZwY2lfcGxheWJhY2tfb3Blbl8xKHN1YnN0cmVhbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwl5cGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXlwY20tPm91dHB1dF9mcm9udCA9IDA7CisJeXBjbS0+b3V0cHV0X3JlYXIgPSAxOworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwl5bWZwY2lfb3Blbl9leHRlbnNpb24oY2hpcCk7CisJY2hpcC0+cmVhcl9vcGVuZWQrKzsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2NhcHR1cmVfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtLAorCQkJCSAgIHUzMiBjYXB0dXJlX2JhbmtfbnVtYmVyKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXltZnBjaV9wY21fdCAqeXBjbTsKKworCXlwY20gPSBrY2FsbG9jKDEsIHNpemVvZigqeXBjbSksIEdGUF9LRVJORUwpOworCWlmICh5cGNtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXlwY20tPmNoaXAgPSBjaGlwOworCXlwY20tPnR5cGUgPSBjYXB0dXJlX2JhbmtfbnVtYmVyICsgQ0FQVFVSRV9SRUM7CisJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwkKKwl5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID0gY2FwdHVyZV9iYW5rX251bWJlcjsKKwljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbVtjYXB0dXJlX2JhbmtfbnVtYmVyXSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5odyA9IHNuZF95bWZwY2lfY2FwdHVyZTsKKwkvKiBGSVhNRT8gVHJ1ZSB2YWx1ZSBpcyAyNTYvNDggPSA1LjMzMzMzIG1zICovCisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsIDUzMzMsIFVJTlRfTUFYKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOworCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOworCXNuZF95bWZwY2lfaHdfc3RhcnQoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9jYXB0dXJlX3JlY19vcGVuKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF95bWZwY2lfY2FwdHVyZV9vcGVuKHN1YnN0cmVhbSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfeW1mcGNpX2NhcHR1cmVfb3BlbihzdWJzdHJlYW0sIDEpOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2VfMShzbmRfcGNtX3N1YnN0cmVhbV90ICogc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl5bWZwY2lfcGNtX3QgKnlwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoeXBjbS0+b3V0cHV0X3JlYXIgJiYgY2hpcC0+cmVhcl9vcGVuZWQgPiAwKSB7CisJCWNoaXAtPnJlYXJfb3BlbmVkLS07CisJCXltZnBjaV9jbG9zZV9leHRlbnNpb24oY2hpcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiBzbmRfeW1mcGNpX3BsYXliYWNrX2Nsb3NlXzEoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJY2hpcC0+c3BkaWZfb3BlbmVkID0gMDsKKwl5bWZwY2lfY2xvc2VfZXh0ZW5zaW9uKGNoaXApOworCXNuZF95bWZwY2lfd3JpdGV3KGNoaXAsIFlEU1hHUl9TUERJRk9VVENUUkwsCisJCQkgIHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgWURTWEdSX1NQRElGT1VUQ1RSTCkgJiB+Mik7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NQRElGT1VUU1RBVFVTLCBjaGlwLT5zcGRpZl9iaXRzKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwljaGlwLT5zcGRpZl9wY21fY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKKwkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sICZjaGlwLT5zcGRpZl9wY21fY3RsLT5pZCk7CisJcmV0dXJuIHNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2VfMShzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcGxheWJhY2tfNGNoX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGNoaXAtPnJlYXJfb3BlbmVkID4gMCkgeworCQljaGlwLT5yZWFyX29wZW5lZC0tOworCQl5bWZwY2lfY2xvc2VfZXh0ZW5zaW9uKGNoaXApOworCX0KKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gc25kX3ltZnBjaV9wbGF5YmFja19jbG9zZV8xKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9jYXB0dXJlX2Nsb3NlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJeW1mcGNpX3BjbV90ICp5cGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHlwY20gIT0gTlVMTCkgeworCQljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbVt5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyXSA9IE5VTEw7CisJCXNuZF95bWZwY2lfaHdfc3RvcChjaGlwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF95bWZwY2lfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCQlzbmRfeW1mcGNpX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX3ltZnBjaV9wbGF5YmFja19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX3ltZnBjaV9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX3ltZnBjaV9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3ltZnBjaV9jYXB0dXJlX3JlY19vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF95bWZwY2lfY2FwdHVyZV9yZWNfb3BlbiwKKwkuY2xvc2UgPQkJc25kX3ltZnBjaV9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF95bWZwY2lfY2FwdHVyZV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX3ltZnBjaV9jYXB0dXJlX2h3X2ZyZWUsCisJLnByZXBhcmUgPQkJc25kX3ltZnBjaV9jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX3ltZnBjaV9jYXB0dXJlX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX3ltZnBjaV9jYXB0dXJlX3BvaW50ZXIsCit9OworCitzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX3BjbV9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXltZnBjaV90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtID0gTlVMTDsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfeW1mcGNpX3BjbSh5bWZwY2lfdCAqY2hpcCwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pCit7CisJc25kX3BjbV90ICpwY207CisJaW50IGVycjsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CisJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiWU1GUENJIiwgZGV2aWNlLCAzMiwgMSwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfeW1mcGNpX3BjbV9mcmVlOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF95bWZwY2lfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfeW1mcGNpX2NhcHR1cmVfcmVjX29wcyk7CisKKwkvKiBnbG9iYWwgc2V0dXAgKi8KKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsICJZTUZQQ0kiKTsKKwljaGlwLT5wY20gPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDI1NioxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fb3BzX3Qgc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BzID0geworCS5vcGVuID0JCQlzbmRfeW1mcGNpX2NhcHR1cmVfYWM5N19vcGVuLAorCS5jbG9zZSA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX3ltZnBjaV9jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfdHJpZ2dlciwKKwkucG9pbnRlciA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfcGNtMl9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXltZnBjaV90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtMiA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK2ludCBfX2RldmluaXQgc25kX3ltZnBjaV9wY20yKHltZnBjaV90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJZTUZQQ0kgLSBQQ00yIiwgZGV2aWNlLCAwLCAxLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtMl9mcmVlOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BzKTsKKworCS8qIGdsb2JhbCBzZXR1cCAqLworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3ByaW50ZihwY20tPm5hbWUsICJZTUZQQ0kgLSAlcyIsCisJCWNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQgPyAiRGlyZWN0IFJlY29yZGluZyIgOiAiQUMnOTciKTsKKwljaGlwLT5wY20yID0gcGNtOworCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLCA2NCoxMDI0LCAyNTYqMTAyNCk7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBwY207CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0geworCS5vcGVuID0JCQlzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX29wZW4sCisJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfY2xvc2UsCisJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQkJc25kX3ltZnBjaV9wbGF5YmFja19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQkJc25kX3ltZnBjaV9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfcHJlcGFyZSwKKwkudHJpZ2dlciA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQkJc25kX3ltZnBjaV9wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9wY21fc3BkaWZfZnJlZShzbmRfcGNtX3QgKnBjbSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHBjbS0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPnBjbV9zcGRpZiA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK2ludCBfX2RldmluaXQgc25kX3ltZnBjaV9wY21fc3BkaWYoeW1mcGNpX3QgKmNoaXAsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKiBycGNtKQoreworCXNuZF9wY21fdCAqcGNtOworCWludCBlcnI7CisKKwlpZiAocnBjbSkKKwkJKnJwY20gPSBOVUxMOworCWlmICgoZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIllNRlBDSSAtIElFQzk1OCIsIGRldmljZSwgMSwgMCwgJnBjbSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfeW1mcGNpX3BjbV9zcGRpZl9mcmVlOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfb3BzKTsKKworCS8qIGdsb2JhbCBzZXR1cCAqLworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIllNRlBDSSAtIElFQzk1OCIpOworCWNoaXAtPnBjbV9zcGRpZiA9IHBjbTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgMjU2KjEwMjQpOworCisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfeW1mcGNpX3BsYXliYWNrXzRjaF9vcHMgPSB7CisJLm9wZW4gPQkJCXNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wZW4sCisJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfNGNoX2Nsb3NlLAorCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JCXNuZF95bWZwY2lfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfaHdfZnJlZSwKKwkucHJlcGFyZSA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX3ByZXBhcmUsCisJLnRyaWdnZXIgPQkJc25kX3ltZnBjaV9wbGF5YmFja190cmlnZ2VyLAorCS5wb2ludGVyID0JCXNuZF95bWZwY2lfcGxheWJhY2tfcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfcGNtXzRjaF9mcmVlKHNuZF9wY21fdCAqcGNtKQoreworCXltZnBjaV90ICpjaGlwID0gcGNtLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+cGNtXzRjaCA9IE5VTEw7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK2ludCBfX2RldmluaXQgc25kX3ltZnBjaV9wY21fNGNoKHltZnBjaV90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKK3sKKwlzbmRfcGNtX3QgKnBjbTsKKwlpbnQgZXJyOworCisJaWYgKHJwY20pCisJCSpycGNtID0gTlVMTDsKKwlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJZTUZQQ0kgLSBSZWFyIiwgZGV2aWNlLCAxLCAwLCAmcGNtKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtXzRjaF9mcmVlOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wcyk7CisKKwkvKiBnbG9iYWwgc2V0dXAgKi8KKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cmNweShwY20tPm5hbWUsICJZTUZQQ0kgLSBSZWFyIFBDTSIpOworCWNoaXAtPnBjbV80Y2ggPSBwY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksIDY0KjEwMjQsIDI1NioxMDI0KTsKKworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3NwZGlmX2RlZmF1bHRfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9zcGRpZl9kZWZhdWx0X2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gKGNoaXAtPnNwZGlmX2JpdHMgPj4gMCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gKGNoaXAtPnNwZGlmX2JpdHMgPj4gOCkgJiAweGZmOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfc3BkaWZfZGVmYXVsdF9wdXQoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwKKwkJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gKCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSAmIDB4M2UpIDw8IDApIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCk7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoYW5nZSA9IGNoaXAtPnNwZGlmX2JpdHMgIT0gdmFsOworCWNoaXAtPnNwZGlmX2JpdHMgPSB2YWw7CisJaWYgKChzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9TUERJRk9VVENUUkwpICYgMSkgJiYgY2hpcC0+cGNtX3NwZGlmID09IE5VTEwpCisJCXNuZF95bWZwY2lfd3JpdGV3KGNoaXAsIFlEU1hHUl9TUERJRk9VVFNUQVRVUywgY2hpcC0+c3BkaWZfYml0cyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfeW1mcGNpX3NwZGlmX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9Cit7CisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJLmluZm8gPQkJc25kX3ltZnBjaV9zcGRpZl9kZWZhdWx0X2luZm8sCisJLmdldCA9CQlzbmRfeW1mcGNpX3NwZGlmX2RlZmF1bHRfZ2V0LAorCS5wdXQgPQkJc25kX3ltZnBjaV9zcGRpZl9kZWZhdWx0X3B1dAorfTsKKworc3RhdGljIGludCBzbmRfeW1mcGNpX3NwZGlmX21hc2tfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9zcGRpZl9tYXNrX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCSAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAweDNlOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdID0gMHhmZjsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfeW1mcGNpX3NwZGlmX21hc2sgX19kZXZpbml0ZGF0YSA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkuaW5mbyA9CQlzbmRfeW1mcGNpX3NwZGlmX21hc2tfaW5mbywKKwkuZ2V0ID0JCXNuZF95bWZwY2lfc3BkaWZfbWFza19nZXQsCit9OworCitzdGF0aWMgaW50IHNuZF95bWZwY2lfc3BkaWZfc3RyZWFtX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfc3BkaWZfc3RyZWFtX2dldChzbmRfa2NvbnRyb2xfdCAqIGtjb250cm9sLAorCQkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHVjb250cm9sKQoreworCXltZnBjaV90ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gKGNoaXAtPnNwZGlmX3BjbV9iaXRzID4+IDApICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChjaGlwLT5zcGRpZl9wY21fYml0cyA+PiA4KSAmIDB4ZmY7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9zcGRpZl9zdHJlYW1fcHV0KHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsCisJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlOworCisJdmFsID0gKCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSAmIDB4M2UpIDw8IDApIHwKKwkgICAgICAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCk7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWNoYW5nZSA9IGNoaXAtPnNwZGlmX3BjbV9iaXRzICE9IHZhbDsKKwljaGlwLT5zcGRpZl9wY21fYml0cyA9IHZhbDsKKwlpZiAoKHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgWURTWEdSX1NQRElGT1VUQ1RSTCkgJiAyKSkKKwkJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NQRElGT1VUU1RBVFVTLCBjaGlwLT5zcGRpZl9wY21fYml0cyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfeW1mcGNpX3NwZGlmX3N0cmVhbSBfX2RldmluaXRkYXRhID0KK3sKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQQ01fU1RSRUFNKSwKKwkuaW5mbyA9CQlzbmRfeW1mcGNpX3NwZGlmX3N0cmVhbV9pbmZvLAorCS5nZXQgPQkJc25kX3ltZnBjaV9zcGRpZl9zdHJlYW1fZ2V0LAorCS5wdXQgPQkJc25kX3ltZnBjaV9zcGRpZl9zdHJlYW1fcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF95bWZwY2lfZHJlY19zb3VyY2VfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzNdID0geyJBQyc5NyIsICJJRUM5NTgiLCAiWlYgUG9ydCJ9OworCisJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwlpbmZvLT5jb3VudCA9IDE7CisJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisJaWYgKGluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDIpCisJCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDI7CisJc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9kcmVjX3NvdXJjZV9nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWUpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTE2IHJlZzsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlyZWcgPSBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9HTE9CQUxDVFJMKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoIShyZWcgJiAweDEwMCkpCisJCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOworCWVsc2UKKwkJdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDEgKyAoKHJlZyAmIDB4MjAwKSAhPSAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2RyZWNfc291cmNlX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1MTYgcmVnLCBvbGRfcmVnOworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCW9sZF9yZWcgPSBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9HTE9CQUxDVFJMKTsKKwlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSAwKQorCQlyZWcgPSBvbGRfcmVnICYgfjB4MTAwOworCWVsc2UKKwkJcmVnID0gKG9sZF9yZWcgJiB+MHgzMDApIHwgMHgxMDAgfCAoKHZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gMikgPDwgOSk7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX0dMT0JBTENUUkwsIHJlZyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIHJlZyAhPSBvbGRfcmVnOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF95bWZwY2lfZHJlY19zb3VyY2UgX19kZXZpbml0ZGF0YSA9IHsKKwkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9CQkiRGlyZWN0IFJlY29yZGluZyBTb3VyY2UiLAorCS5pbmZvID0JCXNuZF95bWZwY2lfZHJlY19zb3VyY2VfaW5mbywKKwkuZ2V0ID0JCXNuZF95bWZwY2lfZHJlY19zb3VyY2VfZ2V0LAorCS5wdXQgPQkJc25kX3ltZnBjaV9kcmVjX3NvdXJjZV9wdXQKK307CisKKy8qCisgKiAgTWl4ZXIgY29udHJvbHMKKyAqLworCisjZGVmaW5lIFlNRlBDSV9TSU5HTEUoeG5hbWUsIHhpbmRleCwgcmVnKSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfeW1mcGNpX2luZm9fc2luZ2xlLCBcCisgIC5nZXQgPSBzbmRfeW1mcGNpX2dldF9zaW5nbGUsIC5wdXQgPSBzbmRfeW1mcGNpX3B1dF9zaW5nbGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSByZWcgfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfaW5mb19zaW5nbGUoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxOworCisJc3dpdGNoIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCWNhc2UgWURTWEdSX1NQRElGT1VUQ1RSTDogYnJlYWs7CisJY2FzZSBZRFNYR1JfU1BESUZJTkNUUkw6IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2dldF9zaW5nbGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gMCwgbWFzayA9IDEsIGludmVydCA9IDA7CisJCisJc3dpdGNoIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCWNhc2UgWURTWEdSX1NQRElGT1VUQ1RSTDogYnJlYWs7CisJY2FzZSBZRFNYR1JfU1BESUZJTkNUUkw6IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwlpZiAoaW52ZXJ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3B1dF9zaW5nbGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gMCwgbWFzayA9IDEsIGludmVydCA9IDA7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgdmFsLCBvdmFsOworCQorCXN3aXRjaCAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKKwljYXNlIFlEU1hHUl9TUERJRk9VVENUUkw6IGJyZWFrOworCWNhc2UgWURTWEdSX1NQRElGSU5DVFJMOiBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl2YWwgPDw9IHNoaWZ0OworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlvdmFsID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCByZWcpOworCXZhbCA9IChvdmFsICYgfihtYXNrIDw8IHNoaWZ0KSkgfCB2YWw7CisJY2hhbmdlID0gdmFsICE9IG92YWw7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgcmVnLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgWU1GUENJX0RPVUJMRSh4bmFtZSwgeGluZGV4LCByZWcpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF95bWZwY2lfaW5mb19kb3VibGUsIFwKKyAgLmdldCA9IHNuZF95bWZwY2lfZ2V0X2RvdWJsZSwgLnB1dCA9IHNuZF95bWZwY2lfcHV0X2RvdWJsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9IHJlZyB9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9pbmZvX2RvdWJsZShzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiB1aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxNjM4MzsKKworCWlmIChyZWcgPCAweDgwIHx8IHJlZyA+PSAweGMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2dldF9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNoaWZ0X2xlZnQgPSAwLCBzaGlmdF9yaWdodCA9IDE2LCBtYXNrID0gMTYzODMsIGludmVydCA9IDA7CisJdW5zaWduZWQgaW50IHZhbDsKKwkKKwlpZiAocmVnIDwgMHg4MCB8fCByZWcgPj0gMHhjMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCXZhbCA9IHNuZF95bWZwY2lfcmVhZGwoY2hpcCwgcmVnKTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh2YWwgPj4gc2hpZnRfbGVmdCkgJiBtYXNrOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gKHZhbCA+PiBzaGlmdF9yaWdodCkgJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3B1dF9kb3VibGUoc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNoaWZ0X2xlZnQgPSAwLCBzaGlmdF9yaWdodCA9IDE2LCBtYXNrID0gMTYzODMsIGludmVydCA9IDA7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBpbnQgdmFsMSwgdmFsMiwgb3ZhbDsKKwkKKwlpZiAocmVnIDwgMHg4MCB8fCByZWcgPj0gMHhjMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsMSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKKwl2YWwyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdmFsMSA9IG1hc2sgLSB2YWwxOworCQl2YWwyID0gbWFzayAtIHZhbDI7CisJfQorCXZhbDEgPDw9IHNoaWZ0X2xlZnQ7CisJdmFsMiA8PD0gc2hpZnRfcmlnaHQ7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCW92YWwgPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIHJlZyk7CisJdmFsMSA9IChvdmFsICYgfigobWFzayA8PCBzaGlmdF9sZWZ0KSB8IChtYXNrIDw8IHNoaWZ0X3JpZ2h0KSkpIHwgdmFsMSB8IHZhbDI7CisJY2hhbmdlID0gdmFsMSAhPSBvdmFsOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIHJlZywgdmFsMSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIDRjaCBkdXBsaWNhdGlvbgorICovCitzdGF0aWMgaW50IHNuZF95bWZwY2lfaW5mb19kdXA0Y2goc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICogdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9nZXRfZHVwNGNoKHNuZF9rY29udHJvbF90ICoga2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5tb2RlX2R1cDRjaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3B1dF9kdXA0Y2goc25kX2tjb250cm9sX3QgKiBrY29udHJvbCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWNoYW5nZSA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSBjaGlwLT5tb2RlX2R1cDRjaCk7CisJaWYgKGNoYW5nZSkKKwkJY2hpcC0+bW9kZV9kdXA0Y2ggPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiBjaGFuZ2U7Cit9CisKKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfeW1mcGNpX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK1lNRlBDSV9ET1VCTEUoIldhdmUgUGxheWJhY2sgVm9sdW1lIiwgMCwgWURTWEdSX05BVElWRURBQ09VVFZPTCksCitZTUZQQ0lfRE9VQkxFKCJXYXZlIENhcHR1cmUgVm9sdW1lIiwgMCwgWURTWEdSX05BVElWRURBQ0xPT1BWT0wpLAorWU1GUENJX0RPVUJMRSgiRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIsIDAsIFlEU1hHUl9OQVRJVkVEQUNJTlZPTCksCitZTUZQQ0lfRE9VQkxFKCJEaWdpdGFsIENhcHR1cmUgVm9sdW1lIiwgMSwgWURTWEdSX05BVElWRUFEQ0lOVk9MKSwKK1lNRlBDSV9ET1VCTEUoIkFEQyBQbGF5YmFjayBWb2x1bWUiLCAwLCBZRFNYR1JfUFJJQURDT1VUVk9MKSwKK1lNRlBDSV9ET1VCTEUoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIDAsIFlEU1hHUl9QUklBRENMT09QVk9MKSwKK1lNRlBDSV9ET1VCTEUoIkFEQyBQbGF5YmFjayBWb2x1bWUiLCAxLCBZRFNYR1JfU0VDQURDT1VUVk9MKSwKK1lNRlBDSV9ET1VCTEUoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIDEsIFlEU1hHUl9TRUNBRENMT09QVk9MKSwKK1lNRlBDSV9ET1VCTEUoIkZNIExlZ2FjeSBWb2x1bWUiLCAwLCBZRFNYR1JfTEVHQUNZT1VUVk9MKSwKK1lNRlBDSV9ET1VCTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJBQzk3ICIsIFBMQVlCQUNLLFZPTFVNRSksIDAsIFlEU1hHUl9aVk9VVFZPTCksCitZTUZQQ0lfRE9VQkxFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgQ0FQVFVSRSxWT0xVTUUpLCAwLCBZRFNYR1JfWlZMT09QVk9MKSwKK1lNRlBDSV9ET1VCTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJBQzk3ICIsUExBWUJBQ0ssVk9MVU1FKSwgMSwgWURTWEdSX1NQRElGT1VUVk9MKSwKK1lNRlBDSV9ET1VCTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsVk9MVU1FKSwgMSwgWURTWEdSX1NQRElGTE9PUFZPTCksCitZTUZQQ0lfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpLCAwLCBZRFNYR1JfU1BESUZPVVRDVFJMKSwKK1lNRlBDSV9TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsU1dJVENIKSwgMCwgWURTWEdSX1NQRElGSU5DVFJMKSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICI0Y2ggRHVwbGljYXRpb24iLAorCS5pbmZvID0gc25kX3ltZnBjaV9pbmZvX2R1cDRjaCwKKwkuZ2V0ID0gc25kX3ltZnBjaV9nZXRfZHVwNGNoLAorCS5wdXQgPSBzbmRfeW1mcGNpX3B1dF9kdXA0Y2gsCit9LAorfTsKKworCisvKgorICogR1BJTworICovCisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9nZXRfZ3Bpb19vdXQoeW1mcGNpX3QgKmNoaXAsIGludCBwaW4pCit7CisJdTE2IHJlZywgbW9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmVnID0gc25kX3ltZnBjaV9yZWFkdyhjaGlwLCBZRFNYR1JfR1BJT0ZVTkNFTkFCTEUpOworCXJlZyAmPSB+KDEgPDwgKHBpbiArIDgpKTsKKwlyZWcgfD0gKDEgPDwgcGluKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfR1BJT0ZVTkNFTkFCTEUsIHJlZyk7CisJLyogc2V0IHRoZSBsZXZlbCBtb2RlIGZvciBpbnB1dCBsaW5lICovCisJbW9kZSA9IHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgWURTWEdSX0dQSU9UWVBFQ09ORklHKTsKKwltb2RlICY9IH4oMyA8PCAocGluICogMikpOworCXNuZF95bWZwY2lfd3JpdGV3KGNoaXAsIFlEU1hHUl9HUElPVFlQRUNPTkZJRywgbW9kZSk7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX0dQSU9GVU5DRU5BQkxFLCByZWcgfCAoMSA8PCAocGluICsgOCkpKTsKKwltb2RlID0gc25kX3ltZnBjaV9yZWFkdyhjaGlwLCBZRFNYR1JfR1BJT0lOU1RBVFVTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAobW9kZSA+PiBwaW4pICYgMTsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3NldF9ncGlvX291dCh5bWZwY2lfdCAqY2hpcCwgaW50IHBpbiwgaW50IGVuYWJsZSkKK3sKKwl1MTYgcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZWcgPSBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9HUElPRlVOQ0VOQUJMRSk7CisJcmVnICY9IH4oMSA8PCBwaW4pOworCXJlZyAmPSB+KDEgPDwgKHBpbiArIDgpKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfR1BJT0ZVTkNFTkFCTEUsIHJlZyk7CisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX0dQSU9PVVRDVFJMLCBlbmFibGUgPDwgcGluKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfR1BJT0ZVTkNFTkFCTEUsIHJlZyB8ICgxIDw8IChwaW4gKyA4KSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX2dwaW9fc3dfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfZ3Bpb19zd19nZXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHBpbiA9IChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzbmRfeW1mcGNpX2dldF9ncGlvX291dChjaGlwLCBwaW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfZ3Bpb19zd19wdXQoc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHBpbiA9IChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwlpZiAoc25kX3ltZnBjaV9nZXRfZ3Bpb19vdXQoY2hpcCwgcGluKSAhPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQlzbmRfeW1mcGNpX3NldF9ncGlvX291dChjaGlwLCBwaW4sICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNuZF95bWZwY2lfZ2V0X2dwaW9fb3V0KGNoaXAsIHBpbik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfeW1mcGNpX3JlYXJfc2hhcmVkIF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUgPSAiU2hhcmVkIFJlYXIvTGluZS1JbiBTd2l0Y2giLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pbmZvID0gc25kX3ltZnBjaV9ncGlvX3N3X2luZm8sCisJLmdldCA9IHNuZF95bWZwY2lfZ3Bpb19zd19nZXQsCisJLnB1dCA9IHNuZF95bWZwY2lfZ3Bpb19zd19wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAyLAorfTsKKworCisvKgorICogIE1peGVyIHJvdXRpbmVzCisgKi8KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9taXhlcl9mcmVlX2FjOTdfYnVzKGFjOTdfYnVzX3QgKmJ1cykKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPmFjOTdfYnVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9taXhlcl9mcmVlX2FjOTcoYWM5N190ICphYzk3KQoreworCXltZnBjaV90ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPmFjOTcgPSBOVUxMOworfQorCitpbnQgX19kZXZpbml0IHNuZF95bWZwY2lfbWl4ZXIoeW1mcGNpX3QgKmNoaXAsIGludCByZWFyX3N3aXRjaCkKK3sKKwlhYzk3X3RlbXBsYXRlX3QgYWM5NzsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKKwkJLndyaXRlID0gc25kX3ltZnBjaV9jb2RlY193cml0ZSwKKwkJLnJlYWQgPSBzbmRfeW1mcGNpX2NvZGVjX3JlYWQsCisJfTsKKworCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGNoaXAtPmNhcmQsIDAsICZvcHMsIGNoaXAsICZjaGlwLT5hYzk3X2J1cykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljaGlwLT5hYzk3X2J1cy0+cHJpdmF0ZV9mcmVlID0gc25kX3ltZnBjaV9taXhlcl9mcmVlX2FjOTdfYnVzOworCWNoaXAtPmFjOTdfYnVzLT5ub192cmEgPSAxOyAvKiBZTUZQQ0kgZG9lc24ndCBuZWVkIFZSQSAqLworCisJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOworCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfbWl4ZXJfZnJlZV9hYzk3OworCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIHRvIGJlIHN1cmUgKi8KKwlzbmRfYWM5N191cGRhdGVfYml0cyhjaGlwLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCSAgICAgQUM5N19FQV9WUkF8QUM5N19FQV9WUk0sIDApOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF95bWZwY2lfY29udHJvbHMpOyBpZHgrKykgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3ltZnBjaV9jb250cm9sc1tpZHhdLCBjaGlwKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYWRkIFMvUERJRiBjb250cm9sICovCisJc25kX2Fzc2VydChjaGlwLT5wY21fc3BkaWYgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX3ltZnBjaV9zcGRpZl9kZWZhdWx0LCBjaGlwKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlrY3RsLT5pZC5kZXZpY2UgPSBjaGlwLT5wY21fc3BkaWYtPmRldmljZTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF95bWZwY2lfc3BkaWZfbWFzaywgY2hpcCkpKSA8IDApCisJCXJldHVybiBlcnI7CisJa2N0bC0+aWQuZGV2aWNlID0gY2hpcC0+cGNtX3NwZGlmLT5kZXZpY2U7CisJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfeW1mcGNpX3NwZGlmX3N0cmVhbSwgY2hpcCkpKSA8IDApCisJCXJldHVybiBlcnI7CisJa2N0bC0+aWQuZGV2aWNlID0gY2hpcC0+cGNtX3NwZGlmLT5kZXZpY2U7CisJY2hpcC0+c3BkaWZfcGNtX2N0bCA9IGtjdGw7CisKKwkvKiBkaXJlY3QgcmVjb3JkaW5nIHNvdXJjZSAqLworCWlmIChjaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzU0ICYmCisJICAgIChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfeW1mcGNpX2RyZWNfc291cmNlLCBjaGlwKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICogc2hhcmVkIHJlYXIvbGluZS1pbgorCSAqLworCWlmIChyZWFyX3N3aXRjaCkgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3ltZnBjaV9yZWFyX3NoYXJlZCwgY2hpcCkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiB0aW1lcgorICovCisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV90aW1lcl9zdGFydChzbmRfdGltZXJfdCAqdGltZXIpCit7CisJeW1mcGNpX3QgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwljaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOworCWNvdW50ID0gdGltZXItPnN0aWNrcyAtIDE7CisJaWYgKGNvdW50ID09IDApIC8qIG1pbmltdW0gdGltZSBpcyAyMC44IHVzICovCisJCWNvdW50ID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfVElNRVJDT1VOVCwgY291bnQpOworCXNuZF95bWZwY2lfd3JpdGViKGNoaXAsIFlEU1hHUl9USU1FUkNUUkwsIDB4MDMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV90aW1lcl9zdG9wKHNuZF90aW1lcl90ICp0aW1lcikKK3sKKwl5bWZwY2lfdCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfeW1mcGNpX3dyaXRlYihjaGlwLCBZRFNYR1JfVElNRVJDVFJMLCAweDAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfdGltZXJfcHJlY2lzZV9yZXNvbHV0aW9uKHNuZF90aW1lcl90ICp0aW1lciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm51bSwgdW5zaWduZWQgbG9uZyAqZGVuKQoreworCSpudW0gPSAxOworCSpkZW4gPSA5NjAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBfc25kX3RpbWVyX2hhcmR3YXJlIHNuZF95bWZwY2lfdGltZXJfaHcgPSB7CisJLmZsYWdzID0gU05EUlZfVElNRVJfSFdfQVVUTywKKwkucmVzb2x1dGlvbiA9IDEwNDE3LCAvKiAxLzJmcyA9IDEwLjQxNjY2Li4udXMgKi8KKwkudGlja3MgPSA2NTUzNiwKKwkuc3RhcnQgPSBzbmRfeW1mcGNpX3RpbWVyX3N0YXJ0LAorCS5zdG9wID0gc25kX3ltZnBjaV90aW1lcl9zdG9wLAorCS5wcmVjaXNlX3Jlc29sdXRpb24gPSBzbmRfeW1mcGNpX3RpbWVyX3ByZWNpc2VfcmVzb2x1dGlvbiwKK307CisKK2ludCBfX2RldmluaXQgc25kX3ltZnBjaV90aW1lcih5bWZwY2lfdCAqY2hpcCwgaW50IGRldmljZSkKK3sKKwlzbmRfdGltZXJfdCAqdGltZXIgPSBOVUxMOworCXNuZF90aW1lcl9pZF90IHRpZDsKKwlpbnQgZXJyOworCisJdGlkLmRldl9jbGFzcyA9IFNORFJWX1RJTUVSX0NMQVNTX0NBUkQ7CisJdGlkLmRldl9zY2xhc3MgPSBTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORTsKKwl0aWQuY2FyZCA9IGNoaXAtPmNhcmQtPm51bWJlcjsKKwl0aWQuZGV2aWNlID0gZGV2aWNlOworCXRpZC5zdWJkZXZpY2UgPSAwOworCWlmICgoZXJyID0gc25kX3RpbWVyX25ldyhjaGlwLT5jYXJkLCAiWU1GUENJIiwgJnRpZCwgJnRpbWVyKSkgPj0gMCkgeworCQlzdHJjcHkodGltZXItPm5hbWUsICJZTUZQQ0kgdGltZXIiKTsKKwkJdGltZXItPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJCXRpbWVyLT5odyA9IHNuZF95bWZwY2lfdGltZXJfaHc7CisJfQorCWNoaXAtPnRpbWVyID0gdGltZXI7CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogIHByb2MgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9wcm9jX3JlYWQoc25kX2luZm9fZW50cnlfdCAqZW50cnksIAorCQkJCSBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisJCisJc25kX2lwcmludGYoYnVmZmVyLCAiWU1GUENJXG5cbiIpOworCWZvciAoaSA9IDA7IGkgPD0gWURTWEdSX1dPUktCQVNFOyBpICs9IDQpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwNHg6ICUwNHhcbiIsIGksIHNuZF95bWZwY2lfcmVhZGwoY2hpcCwgaSkpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfeW1mcGNpX3Byb2NfaW5pdChzbmRfY2FyZF90ICogY2FyZCwgeW1mcGNpX3QgKmNoaXApCit7CisJc25kX2luZm9fZW50cnlfdCAqZW50cnk7CisJCisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2FyZCwgInltZnBjaSIsICZlbnRyeSkpCisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX3ltZnBjaV9wcm9jX3JlYWQpOworCXJldHVybiAwOworfQorCisvKgorICogIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisgKi8KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9hY2xpbmtfcmVzZXQoc3RydWN0IHBjaV9kZXYgKiBwY2kpCit7CisJdTggY21kOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdfQ1RSTCwgJmNtZCk7CisjaWYgMCAvLyBmb3JjZSB0byByZXNldAorCWlmIChjbWQgJiAweDAzKSB7CisjZW5kaWYKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaSwgUENJUl9EU1hHX0NUUkwsIGNtZCAmIDB4ZmMpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdfQ1RSTCwgY21kIHwgMHgwMyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIFBDSVJfRFNYR19DVFJMLCBjbWQgJiAweGZjKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX1BXUkNUUkwxLCAwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX1BXUkNUUkwyLCAwKTsKKyNpZiAwCisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfZW5hYmxlX2RzcCh5bWZwY2lfdCAqY2hpcCkKK3sKKwlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfQ09ORklHLCAweDAwMDAwMDAxKTsKK30KKworc3RhdGljIHZvaWQgc25kX3ltZnBjaV9kaXNhYmxlX2RzcCh5bWZwY2lfdCAqY2hpcCkKK3sKKwl1MzIgdmFsOworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXZhbCA9IHNuZF95bWZwY2lfcmVhZGwoY2hpcCwgWURTWEdSX0NPTkZJRyk7CisJaWYgKHZhbCkKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX0NPTkZJRywgMHgwMDAwMDAwMCk7CisJd2hpbGUgKHRpbWVvdXQtLSA+IDApIHsKKwkJdmFsID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfU1RBVFVTKTsKKwkJaWYgKCh2YWwgJiAweDAwMDAwMDAyKSA9PSAwKQorCQkJYnJlYWs7CisJfQorfQorCisjaW5jbHVkZSAieW1mcGNpX2ltYWdlLmgiCisKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfZG93bmxvYWRfaW1hZ2UoeW1mcGNpX3QgKmNoaXApCit7CisJaW50IGk7CisJdTE2IGN0cmw7CisJdW5zaWduZWQgbG9uZyAqaW5zdDsKKworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4MDAwMDAwMDApOworCXNuZF95bWZwY2lfZGlzYWJsZV9kc3AoY2hpcCk7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX01PREUsIDB4MDAwMTAwMDApOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NT0RFLCAweDAwMDAwMDAwKTsKKwlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTUFQT0ZSRUMsIDB4MDAwMDAwMDApOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NQVBPRkVGRkVDVCwgMHgwMDAwMDAwMCk7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1BMQVlDVFJMQkFTRSwgMHgwMDAwMDAwMCk7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1JFQ0NUUkxCQVNFLCAweDAwMDAwMDAwKTsKKwlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfRUZGQ1RSTEJBU0UsIDB4MDAwMDAwMDApOworCWN0cmwgPSBzbmRfeW1mcGNpX3JlYWR3KGNoaXAsIFlEU1hHUl9HTE9CQUxDVFJMKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfR0xPQkFMQ1RSTCwgY3RybCAmIH4weDAwMDcpOworCisJLyogc2V0dXAgRFNQIGluc3RydWN0aW9uIGNvZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgWURTWEdfRFNQTEVOR1RIIC8gNDsgaSsrKQorCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfRFNQSU5TVFJBTSArIChpIDw8IDIpLCBEc3BJbnN0W2ldKTsKKworCS8qIHNldHVwIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gY29kZSAqLworCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGOgorCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc1NDoKKwkJaW5zdCA9IENudHJsSW5zdDFFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbnN0ID0gQ250cmxJbnN0OworCQlicmVhazsKKwl9CisJZm9yIChpID0gMDsgaSA8IFlEU1hHX0NUUkxMRU5HVEggLyA0OyBpKyspCisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9DVFJMSU5TVFJBTSArIChpIDw8IDIpLCBpbnN0W2ldKTsKKworCXNuZF95bWZwY2lfZW5hYmxlX2RzcChjaGlwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3ltZnBjaV9tZW1hbGxvYyh5bWZwY2lfdCAqY2hpcCkKK3sKKwlsb25nIHNpemUsIHBsYXliYWNrX2N0cmxfc2l6ZTsKKwlpbnQgdm9pY2UsIGJhbmssIHJlZzsKKwl1OCAqcHRyOworCWRtYV9hZGRyX3QgcHRyX2FkZHI7CisKKwlwbGF5YmFja19jdHJsX3NpemUgPSA0ICsgNCAqIFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsKKwljaGlwLT5iYW5rX3NpemVfcGxheWJhY2sgPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9QTEFZQ1RSTFNJWkUpIDw8IDI7CisJY2hpcC0+YmFua19zaXplX2NhcHR1cmUgPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIFlEU1hHUl9SRUNDVFJMU0laRSkgPDwgMjsKKwljaGlwLT5iYW5rX3NpemVfZWZmZWN0ID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfRUZGQ1RSTFNJWkUpIDw8IDI7CisJY2hpcC0+d29ya19zaXplID0gWURTWEdfREVGQVVMVF9XT1JLX1NJWkU7CisJCisJc2l6ZSA9ICgocGxheWJhY2tfY3RybF9zaXplICsgMHgwMGZmKSAmIH4weDAwZmYpICsKKwkgICAgICAgKChjaGlwLT5iYW5rX3NpemVfcGxheWJhY2sgKiAyICogWURTWEdfUExBWUJBQ0tfVk9JQ0VTICsgMHgwMGZmKSAmIH4weDAwZmYpICsKKwkgICAgICAgKChjaGlwLT5iYW5rX3NpemVfY2FwdHVyZSAqIDIgKiBZRFNYR19DQVBUVVJFX1ZPSUNFUyArIDB4MDBmZikgJiB+MHgwMGZmKSArCisJICAgICAgICgoY2hpcC0+YmFua19zaXplX2VmZmVjdCAqIDIgKiBZRFNYR19FRkZFQ1RfVk9JQ0VTICsgMHgwMGZmKSAmIH4weDAwZmYpICsKKwkgICAgICAgY2hpcC0+d29ya19zaXplOworCS8qIHdvcmtfcHRyIG11c3QgYmUgYWxpZ25lZCB0byAyNTYgYnl0ZXMsIGJ1dCBpdCdzIGFscmVhZHkKKwkgICBjb3ZlcmVkIHdpdGggdGhlIGtlcm5lbCBwYWdlIGFsbG9jYXRpb24gbWVjaGFuaXNtICovCisJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJc2l6ZSwgJmNoaXAtPndvcmtfcHRyKSA8IDApIAorCQlyZXR1cm4gLUVOT01FTTsKKwlwdHIgPSBjaGlwLT53b3JrX3B0ci5hcmVhOworCXB0cl9hZGRyID0gY2hpcC0+d29ya19wdHIuYWRkcjsKKwltZW1zZXQocHRyLCAwLCBzaXplKTsJLyogZm9yIHN1cmUgKi8KKworCWNoaXAtPmJhbmtfYmFzZV9wbGF5YmFjayA9IHB0cjsKKwljaGlwLT5iYW5rX2Jhc2VfcGxheWJhY2tfYWRkciA9IHB0cl9hZGRyOworCWNoaXAtPmN0cmxfcGxheWJhY2sgPSAodTMyICopcHRyOworCWNoaXAtPmN0cmxfcGxheWJhY2tbMF0gPSBjcHVfdG9fbGUzMihZRFNYR19QTEFZQkFDS19WT0lDRVMpOworCXB0ciArPSAocGxheWJhY2tfY3RybF9zaXplICsgMHgwMGZmKSAmIH4weDAwZmY7CisJcHRyX2FkZHIgKz0gKHBsYXliYWNrX2N0cmxfc2l6ZSArIDB4MDBmZikgJiB+MHgwMGZmOworCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsgdm9pY2UrKykgeworCQljaGlwLT52b2ljZXNbdm9pY2VdLm51bWJlciA9IHZvaWNlOworCQljaGlwLT52b2ljZXNbdm9pY2VdLmJhbmsgPSAoc25kX3ltZnBjaV9wbGF5YmFja19iYW5rX3QgKilwdHI7CisJCWNoaXAtPnZvaWNlc1t2b2ljZV0uYmFua19hZGRyID0gcHRyX2FkZHI7CisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyBiYW5rKyspIHsKKwkJCWNoaXAtPmJhbmtfcGxheWJhY2tbdm9pY2VdW2JhbmtdID0gKHNuZF95bWZwY2lfcGxheWJhY2tfYmFua190ICopcHRyOworCQkJcHRyICs9IGNoaXAtPmJhbmtfc2l6ZV9wbGF5YmFjazsKKwkJCXB0cl9hZGRyICs9IGNoaXAtPmJhbmtfc2l6ZV9wbGF5YmFjazsKKwkJfQorCX0KKwlwdHIgPSAoY2hhciAqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICsgMHgwMGZmKSAmIH4weDAwZmYpOworCXB0cl9hZGRyID0gKHB0cl9hZGRyICsgMHgwMGZmKSAmIH4weDAwZmY7CisJY2hpcC0+YmFua19iYXNlX2NhcHR1cmUgPSBwdHI7CisJY2hpcC0+YmFua19iYXNlX2NhcHR1cmVfYWRkciA9IHB0cl9hZGRyOworCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IFlEU1hHX0NBUFRVUkVfVk9JQ0VTOyB2b2ljZSsrKQorCQlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgMjsgYmFuaysrKSB7CisJCQljaGlwLT5iYW5rX2NhcHR1cmVbdm9pY2VdW2JhbmtdID0gKHNuZF95bWZwY2lfY2FwdHVyZV9iYW5rX3QgKilwdHI7CisJCQlwdHIgKz0gY2hpcC0+YmFua19zaXplX2NhcHR1cmU7CisJCQlwdHJfYWRkciArPSBjaGlwLT5iYW5rX3NpemVfY2FwdHVyZTsKKwkJfQorCXB0ciA9IChjaGFyICopKCgodW5zaWduZWQgbG9uZylwdHIgKyAweDAwZmYpICYgfjB4MDBmZik7CisJcHRyX2FkZHIgPSAocHRyX2FkZHIgKyAweDAwZmYpICYgfjB4MDBmZjsKKwljaGlwLT5iYW5rX2Jhc2VfZWZmZWN0ID0gcHRyOworCWNoaXAtPmJhbmtfYmFzZV9lZmZlY3RfYWRkciA9IHB0cl9hZGRyOworCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IFlEU1hHX0VGRkVDVF9WT0lDRVM7IHZvaWNlKyspCisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyBiYW5rKyspIHsKKwkJCWNoaXAtPmJhbmtfZWZmZWN0W3ZvaWNlXVtiYW5rXSA9IChzbmRfeW1mcGNpX2VmZmVjdF9iYW5rX3QgKilwdHI7CisJCQlwdHIgKz0gY2hpcC0+YmFua19zaXplX2VmZmVjdDsKKwkJCXB0cl9hZGRyICs9IGNoaXAtPmJhbmtfc2l6ZV9lZmZlY3Q7CisJCX0KKwlwdHIgPSAoY2hhciAqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICsgMHgwMGZmKSAmIH4weDAwZmYpOworCXB0cl9hZGRyID0gKHB0cl9hZGRyICsgMHgwMGZmKSAmIH4weDAwZmY7CisJY2hpcC0+d29ya19iYXNlID0gcHRyOworCWNoaXAtPndvcmtfYmFzZV9hZGRyID0gcHRyX2FkZHI7CisJCisJc25kX2Fzc2VydChwdHIgKyBjaGlwLT53b3JrX3NpemUgPT0gY2hpcC0+d29ya19wdHIuYXJlYSArIGNoaXAtPndvcmtfcHRyLmJ5dGVzLCApOworCisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1BMQVlDVFJMQkFTRSwgY2hpcC0+YmFua19iYXNlX3BsYXliYWNrX2FkZHIpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9SRUNDVFJMQkFTRSwgY2hpcC0+YmFua19iYXNlX2NhcHR1cmVfYWRkcik7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX0VGRkNUUkxCQVNFLCBjaGlwLT5iYW5rX2Jhc2VfZWZmZWN0X2FkZHIpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9XT1JLQkFTRSwgY2hpcC0+d29ya19iYXNlX2FkZHIpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9XT1JLU0laRSwgY2hpcC0+d29ya19zaXplID4+IDIpOworCisJLyogUy9QRElGIG91dHB1dCBpbml0aWFsaXphdGlvbiAqLworCWNoaXAtPnNwZGlmX2JpdHMgPSBjaGlwLT5zcGRpZl9wY21fYml0cyA9IFNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRiAmIDB4ZmZmZjsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfU1BESUZPVVRDVFJMLCAwKTsKKwlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfU1BESUZPVVRTVEFUVVMsIGNoaXAtPnNwZGlmX2JpdHMpOworCisJLyogUy9QRElGIGlucHV0IGluaXRpYWxpemF0aW9uICovCisJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX1NQRElGSU5DVFJMLCAwKTsKKworCS8qIGRpZ2l0YWwgbWl4ZXIgc2V0dXAgKi8KKwlmb3IgKHJlZyA9IDB4ODA7IHJlZyA8IDB4YzA7IHJlZyArPSA0KQorCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCByZWcsIDApOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4M2ZmZjNmZmYpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9aVk9VVFZPTCwgMHgzZmZmM2ZmZik7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1NQRElGT1VUVk9MLCAweDNmZmYzZmZmKTsKKwlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTkFUSVZFQURDSU5WT0wsIDB4M2ZmZjNmZmYpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9OQVRJVkVEQUNJTlZPTCwgMHgzZmZmM2ZmZik7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1BSSUFEQ0xPT1BWT0wsIDB4M2ZmZjNmZmYpOworCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9MRUdBQ1lPVVRWT0wsIDB4M2ZmZjNmZmYpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfZnJlZSh5bWZwY2lfdCAqY2hpcCkKK3sKKwl1MTYgY3RybDsKKworCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoY2hpcC0+cmVzX3JlZ19hcmVhKSB7CS8qIGRvbid0IHRvdWNoIGJ1c3kgaGFyZHdhcmUgKi8KKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX05BVElWRURBQ09VVFZPTCwgMCk7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9CVUY0NDFPVVRWT0wsIDApOworCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTEVHQUNZT1VUVk9MLCAwKTsKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1NUQVRVUywgfjApOworCQlzbmRfeW1mcGNpX2Rpc2FibGVfZHNwKGNoaXApOworCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfUExBWUNUUkxCQVNFLCAwKTsKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1JFQ0NUUkxCQVNFLCAwKTsKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX0VGRkNUUkxCQVNFLCAwKTsKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1dPUktCQVNFLCAwKTsKKwkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX1dPUktTSVpFLCAwKTsKKwkJY3RybCA9IHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgWURTWEdSX0dMT0JBTENUUkwpOworCQlzbmRfeW1mcGNpX3dyaXRldyhjaGlwLCBZRFNYR1JfR0xPQkFMQ1RSTCwgY3RybCAmIH4weDAwMDcpOworCX0KKworCXNuZF95bWZwY2lfYWMzX2RvbmUoY2hpcCk7CisKKwkvKiBTZXQgUENJIGRldmljZSB0byBEMyBzdGF0ZSAqLworI2lmIDAKKwkvKiBGSVhNRTogdGVtcG9yYXJpbHkgZGlzYWJsZWQsIG90aGVyd2lzZSB3ZSBjYW5ub3QgZmlyZSB1cAorCSAqIHRoZSBjaGlwIGFnYWluIHVubGVzcyByZWJvb3QuICBBQ1BJIGJ1Zz8KKwkgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTQorCXZmcmVlKGNoaXAtPnNhdmVkX3JlZ3MpOworI2VuZGlmCisJaWYgKGNoaXAtPm1wdV9yZXMpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShjaGlwLT5tcHVfcmVzKTsKKwkJa2ZyZWVfbm9jaGVjayhjaGlwLT5tcHVfcmVzKTsKKwl9CisJaWYgKGNoaXAtPmZtX3JlcykgeworCQlyZWxlYXNlX3Jlc291cmNlKGNoaXAtPmZtX3Jlcyk7CisJCWtmcmVlX25vY2hlY2soY2hpcC0+Zm1fcmVzKTsKKwl9CisJc25kX3ltZnBjaV9mcmVlX2dhbWVwb3J0KGNoaXApOworCWlmIChjaGlwLT5yZWdfYXJlYV92aXJ0KQorCQlpb3VubWFwKGNoaXAtPnJlZ19hcmVhX3ZpcnQpOworCWlmIChjaGlwLT53b3JrX3B0ci5hcmVhKQorCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPndvcmtfcHRyKTsKKwkKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQgKiljaGlwKTsKKwlpZiAoY2hpcC0+cmVzX3JlZ19hcmVhKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoY2hpcC0+cmVzX3JlZ19hcmVhKTsKKwkJa2ZyZWVfbm9jaGVjayhjaGlwLT5yZXNfcmVnX2FyZWEpOworCX0KKworCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIDB4NDAsIGNoaXAtPm9sZF9sZWdhY3lfY3RybCk7CisJCisJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJcmV0dXJuIHNuZF95bWZwY2lfZnJlZShjaGlwKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzYXZlZF9yZWdzX2luZGV4W10gPSB7CisJLyogc3BkaWYgKi8KKwlZRFNYR1JfU1BESUZPVVRDVFJMLAorCVlEU1hHUl9TUERJRk9VVFNUQVRVUywKKwlZRFNYR1JfU1BESUZJTkNUUkwsCisJLyogdm9sdW1lcyAqLworCVlEU1hHUl9QUklBRENMT09QVk9MLAorCVlEU1hHUl9OQVRJVkVEQUNJTlZPTCwKKwlZRFNYR1JfTkFUSVZFREFDT1VUVk9MLAorCS8vIFlEU1hHUl9CVUY0NDFPVVRWT0wsCisJWURTWEdSX05BVElWRUFEQ0lOVk9MLAorCVlEU1hHUl9TUERJRkxPT1BWT0wsCisJWURTWEdSX1NQRElGT1VUVk9MLAorCVlEU1hHUl9aVk9VVFZPTCwKKwlZRFNYR1JfTEVHQUNZT1VUVk9MLAorCS8qIGFkZHJlc3MgYmFzZXMgKi8KKwlZRFNYR1JfUExBWUNUUkxCQVNFLAorCVlEU1hHUl9SRUNDVFJMQkFTRSwKKwlZRFNYR1JfRUZGQ1RSTEJBU0UsCisJWURTWEdSX1dPUktCQVNFLAorCS8qIGNhcHR1cmUgc2V0IHVwICovCisJWURTWEdSX01BUE9GUkVDLAorCVlEU1hHUl9SRUNGT1JNQVQsCisJWURTWEdSX1JFQ1NMT1RTUiwKKwlZRFNYR1JfQURDRk9STUFULAorCVlEU1hHUl9BRENTTE9UU1IsCit9OworI2RlZmluZSBZRFNYR1JfTlVNX1NBVkVEX1JFR1MJQVJSQVlfU0laRShzYXZlZF9yZWdzX2luZGV4KQorCitzdGF0aWMgaW50IHNuZF95bWZwY2lfc3VzcGVuZChzbmRfY2FyZF90ICpjYXJkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBjYXJkLT5wbV9wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisJCisJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOworCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtMik7CisJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21fc3BkaWYpOworCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtXzRjaCk7CisJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKKwlmb3IgKGkgPSAwOyBpIDwgWURTWEdSX05VTV9TQVZFRF9SRUdTOyBpKyspCisJCWNoaXAtPnNhdmVkX3JlZ3NbaV0gPSBzbmRfeW1mcGNpX3JlYWRsKGNoaXAsIHNhdmVkX3JlZ3NfaW5kZXhbaV0pOworCWNoaXAtPnNhdmVkX3lkc3hncl9tb2RlID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfTU9ERSk7CisJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX05BVElWRURBQ09VVFZPTCwgMCk7CisJc25kX3ltZnBjaV9kaXNhYmxlX2RzcChjaGlwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQoreworCXltZnBjaV90ICpjaGlwID0gY2FyZC0+cG1fcHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlwY2lfc2V0X21hc3RlcihjaGlwLT5wY2kpOworCXNuZF95bWZwY2lfYWNsaW5rX3Jlc2V0KGNoaXAtPnBjaSk7CisJc25kX3ltZnBjaV9jb2RlY19yZWFkeShjaGlwLCAwKTsKKwlzbmRfeW1mcGNpX2Rvd25sb2FkX2ltYWdlKGNoaXApOworCXVkZWxheSgxMDApOworCisJZm9yIChpID0gMDsgaSA8IFlEU1hHUl9OVU1fU0FWRURfUkVHUzsgaSsrKQorCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBzYXZlZF9yZWdzX2luZGV4W2ldLCBjaGlwLT5zYXZlZF9yZWdzW2ldKTsKKworCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3KTsKKworCS8qIHN0YXJ0IGh3IGFnYWluICovCisJaWYgKGNoaXAtPnN0YXJ0X2NvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9NT0RFLCBjaGlwLT5zYXZlZF95ZHN4Z3JfbW9kZSk7CisJCWNoaXAtPmFjdGl2ZV9iYW5rID0gc25kX3ltZnBjaV9yZWFkbChjaGlwLCBZRFNYR1JfQ1RSTFNFTEVDVCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworaW50IF9fZGV2aW5pdCBzbmRfeW1mcGNpX2NyZWF0ZShzbmRfY2FyZF90ICogY2FyZCwKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqIHBjaSwKKwkJCQl1bnNpZ25lZCBzaG9ydCBvbGRfbGVnYWN5X2N0cmwsCisJCQkJeW1mcGNpX3QgKiogcmNoaXApCit7CisJeW1mcGNpX3QgKmNoaXA7CisJaW50IGVycjsKKwlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJCS5kZXZfZnJlZSA9CXNuZF95bWZwY2lfZGV2X2ZyZWUsCisJfTsKKwkKKwkqcmNoaXAgPSBOVUxMOworCisJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNoaXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaGlwLT5vbGRfbGVnYWN5X2N0cmwgPSBvbGRfbGVnYWN5X2N0cmw7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+dm9pY2VfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hpcC0+aW50ZXJydXB0X3NsZWVwKTsKKwlhdG9taWNfc2V0KCZjaGlwLT5pbnRlcnJ1cHRfc2xlZXBfY291bnQsIDApOworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKwljaGlwLT5kZXZpY2VfaWQgPSBwY2ktPmRldmljZTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgKHU4ICopJmNoaXAtPnJldik7CisJY2hpcC0+cmVnX2FyZWFfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWNoaXAtPnJlZ19hcmVhX3ZpcnQgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+cmVnX2FyZWFfcGh5cywgMHg4MDAwKTsKKwlwY2lfc2V0X21hc3RlcihwY2kpOworCisJaWYgKChjaGlwLT5yZXNfcmVnX2FyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+cmVnX2FyZWFfcGh5cywgMHg4MDAwLCAiWU1GUENJIikpID09IE5VTEwpIHsKKwkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwgY2hpcC0+cmVnX2FyZWFfcGh5cywgY2hpcC0+cmVnX2FyZWFfcGh5cyArIDB4ODAwMCAtIDEpOworCQlzbmRfeW1mcGNpX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3ltZnBjaV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgIllNRlBDSSIsICh2b2lkICopIGNoaXApKSB7CisJCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfeW1mcGNpX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNoaXAtPmlycSA9IHBjaS0+aXJxOworCisJc25kX3ltZnBjaV9hY2xpbmtfcmVzZXQocGNpKTsKKwlpZiAoc25kX3ltZnBjaV9jb2RlY19yZWFkeShjaGlwLCAwKSA8IDApIHsKKwkJc25kX3ltZnBjaV9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzbmRfeW1mcGNpX2Rvd25sb2FkX2ltYWdlKGNoaXApOworCisJdWRlbGF5KDEwMCk7IC8qIHNlZW1zIHdlIG5lZWQgYSBkZWxheSBhZnRlciBkb3dubG9hZGluZyBpbWFnZS4uICovCisKKwlpZiAoc25kX3ltZnBjaV9tZW1hbGxvYyhjaGlwKSA8IDApIHsKKwkJc25kX3ltZnBjaV9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF95bWZwY2lfYWMzX2luaXQoY2hpcCkpIDwgMCkgeworCQlzbmRfeW1mcGNpX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisjaWZkZWYgQ09ORklHX1BNCisJY2hpcC0+c2F2ZWRfcmVncyA9IHZtYWxsb2MoWURTWEdSX05VTV9TQVZFRF9SRUdTICogc2l6ZW9mKHUzMikpOworCWlmIChjaGlwLT5zYXZlZF9yZWdzID09IE5VTEwpIHsKKwkJc25kX3ltZnBjaV9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc25kX2NhcmRfc2V0X3BtX2NhbGxiYWNrKGNhcmQsIHNuZF95bWZwY2lfc3VzcGVuZCwgc25kX3ltZnBjaV9yZXN1bWUsIGNoaXApOworI2VuZGlmCisKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgeworCQlzbmRfeW1mcGNpX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX3ltZnBjaV9wcm9jX2luaXQoY2FyZCwgY2hpcCk7CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcmNoaXAgPSBjaGlwOworCXJldHVybiAwOworfQo=