LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIGRlYnVnZ2luZy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfREVCVUdfSAojZGVmaW5lIF9ERUJVR19ICgoKCgovKiBUdXJuIG9uIGRlYnVnZ2luZyBoZXJlIGlmIG5vdCBkb25lIHdpdGggYSBwcmVwcm9jZXNzb3IgZGVmaW5lICovCiNpZm5kZWYgREJHCiNkZWZpbmUgREJHIDAKI2Vsc2UKI3VuZGVmCURCRwojZGVmaW5lIERCRyAxCiNlbmRpZiAvL0RCRwoKCgoKI2lmIERCRwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFNldCB0aGUgbGV2ZWwgb2YgZGVidWdnaW5nIGlmIG5vdCBkb25lIHdpdGggYSBwcmVwcm9jZXNzb3IgZGVmaW5lLiBTZWUKICAgd2xfbWFpbi5jLCBpbml0X21vZHVsZSgpIGZvciBob3cgdGhlIGRlYnVnIGxldmVsIHRyYW5zbGF0ZXMgaW50byB0aGUKICAgdGhlIHR5cGVzIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCAqLwojaWZuZGVmIERCR19MVkwKI2RlZmluZSBEQkdfTFZMIDUJCQkvKiB5aWVsZHMgbm90aGluZyB2aWEgaW5pdF9tb2R1bGUsCgkJCQkJCQkgICBvcmlnaW5hbCB2YWx1ZSBvZiA1IHlpZWxkcyBEQkdfVFJBQ0VfT04gYW5kIERCR19WRVJCT1NFX09OICovCiNlbmRpZiAgLy8gREJHX0xWTAoKCiNkZWZpbmUgREJHX0VSUk9SX09OICAgICAgICAweDAwMDAwMDAxTAojZGVmaW5lIERCR19XQVJOSU5HX09OICAgICAgMHgwMDAwMDAwMkwKI2RlZmluZSBEQkdfTk9USUNFX09OICAgICAgIDB4MDAwMDAwMDRMCiNkZWZpbmUgREJHX1RSQUNFX09OICAgICAgICAweDAwMDAwMDA4TAojZGVmaW5lIERCR19WRVJCT1NFX09OICAgICAgMHgwMDAwMDAxMEwKI2RlZmluZSBEQkdfUEFSQU1fT04gICAgICAgIDB4MDAwMDAwMjBMCiNkZWZpbmUgREJHX0JSRUFLX09OICAgICAgICAweDAwMDAwMDQwTAojZGVmaW5lIERCR19SWF9PTiAgICAgICAgICAgMHgwMDAwMDEwMEwKI2RlZmluZSBEQkdfVFhfT04gICAgICAgICAgIDB4MDAwMDAyMDBMCiNkZWZpbmUgREJHX0RTX09OICAgICAgICAgICAweDAwMDAwNDAwTAoKI2RlZmluZSBEQkdfREVGQVVMVFMgICAgICAgIChEQkdfRVJST1JfT04gfCBEQkdfV0FSTklOR19PTiB8IERCR19CUkVBS19PTikKCiNkZWZpbmUgREJHX0ZMQUdTKEEpICAgICAgICAoQSktPkRlYnVnRmxhZwojZGVmaW5lIERCR19OQU1FKEEpICAgICAgICAgKEEpLT5kYmdOYW1lCiNkZWZpbmUgREJHX0xFVkVMKEEpICAgICAgICAoQSktPmRiZ0xldmVsCgoKI2lmbmRlZiBQUklOVEsKIyAgIGRlZmluZSBQUklOVEsoUy4uLikgICAgIHByaW50ayhTKQojZW5kaWYgLy8gUFJJTlRLCgoKI2lmbmRlZiBEQkdfUFJJTlQKIyAgIGRlZmluZSBEQkdfUFJJTlQoUy4uLikgIFBSSU5USyhLRVJOX0RFQlVHIFMpCiNlbmRpZiAvLyBEQkdfUFJJTlQKCgojaWZuZGVmIERCR19QUklOVEMKIyAgIGRlZmluZSBEQkdfUFJJTlRDKFMuLi4pIFBSSU5USyhTKQojZW5kaWYgLy8gREJHX1BSSU5UQwoKCiNpZm5kZWYgREJHX1RSQVAKIyAgIGRlZmluZSBEQkdfVFJBUCAgICAgICAgIHt9CiNlbmRpZiAvLyBEQkdfVFJBUAoKCiNkZWZpbmUgX0VOVEVSX1NUUiAgICAgICAgICAiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIKI2RlZmluZSBfTEVBVkVfU1RSICAgICAgICAgICI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IgoKCiNkZWZpbmUgX0RCR19FTlRFUihBKSAgICAgICBEQkdfUFJJTlQoIiVzOiUuKnM6JXNcbiIsREJHX05BTUUoQSksKytEQkdfTEVWRUwoQSksX0VOVEVSX1NUUixfX0ZVTkNfXykKI2RlZmluZSBfREJHX0xFQVZFKEEpICAgICAgIERCR19QUklOVCgiJXM6JS4qczolc1xuIixEQkdfTkFNRShBKSxEQkdfTEVWRUwoQSktLSxfTEVBVkVfU1RSLF9fRlVOQ19fKQoKCiNkZWZpbmUgREJHX0ZVTkMoRikgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqX19GVU5DX18gPSBGOwoKI2RlZmluZSBEQkdfRU5URVIoQSkgICAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBfREJHX0VOVEVSKEEpO30KCiNkZWZpbmUgREJHX0xFQVZFKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgX0RCR19MRUFWRShBKTt9CgojZGVmaW5lIERCR19QQVJBTShBLE4sRixTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1BBUkFNX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUklOVCgiICAlcyAtLSAiRiJcbiIsTixTKTt9CgoKI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6RVJST1I6JXMgIixEQkdfTkFNRShBKSxfX0ZVTkNfXyk7REJHX1BSSU5UQyhTKTtEQkdfVFJBUDt9fQoKCiNkZWZpbmUgREJHX1dBUk5JTkcoQSxTLi4uKSB7aWYgKERCR19GTEFHUyhBKSAmIERCR19XQVJOSU5HX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6V0FSTklORzolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319CgoKI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319CgoKI2RlZmluZSBEQkdfVFJBQ0UoQSxTLi4uKSAgIGRvIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6JXMgIixEQkdfTkFNRShBKSxfX0ZVTkNfXyk7REJHX1BSSU5UQyhTKTt9fSB3aGlsZSAoMCkKCgojZGVmaW5lIERCR19SWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKFMpO319CgoKI2RlZmluZSBEQkdfVFgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQoKI2RlZmluZSBEQkdfRFMoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX0RTX09OKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQoKCiNkZWZpbmUgREJHX0FTU0VSVChDKSAgICAgICB7aWYgKCEoQykpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcylcbiIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0MsX19GSUxFX18sX19MSU5FX18sX19GVU5DX18pOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1RSQVA7fX0KCnR5cGVkZWYgc3RydWN0IHsKICAgIGNoYXIgICAgICAgICAgICpkYmdOYW1lOwogICAgaW50ICAgICAgICAgICAgIGRiZ0xldmVsOwogICAgdW5zaWduZWQgbG9uZyAgIERlYnVnRmxhZzsKfSBkYmdfaW5mb190OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZWxzZSAvLyBEQkcKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIERCR19ERUZOCiNkZWZpbmUgREJHX1RSQVAKI2RlZmluZSBEQkdfRlVOQyhGKQojZGVmaW5lIERCR19QUklOVChTLi4uKQojZGVmaW5lIERCR19FTlRFUihBKQojZGVmaW5lIERCR19MRUFWRShBKQojZGVmaW5lIERCR19QQVJBTShBLE4sRixTLi4uKQojZGVmaW5lIERCR19FUlJPUihBLFMuLi4pCiNkZWZpbmUgREJHX1dBUk5JTkcoQSxTLi4uKQojZGVmaW5lIERCR19OT1RJQ0UoQSxTLi4uKQojZGVmaW5lIERCR19UUkFDRShBLFMuLi4pCiNkZWZpbmUgREJHX1JYKEEsUy4uLikKI2RlZmluZSBEQkdfVFgoQSxTLi4uKQojZGVmaW5lIERCR19EUyhBLFMuLi4pCiNkZWZpbmUgREJHX0FTU0VSVChDKQoKI2VuZGlmIC8vIERCRwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCiNlbmRpZiAvLyBfREVCVUdfSAoK