LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1Vc2Vyc3BhY2UtRXZlbnQtTW9kdWwKCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnR1LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgojaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCiNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgojaW5jbHVkZSAidXNlci9FcGxTZG9Bc3lTZXF1LmgiCiNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKI2luY2x1ZGUgInVzZXIvRXBsTGVkdS5oIgojaW5jbHVkZSAiQmVuY2htYXJrLmgiCgojaWZkZWYgRVBMX05PX0ZJRk8KI2luY2x1ZGUgImtlcm5lbC9FcGxFdmVudGsuaCIKI2Vsc2UKI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwp2b2lkIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQodTggYlRyYWNlUG9pbnROdW1iZXJfcCk7CnZvaWQgVGd0RGJnUG9zdFRyYWNlVmFsdWUodTMyIGR3VHJhY2VWYWx1ZV9wKTsKI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCiNlbHNlCiNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCB0eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgewojaWZuZGVmIEVQTF9OT19GSUZPCgl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7Cgl0U2hiSW5zdGFuY2UgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2U7CiNlbmRpZgoJdEVwbFByb2Nlc3NFdmVudENiIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2I7Cgp9IHRFcGxFdmVudHVJbnN0YW5jZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG1vZHVsIGdsb2JhbGUgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8jaWZuZGVmIEVQTF9OT19GSUZPCnN0YXRpYyB0RXBsRXZlbnR1SW5zdGFuY2UgRXBsRXZlbnR1SW5zdGFuY2VfZzsKLy8jZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX05PX0ZJRk8KLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGluY29tbWluZyBldmVudHMKc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1Vc2VyLUV2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOgovLwovLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVJbml0Ci8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCAgPSBmdW5jdGlvbiBwb2ludGVyIGZvciBBUEkgZXZlbnQgY2FsbGJhY2sKLy8KLy8KLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVwbEV2ZW50dUluaXQodEVwbFByb2Nlc3NFdmVudENiIHBmbkFwaVByb2Nlc3NFdmVudENiX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IEVwbEV2ZW50dUFkZEluc3RhbmNlKHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOwoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1QWRkSW5zdGFuY2UKLy8KLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGFkZCBvbmUgbW9yZSBpbnN0YW5jZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCAgPSBmdW5jdGlvbiBwb2ludGVyIGZvciBBUEkgZXZlbnQgY2FsbGJhY2sKLy8KLy8KLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVwbEV2ZW50dUFkZEluc3RhbmNlKHRFcGxQcm9jZXNzRXZlbnRDYiBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQp7Cgl0RXBsS2VybmVsIFJldDsKI2lmbmRlZiBFUExfTk9fRklGTwoJdFNoYkVycm9yIFNoYkVycm9yOwoJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOwojZW5kaWYKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCgkvLyBpbml0IGluc3RhbmNlIHZhcmlhYmxlcwoJRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BmbkFwaVByb2Nlc3NFdmVudENiID0gcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcDsKCiNpZm5kZWYgRVBMX05PX0ZJRk8KCS8vIGluaXQgc2hhcmVkIGxvb3AgYnVmZmVyCgkvLyBrZXJuZWwgLT4gdXNlcgoJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIsCgkJCQkgICAgIEVQTF9FVkVOVF9OQU1FX1NIQl9LRVJORUxfVE9fVVNFUiwKCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkgICAgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAoJCQkJICAgICAmZlNoYk5ld0NyZWF0ZWQpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50dUFkZEluc3RhbmNlKCk6IFNoYkNpckFsbG9jQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCQlnb3RvIEV4aXQ7Cgl9CgoJLy8gdXNlciAtPiBrZXJuZWwKCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAoJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwsCgkJCQkgICAgICZFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihVMkspIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnR1SW5zdGFuY2VfZy4KCQkJCQkgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAoJCQkJCSAgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IsCgkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50dUFkZEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEsyVSkgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCQlnb3RvIEV4aXQ7Cgl9CgogICAgICBFeGl0OgojZW5kaWYKCglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dURlbEluc3RhbmNlCi8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWxldGUgaW5zdGFuY2UgYW4gZnJlZSB0aGUgYnVmZmVyc3RydWN0dXJlCi8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6Ci8vCi8vCi8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxFdmVudHVEZWxJbnN0YW5jZSh2b2lkKQp7Cgl0RXBsS2VybmVsIFJldDsKI2lmbmRlZiBFUExfTk9fRklGTwoJdFNoYkVycm9yIFNoYkVycm9yOwojZW5kaWYKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCiNpZm5kZWYgRVBMX05PX0ZJRk8KCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAoJU2hiRXJyb3IgPQoJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwgTlVMTCwKCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoSzJVKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJfQoJLy8gZnJlZSBidWZmZXIgVXNlciAtPiBLZXJuZWwKCVNoYkVycm9yID0KCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50dUluc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UpOwoJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spICYmIChTaGJFcnJvciAhPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jcykpIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudHVEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCX0gZWxzZSB7CgkJRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSA9IE5VTEw7Cgl9CgoJLy8gZnJlZSBidWZmZXIgIEtlcm5lbCAtPiBVc2VyCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKSAmJiAoU2hiRXJyb3IgIT0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3MpKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7Cgl9IGVsc2UgewoJCUVwbEV2ZW50dUluc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UgPSBOVUxMOwoJfQoKI2VuZGlmCgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQcm9jZXNzCi8vCi8vIERlc2NyaXB0aW9uOiBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCi8vCi8vCi8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFcGxFdmVudHVQcm9jZXNzKHRFcGxFdmVudCAqcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGNoZWNrIG1fRXZlbnRTaW5rCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJCS8vIE5NVC1Vc2VyLU1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKCQl7CiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQoJCQlSZXQgPSBFcGxObXR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXR1OwoKCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCgkJCQkJCSAgIFJldCwKCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKCQkJCQkJICAgJkV2ZW50U291cmNlKTsKCQkJfQojZW5kaWYKCQkJYnJlYWs7CgkJfQoKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQoJCS8vIE5NVC1NTi1Vc2VyLU1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rTm10TW51OgoJCXsKCQkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRNbnU7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CgkJCWJyZWFrOwoJCX0KI2VuZGlmCgojaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApICAgXAogICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApKQoJCS8vIGV2ZW50cyBmb3IgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyCgljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CgkJewoJCQlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzRXZlbnQocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVNkb0FzeVNlcTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KCQkJYnJlYWs7CgkJfQojZW5kaWYKCgkJLy8gTEVEIHVzZXIgcGFydCBtb2R1bGUKCWNhc2Uga0VwbEV2ZW50U2lua0xlZHU6CgkJewojaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKCQkJUmV0ID0gRXBsTGVkdVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlTGVkdTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KI2VuZGlmCgkJCWJyZWFrOwoJCX0KCgkJLy8gZXZlbnQgZm9yIEVQTCBhcGkKCWNhc2Uga0VwbEV2ZW50U2lua0FwaToKCQl7CgkJCWlmIChFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgIT0gTlVMTCkgewoJCQkJUmV0ID0KCQkJCSAgICBFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJICAgIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IocEV2ZW50X3ApOwoJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCgkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcGxBcGk7CgoJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCQlFcGxFdmVudHVQb3N0RXJyb3IKCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwgUmV0LAoJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKCQkJCX0KCQkJfQoJCQlicmVhazsKCgkJfQoKCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CgkJewoJCQlSZXQgPSBFcGxEbGx1Q2FsUHJvY2VzcyhwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRGxsdTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KCQkJYnJlYWs7CgoJCX0KCgljYXNlIGtFcGxFdmVudFNpbmtFcnJ1OgoJCXsKCQkJLyoKCQkJICAgUmV0ID0gRXBsRXJydVByb2Nlc3MocEV2ZW50X3ApOwoJCQkgICBpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKQoJCQkgICB7CgkJCSAgIEV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXJydTsKCgkJCSAgIC8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJICAgRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKCQkJICAgUmV0LAoJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQkgICB9CgkJCSAqLwoJCQlicmVhazsKCgkJfQoKCQkvLyB1bmtub3duIHNpbmsKCWRlZmF1bHQ6CgkJewoJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKCQl9CgoJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UG9zdAovLwovLyBEZXNjcmlwdGlvbjogcG9zdCBldmVudHMgZnJvbSB1c2Vyc3BhY2UKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgovLwovLwovLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKnBFdmVudF9wKQp7Cgl0RXBsS2VybmVsIFJldDsKI2lmbmRlZiBFUExfTk9fRklGTwoJdFNoYkVycm9yIFNoYkVycm9yOwoJdFNoYkNpckNodW5rIFNoYkNpckNodW5rOwoJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOwoJdW5zaWduZWQgaW50IGZCdWZmZXJDb21wbGV0ZWQ7CiNlbmRpZgoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKI2lmbmRlZiBFUExfTk9fRklGTwoJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgoJdWxEYXRhU2l6ZSA9CgkgICAgc2l6ZW9mKHRFcGxFdmVudCkgKwoJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOwojZW5kaWYKCgkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJCS8vIGtlcm5lbHNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CgljYXNlIGtFcGxFdmVudFNpbmtObXRrOgoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CgljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhVMkspIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAoJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCgkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgewoJCQkJU2hiRXJyb3IgPQoJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkJCQkgJlNoYkNpckNodW5rLAoJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCgkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCgkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAoJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQoJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgewoJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKFUySykgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9CiNlbHNlCgkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOwojZW5kaWYKCgkJCWJyZWFrOwoJCX0KCgkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CgljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CgljYXNlIGtFcGxFdmVudFNpbmtBcGk6CgljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKCWNhc2Uga0VwbEV2ZW50U2lua0xlZHU6CgkJewojaWZuZGVmIEVQTF9OT19GSUZPCgkJCS8vIHBvc3QgbWVzc2FnZQoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOwoJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soSzJVKSAtPiAweCVYXG4iLAoJCQkJICAgICBTaGJFcnJvcik7CgkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQlnb3RvIEV4aXQ7CgkJCX0KCQkJU2hiRXJyb3IgPQoJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAoJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKCQkJCQkJIHNpemVvZih0RXBsRXZlbnQpLAoJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOwoJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoSzJVKSAtPiAweCVYXG4iLAoJCQkJICAgICBTaGJFcnJvcik7CgkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQlnb3RvIEV4aXQ7CgkJCX0KCQkJaWYgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpIHsKCQkJCVNoYkVycm9yID0KCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAoJCQkJCQkJICZTaGJDaXJDaHVuaywKCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAoJCQkJCQkJICh1bnNpZ25lZCBsb25nKQoJCQkJCQkJIHBFdmVudF9wLT5tX3VpU2l6ZSwKCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CgkJCQlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykKCQkJCSAgICB8fCAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkpIHsKCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rMihLMlUpIC0+IDB4JVhcbiIsCgkJCQkJICAgICBTaGJFcnJvcik7CgkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOwoJCQkJCWdvdG8gRXhpdDsKCQkJCX0KCQkJfQojZWxzZQoJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKI2VuZGlmCgoJCQlicmVhazsKCQl9CgoJZGVmYXVsdDoKCQl7CgkJCVJldCA9IGtFcGxFdmVudFVua25vd25TaW5rOwoJCX0KCgl9CQkJLy8gZW5kIG9mIHN3aXRjaChwRXZlbnRfcC0+bV9FdmVudFNpbmspCgojaWZuZGVmIEVQTF9OT19GSUZPCiAgICAgIEV4aXQ6CiNlbmRpZgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQb3N0RXJyb3IKLy8KLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3JldmVudCBmcm9tIHVzZXJzcGFjZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgRXZlbnRTb3VyY2VfcCAgID0gc291cmNlLW1vZHVsZSBvZiB0aGUgZXJyb3JldmVudAovLyAgICAgICAgICAgICAgRXBsRXJyb3JfcCAgICAgPSBjb2RlIG9mIG9jY3VyZWQgZXJyb3IKLy8gICAgICAgICAgICAgIHVpQXJnU2l6ZV9wICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50Ci8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAovLwovLwovLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRXBsRXZlbnR1UG9zdEVycm9yKHRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZV9wLAoJCQkgICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCgkJCSAgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXU4IGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOwoJdEVwbEV2ZW50RXJyb3IgKnBFdmVudEVycm9yID0gKHRFcGxFdmVudEVycm9yICopIGFiQnVmZmVyOwoJdEVwbEV2ZW50IEVwbEV2ZW50OwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGNyZWF0ZSBhcmd1bWVudAoJcEV2ZW50RXJyb3ItPm1fRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZV9wOwoJcEV2ZW50RXJyb3ItPm1fRXBsRXJyb3IgPSBFcGxFcnJvcl9wOwoJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKCgkvLyBjcmVhdGUgZXZlbnQKCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOwoJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rQXBpOwoJRVBMX01FTVNFVCgmRXBsRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXBsRXZlbnQubV9OZXRUaW1lKSk7CglFcGxFdmVudC5tX3VpU2l6ZSA9CgkgICAgKHNpemVvZihFdmVudFNvdXJjZV9wKSArIHNpemVvZihFcGxFcnJvcl9wKSArIHVpQXJnU2l6ZV9wKTsKCUVwbEV2ZW50Lm1fcEFyZyA9ICZhYkJ1ZmZlclswXTsKCgkvLyBwb3N0IGVycm9yZXZlbnQKCVJldCA9IEVwbEV2ZW50dVBvc3QoJkVwbEV2ZW50KTsKCglyZXR1cm4gUmV0Owp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiKCkKLy8KLy8gRGVzY3JpcHRpb246IENhbGxiYWNrLWZ1bmN0aW9uIGZvciBldmV0cyBmcm9tIGtlcm5lbHNwYWNlCi8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBmb3IgYnVmZmVyCi8vICAgICAgICAgICAgICB1bERhdGFTaXplX3AgICAgICAgID0gc2l6ZSBvZiBkYXRhCi8vCi8vCi8vIFJldHVybnM6IHZvaWQKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZm5kZWYgRVBMX05PX0ZJRk8Kc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCnsKCXRFcGxFdmVudCAqcEVwbEV2ZW50OwoJdFNoYkVycm9yIFNoYkVycm9yOwovL3Vuc2lnbmVkIGxvbmcgICB1bEJsb2NrQ291bnQ7Ci8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7Cgl1OCBhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCkgKyBFUExfTUFYX0VWRU5UX0FSR19TSVpFXTsKCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQoJLy8gICAgICAgYW5kIGJlaGluZCB0aGlzIHRoZSBhcmd1bWVudAoKCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIxKTsKCi8vIGQuay4gbm90IG5lZWRlZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgZG9uZSBpbiBTaGFyZWRCdWZmCi8qICAgIGRvCiAgICB7CiAgICAgICAgQkVOQ0hNQVJLX01PRF8yOF9TRVQoMSk7ICAgIC8vIDQgtXMgdW50aWwgcmVzZXQKICAgICAgICAvLyBnZXQgbWVzc2FnZXNpemUKICAgICAgICBTaGJFcnJvciA9IFNoYkNpckdldFJlYWREYXRhU2l6ZSAocFNoYlJ4SW5zdGFuY2VfcCwgJnVsRGF0YVNpemUpOwogICAgICAgIGlmKFNoYkVycm9yICE9IGtTaGJPaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGVycm9yIGdvdG8gZXhpdAogICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgfQoKICAgICAgICBCRU5DSE1BUktfTU9EXzI4X1JFU0VUKDEpOyAgLy8gMTQgtXMgdW50aWwgc2V0CiovCgkvLyBjb3B5IGRhdGEgZnJvbSBldmVudCBxdWV1ZQoJU2hiRXJyb3IgPSBTaGJDaXJSZWFkRGF0YUJsb2NrKHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKCQkJCSAgICAgICBzaXplb2YoYWJEYXRhQnVmZmVyKSwgJnVsRGF0YVNpemVfcCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJLy8gZXJyb3IgZ290byBleGl0CgkJZ290byBFeGl0OwoJfQoJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCglwRXBsRXZlbnQgPSAodEVwbEV2ZW50ICopIGFiRGF0YUJ1ZmZlcjsKCS8vIHNldCBEYXRhc2l6ZQoJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CglpZiAocEVwbEV2ZW50LT5tX3VpU2l6ZSA+IDApIHsKCQkvLyBzZXQgcG9pbnRlciB0byBhcmd1bWVudAoJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07Cgl9IGVsc2UgewoJCS8vc2V0IHBvaW50ZXIgdG8gTlVMTAoJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKCX0KCglCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsKCS8vIGNhbGwgcHJvY2Vzc2Z1bmN0aW9uCglFcGxFdmVudHVQcm9jZXNzKHBFcGxFdmVudCk7CgoJQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCgxKTsKCS8vIHJlYWQgbnVtYmVyIG9mIGxlZnQgbWVzc2FnZXMgdG8gcHJvY2VzcwovLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgovKiAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCAocFNoYlJ4SW5zdGFuY2VfcCwgJnVsQmxvY2tDb3VudCk7CiAgICAgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGVycm9yIGdvdG8gZXhpdAogICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgfQogICAgfSB3aGlsZSAodWxCbG9ja0NvdW50ID4gMCk7CiovCiAgICAgIEV4aXQ6CglyZXR1cm47Cn0KI2VuZGlmCgovLyBFT0YK