LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxeF9kZWJ1Zy5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gdXNlZCBmb3IKICogICAgICAgICAgICAgICAgICBvdXRwdXR0aW5nIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gbG9nZ2luZyBmYWNpbGl0eQogKiAgICAgICAgICAgICAgICAgIChrc3lzbG9nZCkKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKi8KCiNpZm5kZWYgX19FVDEzMVhfREJHX0hfXwojZGVmaW5lIF9fRVQxMzFYX0RCR19IX18KCi8qIERlZmluZSBNYXNrcyBmb3IgZGVidWdnaW5nIHR5cGVzL2xldmVscyAqLwojZGVmaW5lIERCR19FUlJPUl9PTiAgICAgICAgMHgwMDAwMDAwMUwKI2RlZmluZSBEQkdfV0FSTklOR19PTiAgICAgIDB4MDAwMDAwMDJMCiNkZWZpbmUgREJHX05PVElDRV9PTiAgICAgICAweDAwMDAwMDA0TAojZGVmaW5lIERCR19UUkFDRV9PTiAgICAgICAgMHgwMDAwMDAwOEwKI2RlZmluZSBEQkdfVkVSQk9TRV9PTiAgICAgIDB4MDAwMDAwMTBMCiNkZWZpbmUgREJHX1BBUkFNX09OICAgICAgICAweDAwMDAwMDIwTAojZGVmaW5lIERCR19CUkVBS19PTiAgICAgICAgMHgwMDAwMDA0MEwKI2RlZmluZSBEQkdfUlhfT04gICAgICAgICAgIDB4MDAwMDAxMDBMCiNkZWZpbmUgREJHX1RYX09OICAgICAgICAgICAweDAwMDAwMjAwTAoKI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKCi8qCiAqIFNldCB0aGUgbGV2ZWwgb2YgZGVidWdnaW5nIGlmIG5vdCBkb25lIHdpdGggYSBwcmVwcm9jZXNzb3IgZGVmaW5lLiBTZWUKICogZXQxMzF4X21haW4uYywgZnVuY3Rpb24gZXQxMzF4X2luaXRfbW9kdWxlKCkgZm9yIGhvdyB0aGUgZGVidWcgbGV2ZWwKICogdHJhbnNsYXRlcyBpbnRvIHRoZSB0eXBlcyBvZiBtZXNzYWdlcyBkaXNwbGF5ZWQuCiAqLwojaWZuZGVmIERCR19MVkwKI2RlZmluZSBEQkdfTFZMCTMKI2VuZGlmIC8qIERCR19MVkwgKi8KCiNkZWZpbmUgREJHX0RFRkFVTFRTCQkoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04gKQoKI2RlZmluZSBEQkdfRkxBR1MoQSkJCShBKS0+ZGJnRmxhZ3MKI2RlZmluZSBEQkdfTkFNRShBKQkJKEEpLT5kYmdOYW1lCiNkZWZpbmUgREJHX0xFVkVMKEEpCQkoQSktPmRiZ0xldmVsCgojaWZuZGVmIERCR19QUklOVAojZGVmaW5lIERCR19QUklOVChTLi4uKQkJcHJpbnRrKEtFUk5fREVCVUcgUykKI2VuZGlmIC8qIERCR19QUklOVCAqLwoKI2lmbmRlZiBEQkdfUFJJTlRDCiNkZWZpbmUgREJHX1BSSU5UQyhTLi4uKQlwcmludGsoUykKI2VuZGlmIC8qIERCR19QUklOVEMgKi8KCiNpZm5kZWYgREJHX1RSQVAKI2RlZmluZSBEQkdfVFJBUAkJe30JLyogQlVHKCkgKi8KI2VuZGlmIC8qIERCR19UUkFQICovCgojZGVmaW5lIF9FTlRFUl9TVFIJIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4iCiNkZWZpbmUgX0xFQVZFX1NUUgkiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIKCiNkZWZpbmUgX0RCR19FTlRFUihBKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JS4qczolc1xuIiwgREJHX05BTUUoQSksCVwKCQkJCSsrREJHX0xFVkVMKEEpLCBfRU5URVJfU1RSLCBfX2Z1bmNfXykKI2RlZmluZSBfREJHX0xFQVZFKEEpCXByaW50ayhLRVJOX0RFQlVHICIlczolLipzOiVzXG4iLCBEQkdfTkFNRShBKSwJXAoJCQkJREJHX0xFVkVMKEEpLS0sIF9MRUFWRV9TVFIsIF9fZnVuY19fKQoKI2RlZmluZSBEQkdfRU5URVIoQSkgICAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19FTlRFUihBKTt9CgojZGVmaW5lIERCR19MRUFWRShBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0xFQVZFKEEpO30KCiNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUEFSQU1fT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCIgICVzIC0tICJGIlxuIixOLFMpO30KCiNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikJXAoJaWYgKERCR19GTEFHUyhBKSAmIERCR19FUlJPUl9PTikgewkJCQlcCgkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7CVwKCQlEQkdfUFJJTlRDKFMpOwkJCQkJCVwKCQlEQkdfVFJBUDsJCQkJCQlcCgl9CgojZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOldBUk5JTkc6JXMgIixEQkdfTkFNRShBKSxfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQoKI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLERCR19OQU1FKEEpLF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CgojZGVmaW5lIERCR19UUkFDRShBLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpUUkFDRTolcyAiLERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQoKI2RlZmluZSBEQkdfVkVSQk9TRShBLFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1ZFUkJPU0VfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpWRVJCT1NFOiVzICIsREJHX05BTUUoQSksIF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CgojZGVmaW5lIERCR19SWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKFMpO319CgojZGVmaW5lIERCR19SWF9FTlRFUihBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KCiNkZWZpbmUgREJHX1JYX0xFQVZFKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQoKI2RlZmluZSBEQkdfVFgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQoKI2RlZmluZSBEQkdfVFhfRU5URVIoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19FTlRFUihBKTt9CgojZGVmaW5lIERCR19UWF9MRUFWRShBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0xFQVZFKEEpO30KCiNkZWZpbmUgREJHX0FTU0VSVChDKSAgICAgICB7aWYgKCEoQykpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcylcbiIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0MsX19GSUxFX18sX19MSU5FX18sX19mdW5jX18pOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1RSQVA7fX0KI2RlZmluZSBTVEFUSUMKCnR5cGVkZWYgc3RydWN0IHsKCWNoYXIgKmRiZ05hbWU7CglpbnQgZGJnTGV2ZWw7Cgl1bnNpZ25lZCBsb25nIGRiZ0ZsYWdzOwp9IGRiZ19pbmZvX3Q7CgojZWxzZSAvKiBDT05GSUdfRVQxMzFYX0RFQlVHICovCgojZGVmaW5lIERCR19ERUZOCiNkZWZpbmUgREJHX1RSQVAKI2RlZmluZSBEQkdfUFJJTlQoUy4uLikKI2RlZmluZSBEQkdfRU5URVIoQSkKI2RlZmluZSBEQkdfTEVBVkUoQSkKI2RlZmluZSBEQkdfUEFSQU0oQSxOLEYsUy4uLikKI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKQojZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikKI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikKI2RlZmluZSBEQkdfVFJBQ0UoQSxTLi4uKQojZGVmaW5lIERCR19WRVJCT1NFKEEsUy4uLikKI2RlZmluZSBEQkdfUlgoQSxTLi4uKQojZGVmaW5lIERCR19SWF9FTlRFUihBKQojZGVmaW5lIERCR19SWF9MRUFWRShBKQojZGVmaW5lIERCR19UWChBLFMuLi4pCiNkZWZpbmUgREJHX1RYX0VOVEVSKEEpCiNkZWZpbmUgREJHX1RYX0xFQVZFKEEpCiNkZWZpbmUgREJHX0FTU0VSVChDKQojZGVmaW5lIFNUQVRJQyBzdGF0aWMKCiNlbmRpZiAvKiBDT05GSUdfRVQxMzFYX0RFQlVHICovCgovKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCnN0cnVjdCBldDEzMXhfYWRhcHRlcjsKCnZvaWQgRHVtcFR4UXVldWVDb250ZW50cyhpbnQgZGJnTHZsLCBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwp2b2lkIER1bXBEZXZpY2VCbG9jayhpbnQgZGJnTHZsLCBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCgkJICAgICB1bnNpZ25lZCBpbnQgQmxvY2spOwp2b2lkIER1bXBEZXZpY2VSZWcoaW50IGRiZ0x2bCwgc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKCiNlbmRpZiAvKiBfX0VUMTMxWF9EQkdfSF9fICovCg==