Ci8vICAgdmltOnR3PTExMDp0cz00OgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZJTEUgICA6CURIRi5DCioKKiBEQVRFCToJJERhdGU6IDIwMDQvMDcvMTkgMDg6MTY6MTQgJCAgICRSZXZpc2lvbjogMS4yICQKKiBPcmlnaW5hbAk6CTIwMDQvMDUvMjggMTQ6MDU6MzQgICAgUmV2aXNpb246IDEuMzYgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWwJOgkyMDA0LzA1LzExIDA2OjIyOjU3ICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCiogT3JpZ2luYWwJOgkyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjI4ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCiogT3JpZ2luYWwJOgkyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjI3ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQoqIE9yaWdpbmFsCToJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKiBPcmlnaW5hbAk6CTIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMjEgICAgICBUYWc6IHQyMDA0MDMxMF8wMQoqIE9yaWdpbmFsCToJMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS4xOSAgICAgIFRhZzogdDIwMDQwMzA0XzAxCiogT3JpZ2luYWwJOgkyMDA0LzAzLzAyIDA5OjI3OjExICAgIFJldmlzaW9uOiAxLjE3ICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKiBPcmlnaW5hbAk6CTIwMDQvMDIvMjQgMTM6MDA6MjggICAgUmV2aXNpb246IDEuMTUgICAgICBUYWc6IHQyMDA0MDIyNF8wMQoqIE9yaWdpbmFsCToJMjAwNC8wMi8xOSAxMDo1NzoyOCAgICBSZXZpc2lvbjogMS4xNCAgICAgIFRhZzogdDIwMDQwMjE5XzAxCiogT3JpZ2luYWwJOgkyMDAzLzExLzI3IDA5OjAwOjA5ICAgIFJldmlzaW9uOiAxLjMgICAgICBUYWc6IHQyMDAyMTIxNl8wMQoqCiogQVVUSE9SIDoJSm9obiBNZWVydGVucwoqCQkJTmljbyBWYWxzdGVyCioKKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgoqCiogREVTQyAgIDoJZ2VuZXJpYyBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBkb3dubG9hZCBvZiBOSUMgZmlybXdhcmUKKgkJCUxvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKKgoqCQkJQ3VzdG9taXphYmxlIHZpYSBIQ0ZDRkcuSCwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgSENGLkgKKgoqCioJREhGIGlzIChpbnRlbmRlZCB0byBiZSkgcGxhdGZvcm0taW5kZXBlbmRlbnQuCioJREhGIGlzIGEgbW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygcm91dGluZXMgdG8gZG93bmxvYWQgZmlybXdhcmUKKglpbWFnZXMgKHRoZSBuYW1lcyBwcmltYXJ5LCBzdGF0aW9uLCBhY2Nlc3MgcG9pbnQsIHNlY29uZGFyeSBhbmQgdGVydGlhcnkKKglhcmUgdXNlZCBvciBoYXZlIGJlZW4gdXNlZCkgdG8gdm9sYXRpbGUgb3Igbm9udm9sYXRpbGUgbWVtb3J5CioJaW4gV2F2ZUxBTi9JRUVFIE5JQ3MuIFRvIGFjaGlldmUgdGhpcyBESEYgbWFrZXMgdXNlIG9mIHRoZSBXYXZlTEFOL0lFRUUKKglXQ0kgYXMgaW1wbGVtZW50ZWQgYnkgdGhlIEhDRi1tb2R1bGUuCioKKglEb3dubG9hZCB0byBub24tdm9sYXRpbGUgbWVtb3J5IGlzIHVzZWQgdG8gdXBkYXRlIGEgV2F2ZUxBTi9JRUVFIE5JQyB0byBuZXcKKglmaXJtd2FyZS4gTm9ybWFsbHkgdGhpcyB3aWxsIGJlIGFuIHVwZ3JhZGUgdG8gbmV3ZXIgZmlybXdhcmUsIGFsdGhvdWdoCioJZG93bmdyYWRpbmcgdG8gb2xkZXIgZmlybXdhcmUgaXMgcG9zc2libGUgdG9vLgoqCiogTm90ZTogcmVsYXRpdmUgdG8gQXNzZXJ0cywgdGhlIGZvbGxvd2luZyBjYW4gYmUgb2JzZXJ2ZWQ6CioJU2luY2UgdGhlIElGQiBpcyBub3Qga25vd24gaW5zaWRlIHRoZSByb3V0aW5lLCB0aGUgbWFjcm8gSENGQVNTRVJUIGlzIHJlcGxhY2VkIHdpdGggTU1EQVNTRVJULgoqCUFsc28gdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGluIHRoZSBhc3NlcnQgaXMgcmFpc2VkIGJ5IEZJTEVfTkFNRV9PRkZTRVQgKDEwMDAwKSB0byBkaXNjcmltaW5hdGUgdGhlCioJREhGIEFzc2VydHMgZnJvbSBIQ0YgYW5kIE1NRCBhc3NlcnRzLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCioKKiBTT0ZUV0FSRSBMSUNFTlNFCioKKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwoqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKgoqIENPUFlSSUdIVCCpIDE5OTkgLSAyMDAwIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioKKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAoqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKgoqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKiAgICBkaXN0cmlidXRpb24uCioKKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCioKKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwoqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQoqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoqCiogRGlzY2xhaW1lcgoqCiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgoqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgoqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwoqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAoqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiogREFNQUdFLgoqCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCiNpbmNsdWRlICJoY2ZkZWYuaCIKI2luY2x1ZGUgImRoZi5oIgojaW5jbHVkZSAibW1kLmgiCgovL3RvIGRpc3Rpbmd1aXNoIE1NRCBmcm9tIEhDRiBhc3NlcnRzIGJ5IG1lYW5zIG9mIGxpbmUgbnVtYmVyCiN1bmRlZglGSUxFX05BTUVfT0ZGU0VUCiNkZWZpbmUgRklMRV9OQU1FX09GRlNFVCBNTURfRklMRV9OQU1FX09GRlNFVAovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIERlZmluZXMsIGRhdGEgc3RydWN0dXJlcywgYW5kIGdsb2JhbCB2YXJpYWJsZXMKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0CmNoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CgovL1RoZSBiaW5hcnkgZG93bmxvYWQgZnVuY3Rpb24gInJlbG9jYXRlcyIgdGhlIGltYWdlIHVzaW5nIGNvbnN0cnVjdGlvbnMgbGlrZToKLy8JZnctPmlkZW50aXR5ID0gKENGR19JREVOVElUWV9TVFJDVCBGQVIgKikoKGNoYXIgRkFSICopZnctPmlkZW50aXR5ICsgKGhjZl8zMilmdyApOwovL3VuZGVyIHNvbWUgb2YgdGhlIG1lbW9yeSBtb2RlbHMgdW5kZXIgTVNWQyAxLjUyIHRoZXNlIGNvbnN0cnVjdGlvbnMgZGVncmFkZSB0byAxNi1iaXRzIHBvaW50ZXIgYXJpdGhtZXRpYy4KLy9mdy0+aWRlbnRpdHkgaXMgbGltaXRlZCwgc3VjaCB0aGF0IGFkZGluZyBpdCB0byBmdywgZG9lcyBub3QgbmVlZCB0byBjYXJyeSBvdmVyIGZyb20gb2Zmc2V0IHRvIHNlZ21lbnQuCi8vSG93ZXZlciB0aGUgc2VnbWVudCBpcyBub3Qgc2V0IGF0IGFsbC4KLy9BcyBhIHdvcmthcm91bmQgdGhlIFBTRVVET19DSEFSUCBtYWNybyBpcyBpbnRyb2R1Y2VkIHdoaWNoIGlzIGEgY2hhciBwb2ludGVyIGV4Y2VwdCBmb3IgTVNWQyAxLjUyLCBpbgovL3doaWNoIGNhc2Ugd2Uga25vdyB0aGF0IGEgMzItYml0IHF1YW50aXR5IGlzIGFkZXF1YXRlIGFzIGEgcG9pbnRlci4KLy9Ob3RlIHRoYXQgb3RoZXIgcGxhdGZvcm1zIG1heSBleHBlcmllbmNlIGNvbXBhcmFibGUgcHJvYmxlbXMgd2hlbiB1c2luZyB0aGUgYmluYXJ5IGRvd25sb2FkIGZlYXR1cmUuCiNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA9PSAgODAwCQkJCS8vIFZpc3VhbCBDKysgMS41CiNkZWZpbmUgUFNFVURPX0NIQVJQIGhjZl8zMgojZWxzZQojZGVmaW5lIFBTRVVET19DSEFSUCBoY2ZfOCoKI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIExUVi1yZWNvcmRzIHJldHJpZXZlZCBmcm9tIHRoZSBOSUMgdG86CiAqCS0gZGV0ZXJtaW5lIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBOSUMgYW5kIGltYWdlCiAqCS0gKChzZXR1cCB0aGUgYnVmZmVyIHNpemUgZHluYW1pY2FsbHkgZm9yIG5vbi12b2xhdGlsZSBkb3dubG9hZCAoc2VlIG5vdGUgYmVsb3cpICkpCiAqCS0gc3VwcGx5IHBsdWdnaW5nIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgUERBIChILUkgb25seSkKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gZm9yIFVTQi9IMSB3ZSBuZWVkZWQgYSBzbWFsbGVyIHZhbHVlIHRoYW4gdGhlIENGR19ETF9CVUZfU1RSQ1QgcmVwb3J0ZWQgODE5MgovLyBmb3IgdGhlIHRpbWUgYmVpbmcgaXQgc2VlbXMgc2ltcGxlciB0byBhbHdheXMgdXNlIDIwMDAgZm9yIFVTQi9IMSBhcyB3ZWxsIGFzIGFsbCBvdGhlciBjYXNlcyByYXRoZXIgdGhhbgovLyB1c2luZyB0aGUgImZpeGVkIGFueXdheSIgQ0ZHX0RMX0JVRl9TVFJDVC4KI2RlZmluZSBETF9TSVpFIDIwMDAKCi8vQ0ZHX0lERU5USVRZX1NUUkNUICAgCXByaV9pZGVudGl0eQk9IHsgTE9GKENGR19JREVOVElUWV9TVFJDVCksIENGR19QUklfSURFTlRJVFkgfTsKQ0ZHX1NVUF9SQU5HRV9TVFJDVCAJbWZpX3N1cCAgICAgICAgCT0geyBMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCksIENGR19OSUNfTUZJX1NVUF9SQU5HRSB9OwpDRkdfU1VQX1JBTkdFX1NUUkNUIAljZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19DRklfU1VQX1JBTkdFIH07Ci8qIE5vdGU6IGNvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGFib3ZlIGV4cGxhaW5lZCBhbmQgZGVmaW5lZCBETF9TSVpFIGlmIG5lZWQgYXJpc2VzCiAqIENGR19ETF9CVUZfU1RSQ1QgICAgCWRsX2J1ZiAgICAgICAgIAk9IHsgTE9GKENGR19ETF9CVUZfU1RSQ1QpLCBDRkdfRExfQlVGIH07CiovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEFycmF5IGx0dl9pbmZvIHN0b3JlcyBOSUMgaW5mb3JtYXRpb24gKGluIHRoZSBmb3JtIG9mIExUVi1yZWNvcmRzKQogKiBuZWVkZWQgZm9yIGRvd25sb2FkLiBBIE5VTEwgcmVjb3JkIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBhcnJheS4KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogVGhlIExUVl9JTkZPX1NUUlVDVCBpcyBuZWVkZWQgdG8gc2F2ZSB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMsIGJlY2F1c2UgYWZ0ZXIgYSBHRVRfSU5GTygpCiAqIHRoZSBsZW4gZmllbGQgaXMgY2hhbmdlZCB0byB0aGUgcmVhbCBsZW4gb2YgdGhlIFJJRCBieSB0aGUgY2FsbGVkIHJvdXRpbmUuCiAqIFRoaXMgaXMgb25seSByZWxldmFudCBpZiB0aGUgREhGIHVzZWQgd2l0aG91dCByZWxvYWRpbmcgdGhlIGRyaXZlci91dGlsaXR5LgogKi8KCkxUVl9JTkZPX1NUUlVDVCBsdHZfaW5mb1tdID0gewoJeyAoTFRWUCkmbWZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCgl7IChMVFZQKSZjZmlfc3VwLAkJCUxPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSB9ICwKCXsgKExUVlApIE5VTEwsIAkJCQkwIH0KfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CQkJCWNoZWNrX2NvbXBfZncoIG1lbWltYWdlICpmdyApOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi5TVUJNT0RVTEUJCWludCBjaGVja19jb21wX2Z3KCBtZW1pbWFnZSAqZncgKQoqLlBVUlBPU0UJCUNoZWNrcyBjb21wYXRpYmlsaXR5IG9mIENGSSBhbmQgTUZJLCBOSUMgYXMgc3VwcGxpZXIsIHN0YXRpb24vQVAgZmlybXdhcmUgaW1hZ2UgYXMgc3VwcGxpZXIuCioKKi5BUkdVTUVOVFMKKiAgIGZ3ICAgICAgICAgCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCioKKi5SRVRVUk5TCiogICBIRkNfU1VDQ0VTUyAgICAgIAktIGZpcm13YXJlIE9LCiogICBESEZfRVJSX0lOQ09NUF9GVwoqCiouREVTQ1JJUFRJT04KKiAgIFRoaXMgZnVuY3Rpb24gdXNlcyBjb21wYXRpYmlsaXR5IGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiB0aGF0IGhhcyBiZWVuCiogICByZXRyaWV2ZWQgZnJvbSB0aGUgY2FyZCB3aGljaCBpcyBjdXJyZW50bHkgaW5zZXJ0ZWQgdG8gY2hlY2sgd2hldGhlciB0aGUKKiAgIHN0YXRpb24gZmlybXdhcmUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCBpcyBjb21wYXRpYmxlLgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKY2hlY2tfY29tcF9mdyggbWVtaW1hZ2UgKmZ3ICkKewpDRkdfUkFOR0UyMF9TVFJDVCAgCQkqcDsKaW50ICAgCQkJCQlyYyA9IEhDRl9TVUNDRVNTOwpDRkdfUkFOR0VfU1BFQ19TVFJDVCoJaTsKCglzd2l0Y2goIGZ3LT5pZGVudGl0eS0+dHlwICkgewoJICBjYXNlIENGR19GV19JREVOVElUWToJCQkJLy9TdGF0aW9uIEYvVwoJICBjYXNlIENPTVBfSURfRldfQVBfRkFLRToJCQkvLzs/aXMgdGhpcyB1c2VmdWwgKHVzZWQgdG8gYmU6ICBDRkdfQVBfSURFTlRJVFkpCgkJYnJlYWs7CgkgIGRlZmF1bHQ6CgkJTU1EQVNTRVJUKCBET19BU1NFUlQsIGZ3LT5pZGVudGl0eS0+dHlwICkgCS8vdW5rbm93bi91bnN1cHBvcnRlZCBmaXJtd2FyZV90eXBlOgoJCXJjID0gREhGX0VSUl9JTkNPTVBfRlc7CgkJcmV0dXJuIHJjOyAvKiA7PyBob3cgdXNlZnVsIGlzIHRoaXMgYW55d2F5LAoJCQkJCSogIHRpbGwgdGhhdCBpcyBzb3J0ZWQgb3V0IG1pZ2h0IGFzIHdlbGwgdmlvbGF0ZSBteSBvd24gc2luZ2xlIGV4aXQgcHJpbmNpcGxlCgkJCQkJKi8KCX0KCXAgPSBmdy0+Y29tcGF0OwoJaSA9IE5VTEw7Cgl3aGlsZSggcC0+bGVuICYmIGkgPT0gTlVMTCApIHsJCQkJCS8vIGNoZWNrIHRoZSBNRkkgcmFuZ2VzCgkJaWYgKCBwLT50eXAgID09IENGR19NRklfQUNUX1JBTkdFU19TVEEgKSB7CgkJCWkgPSBtbWRfY2hlY2tfY29tcCggKHZvaWQqKXAsICZtZmlfc3VwICk7CgkJfQoJCXArKzsKCX0KCU1NREFTU0VSVCggaSwgMCApCS8vTUZJOiBOSUMgU3VwcGxpZXIgbm90IGNvbXBhdGlibGUgd2l0aCBGL1cgaW1hZ2UgQWN0b3IKCWlmICggaSApIHsKCQlwID0gZnctPmNvbXBhdDsKCQlpID0gTlVMTDsKCQl3aGlsZSAoIHAtPmxlbiAmJiBpID09IE5VTEwgKSB7CQkJLy8gY2hlY2sgdGhlIENGSSByYW5nZXMKCQkJaWYgKCBwLT50eXAgID09IENGR19DRklfQUNUX1JBTkdFU19TVEEgKSB7CgkJCQkgaSA9IG1tZF9jaGVja19jb21wKCAodm9pZCopcCwgJmNmaV9zdXAgKTsKCQkJfQoJCQlwKys7CgkJfQoJCU1NREFTU0VSVCggaSwgMCApCS8vQ0ZJOiBOSUMgU3VwcGxpZXIgbm90IGNvbXBhdGlibGUgd2l0aCBGL1cgaW1hZ2UgQWN0b3IKCX0KCWlmICggaSA9PSBOVUxMICkgewoJCXJjID0gREhGX0VSUl9JTkNPTVBfRlc7Cgl9CglyZXR1cm4gcmM7Cn0gLy8gY2hlY2tfY29tcF9mdwoKCgoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogRXhwb3J0ZWQgZnVuY3Rpb25zCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRSAJCWludCBkaGZfZG93bmxvYWRfYmluYXJ5KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQoqLlBVUlBPU0UJCURvd25sb2FkcyBhIGNvbXBsZXRlIChwcmltYXJ5LCBzdGF0aW9uLCBvciBhY2Nlc3MgcG9pbnQpIGZpcm13YXJlIGltYWdlIHRvIHRoZSBOSUMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKiAgIGZ3ICAgICAgICAgCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCioKKi5SRVRVUk5TCiogICBIQ0ZfU1VDQ0VTUyAgICAgICAgIAktIGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCiogICBESEZfRVJSX0lOQ09NUF9GVwkJLSBmaXJtd2FyZSBub3QgY29tcGF0aWJsZQoqCiouREVTQ1JJUFRJT04KKiAgIEluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcwoqICAgQ29ubmVjdCB0byB0aGUgREhGCiogICBDaGVjayB0aGUgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2UgKEZvciBwcmltYXJ5IGZpcm13YXJlIGltYWdlcyBpdCBpcyBjaGVja2VkIGZpcnN0CiogCXdoZXRoZXIgZG93bmxvYWQgaXMgbmVjZXNzYXJ5KS4KKiAgIElmIGV2ZXJ5dGhpbmcncyBkb3dubG9hZCB0aGUgZmlybXdhcmUuCiogICBEaXNjb25uZWN0IGZyb20gdGhlIERIRi4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFOgoJTU1EQVNTRVJUIGlzIHVuYWNjZXB0YWJsZSBiZWNhdXNlIHNvbWUgZHJpdmVycyBjYWxsIGRoZl9kb3dubG9hZF9iaW5hcnkgYmVmb3JlIGhjZl9jb25uZWN0CgoqIFRoZSBvbGQgY29tbWVudCB3YXM6CiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApkaGZfZG93bmxvYWRfYmluYXJ5KCBtZW1pbWFnZSAqZncgKQp7CmludCAJCQlyYyA9IEhDRl9TVUNDRVNTOwpDRkdfUFJPR19TVFJDVCAJKnA7CmludAkJCQlpOwoKCS8vdmFsaWRhdGUgdGhlIGltYWdlCglmb3IgKCBpID0gMDsgaSA8IHNpemVvZihzaWduYXR1cmUpICYmIGZ3LT5zaWduYXR1cmVbaV0gPT0gc2lnbmF0dXJlW2ldOyBpKysgKSAvKk5PUCovOwoJaWYgKCBpICE9IHNpemVvZihzaWduYXR1cmUpIAkJfHwKCQkgZnctPnNpZ25hdHVyZVtpXSAhPSAweDAxICAgCXx8CgkJIC8vdGVzdCBmb3IgTGl0dGxlL0JpZyBFbmRpYW4gQmluYXJ5IGZsYWcKCQkgZnctPnNpZ25hdHVyZVtpKzFdICE9ICggLypIQ0ZfQklHX0VORElBTiA/ICdCJyA6ICovICdMJyApICkgcmMgPSBESEZfRVJSX0lOQ09NUF9GVzsKCWVsc2UgewkJCQkJLy9MaXR0bGUgRW5kaWFuIEJpbmFyeSBmb3JtYXQKCQlmdy0+Y29kZXAgICAgPSAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopKChQU0VVRE9fQ0hBUlApZnctPmNvZGVwICsgKGhjZl8zMilmdyApOwoJCWZ3LT5pZGVudGl0eSA9IChDRkdfSURFTlRJVFlfU1RSQ1QgRkFSICopKChQU0VVRE9fQ0hBUlApZnctPmlkZW50aXR5ICsgKGhjZl8zMilmdyApOwoJCWZ3LT5jb21wYXQgICA9IChDRkdfUkFOR0UyMF9TVFJDVCBGQVIgKikoKFBTRVVET19DSEFSUClmdy0+Y29tcGF0ICsgKGhjZl8zMilmdyApOwoJCWZvciAoIGkgPSAwOyBmdy0+cFtpXTsgaSsrICkgZnctPnBbaV0gPSAoKFBTRVVET19DSEFSUClmdy0+cFtpXSArIChoY2ZfMzIpZncgKTsKCQlwID0gZnctPmNvZGVwOwoJCXdoaWxlICggcC0+bGVuICkgewoJCQlwLT5ob3N0X2FkZHIgPSAoUFNFVURPX0NIQVJQKXAtPmhvc3RfYWRkciArIChoY2ZfMzIpZnc7CgkJCXArKzsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0gICAvLyBkaGZfZG93bmxvYWRfYmluYXJ5CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRSAJCWludCBkaGZfZG93bmxvYWRfZncoIHZvaWQgKmlmYnAsIG1lbWltYWdlICpmdyApCiouUFVSUE9TRQkJRG93bmxvYWRzIGEgY29tcGxldGUgKHByaW1hcnkgb3IgdGVydGlhcnkpIGZpcm13YXJlIGltYWdlIHRvIHRoZSBOSUMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKiAgIGZ3ICAgICAJCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MgICAgICAgIAktIGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCioJSENGX0VSUl9OT19OSUMgICAgIAktIG5vIE5JQyBwcmVzZW50CioJREhGX0VSUl9JTkNPTVBfRlcgCS0gZmlybXdhcmUgbm90IGNvbXBhdGlibGUKKgoqLkRFU0NSSVBUSU9OCiogLSBjaGVjayB0aGUgc2lnbmF0dXJlIG9mIHRoZSBpbWFnZQoqIC0gZ2V0IHRoZSBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbXBvbmVudHMgb24gdGhlIE5JQwoqCSAgLSBQcmltYXJ5IEZpcm13YXJlIElkZW50aXR5CioJICAtCU1vZGVtIC0gRmlybXdhcmUgSS9GCioJICAtCUNvbnRyb2xsZXIgLSBGaXJtd2FyZSBJL0YKKiEhIC0gaWYgbmVjZXNzYXJ5ICggaS5lLiBILUkpIGdldCB0aGUgUERBIGNvbnRlbnRzIGZyb20gdGhlIE5JQwoqIC0gY2hlY2sgdGhlIGNvbXBhdGliaWxpdHkgb2YgdGhlIE1GSSBhbmQgQ0ZJIG9mIHRoZSBOSUMgd2l0aCB0aGUgRi9XIGltYWdlCioJTm90ZTogdGhlIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgaXMgb25seSByZWxldmFudCBmb3IgdGhlICJydW5uaW5nIiBIQ0YgYW5kIGlzIGFscmVhZHkgdmVyaWZpZWQgaW4KKgloY2ZfY29ubmVjdAoqISEgLQlpZiBuZWNlc3NhcnkgKCBpLmUuIEgtSSkKKiEhCSAgLQl2ZXJpZnkgdGhlIHN1bWNoZWNrIG9mIHRoZSBQREEKKiEhCSAgLQlwbHVnIHRoZSBpbWFnZSAoYmFzZWQgb24gdGhlIFBEQSBhbmQgdGhlIGRlZmF1bHQgcGx1ZyByZWNvcmRzKQoqIC0gbG9vcCBvdmVyIGFsbCB0aGUgZG93bmxvYWQgTFRWcyBpbiB0aGUgaW1hZ2Ugd2hpY2ggY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZgoqCSAgLSBDRkdfUFJPR19WT0xBVElMRS9DRkdfUFJPR19OT05fVk9MQVRJTEUKKgkgIC0gMSBvciBtb3JlIHNlcXVlbmNlcyBvZiBDRkdfUFJPR19BRERSLCBDRkdfUFJPR19EQVRBLC4uLi4sQ0ZHX1BST0dfREFUQQoqCSAgLQlDRkdfUFJPR19TVE9QCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKiBUaGUgb2xkIGNvbW1lbnQgd2FzOgoqCS8vIERvd25sb2FkIHByaW1hcnkgZmlybXdhcmUgaWYgbmVjZXNzYXJ5IGFuZCBhbGxvd2VkLiBUaGlzIGlzIGRvbmUgc2lsZW50bHkgKHdpdGhvdXQgdGVsbGluZwoqCS8vIHRoZSB1c2VyKSBhbmQgb25seSBpZiB0aGUgZmlybXdhcmUgaW4gdGhlIGRvd25sb2FkIGltYWdlIGlzIG5ld2VyIHRoYW4gdGhlIGZpcm13YXJlIGluIHRoZQoqCS8vIGNhcmQuICBJbiBNYWpvciB2ZXJzaW9uIDQgb2YgdGhlIHByaW1hcnkgZmlybXdhcmUgZnVuY3Rpb25zIG9mIEhlcm1lcyBhbmQgU2hhcmsgd2VyZQoqCS8vIGNvbWJpbmVkLiBQcmlvciB0byB0aGF0IHR3byBzZXBhcmF0ZSB2ZXJzaW9ucyBleGlzdGVkLiBXZSBvbmx5IGhhdmUgdG8gZG93bmxvYWQgcHJpbWFyeQoqCS8vIGZpcm13YXJlIGlmIG1ham9yIHZlcnNpb24gb2YgcHJpbWFyeSBmaXJtd2FyZSBpbiB0aGUgTklDIDwgNC4KKgkvLwkJZG93bmxvYWQgPSBwcmlfaWRlbnRpdHkudmVyc2lvbl9tYWpvciA8IDQ7CioJLy8JCWlmICggZG93bmxvYWQgKSB7CioJLy8JCQlyYyA9IGNoZWNrX2NvbXBfcHJpbWFyeSggZncgKTsKKgkvLwkJfQoqIEl0IGlzIG15IHVuZGVyc3RhbmRpbmcgdGhhdCBQcmkgVmFyaWFudCAxIG11c3QgYmUgdXBkYXRlZCBieSBQcmkgVmFyaWFudCAyLiBUaGUgdGVzdCBvbgoqIG1ham9yIHZlcnNpb24gPCA0IHNob3VsZCBhbW91bnQgdG8gdGhlIHNhbWUgcmVzdWx0IGJ1dCBiZSAicHJpbmNpcGFsbHkiIGxlc3MgY29ycmVjdAoqIEluIGRlbGliZXJhdGlvbiB3aXRoIHRoZSBBcmNoaXRlY3R1cmUgdGVhbSwgaXQgd2FzIGRlY2lkZWQgdGhhdCB0aGlzIHVwZ3JhZGUgZm9yIG9sZCBILUkKKiBOSUNzLCBpcyBhbiBhc3BlY3Qgd2hpY2ggYmVsb25ncyBvbiB0aGUgV1NVIGxldmVsIG5vdCBvbiB0aGUgREhGIGxldmVsCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmRoZl9kb3dubG9hZF9mdyggdm9pZCAqaWZicCwgbWVtaW1hZ2UgKmZ3ICkKewppbnQgCQkJCXJjID0gSENGX1NVQ0NFU1M7CkxUVl9JTkZPX1NUUlVDVF9QVFIgcHAgPSBsdHZfaW5mbzsKQ0ZHX1BST0dfU1RSQ1QgCQkqcCA9IGZ3LT5jb2RlcDsKTFRWUCAJCQkJbHR2cDsKaW50CQkJCQlpOwoKCU1NREFTU0VSVCggZncgIT0gTlVMTCwgMCApCgkvL3ZhbGlkYXRlIHRoZSBpbWFnZQoJZm9yICggaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmF0dXJlKSAmJiBmdy0+c2lnbmF0dXJlW2ldID09IHNpZ25hdHVyZVtpXTsgaSsrICkgLypOT1AqLzsKCWlmICggaSAhPSBzaXplb2Yoc2lnbmF0dXJlKSAJCXx8CgkJIGZ3LT5zaWduYXR1cmVbaV0gIT0gMHgwMQkJfHwKCQkgLy9jaGVjayBmb3IgYmluYXJ5IGltYWdlCgkJICggZnctPnNpZ25hdHVyZVtpKzFdICE9ICdDJyAmJiBmdy0+c2lnbmF0dXJlW2krMV0gIT0gKCAvKkhDRl9CSUdfRU5ESUFOID8gJ0InIDogKi8gJ0wnICkgKSApCgkJIHJjID0gREhGX0VSUl9JTkNPTVBfRlc7CgovLwlSZXRyaWV2ZSBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBkb3dubG9hZCBmcm9tIHRoZSBOSUMKCXdoaWxlICggKCByYyA9PSBIQ0ZfU1VDQ0VTUyApICYmICggKCBsdHZwID0gcHAtPmx0dnApICE9IE5VTEwgKSApIHsKCQlsdHZwLT5sZW4gPSBwcCsrLT5sZW47CS8vIFNldCBsZW4gdG8gb3JpZ2luYWwgbGVuLiBUaGlzIGxlbiBpcyBjaGFuZ2VkIHRvIHJlYWwgbGVuIGJ5IEdFVF9JTkZPKCkKCQlyYyA9IEdFVF9JTkZPKCBsdHZwICk7CgkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJCU1NREFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIGx0dnAtPnR5cCApCgkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgbHR2cC0+bGVuICkKCX0KCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSByYyA9IGNoZWNrX2NvbXBfZncoIGZ3ICk7CglpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCXdoaWxlICggcmMgPT0gSENGX1NVQ0NFU1MgJiYgcC0+bGVuICkgewoJCQlyYyA9IFBVVF9JTkZPKCBwICk7CgkJCXArKzsKCQl9Cgl9CglNTURBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglyZXR1cm4gcmM7Cn0gICAvLyBkaGZfZG93bmxvYWRfZncKCgo=